Module: wine Branch: refs/heads/master Commit: 576e3b706299f21897fc09c15b767fd79e701e79 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=576e3b706299f21897fc09c1...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Mar 7 11:50:05 2006 +0100
explorer: Merged systray support with the desktop window main loop.
Systray is now always available as part of the desktop and doesn't need to be started from shell32.
---
dlls/shell32/systray.c | 53 ---------------------------------- programs/explorer/desktop.c | 3 ++ programs/explorer/explorer.c | 52 --------------------------------- programs/explorer/explorer_private.h | 1 + programs/explorer/systray.c | 27 ++--------------- programs/explorer/systray.h | 23 --------------- 6 files changed, 7 insertions(+), 152 deletions(-) delete mode 100644 programs/explorer/systray.h
diff --git a/dlls/shell32/systray.c b/dlls/shell32/systray.c index a1a85c8..a99912f 100644 --- a/dlls/shell32/systray.c +++ b/dlls/shell32/systray.c @@ -38,49 +38,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(systray);
const static WCHAR classname[] = /* Shell_TrayWnd */ {'S','h','e','l','l','_','T','r','a','y','W','n','d','\0'};
-/* start timeout of 1 second */ -#define SYSTRAY_START_TIMEOUT 1000 - -static BOOL start_systray_process(void) -{ - STARTUPINFOW sinfo; - PROCESS_INFORMATION pinfo; - WCHAR command_line[] = {'e','x','p','l','o','r','e','r',' ','/','s','y','s','t','r','a','y',0}; - static const WCHAR event_name[] = {'W','i','n','e','S','y','s','t','r','a','y','I','n','i','t','e','d',0}; - HANDLE systray_ready_event; - DWORD wait; - - TRACE("No tray window found, starting %s\n", debugstr_w(command_line)); - - ZeroMemory(&sinfo, sizeof(sinfo)); - sinfo.cb = sizeof(sinfo); - - if (CreateProcessW(NULL, command_line, NULL, NULL, FALSE, 0, NULL, NULL, &sinfo, &pinfo) == 0) - { - ERR("Could not start %s, error 0x%lx\n", debugstr_w(command_line), GetLastError()); - return FALSE; - } - - CloseHandle(pinfo.hThread); - CloseHandle(pinfo.hProcess); - - systray_ready_event = CreateEventW(NULL, TRUE, FALSE, event_name); - if (!systray_ready_event) return FALSE; - - /* don't guess how long to wait, just wait for process to signal to us - * that it has created the Shell_TrayWnd class before continuing */ - wait = WaitForSingleObject(systray_ready_event, SYSTRAY_START_TIMEOUT); - CloseHandle(systray_ready_event); - - if (wait == WAIT_TIMEOUT) - { - ERR("timeout waiting for %s to start\n", debugstr_w(command_line)); - return FALSE; - } - - return TRUE; -} - /************************************************************************* * Shell_NotifyIcon [SHELL32.296] * Shell_NotifyIconA [SHELL32.297] @@ -126,16 +83,6 @@ BOOL WINAPI Shell_NotifyIconW(DWORD dwMe TRACE("dwMessage = %ld\n", dwMessage);
tray = FindWindowExW(0, NULL, classname, NULL); - - /* this isn't how native does it - it assumes that Explorer is always - * running */ - if (!tray) - { - if (!start_systray_process()) - return FALSE; - tray = FindWindowExW(0, NULL, classname, NULL); - } - if (!tray) return FALSE;
cds.dwData = dwMessage; diff --git a/programs/explorer/desktop.c b/programs/explorer/desktop.c index 032a1c2..7c26221 100644 --- a/programs/explorer/desktop.c +++ b/programs/explorer/desktop.c @@ -69,6 +69,9 @@ void manage_desktop(void) SetWindowLongPtrW( hwnd, GWLP_WNDPROC, (LONG_PTR)desktop_wnd_proc );
WINE_TRACE( "explorer starting on hwnd %p\n", hwnd ); + + initialize_systray(); while (GetMessageW( &msg, 0, 0, 0 )) DispatchMessageW( &msg ); + WINE_TRACE( "explorer exiting for hwnd %p\n", hwnd ); } diff --git a/programs/explorer/explorer.c b/programs/explorer/explorer.c index 25287b7..32c7055 100644 --- a/programs/explorer/explorer.c +++ b/programs/explorer/explorer.c @@ -24,15 +24,11 @@
#include <wine/debug.h> #include "explorer_private.h" -#include <systray.h>
WINE_DEFAULT_DEBUG_CHANNEL(explorer);
-unsigned int shell_refs = 0; - typedef struct parametersTAG { BOOL explorer_mode; - BOOL systray_mode; BOOL desktop_mode; WCHAR root[MAX_PATH]; WCHAR selection[MAX_PATH]; @@ -139,11 +135,6 @@ static void ParseCommandLine(LPSTR comma CopyPathRoot(parameters->root, parameters->selection); } - else if (strncmp(p,"systray",7)==0) - { - parameters->systray_mode = TRUE; - p+=7; - } else if (strncmp(p,"desktop",7)==0) { parameters->desktop_mode = TRUE; @@ -159,44 +150,6 @@ static void ParseCommandLine(LPSTR comma } }
-static void do_systray_loop(void) -{ - initialize_systray(); - - while (TRUE) - { - const int timeout = 5; - MSG message; - DWORD res; - - res = MsgWaitForMultipleObjectsEx(0, NULL, shell_refs ? INFINITE : timeout * 1000, - QS_ALLINPUT, MWMO_WAITALL); - if (res == WAIT_TIMEOUT) break; - - res = PeekMessage(&message, 0, 0, 0, PM_REMOVE); - if (!res) continue; - - if (message.message == WM_QUIT) - { - WINE_FIXME("Somebody sent the shell a WM_QUIT message, should we reboot?"); - - /* Sending the tray window a WM_QUIT message is actually a - * tip given by some programming websites as a way of - * forcing a reboot! let's delay implementing this hack - * until we find a program that really needs it. for now - * just bail out. - */ - - break; - } - - TranslateMessage(&message); - DispatchMessage(&message); - } - - shutdown_systray(); -} - int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE previnstance, LPSTR cmdline, @@ -217,11 +170,6 @@ int WINAPI WinMain(HINSTANCE hinstance, ParseCommandLine(cmdline,¶meters); len = lstrlenW(winefile) +1;
- if (parameters.systray_mode) - { - do_systray_loop(); - return 0; - } if (parameters.desktop_mode) { manage_desktop(); diff --git a/programs/explorer/explorer_private.h b/programs/explorer/explorer_private.h index e2f0010..859d1a6 100644 --- a/programs/explorer/explorer_private.h +++ b/programs/explorer/explorer_private.h @@ -22,5 +22,6 @@ #define __WINE_EXPLORER_PRIVATE_H
extern void manage_desktop(void); +extern void initialize_systray(void);
#endif /* __WINE_EXPLORER_PRIVATE_H */ diff --git a/programs/explorer/systray.c b/programs/explorer/systray.c index 7520f8b..adf8460 100644 --- a/programs/explorer/systray.c +++ b/programs/explorer/systray.c @@ -37,7 +37,7 @@ #include <wine/debug.h> #include <wine/list.h>
-#include "systray.h" +#include "explorer_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(systray);
@@ -127,8 +127,8 @@ static LRESULT WINAPI adaptor_wndproc(HW ret = PostMessage(icon->owner, icon->callback_message, (WPARAM) icon->id, (LPARAM) msg); if (!ret && (GetLastError() == ERROR_INVALID_HANDLE)) { - WINE_ERR("application window was destroyed without removing " - "notification icon, removing automatically\n"); + WINE_WARN("application window was destroyed without removing " + "notification icon, removing automatically\n"); DestroyWindow(window); } return 0; @@ -140,9 +140,6 @@ static LRESULT WINAPI adaptor_wndproc(HW list_remove(&icon->entry); DestroyIcon(icon->image); HeapFree(GetProcessHeap(), 0, icon); - - shell_refs--; - WINE_TRACE("shell now has %d refs\n", shell_refs); break; }
@@ -236,9 +233,6 @@ static void add_icon(const NOTIFYICONDAT list_add_tail(&tray.icons, &icon->entry);
modify_icon(nid); - - shell_refs++; - WINE_TRACE("shell now has %d refs\n", shell_refs); }
static void delete_icon(const NOTIFYICONDATAW *nid) @@ -365,11 +359,9 @@ static BOOL is_systray_hidden(void) void initialize_systray(void) { WNDCLASSEX class; - HANDLE event; static const WCHAR classname[] = /* Shell_TrayWnd */ {'S','h','e','l','l','_','T','r','a','y','W','n','d',0}; static const WCHAR winname[] = /* Wine Systray Listener */ {'W','i','n','e',' ','S','y','s','t','r','a','y',' ','L','i','s','t','e','n','e','r',0}; - static const WCHAR event_name[] = {'W','i','n','e','S','y','s','t','r','a','y','I','n','i','t','e','d',0};
WINE_TRACE("initiaizing\n");
@@ -419,17 +411,4 @@ void initialize_systray(void) WINE_ERR("Could not create tray window\n"); return; } - - /* tell shell32 that we're ready */ - event = OpenEventW(EVENT_MODIFY_STATE, FALSE, event_name); - if (event) - { - SetEvent(event); - CloseHandle(event); - } -} - -void shutdown_systray(void) -{ - DestroyWindow(tray.window); } diff --git a/programs/explorer/systray.h b/programs/explorer/systray.h deleted file mode 100644 index 38fc40b..0000000 --- a/programs/explorer/systray.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) 2004 Mike Hearn, for CodeWeavers - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -void initialize_systray(void); -void shutdown_systray(void); - -/* when this drops to zero, a few seconds later the shell will shut down */ -extern unsigned int shell_refs;