From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Daniel Colascione Newsgroups: gmane.emacs.devel Subject: [PATCH 4/9] Fix emacsclient to work with cygw32 Date: Tue, 07 Aug 2012 01:19:27 -0700 Message-ID: <64609704ad9d49225b9243ae78cf3bb0c5bc4dcd.1344326992.git.dancol@dancol.org> References: NNTP-Posting-Host: plane.gmane.org X-Trace: dough.gmane.org 1344327587 821 80.91.229.3 (7 Aug 2012 08:19:47 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Tue, 7 Aug 2012 08:19:47 +0000 (UTC) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Tue Aug 07 10:19:47 2012 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1Syf10-00039q-FN for ged-emacs-devel@m.gmane.org; Tue, 07 Aug 2012 10:19:46 +0200 Original-Received: from localhost ([::1]:50187 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Syf0z-0000sn-IQ for ged-emacs-devel@m.gmane.org; Tue, 07 Aug 2012 04:19:45 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:57381) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Syf0s-0000gV-Rp for emacs-devel@gnu.org; Tue, 07 Aug 2012 04:19:39 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Syf0n-0007kH-Tf for emacs-devel@gnu.org; Tue, 07 Aug 2012 04:19:38 -0400 Original-Received: from dancol.org ([96.126.100.184]:37132) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Syf0n-0007ib-LL for emacs-devel@gnu.org; Tue, 07 Aug 2012 04:19:33 -0400 Original-Received: from dancol by dancol.org with local (Exim 4.72) (envelope-from ) id 1Syf0h-0006pz-6s for emacs-devel@gnu.org; Tue, 07 Aug 2012 01:19:27 -0700 In-Reply-To: X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 96.126.100.184 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:152238 Archived-At: --- 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 +# 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