From: Eli Zaretskii Date: Tue, 12 Jul 2016 13:18:06 +0000 (+0300) Subject: Don't install keyboard hook when debugged on MS-Windows X-Git-Tag: emacs-26.0.90~1840^2~70 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=1048151cc4bec79f7310f4f2ede309889822a6bb;p=emacs.git Don't install keyboard hook when debugged on MS-Windows * src/w32fns.c (setup_w32_kbdhook): Don't install the keyboard hook if we are being debugged. This avoids hosing the debugger, because the hook is global, and is called in the context of the thread which installed it, and that thread is stopped when GDB has control. Reported by Fabrice Popineau . --- diff --git a/src/w32fns.c b/src/w32fns.c index 0eb720e1cbe..f5e5b33556c 100644 --- a/src/w32fns.c +++ b/src/w32fns.c @@ -276,6 +276,8 @@ static struct } kbdhook; typedef HWND (WINAPI *GetConsoleWindow_Proc) (void); +typedef BOOL (WINAPI *IsDebuggerPresent_Proc) (void); + /* stdin, from w32console.c */ extern HANDLE keyboard_handle; @@ -2303,6 +2305,19 @@ setup_w32_kbdhook (void) { kbdhook.hook_count++; + /* This hook gets in the way of debugging, since when Emacs stops, + its input thread stops, and there's nothing to process keyboard + events, whereas this hook is global, and is invoked in the + context of the thread that installed it. So we don't install the + hook if the process is being debugged. */ + if (w32_kbdhook_active) + { + IsDebuggerPresent_Proc is_debugger_present = (IsDebuggerPresent_Proc) + GetProcAddress (GetModuleHandle ("kernel32.dll"), "IsDebuggerPresent"); + if (is_debugger_present && is_debugger_present ()) + return; + } + /* Hooking is only available on NT architecture systems, as indicated by the w32_kbdhook_active variable. */ if (kbdhook.hook_count == 1 && w32_kbdhook_active)