diff options
Diffstat (limited to 'xorg-server/hw/xwin/wintrayicon.c')
-rw-r--r-- | xorg-server/hw/xwin/wintrayicon.c | 85 |
1 files changed, 54 insertions, 31 deletions
diff --git a/xorg-server/hw/xwin/wintrayicon.c b/xorg-server/hw/xwin/wintrayicon.c index f168b884a..bcea0cc81 100644 --- a/xorg-server/hw/xwin/wintrayicon.c +++ b/xorg-server/hw/xwin/wintrayicon.c @@ -36,34 +36,57 @@ #include <shellapi.h> #include "winprefs.h" +static NOTIFYICONDATA nid; /* * Initialize the tray icon */ void -winInitNotifyIcon(winPrivScreenPtr pScreenPriv) +winInitNotifyIcon(winPrivScreenPtr pScreenPriv, Bool Modify) { winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo; - NOTIFYICONDATA nid = { 0 }; + char HostName[256]; - nid.cbSize = sizeof(NOTIFYICONDATA); - nid.hWnd = pScreenPriv->hwndScreen; - nid.uID = pScreenInfo->dwScreen; - nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; - nid.uCallbackMessage = WM_TRAYICON; - nid.hIcon = winTaskbarIcon(); + if (!Modify) + { + nid.cbSize = sizeof(NOTIFYICONDATA); + nid.hWnd = pScreenPriv->hwndScreen; + nid.uID = pScreenInfo->dwScreen; + nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; + nid.uCallbackMessage = WM_TRAYICON; + nid.hIcon = winTaskbarIcon(); + + /* Save handle to the icon so it can be freed later */ + pScreenPriv->hiconNotifyIcon = nid.hIcon; + } - /* Save handle to the icon so it can be freed later */ - pScreenPriv->hiconNotifyIcon = nid.hIcon; + gethostname(HostName,256); /* Set display and screen-specific tooltip text */ - snprintf(nid.szTip, - sizeof(nid.szTip), - PROJECT_NAME " Server:%s.%d", - display, (int) pScreenInfo->dwScreen); + if (g_pszQueryHost) + { + snprintf(nid.szTip, + sizeof(nid.szTip), + "%s - %s:%s.%d - %d clients", + g_pszQueryHost, + HostName, + display, + (int) pScreenInfo->dwScreen, + pScreenPriv->iConnectedClients); + } + else + { + snprintf (nid.szTip, + sizeof (nid.szTip), + "%s:%s.%d - %d clients", + HostName, + display, + (int) pScreenInfo->dwScreen, + pScreenPriv->iConnectedClients); + } /* Add the tray icon */ - if (!Shell_NotifyIcon(NIM_ADD, &nid)) + if (!Shell_NotifyIcon ((Modify) ? NIM_MODIFY : NIM_ADD, &nid)) ErrorF("winInitNotifyIcon - Shell_NotifyIcon Failed\n"); } @@ -75,27 +98,16 @@ void winDeleteNotifyIcon(winPrivScreenPtr pScreenPriv) { winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo; - NOTIFYICONDATA nid = { 0 }; - -#if 0 - ErrorF("winDeleteNotifyIcon\n"); -#endif - nid.cbSize = sizeof(NOTIFYICONDATA); - nid.hWnd = pScreenPriv->hwndScreen; - nid.uID = pScreenInfo->dwScreen; + if (!pScreenPriv->hiconNotifyIcon) + return; /* Delete the tray icon */ - if (!Shell_NotifyIcon(NIM_DELETE, &nid)) { - ErrorF("winDeleteNotifyIcon - Shell_NotifyIcon failed\n"); - return; - } + Shell_NotifyIcon (NIM_DELETE, &nid); /* Free the icon that was loaded */ - if (pScreenPriv->hiconNotifyIcon != NULL - && DestroyIcon(pScreenPriv->hiconNotifyIcon) == 0) { - ErrorF("winDeleteNotifyIcon - DestroyIcon failed\n"); - } + DestroyIcon (pScreenPriv->hiconNotifyIcon); + pScreenPriv->hiconNotifyIcon = NULL; } @@ -112,6 +124,17 @@ winHandleIconMessage(HWND hwnd, UINT message, #endif switch (lParam) { + case WM_MOUSEMOVE: + { + static int PrevNrClients; + int NrClients=GetLiveClients(pScreenPriv); + if (NrClients!=PrevNrClients) + { + PrevNrClients=NrClients; + winInitNotifyIcon (pScreenPriv, TRUE); + } + } + break; case WM_LBUTTONUP: /* Restack and bring all windows to top */ SetForegroundWindow (pScreenPriv->hwndScreen); |