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