changeset 73806:fbfa7d8c0a64

(get_server_config): Extract also the Emacs pid from the server file. On Windows, try to force the Emacs frame to the foreground.
author Juanma Barranquero <lekktu@gmail.com>
date Tue, 07 Nov 2006 10:43:45 +0000
parents 6bca57b7534e
children e02dbec6d19c
files lib-src/emacsclient.c
diffstat 1 files changed, 29 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/lib-src/emacsclient.c	Tue Nov 07 10:42:52 2006 +0000
+++ b/lib-src/emacsclient.c	Tue Nov 07 10:43:45 2006 +0000
@@ -432,7 +432,7 @@
 
 /*
  * Read the information needed to set up a TCP comm channel with
- * the Emacs server: host, port and authentication string.
+ * the Emacs server: host, port, pid and authentication string.
 */
 int
 get_server_config (server, authentication)
@@ -441,6 +441,7 @@
 {
   char dotted[32];
   char *port;
+  char *pid;
   FILE *config = NULL;
 
   if (file_name_absolute_p (server_file))
@@ -464,9 +465,11 @@
     return FALSE;
 
   if (fgets (dotted, sizeof dotted, config)
-      && (port = strchr (dotted, ':')))
+      && (port = strchr (dotted, ':'))
+      && (pid = strchr (port, ' ')))
     {
       *port++ = '\0';
+      *pid++  = '\0';
     }
   else
     {
@@ -486,6 +489,30 @@
 
   fclose (config);
 
+#ifdef WINDOWSNT
+  /*
+    Modern Windows restrict which processes can set the foreground window.
+    So, for emacsclient to be able to force Emacs into the foreground, we
+    have to call AllowSetForegroundWindow().  Unfortunately, older Windows
+    (W95, W98 and NT) don't have this function, so we have to check first.
+
+    We're doing this here because it has to be done before sending info
+    to Emacs, and otherwise we'll need a global variable just to pass around
+    the pid, which is also inelegant.
+   */
+  {
+    HMODULE hUser32;
+
+    if (hUser32 = LoadLibrary ("user32.dll"))
+      {
+        void (*set_fg)(DWORD);
+        if (set_fg = GetProcAddress (hUser32, "AllowSetForegroundWindow"))
+          set_fg (atoi (pid));
+        FreeLibrary (hUser32);
+      }
+  }
+#endif
+
   return TRUE;
 }