emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] emacs lib-src/ChangeLog lib-src/emacsclient.c n...


From: Jason Rumney
Subject: [Emacs-diffs] emacs lib-src/ChangeLog lib-src/emacsclient.c n...
Date: Tue, 30 Jun 2009 15:48:27 +0000

CVSROOT:        /sources/emacs
Module name:    emacs
Changes by:     Jason Rumney <jasonr>   09/06/30 15:48:26

Modified files:
        lib-src        : ChangeLog emacsclient.c 
        nt             : ChangeLog runemacs.c 
        src            : ChangeLog w32term.c 

Log message:
        bug#1849 - Windows 7 Taskbar Support
        
        * w32term.c (w32_initialize): Use GetModuleHandle for library that
        is already loaded.
        Set user model ID if supported (bug#1849).
        
        * runemacs.c (set_user_model_id): New function.
        (WinMain): Use it.
        
        * emacsclient.c (w32_give_focus): Use GetModuleHandle for library
        that is already loaded.
        (w32_set_user_model_id): New function.
        (main): Use it to associate emacsclient with emacs (bug#1849).

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/emacs/lib-src/ChangeLog?cvsroot=emacs&r1=2.533&r2=2.534
http://cvs.savannah.gnu.org/viewcvs/emacs/lib-src/emacsclient.c?cvsroot=emacs&r1=1.159&r2=1.160
http://cvs.savannah.gnu.org/viewcvs/emacs/nt/ChangeLog?cvsroot=emacs&r1=1.251&r2=1.252
http://cvs.savannah.gnu.org/viewcvs/emacs/nt/runemacs.c?cvsroot=emacs&r1=1.18&r2=1.19
http://cvs.savannah.gnu.org/viewcvs/emacs/src/ChangeLog?cvsroot=emacs&r1=1.7614&r2=1.7615
http://cvs.savannah.gnu.org/viewcvs/emacs/src/w32term.c?cvsroot=emacs&r1=1.327&r2=1.328

Patches:
Index: lib-src/ChangeLog
===================================================================
RCS file: /sources/emacs/emacs/lib-src/ChangeLog,v
retrieving revision 2.533
retrieving revision 2.534
diff -u -b -r2.533 -r2.534
--- lib-src/ChangeLog   29 Jun 2009 05:27:53 -0000      2.533
+++ lib-src/ChangeLog   30 Jun 2009 15:48:23 -0000      2.534
@@ -1,3 +1,10 @@
+2009-06-30  Jason Rumney  <address@hidden>
+
+       * emacsclient.c (w32_give_focus): Use GetModuleHandle for library
+       that is already loaded.
+       (w32_set_user_model_id): New function.
+       (main): Use it to associate emacsclient with emacs (bug#1849).
+
 2009-06-29  Jim Meyering  <address@hidden>
 
        Remove useless if-before-free test.

Index: lib-src/emacsclient.c
===================================================================
RCS file: /sources/emacs/emacs/lib-src/emacsclient.c,v
retrieving revision 1.159
retrieving revision 1.160
diff -u -b -r1.159 -r1.160
--- lib-src/emacsclient.c       20 Apr 2009 03:19:19 -0000      1.159
+++ lib-src/emacsclient.c       30 Jun 2009 15:48:24 -0000      1.160
@@ -392,6 +392,33 @@
   return NULL;
 }
 
+void
+w32_set_user_model_id ()
+{
+  HMODULE shell;
+  HRESULT (WINAPI * set_user_model) (PWCSTR);
+
+  /* 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 ()
 {
@@ -1415,22 +1442,23 @@
 void
 w32_give_focus ()
 {
-  HMODULE hUser32;
+  HANDLE user32;
 
   /* It shouldn't happen when dealing with TCP sockets.  */
   if (!emacs_pid) return;
 
-  if (!(hUser32 = LoadLibrary ("user32.dll"))) return;
+  user32 = GetModuleHandle ("user32.dll");
+
+  if (!user32)
+    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")))
+  if ((set_fg = GetProcAddress (user32, "AllowSetForegroundWindow"))
+      && (get_wc = GetProcAddress (user32, "RealGetWindowClassA")))
     EnumWindows (w32_find_emacs_process, (LPARAM) 0);
-
-  FreeLibrary (hUser32);
 }
 #endif
 
@@ -1501,6 +1529,12 @@
   main_argv = argv;
   progname = argv[0];
 
+#ifdef WINDOWSNT
+  /* On Windows 7 and later, we need to explicitly associate emacsclient
+     with emacs so the UI behaves sensibly.  */
+  w32_set_user_model_id ();
+#endif
+
   /* Process options.  */
   decode_options (argc, argv);
 

Index: nt/ChangeLog
===================================================================
RCS file: /sources/emacs/emacs/nt/ChangeLog,v
retrieving revision 1.251
retrieving revision 1.252
diff -u -b -r1.251 -r1.252
--- nt/ChangeLog        21 Jun 2009 14:35:32 -0000      1.251
+++ nt/ChangeLog        30 Jun 2009 15:48:24 -0000      1.252
@@ -1,3 +1,8 @@
+2009-06-30  Jason Rumney  <address@hidden>
+
+       * runemacs.c (set_user_model_id): New function.
+       (WinMain): Use it.
+
 2009-06-21  Chong Yidong  <address@hidden>
 
        * Branch for 23.1.

Index: nt/runemacs.c
===================================================================
RCS file: /sources/emacs/emacs/nt/runemacs.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -b -r1.18 -r1.19
--- nt/runemacs.c       8 Jan 2009 03:28:20 -0000       1.18
+++ nt/runemacs.c       30 Jun 2009 15:48:24 -0000      1.19
@@ -43,6 +43,8 @@
 #include <string.h>
 #include <malloc.h>
 
+static void set_user_model_id ();
+
 int WINAPI
 WinMain (HINSTANCE hSelf, HINSTANCE hPrev, LPSTR cmdline, int nShow)
 {
@@ -56,6 +58,8 @@
   char *p;
   char modname[MAX_PATH];
 
+  set_user_model_id ();
+
   if (!GetModuleFileName (NULL, modname, MAX_PATH))
     goto error;
   if ((p = strrchr (modname, '\\')) == NULL)
@@ -170,5 +174,32 @@
   return 1;
 }
 
+void set_user_model_id ()
+{
+  HMODULE shell;
+  HRESULT (WINAPI * set_user_model) (PCWSTR);
+
+  /* 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);
+    }
+}
+
 /* arch-tag: 7e02df73-4df7-4aa0-baea-99c6d047a384
    (do not change this comment) */

Index: src/ChangeLog
===================================================================
RCS file: /sources/emacs/emacs/src/ChangeLog,v
retrieving revision 1.7614
retrieving revision 1.7615
diff -u -b -r1.7614 -r1.7615
--- src/ChangeLog       29 Jun 2009 05:28:54 -0000      1.7614
+++ src/ChangeLog       30 Jun 2009 15:48:24 -0000      1.7615
@@ -1,3 +1,9 @@
+2009-06-30  Jason Rumney  <address@hidden>
+
+       * w32term.c (w32_initialize): Use GetModuleHandle for library that
+       is already loaded.
+       Set user model ID if supported (bug#1849).
+
 2009-06-29  Jim Meyering  <address@hidden>
 
        Remove useless if-before-xfree test.

Index: src/w32term.c
===================================================================
RCS file: /sources/emacs/emacs/src/w32term.c,v
retrieving revision 1.327
retrieving revision 1.328
diff -u -b -r1.327 -r1.328
--- src/w32term.c       22 Jun 2009 02:01:57 -0000      1.327
+++ src/w32term.c       30 Jun 2009 15:48:26 -0000      1.328
@@ -138,7 +138,7 @@
 #endif
 
 /* Dynamic linking to SetLayeredWindowAttribute (only since 2000).  */
-BOOL (PASCAL *pfnSetLayeredWindowAttributes) (HWND, COLORREF, BYTE, DWORD);
+BOOL (WINAPI *pfnSetLayeredWindowAttributes) (HWND, COLORREF, BYTE, DWORD);
 
 #ifndef LWA_ALPHA
 #define LWA_ALPHA 0x02
@@ -6340,6 +6340,9 @@
 static void
 w32_initialize ()
 {
+  HANDLE shell;
+  HRESULT (WINAPI * set_user_model) (PCWSTR);
+
   baud_rate = 19200;
 
   w32_system_caret_hwnd = NULL;
@@ -6347,6 +6350,25 @@
   w32_system_caret_x = 0;
   w32_system_caret_y = 0;
 
+  /* 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 = GetModuleHandle ("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");
+    }
+
   /* Initialize w32_use_visible_system_caret based on whether a screen
      reader is in use.  */
   if (!SystemParametersInfo (SPI_GETSCREENREADER, 0,
@@ -6400,7 +6422,7 @@
 
   /* Dynamically link to optional system components.  */
   {
-    HANDLE user_lib = LoadLibrary ("user32.dll");
+    HMODULE user_lib = GetModuleHandle ("user32.dll");
 
 #define LOAD_PROC(lib, fn) pfn##fn = (void *) GetProcAddress (lib, #fn)
 
@@ -6408,8 +6430,6 @@
 
 #undef LOAD_PROC
 
-    FreeLibrary (user_lib);
-
     /* Ensure scrollbar handle is at least 5 pixels.  */
     vertical_scroll_bar_min_handle = 5;
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]