source: trunk/src/shell32/systray_os2.c@ 21592

Last change on this file since 21592 was 21592, checked in by dmik, 14 years ago

shell32: Implemented xsystray support (#16).

File size: 6.6 KB
Line 
1/*
2 * OS/2 System Tray support. For usage with SysTray/WPS by MadInt
3 * or System Tray widget for XCenter/eCenter.
4 *
5 * author: ErOs2
6 * date: 1 May 2004
7 *
8 */
9
10#define INCL_WIN
11#include <os2wrap.h>
12
13#include <string.h>
14
15#include <odin.h>
16#include <winconst.h>
17
18#include "systray_os2.h"
19
20#define WM_TRAYADDME (WM_USER+1)
21#define WM_TRAYDELME (WM_USER+2)
22#define WM_TRAYICON (WM_USER+3)
23#define WM_TRAYEXIT (0xCD20)
24
25#define SZAPP "SystrayServer"
26#define SZTOPIC "TRAY"
27
28static HWND hwndTrayServer = 0;
29
30static MRESULT EXPENTRY SYSTRAY_Old_WndProc(HWND hWnd, ULONG msg, MPARAM mp1, MPARAM mp2)
31{
32 SystrayItem *ptrayItem = (SystrayItem *)WinQueryWindowULong(hWnd, QWL_USER);
33
34 switch ( msg )
35 {
36 case WM_CREATE:
37 WinSetWindowULong(hWnd, QWL_USER, (ULONG)mp1);
38 ptrayItem = (SystrayItem *)mp1;
39 return (MRESULT)FALSE;
40 case WM_DDE_INITIATEACK:
41 hwndTrayServer = (HWND)mp1;
42 if(hwndTrayServer)
43 WinPostMsg(hwndTrayServer,WM_TRAYADDME,(MPARAM)hWnd,(MPARAM)NULL);
44 return (MRESULT)TRUE;
45 case WM_BUTTON1DBLCLK|0x2000:
46 DoWin32PostMessage(ptrayItem->notifyIcon.hWnd, ptrayItem->notifyIcon.uCallbackMessage,
47 (MPARAM)ptrayItem->notifyIcon.uID, (MPARAM)WM_LBUTTONDBLCLK_W);
48 return (MRESULT)FALSE;
49 case WM_BUTTON2DBLCLK|0x2000:
50 DoWin32PostMessage(ptrayItem->notifyIcon.hWnd, ptrayItem->notifyIcon.uCallbackMessage,
51 (MPARAM)ptrayItem->notifyIcon.uID, (MPARAM)WM_RBUTTONDBLCLK_W);
52 return (MRESULT)FALSE;
53 case WM_BUTTON3DBLCLK|0x2000:
54 DoWin32PostMessage(ptrayItem->notifyIcon.hWnd, ptrayItem->notifyIcon.uCallbackMessage,
55 (MPARAM)ptrayItem->notifyIcon.uID, (MPARAM)WM_MBUTTONDBLCLK_W);
56 return (MRESULT)FALSE;
57 case WM_BUTTON1UP|0x2000:
58 DoWin32PostMessage(ptrayItem->notifyIcon.hWnd, ptrayItem->notifyIcon.uCallbackMessage,
59 (MPARAM)ptrayItem->notifyIcon.uID, (MPARAM)WM_LBUTTONUP_W);
60 return (MRESULT)FALSE;
61 case WM_BUTTON2UP|0x2000:
62 DoWin32PostMessage(ptrayItem->notifyIcon.hWnd, ptrayItem->notifyIcon.uCallbackMessage,
63 (MPARAM)ptrayItem->notifyIcon.uID, (MPARAM)WM_RBUTTONUP_W);
64 return (MRESULT)FALSE;
65 case WM_BUTTON3UP|0x2000:
66 DoWin32PostMessage(ptrayItem->notifyIcon.hWnd, ptrayItem->notifyIcon.uCallbackMessage,
67 (MPARAM)ptrayItem->notifyIcon.uID, (MPARAM)WM_MBUTTONUP_W);
68 return (MRESULT)FALSE;
69 case WM_BUTTON1DOWN|0x2000:
70 DoWin32PostMessage(ptrayItem->notifyIcon.hWnd, ptrayItem->notifyIcon.uCallbackMessage,
71 (MPARAM)ptrayItem->notifyIcon.uID, (MPARAM)WM_LBUTTONDOWN_W);
72 return (MRESULT)FALSE;
73 case WM_BUTTON2DOWN|0x2000:
74 DoWin32PostMessage(ptrayItem->notifyIcon.hWnd, ptrayItem->notifyIcon.uCallbackMessage,
75 (MPARAM)ptrayItem->notifyIcon.uID, (MPARAM)WM_RBUTTONDOWN_W);
76 return (MRESULT)FALSE;
77 case WM_BUTTON3DOWN|0x2000:
78 DoWin32PostMessage(ptrayItem->notifyIcon.hWnd, ptrayItem->notifyIcon.uCallbackMessage,
79 (MPARAM)ptrayItem->notifyIcon.uID, (MPARAM)WM_MBUTTONDOWN_W);
80 return (MRESULT)FALSE;
81 }
82 return WinDefWindowProc( hWnd , msg , mp1 , mp2 );
83}
84
85static const char * const systraysupclass = "Odin32SystraySupport";
86
87static BOOL SYSTRAY_Old_RegisterClass(void)
88{
89 //WinRegisterClass( hab, systraysupclass, SYSTRAY_Old_WndProc, 0, sizeof(ULONG) );
90 WinRegisterClass(0, systraysupclass, SYSTRAY_Old_WndProc, 0, sizeof(ULONG) );
91 return TRUE;
92}
93
94
95static BOOL SYSTRAY_Old_ItemInit(SystrayItem *ptrayItem)
96{
97 ULONG fcf = FCF_TITLEBAR;
98
99 if (!SYSTRAY_Old_RegisterClass())
100 {
101 return FALSE;
102 }
103
104 ptrayItem->hWndFrame = WinCreateStdWindow(HWND_DESKTOP, 0, &fcf, NULL,
105 "", 0, NULLHANDLE, 0, NULL);
106 if (!ptrayItem->hWndFrame)
107 {
108 return FALSE;
109 }
110 ptrayItem->hWndClient = WinCreateWindow(ptrayItem->hWndFrame, systraysupclass, "",
111 0, 0, 0, 0, 0, ptrayItem->hWndFrame,
112 HWND_TOP, FID_CLIENT, ptrayItem, NULL);
113 if (!ptrayItem->hWndClient)
114 {
115 return FALSE;
116 }
117
118 WinDdeInitiate(ptrayItem->hWndClient, SZAPP, SZTOPIC, NULL);
119 if (hwndTrayServer)
120 WinPostMsg(hwndTrayServer, WM_TRAYICON,
121 (MPARAM)ptrayItem->hWndClient, (MPARAM)NULL);
122
123 return (hwndTrayServer != NULLHANDLE);
124}
125
126static void SYSTRAY_Old_ItemTerm(SystrayItem *ptrayItem)
127{
128 HPOINTER hIcon = (HPOINTER)WinSendMsg(ptrayItem->hWndFrame, WM_QUERYICON, NULL, NULL);
129 if (hIcon != NULLHANDLE)
130 WinDestroyPointer(hIcon);
131
132 WinDestroyWindow(ptrayItem->hWndFrame);
133}
134
135static void SYSTRAY_Old_ItemUpdate(SystrayItem *ptrayItem, ULONG uFlags)
136{
137 // uFlags = 0 means it's the first time, add everything
138
139 if (uFlags == 0 || (uFlags & NIF_ICON))
140 {
141 // Windows seems to make a copy of icons displayed in the tray area. At
142 // least, calling DestroyIcon() after passing the icon handle to
143 // Shell_NotifyIcon() doesn't harm the icon displayed in the tray.
144 // Behave similarly on OS/2 (some applications do call DestroyIcon()).
145 // The copy is deleted in SYSTRAY_Old_ItemTerm().
146
147 POINTERINFO Info;
148 HPOINTER hIcon = NULLHANDLE;
149 BOOL brc;
150 brc = WinQueryPointerInfo(ptrayItem->notifyIcon.hIcon, &Info);
151 if (brc)
152 {
153 hIcon = WinCreatePointerIndirect(HWND_DESKTOP, &Info);
154 if (hIcon != NULLHANDLE)
155 {
156 WinSendMsg(ptrayItem->hWndFrame, WM_SETICON,
157 MPFROMLONG(hIcon), MPVOID);
158 if (hwndTrayServer)
159 WinPostMsg(hwndTrayServer, WM_TRAYICON,
160 (MPARAM)ptrayItem->hWndClient, (MPARAM)NULL);
161 }
162 }
163 }
164 if (uFlags == 0 || (uFlags & NIF_TIP))
165 {
166 WinSetWindowText(ptrayItem->hWndFrame, ptrayItem->notifyIcon.szTip);
167 if (hwndTrayServer)
168 WinPostMsg(hwndTrayServer, WM_TRAYICON,
169 (MPARAM)ptrayItem->hWndClient, (MPARAM)NULL);
170 }
171}
172
173BOOL SYSTRAY_Init(void)
174{
175 // try the new xsystray API first
176 if (SYSTRAY_Ex_Init())
177 return TRUE;
178
179 // fallback to the old API
180 SYSTRAY_ItemInit = SYSTRAY_Old_ItemInit;
181 SYSTRAY_ItemTerm = SYSTRAY_Old_ItemTerm;
182 SYSTRAY_ItemUpdate = SYSTRAY_Old_ItemUpdate;
183
184 return TRUE;
185}
186
Note: See TracBrowser for help on using the repository browser.