-/* $Id$
-
-This file is part of libmspgbase
-Copyright © 2007-2008 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
#ifdef WIN32
#include <windows.h>
#else
#include <X11/Xlib.h>
+#include <X11/Xutil.h>
#endif
-#include <msp/strings/formatter.h>
-#include "../gbase/display.h"
+#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"
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
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)
-{
- set_button_state(key_from_sys(key), true, true);
-}
-
-void Keyboard::key_release(unsigned key, unsigned)
+void Keyboard::input_event(const Graphics::Window::Event &event)
{
- 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 = XLookupKeysym(const_cast<XKeyEvent *>(&event.xevent.xkey), 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