]> git.tdb.fi Git - libs/gui.git/blobdiff - source/input/keyboard.cpp
Fall back to Device::get_*_name if name can't be determined
[libs/gui.git] / source / input / keyboard.cpp
index 1d7bb659e4973944ff2cc7b6665ed089c1c7ddf8..0f4d4ab848c772efb084f14cd18953c6cb412e26 100644 (file)
@@ -1,12 +1,13 @@
-/* $Id$
-
-This file is part of libmspgbase
-Copyright © 2007 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
-#include <msp/strings/formatter.h>
-#include "../gbase/display.h"
+#ifdef WIN32
+#include <windows.h>
+#else
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#endif
+#include <msp/graphics/display.h>
+#include <msp/graphics/window.h>
+#include <msp/graphics/display_priv.h>
+#include <msp/graphics/window_priv.h>
 #include "keyboard.h"
 #include "keys.h"
 
@@ -18,12 +19,11 @@ namespace Input {
 Keyboard::Keyboard(Graphics::Window &w):
        window(w)
 {
-       name="Keyboard";
+       name = "Keyboard";
 
        buttons.resize(N_KEYS_, false);
 
-       window.signal_key_press.connect(sigc::mem_fun(this, &Keyboard::key_press));
-       window.signal_key_release.connect(sigc::mem_fun(this, &Keyboard::key_release));
+       window.signal_input_event.connect(sigc::mem_fun(this, &Keyboard::input_event));
 }
 
 std::string Keyboard::get_button_name(unsigned btn) const
@@ -31,27 +31,53 @@ std::string Keyboard::get_button_name(unsigned btn) const
        if(btn==0)
                return "None";
 #ifndef WIN32
-       const char *str=XKeysymToString(key_to_sys(btn));
+       const char *str = XKeysymToString(key_to_sys(btn));
        if(!str)
-               return format("Key %d", btn);
+               return Device::get_button_name(btn);
        return str;
 #else
        char buf[128];
-       unsigned scan=MapVirtualKey(key_to_sys(btn), MAPVK_VK_TO_VSC);
+       unsigned scan = MapVirtualKey(key_to_sys(btn), MAPVK_VK_TO_VSC);
        if(!GetKeyNameText(scan<<16, buf, sizeof(buf)))
-               return format("Key %d", btn);
+               return Device::get_button_name(btn);
        return buf;
 #endif
 }
 
-void Keyboard::key_press(unsigned key, unsigned, unsigned)
+void Keyboard::input_event(const Graphics::Window::Event &event)
 {
-       set_button_state(key_from_sys(key), true, true);
-}
-
-void Keyboard::key_release(unsigned key, unsigned)
-{
-       set_button_state(key_from_sys(key), false, true);
+#ifdef WIN32
+       switch(event.msg)
+       {
+       case WM_KEYDOWN:
+       case WM_KEYUP:
+               set_button_state(key_from_sys(event.wparam), event.msg==WM_KEYDOWN, true);
+               break;
+       case WM_CHAR:
+               signal_character.emit(event.wparam);
+               break;
+       }
+#else
+       switch(event.xevent.type)
+       {
+       case KeyPress:
+       case KeyRelease:
+               {
+                       KeySym keysym = XKeycodeToKeysym(window.get_display().get_private().display, event.xevent.xkey.keycode, 0);
+                       if(keysym!=NoSymbol)
+                               if(unsigned key = key_from_sys(keysym))
+                                       set_button_state(key, event.xevent.type==KeyPress, true);
+                       if(event.xevent.type==KeyPress)
+                       {
+                               char ch;
+                               if(XLookupString(const_cast<XKeyEvent *>(&event.xevent.xkey), &ch, 1, 0, 0))
+                                       // XLookupString always returns Latin-1
+                                       signal_character.emit(static_cast<unsigned char>(ch));
+                       }
+               }
+               break;
+       }
+#endif
 }
 
 } // namespace Input