/* *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved. * *Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the *"Software"), to deal in the Software without restriction, including *without limitation the rights to use, copy, modify, merge, publish, *distribute, sublicense, and/or sell copies of the Software, and to *permit persons to whom the Software is furnished to do so, subject to *the following conditions: * *The above copyright notice and this permission notice shall be *included in all copies or substantial portions of the Software. * *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * *Except as contained in this notice, the name of the XFree86 Project *shall not be used in advertising or otherwise to promote the sale, use *or other dealings in this Software without prior written authorization *from the XFree86 Project. * * Authors: Harold L Hunt II */ /* $XFree86$ */ #include "win.h" extern Bool g_fCursor; BOOL CALLBACK winExitDlgProc (HWND hDialog, UINT message, WPARAM wParam, LPARAM lParam); BOOL CALLBACK winChangeDepthDlgProc (HWND hDialog, UINT message, WPARAM wParam, LPARAM lParam); /* * Display the Exit dialog box */ void winDisplayExitDialog (winPrivScreenPtr pScreenPriv) { /* Check if dialog already exists */ if (g_hDlgExit != NULL) { /* Dialog box already exists, display it */ ShowWindow (g_hDlgExit, SW_SHOWDEFAULT); /* User has lost the dialog. Show them where it is. */ SetForegroundWindow (g_hDlgExit); return; } /* Create dialog box */ g_hDlgExit = CreateDialogParam (g_hInstance, "EXIT_DIALOG", pScreenPriv->hwndScreen, winExitDlgProc, (int) pScreenPriv); /* Drop minimize and maximize buttons */ SetWindowLong (g_hDlgExit, GWL_STYLE, GetWindowLong (g_hDlgExit, GWL_STYLE) & ~(WS_MAXIMIZEBOX | WS_MINIMIZEBOX)); SetWindowLong (g_hDlgExit, GWL_EXSTYLE, GetWindowLong (g_hDlgExit, GWL_EXSTYLE) & ~WS_EX_APPWINDOW ); SetWindowPos (g_hDlgExit, 0, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOZORDER | SWP_NOSIZE); /* Show the dialog box */ ShowWindow (g_hDlgExit, SW_SHOW); /* Needed to get keyboard controls (tab, arrows, enter, esc) to work */ SetForegroundWindow (g_hDlgExit); /* Set focus to the Cancel buton */ PostMessage (g_hDlgExit, WM_NEXTDLGCTL, (int) GetDlgItem (g_hDlgExit, IDCANCEL), TRUE); } /* * Exit dialog window procedure */ BOOL CALLBACK winExitDlgProc (HWND hDialog, UINT message, WPARAM wParam, LPARAM lParam) { static winPrivScreenPtr s_pScreenPriv = NULL; static winScreenInfo *s_pScreenInfo = NULL; static ScreenPtr s_pScreen = NULL; /* Branch on message type */ switch (message) { case WM_INITDIALOG: /* Store pointers to private structures for future use */ s_pScreenPriv = (winPrivScreenPtr) lParam; s_pScreenInfo = s_pScreenPriv->pScreenInfo; s_pScreen = s_pScreenInfo->pScreen; /* Set icon to standard app icon */ PostMessage (hDialog, WM_SETICON, ICON_SMALL, (LPARAM) LoadIcon (g_hInstance, MAKEINTRESOURCE(IDI_XWIN))); return TRUE; case WM_COMMAND: switch (LOWORD (wParam)) { case IDOK: /* Send message to call the GiveUp function */ PostMessage (s_pScreenPriv->hwndScreen, WM_GIVEUP, 0, 0); DestroyWindow (g_hDlgExit); g_hDlgExit = NULL; /* Fix to make sure keyboard focus isn't trapped */ PostMessage (s_pScreenPriv->hwndScreen, WM_NULL, 0, 0); return TRUE; case IDCANCEL: DestroyWindow (g_hDlgExit); g_hDlgExit = NULL; /* Fix to make sure keyboard focus isn't trapped */ PostMessage (s_pScreenPriv->hwndScreen, WM_NULL, 0, 0); return TRUE; } break; case WM_MOUSEMOVE: case WM_NCMOUSEMOVE: /* Show the cursor if it is hidden */ if (!g_fCursor) { g_fCursor = TRUE; ShowCursor (TRUE); } return TRUE; case WM_CLOSE: DestroyWindow (g_hDlgExit); g_hDlgExit = NULL; /* Fix to make sure keyboard focus isn't trapped */ PostMessage (s_pScreenPriv->hwndScreen, WM_NULL, 0, 0); return TRUE; } return FALSE; } /* * Display the Depth Change dialog box */ void winDisplayDepthChangeDialog (winPrivScreenPtr pScreenPriv) { /* Check if dialog already exists */ if (g_hDlgDepthChange != NULL) { /* Dialog box already exists, display it */ ShowWindow (g_hDlgDepthChange, SW_SHOWDEFAULT); /* User has lost the dialog. Show them where it is. */ SetForegroundWindow (g_hDlgDepthChange); return; } /* * Display a notification to the user that the visual * will not be displayed until the Windows display depth * is restored to the original value. */ g_hDlgDepthChange = CreateDialogParam (g_hInstance, "DEPTH_CHANGE_BOX", pScreenPriv->hwndScreen, winChangeDepthDlgProc, (int) pScreenPriv); /* Drop minimize and maximize buttons */ SetWindowLong (g_hDlgDepthChange, GWL_STYLE, GetWindowLong (g_hDlgDepthChange, GWL_STYLE) & ~(WS_MAXIMIZEBOX | WS_MINIMIZEBOX)); SetWindowLong (g_hDlgDepthChange, GWL_EXSTYLE, GetWindowLong (g_hDlgDepthChange, GWL_EXSTYLE) & ~WS_EX_APPWINDOW ); SetWindowPos (g_hDlgDepthChange, 0, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOZORDER | SWP_NOSIZE); /* Show the dialog box */ ShowWindow (g_hDlgDepthChange, SW_SHOW); ErrorF ("winDisplayDepthChangeDialog - DialogBox returned: %d\n", g_hDlgDepthChange); ErrorF ("winDisplayDepthChangeDialog - GetLastError: %d\n", GetLastError ()); /* Minimize the display window */ ShowWindow (pScreenPriv->hwndScreen, SW_MINIMIZE); } /* * Process messages for the dialog that is displayed for * disruptive screen depth changes. */ BOOL CALLBACK winChangeDepthDlgProc (HWND hwndDialog, UINT message, WPARAM wParam, LPARAM lParam) { static winPrivScreenPtr s_pScreenPriv = NULL; static winScreenInfo *s_pScreenInfo = NULL; static ScreenPtr s_pScreen = NULL; #if CYGDEBUG ErrorF ("winChangeDepthDlgProc\n"); #endif /* Branch on message type */ switch (message) { case WM_INITDIALOG: #if CYGDEBUG ErrorF ("winChangeDepthDlgProc - WM_INITDIALOG\n"); #endif /* Store pointers to private structures for future use */ s_pScreenPriv = (winPrivScreenPtr) lParam; s_pScreenInfo = s_pScreenPriv->pScreenInfo; s_pScreen = s_pScreenInfo->pScreen; #if CYGDEBUG ErrorF ("winChangeDepthDlgProc - WM_INITDIALG - s_pScreenPriv: %08x, " "s_pScreenInfo: %08x, s_pScreen: %08x\n", s_pScreenPriv, s_pScreenInfo, s_pScreen); #endif #if CYGDEBUG ErrorF ("winChangeDepthDlgProc - WM_INITDIALOG - orig bpp: %d, " "last bpp: %d\n", s_pScreenInfo->dwBPP, s_pScreenPriv->dwLastWindowsBitsPixel); #endif /* Set icon to standard app icon */ PostMessage (hwndDialog, WM_SETICON, ICON_SMALL, (LPARAM) LoadIcon (g_hInstance, MAKEINTRESOURCE(IDI_XWIN))); return TRUE; case WM_DISPLAYCHANGE: #if CYGDEBUG ErrorF ("winChangeDepthDlgProc - WM_DISPLAYCHANGE - orig bpp: %d, " "last bpp: %d, new bpp: %d\n", s_pScreenInfo->dwBPP, s_pScreenPriv->dwLastWindowsBitsPixel, wParam); #endif /* Dismiss the dialog if the display returns to the original depth */ if (wParam == s_pScreenInfo->dwBPP) { ErrorF ("winChangeDelthDlgProc - wParam == s_pScreenInfo->dwBPP\n"); /* Depth has been restored, dismiss dialog */ DestroyWindow (g_hDlgDepthChange); g_hDlgDepthChange = NULL; /* Flag that we have a valid screen depth */ s_pScreenPriv->fBadDepth = FALSE; } return TRUE; case WM_COMMAND: switch (LOWORD (wParam)) { case IDOK: case IDCANCEL: ErrorF ("winChangeDepthDlgProc - WM_COMMAND - IDOK or IDCANCEL\n"); /* * User dismissed the dialog, hide it until the * display mode is restored. */ ShowWindow (g_hDlgDepthChange, SW_HIDE); return TRUE; } break; case WM_CLOSE: ErrorF ("winChangeDepthDlgProc - WM_CLOSE\n"); /* * User dismissed the dialog, hide it until the * display mode is restored. */ ShowWindow (g_hDlgDepthChange, SW_HIDE); return TRUE; } return FALSE; }