diff options
author | PCSX* teams | 2010-11-16 14:15:22 +0200 |
---|---|---|
committer | Grazvydas Ignotas | 2010-11-16 14:15:22 +0200 |
commit | ef79bbde537d6b9c745a7d86cb9df1d04c35590d (patch) | |
tree | ef8d2520dbb9e1e345b41b12c9959f300ca8fd10 /plugins/dfinput/xkb.c | |
download | pcsx_rearmed-ef79bbde537d6b9c745a7d86cb9df1d04c35590d.tar.gz pcsx_rearmed-ef79bbde537d6b9c745a7d86cb9df1d04c35590d.tar.bz2 pcsx_rearmed-ef79bbde537d6b9c745a7d86cb9df1d04c35590d.zip |
pcsxr-1.9.92
Diffstat (limited to 'plugins/dfinput/xkb.c')
-rw-r--r-- | plugins/dfinput/xkb.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/plugins/dfinput/xkb.c b/plugins/dfinput/xkb.c new file mode 100644 index 0000000..bfadef1 --- /dev/null +++ b/plugins/dfinput/xkb.c @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2009, Wei Mingzhi <whistler@openoffice.org>. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <http://www.gnu.org/licenses>. + */ + +#include "pad.h" + +static Atom wmprotocols, wmdelwindow; + +void InitKeyboard() { + wmprotocols = XInternAtom(g.Disp, "WM_PROTOCOLS", 0); + wmdelwindow = XInternAtom(g.Disp, "WM_DELETE_WINDOW", 0); + + XkbSetDetectableAutoRepeat(g.Disp, 1, NULL); + + g.PadState[0].KeyStatus = 0xFFFF; + g.PadState[1].KeyStatus = 0xFFFF; +} + +void DestroyKeyboard() { + XkbSetDetectableAutoRepeat(g.Disp, 0, NULL); +} + +void CheckKeyboard() { + uint8_t i, j, found; + XEvent evt; + XClientMessageEvent *xce; + uint16_t Key; + + while (XPending(g.Disp)) { + XNextEvent(g.Disp, &evt); + switch (evt.type) { + case KeyPress: + Key = XLookupKeysym((XKeyEvent *)&evt, 0); + found = 0; + for (i = 0; i < 2; i++) { + for (j = 0; j < DKEY_TOTAL; j++) { + if (g.cfg.PadDef[i].KeyDef[j].Key == Key) { + found = 1; + g.PadState[i].KeyStatus &= ~(1 << j); + } + } + } + if (!found && !AnalogKeyPressed(Key)) { + g.KeyLeftOver = Key; + } + return; + + case KeyRelease: + Key = XLookupKeysym((XKeyEvent *)&evt, 0); + found = 0; + for (i = 0; i < 2; i++) { + for (j = 0; j < DKEY_TOTAL; j++) { + if (g.cfg.PadDef[i].KeyDef[j].Key == Key) { + found = 1; + g.PadState[i].KeyStatus |= (1 << j); + } + } + } + if (!found && !AnalogKeyReleased(Key)) { + g.KeyLeftOver = ((long)Key | 0x40000000); + } + break; + + case ClientMessage: + xce = (XClientMessageEvent *)&evt; + if (xce->message_type == wmprotocols && (Atom)xce->data.l[0] == wmdelwindow) { + // Fake an ESC key if user clicked the close button on window + g.KeyLeftOver = XK_Escape; + return; + } + break; + } + } +} |