]> git.eshelyaron.com Git - emacs.git/commitdiff
[WINDOWSNT] (set_fg, get_wc): New variables.
authorJuanma Barranquero <lekktu@gmail.com>
Mon, 18 Dec 2006 16:47:28 +0000 (16:47 +0000)
committerJuanma Barranquero <lekktu@gmail.com>
Mon, 18 Dec 2006 16:47:28 +0000 (16:47 +0000)
[WINDOWSNT] (w32_find_emacs_process, w32_give_focus): New functions.
(main) [WINDOWSNT]: Remove code to release the focus; call
w32_give_focus instead.

lib-src/ChangeLog
lib-src/emacsclient.c

index f15644050d9ba67fd42c1806b00c11c72d312bfb..9c8a69f27f190885c59540cf50c3a144544a2b04 100644 (file)
@@ -1,3 +1,10 @@
+2006-12-18  Juanma Barranquero  <lekktu@gmail.com>
+
+       * emacsclient.c [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.
+
 2006-12-15  Juanma Barranquero  <lekktu@gmail.com>
 
        * emacsclient.c (w32_execvp): New function; wrapper for `execvp'.
 
 2005-07-13  Ken Raeburn  <raeburn@gnu.org>
 
-       * pop.c: Don't include des.h (or variants thereof); krb.h will do
-       it.
-       (sendline): Add the \r\n to the line in a temporary buffer, and
-       write it all at once.
+       * pop.c: Don't include des.h (or variants thereof); krb.h will do it.
+       (sendline): Add the \r\n to the line in a temporary buffer, and write
+       it all at once.
 
 2005-07-04  Lute Kamstra  <lute@gnu.org>
 
 
 2005-02-04  Andreas Schwab  <schwab@suse.de>
 
-       * movemail.c (fatal): Accept third parameter and pass down to
-       error.
-       (pfatal_with_name): Pass error string as format parameter instead
-       of as part of format string.
+       * movemail.c (fatal): Accept third parameter and pass down to error.
+       (pfatal_with_name): Pass error string as format parameter instead of
+       as part of format string.
        (pfatal_and_delete): Likewise.
        (main): Adjust call to fatal.
        (xmalloc): Likewise.
 
 2004-12-26  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
 
-       * make-docfile.c: Include stdlib.h even if WINDOWSNT is not
-       defined.
+       * make-docfile.c: Include stdlib.h even if WINDOWSNT is not defined.
 
 2004-12-15  Andreas Schwab  <schwab@suse.de>
 
 
 2004-05-10  Thien-Thi Nguyen  <ttn@gnu.org>
 
-       * test-distrib.c (main): For failing cases, exit with
-       `EXIT_FAILURE'.
+       * test-distrib.c (main): For failing cases, exit with `EXIT_FAILURE'.
 
 2004-05-08  Jason Rumney  <jasonr@gnu.org>
 
 
 2003-04-27  Oliver Scholz  <alkibiades@gmx.de>
 
-       * update-game-score.c (read_scores): Fix corruption of scores on
-       read.
+       * update-game-score.c (read_scores): Fix corruption of scores on read.
 
 2003-04-12  Stefan Monnier  <monnier@cs.yale.edu>
 
index bbd6cbe239b09eb00592dac8961ef8e00690595a..419cdd94b884862184e2bc435f8e85a9d5701179 100644 (file)
@@ -523,7 +523,7 @@ initialize_sockets ()
 /*
  * 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 @@ set_socket ()
   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 @@ main (argc, argv)
     }
 
 #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)