Module: wine Branch: master Commit: 5bba54505d7fe9977351f577c1b2e91cc9bee62f URL: http://source.winehq.org/git/wine.git/?a=commit;h=5bba54505d7fe9977351f577c1...
Author: Ken Thomases ken@codeweavers.com Date: Mon Mar 30 14:00:26 2015 -0500
winemac: Cleanup system tray icons when their owner is destroyed instead of polling.
---
dlls/winemac.drv/systray.c | 50 +++++++--------------------------------------- 1 file changed, 7 insertions(+), 43 deletions(-)
diff --git a/dlls/winemac.drv/systray.c b/dlls/winemac.drv/systray.c index 6bae0ed..16d2e6c 100644 --- a/dlls/winemac.drv/systray.c +++ b/dlls/winemac.drv/systray.c @@ -35,10 +35,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(systray);
-#define CHECK_SYSTRAY_TIMER 1 -#define CHECK_SYSTRAY_INTERVAL_MS 2000 - - /* an individual systray icon */ struct tray_icon { @@ -59,49 +55,16 @@ static BOOL delete_icon(struct tray_icon *icon);
/*********************************************************************** - * check_icons + * cleanup_icons * - * Timer procedure for periodically checking that the systray icons are - * still valid (their owning windows still exist). + * Delete all systray icons owned by a given window. */ -static VOID CALLBACK check_icons(HWND hwnd, UINT msg, UINT_PTR timer, DWORD time) +static void cleanup_icons(HWND hwnd) { struct tray_icon *icon, *next;
LIST_FOR_EACH_ENTRY_SAFE(icon, next, &icon_list, struct tray_icon, entry) - if (!IsWindow(icon->owner)) delete_icon(icon); -} - - -/*********************************************************************** - * setup_check_icons_timer - * - * Set up a window with a timer to check that tray icons are still valid - * (their owning windows still exist). - */ -static void setup_check_icons_timer(void) -{ - static BOOL done; - - if (!done) - { - static const WCHAR messageW[] = {'M','e','s','s','a','g','e',0}; - HWND timer_window; - - /* Whether we succeed or not, don't try again. */ - done = TRUE; - - timer_window = CreateWindowW(messageW, NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, - NULL, NULL, NULL); - if (!timer_window) - { - WARN("Could not create systray checking message window\n"); - return; - } - - if (!SetTimer(timer_window, CHECK_SYSTRAY_TIMER, CHECK_SYSTRAY_INTERVAL_MS, check_icons)) - WARN("Could not create systray checking timer\n"); - } + if (icon->owner == hwnd) delete_icon(icon); }
@@ -231,8 +194,6 @@ static BOOL add_icon(NOTIFYICONDATAW *nid) return FALSE; }
- setup_check_icons_timer(); - if (!(icon = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*icon)))) { ERR("out of memory\n"); @@ -299,6 +260,9 @@ int CDECL wine_notify_icon(DWORD msg, NOTIFYICONDATAW *data) case NIM_MODIFY: if ((icon = get_icon(data->hWnd, data->uID))) ret = modify_icon(icon, data); break; + case 0xdead: /* Wine extension: owner window has died */ + cleanup_icons(data->hWnd); + break; default: FIXME("unhandled tray message: %u\n", msg); break;