Kaydet (Commit) 6411ad12 authored tarafından Andras Timar's avatar Andras Timar

code cleanup of Windows quickstarter

üst 3ac61e97
......@@ -7,37 +7,10 @@
#include <systools/win32/uwinapi.h>
#include <stdio.h>
#define MY_TASKBAR_NOTIFICATION WM_USER+1
#define MAX_LOADSTRING 100
// message used to communicate with soffice
#define TERMINATIONVETO_MESSAGE "SO TerminationVeto"
#define TERMINATE_MESSAGE "SO Terminate"
#define LISTENER_WINDOWCLASS "SO Listener Class"
#define KILLTRAY_MESSAGE "SO KillTray"
static UINT aTerminationVetoMessage = 0x7FFF;
static UINT aTerminateMessage = 0x7FFF;
static HMENU popupMenu = NULL;
static bool bTerminateVeto = true;
#define UPDATE_TIMER 1
// Global Variables:
HINSTANCE hInst; // current instance
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING]; // The title bar text
TCHAR szExitString[MAX_LOADSTRING];
TCHAR szTooltipString[MAX_LOADSTRING];
// Foward declarations of functions included in this code module:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
bool SofficeRuns()
{
// check for soffice by searching the communication window
......@@ -66,58 +39,13 @@ bool launchSoffice( )
UINT ret = WinExec( imagename, SW_SHOW );
if ( ret < 32 )
return false;
/*
// wait until we can communicate
int retry = 30;
while (retry-- && !SofficeRuns() )
Sleep(1000);
return SofficeRuns();
*/
return true;
}
else
return true;
}
void NotifyListener( HWND hWnd )
{
static HICON hIconActive=NULL;
//static HICON hIconInActive=NULL;
if( !hIconActive )
{
hIconActive = (HICON)LoadImage( GetModuleHandle( NULL ), MAKEINTRESOURCE( ICON_ACTIVE ),
IMAGE_ICON, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ),
LR_DEFAULTCOLOR | LR_SHARED );
/* hIconInActive = (HICON)LoadImage( GetModuleHandle( NULL ), MAKEINTRESOURCE( ICON_INACTIVE ),
IMAGE_ICON, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ),
LR_DEFAULTCOLOR | LR_SHARED );
*/
}
NOTIFYICONDATA nid;
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hWnd;
nid.uID = IDM_QUICKSTART;
nid.szTip[SAL_N_ELEMENTS(nid.szTip) - 1] = 0;
// nid.hIcon = bTerminateVeto ? hIconActive : hIconInActive;
// strncpy(nid.szTip, bTerminateVeto ? STRING_QUICKSTARTACTIVE : STRING_QUICKSTARTINACTIVE, SAL_N_ELEMENTS(nid.szTip) - 1 );
nid.hIcon = hIconActive;
strncpy(nid.szTip, szTooltipString, SAL_N_ELEMENTS(nid.szTip) - 1);
nid.uFlags = NIF_TIP|NIF_ICON;
// update systray
Shell_NotifyIcon( NIM_MODIFY, &nid );
//CheckMenuItem( popupMenu, IDM_QUICKSTART, bTerminateVeto ? MF_CHECKED : MF_UNCHECKED );
// notify listener
SendMessage( HWND_BROADCAST, aTerminationVetoMessage, (WORD) bTerminateVeto, 0L );
}
int APIENTRY WinMain(HINSTANCE /*hInstance*/,
HINSTANCE /*hPrevInstance*/,
LPSTR /*lpCmdLine*/,
......@@ -143,287 +71,6 @@ int APIENTRY WinMain(HINSTANCE /*hInstance*/,
launchSoffice();
return 0;
#if 0 // Note unconditional "return 0" above. Do not remove this block of code
// unless you are sure it will never be needed even for reference.
// TODO: Place code here.
MSG msg;
HACCEL hAccelTable;
aTerminationVetoMessage = RegisterWindowMessage( TERMINATIONVETO_MESSAGE );
aTerminateMessage = RegisterWindowMessage( TERMINATE_MESSAGE );
// Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_QUICKSTART, szWindowClass, MAX_LOADSTRING);
LoadString(hInstance, IDS_EXIT, szExitString, MAX_LOADSTRING);
LoadString(hInstance, IDS_TOOLTIP, szTooltipString, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_QUICKSTART);
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
#endif
}
//
// FUNCTION: MyRegisterClass()
//
// PURPOSE: Registers the window class.
//
// COMMENTS:
//
// This function and its usage is only necessary if you want this code
// to be compatible with Win32 systems prior to the 'RegisterClassEx'
// function that was added to Windows 95. It is important to call this function
// so that the application will get 'well formed' small icons associated
// with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_QUICKSTART);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
return RegisterClassEx(&wcex);
}
//
// FUNCTION: InitInstance(HANDLE, int)
//
// PURPOSE: Saves instance handle and creates main window
//
// COMMENTS:
//
// In this function, we save the instance handle in a global variable and
// create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // Store instance handle in our global variable
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
nCmdShow = SW_HIDE; // hide main window, we only need the taskbar icon
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//
// FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
// PURPOSE: Processes messages for the main window.
//
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
{
// make sure soffice runs
if( !launchSoffice() )
return -1;
// create popup menu
popupMenu = CreatePopupMenu();
static int count=0;
// Add my items
MENUITEMINFO mi;
mi.cbSize = sizeof(MENUITEMINFO);
mi.fMask=MIIM_TYPE|MIIM_STATE|MIIM_ID;
mi.fType=MFT_STRING;
mi.fState=MFS_ENABLED|MFS_DEFAULT;
mi.wID = IDM_QUICKSTART;
mi.hSubMenu=NULL;
mi.hbmpChecked=NULL;
mi.hbmpUnchecked=NULL;
mi.dwItemData=NULL;
mi.dwTypeData = "QuickStart";
mi.cch = strlen(mi.dwTypeData);
// InsertMenuItem(popupMenu, count++, TRUE, &mi);
mi.cbSize = sizeof(MENUITEMINFO);
mi.fMask=MIIM_TYPE|MIIM_STATE|MIIM_ID;
mi.fType=MFT_STRING;
mi.fState=MFS_ENABLED;
mi.wID = IDM_ABOUT;
mi.hSubMenu=NULL;
mi.hbmpChecked=NULL;
mi.hbmpUnchecked=NULL;
mi.dwItemData=NULL;
mi.dwTypeData = "Info...";
mi.cch = strlen(mi.dwTypeData);
// InsertMenuItem(popupMenu, count++, TRUE, &mi);
mi.cbSize = sizeof(MENUITEMINFO);
mi.fMask=MIIM_TYPE;
mi.fType=MFT_SEPARATOR;
mi.hSubMenu=NULL;
mi.hbmpChecked=NULL;
mi.hbmpUnchecked=NULL;
mi.dwItemData=NULL;
// InsertMenuItem(popupMenu, count++, TRUE, &mi);
mi.cbSize = sizeof(MENUITEMINFO);
mi.fMask=MIIM_TYPE|MIIM_STATE|MIIM_ID;
mi.fType=MFT_STRING;
mi.fState=MFS_ENABLED;
mi.wID = IDM_EXIT;
mi.hSubMenu=NULL;
mi.hbmpChecked=NULL;
mi.hbmpUnchecked=NULL;
mi.dwItemData=NULL;
mi.dwTypeData = szExitString;
mi.cch = strlen(mi.dwTypeData);
InsertMenuItem(popupMenu, count++, TRUE, &mi);
// add taskbar icon
NOTIFYICONDATA nid;
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hWnd;
nid.uID = IDM_QUICKSTART;
nid.uFlags = NIF_MESSAGE;
nid.uCallbackMessage=MY_TASKBAR_NOTIFICATION;
Shell_NotifyIcon(NIM_ADD, &nid);
// and update state
NotifyListener( hWnd );
// check for soffice
SetTimer(hWnd, UPDATE_TIMER, 3000, NULL);
}
break;
case MY_TASKBAR_NOTIFICATION: // message from taskbar
switch(lParam)
{
/*
case WM_LBUTTONDBLCLK:
bTerminateVeto = bTerminateVeto ? false : true;
NotifyListener( hWnd );
break;
*/
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
{
POINT pt;
GetCursorPos(&pt);
SetForegroundWindow( hWnd );
int m = TrackPopupMenuEx(popupMenu, TPM_RETURNCMD|TPM_LEFTALIGN|TPM_RIGHTBUTTON,
pt.x, pt.y, hWnd, NULL);
// BUGFIX: See Q135788 (PRB: Menus for Notification Icons Don't Work Correctly)
PostMessage(hWnd, NULL, 0, 0);
switch(m)
{
case IDM_QUICKSTART:
bTerminateVeto = bTerminateVeto ? false : true;
NotifyListener( hWnd );
break;
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
}
}
break;
}
break;
case WM_TIMER:
if( wParam == UPDATE_TIMER )
{
// update state
NotifyListener( hWnd );
}
break;
case WM_DESTROY:
// try to terminate office
SendMessage( HWND_BROADCAST, aTerminateMessage, 0, 0L );
// delete taskbar icon
NOTIFYICONDATA nid;
nid.cbSize=sizeof(NOTIFYICONDATA);
nid.hWnd = hWnd;
nid.uID = IDM_QUICKSTART;
Shell_NotifyIcon(NIM_DELETE, &nid);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
//Microsoft Developer Studio generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#define APSTUDIO_HIDDEN_SYMBOLS
#include "windows.h"
#undef APSTUDIO_HIDDEN_SYMBOLS
#include "resource.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// German (Germany) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
#ifdef _WIN32
LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
#pragma code_page(1252)
#endif //_WIN32
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
ICON_ACTIVE ICON DISCARDABLE "icons/main_app.ico"
IDI_QUICKSTART ICON DISCARDABLE "icons/main_app.ico"
IDI_SMALL ICON DISCARDABLE "icons/main_app.ico"
ICON_INACTIVE ICON DISCARDABLE "icons/main_app.ico"
/////////////////////////////////////////////////////////////////////////////
//
// Accelerator
//
IDC_QUICKSTART ACCELERATORS MOVEABLE PURE
BEGIN
"?", IDM_ABOUT, ASCII, ALT
"/", IDM_ABOUT, ASCII, ALT
END
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_ABOUTBOX DIALOG DISCARDABLE 22, 17, 230, 75
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "About"
FONT 8, "System"
BEGIN
ICON IDI_QUICKSTART,IDC_MYICON,14,9,16,16
LTEXT "QuickStart Version 1.0",IDC_STATIC,49,10,119,8,
SS_NOPREFIX
LTEXT "Copyright (C) 2001",IDC_STATIC,49,20,119,8
DEFPUSHBUTTON "OK",IDOK,195,6,30,11,WS_GROUP
END
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
2 TEXTINCLUDE DISCARDABLE
BEGIN
"#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
"#include ""windows.h""\r\n"
"#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
"#include ""resource.h""\r\n"
"\0"
END
3 TEXTINCLUDE DISCARDABLE
BEGIN
"\r\n"
"\0"
END
1 TEXTINCLUDE DISCARDABLE
BEGIN
"resource.h\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// String Table
//
STRINGTABLE DISCARDABLE
BEGIN
IDS_APP_TITLE "SoQuickStart"
IDC_QUICKSTART "QUICKSTART"
IDS_TOOLTIP "StarOffice 6.0 QuickStart"
END
STRINGTABLE DISCARDABLE
BEGIN
IDS_EXIT "Exit"
END
#endif // German (Germany) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by QUICKSTART.RC
//
#define IDR_MAINFRAME 128
#define IDD_QUICKSTART_DIALOG 102
#define IDD_ABOUTBOX 103
#define IDS_APP_TITLE 103
#define IDM_ABOUT 104
#define IDM_EXIT 105
#define IDS_HELLO 106
#define IDI_QUICKSTART 107
#define IDI_SMALL 108
#define IDC_QUICKSTART 109
#define IDM_QUICKSTART 110
#define IDS_TOOLTIP 111
#define IDS_EXIT 112
#define ICON_ACTIVE 1
#define ICON_INACTIVE 2
#define IDC_MYICON 3
#define IDC_STATIC -1
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 129
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1000
#define _APS_NEXT_SYMED_VALUE 113
#endif
#endif
#define ICON_ACTIVE 1
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment