xref: /OK3568_Linux_fs/external/xserver/hw/xwin/windialogs.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  *Copyright (C) 2003-2004 Harold L Hunt II All Rights Reserved.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  *Permission is hereby granted, free of charge, to any person obtaining
5*4882a593Smuzhiyun  * a copy of this software and associated documentation files (the
6*4882a593Smuzhiyun  *"Software"), to deal in the Software without restriction, including
7*4882a593Smuzhiyun  *without limitation the rights to use, copy, modify, merge, publish,
8*4882a593Smuzhiyun  *distribute, sublicense, and/or sell copies of the Software, and to
9*4882a593Smuzhiyun  *permit persons to whom the Software is furnished to do so, subject to
10*4882a593Smuzhiyun  *the following conditions:
11*4882a593Smuzhiyun  *
12*4882a593Smuzhiyun  *The above copyright notice and this permission notice shall be
13*4882a593Smuzhiyun  *included in all copies or substantial portions of the Software.
14*4882a593Smuzhiyun  *
15*4882a593Smuzhiyun  *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16*4882a593Smuzhiyun  *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17*4882a593Smuzhiyun  *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18*4882a593Smuzhiyun  *NONINFRINGEMENT. IN NO EVENT SHALL HAROLD L HUNT II BE LIABLE FOR
19*4882a593Smuzhiyun  *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
20*4882a593Smuzhiyun  *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21*4882a593Smuzhiyun  *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22*4882a593Smuzhiyun  *
23*4882a593Smuzhiyun  *Except as contained in this notice, the name of Harold L Hunt II
24*4882a593Smuzhiyun  *shall not be used in advertising or otherwise to promote the sale, use
25*4882a593Smuzhiyun  *or other dealings in this Software without prior written authorization
26*4882a593Smuzhiyun  *from Harold L Hunt II.
27*4882a593Smuzhiyun  *
28*4882a593Smuzhiyun  * Authors:	Harold L Hunt II
29*4882a593Smuzhiyun  *              Earle F. Philhower III
30*4882a593Smuzhiyun  */
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #ifdef HAVE_XWIN_CONFIG_H
33*4882a593Smuzhiyun #include <xwin-config.h>
34*4882a593Smuzhiyun #endif
35*4882a593Smuzhiyun #include "win.h"
36*4882a593Smuzhiyun #include <shellapi.h>
37*4882a593Smuzhiyun #include "winprefs.h"
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun /*
40*4882a593Smuzhiyun  * Local function prototypes
41*4882a593Smuzhiyun  */
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun static INT_PTR CALLBACK
44*4882a593Smuzhiyun winExitDlgProc(HWND hDialog, UINT message, WPARAM wParam, LPARAM lParam);
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun static INT_PTR CALLBACK
47*4882a593Smuzhiyun winChangeDepthDlgProc(HWND hDialog, UINT message, WPARAM wParam, LPARAM lParam);
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun static INT_PTR CALLBACK
50*4882a593Smuzhiyun winAboutDlgProc(HWND hDialog, UINT message, WPARAM wParam, LPARAM lParam);
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun static void
53*4882a593Smuzhiyun  winDrawURLWindow(LPARAM lParam);
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun static LRESULT CALLBACK
56*4882a593Smuzhiyun winURLWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun static void
59*4882a593Smuzhiyun  winOverrideURLButton(HWND hdlg, int id);
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun static void
62*4882a593Smuzhiyun  winUnoverrideURLButton(HWND hdlg, int id);
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun /*
65*4882a593Smuzhiyun  * Owner-draw a button as a URL
66*4882a593Smuzhiyun  */
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun static void
winDrawURLWindow(LPARAM lParam)69*4882a593Smuzhiyun winDrawURLWindow(LPARAM lParam)
70*4882a593Smuzhiyun {
71*4882a593Smuzhiyun     DRAWITEMSTRUCT *draw;
72*4882a593Smuzhiyun     char str[256];
73*4882a593Smuzhiyun     RECT rect;
74*4882a593Smuzhiyun     HFONT font;
75*4882a593Smuzhiyun     COLORREF crText;
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun     draw = (DRAWITEMSTRUCT *) lParam;
78*4882a593Smuzhiyun     GetWindowText(draw->hwndItem, str, sizeof(str));
79*4882a593Smuzhiyun     str[255] = 0;
80*4882a593Smuzhiyun     GetClientRect(draw->hwndItem, &rect);
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun     /* Color the button depending upon its state */
83*4882a593Smuzhiyun     if (draw->itemState & ODS_SELECTED)
84*4882a593Smuzhiyun         crText = RGB(128 + 64, 0, 0);
85*4882a593Smuzhiyun     else if (draw->itemState & ODS_FOCUS)
86*4882a593Smuzhiyun         crText = RGB(0, 128 + 64, 0);
87*4882a593Smuzhiyun     else
88*4882a593Smuzhiyun         crText = RGB(0, 0, 128 + 64);
89*4882a593Smuzhiyun     SetTextColor(draw->hDC, crText);
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun     /* Create font 8 high, standard dialog font */
92*4882a593Smuzhiyun     font = CreateFont(-8, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE,
93*4882a593Smuzhiyun                       0, 0, 0, 0, 0, "MS Sans Serif");
94*4882a593Smuzhiyun     if (!font) {
95*4882a593Smuzhiyun         ErrorF("winDrawURLWindow: Unable to create URL font, bailing.\n");
96*4882a593Smuzhiyun         return;
97*4882a593Smuzhiyun     }
98*4882a593Smuzhiyun     /* Draw it */
99*4882a593Smuzhiyun     SetBkMode(draw->hDC, OPAQUE);
100*4882a593Smuzhiyun     SelectObject(draw->hDC, font);
101*4882a593Smuzhiyun     DrawText(draw->hDC, str, strlen(str), &rect, DT_LEFT | DT_VCENTER);
102*4882a593Smuzhiyun     /* Delete the created font, replace it with stock font */
103*4882a593Smuzhiyun     DeleteObject(SelectObject(draw->hDC, GetStockObject(ANSI_VAR_FONT)));
104*4882a593Smuzhiyun }
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun /*
107*4882a593Smuzhiyun  * WndProc for overridden buttons
108*4882a593Smuzhiyun  */
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun static LRESULT CALLBACK
winURLWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)111*4882a593Smuzhiyun winURLWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
112*4882a593Smuzhiyun {
113*4882a593Smuzhiyun     WNDPROC origCB = NULL;
114*4882a593Smuzhiyun     HCURSOR cursor;
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun     /* If it's a SetCursor message, tell it to the hand */
117*4882a593Smuzhiyun     if (msg == WM_SETCURSOR) {
118*4882a593Smuzhiyun         cursor = LoadCursor(NULL, IDC_HAND);
119*4882a593Smuzhiyun         if (cursor)
120*4882a593Smuzhiyun             SetCursor(cursor);
121*4882a593Smuzhiyun         return TRUE;
122*4882a593Smuzhiyun     }
123*4882a593Smuzhiyun     origCB = (WNDPROC) GetWindowLongPtr(hwnd, GWLP_USERDATA);
124*4882a593Smuzhiyun     /* Otherwise fall through to original WndProc */
125*4882a593Smuzhiyun     if (origCB)
126*4882a593Smuzhiyun         return CallWindowProc(origCB, hwnd, msg, wParam, lParam);
127*4882a593Smuzhiyun     else
128*4882a593Smuzhiyun         return FALSE;
129*4882a593Smuzhiyun }
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun /*
132*4882a593Smuzhiyun  * Register and unregister the custom WndProc
133*4882a593Smuzhiyun  */
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun static void
winOverrideURLButton(HWND hwnd,int id)136*4882a593Smuzhiyun winOverrideURLButton(HWND hwnd, int id)
137*4882a593Smuzhiyun {
138*4882a593Smuzhiyun     WNDPROC origCB;
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun     origCB = (WNDPROC) SetWindowLongPtr(GetDlgItem(hwnd, id),
141*4882a593Smuzhiyun                                         GWLP_WNDPROC, (LONG_PTR) winURLWndProc);
142*4882a593Smuzhiyun     SetWindowLongPtr(GetDlgItem(hwnd, id), GWLP_USERDATA, (LONG_PTR) origCB);
143*4882a593Smuzhiyun }
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun static void
winUnoverrideURLButton(HWND hwnd,int id)146*4882a593Smuzhiyun winUnoverrideURLButton(HWND hwnd, int id)
147*4882a593Smuzhiyun {
148*4882a593Smuzhiyun     WNDPROC origCB;
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun     origCB = (WNDPROC) SetWindowLongPtr(GetDlgItem(hwnd, id), GWLP_USERDATA, 0);
151*4882a593Smuzhiyun     if (origCB)
152*4882a593Smuzhiyun         SetWindowLongPtr(GetDlgItem(hwnd, id), GWLP_WNDPROC, (LONG_PTR) origCB);
153*4882a593Smuzhiyun }
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun /*
156*4882a593Smuzhiyun  * Center a dialog window in the desktop window
157*4882a593Smuzhiyun  * and set small and large icons to X icons.
158*4882a593Smuzhiyun  */
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun static void
winInitDialog(HWND hwndDlg)161*4882a593Smuzhiyun winInitDialog(HWND hwndDlg)
162*4882a593Smuzhiyun {
163*4882a593Smuzhiyun     HWND hwndDesk;
164*4882a593Smuzhiyun     RECT rc, rcDlg, rcDesk;
165*4882a593Smuzhiyun     HICON hIcon, hIconSmall;
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun     hwndDesk = GetParent(hwndDlg);
168*4882a593Smuzhiyun     if (!hwndDesk || IsIconic(hwndDesk))
169*4882a593Smuzhiyun         hwndDesk = GetDesktopWindow();
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun     /* Remove minimize and maximize buttons */
172*4882a593Smuzhiyun     SetWindowLongPtr(hwndDlg, GWL_STYLE, GetWindowLongPtr(hwndDlg, GWL_STYLE)
173*4882a593Smuzhiyun                      & ~(WS_MAXIMIZEBOX | WS_MINIMIZEBOX));
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun     /* Set Window not to show in the task bar */
176*4882a593Smuzhiyun     SetWindowLongPtr(hwndDlg, GWL_EXSTYLE,
177*4882a593Smuzhiyun                      GetWindowLongPtr(hwndDlg, GWL_EXSTYLE) & ~WS_EX_APPWINDOW);
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun     /* Center dialog window in the screen. Not done for multi-monitor systems, where
180*4882a593Smuzhiyun      * it is likely to end up split across the screens. In that case, it appears
181*4882a593Smuzhiyun      * near the Tray icon.
182*4882a593Smuzhiyun      */
183*4882a593Smuzhiyun     if (GetSystemMetrics(SM_CMONITORS) > 1) {
184*4882a593Smuzhiyun         /* Still need to refresh the frame change. */
185*4882a593Smuzhiyun         SetWindowPos(hwndDlg, HWND_TOPMOST, 0, 0, 0, 0,
186*4882a593Smuzhiyun                      SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED);
187*4882a593Smuzhiyun     }
188*4882a593Smuzhiyun     else {
189*4882a593Smuzhiyun         GetWindowRect(hwndDesk, &rcDesk);
190*4882a593Smuzhiyun         GetWindowRect(hwndDlg, &rcDlg);
191*4882a593Smuzhiyun         CopyRect(&rc, &rcDesk);
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun         OffsetRect(&rcDlg, -rcDlg.left, -rcDlg.top);
194*4882a593Smuzhiyun         OffsetRect(&rc, -rc.left, -rc.top);
195*4882a593Smuzhiyun         OffsetRect(&rc, -rcDlg.right, -rcDlg.bottom);
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun         SetWindowPos(hwndDlg,
198*4882a593Smuzhiyun                      HWND_TOPMOST,
199*4882a593Smuzhiyun                      rcDesk.left + (rc.right / 2),
200*4882a593Smuzhiyun                      rcDesk.top + (rc.bottom / 2),
201*4882a593Smuzhiyun                      0, 0, SWP_NOSIZE | SWP_FRAMECHANGED);
202*4882a593Smuzhiyun     }
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun     if (g_hIconX)
205*4882a593Smuzhiyun         hIcon = g_hIconX;
206*4882a593Smuzhiyun     else
207*4882a593Smuzhiyun         hIcon = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_XWIN));
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun     if (g_hSmallIconX)
210*4882a593Smuzhiyun         hIconSmall = g_hSmallIconX;
211*4882a593Smuzhiyun     else
212*4882a593Smuzhiyun         hIconSmall = LoadImage(g_hInstance,
213*4882a593Smuzhiyun                                MAKEINTRESOURCE(IDI_XWIN), IMAGE_ICON,
214*4882a593Smuzhiyun                                GetSystemMetrics(SM_CXSMICON),
215*4882a593Smuzhiyun                                GetSystemMetrics(SM_CYSMICON), LR_SHARED);
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun     PostMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM) hIcon);
218*4882a593Smuzhiyun     PostMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM) hIconSmall);
219*4882a593Smuzhiyun }
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun /*
222*4882a593Smuzhiyun  * Display the Exit dialog box
223*4882a593Smuzhiyun  */
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun void
winDisplayExitDialog(winPrivScreenPtr pScreenPriv)226*4882a593Smuzhiyun winDisplayExitDialog(winPrivScreenPtr pScreenPriv)
227*4882a593Smuzhiyun {
228*4882a593Smuzhiyun     int i;
229*4882a593Smuzhiyun     int liveClients = 0;
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun     /* Count up running clients (clients[0] is serverClient) */
232*4882a593Smuzhiyun     for (i = 1; i < currentMaxClients; i++)
233*4882a593Smuzhiyun         if (clients[i] != NullClient)
234*4882a593Smuzhiyun             liveClients++;
235*4882a593Smuzhiyun     /* Count down server internal clients */
236*4882a593Smuzhiyun     if (pScreenPriv->pScreenInfo->fMultiWindow)
237*4882a593Smuzhiyun         liveClients -= 2;       /* multiwindow window manager & XMsgProc  */
238*4882a593Smuzhiyun     if (g_fClipboardStarted)
239*4882a593Smuzhiyun         liveClients--;          /* clipboard manager */
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun     /* A user reported that this sometimes drops below zero. just eye-candy. */
242*4882a593Smuzhiyun     if (liveClients < 0)
243*4882a593Smuzhiyun         liveClients = 0;
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun     /* Don't show the exit confirmation dialog if SilentExit & no clients,
246*4882a593Smuzhiyun        or ForceExit, is enabled */
247*4882a593Smuzhiyun     if ((pref.fSilentExit && liveClients <= 0) || pref.fForceExit) {
248*4882a593Smuzhiyun         if (g_hDlgExit != NULL) {
249*4882a593Smuzhiyun             DestroyWindow(g_hDlgExit);
250*4882a593Smuzhiyun             g_hDlgExit = NULL;
251*4882a593Smuzhiyun         }
252*4882a593Smuzhiyun         PostMessage(pScreenPriv->hwndScreen, WM_GIVEUP, 0, 0);
253*4882a593Smuzhiyun         return;
254*4882a593Smuzhiyun     }
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun     pScreenPriv->iConnectedClients = liveClients;
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun     /* Check if dialog already exists */
259*4882a593Smuzhiyun     if (g_hDlgExit != NULL) {
260*4882a593Smuzhiyun         /* Dialog box already exists, display it */
261*4882a593Smuzhiyun         ShowWindow(g_hDlgExit, SW_SHOWDEFAULT);
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun         /* User has lost the dialog.  Show them where it is. */
264*4882a593Smuzhiyun         SetForegroundWindow(g_hDlgExit);
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun         return;
267*4882a593Smuzhiyun     }
268*4882a593Smuzhiyun 
269*4882a593Smuzhiyun     /* Create dialog box */
270*4882a593Smuzhiyun     g_hDlgExit = CreateDialogParam(g_hInstance,
271*4882a593Smuzhiyun                                    "EXIT_DIALOG",
272*4882a593Smuzhiyun                                    pScreenPriv->hwndScreen,
273*4882a593Smuzhiyun                                    winExitDlgProc, (LPARAM) pScreenPriv);
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun     /* Show the dialog box */
276*4882a593Smuzhiyun     ShowWindow(g_hDlgExit, SW_SHOW);
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun     /* Needed to get keyboard controls (tab, arrows, enter, esc) to work */
279*4882a593Smuzhiyun     SetForegroundWindow(g_hDlgExit);
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun     /* Set focus to the Cancel button */
282*4882a593Smuzhiyun     PostMessage(g_hDlgExit, WM_NEXTDLGCTL,
283*4882a593Smuzhiyun                 (WPARAM) GetDlgItem(g_hDlgExit, IDCANCEL), TRUE);
284*4882a593Smuzhiyun }
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun #define CONNECTED_CLIENTS_FORMAT	"There %s currently %d client%s connected."
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun /*
289*4882a593Smuzhiyun  * Exit dialog window procedure
290*4882a593Smuzhiyun  */
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun static INT_PTR CALLBACK
winExitDlgProc(HWND hDialog,UINT message,WPARAM wParam,LPARAM lParam)293*4882a593Smuzhiyun winExitDlgProc(HWND hDialog, UINT message, WPARAM wParam, LPARAM lParam)
294*4882a593Smuzhiyun {
295*4882a593Smuzhiyun     static winPrivScreenPtr s_pScreenPriv = NULL;
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun     /* Branch on message type */
298*4882a593Smuzhiyun     switch (message) {
299*4882a593Smuzhiyun     case WM_INITDIALOG:
300*4882a593Smuzhiyun     {
301*4882a593Smuzhiyun         char *pszConnectedClients;
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun         /* Store pointers to private structures for future use */
304*4882a593Smuzhiyun         s_pScreenPriv = (winPrivScreenPtr) lParam;
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun         winInitDialog(hDialog);
307*4882a593Smuzhiyun 
308*4882a593Smuzhiyun         /* Format the connected clients string */
309*4882a593Smuzhiyun         if (asprintf(&pszConnectedClients, CONNECTED_CLIENTS_FORMAT,
310*4882a593Smuzhiyun                      (s_pScreenPriv->iConnectedClients == 1) ? "is" : "are",
311*4882a593Smuzhiyun                      s_pScreenPriv->iConnectedClients,
312*4882a593Smuzhiyun                      (s_pScreenPriv->iConnectedClients == 1) ? "" : "s") == -1)
313*4882a593Smuzhiyun             return TRUE;
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun         /* Set the number of connected clients */
316*4882a593Smuzhiyun         SetWindowText(GetDlgItem(hDialog, IDC_CLIENTS_CONNECTED),
317*4882a593Smuzhiyun                       pszConnectedClients);
318*4882a593Smuzhiyun         free(pszConnectedClients);
319*4882a593Smuzhiyun     }
320*4882a593Smuzhiyun         return TRUE;
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun     case WM_COMMAND:
323*4882a593Smuzhiyun         switch (LOWORD(wParam)) {
324*4882a593Smuzhiyun         case IDOK:
325*4882a593Smuzhiyun             /* Send message to call the GiveUp function */
326*4882a593Smuzhiyun             PostMessage(s_pScreenPriv->hwndScreen, WM_GIVEUP, 0, 0);
327*4882a593Smuzhiyun             DestroyWindow(g_hDlgExit);
328*4882a593Smuzhiyun             g_hDlgExit = NULL;
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun             /* Fix to make sure keyboard focus isn't trapped */
331*4882a593Smuzhiyun             PostMessage(s_pScreenPriv->hwndScreen, WM_NULL, 0, 0);
332*4882a593Smuzhiyun             return TRUE;
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun         case IDCANCEL:
335*4882a593Smuzhiyun             DestroyWindow(g_hDlgExit);
336*4882a593Smuzhiyun             g_hDlgExit = NULL;
337*4882a593Smuzhiyun 
338*4882a593Smuzhiyun             /* Fix to make sure keyboard focus isn't trapped */
339*4882a593Smuzhiyun             PostMessage(s_pScreenPriv->hwndScreen, WM_NULL, 0, 0);
340*4882a593Smuzhiyun             return TRUE;
341*4882a593Smuzhiyun         }
342*4882a593Smuzhiyun         break;
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun     case WM_MOUSEMOVE:
345*4882a593Smuzhiyun     case WM_NCMOUSEMOVE:
346*4882a593Smuzhiyun         /* Show the cursor if it is hidden */
347*4882a593Smuzhiyun         if (g_fSoftwareCursor && !g_fCursor) {
348*4882a593Smuzhiyun             g_fCursor = TRUE;
349*4882a593Smuzhiyun             ShowCursor(TRUE);
350*4882a593Smuzhiyun         }
351*4882a593Smuzhiyun         return TRUE;
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun     case WM_CLOSE:
354*4882a593Smuzhiyun         DestroyWindow(g_hDlgExit);
355*4882a593Smuzhiyun         g_hDlgExit = NULL;
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun         /* Fix to make sure keyboard focus isn't trapped */
358*4882a593Smuzhiyun         PostMessage(s_pScreenPriv->hwndScreen, WM_NULL, 0, 0);
359*4882a593Smuzhiyun         return TRUE;
360*4882a593Smuzhiyun     }
361*4882a593Smuzhiyun 
362*4882a593Smuzhiyun     return FALSE;
363*4882a593Smuzhiyun }
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun /*
366*4882a593Smuzhiyun  * Display the Depth Change dialog box
367*4882a593Smuzhiyun  */
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun void
winDisplayDepthChangeDialog(winPrivScreenPtr pScreenPriv)370*4882a593Smuzhiyun winDisplayDepthChangeDialog(winPrivScreenPtr pScreenPriv)
371*4882a593Smuzhiyun {
372*4882a593Smuzhiyun     /* Check if dialog already exists */
373*4882a593Smuzhiyun     if (g_hDlgDepthChange != NULL) {
374*4882a593Smuzhiyun         /* Dialog box already exists, display it */
375*4882a593Smuzhiyun         ShowWindow(g_hDlgDepthChange, SW_SHOWDEFAULT);
376*4882a593Smuzhiyun 
377*4882a593Smuzhiyun         /* User has lost the dialog.  Show them where it is. */
378*4882a593Smuzhiyun         SetForegroundWindow(g_hDlgDepthChange);
379*4882a593Smuzhiyun 
380*4882a593Smuzhiyun         return;
381*4882a593Smuzhiyun     }
382*4882a593Smuzhiyun 
383*4882a593Smuzhiyun     /*
384*4882a593Smuzhiyun      * Display a notification to the user that the visual
385*4882a593Smuzhiyun      * will not be displayed until the Windows display depth
386*4882a593Smuzhiyun      * is restored to the original value.
387*4882a593Smuzhiyun      */
388*4882a593Smuzhiyun     g_hDlgDepthChange = CreateDialogParam(g_hInstance,
389*4882a593Smuzhiyun                                           "DEPTH_CHANGE_BOX",
390*4882a593Smuzhiyun                                           pScreenPriv->hwndScreen,
391*4882a593Smuzhiyun                                           winChangeDepthDlgProc,
392*4882a593Smuzhiyun                                           (LPARAM) pScreenPriv);
393*4882a593Smuzhiyun     /* Show the dialog box */
394*4882a593Smuzhiyun     ShowWindow(g_hDlgDepthChange, SW_SHOW);
395*4882a593Smuzhiyun 
396*4882a593Smuzhiyun     if (!g_hDlgDepthChange)
397*4882a593Smuzhiyun         ErrorF("winDisplayDepthChangeDialog - GetLastError: %d\n",
398*4882a593Smuzhiyun                 (int) GetLastError());
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun     /* Minimize the display window */
401*4882a593Smuzhiyun     ShowWindow(pScreenPriv->hwndScreen, SW_MINIMIZE);
402*4882a593Smuzhiyun }
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun /*
405*4882a593Smuzhiyun  * Process messages for the dialog that is displayed for
406*4882a593Smuzhiyun  * disruptive screen depth changes.
407*4882a593Smuzhiyun  */
408*4882a593Smuzhiyun 
409*4882a593Smuzhiyun static INT_PTR CALLBACK
winChangeDepthDlgProc(HWND hwndDialog,UINT message,WPARAM wParam,LPARAM lParam)410*4882a593Smuzhiyun winChangeDepthDlgProc(HWND hwndDialog, UINT message,
411*4882a593Smuzhiyun                       WPARAM wParam, LPARAM lParam)
412*4882a593Smuzhiyun {
413*4882a593Smuzhiyun     static winPrivScreenPtr s_pScreenPriv = NULL;
414*4882a593Smuzhiyun     static winScreenInfo *s_pScreenInfo = NULL;
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun #if CYGDEBUG
417*4882a593Smuzhiyun     winDebug("winChangeDepthDlgProc\n");
418*4882a593Smuzhiyun #endif
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun     /* Branch on message type */
421*4882a593Smuzhiyun     switch (message) {
422*4882a593Smuzhiyun     case WM_INITDIALOG:
423*4882a593Smuzhiyun #if CYGDEBUG
424*4882a593Smuzhiyun         winDebug("winChangeDepthDlgProc - WM_INITDIALOG\n");
425*4882a593Smuzhiyun #endif
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun         /* Store pointers to private structures for future use */
428*4882a593Smuzhiyun         s_pScreenPriv = (winPrivScreenPtr) lParam;
429*4882a593Smuzhiyun         s_pScreenInfo = s_pScreenPriv->pScreenInfo;
430*4882a593Smuzhiyun 
431*4882a593Smuzhiyun #if CYGDEBUG
432*4882a593Smuzhiyun         winDebug("winChangeDepthDlgProc - WM_INITDIALOG - s_pScreenPriv: %p, "
433*4882a593Smuzhiyun                  "s_pScreenInfo: %p\n",
434*4882a593Smuzhiyun                  s_pScreenPriv, s_pScreenInfo);
435*4882a593Smuzhiyun #endif
436*4882a593Smuzhiyun 
437*4882a593Smuzhiyun #if CYGDEBUG
438*4882a593Smuzhiyun         winDebug("winChangeDepthDlgProc - WM_INITDIALOG - orig bpp: %u, "
439*4882a593Smuzhiyun                  "current bpp: %d\n",
440*4882a593Smuzhiyun                  (unsigned int)s_pScreenInfo->dwBPP,
441*4882a593Smuzhiyun                  GetDeviceCaps(s_pScreenPriv->hdcScreen, BITSPIXEL));
442*4882a593Smuzhiyun #endif
443*4882a593Smuzhiyun 
444*4882a593Smuzhiyun         winInitDialog(hwndDialog);
445*4882a593Smuzhiyun 
446*4882a593Smuzhiyun         return TRUE;
447*4882a593Smuzhiyun 
448*4882a593Smuzhiyun     case WM_DISPLAYCHANGE:
449*4882a593Smuzhiyun #if CYGDEBUG
450*4882a593Smuzhiyun         winDebug("winChangeDepthDlgProc - WM_DISPLAYCHANGE - orig bpp: %u, "
451*4882a593Smuzhiyun                  "new bpp: %d\n",
452*4882a593Smuzhiyun                  (unsigned int)s_pScreenInfo->dwBPP,
453*4882a593Smuzhiyun                  GetDeviceCaps(s_pScreenPriv->hdcScreen, BITSPIXEL));
454*4882a593Smuzhiyun #endif
455*4882a593Smuzhiyun 
456*4882a593Smuzhiyun         /* Dismiss the dialog if the display returns to the original depth */
457*4882a593Smuzhiyun         if (GetDeviceCaps(s_pScreenPriv->hdcScreen, BITSPIXEL) ==
458*4882a593Smuzhiyun             s_pScreenInfo->dwBPP) {
459*4882a593Smuzhiyun             ErrorF("winChangeDelthDlgProc - wParam == s_pScreenInfo->dwBPP\n");
460*4882a593Smuzhiyun 
461*4882a593Smuzhiyun             /* Depth has been restored, dismiss dialog */
462*4882a593Smuzhiyun             DestroyWindow(g_hDlgDepthChange);
463*4882a593Smuzhiyun             g_hDlgDepthChange = NULL;
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun             /* Flag that we have a valid screen depth */
466*4882a593Smuzhiyun             s_pScreenPriv->fBadDepth = FALSE;
467*4882a593Smuzhiyun         }
468*4882a593Smuzhiyun         return TRUE;
469*4882a593Smuzhiyun 
470*4882a593Smuzhiyun     case WM_COMMAND:
471*4882a593Smuzhiyun         switch (LOWORD(wParam)) {
472*4882a593Smuzhiyun         case IDOK:
473*4882a593Smuzhiyun         case IDCANCEL:
474*4882a593Smuzhiyun             winDebug("winChangeDepthDlgProc - WM_COMMAND - IDOK or IDCANCEL\n");
475*4882a593Smuzhiyun 
476*4882a593Smuzhiyun             /*
477*4882a593Smuzhiyun              * User dismissed the dialog, hide it until the
478*4882a593Smuzhiyun              * display mode is restored.
479*4882a593Smuzhiyun              */
480*4882a593Smuzhiyun             ShowWindow(g_hDlgDepthChange, SW_HIDE);
481*4882a593Smuzhiyun             return TRUE;
482*4882a593Smuzhiyun         }
483*4882a593Smuzhiyun         break;
484*4882a593Smuzhiyun 
485*4882a593Smuzhiyun     case WM_CLOSE:
486*4882a593Smuzhiyun         winDebug("winChangeDepthDlgProc - WM_CLOSE\n");
487*4882a593Smuzhiyun 
488*4882a593Smuzhiyun         DestroyWindow(g_hDlgAbout);
489*4882a593Smuzhiyun         g_hDlgAbout = NULL;
490*4882a593Smuzhiyun 
491*4882a593Smuzhiyun         /* Fix to make sure keyboard focus isn't trapped */
492*4882a593Smuzhiyun         PostMessage(s_pScreenPriv->hwndScreen, WM_NULL, 0, 0);
493*4882a593Smuzhiyun         return TRUE;
494*4882a593Smuzhiyun     }
495*4882a593Smuzhiyun 
496*4882a593Smuzhiyun     return FALSE;
497*4882a593Smuzhiyun }
498*4882a593Smuzhiyun 
499*4882a593Smuzhiyun /*
500*4882a593Smuzhiyun  * Display the About dialog box
501*4882a593Smuzhiyun  */
502*4882a593Smuzhiyun 
503*4882a593Smuzhiyun void
winDisplayAboutDialog(winPrivScreenPtr pScreenPriv)504*4882a593Smuzhiyun winDisplayAboutDialog(winPrivScreenPtr pScreenPriv)
505*4882a593Smuzhiyun {
506*4882a593Smuzhiyun     /* Check if dialog already exists */
507*4882a593Smuzhiyun     if (g_hDlgAbout != NULL) {
508*4882a593Smuzhiyun         /* Dialog box already exists, display it */
509*4882a593Smuzhiyun         ShowWindow(g_hDlgAbout, SW_SHOWDEFAULT);
510*4882a593Smuzhiyun 
511*4882a593Smuzhiyun         /* User has lost the dialog.  Show them where it is. */
512*4882a593Smuzhiyun         SetForegroundWindow(g_hDlgAbout);
513*4882a593Smuzhiyun 
514*4882a593Smuzhiyun         return;
515*4882a593Smuzhiyun     }
516*4882a593Smuzhiyun 
517*4882a593Smuzhiyun     /*
518*4882a593Smuzhiyun      * Display the about box
519*4882a593Smuzhiyun      */
520*4882a593Smuzhiyun     g_hDlgAbout = CreateDialogParam(g_hInstance,
521*4882a593Smuzhiyun                                     "ABOUT_BOX",
522*4882a593Smuzhiyun                                     pScreenPriv->hwndScreen,
523*4882a593Smuzhiyun                                     winAboutDlgProc, (LPARAM) pScreenPriv);
524*4882a593Smuzhiyun 
525*4882a593Smuzhiyun     /* Show the dialog box */
526*4882a593Smuzhiyun     ShowWindow(g_hDlgAbout, SW_SHOW);
527*4882a593Smuzhiyun 
528*4882a593Smuzhiyun     /* Needed to get keyboard controls (tab, arrows, enter, esc) to work */
529*4882a593Smuzhiyun     SetForegroundWindow(g_hDlgAbout);
530*4882a593Smuzhiyun 
531*4882a593Smuzhiyun     /* Set focus to the OK button */
532*4882a593Smuzhiyun     PostMessage(g_hDlgAbout, WM_NEXTDLGCTL,
533*4882a593Smuzhiyun                 (WPARAM) GetDlgItem(g_hDlgAbout, IDOK), TRUE);
534*4882a593Smuzhiyun }
535*4882a593Smuzhiyun 
536*4882a593Smuzhiyun /*
537*4882a593Smuzhiyun  * Process messages for the about dialog.
538*4882a593Smuzhiyun  */
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun static INT_PTR CALLBACK
winAboutDlgProc(HWND hwndDialog,UINT message,WPARAM wParam,LPARAM lParam)541*4882a593Smuzhiyun winAboutDlgProc(HWND hwndDialog, UINT message, WPARAM wParam, LPARAM lParam)
542*4882a593Smuzhiyun {
543*4882a593Smuzhiyun     static winPrivScreenPtr s_pScreenPriv = NULL;
544*4882a593Smuzhiyun 
545*4882a593Smuzhiyun #if CYGDEBUG
546*4882a593Smuzhiyun     winDebug("winAboutDlgProc\n");
547*4882a593Smuzhiyun #endif
548*4882a593Smuzhiyun 
549*4882a593Smuzhiyun     /* Branch on message type */
550*4882a593Smuzhiyun     switch (message) {
551*4882a593Smuzhiyun     case WM_INITDIALOG:
552*4882a593Smuzhiyun #if CYGDEBUG
553*4882a593Smuzhiyun         winDebug("winAboutDlgProc - WM_INITDIALOG\n");
554*4882a593Smuzhiyun #endif
555*4882a593Smuzhiyun 
556*4882a593Smuzhiyun         /* Store pointer to private structure for future use */
557*4882a593Smuzhiyun         s_pScreenPriv = (winPrivScreenPtr) lParam;
558*4882a593Smuzhiyun 
559*4882a593Smuzhiyun         winInitDialog(hwndDialog);
560*4882a593Smuzhiyun 
561*4882a593Smuzhiyun         /* Override the URL buttons */
562*4882a593Smuzhiyun         winOverrideURLButton(hwndDialog, ID_ABOUT_WEBSITE);
563*4882a593Smuzhiyun 
564*4882a593Smuzhiyun         return TRUE;
565*4882a593Smuzhiyun 
566*4882a593Smuzhiyun     case WM_DRAWITEM:
567*4882a593Smuzhiyun         /* Draw the URL buttons as needed */
568*4882a593Smuzhiyun         winDrawURLWindow(lParam);
569*4882a593Smuzhiyun         return TRUE;
570*4882a593Smuzhiyun 
571*4882a593Smuzhiyun     case WM_MOUSEMOVE:
572*4882a593Smuzhiyun     case WM_NCMOUSEMOVE:
573*4882a593Smuzhiyun         /* Show the cursor if it is hidden */
574*4882a593Smuzhiyun         if (g_fSoftwareCursor && !g_fCursor) {
575*4882a593Smuzhiyun             g_fCursor = TRUE;
576*4882a593Smuzhiyun             ShowCursor(TRUE);
577*4882a593Smuzhiyun         }
578*4882a593Smuzhiyun         return TRUE;
579*4882a593Smuzhiyun 
580*4882a593Smuzhiyun     case WM_COMMAND:
581*4882a593Smuzhiyun         switch (LOWORD(wParam)) {
582*4882a593Smuzhiyun         case IDOK:
583*4882a593Smuzhiyun         case IDCANCEL:
584*4882a593Smuzhiyun             winDebug("winAboutDlgProc - WM_COMMAND - IDOK or IDCANCEL\n");
585*4882a593Smuzhiyun 
586*4882a593Smuzhiyun             DestroyWindow(g_hDlgAbout);
587*4882a593Smuzhiyun             g_hDlgAbout = NULL;
588*4882a593Smuzhiyun 
589*4882a593Smuzhiyun             /* Fix to make sure keyboard focus isn't trapped */
590*4882a593Smuzhiyun             PostMessage(s_pScreenPriv->hwndScreen, WM_NULL, 0, 0);
591*4882a593Smuzhiyun 
592*4882a593Smuzhiyun             /* Restore window procedures for URL buttons */
593*4882a593Smuzhiyun             winUnoverrideURLButton(hwndDialog, ID_ABOUT_WEBSITE);
594*4882a593Smuzhiyun 
595*4882a593Smuzhiyun             return TRUE;
596*4882a593Smuzhiyun 
597*4882a593Smuzhiyun         case ID_ABOUT_WEBSITE:
598*4882a593Smuzhiyun         {
599*4882a593Smuzhiyun             const char *pszPath = __VENDORDWEBSUPPORT__;
600*4882a593Smuzhiyun             INT_PTR iReturn;
601*4882a593Smuzhiyun 
602*4882a593Smuzhiyun             iReturn = (INT_PTR) ShellExecute(NULL,
603*4882a593Smuzhiyun                                          "open",
604*4882a593Smuzhiyun                                          pszPath, NULL, NULL, SW_MAXIMIZE);
605*4882a593Smuzhiyun             if (iReturn < 32) {
606*4882a593Smuzhiyun                 ErrorF("winAboutDlgProc - WM_COMMAND - ID_ABOUT_WEBSITE - "
607*4882a593Smuzhiyun                        "ShellExecute failed: %d\n", (int)iReturn);
608*4882a593Smuzhiyun 
609*4882a593Smuzhiyun             }
610*4882a593Smuzhiyun         }
611*4882a593Smuzhiyun             return TRUE;
612*4882a593Smuzhiyun         }
613*4882a593Smuzhiyun         break;
614*4882a593Smuzhiyun 
615*4882a593Smuzhiyun     case WM_CLOSE:
616*4882a593Smuzhiyun         winDebug("winAboutDlgProc - WM_CLOSE\n");
617*4882a593Smuzhiyun 
618*4882a593Smuzhiyun         DestroyWindow(g_hDlgAbout);
619*4882a593Smuzhiyun         g_hDlgAbout = NULL;
620*4882a593Smuzhiyun 
621*4882a593Smuzhiyun         /* Fix to make sure keyboard focus isn't trapped */
622*4882a593Smuzhiyun         PostMessage(s_pScreenPriv->hwndScreen, WM_NULL, 0, 0);
623*4882a593Smuzhiyun 
624*4882a593Smuzhiyun         /* Restore window procedures for URL buttons */
625*4882a593Smuzhiyun         winUnoverrideURLButton(hwndDialog, ID_ABOUT_WEBSITE);
626*4882a593Smuzhiyun 
627*4882a593Smuzhiyun         return TRUE;
628*4882a593Smuzhiyun     }
629*4882a593Smuzhiyun 
630*4882a593Smuzhiyun     return FALSE;
631*4882a593Smuzhiyun }
632