opennx/packaging/win32/xming/patches/xming-kbhook.patch
2025-08-08 20:34:09 +02:00

186 lines
6.0 KiB
Diff

diff -urw xc-orig/programs/Xserver/hw/xwin/win.h xc/programs/Xserver/hw/xwin/win.h
--- xc-orig/programs/Xserver/hw/xwin/win.h 2012-02-22 02:29:25.022775626 +0100
+++ xc/programs/Xserver/hw/xwin/win.h 2012-02-22 04:33:57.949268146 +0100
@@ -448,6 +448,7 @@
/* Did the user requested to nitially hide our window? */
Bool fHideInitial;
DWORD origShowWindowMode;
+ Bool fGrabKeyboard;
} winScreenInfo, *winScreenInfoPtr;
diff -urw xc-orig/programs/Xserver/hw/xwin/winkeyhook.c xc/programs/Xserver/hw/xwin/winkeyhook.c
--- xc-orig/programs/Xserver/hw/xwin/winkeyhook.c 2009-03-18 18:13:40.000000000 +0100
+++ xc/programs/Xserver/hw/xwin/winkeyhook.c 2012-02-22 04:35:47.073275339 +0100
@@ -85,8 +85,7 @@
/* Get pointers to our screen privates and screen info */
pScreenPriv = pWinPriv->pScreenPriv;
pScreenInfo = pScreenPriv->pScreenInfo;
-
- if (pScreenInfo->fMultiWindow)
+ if (!pScreenInfo->fGrabKeyboard)
fPassAltTab = FALSE;
}
#endif
@@ -171,11 +170,13 @@
}
/* Install the hook only once */
- if (!g_hhookKeyboardLL)
+ if (!g_hhookKeyboardLL) {
g_hhookKeyboardLL = SetWindowsHookEx (WH_KEYBOARD_LL,
winKeyboardMessageHookLL,
g_hInstance,
0);
+ ErrorF ("Installing keyboard hook %s\n", ((g_hhookKeyboardLL) ? "ok" : "failed"));;
+ }
return TRUE;
}
@@ -188,7 +189,9 @@
void
winRemoveKeyboardHookLL ()
{
- if (g_hhookKeyboardLL)
+ if (g_hhookKeyboardLL) {
UnhookWindowsHookEx (g_hhookKeyboardLL);
+ ErrorF ("Uninstalled keyboard hook\n");
+ }
g_hhookKeyboardLL = NULL;
}
diff -urw xc-orig/programs/Xserver/hw/xwin/winprefs.c xc/programs/Xserver/hw/xwin/winprefs.c
--- xc-orig/programs/Xserver/hw/xwin/winprefs.c 2009-03-18 18:13:40.000000000 +0100
+++ xc/programs/Xserver/hw/xwin/winprefs.c 2012-02-22 04:33:58.316268169 +0100
@@ -48,6 +48,8 @@
/* Where will the custom menu commands start counting from? */
#define STARTMENUID WM_USER
+#define ID_TOGGLE_KBGRAB STARTMENUID
+
/* External global variables */
#ifdef XWIN_MULTIWINDOW
extern DWORD g_dwCurrentThreadID;
@@ -66,12 +68,14 @@
extern HICON g_hSmallIconX;
/* Currently in use command ID, incremented each new menu item created */
-static int g_cmdid = STARTMENUID;
+static int g_cmdid = STARTMENUID + 10;
/* Defined in DIX */
extern char *display;
+extern Bool g_fKeyboardHookLL;
+
/* Local function to handle comma-ified icon names */
static HICON
LoadImageComma (char *fname, int sx, int sy, int flags);
@@ -276,7 +280,7 @@
DestroyIcon (g_hSmallIconX);
/* Reset the custom command IDs */
- g_cmdid = STARTMENUID;
+ g_cmdid = STARTMENUID + 10;
/* Load the updated resource file */
LoadPreferences();
@@ -323,6 +327,18 @@
if (pref.menu[i].menuItem[j].cmd==CMD_ALWAYSONTOP)
CheckMenuItem (hmenu, pref.menu[i].menuItem[j].commandID, dwExStyle );
+ if (hwnd && g_fKeyboardHookLL) {
+ WindowPtr pWin = GetProp (hwnd, WIN_WINDOW_PROP);
+ winPrivWinPtr pWinPriv = winGetWindowPriv(pWin);
+ /* Get pointers to our screen privates and screen info */
+ winPrivScreenPtr pScreenPriv = pWinPriv->pScreenPriv;
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ if (pScreenInfo->fGrabKeyboard)
+ dwExStyle = MF_BYCOMMAND | MF_CHECKED;
+ else
+ dwExStyle = MF_BYCOMMAND | MF_UNCHECKED;
+ CheckMenuItem (hmenu, ID_TOGGLE_KBGRAB, dwExStyle );
+ }
}
/*
@@ -343,6 +359,18 @@
if (!command)
return FALSE;
+ if (command == ID_TOGGLE_KBGRAB) {
+ if (hwnd) {
+ WindowPtr pWin = GetProp (hwnd, WIN_WINDOW_PROP);
+ winPrivWinPtr pWinPriv = winGetWindowPriv(pWin);
+ /* Get pointers to our screen privates and screen info */
+ winPrivScreenPtr pScreenPriv = pWinPriv->pScreenPriv;
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ pScreenInfo->fGrabKeyboard = !pScreenInfo->fGrabKeyboard;
+ }
+ return TRUE;
+ }
+
for (i=0; i<pref.menuItems; i++)
{
m = &(pref.menu[i]);
@@ -447,6 +475,7 @@
#ifdef XWIN_MULTIWINDOW
+
/*
* Add the default or a custom menu depending on the class match
*/
@@ -492,6 +521,12 @@
free(res_name);
free(res_class);
} /* Found wm_class */
+
+ /* Our internal hardcoded stuff .. */
+ if (g_fKeyboardHookLL) {
+ InsertMenu (sys, 0, MF_BYPOSITION|MF_ENABLED|MF_STRING,
+ ID_TOGGLE_KBGRAB, "Grab Alt-TAB");
+ }
} /* if pwin */
/* Fallback to system default */
diff -urw xc-orig/programs/Xserver/hw/xwin/winscrinit.c xc/programs/Xserver/hw/xwin/winscrinit.c
--- xc-orig/programs/Xserver/hw/xwin/winscrinit.c 2009-03-18 18:13:40.000000000 +0100
+++ xc/programs/Xserver/hw/xwin/winscrinit.c 2012-02-22 04:33:58.316268169 +0100
@@ -77,6 +77,7 @@
extern miPointerScreenFuncRec g_winPointerCursorFuncs;
extern int g_iScreenPrivateIndex;
extern Bool g_fSoftwareCursor;
+extern Bool g_fKeyboardHookLL;
/*
@@ -229,6 +230,7 @@
pScreenInfo->dwPaddedWidth = PixmapBytePad (pScreenInfo->dwWidth,
pScreenInfo->dwBPP);
+ pScreenInfo->fGrabKeyboard = g_fKeyboardHookLL;
/* Call the engine dependent screen initialization procedure */
if (!((*pScreenPriv->pwinFinishScreenInit) (index, pScreen, argc, argv)))
{
diff -urw xc-orig/programs/Xserver/hw/xwin/InitInput.c xc/programs/Xserver/hw/xwin/InitInput.c
--- xc-orig/programs/Xserver/hw/xwin/InitInput.c 2012-03-19 16:31:21.080040361 +0100
+++ xc/programs/Xserver/hw/xwin/InitInput.c 2012-03-19 16:33:36.773034311 +0100
@@ -72,6 +72,7 @@
#ifdef XKB
void XkbSetExtension(DeviceIntPtr device, ProcessInputProc proc);
#endif
+extern Bool g_fKeyboardHookLL;
static void
winRegisterPointerDevice(DeviceIntPtr device)
@@ -190,6 +191,8 @@
SetForegroundWindow(hwnd);
LockSetForegroundWindow(LSFW_LOCK);
SetFocus(hwnd);
+ if (g_fKeyboardHookLL)
+ g_fKeyboardHookLL = winInstallKeyboardHookLL ();
}
}
}