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