Mercurial > emacs
diff src/w32term.c @ 103641:48d529d3a5a4
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).
author | Jason Rumney <jasonr@gnu.org> |
---|---|
date | Tue, 30 Jun 2009 15:48:23 +0000 |
parents | 9c0aa5262fc9 |
children | 7bad97f82eb6 |
line wrap: on
line diff
--- a/src/w32term.c Tue Jun 30 15:23:50 2009 +0000 +++ b/src/w32term.c Tue Jun 30 15:48:23 2009 +0000 @@ -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;