mturk 2003/02/13 09:45:30 Added: daemon/src/native/nt/procrun procgui.c Log: The WIN GUI system try and console interface. Revision Changes Path 1.1 jakarta-commons-sandbox/daemon/src/native/nt/procrun/procgui.c Index: procgui.c =================================================================== /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2000-2002 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", * nor may "Apache" appear in their name, without prior written * permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * * Portions of this software are based upon public domain software * originally written at the National Center for Supercomputing Applications, * University of Illinois, Urbana-Champaign. */ /* ==================================================================== * procrun. * * Contributed by Mladen Turk <[EMAIL PROTECTED]> * * 05 Aug 2002 * ==================================================================== */ #if defined(PROCRUN_WINAPP) #ifndef STRICT #define STRICT #endif #ifndef OEMRESOURCE #define OEMRESOURCE #endif #include <windows.h> #include <windowsx.h> #include <commctrl.h> #include <objbase.h> #include <shlobj.h> #include <stdlib.h> #include <stdio.h> #include <Shlwapi.h> #include <io.h> #include <fcntl.h> #include <process.h> #include <time.h> #include <stdarg.h> #include <jni.h> #include "procrun.h" #define WM_TRAYMESSAGE (WM_APP+1) #define MAX_LOADSTRING 200 #define MAX_LISTCOUNT 8192 #define CONWRAP_SUCCESS 0 #define CONWRAP_ENOARGS 1 #define CONWRAP_EARG 2 #define CONWRAP_EFATAL 3 extern int g_proc_mode; /* The main envronment for services */ extern procrun_t *g_env; int ac_use_try = 0; int ac_use_dlg = 0; int ac_use_show = 0; HINSTANCE ac_instance; static HICON ac_main_icon; static UINT ac_taskbar_created; static HWND ac_main_hwnd; static HWND ac_list_hwnd; static char *ac_stdout_lines[MAX_LISTCOUNT + 1]; char *ac_cmdline; void ac_add_list_string(const char *str, int len) { static int nqueue = 0; static int nlen = 0, olen = 0; int i; if (str) { if (nqueue < MAX_LISTCOUNT) { ac_stdout_lines[nqueue++] = strdup(str); } else return; nlen = max(nlen, len); } if (!ac_list_hwnd || !nqueue) return; for (i = 0; i < nqueue; i++) ListBox_AddString(ac_list_hwnd, ac_stdout_lines[i]); if (olen < nlen) { olen = nlen; SendMessage(ac_list_hwnd, LB_SETHORIZONTALEXTENT, (WPARAM) 10 * olen, (LPARAM) 0); } for (i = 0; i < nqueue; i++) { free(ac_stdout_lines[i]); ac_stdout_lines[i] = NULL; } nqueue = 0; } static void ac_show_try_icon(HWND hwnd, DWORD message, const char *tip) { NOTIFYICONDATA nid; if (!ac_use_try) return; ZeroMemory(&nid,sizeof(nid)); nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hwnd; nid.uID = 0xFF; nid.uFlags = NIF_ICON | NIF_MESSAGE; if (tip) nid.uFlags |= NIF_TIP; nid.uCallbackMessage = WM_TRAYMESSAGE; if (message != NIM_DELETE) nid.hIcon = ac_main_icon; else nid.hIcon = NULL; if (tip) strcpy(nid.szTip, tip); Shell_NotifyIcon(message, &nid); } static void ac_append_menu_item(HMENU menu, UINT menu_id, char *name, int isdef, int enabled) { MENUITEMINFO mii; ZeroMemory(&mii, sizeof(MENUITEMINFO)); mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE; if (strlen(name)) { mii.fType = MFT_STRING; mii.wID = menu_id; if (isdef) mii.fState = MFS_DEFAULT; if (!enabled) mii.fState |= MFS_DISABLED; mii.dwTypeData = name; } else mii.fType = MFT_SEPARATOR; InsertMenuItem(menu, menu_id, FALSE, &mii); } static void ac_show_try_menu(HWND hwnd) { HMENU menu; POINT pt; char tmp[MAX_LOADSTRING]; if (!ac_use_try) return; menu = CreatePopupMenu(); if (menu) { if (ac_use_dlg) { ac_append_menu_item(menu, IDM_CONSOLE, "Open Console Monitor", 1, 1); ac_append_menu_item(menu, 0, "", 0, 1); } strcpy(tmp, "Exit Service: "); strcat(tmp, g_env->m->service.name); ac_append_menu_item(menu, IDM_EXIT, tmp, 0, 1); if (!SetForegroundWindow(hwnd)) SetForegroundWindow(NULL); GetCursorPos(&pt); TrackPopupMenu(menu, TPM_LEFTALIGN|TPM_RIGHTBUTTON, pt.x, pt.y, 0, hwnd, NULL); DestroyMenu(menu); } } static void ac_center_window(HWND hwnd) { RECT rc, rw; int cw, ch; int x, y; if (!ac_use_try) return; /* Get the Height and Width of the child window */ GetWindowRect(hwnd, &rc); cw = rc.right - rc.left; ch = rc.bottom - rc.top; /* Get the limits of the 'workarea' */ if (!SystemParametersInfo( SPI_GETWORKAREA, sizeof(RECT), &rw, 0)) { rw.left = rw.top = 0; rw.right = GetSystemMetrics(SM_CXSCREEN); rw.bottom = GetSystemMetrics(SM_CYSCREEN); } /* Calculate new X and Y position*/ x = (rw.right - cw)/2; y = (rw.bottom - ch)/2; SetWindowPos(hwnd, HWND_TOP, x, y, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW); } LRESULT CALLBACK ac_console_dlg_proc(HWND hdlg, UINT message, WPARAM wparam, LPARAM lparam) { RECT r, m; static HWND status_bar; switch (message) { case WM_INITDIALOG: ac_list_hwnd = GetDlgItem(hdlg, IDL_STDOUT); status_bar = CreateStatusWindow(0x0800 /* SBT_TOOLTIPS */ | WS_CHILD | WS_VISIBLE, ac_cmdline, hdlg, IDC_STATBAR); GetWindowRect(status_bar, &r); GetClientRect(hdlg, &m); MoveWindow(ac_list_hwnd, 0, 0, m.right - m.left, m.bottom - abs((r.top - r.bottom)), TRUE); ac_add_list_string(NULL, 0); break; case WM_SIZE: switch (LOWORD(wparam)) { case SIZE_MINIMIZED: EndDialog(hdlg, TRUE); return TRUE; break; default: GetWindowRect(status_bar, &r); MoveWindow(status_bar, 0, HIWORD(lparam) - (r.top - r.bottom), LOWORD(lparam), (r.top - r.bottom), TRUE); GetClientRect(hdlg, &m); MoveWindow(ac_list_hwnd, 0, 0, LOWORD(lparam), HIWORD(lparam) - abs((r.top - r.bottom)), TRUE); break; } break; case WM_QUIT: case WM_CLOSE: EndDialog(hdlg, TRUE); ac_list_hwnd = NULL; return TRUE; default: return FALSE; } return FALSE; } LRESULT CALLBACK ac_main_wnd_proc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { if (message == ac_taskbar_created) { /* restore the tray icon on shell restart */ ac_show_try_icon(hwnd, NIM_ADD, g_env->m->service.description); return DefWindowProc(hwnd, message, wparam, lparam); } switch (message) { case WM_CREATE: ac_show_try_icon(hwnd, NIM_ADD, g_env->m->service.description); if (ac_use_show) DialogBox(ac_instance, MAKEINTRESOURCE(IDD_DLGCONSOLE), hwnd, (DLGPROC)ac_console_dlg_proc); break; case WM_DESTROY: case WM_QUIT: ac_show_try_icon(hwnd, NIM_DELETE, NULL); SetEvent(g_env->m->events[0]); break; case WM_TRAYMESSAGE: switch(lparam) { case WM_LBUTTONUP: case WM_RBUTTONUP: ac_show_try_menu(hwnd); break; } break; case WM_COMMAND: switch (LOWORD(wparam)) { case IDM_EXIT: ac_show_try_icon(hwnd, NIM_DELETE, NULL); SetEvent(g_env->m->events[0]); PostQuitMessage(CONWRAP_SUCCESS); return TRUE; break; case IDM_CONSOLE: DialogBox(ac_instance, MAKEINTRESOURCE(IDD_DLGCONSOLE), hwnd, (DLGPROC)ac_console_dlg_proc); break; } default: return DefWindowProc(hwnd, message, wparam, lparam); } return FALSE; } /* Create main invisible window */ static HWND ac_create_main_window(HINSTANCE instance, const char *wclass, const char *title) { HWND hwnd = NULL; WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = ac_main_wnd_proc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = instance; wcex.hIcon = ac_main_icon = (HICON)LoadImage(instance, MAKEINTRESOURCE(IDI_ICOCONWRAP), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = 0; wcex.lpszClassName = wclass; wcex.hIconSm = (HICON)LoadImage(instance, MAKEINTRESOURCE(IDI_ICOCONWRAP), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); if (RegisterClassEx(&wcex)) hwnd = CreateWindow(wclass, title, 0, 0, 0, 0, 0, NULL, NULL, instance, NULL); return hwnd; } DWORD WINAPI gui_thread(LPVOID param) { DWORD rv = 0; MSG msg; procrun_t *env = (procrun_t *)param; char cname[MAX_LOADSTRING]; if (!param) return -1; strcpy(cname, env->m->service.name); strcat(cname, "_CLASS"); if (env->m->service.description) ac_cmdline = env->m->service.description; else ac_cmdline = env->m->service.name; ac_main_hwnd = ac_create_main_window(ac_instance, cname, env->m->service.name); InitCommonControls(); if (ac_main_hwnd) { if (ac_use_try) ac_taskbar_created = RegisterWindowMessage("TaskbarCreated"); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } } SetEvent(env->m->events[0]); return rv; } #endif /* PROCRUN_WINAPP */
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]