1706f2543Smrg/* 2706f2543Smrg *Copyright (C) 2003-2004 Harold L Hunt II All Rights Reserved. 3706f2543Smrg * 4706f2543Smrg *Permission is hereby granted, free of charge, to any person obtaining 5706f2543Smrg * a copy of this software and associated documentation files (the 6706f2543Smrg *"Software"), to deal in the Software without restriction, including 7706f2543Smrg *without limitation the rights to use, copy, modify, merge, publish, 8706f2543Smrg *distribute, sublicense, and/or sell copies of the Software, and to 9706f2543Smrg *permit persons to whom the Software is furnished to do so, subject to 10706f2543Smrg *the following conditions: 11706f2543Smrg * 12706f2543Smrg *The above copyright notice and this permission notice shall be 13706f2543Smrg *included in all copies or substantial portions of the Software. 14706f2543Smrg * 15706f2543Smrg *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16706f2543Smrg *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17706f2543Smrg *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18706f2543Smrg *NONINFRINGEMENT. IN NO EVENT SHALL HAROLD L HUNT II BE LIABLE FOR 19706f2543Smrg *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 20706f2543Smrg *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21706f2543Smrg *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22706f2543Smrg * 23706f2543Smrg *Except as contained in this notice, the name of Harold L Hunt II 24706f2543Smrg *shall not be used in advertising or otherwise to promote the sale, use 25706f2543Smrg *or other dealings in this Software without prior written authorization 26706f2543Smrg *from Harold L Hunt II. 27706f2543Smrg * 28706f2543Smrg * Authors: Harold L Hunt II 29706f2543Smrg * Earle F. Philhower III 30706f2543Smrg */ 31706f2543Smrg 32706f2543Smrg#ifdef HAVE_XWIN_CONFIG_H 33706f2543Smrg#include <xwin-config.h> 34706f2543Smrg#endif 35706f2543Smrg#include "win.h" 36706f2543Smrg#ifdef __CYGWIN__ 37706f2543Smrg#include <sys/cygwin.h> 38706f2543Smrg#endif 39706f2543Smrg#include <shellapi.h> 40706f2543Smrg#include "winprefs.h" 41706f2543Smrg 42706f2543Smrg 43706f2543Smrg/* 44706f2543Smrg * References to external globals 45706f2543Smrg */ 46706f2543Smrg 47706f2543Smrg#ifdef XWIN_CLIPBOARD 48706f2543Smrgextern Bool g_fClipboardStarted; 49706f2543Smrg#endif 50706f2543Smrg/* 51706f2543Smrg * Local function prototypes 52706f2543Smrg */ 53706f2543Smrg 54706f2543Smrgstatic wBOOL CALLBACK 55706f2543SmrgwinExitDlgProc (HWND hDialog, UINT message, 56706f2543Smrg WPARAM wParam, LPARAM lParam); 57706f2543Smrg 58706f2543Smrgstatic wBOOL CALLBACK 59706f2543SmrgwinChangeDepthDlgProc (HWND hDialog, UINT message, 60706f2543Smrg WPARAM wParam, LPARAM lParam); 61706f2543Smrg 62706f2543Smrgstatic wBOOL CALLBACK 63706f2543SmrgwinAboutDlgProc (HWND hDialog, UINT message, 64706f2543Smrg WPARAM wParam, LPARAM lParam); 65706f2543Smrg 66706f2543Smrg 67706f2543Smrgstatic void 68706f2543SmrgwinDrawURLWindow (LPARAM lParam); 69706f2543Smrg 70706f2543Smrgstatic LRESULT CALLBACK 71706f2543SmrgwinURLWndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); 72706f2543Smrg 73706f2543Smrgstatic void 74706f2543SmrgwinOverrideURLButton (HWND hdlg, int id); 75706f2543Smrg 76706f2543Smrgstatic void 77706f2543SmrgwinUnoverrideURLButton (HWND hdlg, int id); 78706f2543Smrg 79706f2543Smrg 80706f2543Smrg/* 81706f2543Smrg * Owner-draw a button as a URL 82706f2543Smrg */ 83706f2543Smrg 84706f2543Smrgstatic void 85706f2543SmrgwinDrawURLWindow (LPARAM lParam) 86706f2543Smrg{ 87706f2543Smrg DRAWITEMSTRUCT *draw; 88706f2543Smrg char str[256]; 89706f2543Smrg RECT rect; 90706f2543Smrg HFONT font; 91706f2543Smrg COLORREF crText; 92706f2543Smrg 93706f2543Smrg draw = (DRAWITEMSTRUCT *) lParam; 94706f2543Smrg GetWindowText (draw->hwndItem, str, sizeof(str)); 95706f2543Smrg str[255] = 0; 96706f2543Smrg GetClientRect (draw->hwndItem, &rect); 97706f2543Smrg 98706f2543Smrg /* Color the button depending upon its state */ 99706f2543Smrg if (draw->itemState & ODS_SELECTED) 100706f2543Smrg crText = RGB(128+64,0,0); 101706f2543Smrg else if (draw->itemState & ODS_FOCUS) 102706f2543Smrg crText = RGB(0,128+64,0); 103706f2543Smrg else 104706f2543Smrg crText = RGB(0,0,128+64); 105706f2543Smrg SetTextColor (draw->hDC, crText); 106706f2543Smrg 107706f2543Smrg /* Create font 8 high, standard dialog font */ 108706f2543Smrg font = CreateFont (-8, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, 109706f2543Smrg 0, 0, 0, 0, 0, "MS Sans Serif"); 110706f2543Smrg if (!font) 111706f2543Smrg { 112706f2543Smrg ErrorF ("winDrawURLWindow: Unable to create URL font, bailing.\n"); 113706f2543Smrg return; 114706f2543Smrg } 115706f2543Smrg /* Draw it */ 116706f2543Smrg SetBkMode (draw->hDC, OPAQUE); 117706f2543Smrg SelectObject (draw->hDC, font); 118706f2543Smrg DrawText (draw->hDC, str, strlen (str),&rect,DT_CENTER | DT_VCENTER); 119706f2543Smrg /* Delete the created font, replace it with stock font */ 120706f2543Smrg DeleteObject (SelectObject (draw->hDC, GetStockObject (ANSI_VAR_FONT))); 121706f2543Smrg} 122706f2543Smrg 123706f2543Smrg 124706f2543Smrg/* 125706f2543Smrg * WndProc for overridden buttons 126706f2543Smrg */ 127706f2543Smrg 128706f2543Smrgstatic LRESULT CALLBACK 129706f2543SmrgwinURLWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 130706f2543Smrg{ 131706f2543Smrg WNDPROC origCB = NULL; 132706f2543Smrg HCURSOR cursor; 133706f2543Smrg 134706f2543Smrg /* If it's a SetCursor message, tell it to the hand */ 135706f2543Smrg if (msg==WM_SETCURSOR) { 136706f2543Smrg cursor = LoadCursor (NULL, IDC_HAND); 137706f2543Smrg if (cursor) 138706f2543Smrg SetCursor (cursor); 139706f2543Smrg return TRUE; 140706f2543Smrg } 141706f2543Smrg origCB = (WNDPROC)GetWindowLongPtr(hwnd, GWLP_USERDATA); 142706f2543Smrg /* Otherwise fall through to original WndProc */ 143706f2543Smrg if (origCB) 144706f2543Smrg return CallWindowProc (origCB, hwnd, msg, wParam, lParam); 145706f2543Smrg else 146706f2543Smrg return FALSE; 147706f2543Smrg} 148706f2543Smrg 149706f2543Smrg 150706f2543Smrg/* 151706f2543Smrg * Register and unregister the custom WndProc 152706f2543Smrg */ 153706f2543Smrg 154706f2543Smrgstatic void 155706f2543SmrgwinOverrideURLButton (HWND hwnd, int id) 156706f2543Smrg{ 157706f2543Smrg WNDPROC origCB; 158706f2543Smrg origCB = (WNDPROC)SetWindowLongPtr(GetDlgItem (hwnd, id), 159706f2543Smrg GWLP_WNDPROC, (LONG_PTR)winURLWndProc); 160706f2543Smrg SetWindowLongPtr(GetDlgItem (hwnd, id), GWLP_USERDATA, (LONG_PTR)origCB); 161706f2543Smrg} 162706f2543Smrg 163706f2543Smrgstatic void 164706f2543SmrgwinUnoverrideURLButton (HWND hwnd, int id) 165706f2543Smrg{ 166706f2543Smrg WNDPROC origCB; 167706f2543Smrg origCB = (WNDPROC)SetWindowLongPtr(GetDlgItem (hwnd, id), 168706f2543Smrg GWLP_USERDATA, 0); 169706f2543Smrg if (origCB) 170706f2543Smrg SetWindowLongPtr(GetDlgItem (hwnd, id), GWLP_WNDPROC, (LONG_PTR)origCB); 171706f2543Smrg} 172706f2543Smrg 173706f2543Smrg 174706f2543Smrg/* 175706f2543Smrg * Center a dialog window in the desktop window 176706f2543Smrg * and set small and large icons to X icons. 177706f2543Smrg */ 178706f2543Smrg 179706f2543Smrgstatic void 180706f2543SmrgwinInitDialog (HWND hwndDlg) 181706f2543Smrg{ 182706f2543Smrg HWND hwndDesk; 183706f2543Smrg RECT rc, rcDlg, rcDesk; 184706f2543Smrg HICON hIcon, hIconSmall; 185706f2543Smrg 186706f2543Smrg hwndDesk = GetParent (hwndDlg); 187706f2543Smrg if (!hwndDesk || IsIconic (hwndDesk)) 188706f2543Smrg hwndDesk = GetDesktopWindow (); 189706f2543Smrg 190706f2543Smrg /* Remove minimize and maximize buttons */ 191706f2543Smrg SetWindowLongPtr(hwndDlg, GWL_STYLE, 192706f2543Smrg GetWindowLongPtr(hwndDlg, GWL_STYLE) 193706f2543Smrg & ~(WS_MAXIMIZEBOX | WS_MINIMIZEBOX)); 194706f2543Smrg 195706f2543Smrg /* Set Window not to show in the task bar */ 196706f2543Smrg SetWindowLongPtr(hwndDlg, GWL_EXSTYLE, 197706f2543Smrg GetWindowLongPtr(hwndDlg, GWL_EXSTYLE) & ~WS_EX_APPWINDOW ); 198706f2543Smrg 199706f2543Smrg /* Center dialog window in the screen. Not done for multi-monitor systems, where 200706f2543Smrg * it is likely to end up split across the screens. In that case, it appears 201706f2543Smrg * near the Tray icon. 202706f2543Smrg */ 203706f2543Smrg if (GetSystemMetrics(SM_CMONITORS)>1) { 204706f2543Smrg /* Still need to refresh the frame change. */ 205706f2543Smrg SetWindowPos (hwndDlg, HWND_TOPMOST, 0,0,0,0, 206706f2543Smrg SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED); 207706f2543Smrg } else { 208706f2543Smrg GetWindowRect (hwndDesk, &rcDesk); 209706f2543Smrg GetWindowRect (hwndDlg, &rcDlg); 210706f2543Smrg CopyRect (&rc, &rcDesk); 211706f2543Smrg 212706f2543Smrg OffsetRect (&rcDlg, -rcDlg.left, -rcDlg.top); 213706f2543Smrg OffsetRect (&rc, -rc.left, -rc.top); 214706f2543Smrg OffsetRect (&rc, -rcDlg.right, -rcDlg.bottom); 215706f2543Smrg 216706f2543Smrg SetWindowPos (hwndDlg, 217706f2543Smrg HWND_TOPMOST, 218706f2543Smrg rcDesk.left + (rc.right / 2), 219706f2543Smrg rcDesk.top + (rc.bottom / 2), 220706f2543Smrg 0, 0, 221706f2543Smrg SWP_NOSIZE | SWP_FRAMECHANGED); 222706f2543Smrg } 223706f2543Smrg 224706f2543Smrg#ifdef XWIN_MULTIWINDOW 225706f2543Smrg if (g_hIconX) hIcon=g_hIconX; 226706f2543Smrg else 227706f2543Smrg#endif 228706f2543Smrg hIcon = LoadIcon (g_hInstance, MAKEINTRESOURCE(IDI_XWIN)); 229706f2543Smrg 230706f2543Smrg#ifdef XWIN_MULTIWINDOW 231706f2543Smrg if (g_hSmallIconX) hIconSmall=g_hSmallIconX; 232706f2543Smrg else 233706f2543Smrg#endif 234706f2543Smrg hIconSmall = LoadImage (g_hInstance, 235706f2543Smrg MAKEINTRESOURCE(IDI_XWIN), IMAGE_ICON, 236706f2543Smrg GetSystemMetrics(SM_CXSMICON), 237706f2543Smrg GetSystemMetrics(SM_CYSMICON), 238706f2543Smrg LR_SHARED); 239706f2543Smrg 240706f2543Smrg PostMessage (hwndDlg, WM_SETICON, ICON_BIG, (LPARAM) hIcon); 241706f2543Smrg PostMessage (hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM) hIconSmall); 242706f2543Smrg} 243706f2543Smrg 244706f2543Smrg 245706f2543Smrg/* 246706f2543Smrg * Display the Exit dialog box 247706f2543Smrg */ 248706f2543Smrg 249706f2543Smrgvoid 250706f2543SmrgwinDisplayExitDialog (winPrivScreenPtr pScreenPriv) 251706f2543Smrg{ 252706f2543Smrg int i; 253706f2543Smrg int liveClients = 0; 254706f2543Smrg 255706f2543Smrg /* Count up running clients (clients[0] is serverClient) */ 256706f2543Smrg for (i = 1; i < currentMaxClients; i++) 257706f2543Smrg if (clients[i] != NullClient) 258706f2543Smrg liveClients++; 259706f2543Smrg#if defined(XWIN_MULTIWINDOW) 260706f2543Smrg /* Count down server internal clients */ 261706f2543Smrg if (pScreenPriv->pScreenInfo->fMultiWindow) 262706f2543Smrg liveClients -= 2; /* multiwindow window manager & XMsgProc */ 263706f2543Smrg#endif 264706f2543Smrg#if defined(XWIN_CLIPBOARD) 265706f2543Smrg if (g_fClipboardStarted) 266706f2543Smrg liveClients--; /* clipboard manager */ 267706f2543Smrg#endif 268706f2543Smrg 269706f2543Smrg /* A user reported that this sometimes drops below zero. just eye-candy. */ 270706f2543Smrg if (liveClients < 0) 271706f2543Smrg liveClients = 0; 272706f2543Smrg 273706f2543Smrg /* Don't show the exit confirmation dialog if SilentExit & no clients, 274706f2543Smrg or ForceExit, is enabled */ 275706f2543Smrg if ((pref.fSilentExit && liveClients <= 0) || pref.fForceExit) 276706f2543Smrg { 277706f2543Smrg if (g_hDlgExit != NULL) 278706f2543Smrg { 279706f2543Smrg DestroyWindow (g_hDlgExit); 280706f2543Smrg g_hDlgExit = NULL; 281706f2543Smrg } 282706f2543Smrg PostMessage (pScreenPriv->hwndScreen, WM_GIVEUP, 0, 0); 283706f2543Smrg return; 284706f2543Smrg } 285706f2543Smrg 286706f2543Smrg pScreenPriv->iConnectedClients = liveClients; 287706f2543Smrg 288706f2543Smrg /* Check if dialog already exists */ 289706f2543Smrg if (g_hDlgExit != NULL) 290706f2543Smrg { 291706f2543Smrg /* Dialog box already exists, display it */ 292706f2543Smrg ShowWindow (g_hDlgExit, SW_SHOWDEFAULT); 293706f2543Smrg 294706f2543Smrg /* User has lost the dialog. Show them where it is. */ 295706f2543Smrg SetForegroundWindow (g_hDlgExit); 296706f2543Smrg 297706f2543Smrg return; 298706f2543Smrg } 299706f2543Smrg 300706f2543Smrg /* Create dialog box */ 301706f2543Smrg g_hDlgExit = CreateDialogParam (g_hInstance, 302706f2543Smrg "EXIT_DIALOG", 303706f2543Smrg pScreenPriv->hwndScreen, 304706f2543Smrg winExitDlgProc, 305706f2543Smrg (int) pScreenPriv); 306706f2543Smrg 307706f2543Smrg /* Show the dialog box */ 308706f2543Smrg ShowWindow (g_hDlgExit, SW_SHOW); 309706f2543Smrg 310706f2543Smrg /* Needed to get keyboard controls (tab, arrows, enter, esc) to work */ 311706f2543Smrg SetForegroundWindow (g_hDlgExit); 312706f2543Smrg 313706f2543Smrg /* Set focus to the Cancel button */ 314706f2543Smrg PostMessage (g_hDlgExit, WM_NEXTDLGCTL, 315706f2543Smrg (WPARAM)GetDlgItem (g_hDlgExit, IDCANCEL), TRUE); 316706f2543Smrg} 317706f2543Smrg 318706f2543Smrg#define CONNECTED_CLIENTS_FORMAT "There %s currently %d client%s connected." 319706f2543Smrg 320706f2543Smrg 321706f2543Smrg/* 322706f2543Smrg * Exit dialog window procedure 323706f2543Smrg */ 324706f2543Smrg 325706f2543Smrgstatic wBOOL CALLBACK 326706f2543SmrgwinExitDlgProc (HWND hDialog, UINT message, 327706f2543Smrg WPARAM wParam, LPARAM lParam) 328706f2543Smrg{ 329706f2543Smrg static winPrivScreenPtr s_pScreenPriv = NULL; 330706f2543Smrg 331706f2543Smrg /* Branch on message type */ 332706f2543Smrg switch (message) 333706f2543Smrg { 334706f2543Smrg case WM_INITDIALOG: 335706f2543Smrg { 336706f2543Smrg char *pszConnectedClients; 337706f2543Smrg 338706f2543Smrg /* Store pointers to private structures for future use */ 339706f2543Smrg s_pScreenPriv = (winPrivScreenPtr) lParam; 340706f2543Smrg 341706f2543Smrg winInitDialog (hDialog); 342706f2543Smrg 343706f2543Smrg /* Format the connected clients string */ 344706f2543Smrg if (asprintf (&pszConnectedClients, CONNECTED_CLIENTS_FORMAT, 345706f2543Smrg (s_pScreenPriv->iConnectedClients == 1) ? "is" : "are", 346706f2543Smrg s_pScreenPriv->iConnectedClients, 347706f2543Smrg (s_pScreenPriv->iConnectedClients == 1) ? "" : "s") == -1) 348706f2543Smrg return TRUE; 349706f2543Smrg 350706f2543Smrg 351706f2543Smrg 352706f2543Smrg /* Set the number of connected clients */ 353706f2543Smrg SetWindowText (GetDlgItem (hDialog, IDC_CLIENTS_CONNECTED), 354706f2543Smrg pszConnectedClients); 355706f2543Smrg free(pszConnectedClients); 356706f2543Smrg } 357706f2543Smrg return TRUE; 358706f2543Smrg 359706f2543Smrg case WM_COMMAND: 360706f2543Smrg switch (LOWORD (wParam)) 361706f2543Smrg { 362706f2543Smrg case IDOK: 363706f2543Smrg /* Send message to call the GiveUp function */ 364706f2543Smrg PostMessage (s_pScreenPriv->hwndScreen, WM_GIVEUP, 0, 0); 365706f2543Smrg DestroyWindow (g_hDlgExit); 366706f2543Smrg g_hDlgExit = NULL; 367706f2543Smrg 368706f2543Smrg /* Fix to make sure keyboard focus isn't trapped */ 369706f2543Smrg PostMessage (s_pScreenPriv->hwndScreen, WM_NULL, 0, 0); 370706f2543Smrg return TRUE; 371706f2543Smrg 372706f2543Smrg case IDCANCEL: 373706f2543Smrg DestroyWindow (g_hDlgExit); 374706f2543Smrg g_hDlgExit = NULL; 375706f2543Smrg 376706f2543Smrg /* Fix to make sure keyboard focus isn't trapped */ 377706f2543Smrg PostMessage (s_pScreenPriv->hwndScreen, WM_NULL, 0, 0); 378706f2543Smrg return TRUE; 379706f2543Smrg } 380706f2543Smrg break; 381706f2543Smrg 382706f2543Smrg case WM_MOUSEMOVE: 383706f2543Smrg case WM_NCMOUSEMOVE: 384706f2543Smrg /* Show the cursor if it is hidden */ 385706f2543Smrg if (g_fSoftwareCursor && !g_fCursor) 386706f2543Smrg { 387706f2543Smrg g_fCursor = TRUE; 388706f2543Smrg ShowCursor (TRUE); 389706f2543Smrg } 390706f2543Smrg return TRUE; 391706f2543Smrg 392706f2543Smrg case WM_CLOSE: 393706f2543Smrg DestroyWindow (g_hDlgExit); 394706f2543Smrg g_hDlgExit = NULL; 395706f2543Smrg 396706f2543Smrg /* Fix to make sure keyboard focus isn't trapped */ 397706f2543Smrg PostMessage (s_pScreenPriv->hwndScreen, WM_NULL, 0, 0); 398706f2543Smrg return TRUE; 399706f2543Smrg } 400706f2543Smrg 401706f2543Smrg return FALSE; 402706f2543Smrg} 403706f2543Smrg 404706f2543Smrg 405706f2543Smrg/* 406706f2543Smrg * Display the Depth Change dialog box 407706f2543Smrg */ 408706f2543Smrg 409706f2543Smrgvoid 410706f2543SmrgwinDisplayDepthChangeDialog (winPrivScreenPtr pScreenPriv) 411706f2543Smrg{ 412706f2543Smrg /* Check if dialog already exists */ 413706f2543Smrg if (g_hDlgDepthChange != NULL) 414706f2543Smrg { 415706f2543Smrg /* Dialog box already exists, display it */ 416706f2543Smrg ShowWindow (g_hDlgDepthChange, SW_SHOWDEFAULT); 417706f2543Smrg 418706f2543Smrg /* User has lost the dialog. Show them where it is. */ 419706f2543Smrg SetForegroundWindow (g_hDlgDepthChange); 420706f2543Smrg 421706f2543Smrg return; 422706f2543Smrg } 423706f2543Smrg 424706f2543Smrg /* 425706f2543Smrg * Display a notification to the user that the visual 426706f2543Smrg * will not be displayed until the Windows display depth 427706f2543Smrg * is restored to the original value. 428706f2543Smrg */ 429706f2543Smrg g_hDlgDepthChange = CreateDialogParam (g_hInstance, 430706f2543Smrg "DEPTH_CHANGE_BOX", 431706f2543Smrg pScreenPriv->hwndScreen, 432706f2543Smrg winChangeDepthDlgProc, 433706f2543Smrg (int) pScreenPriv); 434706f2543Smrg /* Show the dialog box */ 435706f2543Smrg ShowWindow (g_hDlgDepthChange, SW_SHOW); 436706f2543Smrg 437706f2543Smrg ErrorF ("winDisplayDepthChangeDialog - DialogBox returned: %d\n", 438706f2543Smrg (int) g_hDlgDepthChange); 439706f2543Smrg ErrorF ("winDisplayDepthChangeDialog - GetLastError: %d\n", 440706f2543Smrg (int) GetLastError ()); 441706f2543Smrg 442706f2543Smrg /* Minimize the display window */ 443706f2543Smrg ShowWindow (pScreenPriv->hwndScreen, SW_MINIMIZE); 444706f2543Smrg} 445706f2543Smrg 446706f2543Smrg 447706f2543Smrg/* 448706f2543Smrg * Process messages for the dialog that is displayed for 449706f2543Smrg * disruptive screen depth changes. 450706f2543Smrg */ 451706f2543Smrg 452706f2543Smrgstatic wBOOL CALLBACK 453706f2543SmrgwinChangeDepthDlgProc (HWND hwndDialog, UINT message, 454706f2543Smrg WPARAM wParam, LPARAM lParam) 455706f2543Smrg{ 456706f2543Smrg static winPrivScreenPtr s_pScreenPriv = NULL; 457706f2543Smrg static winScreenInfo *s_pScreenInfo = NULL; 458706f2543Smrg static ScreenPtr s_pScreen = NULL; 459706f2543Smrg 460706f2543Smrg#if CYGDEBUG 461706f2543Smrg winDebug ("winChangeDepthDlgProc\n"); 462706f2543Smrg#endif 463706f2543Smrg 464706f2543Smrg /* Branch on message type */ 465706f2543Smrg switch (message) 466706f2543Smrg { 467706f2543Smrg case WM_INITDIALOG: 468706f2543Smrg#if CYGDEBUG 469706f2543Smrg winDebug ("winChangeDepthDlgProc - WM_INITDIALOG\n"); 470706f2543Smrg#endif 471706f2543Smrg 472706f2543Smrg /* Store pointers to private structures for future use */ 473706f2543Smrg s_pScreenPriv = (winPrivScreenPtr) lParam; 474706f2543Smrg s_pScreenInfo = s_pScreenPriv->pScreenInfo; 475706f2543Smrg s_pScreen = s_pScreenInfo->pScreen; 476706f2543Smrg 477706f2543Smrg#if CYGDEBUG 478706f2543Smrg winDebug ("winChangeDepthDlgProc - WM_INITDIALOG - s_pScreenPriv: %08x, " 479706f2543Smrg "s_pScreenInfo: %08x, s_pScreen: %08x\n", 480706f2543Smrg s_pScreenPriv, s_pScreenInfo, s_pScreen); 481706f2543Smrg#endif 482706f2543Smrg 483706f2543Smrg#if CYGDEBUG 484706f2543Smrg winDebug ("winChangeDepthDlgProc - WM_INITDIALOG - orig bpp: %d, " 485706f2543Smrg "current bpp: %d\n", 486706f2543Smrg s_pScreenInfo->dwBPP, 487706f2543Smrg GetDeviceCaps(s_pScreenPriv->hdcScreen, BITSPIXEL)); 488706f2543Smrg#endif 489706f2543Smrg 490706f2543Smrg winInitDialog( hwndDialog ); 491706f2543Smrg 492706f2543Smrg return TRUE; 493706f2543Smrg 494706f2543Smrg case WM_DISPLAYCHANGE: 495706f2543Smrg#if CYGDEBUG 496706f2543Smrg winDebug ("winChangeDepthDlgProc - WM_DISPLAYCHANGE - orig bpp: %d, " 497706f2543Smrg "new bpp: %d\n", 498706f2543Smrg s_pScreenInfo->dwBPP, 499706f2543Smrg GetDeviceCaps(s_pScreenPriv->hdcScreen, BITSPIXEL)); 500706f2543Smrg#endif 501706f2543Smrg 502706f2543Smrg /* Dismiss the dialog if the display returns to the original depth */ 503706f2543Smrg if (GetDeviceCaps(s_pScreenPriv->hdcScreen, BITSPIXEL) == s_pScreenInfo->dwBPP) 504706f2543Smrg { 505706f2543Smrg ErrorF ("winChangeDelthDlgProc - wParam == s_pScreenInfo->dwBPP\n"); 506706f2543Smrg 507706f2543Smrg /* Depth has been restored, dismiss dialog */ 508706f2543Smrg DestroyWindow (g_hDlgDepthChange); 509706f2543Smrg g_hDlgDepthChange = NULL; 510706f2543Smrg 511706f2543Smrg /* Flag that we have a valid screen depth */ 512706f2543Smrg s_pScreenPriv->fBadDepth = FALSE; 513706f2543Smrg } 514706f2543Smrg return TRUE; 515706f2543Smrg 516706f2543Smrg case WM_COMMAND: 517706f2543Smrg switch (LOWORD (wParam)) 518706f2543Smrg { 519706f2543Smrg case IDOK: 520706f2543Smrg case IDCANCEL: 521706f2543Smrg ErrorF ("winChangeDepthDlgProc - WM_COMMAND - IDOK or IDCANCEL\n"); 522706f2543Smrg 523706f2543Smrg /* 524706f2543Smrg * User dismissed the dialog, hide it until the 525706f2543Smrg * display mode is restored. 526706f2543Smrg */ 527706f2543Smrg ShowWindow (g_hDlgDepthChange, SW_HIDE); 528706f2543Smrg return TRUE; 529706f2543Smrg } 530706f2543Smrg break; 531706f2543Smrg 532706f2543Smrg case WM_CLOSE: 533706f2543Smrg ErrorF ("winChangeDepthDlgProc - WM_CLOSE\n"); 534706f2543Smrg 535706f2543Smrg DestroyWindow (g_hDlgAbout); 536706f2543Smrg g_hDlgAbout = NULL; 537706f2543Smrg 538706f2543Smrg /* Fix to make sure keyboard focus isn't trapped */ 539706f2543Smrg PostMessage (s_pScreenPriv->hwndScreen, WM_NULL, 0, 0); 540706f2543Smrg return TRUE; 541706f2543Smrg } 542706f2543Smrg 543706f2543Smrg return FALSE; 544706f2543Smrg} 545706f2543Smrg 546706f2543Smrg 547706f2543Smrg/* 548706f2543Smrg * Display the About dialog box 549706f2543Smrg */ 550706f2543Smrg 551706f2543Smrgvoid 552706f2543SmrgwinDisplayAboutDialog (winPrivScreenPtr pScreenPriv) 553706f2543Smrg{ 554706f2543Smrg /* Check if dialog already exists */ 555706f2543Smrg if (g_hDlgAbout != NULL) 556706f2543Smrg { 557706f2543Smrg /* Dialog box already exists, display it */ 558706f2543Smrg ShowWindow (g_hDlgAbout, SW_SHOWDEFAULT); 559706f2543Smrg 560706f2543Smrg /* User has lost the dialog. Show them where it is. */ 561706f2543Smrg SetForegroundWindow (g_hDlgAbout); 562706f2543Smrg 563706f2543Smrg return; 564706f2543Smrg } 565706f2543Smrg 566706f2543Smrg /* 567706f2543Smrg * Display the about box 568706f2543Smrg */ 569706f2543Smrg g_hDlgAbout = CreateDialogParam (g_hInstance, 570706f2543Smrg "ABOUT_BOX", 571706f2543Smrg pScreenPriv->hwndScreen, 572706f2543Smrg winAboutDlgProc, 573706f2543Smrg (int) pScreenPriv); 574706f2543Smrg 575706f2543Smrg /* Show the dialog box */ 576706f2543Smrg ShowWindow (g_hDlgAbout, SW_SHOW); 577706f2543Smrg 578706f2543Smrg /* Needed to get keyboard controls (tab, arrows, enter, esc) to work */ 579706f2543Smrg SetForegroundWindow (g_hDlgAbout); 580706f2543Smrg 581706f2543Smrg /* Set focus to the OK button */ 582706f2543Smrg PostMessage (g_hDlgAbout, WM_NEXTDLGCTL, 583706f2543Smrg (WPARAM)GetDlgItem (g_hDlgAbout, IDOK), TRUE); 584706f2543Smrg} 585706f2543Smrg 586706f2543Smrg 587706f2543Smrg/* 588706f2543Smrg * Process messages for the about dialog. 589706f2543Smrg */ 590706f2543Smrg 591706f2543Smrgstatic wBOOL CALLBACK 592706f2543SmrgwinAboutDlgProc (HWND hwndDialog, UINT message, 593706f2543Smrg WPARAM wParam, LPARAM lParam) 594706f2543Smrg{ 595706f2543Smrg static winPrivScreenPtr s_pScreenPriv = NULL; 596706f2543Smrg static winScreenInfo *s_pScreenInfo = NULL; 597706f2543Smrg static ScreenPtr s_pScreen = NULL; 598706f2543Smrg 599706f2543Smrg#if CYGDEBUG 600706f2543Smrg winDebug ("winAboutDlgProc\n"); 601706f2543Smrg#endif 602706f2543Smrg 603706f2543Smrg /* Branch on message type */ 604706f2543Smrg switch (message) 605706f2543Smrg { 606706f2543Smrg case WM_INITDIALOG: 607706f2543Smrg#if CYGDEBUG 608706f2543Smrg winDebug ("winAboutDlgProc - WM_INITDIALOG\n"); 609706f2543Smrg#endif 610706f2543Smrg 611706f2543Smrg /* Store pointers to private structures for future use */ 612706f2543Smrg s_pScreenPriv = (winPrivScreenPtr) lParam; 613706f2543Smrg s_pScreenInfo = s_pScreenPriv->pScreenInfo; 614706f2543Smrg s_pScreen = s_pScreenInfo->pScreen; 615706f2543Smrg 616706f2543Smrg winInitDialog (hwndDialog); 617706f2543Smrg 618706f2543Smrg /* Override the URL buttons */ 619706f2543Smrg winOverrideURLButton (hwndDialog, ID_ABOUT_CHANGELOG); 620706f2543Smrg winOverrideURLButton (hwndDialog, ID_ABOUT_WEBSITE); 621706f2543Smrg winOverrideURLButton (hwndDialog, ID_ABOUT_UG); 622706f2543Smrg winOverrideURLButton (hwndDialog, ID_ABOUT_FAQ); 623706f2543Smrg 624706f2543Smrg return TRUE; 625706f2543Smrg 626706f2543Smrg case WM_DRAWITEM: 627706f2543Smrg /* Draw the URL buttons as needed */ 628706f2543Smrg winDrawURLWindow (lParam); 629706f2543Smrg return TRUE; 630706f2543Smrg 631706f2543Smrg case WM_MOUSEMOVE: 632706f2543Smrg case WM_NCMOUSEMOVE: 633706f2543Smrg /* Show the cursor if it is hidden */ 634706f2543Smrg if (g_fSoftwareCursor && !g_fCursor) 635706f2543Smrg { 636706f2543Smrg g_fCursor = TRUE; 637706f2543Smrg ShowCursor (TRUE); 638706f2543Smrg } 639706f2543Smrg return TRUE; 640706f2543Smrg 641706f2543Smrg case WM_COMMAND: 642706f2543Smrg switch (LOWORD (wParam)) 643706f2543Smrg { 644706f2543Smrg case IDOK: 645706f2543Smrg case IDCANCEL: 646706f2543Smrg ErrorF ("winAboutDlgProc - WM_COMMAND - IDOK or IDCANCEL\n"); 647706f2543Smrg 648706f2543Smrg DestroyWindow (g_hDlgAbout); 649706f2543Smrg g_hDlgAbout = NULL; 650706f2543Smrg 651706f2543Smrg /* Fix to make sure keyboard focus isn't trapped */ 652706f2543Smrg PostMessage (s_pScreenPriv->hwndScreen, WM_NULL, 0, 0); 653706f2543Smrg 654706f2543Smrg /* Restore window procedures for URL buttons */ 655706f2543Smrg winUnoverrideURLButton (hwndDialog, ID_ABOUT_CHANGELOG); 656706f2543Smrg winUnoverrideURLButton (hwndDialog, ID_ABOUT_WEBSITE); 657706f2543Smrg winUnoverrideURLButton (hwndDialog, ID_ABOUT_UG); 658706f2543Smrg winUnoverrideURLButton (hwndDialog, ID_ABOUT_FAQ); 659706f2543Smrg 660706f2543Smrg return TRUE; 661706f2543Smrg 662706f2543Smrg case ID_ABOUT_CHANGELOG: 663706f2543Smrg { 664706f2543Smrg int iReturn; 665706f2543Smrg#ifdef __CYGWIN__ 666706f2543Smrg const char * pszCygPath = "/usr/X11R6/share/doc/" 667706f2543Smrg "xorg-x11-xwin/changelog.html"; 668706f2543Smrg char pszWinPath[MAX_PATH + 1]; 669706f2543Smrg 670706f2543Smrg /* Convert the POSIX path to a Win32 path */ 671706f2543Smrg cygwin_conv_to_win32_path (pszCygPath, pszWinPath); 672706f2543Smrg#else 673706f2543Smrg const char * pszWinPath = "http://x.cygwin.com/" 674706f2543Smrg "devel/server/changelog.html"; 675706f2543Smrg#endif 676706f2543Smrg 677706f2543Smrg iReturn = (int)ShellExecute (NULL, 678706f2543Smrg "open", 679706f2543Smrg pszWinPath, 680706f2543Smrg NULL, 681706f2543Smrg NULL, 682706f2543Smrg SW_MAXIMIZE); 683706f2543Smrg if (iReturn < 32) 684706f2543Smrg { 685706f2543Smrg ErrorF ("winAboutDlgProc - WM_COMMAND - ID_ABOUT_CHANGELOG - " 686706f2543Smrg "ShellExecute failed: %d\n", 687706f2543Smrg iReturn); 688706f2543Smrg } 689706f2543Smrg } 690706f2543Smrg return TRUE; 691706f2543Smrg 692706f2543Smrg case ID_ABOUT_WEBSITE: 693706f2543Smrg { 694706f2543Smrg const char * pszPath = __VENDORDWEBSUPPORT__; 695706f2543Smrg int iReturn; 696706f2543Smrg 697706f2543Smrg iReturn = (int)ShellExecute (NULL, 698706f2543Smrg "open", 699706f2543Smrg pszPath, 700706f2543Smrg NULL, 701706f2543Smrg NULL, 702706f2543Smrg SW_MAXIMIZE); 703706f2543Smrg if (iReturn < 32) 704706f2543Smrg { 705706f2543Smrg ErrorF ("winAboutDlgProc - WM_COMMAND - ID_ABOUT_WEBSITE - " 706706f2543Smrg "ShellExecute failed: %d\n", 707706f2543Smrg iReturn); 708706f2543Smrg } 709706f2543Smrg } 710706f2543Smrg return TRUE; 711706f2543Smrg 712706f2543Smrg case ID_ABOUT_UG: 713706f2543Smrg { 714706f2543Smrg const char * pszPath = "http://x.cygwin.com/docs/ug/"; 715706f2543Smrg int iReturn; 716706f2543Smrg 717706f2543Smrg iReturn = (int)ShellExecute (NULL, 718706f2543Smrg "open", 719706f2543Smrg pszPath, 720706f2543Smrg NULL, 721706f2543Smrg NULL, 722706f2543Smrg SW_MAXIMIZE); 723706f2543Smrg if (iReturn < 32) 724706f2543Smrg { 725706f2543Smrg ErrorF ("winAboutDlgProc - WM_COMMAND - ID_ABOUT_UG - " 726706f2543Smrg "ShellExecute failed: %d\n", 727706f2543Smrg iReturn); 728706f2543Smrg } 729706f2543Smrg } 730706f2543Smrg return TRUE; 731706f2543Smrg 732706f2543Smrg case ID_ABOUT_FAQ: 733706f2543Smrg { 734706f2543Smrg const char * pszPath = "http://x.cygwin.com/docs/faq/"; 735706f2543Smrg int iReturn; 736706f2543Smrg 737706f2543Smrg iReturn = (int)ShellExecute (NULL, 738706f2543Smrg "open", 739706f2543Smrg pszPath, 740706f2543Smrg NULL, 741706f2543Smrg NULL, 742706f2543Smrg SW_MAXIMIZE); 743706f2543Smrg if (iReturn < 32) 744706f2543Smrg { 745706f2543Smrg ErrorF ("winAboutDlgProc - WM_COMMAND - ID_ABOUT_FAQ - " 746706f2543Smrg "ShellExecute failed: %d\n", 747706f2543Smrg iReturn); 748706f2543Smrg } 749706f2543Smrg } 750706f2543Smrg return TRUE; 751706f2543Smrg } 752706f2543Smrg break; 753706f2543Smrg 754706f2543Smrg case WM_CLOSE: 755706f2543Smrg ErrorF ("winAboutDlgProc - WM_CLOSE\n"); 756706f2543Smrg 757706f2543Smrg DestroyWindow (g_hDlgAbout); 758706f2543Smrg g_hDlgAbout = NULL; 759706f2543Smrg 760706f2543Smrg /* Fix to make sure keyboard focus isn't trapped */ 761706f2543Smrg PostMessage (s_pScreenPriv->hwndScreen, WM_NULL, 0, 0); 762706f2543Smrg 763706f2543Smrg /* Restore window procedures for URL buttons */ 764706f2543Smrg winUnoverrideURLButton (hwndDialog, ID_ABOUT_CHANGELOG); 765706f2543Smrg winUnoverrideURLButton (hwndDialog, ID_ABOUT_WEBSITE); 766706f2543Smrg winUnoverrideURLButton (hwndDialog, ID_ABOUT_UG); 767706f2543Smrg winUnoverrideURLButton (hwndDialog, ID_ABOUT_FAQ); 768706f2543Smrg 769706f2543Smrg return TRUE; 770706f2543Smrg } 771706f2543Smrg 772706f2543Smrg return FALSE; 773706f2543Smrg} 774