#ifdef HAVE_XWIN_CONFIG_H
#include <xwin-config.h>
#endif
#include "win.h"
#include <shellapi.h>
#include "winprefs.h"
void
winInitNotifyIcon (winPrivScreenPtr pScreenPriv)
{
winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
NOTIFYICONDATA nid = {0};
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 = (HICON)winTaskbarIcon ();
pScreenPriv->hiconNotifyIcon = nid.hIcon;
snprintf (nid.szTip,
sizeof (nid.szTip),
PROJECT_NAME " Server - %s:%d",
display,
(int) pScreenInfo->dwScreen);
if (!Shell_NotifyIcon (NIM_ADD, &nid))
ErrorF ("winInitNotifyIcon - Shell_NotifyIcon Failed\n");
}
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 (!Shell_NotifyIcon (NIM_DELETE, &nid))
{
ErrorF ("winDeleteNotifyIcon - Shell_NotifyIcon failed\n");
return;
}
if (pScreenPriv->hiconNotifyIcon != NULL
&& DestroyIcon (pScreenPriv->hiconNotifyIcon) == 0)
{
ErrorF ("winDeleteNotifyIcon - DestroyIcon failed\n");
}
pScreenPriv->hiconNotifyIcon = NULL;
}
LRESULT
winHandleIconMessage (HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam,
winPrivScreenPtr pScreenPriv)
{
#if defined(XWIN_MULTIWINDOWEXTWM) || defined(XWIN_MULTIWINDOW)
winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
#endif
switch (lParam)
{
case WM_LBUTTONUP:
SetForegroundWindow (hwnd);
#ifdef XWIN_MULTIWINDOWEXTWM
if (pScreenInfo->fMWExtWM)
winMWExtWMRestackWindows (pScreenInfo->pScreen);
#endif
break;
case WM_LBUTTONDBLCLK:
winDisplayExitDialog (pScreenPriv);
break;
case WM_RBUTTONUP:
{
POINT ptCursor;
HMENU hmenuPopup;
HMENU hmenuTray;
GetCursorPos (&ptCursor);
hmenuPopup = LoadMenu (g_hInstance,
MAKEINTRESOURCE(IDM_TRAYICON_MENU));
if (!hmenuPopup)
ErrorF ("winHandleIconMessage - LoadMenu failed\n");
hmenuTray = GetSubMenu (hmenuPopup, 0);
#ifdef XWIN_MULTIWINDOW
if (pScreenInfo->fMultiWindow)
{
MENUITEMINFO mii = {0};
mii.cbSize = sizeof (MENUITEMINFO);
mii.fMask = MIIM_STATE;
mii.fState = MFS_CHECKED;
if (pScreenPriv->fRootWindowShown)
mii.fState = MFS_UNCHECKED;
SetMenuItemInfo (hmenuTray, ID_APP_HIDE_ROOT, FALSE, &mii);
}
else
#endif
{
RemoveMenu (hmenuTray,
ID_APP_HIDE_ROOT,
MF_BYCOMMAND);
}
SetupRootMenu ((unsigned long)hmenuTray);
SetForegroundWindow (hwnd);
TrackPopupMenuEx (hmenuTray,
TPM_LEFTALIGN | TPM_BOTTOMALIGN | TPM_RIGHTBUTTON,
ptCursor.x, ptCursor.y,
hwnd,
NULL);
PostMessage (hwnd, WM_NULL, 0, 0);
DestroyMenu (hmenuPopup);
}
break;
}
return 0;
}