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).
This commit is contained in:
parent
974647ac91
commit
ff90fbdecc
6 changed files with 113 additions and 10 deletions
|
@ -392,6 +392,33 @@ w32_getenv (envvar)
|
|||
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 @@ w32_find_emacs_process (hWnd, lParam)
|
|||
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 (argc, argv)
|
|||
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);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue