# HG changeset patch # User Juanma Barranquero # Date 1166460401 0 # Node ID 303099bc66d9cb6e13a9d2230dce8c1b897b10c1 # Parent 125d66299295534c4843adca0d247084eae2d250 [WINDOWSNT] (set_fg, get_wc): New variables. [WINDOWSNT] (w32_find_emacs_process, w32_give_focus): New functions. (main) [WINDOWSNT]: Remove code to release the focus; call w32_give_focus instead. diff -r 125d66299295 -r 303099bc66d9 lib-src/emacsclient.c --- a/lib-src/emacsclient.c Mon Dec 18 16:29:59 2006 +0000 +++ b/lib-src/emacsclient.c Mon Dec 18 16:46:41 2006 +0000 @@ -523,7 +523,7 @@ /* * Read the information needed to set up a TCP comm channel with * the Emacs server: host, port, pid and authentication string. -*/ + */ int get_server_config (server, authentication) struct sockaddr_in *server; @@ -845,6 +845,62 @@ exit (EXIT_FAILURE); } +#ifdef WINDOWSNT +FARPROC set_fg; /* Pointer to AllowSetForegroundWindow. */ +FARPROC get_wc; /* Pointer to RealGetWindowClassA. */ + +BOOL CALLBACK +w32_find_emacs_process (hWnd, lParam) + HWND hWnd; + LPARAM lParam; +{ + DWORD pid; + char class[6]; + + /* Reject any window not of class "Emacs". */ + if (! get_wc (hWnd, class, sizeof (class)) + || strcmp (class, "Emacs")) + return TRUE; + + /* We only need the process id, not the thread id. */ + (void) GetWindowThreadProcessId (hWnd, &pid); + + /* Not the one we're looking for. */ + if (pid != (DWORD) emacs_pid) return TRUE; + + /* OK, let's raise it. */ + set_fg (emacs_pid); + + /* Stop enumeration. */ + return FALSE; +} + +/* + * Search for a window of class "Emacs" and owned by a process with + * process id = emacs_pid. If found, allow it to grab the focus. + */ +void +w32_give_focus () +{ + HMODULE hUser32; + + /* It should'nt happen when dealing with TCP sockets. */ + if (!emacs_pid) return; + + if (!(hUser32 = LoadLibrary ("user32.dll"))) return; + + /* Modern Windows restrict which processes can set the foreground window. + emacsclient can allow Emacs to grab the focus by calling the function + AllowSetForegroundWindow. Unfortunately, older Windows (W95, W98 and + NT) lack this function, so we have to check its availability. */ + if ((set_fg = GetProcAddress (hUser32, "AllowSetForegroundWindow")) + && (get_wc = GetProcAddress (hUser32, "RealGetWindowClassA"))) + EnumWindows (w32_find_emacs_process, (LPARAM) 0); + + FreeLibrary (hUser32); +} +#endif + int main (argc, argv) int argc; @@ -889,24 +945,7 @@ } #ifdef WINDOWSNT - /* - Modern Windows restrict which processes can set the foreground window. - emacsclient can allow Emacs to grab the focus by calling the function - AllowSetForegroundWindow. Unfortunately, older Windows (W95, W98 - and NT) lack this function, so we have to check its availability. - */ - if (emacs_pid) - { - HMODULE hUser32; - - if (hUser32 = LoadLibrary ("user32.dll")) - { - FARPROC set_fg; - if (set_fg = GetProcAddress (hUser32, "AllowSetForegroundWindow")) - set_fg (emacs_pid); - FreeLibrary (hUser32); - } - } + w32_give_focus (); #endif if (nowait)