opensubscriber
   Find in this group all groups
 
Unknown more information…

e : emacs-devel@gnu.org 7 August 2012 • 4:19PM -0400

[PATCH 4/9] Fix emacsclient to work with cygw32
by Daniel Colascione

REPLY TO AUTHOR
 
REPLY TO GROUP




---
lib-src/emacsclient.c |   71 +++++++++++++++++++++++++-----------------------
lisp/server.el        |   10 +++++--
2 files changed, 44 insertions(+), 37 deletions(-)

diff --git a/lib-src/emacsclient.c b/lib-src/emacsclient.c
index 0ba6535..83e357c 100644
--- a/lib-src/emacsclient.c
+++ b/lib-src/emacsclient.c
@@ -43,6 +43,10 @@ char *w32_getenv (char *);

#else /* !WINDOWSNT */

+# ifdef HAVE_NTGUI
+# include <windows.h>
+# endif /* HAVE_NTGUI */
+
# include "syswait.h"

# ifdef HAVE_INET_SOCKETS
@@ -188,9 +192,7 @@ struct option longopts[] =
   { "socket-name", required_argument, NULL, 's' },
#endif
   { "server-file", required_argument, NULL, 'f' },
-#ifndef WINDOWSNT
   { "display", required_argument, NULL, 'd' },
-#endif
   { "parent-id", required_argument, NULL, 'p' },
   { 0, 0, 0, 0 }
};
@@ -406,32 +408,6 @@ w32_getenv (char *envvar)
   return NULL;
}

-void
-w32_set_user_model_id (void)
-{
-  HMODULE shell;
-  HRESULT (WINAPI * set_user_model) (wchar_t * id);
-
-  /* On Windows 7 and later, we need to set the user model ID
-     to associate emacsclient launched files with Emacs frames
-     in the UI.  */
-  shell = LoadLibrary ("shell32.dll");
-  if (shell)
-    {
-      set_user_model
- = (void *) GetProcAddress (shell,
-    "SetCurrentProcessExplicitAppUserModelID");
-      /* If the function is defined, then we are running on Windows 7
- or newer, and the UI uses this to group related windows
- together.  Since emacs, runemacs, emacsclient are related, we
- want them grouped even though the executables are different,
- so we need to set a consistent ID between them.  */
-      if (set_user_model)
- set_user_model (L"GNU.Emacs");
-
-      FreeLibrary (shell);
-    }
-}

int
w32_window_app (void)
@@ -1436,10 +1412,37 @@ set_socket (int no_exit_if_error)
   exit (EXIT_FAILURE);
}

-#ifdef WINDOWSNT
+#ifdef HAVE_NTGUI
FARPROC set_fg;  /* Pointer to AllowSetForegroundWindow.  */
FARPROC get_wc;  /* Pointer to RealGetWindowClassA.  */

+void
+w32_set_user_model_id (void)
+{
+  HMODULE shell;
+  HRESULT (WINAPI * set_user_model) (wchar_t * id);
+
+  /* On Windows 7 and later, we need to set the user model ID
+     to associate emacsclient launched files with Emacs frames
+     in the UI.  */
+  shell = LoadLibrary ("shell32.dll");
+  if (shell)
+    {
+      set_user_model
+ = (void *) GetProcAddress (shell,
+    "SetCurrentProcessExplicitAppUserModelID");
+      /* If the function is defined, then we are running on Windows 7
+ or newer, and the UI uses this to group related windows
+ together.  Since emacs, runemacs, emacsclient are related, we
+ want them grouped even though the executables are different,
+ so we need to set a consistent ID between them.  */
+      if (set_user_model)
+ set_user_model (L"GNU.Emacs");
+
+      FreeLibrary (shell);
+    }
+}
+
BOOL CALLBACK
w32_find_emacs_process (HWND hWnd, LPARAM lParam)
{
@@ -1488,7 +1491,7 @@ w32_give_focus (void)
       && (get_wc = GetProcAddress (user32, "RealGetWindowClassA")))
     EnumWindows (w32_find_emacs_process, (LPARAM) 0);
}
-#endif
+#endif /* HAVE_NTGUI */

/* Start the emacs daemon and try to connect to it.  */

@@ -1558,11 +1561,11 @@ main (int argc, char **argv)
   main_argv = argv;
   progname = argv[0];

-#ifdef WINDOWSNT
+#ifdef HAVE_NTGUI
   /* On Windows 7 and later, we need to explicitly associate emacsclient
      with emacs so the UI behaves sensibly.  */
   w32_set_user_model_id ();
-#endif
+#endif /* HAVE_NTGUI */

   /* Process options.  */
   decode_options (argc, argv);
@@ -1598,9 +1601,9 @@ main (int argc, char **argv)
       fail ();
     }

-#ifdef WINDOWSNT
+#ifdef HAVE_NTGUI
   w32_give_focus ();
-#endif
+#endif /* HAVE_NTGUI */

   /* Send over our environment and current directory. */
   if (!current_frame)
diff --git a/lisp/server.el b/lisp/server.el
index a25da40..0ef76dc 100644
--- a/lisp/server.el
+++ b/lisp/server.el
@@ -1115,9 +1115,13 @@ The following commands are accepted by the client:
                        tty-type (pop args-left)
                        dontkill (or dontkill
                                     (not use-current-frame)))
-                 ;; On Windows, emacsclient always asks for a tty frame.
-                 ;; If running a GUI server, force the frame type to GUI.
-                 (when (eq window-system 'w32)
+                 ;; On Windows, emacsclient always asks for a tty
+                 ;; frame.  If running a GUI server, force the frame
+                 ;; type to GUI.  (Cygwin is perfectly happy with
+                 ;; multi-tty support, so don't override the user's
+                 ;; choice there.)
+                 (when (and (eq system-type 'windows-nt)
+                            (eq window-system 'w32))
                    (push "-window-system" args-left)))

                 ;; -position LINE[:COLUMN]:  Set point to the given
--
1.7.2.5




Bookmark with:

Delicious   Digg   reddit   Facebook   StumbleUpon

Related Messages

opensubscriber is not affiliated with the authors of this message nor responsible for its content.