2003-08-30 02:40:46 +02:00
/*
2004-07-30 03:35:13 +02:00
* Graphics configuration code
2003-08-30 02:40:46 +02:00
*
* Copyright 2003 Mark Westcott
2004-09-28 05:16:43 +02:00
* Copyright 2003 - 2004 Mike Hearn
2003-08-30 02:40:46 +02:00
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation ; either
* version 2.1 of the License , or ( at your option ) any later version .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*
*/
2003-09-06 01:08:26 +02:00
# include <stdarg.h>
2003-08-30 02:40:46 +02:00
# include <stdlib.h>
# include <stdio.h>
2003-09-06 01:08:26 +02:00
# include <windef.h>
# include <winbase.h>
# include <winreg.h>
# include <wine/debug.h>
2003-08-30 02:40:46 +02:00
# include "resource.h"
# include "winecfg.h"
WINE_DEFAULT_DEBUG_CHANNEL ( winecfg ) ;
2003-09-08 20:58:07 +02:00
# define RES_MAXLEN 5 /* the maximum number of characters in a screen dimension. 5 digits should be plenty, what kind of crazy person runs their screen >10,000 pixels across? */
2004-09-28 05:55:16 +02:00
int updating_ui ;
2003-09-08 20:58:07 +02:00
2004-09-28 05:55:16 +02:00
void update_gui_for_desktop_mode ( HWND dialog ) {
2003-09-08 20:58:07 +02:00
WINE_TRACE ( " \n " ) ;
2004-09-28 05:55:16 +02:00
updating_ui = TRUE ;
2003-09-08 20:58:07 +02:00
/* do we have desktop mode enabled? */
2004-09-28 05:55:16 +02:00
if ( exists ( keypath ( " x11drv " ) , " Desktop " ) )
{
2005-01-14 20:48:41 +01:00
char * buf , * bufindex ;
2003-09-30 02:27:55 +02:00
CheckDlgButton ( dialog , IDC_ENABLE_DESKTOP , BST_CHECKED ) ;
2004-09-28 05:55:16 +02:00
2003-09-30 02:27:55 +02:00
enable ( IDC_DESKTOP_WIDTH ) ;
enable ( IDC_DESKTOP_HEIGHT ) ;
enable ( IDC_DESKTOP_SIZE ) ;
enable ( IDC_DESKTOP_BY ) ;
2005-01-14 20:48:41 +01:00
buf = get ( keypath ( " x11drv " ) , " Desktop " , " 640x480 " ) ;
bufindex = strchr ( buf , ' x ' ) ;
if ( bufindex ) {
* bufindex = 0 ;
+ + bufindex ;
SetWindowText ( GetDlgItem ( dialog , IDC_DESKTOP_WIDTH ) , buf ) ;
SetWindowText ( GetDlgItem ( dialog , IDC_DESKTOP_HEIGHT ) , bufindex ) ;
} else {
WINE_TRACE ( " Desktop registry entry is malformed " ) ;
SetWindowText ( GetDlgItem ( dialog , IDC_DESKTOP_WIDTH ) , " 640 " ) ;
SetWindowText ( GetDlgItem ( dialog , IDC_DESKTOP_HEIGHT ) , " 480 " ) ;
}
HeapFree ( GetProcessHeap ( ) , 0 , buf ) ;
2003-09-08 20:58:07 +02:00
}
2004-09-28 05:55:16 +02:00
else
{
2003-09-30 02:27:55 +02:00
CheckDlgButton ( dialog , IDC_ENABLE_DESKTOP , BST_UNCHECKED ) ;
2004-09-28 05:55:16 +02:00
2003-09-30 02:27:55 +02:00
disable ( IDC_DESKTOP_WIDTH ) ;
disable ( IDC_DESKTOP_HEIGHT ) ;
disable ( IDC_DESKTOP_SIZE ) ;
disable ( IDC_DESKTOP_BY ) ;
2003-09-08 20:58:07 +02:00
2003-09-30 02:27:55 +02:00
SetWindowText ( GetDlgItem ( dialog , IDC_DESKTOP_WIDTH ) , " " ) ;
SetWindowText ( GetDlgItem ( dialog , IDC_DESKTOP_HEIGHT ) , " " ) ;
2003-09-08 20:58:07 +02:00
}
2004-09-28 05:55:16 +02:00
updating_ui = FALSE ;
2003-09-08 20:58:07 +02:00
}
2004-09-28 06:05:55 +02:00
static void init_dialog ( HWND dialog )
2003-08-30 02:40:46 +02:00
{
2005-01-14 20:48:41 +01:00
char * buf ;
2003-09-08 20:58:07 +02:00
2004-09-28 06:05:55 +02:00
update_gui_for_desktop_mode ( dialog ) ;
2003-10-22 02:01:46 +02:00
2004-09-28 05:55:16 +02:00
updating_ui = TRUE ;
2003-09-08 20:58:07 +02:00
2004-09-28 06:05:55 +02:00
SendDlgItemMessage ( dialog , IDC_SCREEN_DEPTH , CB_RESETCONTENT , 0 , 0 ) ;
SendDlgItemMessage ( dialog , IDC_SCREEN_DEPTH , CB_ADDSTRING , 0 , ( LPARAM ) " 8 bit " ) ;
SendDlgItemMessage ( dialog , IDC_SCREEN_DEPTH , CB_ADDSTRING , 0 , ( LPARAM ) " 16 bit " ) ;
SendDlgItemMessage ( dialog , IDC_SCREEN_DEPTH , CB_ADDSTRING , 0 , ( LPARAM ) " 24 bit " ) ;
SendDlgItemMessage ( dialog , IDC_SCREEN_DEPTH , CB_ADDSTRING , 0 , ( LPARAM ) " 32 bit " ) ; /* is this valid? */
2003-09-22 21:26:10 +02:00
2004-09-28 05:55:16 +02:00
buf = get ( keypath ( " x11drv " ) , " ScreenDepth " , " 24 " ) ;
2003-09-22 21:26:10 +02:00
if ( strcmp ( buf , " 8 " ) = = 0 )
2004-09-28 06:05:55 +02:00
SendDlgItemMessage ( dialog , IDC_SCREEN_DEPTH , CB_SETCURSEL , 0 , 0 ) ;
2003-09-22 21:26:10 +02:00
else if ( strcmp ( buf , " 16 " ) = = 0 )
2004-09-28 06:05:55 +02:00
SendDlgItemMessage ( dialog , IDC_SCREEN_DEPTH , CB_SETCURSEL , 1 , 0 ) ;
2003-09-22 21:26:10 +02:00
else if ( strcmp ( buf , " 24 " ) = = 0 )
2004-09-28 06:05:55 +02:00
SendDlgItemMessage ( dialog , IDC_SCREEN_DEPTH , CB_SETCURSEL , 2 , 0 ) ;
2003-09-22 21:26:10 +02:00
else if ( strcmp ( buf , " 32 " ) = = 0 )
2004-09-28 06:05:55 +02:00
SendDlgItemMessage ( dialog , IDC_SCREEN_DEPTH , CB_SETCURSEL , 3 , 0 ) ;
2003-09-22 21:26:10 +02:00
else
WINE_ERR ( " Invalid screen depth read from registry (%s) \n " , buf ) ;
2004-09-28 05:55:16 +02:00
HeapFree ( GetProcessHeap ( ) , 0 , buf ) ;
2003-09-08 20:58:07 +02:00
2004-09-28 06:05:55 +02:00
SendDlgItemMessage ( dialog , IDC_DESKTOP_WIDTH , EM_LIMITTEXT , RES_MAXLEN , 0 ) ;
SendDlgItemMessage ( dialog , IDC_DESKTOP_HEIGHT , EM_LIMITTEXT , RES_MAXLEN , 0 ) ;
2003-09-18 06:32:01 +02:00
2004-09-28 05:55:16 +02:00
buf = get ( keypath ( " x11drv " ) , " DXGrab " , " Y " ) ;
2003-09-18 06:32:01 +02:00
if ( IS_OPTION_TRUE ( * buf ) )
2004-09-28 06:05:55 +02:00
CheckDlgButton ( dialog , IDC_DX_MOUSE_GRAB , BST_CHECKED ) ;
2003-09-18 06:32:01 +02:00
else
2004-09-28 06:05:55 +02:00
CheckDlgButton ( dialog , IDC_DX_MOUSE_GRAB , BST_UNCHECKED ) ;
2004-09-28 05:55:16 +02:00
HeapFree ( GetProcessHeap ( ) , 0 , buf ) ;
2003-09-22 23:13:51 +02:00
2004-09-28 05:55:16 +02:00
buf = get ( keypath ( " x11drv " ) , " DesktopDoubleBuffered " , " Y " ) ;
2003-09-22 23:13:51 +02:00
if ( IS_OPTION_TRUE ( * buf ) )
2004-09-28 06:05:55 +02:00
CheckDlgButton ( dialog , IDC_DOUBLE_BUFFER , BST_CHECKED ) ;
2003-09-22 23:13:51 +02:00
else
2004-09-28 06:05:55 +02:00
CheckDlgButton ( dialog , IDC_DOUBLE_BUFFER , BST_UNCHECKED ) ;
2004-09-28 05:55:16 +02:00
HeapFree ( GetProcessHeap ( ) , 0 , buf ) ;
2003-09-22 23:13:51 +02:00
2004-09-28 05:55:16 +02:00
updating_ui = FALSE ;
2003-09-08 20:58:07 +02:00
}
2003-08-30 02:40:46 +02:00
2004-09-28 06:05:55 +02:00
static void set_from_desktop_edits ( HWND dialog ) {
char * width , * height , * new ;
2003-08-30 02:40:46 +02:00
2004-09-28 06:05:55 +02:00
if ( updating_ui ) return ;
2003-09-08 20:58:07 +02:00
WINE_TRACE ( " \n " ) ;
2003-08-30 02:40:46 +02:00
2004-11-23 14:50:23 +01:00
width = get_text ( dialog , IDC_DESKTOP_WIDTH ) ;
height = get_text ( dialog , IDC_DESKTOP_HEIGHT ) ;
2004-09-28 06:05:55 +02:00
2005-01-14 20:48:41 +01:00
if ( width = = NULL | | strcmp ( width , " " ) = = 0 ) {
2004-09-28 06:05:55 +02:00
HeapFree ( GetProcessHeap ( ) , 0 , width ) ;
width = strdupA ( " 640 " ) ;
}
2003-09-08 20:58:07 +02:00
2005-01-14 20:48:41 +01:00
if ( height = = NULL | | strcmp ( height , " " ) = = 0 ) {
2004-09-28 06:05:55 +02:00
HeapFree ( GetProcessHeap ( ) , 0 , height ) ;
height = strdupA ( " 480 " ) ;
}
new = HeapAlloc ( GetProcessHeap ( ) , 0 , strlen ( width ) + strlen ( height ) + 2 /* x + terminator */ ) ;
2004-09-28 05:55:16 +02:00
sprintf ( new , " %sx%s " , width , height ) ;
set ( keypath ( " x11drv " ) , " Desktop " , new ) ;
HeapFree ( GetProcessHeap ( ) , 0 , width ) ;
HeapFree ( GetProcessHeap ( ) , 0 , height ) ;
HeapFree ( GetProcessHeap ( ) , 0 , new ) ;
2003-08-30 02:40:46 +02:00
}
2004-09-28 06:05:55 +02:00
void on_enable_desktop_clicked ( HWND dialog ) {
2003-09-08 20:58:07 +02:00
WINE_TRACE ( " \n " ) ;
2004-09-28 06:05:55 +02:00
if ( IsDlgButtonChecked ( dialog , IDC_ENABLE_DESKTOP ) = = BST_CHECKED ) {
2005-01-14 20:48:41 +01:00
set_from_desktop_edits ( dialog ) ;
2003-09-08 20:58:07 +02:00
} else {
2004-09-28 05:55:16 +02:00
set ( keypath ( " x11drv " ) , " Desktop " , NULL ) ;
2003-09-08 20:58:07 +02:00
}
2004-09-28 06:05:55 +02:00
update_gui_for_desktop_mode ( dialog ) ;
2003-09-08 20:58:07 +02:00
}
2003-09-18 06:32:01 +02:00
2004-09-28 06:05:55 +02:00
static void on_screen_depth_changed ( HWND dialog ) {
2004-11-23 14:50:23 +01:00
char * newvalue = get_text ( dialog , IDC_SCREEN_DEPTH ) ;
2003-09-22 21:26:10 +02:00
char * spaceIndex = strchr ( newvalue , ' ' ) ;
2003-09-08 20:58:07 +02:00
2003-09-22 21:26:10 +02:00
WINE_TRACE ( " newvalue=%s \n " , newvalue ) ;
2004-09-28 05:55:16 +02:00
if ( updating_ui ) return ;
2003-09-18 06:32:01 +02:00
2003-09-22 21:26:10 +02:00
* spaceIndex = ' \0 ' ;
2004-09-28 05:55:16 +02:00
set ( keypath ( " x11drv " ) , " ScreenDepth " , newvalue ) ;
2004-09-28 06:05:55 +02:00
HeapFree ( GetProcessHeap ( ) , 0 , newvalue ) ;
2003-09-18 06:32:01 +02:00
}
2004-09-28 06:05:55 +02:00
static void on_dx_mouse_grab_clicked ( HWND dialog ) {
2005-01-14 20:48:41 +01:00
if ( IsDlgButtonChecked ( dialog , IDC_DX_MOUSE_GRAB ) = = BST_CHECKED )
2004-09-28 05:55:16 +02:00
set ( keypath ( " x11drv " ) , " DXGrab " , " Y " ) ;
2003-09-18 06:32:01 +02:00
else
2004-09-28 05:55:16 +02:00
set ( keypath ( " x11drv " ) , " DXGrab " , " N " ) ;
2003-09-18 06:32:01 +02:00
}
2003-09-22 23:13:51 +02:00
2004-09-28 06:05:55 +02:00
static void on_double_buffer_clicked ( HWND dialog ) {
if ( IsDlgButtonChecked ( dialog , IDC_DOUBLE_BUFFER ) = = BST_CHECKED )
2004-09-28 05:55:16 +02:00
set ( keypath ( " x11drv " ) , " DesktopDoubleBuffered " , " Y " ) ;
2003-09-22 23:13:51 +02:00
else
2004-09-28 05:55:16 +02:00
set ( keypath ( " x11drv " ) , " DesktopDoubleBuffered " , " N " ) ;
2003-09-22 23:13:51 +02:00
}
2003-08-30 02:40:46 +02:00
INT_PTR CALLBACK
2004-07-30 03:35:13 +02:00
GraphDlgProc ( HWND hDlg , UINT uMsg , WPARAM wParam , LPARAM lParam )
2003-08-30 02:40:46 +02:00
{
switch ( uMsg ) {
case WM_INITDIALOG :
break ;
2004-09-28 05:55:16 +02:00
case WM_SHOWWINDOW :
set_window_title ( hDlg ) ;
break ;
2003-08-30 02:40:46 +02:00
case WM_COMMAND :
switch ( HIWORD ( wParam ) ) {
case EN_CHANGE : {
2005-01-14 20:48:41 +01:00
if ( updating_ui ) break ;
2003-08-30 02:40:46 +02:00
SendMessage ( GetParent ( hDlg ) , PSM_CHANGED , 0 , 0 ) ;
2004-09-28 05:55:16 +02:00
if ( ( ( LOWORD ( wParam ) = = IDC_DESKTOP_WIDTH ) | | ( LOWORD ( wParam ) = = IDC_DESKTOP_HEIGHT ) ) & & ! updating_ui )
2004-09-28 06:05:55 +02:00
set_from_desktop_edits ( hDlg ) ;
2003-08-30 02:40:46 +02:00
break ;
}
2003-09-08 20:58:07 +02:00
case BN_CLICKED : {
2004-09-28 05:55:16 +02:00
if ( updating_ui ) break ;
2005-01-14 20:48:41 +01:00
SendMessage ( GetParent ( hDlg ) , PSM_CHANGED , 0 , 0 ) ;
2003-09-08 20:58:07 +02:00
switch ( LOWORD ( wParam ) ) {
2004-09-28 06:05:55 +02:00
case IDC_ENABLE_DESKTOP : on_enable_desktop_clicked ( hDlg ) ; break ;
case IDC_DX_MOUSE_GRAB : on_dx_mouse_grab_clicked ( hDlg ) ; break ;
case IDC_DOUBLE_BUFFER : on_double_buffer_clicked ( hDlg ) ; break ;
}
2003-09-08 20:58:07 +02:00
break ;
}
2003-09-22 21:26:10 +02:00
case CBN_SELCHANGE : {
2005-01-14 20:48:41 +01:00
SendMessage ( GetParent ( hDlg ) , PSM_CHANGED , 0 , 0 ) ;
2004-09-28 06:05:55 +02:00
if ( LOWORD ( wParam ) = = IDC_SCREEN_DEPTH ) on_screen_depth_changed ( hDlg ) ;
2003-09-22 21:26:10 +02:00
break ;
}
2003-09-08 20:58:07 +02:00
2003-08-30 02:40:46 +02:00
default :
break ;
}
break ;
2003-09-08 20:58:07 +02:00
2003-08-30 02:40:46 +02:00
case WM_NOTIFY :
switch ( ( ( LPNMHDR ) lParam ) - > code ) {
case PSN_KILLACTIVE : {
SetWindowLong ( hDlg , DWL_MSGRESULT , FALSE ) ;
break ;
}
case PSN_APPLY : {
2004-09-28 05:55:16 +02:00
apply ( ) ;
2003-08-30 02:40:46 +02:00
SetWindowLong ( hDlg , DWL_MSGRESULT , PSNRET_NOERROR ) ;
break ;
}
case PSN_SETACTIVE : {
2004-09-28 06:05:55 +02:00
init_dialog ( hDlg ) ;
2003-08-30 02:40:46 +02:00
break ;
}
}
break ;
default :
break ;
}
return FALSE ;
}