1*cdf0e10cSrcweir // QuickStart.cpp : Defines the entry point for the application.
2*cdf0e10cSrcweir //
3*cdf0e10cSrcweir 
4*cdf0e10cSrcweir #include "stdafx.h"
5*cdf0e10cSrcweir #include "resource.h"
6*cdf0e10cSrcweir #include <systools/win32/uwinapi.h>
7*cdf0e10cSrcweir #include <stdio.h>
8*cdf0e10cSrcweir 
9*cdf0e10cSrcweir #define MY_TASKBAR_NOTIFICATION         WM_USER+1
10*cdf0e10cSrcweir 
11*cdf0e10cSrcweir #define MAX_LOADSTRING 100
12*cdf0e10cSrcweir 
13*cdf0e10cSrcweir // message used to communicate with soffice
14*cdf0e10cSrcweir #define TERMINATIONVETO_MESSAGE "SO TerminationVeto"
15*cdf0e10cSrcweir #define TERMINATE_MESSAGE       "SO Terminate"
16*cdf0e10cSrcweir #define LISTENER_WINDOWCLASS    "SO Listener Class"
17*cdf0e10cSrcweir #define KILLTRAY_MESSAGE		"SO KillTray"
18*cdf0e10cSrcweir 
19*cdf0e10cSrcweir static  UINT aTerminationVetoMessage = 0x7FFF;
20*cdf0e10cSrcweir static  UINT aTerminateMessage = 0x7FFF;
21*cdf0e10cSrcweir static  HMENU popupMenu = NULL;
22*cdf0e10cSrcweir static  bool bTerminateVeto = true;
23*cdf0e10cSrcweir 
24*cdf0e10cSrcweir #define UPDATE_TIMER   1
25*cdf0e10cSrcweir 
26*cdf0e10cSrcweir // Global Variables:
27*cdf0e10cSrcweir HINSTANCE hInst;								// current instance
28*cdf0e10cSrcweir TCHAR szTitle[MAX_LOADSTRING];					// The title bar text
29*cdf0e10cSrcweir TCHAR szWindowClass[MAX_LOADSTRING];			// The title bar text
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir TCHAR szExitString[MAX_LOADSTRING];
32*cdf0e10cSrcweir TCHAR szTooltipString[MAX_LOADSTRING];
33*cdf0e10cSrcweir 
34*cdf0e10cSrcweir // Foward declarations of functions included in this code module:
35*cdf0e10cSrcweir ATOM				MyRegisterClass(HINSTANCE hInstance);
36*cdf0e10cSrcweir BOOL				InitInstance(HINSTANCE, int);
37*cdf0e10cSrcweir LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
38*cdf0e10cSrcweir LRESULT CALLBACK	About(HWND, UINT, WPARAM, LPARAM);
39*cdf0e10cSrcweir 
40*cdf0e10cSrcweir bool SofficeRuns()
41*cdf0e10cSrcweir {
42*cdf0e10cSrcweir     // check for soffice by searching the communication window
43*cdf0e10cSrcweir     return ( FindWindowEx( NULL, NULL, LISTENER_WINDOWCLASS, NULL ) == NULL ) ? false : true;
44*cdf0e10cSrcweir }
45*cdf0e10cSrcweir 
46*cdf0e10cSrcweir bool launchSoffice( )
47*cdf0e10cSrcweir {
48*cdf0e10cSrcweir     if ( !SofficeRuns() )
49*cdf0e10cSrcweir     {
50*cdf0e10cSrcweir         // UINT ret = WinExec( "h:\\office60.630b\\program\\swriter.exe -bean", SW_SHOW );
51*cdf0e10cSrcweir         char filename[_MAX_PATH + 1];
52*cdf0e10cSrcweir 
53*cdf0e10cSrcweir 		filename[_MAX_PATH] = 0;
54*cdf0e10cSrcweir         GetModuleFileName( NULL, filename, _MAX_PATH ); // soffice resides in the same dir
55*cdf0e10cSrcweir         char *p = strrchr( filename, '\\' );
56*cdf0e10cSrcweir         if ( !p )
57*cdf0e10cSrcweir             return false;
58*cdf0e10cSrcweir 
59*cdf0e10cSrcweir         strncpy( p+1, "soffice.exe", _MAX_PATH - (p+1 - filename) );
60*cdf0e10cSrcweir 
61*cdf0e10cSrcweir         char imagename[_MAX_PATH + 1];
62*cdf0e10cSrcweir 
63*cdf0e10cSrcweir 		imagename[_MAX_PATH] = 0;
64*cdf0e10cSrcweir         _snprintf(imagename, _MAX_PATH, "\"%s\" -quickstart", filename );
65*cdf0e10cSrcweir 
66*cdf0e10cSrcweir         UINT ret = WinExec( imagename, SW_SHOW );
67*cdf0e10cSrcweir         if ( ret < 32 )
68*cdf0e10cSrcweir             return false;
69*cdf0e10cSrcweir /*
70*cdf0e10cSrcweir         // wait until we can communicate
71*cdf0e10cSrcweir         int retry = 30;
72*cdf0e10cSrcweir         while (retry-- && !SofficeRuns() )
73*cdf0e10cSrcweir             Sleep(1000);
74*cdf0e10cSrcweir 
75*cdf0e10cSrcweir         return SofficeRuns();
76*cdf0e10cSrcweir         */
77*cdf0e10cSrcweir         return true;
78*cdf0e10cSrcweir     }
79*cdf0e10cSrcweir     else
80*cdf0e10cSrcweir         return true;
81*cdf0e10cSrcweir }
82*cdf0e10cSrcweir 
83*cdf0e10cSrcweir void NotifyListener( HWND hWnd )
84*cdf0e10cSrcweir {
85*cdf0e10cSrcweir     static HICON hIconActive=NULL;
86*cdf0e10cSrcweir     //static HICON hIconInActive=NULL;
87*cdf0e10cSrcweir 
88*cdf0e10cSrcweir     if( !hIconActive )
89*cdf0e10cSrcweir     {
90*cdf0e10cSrcweir         hIconActive = (HICON)LoadImage( GetModuleHandle( NULL ), MAKEINTRESOURCE( ICON_ACTIVE ),
91*cdf0e10cSrcweir             IMAGE_ICON, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ),
92*cdf0e10cSrcweir             LR_DEFAULTCOLOR | LR_SHARED );
93*cdf0e10cSrcweir 
94*cdf0e10cSrcweir /*        hIconInActive = (HICON)LoadImage( GetModuleHandle( NULL ), MAKEINTRESOURCE( ICON_INACTIVE ),
95*cdf0e10cSrcweir             IMAGE_ICON, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ),
96*cdf0e10cSrcweir             LR_DEFAULTCOLOR | LR_SHARED );
97*cdf0e10cSrcweir             */
98*cdf0e10cSrcweir     }
99*cdf0e10cSrcweir 
100*cdf0e10cSrcweir     NOTIFYICONDATA nid;
101*cdf0e10cSrcweir     nid.cbSize = sizeof(NOTIFYICONDATA);
102*cdf0e10cSrcweir     nid.hWnd   = hWnd;
103*cdf0e10cSrcweir     nid.uID    = IDM_QUICKSTART;
104*cdf0e10cSrcweir 	nid.szTip[elementsof(nid.szTip) - 1] = 0;
105*cdf0e10cSrcweir //    nid.hIcon = bTerminateVeto ? hIconActive : hIconInActive;
106*cdf0e10cSrcweir //    strncpy(nid.szTip, bTerminateVeto ? STRING_QUICKSTARTACTIVE : STRING_QUICKSTARTINACTIVE, elementsof(nid.szTip) - 1 );
107*cdf0e10cSrcweir     nid.hIcon = hIconActive;
108*cdf0e10cSrcweir     strncpy(nid.szTip, szTooltipString, elementsof(nid.szTip) - 1);
109*cdf0e10cSrcweir     nid.uFlags = NIF_TIP|NIF_ICON;
110*cdf0e10cSrcweir 
111*cdf0e10cSrcweir     // update systray
112*cdf0e10cSrcweir     Shell_NotifyIcon( NIM_MODIFY, &nid );
113*cdf0e10cSrcweir     //CheckMenuItem( popupMenu, IDM_QUICKSTART, bTerminateVeto ? MF_CHECKED : MF_UNCHECKED );
114*cdf0e10cSrcweir 
115*cdf0e10cSrcweir     // notify listener
116*cdf0e10cSrcweir     SendMessage( HWND_BROADCAST, aTerminationVetoMessage, (WORD) bTerminateVeto, 0L );
117*cdf0e10cSrcweir }
118*cdf0e10cSrcweir 
119*cdf0e10cSrcweir 
120*cdf0e10cSrcweir 
121*cdf0e10cSrcweir int APIENTRY WinMain(HINSTANCE hInstance,
122*cdf0e10cSrcweir                      HINSTANCE /*hPrevInstance*/,
123*cdf0e10cSrcweir                      LPSTR     /*lpCmdLine*/,
124*cdf0e10cSrcweir                      int       nCmdShow)
125*cdf0e10cSrcweir {
126*cdf0e10cSrcweir 	// Look for -killtray argument
127*cdf0e10cSrcweir 
128*cdf0e10cSrcweir 	for ( int i = 1; i < __argc; i++ )
129*cdf0e10cSrcweir 	{
130*cdf0e10cSrcweir 		if ( 0 == strcmp( __argv[i], "-killtray" ) )
131*cdf0e10cSrcweir 		{
132*cdf0e10cSrcweir 			HWND	hwndTray = FindWindow( LISTENER_WINDOWCLASS, NULL );
133*cdf0e10cSrcweir 
134*cdf0e10cSrcweir 			if ( hwndTray )
135*cdf0e10cSrcweir 			{
136*cdf0e10cSrcweir 				UINT	uMsgKillTray = RegisterWindowMessage( KILLTRAY_MESSAGE );
137*cdf0e10cSrcweir 				SendMessage( hwndTray, uMsgKillTray, 0, 0 );
138*cdf0e10cSrcweir 			}
139*cdf0e10cSrcweir 
140*cdf0e10cSrcweir 			return 0;
141*cdf0e10cSrcweir 		}
142*cdf0e10cSrcweir 	}
143*cdf0e10cSrcweir 
144*cdf0e10cSrcweir     launchSoffice();
145*cdf0e10cSrcweir     return 0;
146*cdf0e10cSrcweir 
147*cdf0e10cSrcweir  	// TODO: Place code here.
148*cdf0e10cSrcweir 	MSG msg;
149*cdf0e10cSrcweir 	HACCEL hAccelTable;
150*cdf0e10cSrcweir     aTerminationVetoMessage = RegisterWindowMessage( TERMINATIONVETO_MESSAGE );
151*cdf0e10cSrcweir     aTerminateMessage       = RegisterWindowMessage( TERMINATE_MESSAGE );
152*cdf0e10cSrcweir 
153*cdf0e10cSrcweir 	// Initialize global strings
154*cdf0e10cSrcweir 	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
155*cdf0e10cSrcweir 	LoadString(hInstance, IDC_QUICKSTART, szWindowClass, MAX_LOADSTRING);
156*cdf0e10cSrcweir 
157*cdf0e10cSrcweir 	LoadString(hInstance, IDS_EXIT,    szExitString, MAX_LOADSTRING);
158*cdf0e10cSrcweir 	LoadString(hInstance, IDS_TOOLTIP, szTooltipString, MAX_LOADSTRING);
159*cdf0e10cSrcweir 
160*cdf0e10cSrcweir 	MyRegisterClass(hInstance);
161*cdf0e10cSrcweir 
162*cdf0e10cSrcweir 	// Perform application initialization:
163*cdf0e10cSrcweir 	if (!InitInstance (hInstance, nCmdShow))
164*cdf0e10cSrcweir 	{
165*cdf0e10cSrcweir 		return FALSE;
166*cdf0e10cSrcweir 	}
167*cdf0e10cSrcweir 
168*cdf0e10cSrcweir 	hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_QUICKSTART);
169*cdf0e10cSrcweir 
170*cdf0e10cSrcweir 	// Main message loop:
171*cdf0e10cSrcweir 	while (GetMessage(&msg, NULL, 0, 0))
172*cdf0e10cSrcweir 	{
173*cdf0e10cSrcweir 		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
174*cdf0e10cSrcweir 		{
175*cdf0e10cSrcweir 			TranslateMessage(&msg);
176*cdf0e10cSrcweir 			DispatchMessage(&msg);
177*cdf0e10cSrcweir 		}
178*cdf0e10cSrcweir 	}
179*cdf0e10cSrcweir 
180*cdf0e10cSrcweir 	return msg.wParam;
181*cdf0e10cSrcweir }
182*cdf0e10cSrcweir 
183*cdf0e10cSrcweir 
184*cdf0e10cSrcweir 
185*cdf0e10cSrcweir //
186*cdf0e10cSrcweir //  FUNCTION: MyRegisterClass()
187*cdf0e10cSrcweir //
188*cdf0e10cSrcweir //  PURPOSE: Registers the window class.
189*cdf0e10cSrcweir //
190*cdf0e10cSrcweir //  COMMENTS:
191*cdf0e10cSrcweir //
192*cdf0e10cSrcweir //    This function and its usage is only necessary if you want this code
193*cdf0e10cSrcweir //    to be compatible with Win32 systems prior to the 'RegisterClassEx'
194*cdf0e10cSrcweir //    function that was added to Windows 95. It is important to call this function
195*cdf0e10cSrcweir //    so that the application will get 'well formed' small icons associated
196*cdf0e10cSrcweir //    with it.
197*cdf0e10cSrcweir //
198*cdf0e10cSrcweir ATOM MyRegisterClass(HINSTANCE hInstance)
199*cdf0e10cSrcweir {
200*cdf0e10cSrcweir 	WNDCLASSEX wcex;
201*cdf0e10cSrcweir 
202*cdf0e10cSrcweir 	wcex.cbSize = sizeof(WNDCLASSEX);
203*cdf0e10cSrcweir 
204*cdf0e10cSrcweir 	wcex.style			= CS_HREDRAW | CS_VREDRAW;
205*cdf0e10cSrcweir 	wcex.lpfnWndProc	= (WNDPROC)WndProc;
206*cdf0e10cSrcweir 	wcex.cbClsExtra		= 0;
207*cdf0e10cSrcweir 	wcex.cbWndExtra		= 0;
208*cdf0e10cSrcweir 	wcex.hInstance		= hInstance;
209*cdf0e10cSrcweir 	wcex.hIcon			= LoadIcon(hInstance, (LPCTSTR)IDI_QUICKSTART);
210*cdf0e10cSrcweir 	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
211*cdf0e10cSrcweir 	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
212*cdf0e10cSrcweir 	wcex.lpszMenuName	= NULL;
213*cdf0e10cSrcweir 	wcex.lpszClassName	= szWindowClass;
214*cdf0e10cSrcweir 	wcex.hIconSm		= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
215*cdf0e10cSrcweir 
216*cdf0e10cSrcweir 	return RegisterClassEx(&wcex);
217*cdf0e10cSrcweir }
218*cdf0e10cSrcweir 
219*cdf0e10cSrcweir //
220*cdf0e10cSrcweir //   FUNCTION: InitInstance(HANDLE, int)
221*cdf0e10cSrcweir //
222*cdf0e10cSrcweir //   PURPOSE: Saves instance handle and creates main window
223*cdf0e10cSrcweir //
224*cdf0e10cSrcweir //   COMMENTS:
225*cdf0e10cSrcweir //
226*cdf0e10cSrcweir //        In this function, we save the instance handle in a global variable and
227*cdf0e10cSrcweir //        create and display the main program window.
228*cdf0e10cSrcweir //
229*cdf0e10cSrcweir BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
230*cdf0e10cSrcweir {
231*cdf0e10cSrcweir    HWND hWnd;
232*cdf0e10cSrcweir 
233*cdf0e10cSrcweir    hInst = hInstance; // Store instance handle in our global variable
234*cdf0e10cSrcweir 
235*cdf0e10cSrcweir    hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
236*cdf0e10cSrcweir       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
237*cdf0e10cSrcweir 
238*cdf0e10cSrcweir    if (!hWnd)
239*cdf0e10cSrcweir    {
240*cdf0e10cSrcweir       return FALSE;
241*cdf0e10cSrcweir    }
242*cdf0e10cSrcweir 
243*cdf0e10cSrcweir    nCmdShow = SW_HIDE;   // hide main window, we only need the taskbar icon
244*cdf0e10cSrcweir    ShowWindow(hWnd, nCmdShow);
245*cdf0e10cSrcweir    UpdateWindow(hWnd);
246*cdf0e10cSrcweir 
247*cdf0e10cSrcweir    return TRUE;
248*cdf0e10cSrcweir }
249*cdf0e10cSrcweir 
250*cdf0e10cSrcweir //
251*cdf0e10cSrcweir //  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
252*cdf0e10cSrcweir //
253*cdf0e10cSrcweir //  PURPOSE:  Processes messages for the main window.
254*cdf0e10cSrcweir //
255*cdf0e10cSrcweir //  WM_COMMAND	- process the application menu
256*cdf0e10cSrcweir //  WM_PAINT	- Paint the main window
257*cdf0e10cSrcweir //  WM_DESTROY	- post a quit message and return
258*cdf0e10cSrcweir //
259*cdf0e10cSrcweir //
260*cdf0e10cSrcweir LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
261*cdf0e10cSrcweir {
262*cdf0e10cSrcweir     switch (message)
263*cdf0e10cSrcweir 	{
264*cdf0e10cSrcweir         case WM_CREATE:
265*cdf0e10cSrcweir         {
266*cdf0e10cSrcweir             // make sure soffice runs
267*cdf0e10cSrcweir             if( !launchSoffice() )
268*cdf0e10cSrcweir                 return -1;
269*cdf0e10cSrcweir 
270*cdf0e10cSrcweir             // create popup menu
271*cdf0e10cSrcweir             popupMenu = CreatePopupMenu();
272*cdf0e10cSrcweir             static int count=0;
273*cdf0e10cSrcweir 
274*cdf0e10cSrcweir             // Add my items
275*cdf0e10cSrcweir             MENUITEMINFO mi;
276*cdf0e10cSrcweir             mi.cbSize = sizeof(MENUITEMINFO);
277*cdf0e10cSrcweir             mi.fMask=MIIM_TYPE|MIIM_STATE|MIIM_ID;
278*cdf0e10cSrcweir             mi.fType=MFT_STRING;
279*cdf0e10cSrcweir             mi.fState=MFS_ENABLED|MFS_DEFAULT;
280*cdf0e10cSrcweir             mi.wID = IDM_QUICKSTART;
281*cdf0e10cSrcweir             mi.hSubMenu=NULL;
282*cdf0e10cSrcweir             mi.hbmpChecked=NULL;
283*cdf0e10cSrcweir             mi.hbmpUnchecked=NULL;
284*cdf0e10cSrcweir             mi.dwItemData=NULL;
285*cdf0e10cSrcweir             mi.dwTypeData = "QuickStart";
286*cdf0e10cSrcweir             mi.cch = strlen(mi.dwTypeData);
287*cdf0e10cSrcweir //            InsertMenuItem(popupMenu, count++, TRUE, &mi);
288*cdf0e10cSrcweir 
289*cdf0e10cSrcweir             mi.cbSize = sizeof(MENUITEMINFO);
290*cdf0e10cSrcweir             mi.fMask=MIIM_TYPE|MIIM_STATE|MIIM_ID;
291*cdf0e10cSrcweir             mi.fType=MFT_STRING;
292*cdf0e10cSrcweir             mi.fState=MFS_ENABLED;
293*cdf0e10cSrcweir             mi.wID = IDM_ABOUT;
294*cdf0e10cSrcweir             mi.hSubMenu=NULL;
295*cdf0e10cSrcweir             mi.hbmpChecked=NULL;
296*cdf0e10cSrcweir             mi.hbmpUnchecked=NULL;
297*cdf0e10cSrcweir             mi.dwItemData=NULL;
298*cdf0e10cSrcweir             mi.dwTypeData = "Info...";
299*cdf0e10cSrcweir             mi.cch = strlen(mi.dwTypeData);
300*cdf0e10cSrcweir //            InsertMenuItem(popupMenu, count++, TRUE, &mi);
301*cdf0e10cSrcweir 
302*cdf0e10cSrcweir             mi.cbSize = sizeof(MENUITEMINFO);
303*cdf0e10cSrcweir             mi.fMask=MIIM_TYPE;
304*cdf0e10cSrcweir             mi.fType=MFT_SEPARATOR;
305*cdf0e10cSrcweir             mi.hSubMenu=NULL;
306*cdf0e10cSrcweir             mi.hbmpChecked=NULL;
307*cdf0e10cSrcweir             mi.hbmpUnchecked=NULL;
308*cdf0e10cSrcweir             mi.dwItemData=NULL;
309*cdf0e10cSrcweir //            InsertMenuItem(popupMenu, count++, TRUE, &mi);
310*cdf0e10cSrcweir 
311*cdf0e10cSrcweir             mi.cbSize = sizeof(MENUITEMINFO);
312*cdf0e10cSrcweir             mi.fMask=MIIM_TYPE|MIIM_STATE|MIIM_ID;
313*cdf0e10cSrcweir             mi.fType=MFT_STRING;
314*cdf0e10cSrcweir             mi.fState=MFS_ENABLED;
315*cdf0e10cSrcweir             mi.wID = IDM_EXIT;
316*cdf0e10cSrcweir             mi.hSubMenu=NULL;
317*cdf0e10cSrcweir             mi.hbmpChecked=NULL;
318*cdf0e10cSrcweir             mi.hbmpUnchecked=NULL;
319*cdf0e10cSrcweir             mi.dwItemData=NULL;
320*cdf0e10cSrcweir             mi.dwTypeData = szExitString;
321*cdf0e10cSrcweir             mi.cch = strlen(mi.dwTypeData);
322*cdf0e10cSrcweir             InsertMenuItem(popupMenu, count++, TRUE, &mi);
323*cdf0e10cSrcweir 
324*cdf0e10cSrcweir             // add taskbar icon
325*cdf0e10cSrcweir             NOTIFYICONDATA nid;
326*cdf0e10cSrcweir             nid.cbSize = sizeof(NOTIFYICONDATA);
327*cdf0e10cSrcweir             nid.hWnd   = hWnd;
328*cdf0e10cSrcweir             nid.uID    = IDM_QUICKSTART;
329*cdf0e10cSrcweir             nid.uFlags = NIF_MESSAGE;
330*cdf0e10cSrcweir             nid.uCallbackMessage=MY_TASKBAR_NOTIFICATION;
331*cdf0e10cSrcweir             Shell_NotifyIcon(NIM_ADD, &nid);
332*cdf0e10cSrcweir 
333*cdf0e10cSrcweir             // and update state
334*cdf0e10cSrcweir             NotifyListener( hWnd );
335*cdf0e10cSrcweir 
336*cdf0e10cSrcweir             // check for soffice
337*cdf0e10cSrcweir             SetTimer(hWnd, UPDATE_TIMER, 3000, NULL);
338*cdf0e10cSrcweir         }
339*cdf0e10cSrcweir         break;
340*cdf0e10cSrcweir 
341*cdf0e10cSrcweir         case MY_TASKBAR_NOTIFICATION: // message from taskbar
342*cdf0e10cSrcweir             switch(lParam)
343*cdf0e10cSrcweir             {
344*cdf0e10cSrcweir /*
345*cdf0e10cSrcweir                 case WM_LBUTTONDBLCLK:
346*cdf0e10cSrcweir                     bTerminateVeto = bTerminateVeto ? false : true;
347*cdf0e10cSrcweir                     NotifyListener( hWnd );
348*cdf0e10cSrcweir                     break;
349*cdf0e10cSrcweir                     */
350*cdf0e10cSrcweir 
351*cdf0e10cSrcweir                 case WM_LBUTTONDOWN:
352*cdf0e10cSrcweir                 case WM_RBUTTONDOWN:
353*cdf0e10cSrcweir                 {
354*cdf0e10cSrcweir                     POINT pt;
355*cdf0e10cSrcweir                     GetCursorPos(&pt);
356*cdf0e10cSrcweir                     SetForegroundWindow( hWnd );
357*cdf0e10cSrcweir                     int m = TrackPopupMenuEx(popupMenu, TPM_RETURNCMD|TPM_LEFTALIGN|TPM_RIGHTBUTTON,
358*cdf0e10cSrcweir                         pt.x, pt.y, hWnd, NULL);
359*cdf0e10cSrcweir                     // BUGFIX: See Q135788 (PRB: Menus for Notification Icons Don't Work Correctly)
360*cdf0e10cSrcweir                     PostMessage(hWnd, NULL, 0, 0);
361*cdf0e10cSrcweir                     switch(m)
362*cdf0e10cSrcweir                     {
363*cdf0e10cSrcweir                     case IDM_QUICKSTART:
364*cdf0e10cSrcweir                         bTerminateVeto = bTerminateVeto ? false : true;
365*cdf0e10cSrcweir                         NotifyListener( hWnd );
366*cdf0e10cSrcweir                         break;
367*cdf0e10cSrcweir                     case IDM_ABOUT:
368*cdf0e10cSrcweir                         DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
369*cdf0e10cSrcweir                         break;
370*cdf0e10cSrcweir                     case IDM_EXIT:
371*cdf0e10cSrcweir                         DestroyWindow(hWnd);
372*cdf0e10cSrcweir                         break;
373*cdf0e10cSrcweir                     }
374*cdf0e10cSrcweir                 }
375*cdf0e10cSrcweir                 break;
376*cdf0e10cSrcweir             }
377*cdf0e10cSrcweir             break;
378*cdf0e10cSrcweir 
379*cdf0e10cSrcweir 		case WM_TIMER:
380*cdf0e10cSrcweir             if( wParam == UPDATE_TIMER )
381*cdf0e10cSrcweir             {
382*cdf0e10cSrcweir                 // update state
383*cdf0e10cSrcweir                 NotifyListener( hWnd );
384*cdf0e10cSrcweir             }
385*cdf0e10cSrcweir             break;
386*cdf0e10cSrcweir 
387*cdf0e10cSrcweir 		case WM_DESTROY:
388*cdf0e10cSrcweir             // try to terminate office
389*cdf0e10cSrcweir             SendMessage( HWND_BROADCAST, aTerminateMessage, 0, 0L );
390*cdf0e10cSrcweir 
391*cdf0e10cSrcweir             // delete taskbar icon
392*cdf0e10cSrcweir             NOTIFYICONDATA nid;
393*cdf0e10cSrcweir             nid.cbSize=sizeof(NOTIFYICONDATA);
394*cdf0e10cSrcweir             nid.hWnd = hWnd;
395*cdf0e10cSrcweir             nid.uID = IDM_QUICKSTART;
396*cdf0e10cSrcweir             Shell_NotifyIcon(NIM_DELETE, &nid);
397*cdf0e10cSrcweir 
398*cdf0e10cSrcweir 			PostQuitMessage(0);
399*cdf0e10cSrcweir 			break;
400*cdf0e10cSrcweir 		default:
401*cdf0e10cSrcweir 			return DefWindowProc(hWnd, message, wParam, lParam);
402*cdf0e10cSrcweir    }
403*cdf0e10cSrcweir    return 0;
404*cdf0e10cSrcweir }
405*cdf0e10cSrcweir 
406*cdf0e10cSrcweir // Mesage handler for about box.
407*cdf0e10cSrcweir LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM)
408*cdf0e10cSrcweir {
409*cdf0e10cSrcweir 	switch (message)
410*cdf0e10cSrcweir 	{
411*cdf0e10cSrcweir 		case WM_INITDIALOG:
412*cdf0e10cSrcweir 				return TRUE;
413*cdf0e10cSrcweir 
414*cdf0e10cSrcweir 		case WM_COMMAND:
415*cdf0e10cSrcweir 			if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
416*cdf0e10cSrcweir 			{
417*cdf0e10cSrcweir 				EndDialog(hDlg, LOWORD(wParam));
418*cdf0e10cSrcweir 				return TRUE;
419*cdf0e10cSrcweir 			}
420*cdf0e10cSrcweir 			break;
421*cdf0e10cSrcweir 	}
422*cdf0e10cSrcweir     return FALSE;
423*cdf0e10cSrcweir }
424