Files
itgmania212121/stepmania/src/arch/InputHandler/InputHandler_X11.cpp
T

205 lines
8.0 KiB
C++

#include "global.h"
#include "InputHandler_X11.h"
#include "RageUtil.h"
#include "RageLog.h"
#include "RageDisplay.h"
#include "archutils/Unix/X11Helper.h"
#include <X11/Xlib.h>
#include <X11/keysym.h>
static RageKeySym XSymToKeySym( int key )
{
#define KEY_INV KEY_INVALID
const RageKeySym ASCIIKeySyms[] =
{
KEY_INV , KEY_INV , KEY_INV , KEY_INV , KEY_INV , /* 0 - 4 */
KEY_INV , KEY_INV , KEY_INV , KEY_BACK , KEY_TAB , /* 5 - 9 */
KEY_INV , KEY_INV , KEY_INV , KEY_ENTER , KEY_INV , /* 10 - 14 */
KEY_INV , KEY_INV , KEY_INV , KEY_INV , KEY_PAUSE , /* 15 - 19 */
KEY_INV , KEY_INV , KEY_INV , KEY_INV , KEY_INV , /* 20 - 24 */
KEY_INV , KEY_INV , KEY_ESC , KEY_INV , KEY_INV , /* 25 - 29 */
KEY_INV , KEY_INV , KEY_SPACE , KEY_EXCL , KEY_QUOTE , /* 30 - 34 */
KEY_HASH , KEY_DOLLAR , KEY_PERCENT , KEY_AMPER , KEY_SQUOTE , /* 35 - 39 */
KEY_LPAREN , KEY_RPAREN , KEY_ASTERISK , KEY_PLUS , KEY_COMMA , /* 40 - 44 */
KEY_HYPHEN , KEY_PERIOD , KEY_SLASH , KEY_C0 , KEY_C1 , /* 45 - 49 */
KEY_C2 , KEY_C3 , KEY_C4 , KEY_C5 , KEY_C6 , /* 50 - 54 */
KEY_C7 , KEY_C8 , KEY_C9 , KEY_COLON , KEY_SEMICOLON, /* 55 - 59 */
KEY_LANGLE , KEY_EQUAL , KEY_RANGLE , KEY_QUESTION, KEY_AT , /* 60 - 64 */
KEY_CA , KEY_CB , KEY_CC , KEY_CD , KEY_CE , /* 65 - 69 */
KEY_CF , KEY_CG , KEY_CH , KEY_CI , KEY_CJ , /* 70 - 74 */
KEY_CK , KEY_CL , KEY_CM , KEY_CN , KEY_CO , /* 75 - 79 */
KEY_CP , KEY_CQ , KEY_CR , KEY_CS , KEY_CT , /* 80 - 84 */
KEY_CU , KEY_CV , KEY_CW , KEY_CX , KEY_CY , /* 85 - 89 */
KEY_CZ , KEY_LBRACKET, KEY_BACKSLASH, KEY_RBRACKET, KEY_CARAT , /* 90 - 94 */
KEY_UNDERSCORE, KEY_ACCENT , KEY_Ca , KEY_Cb , KEY_Cc , /* 95 - 99 */
KEY_Cd , KEY_Ce , KEY_Cf , KEY_Cg , KEY_Ch , /* 100 - 104 */
KEY_Ci , KEY_Cj , KEY_Ck , KEY_Cl , KEY_Cm , /* 105 - 109 */
KEY_Cn , KEY_Co , KEY_Cp , KEY_Cq , KEY_Cr , /* 110 - 114 */
KEY_Cs , KEY_Ct , KEY_Cu , KEY_Cv , KEY_Cw , /* 115 - 119 */
KEY_Cx , KEY_Cy , KEY_Cz , KEY_LBRACE , KEY_PIPE , /* 120 - 124 */
KEY_RBRACE , KEY_INV , KEY_DEL /* 125 - 127 */
};
/* 32...127: */
if( key < int(ARRAYSIZE(ASCIIKeySyms)))
return ASCIIKeySyms[key];
/* XK_KP_0 ... XK_KP_9 to KEY_KP_C0 ... KEY_KP_C9 */
if( key >= XK_KP_0 && key <= XK_KP_9 )
return (RageKeySym) (key - XK_KP_0 + KEY_KP_C0);
switch( key )
{
/* These are needed because of the way X registers
the keypad. */
case XK_KP_Insert: return KEY_KP_C0;
case XK_KP_End: return KEY_KP_C1;
case XK_KP_Down: return KEY_KP_C2;
case XK_KP_Page_Down: return KEY_KP_C3;
case XK_KP_Left: return KEY_KP_C4;
case XK_KP_Begin: return KEY_KP_C5;
case XK_KP_Right: return KEY_KP_C6;
case XK_KP_Home: return KEY_KP_C7;
case XK_KP_Up: return KEY_KP_C8;
case XK_KP_Page_Up: return KEY_KP_C9;
case XK_KP_Decimal: return KEY_KP_PERIOD;
case XK_KP_Divide: return KEY_KP_SLASH;
case XK_KP_Multiply: return KEY_KP_ASTERISK;
case XK_KP_Subtract: return KEY_KP_HYPHEN;
case XK_KP_Add: return KEY_KP_PLUS;
case XK_KP_Equal: return KEY_KP_EQUAL;
case XK_KP_Enter: return KEY_KP_ENTER;
case XK_Up: return KEY_UP;
case XK_Down: return KEY_DOWN;
case XK_Right: return KEY_RIGHT;
case XK_Left: return KEY_LEFT;
case XK_Insert: return KEY_INSERT;
case XK_Home: return KEY_HOME;
case XK_Delete: return KEY_DEL;
case XK_End: return KEY_END;
case XK_Page_Up: return KEY_PGUP;
case XK_Page_Down: return KEY_PGDN;
case XK_F1: return KEY_F1;
case XK_F2: return KEY_F2;
case XK_F3: return KEY_F3;
case XK_F4: return KEY_F4;
case XK_F5: return KEY_F5;
case XK_F6: return KEY_F6;
case XK_F7: return KEY_F7;
case XK_F8: return KEY_F8;
case XK_F9: return KEY_F9;
case XK_F10: return KEY_F10;
case XK_F11: return KEY_F11;
case XK_F12: return KEY_F12;
case XK_F13: return KEY_F13;
case XK_F14: return KEY_F14;
case XK_F15: return KEY_F15;
case XK_Num_Lock: return KEY_NUMLOCK;
case XK_Caps_Lock: return KEY_CAPSLOCK;
case XK_Scroll_Lock: return KEY_SCRLLOCK;
case XK_Return: return KEY_ENTER;
case XK_Sys_Req: return KEY_PRTSC;
case XK_Print: return KEY_PRTSC;
case XK_Shift_R: return KEY_RSHIFT;
case XK_Shift_L: return KEY_LSHIFT;
case XK_Control_R: return KEY_RCTRL;
case XK_Control_L: return KEY_LCTRL;
case XK_Alt_R: return KEY_RALT;
case XK_Alt_L: return KEY_LALT;
case XK_Meta_R: return KEY_RMETA;
case XK_Meta_L: return KEY_LMETA;
case XK_Super_L: return KEY_LSUPER;
case XK_Super_R: return KEY_RSUPER;
case XK_Menu: return KEY_MENU;
}
/* 0...31: */
if( key - 0xFF00 < 0x20)
return ASCIIKeySyms[key - 0xFF00];
return KEY_INVALID;
}
InputHandler_X11::InputHandler_X11()
{
XKeyboardControl state;
state.auto_repeat_mode = AutoRepeatModeOff;
XChangeKeyboardControl(X11Helper::Dpy,KBAutoRepeatMode,&state);
X11Helper::Go();
X11Helper::OpenMask(KeyPressMask); X11Helper::OpenMask(KeyReleaseMask);
}
InputHandler_X11::~InputHandler_X11()
{
XKeyboardControl state;
state.auto_repeat_mode = AutoRepeatModeDefault;
XChangeKeyboardControl(X11Helper::Dpy,KBAutoRepeatMode,&state);
X11Helper::CloseMask(KeyPressMask); X11Helper::CloseMask(KeyReleaseMask);
X11Helper::Stop();
}
void InputHandler_X11::Update(float fDeltaTime)
{
XEvent event;
if (X11Helper::Win)
while(XCheckTypedWindowEvent(X11Helper::Dpy,
X11Helper::Win, KeyPress, &event) )
{
LOG->Trace("key: sym %i, key %i, state true",
XLookupKeysym(&event.xkey,0), XSymToKeySym(XLookupKeysym(&event.xkey,0)));
DeviceInput di( DEVICE_KEYBOARD,
XSymToKeySym(XLookupKeysym(&event.xkey,0)) );
ButtonPressed(di, true);
}
while(XCheckTypedWindowEvent(X11Helper::Dpy,
X11Helper::Win, KeyRelease, &event) )
{
LOG->Trace("key: sym %i, key %i, state false",
XLookupKeysym(&event.xkey,0), XSymToKeySym(XLookupKeysym(&event.xkey,0)));
DeviceInput di( DEVICE_KEYBOARD,
XSymToKeySym(XLookupKeysym(&event.xkey,0)) );
ButtonPressed(di, false);
}
InputHandler::UpdateTimer();
}
void InputHandler_X11::GetDevicesAndDescriptions(
vector<InputDevice>& vDevicesOut, vector<CString>& vDescriptionsOut)
{
vDevicesOut.push_back( DEVICE_KEYBOARD );
vDescriptionsOut.push_back( "Keyboard" );
}
/*
* (c) 2005 Sean Burke, Ben Anderson
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, and/or sell copies of the Software, and to permit persons to
* whom the Software is furnished to do so, provided that the above
* copyright notice(s) and this permission notice appear in all copies of
* the Software and that both the above copyright notice(s) and this
* permission notice appear in supporting documentation.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/