summaryrefslogtreecommitdiff
path: root/hw/xwin/winkeybd.c
diff options
context:
space:
mode:
Diffstat (limited to 'hw/xwin/winkeybd.c')
-rw-r--r--hw/xwin/winkeybd.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/hw/xwin/winkeybd.c b/hw/xwin/winkeybd.c
index 2ffb9a943..bfb1407b4 100644
--- a/hw/xwin/winkeybd.c
+++ b/hw/xwin/winkeybd.c
@@ -40,6 +40,7 @@
#include "winmsg.h"
#include "xkbsrv.h"
+#include "dixgrabs.h"
static Bool g_winKeyState[NUM_KEYCODES];
@@ -265,6 +266,30 @@ winRestoreModeKeyStates(void)
* have a logical XOR operator, so we use a macro instead.
*/
+ {
+ /* consider modifer keys */
+
+ BOOL ctrl = (GetAsyncKeyState(VK_CONTROL) < 0);
+ BOOL shift = (GetAsyncKeyState(VK_SHIFT) < 0);
+ BOOL alt = (GetAsyncKeyState(VK_LMENU) < 0);
+ BOOL altgr = (GetAsyncKeyState(VK_RMENU) < 0);
+
+ if (ctrl && altgr)
+ ctrl = FALSE;
+
+ if (WIN_XOR(internalKeyStates & ControlMask, ctrl))
+ winSendKeyEvent(KEY_LCtrl, ctrl);
+
+ if (WIN_XOR(internalKeyStates & ShiftMask, shift))
+ winSendKeyEvent(KEY_ShiftL, shift);
+
+ if (WIN_XOR(internalKeyStates & Mod1Mask, alt))
+ winSendKeyEvent(KEY_Alt, alt);
+
+ if (WIN_XOR(internalKeyStates & Mod5Mask, altgr))
+ winSendKeyEvent(KEY_AltLang, altgr);
+ }
+
/* Has the key state changed? */
dwKeyState = GetKeyState(VK_NUMLOCK) & 0x0001;
if (WIN_XOR(internalKeyStates & NumLockMask, dwKeyState)) {
@@ -502,3 +527,34 @@ winFixShiftKeys(int iScanCode)
if (iScanCode == KEY_ShiftR && g_winKeyState[KEY_ShiftL])
winSendKeyEvent(KEY_ShiftL, FALSE);
}
+
+/*
+ */
+int
+XkbDDXPrivate(DeviceIntPtr dev,KeyCode key,XkbAction *act)
+{
+ XkbAnyAction *xf86act = &(act->any);
+ char msgbuf[XkbAnyActionDataSize+1];
+
+ if (xf86act->type == XkbSA_XFree86Private)
+ {
+ memcpy(msgbuf, xf86act->data, XkbAnyActionDataSize);
+ msgbuf[XkbAnyActionDataSize]= '\0';
+ if (strcasecmp(msgbuf, "prgrbs")==0) {
+ DeviceIntPtr tmp;
+ winMsg(X_INFO, "Printing all currently active device grabs:\n");
+ for (tmp = inputInfo.devices; tmp; tmp = tmp->next)
+ if (tmp->deviceGrab.grab)
+ PrintDeviceGrabInfo(tmp);
+ winMsg(X_INFO, "End list of active device grabs\n");
+ }
+ else if (strcasecmp(msgbuf, "ungrab")==0)
+ UngrabAllDevices(FALSE);
+ else if (strcasecmp(msgbuf, "clsgrb")==0)
+ UngrabAllDevices(TRUE);
+ else if (strcasecmp(msgbuf, "prwins")==0)
+ PrintWindowTree();
+ }
+
+ return 0;
+}