2 * Graphics configuration code
4 * Copyright 2003 Mark Westcott
5 * Copyright 2003-2004 Mike Hearn
6 * Copyright 2005 Raphael Junqueira
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
31 #include <wine/debug.h>
36 WINE_DEFAULT_DEBUG_CHANNEL(winecfg);
38 #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? */
41 static const char* D3D_VS_Modes[] = {
51 static void update_gui_for_desktop_mode(HWND dialog) {
56 /* do we have desktop mode enabled? */
57 if (reg_key_exists(config_key, keypath("X11 Driver"), "Desktop"))
60 CheckDlgButton(dialog, IDC_ENABLE_DESKTOP, BST_CHECKED);
62 enable(IDC_DESKTOP_WIDTH);
63 enable(IDC_DESKTOP_HEIGHT);
64 enable(IDC_DESKTOP_SIZE);
65 enable(IDC_DESKTOP_BY);
67 buf = get_reg_key(config_key, keypath("X11 Driver"), "Desktop", "640x480");
68 bufindex = strchr(buf, 'x');
72 SetWindowText(GetDlgItem(dialog, IDC_DESKTOP_WIDTH), buf);
73 SetWindowText(GetDlgItem(dialog, IDC_DESKTOP_HEIGHT), bufindex);
75 WINE_TRACE("Desktop registry entry is malformed");
76 SetWindowText(GetDlgItem(dialog, IDC_DESKTOP_WIDTH), "640");
77 SetWindowText(GetDlgItem(dialog, IDC_DESKTOP_HEIGHT), "480");
80 HeapFree(GetProcessHeap(), 0, buf);
84 CheckDlgButton(dialog, IDC_ENABLE_DESKTOP, BST_UNCHECKED);
86 disable(IDC_DESKTOP_WIDTH);
87 disable(IDC_DESKTOP_HEIGHT);
88 disable(IDC_DESKTOP_SIZE);
89 disable(IDC_DESKTOP_BY);
91 SetWindowText(GetDlgItem(dialog, IDC_DESKTOP_WIDTH), "");
92 SetWindowText(GetDlgItem(dialog, IDC_DESKTOP_HEIGHT), "");
98 static void init_dialog (HWND dialog)
103 update_gui_for_desktop_mode(dialog);
107 SendDlgItemMessage(dialog, IDC_SCREEN_DEPTH, CB_RESETCONTENT, 0, 0);
108 SendDlgItemMessage(dialog, IDC_SCREEN_DEPTH, CB_ADDSTRING, 0, (LPARAM) "8 bit");
109 SendDlgItemMessage(dialog, IDC_SCREEN_DEPTH, CB_ADDSTRING, 0, (LPARAM) "16 bit");
110 SendDlgItemMessage(dialog, IDC_SCREEN_DEPTH, CB_ADDSTRING, 0, (LPARAM) "24 bit");
111 SendDlgItemMessage(dialog, IDC_SCREEN_DEPTH, CB_ADDSTRING, 0, (LPARAM) "32 bit"); /* is this valid? */
113 buf = get_reg_key(config_key, keypath("X11 Driver"), "ScreenDepth", "24");
114 if (strcmp(buf, "8") == 0)
115 SendDlgItemMessage(dialog, IDC_SCREEN_DEPTH, CB_SETCURSEL, 0, 0);
116 else if (strcmp(buf, "16") == 0)
117 SendDlgItemMessage(dialog, IDC_SCREEN_DEPTH, CB_SETCURSEL, 1, 0);
118 else if (strcmp(buf, "24") == 0)
119 SendDlgItemMessage(dialog, IDC_SCREEN_DEPTH, CB_SETCURSEL, 2, 0);
120 else if (strcmp(buf, "32") == 0)
121 SendDlgItemMessage(dialog, IDC_SCREEN_DEPTH, CB_SETCURSEL, 3, 0);
123 WINE_ERR("Invalid screen depth read from registry (%s)\n", buf);
124 HeapFree(GetProcessHeap(), 0, buf);
126 SendDlgItemMessage(dialog, IDC_DESKTOP_WIDTH, EM_LIMITTEXT, RES_MAXLEN, 0);
127 SendDlgItemMessage(dialog, IDC_DESKTOP_HEIGHT, EM_LIMITTEXT, RES_MAXLEN, 0);
129 buf = get_reg_key(config_key, keypath("X11 Driver"), "DXGrab", "Y");
130 if (IS_OPTION_TRUE(*buf))
131 CheckDlgButton(dialog, IDC_DX_MOUSE_GRAB, BST_CHECKED);
133 CheckDlgButton(dialog, IDC_DX_MOUSE_GRAB, BST_UNCHECKED);
134 HeapFree(GetProcessHeap(), 0, buf);
136 buf = get_reg_key(config_key, keypath("X11 Driver"), "DesktopDoubleBuffered", "Y");
137 if (IS_OPTION_TRUE(*buf))
138 CheckDlgButton(dialog, IDC_DOUBLE_BUFFER, BST_CHECKED);
140 CheckDlgButton(dialog, IDC_DOUBLE_BUFFER, BST_UNCHECKED);
141 HeapFree(GetProcessHeap(), 0, buf);
143 SendDlgItemMessage(dialog, IDC_D3D_VSHADER_MODE, CB_RESETCONTENT, 0, 0);
144 for (it = 0; NULL != D3D_VS_Modes[it]; ++it) {
145 SendDlgItemMessage(dialog, IDC_D3D_VSHADER_MODE, CB_ADDSTRING, 0, (LPARAM) D3D_VS_Modes[it]);
147 buf = get_reg_key(config_key, keypath("Direct3D"), "VertexShaderMode", "hardware");
148 for (it = 0; NULL != D3D_VS_Modes[it]; ++it) {
149 if (strcmp(buf, D3D_VS_Modes[it]) == 0) {
150 SendDlgItemMessage(dialog, IDC_D3D_VSHADER_MODE, CB_SETCURSEL, it, 0);
154 if (NULL == D3D_VS_Modes[it]) {
155 WINE_ERR("Invalid Direct3D VertexShader Mode read from registry (%s)\n", buf);
157 HeapFree(GetProcessHeap(), 0, buf);
159 buf = get_reg_key(config_key, keypath("Direct3D"), "PixelShaderMode", "enabled");
160 if (!strcmp(buf, "enabled"))
161 CheckDlgButton(dialog, IDC_D3D_PSHADER_MODE, BST_CHECKED);
163 CheckDlgButton(dialog, IDC_D3D_PSHADER_MODE, BST_UNCHECKED);
164 HeapFree(GetProcessHeap(), 0, buf);
169 static void set_from_desktop_edits(HWND dialog) {
170 char *width, *height, *new;
172 if (updating_ui) return;
176 width = get_text(dialog, IDC_DESKTOP_WIDTH);
177 height = get_text(dialog, IDC_DESKTOP_HEIGHT);
179 if (width == NULL || strcmp(width, "") == 0) {
180 HeapFree(GetProcessHeap(), 0, width);
181 width = strdupA("640");
184 if (height == NULL || strcmp(height, "") == 0) {
185 HeapFree(GetProcessHeap(), 0, height);
186 height = strdupA("480");
189 new = HeapAlloc(GetProcessHeap(), 0, strlen(width) + strlen(height) + 2 /* x + terminator */);
190 sprintf(new, "%sx%s", width, height);
191 set_reg_key(config_key, keypath("X11 Driver"), "Desktop", new);
193 HeapFree(GetProcessHeap(), 0, width);
194 HeapFree(GetProcessHeap(), 0, height);
195 HeapFree(GetProcessHeap(), 0, new);
198 static void on_enable_desktop_clicked(HWND dialog) {
201 if (IsDlgButtonChecked(dialog, IDC_ENABLE_DESKTOP) == BST_CHECKED) {
202 set_from_desktop_edits(dialog);
204 set_reg_key(config_key, keypath("X11 Driver"), "Desktop", NULL);
207 update_gui_for_desktop_mode(dialog);
210 static void on_screen_depth_changed(HWND dialog) {
211 char *newvalue = get_text(dialog, IDC_SCREEN_DEPTH);
212 char *spaceIndex = strchr(newvalue, ' ');
214 WINE_TRACE("newvalue=%s\n", newvalue);
215 if (updating_ui) return;
218 set_reg_key(config_key, keypath("X11 Driver"), "ScreenDepth", newvalue);
219 HeapFree(GetProcessHeap(), 0, newvalue);
222 static void on_dx_mouse_grab_clicked(HWND dialog) {
223 if (IsDlgButtonChecked(dialog, IDC_DX_MOUSE_GRAB) == BST_CHECKED)
224 set_reg_key(config_key, keypath("X11 Driver"), "DXGrab", "Y");
226 set_reg_key(config_key, keypath("X11 Driver"), "DXGrab", "N");
230 static void on_double_buffer_clicked(HWND dialog) {
231 if (IsDlgButtonChecked(dialog, IDC_DOUBLE_BUFFER) == BST_CHECKED)
232 set_reg_key(config_key, keypath("X11 Driver"), "DesktopDoubleBuffered", "Y");
234 set_reg_key(config_key, keypath("X11 Driver"), "DesktopDoubleBuffered", "N");
237 static void on_d3d_vshader_mode_changed(HWND dialog) {
238 int selected_mode = SendDlgItemMessage(dialog, IDC_D3D_VSHADER_MODE, CB_GETCURSEL, 0, 0);
239 set_reg_key(config_key, keypath("Direct3D"), "VertexShaderMode", D3D_VS_Modes[selected_mode]);
242 static void on_d3d_pshader_mode_clicked(HWND dialog) {
243 if (IsDlgButtonChecked(dialog, IDC_D3D_PSHADER_MODE) == BST_CHECKED)
244 set_reg_key(config_key, keypath("Direct3D"), "PixelShaderMode", "enabled");
246 set_reg_key(config_key, keypath("Direct3D"), "PixelShaderMode", "disabled");
250 GraphDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
257 set_window_title(hDlg);
261 switch(HIWORD(wParam)) {
263 if (updating_ui) break;
264 SendMessage(GetParent(hDlg), PSM_CHANGED, 0, 0);
265 if ( ((LOWORD(wParam) == IDC_DESKTOP_WIDTH) || (LOWORD(wParam) == IDC_DESKTOP_HEIGHT)) && !updating_ui )
266 set_from_desktop_edits(hDlg);
270 if (updating_ui) break;
271 SendMessage(GetParent(hDlg), PSM_CHANGED, 0, 0);
272 switch(LOWORD(wParam)) {
273 case IDC_ENABLE_DESKTOP: on_enable_desktop_clicked(hDlg); break;
274 case IDC_DX_MOUSE_GRAB: on_dx_mouse_grab_clicked(hDlg); break;
275 case IDC_DOUBLE_BUFFER: on_double_buffer_clicked(hDlg); break;
276 case IDC_D3D_PSHADER_MODE: on_d3d_pshader_mode_clicked(hDlg); break;
280 case CBN_SELCHANGE: {
281 SendMessage(GetParent(hDlg), PSM_CHANGED, 0, 0);
282 switch (LOWORD(wParam)) {
283 case IDC_SCREEN_DEPTH: on_screen_depth_changed(hDlg); break;
284 case IDC_D3D_VSHADER_MODE: on_d3d_vshader_mode_changed(hDlg); break;
296 switch (((LPNMHDR)lParam)->code) {
297 case PSN_KILLACTIVE: {
298 SetWindowLongPtr(hDlg, DWLP_MSGRESULT, FALSE);
303 SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
306 case PSN_SETACTIVE: {