X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Finput%2Fkeyboard.cpp;h=5b54ee4c0784f4210548b270e80e0942d0ad14d6;hb=3874e3e275b30d12d213bd65798224a717627ba2;hp=240d700fccc4b45620cbd40c4f728face25f7c58;hpb=999ca92aa9ee10585c0b2094d84364159253982f;p=libs%2Fgui.git diff --git a/source/input/keyboard.cpp b/source/input/keyboard.cpp index 240d700..5b54ee4 100644 --- a/source/input/keyboard.cpp +++ b/source/input/keyboard.cpp @@ -1,13 +1,18 @@ -/* $Id$ - -This file is part of libmspgbase -Copyright © 2007 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - -#include -#include "../gbase/display.h" +#ifdef WIN32 +#include +#else +#include +#include +#endif +#include +#include +#include +#include +#include #include "keyboard.h" +#include "keys.h" + +#define MAPVK_VK_TO_VSC 0 namespace Msp { namespace Input { @@ -15,35 +20,65 @@ namespace Input { Keyboard::Keyboard(Graphics::Window &w): window(w) { - name="Keyboard"; + name = "Keyboard"; - buttons.resize(256, false); + 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 - KeySym ksym=XKeycodeToKeysym(window.get_display().get_display(), btn, 0); - return XKeysymToString(ksym); + const char *str = XKeysymToString(key_to_sys(btn)); + if(!str) + return format("Key %d", btn); + return str; #else char buf[128]; - if(!GetKeyNameText(btn<<16, buf, sizeof(buf))) + unsigned scan = MapVirtualKey(key_to_sys(btn), MAPVK_VK_TO_VSC); + if(!GetKeyNameText(scan<<16, buf, sizeof(buf))) return format("Key %d", 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, true, true); -} - -void Keyboard::key_release(unsigned key, unsigned) -{ - set_button_state(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(&event.xevent.xkey), &ch, 1, 0, 0)) + // XLookupString always returns Latin-1 + signal_character.emit(static_cast(ch)); + } + } + break; + } +#endif } } // namespace Input