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