Alexandre Julliard | 3db78b8 | 2003-08-30 00:40:46 +0000 | [diff] [blame] | 1 | /* |
| 2 | * X11DRV configuration code |
| 3 | * |
| 4 | * Copyright 2003 Mark Westcott |
| 5 | * Copyright 2003 Mike Hearn |
| 6 | * |
| 7 | * This library is free software; you can redistribute it and/or |
| 8 | * modify it under the terms of the GNU Lesser General Public |
| 9 | * License as published by the Free Software Foundation; either |
| 10 | * version 2.1 of the License, or (at your option) any later version. |
| 11 | * |
| 12 | * This library is distributed in the hope that it will be useful, |
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 15 | * Lesser General Public License for more details. |
| 16 | * |
| 17 | * You should have received a copy of the GNU Lesser General Public |
| 18 | * License along with this library; if not, write to the Free Software |
| 19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 20 | * |
| 21 | */ |
| 22 | |
Alexandre Julliard | e37c6e1 | 2003-09-05 23:08:26 +0000 | [diff] [blame] | 23 | #include <stdarg.h> |
Alexandre Julliard | 3db78b8 | 2003-08-30 00:40:46 +0000 | [diff] [blame] | 24 | #include <stdlib.h> |
| 25 | #include <stdio.h> |
| 26 | |
Alexandre Julliard | e37c6e1 | 2003-09-05 23:08:26 +0000 | [diff] [blame] | 27 | #include <windef.h> |
| 28 | #include <winbase.h> |
| 29 | #include <winreg.h> |
| 30 | #include <wine/debug.h> |
| 31 | |
Alexandre Julliard | 3db78b8 | 2003-08-30 00:40:46 +0000 | [diff] [blame] | 32 | #include "resource.h" |
| 33 | #include "winecfg.h" |
| 34 | |
| 35 | WINE_DEFAULT_DEBUG_CHANNEL(winecfg); |
| 36 | |
Mike Hearn | cd0b789 | 2003-09-08 18:58:07 +0000 | [diff] [blame] | 37 | #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? */ |
Mike Hearn | 498e1ce | 2003-09-30 00:27:55 +0000 | [diff] [blame] | 38 | #define section (appSettings == EDITING_GLOBAL ? "x11drv" : (getSectionForApp("x11drv"))) |
Mike Hearn | cd0b789 | 2003-09-08 18:58:07 +0000 | [diff] [blame] | 39 | |
| 40 | int updatingUI; |
| 41 | |
Mike Hearn | 498e1ce | 2003-09-30 00:27:55 +0000 | [diff] [blame] | 42 | void updateGUIForDesktopMode(HWND dialog) { |
Mike Hearn | cd0b789 | 2003-09-08 18:58:07 +0000 | [diff] [blame] | 43 | WINE_TRACE("\n"); |
| 44 | |
| 45 | updatingUI = TRUE; |
| 46 | |
| 47 | /* do we have desktop mode enabled? */ |
Mike Hearn | f388977 | 2003-10-22 00:01:46 +0000 | [diff] [blame^] | 48 | if (doesConfigValueExist(section, "Desktop") == S_OK) { |
Mike Hearn | 498e1ce | 2003-09-30 00:27:55 +0000 | [diff] [blame] | 49 | CheckDlgButton(dialog, IDC_ENABLE_DESKTOP, BST_CHECKED); |
Mike Hearn | cd0b789 | 2003-09-08 18:58:07 +0000 | [diff] [blame] | 50 | /* enable the controls */ |
Mike Hearn | 498e1ce | 2003-09-30 00:27:55 +0000 | [diff] [blame] | 51 | enable(IDC_DESKTOP_WIDTH); |
| 52 | enable(IDC_DESKTOP_HEIGHT); |
| 53 | enable(IDC_DESKTOP_SIZE); |
| 54 | enable(IDC_DESKTOP_BY); |
| 55 | |
| 56 | SetWindowText(GetDlgItem(dialog, IDC_DESKTOP_WIDTH), "640"); |
| 57 | SetWindowText(GetDlgItem(dialog, IDC_DESKTOP_HEIGHT), "480"); |
Mike Hearn | cd0b789 | 2003-09-08 18:58:07 +0000 | [diff] [blame] | 58 | } |
| 59 | else { |
Mike Hearn | 498e1ce | 2003-09-30 00:27:55 +0000 | [diff] [blame] | 60 | CheckDlgButton(dialog, IDC_ENABLE_DESKTOP, BST_UNCHECKED); |
Mike Hearn | cd0b789 | 2003-09-08 18:58:07 +0000 | [diff] [blame] | 61 | /* disable the controls */ |
Mike Hearn | 498e1ce | 2003-09-30 00:27:55 +0000 | [diff] [blame] | 62 | disable(IDC_DESKTOP_WIDTH); |
| 63 | disable(IDC_DESKTOP_HEIGHT); |
| 64 | disable(IDC_DESKTOP_SIZE); |
| 65 | disable(IDC_DESKTOP_BY); |
Mike Hearn | cd0b789 | 2003-09-08 18:58:07 +0000 | [diff] [blame] | 66 | |
Mike Hearn | 498e1ce | 2003-09-30 00:27:55 +0000 | [diff] [blame] | 67 | SetWindowText(GetDlgItem(dialog, IDC_DESKTOP_WIDTH), ""); |
| 68 | SetWindowText(GetDlgItem(dialog, IDC_DESKTOP_HEIGHT), ""); |
Mike Hearn | cd0b789 | 2003-09-08 18:58:07 +0000 | [diff] [blame] | 69 | } |
| 70 | |
| 71 | updatingUI = FALSE; |
| 72 | } |
| 73 | |
Alexandre Julliard | 3db78b8 | 2003-08-30 00:40:46 +0000 | [diff] [blame] | 74 | /* pokes the win32 api to setup the dialog from the config struct */ |
| 75 | void initX11DrvDlg (HWND hDlg) |
| 76 | { |
Mike Hearn | cd0b789 | 2003-09-08 18:58:07 +0000 | [diff] [blame] | 77 | char *buf; |
Mike Hearn | 81be7f7 | 2003-09-22 19:26:10 +0000 | [diff] [blame] | 78 | char *bufindex; |
Alexandre Julliard | 3db78b8 | 2003-08-30 00:40:46 +0000 | [diff] [blame] | 79 | |
Mike Hearn | f388977 | 2003-10-22 00:01:46 +0000 | [diff] [blame^] | 80 | updateGUIForDesktopMode(hDlg); |
| 81 | |
Mike Hearn | cd0b789 | 2003-09-08 18:58:07 +0000 | [diff] [blame] | 82 | updatingUI = TRUE; |
| 83 | |
Alexandre Julliard | 3db78b8 | 2003-08-30 00:40:46 +0000 | [diff] [blame] | 84 | /* desktop size */ |
Mike Hearn | f388977 | 2003-10-22 00:01:46 +0000 | [diff] [blame^] | 85 | buf = getConfigValue(section, "Desktop", "640x480"); |
Mike Hearn | 81be7f7 | 2003-09-22 19:26:10 +0000 | [diff] [blame] | 86 | bufindex = strchr(buf, 'x'); |
| 87 | *bufindex = '\0'; |
| 88 | bufindex++; |
Mike Hearn | cd0b789 | 2003-09-08 18:58:07 +0000 | [diff] [blame] | 89 | SetWindowText(GetDlgItem(hDlg, IDC_DESKTOP_WIDTH), buf); |
Mike Hearn | 81be7f7 | 2003-09-22 19:26:10 +0000 | [diff] [blame] | 90 | SetWindowText(GetDlgItem(hDlg, IDC_DESKTOP_HEIGHT), bufindex); |
| 91 | free(buf); |
Mike Hearn | f388977 | 2003-10-22 00:01:46 +0000 | [diff] [blame^] | 92 | |
| 93 | SendDlgItemMessage(hDlg, IDC_SCREEN_DEPTH, CB_RESETCONTENT, 0, 0); |
Mike Hearn | 81be7f7 | 2003-09-22 19:26:10 +0000 | [diff] [blame] | 94 | SendDlgItemMessage(hDlg, IDC_SCREEN_DEPTH, CB_ADDSTRING, 0, (LPARAM) "8 bit"); |
| 95 | SendDlgItemMessage(hDlg, IDC_SCREEN_DEPTH, CB_ADDSTRING, 0, (LPARAM) "16 bit"); |
| 96 | SendDlgItemMessage(hDlg, IDC_SCREEN_DEPTH, CB_ADDSTRING, 0, (LPARAM) "24 bit"); |
| 97 | SendDlgItemMessage(hDlg, IDC_SCREEN_DEPTH, CB_ADDSTRING, 0, (LPARAM) "32 bit"); /* is this valid? */ |
| 98 | |
Mike Hearn | f388977 | 2003-10-22 00:01:46 +0000 | [diff] [blame^] | 99 | buf = getConfigValue(section, "ScreenDepth", "24"); |
Mike Hearn | 81be7f7 | 2003-09-22 19:26:10 +0000 | [diff] [blame] | 100 | if (strcmp(buf, "8") == 0) |
| 101 | SendDlgItemMessage(hDlg, IDC_SCREEN_DEPTH, CB_SETCURSEL, 0, 0); |
| 102 | else if (strcmp(buf, "16") == 0) |
| 103 | SendDlgItemMessage(hDlg, IDC_SCREEN_DEPTH, CB_SETCURSEL, 1, 0); |
| 104 | else if (strcmp(buf, "24") == 0) |
| 105 | SendDlgItemMessage(hDlg, IDC_SCREEN_DEPTH, CB_SETCURSEL, 2, 0); |
| 106 | else if (strcmp(buf, "32") == 0) |
| 107 | SendDlgItemMessage(hDlg, IDC_SCREEN_DEPTH, CB_SETCURSEL, 3, 0); |
| 108 | else |
| 109 | WINE_ERR("Invalid screen depth read from registry (%s)\n", buf); |
Mike Hearn | cd0b789 | 2003-09-08 18:58:07 +0000 | [diff] [blame] | 110 | free(buf); |
Alexandre Julliard | 3db78b8 | 2003-08-30 00:40:46 +0000 | [diff] [blame] | 111 | |
Mike Hearn | cd0b789 | 2003-09-08 18:58:07 +0000 | [diff] [blame] | 112 | SendDlgItemMessage(hDlg, IDC_DESKTOP_WIDTH, EM_LIMITTEXT, RES_MAXLEN, 0); |
Mike Hearn | 5d249cb | 2003-09-18 04:32:01 +0000 | [diff] [blame] | 113 | SendDlgItemMessage(hDlg, IDC_DESKTOP_HEIGHT, EM_LIMITTEXT, RES_MAXLEN, 0); |
| 114 | |
Mike Hearn | f388977 | 2003-10-22 00:01:46 +0000 | [diff] [blame^] | 115 | buf = getConfigValue(section, "DXGrab", "Y"); |
Mike Hearn | 5d249cb | 2003-09-18 04:32:01 +0000 | [diff] [blame] | 116 | if (IS_OPTION_TRUE(*buf)) |
Mike Hearn | fae915f | 2003-09-22 21:13:51 +0000 | [diff] [blame] | 117 | CheckDlgButton(hDlg, IDC_DX_MOUSE_GRAB, BST_CHECKED); |
Mike Hearn | 5d249cb | 2003-09-18 04:32:01 +0000 | [diff] [blame] | 118 | else |
Mike Hearn | fae915f | 2003-09-22 21:13:51 +0000 | [diff] [blame] | 119 | CheckDlgButton(hDlg, IDC_DX_MOUSE_GRAB, BST_UNCHECKED); |
| 120 | free(buf); |
| 121 | |
Mike Hearn | f388977 | 2003-10-22 00:01:46 +0000 | [diff] [blame^] | 122 | buf = getConfigValue(section, "DesktopDoubleBuffered", "Y"); |
Mike Hearn | fae915f | 2003-09-22 21:13:51 +0000 | [diff] [blame] | 123 | if (IS_OPTION_TRUE(*buf)) |
| 124 | CheckDlgButton(hDlg, IDC_DOUBLE_BUFFER, BST_CHECKED); |
| 125 | else |
| 126 | CheckDlgButton(hDlg, IDC_DOUBLE_BUFFER, BST_UNCHECKED); |
| 127 | free(buf); |
| 128 | |
Mike Hearn | f388977 | 2003-10-22 00:01:46 +0000 | [diff] [blame^] | 129 | buf = getConfigValue(section, "UseTakeFocus", "N"); |
Mike Hearn | fae915f | 2003-09-22 21:13:51 +0000 | [diff] [blame] | 130 | if (IS_OPTION_TRUE(*buf)) |
| 131 | CheckDlgButton(hDlg, IDC_USE_TAKE_FOCUS, BST_CHECKED); |
| 132 | else |
| 133 | CheckDlgButton(hDlg, IDC_USE_TAKE_FOCUS, BST_UNCHECKED); |
| 134 | free(buf); |
Mike Hearn | cd0b789 | 2003-09-08 18:58:07 +0000 | [diff] [blame] | 135 | |
| 136 | updatingUI = FALSE; |
Alexandre Julliard | 3db78b8 | 2003-08-30 00:40:46 +0000 | [diff] [blame] | 137 | } |
| 138 | |
Mike Hearn | cd0b789 | 2003-09-08 18:58:07 +0000 | [diff] [blame] | 139 | |
| 140 | |
| 141 | void setFromDesktopSizeEdits(HWND hDlg) { |
| 142 | char *width = malloc(RES_MAXLEN+1); |
| 143 | char *height = malloc(RES_MAXLEN+1); |
| 144 | char *newStr = malloc((RES_MAXLEN*2) + 2); |
| 145 | |
| 146 | if (updatingUI) return; |
| 147 | |
| 148 | WINE_TRACE("\n"); |
| 149 | |
| 150 | GetWindowText(GetDlgItem(hDlg, IDC_DESKTOP_WIDTH), width, RES_MAXLEN+1); |
| 151 | GetWindowText(GetDlgItem(hDlg, IDC_DESKTOP_HEIGHT), height, RES_MAXLEN+1); |
| 152 | |
| 153 | if (strcmp(width, "") == 0) strcpy(width, "640"); |
| 154 | if (strcmp(height, "") == 0) strcpy(height, "480"); |
| 155 | |
| 156 | sprintf(newStr, "%sx%s", width, height); |
Mike Hearn | f388977 | 2003-10-22 00:01:46 +0000 | [diff] [blame^] | 157 | addTransaction(section, "Desktop", ACTION_SET, newStr); |
Mike Hearn | cd0b789 | 2003-09-08 18:58:07 +0000 | [diff] [blame] | 158 | |
| 159 | free(width); |
| 160 | free(height); |
| 161 | free(newStr); |
Alexandre Julliard | 3db78b8 | 2003-08-30 00:40:46 +0000 | [diff] [blame] | 162 | } |
| 163 | |
Mike Hearn | cd0b789 | 2003-09-08 18:58:07 +0000 | [diff] [blame] | 164 | void onEnableDesktopClicked(HWND hDlg) { |
| 165 | WINE_TRACE("\n"); |
| 166 | if (IsDlgButtonChecked(hDlg, IDC_ENABLE_DESKTOP) == BST_CHECKED) { |
| 167 | /* it was just unchecked, so read the values of the edit boxes, set the config value */ |
| 168 | setFromDesktopSizeEdits(hDlg); |
| 169 | } else { |
| 170 | /* it was just checked, so remove the config values */ |
Mike Hearn | f388977 | 2003-10-22 00:01:46 +0000 | [diff] [blame^] | 171 | addTransaction(section, "Desktop", ACTION_REMOVE, NULL); |
Mike Hearn | cd0b789 | 2003-09-08 18:58:07 +0000 | [diff] [blame] | 172 | } |
| 173 | updateGUIForDesktopMode(hDlg); |
| 174 | } |
Mike Hearn | 5d249cb | 2003-09-18 04:32:01 +0000 | [diff] [blame] | 175 | |
Mike Hearn | 81be7f7 | 2003-09-22 19:26:10 +0000 | [diff] [blame] | 176 | void onScreenDepthChanged(HWND hDlg) { |
| 177 | char *newvalue = getDialogItemText(hDlg, IDC_SCREEN_DEPTH); |
| 178 | char *spaceIndex = strchr(newvalue, ' '); |
Mike Hearn | cd0b789 | 2003-09-08 18:58:07 +0000 | [diff] [blame] | 179 | |
Mike Hearn | 81be7f7 | 2003-09-22 19:26:10 +0000 | [diff] [blame] | 180 | WINE_TRACE("newvalue=%s\n", newvalue); |
Mike Hearn | 5d249cb | 2003-09-18 04:32:01 +0000 | [diff] [blame] | 181 | if (updatingUI) return; |
Mike Hearn | 5d249cb | 2003-09-18 04:32:01 +0000 | [diff] [blame] | 182 | |
Mike Hearn | 81be7f7 | 2003-09-22 19:26:10 +0000 | [diff] [blame] | 183 | *spaceIndex = '\0'; |
Mike Hearn | f388977 | 2003-10-22 00:01:46 +0000 | [diff] [blame^] | 184 | addTransaction(section, "ScreenDepth", ACTION_SET, newvalue); |
Mike Hearn | 5d249cb | 2003-09-18 04:32:01 +0000 | [diff] [blame] | 185 | free(newvalue); |
| 186 | } |
| 187 | |
Mike Hearn | fae915f | 2003-09-22 21:13:51 +0000 | [diff] [blame] | 188 | void onDXMouseGrabClicked(HWND hDlg) { |
| 189 | if (IsDlgButtonChecked(hDlg, IDC_DX_MOUSE_GRAB) == BST_CHECKED) |
Mike Hearn | f388977 | 2003-10-22 00:01:46 +0000 | [diff] [blame^] | 190 | addTransaction(section, "DXGrab", ACTION_SET, "Y"); |
Mike Hearn | 5d249cb | 2003-09-18 04:32:01 +0000 | [diff] [blame] | 191 | else |
Mike Hearn | f388977 | 2003-10-22 00:01:46 +0000 | [diff] [blame^] | 192 | addTransaction(section, "DXGrab", ACTION_SET, "N"); |
Mike Hearn | 5d249cb | 2003-09-18 04:32:01 +0000 | [diff] [blame] | 193 | } |
| 194 | |
Mike Hearn | fae915f | 2003-09-22 21:13:51 +0000 | [diff] [blame] | 195 | |
| 196 | void onDoubleBufferClicked(HWND hDlg) { |
| 197 | if (IsDlgButtonChecked(hDlg, IDC_DOUBLE_BUFFER) == BST_CHECKED) |
Mike Hearn | f388977 | 2003-10-22 00:01:46 +0000 | [diff] [blame^] | 198 | addTransaction(section, "DesktopDoubleBuffered", ACTION_SET, "Y"); |
Mike Hearn | fae915f | 2003-09-22 21:13:51 +0000 | [diff] [blame] | 199 | else |
Mike Hearn | f388977 | 2003-10-22 00:01:46 +0000 | [diff] [blame^] | 200 | addTransaction(section, "DesktopDoubleBuffered", ACTION_SET, "N"); |
Mike Hearn | fae915f | 2003-09-22 21:13:51 +0000 | [diff] [blame] | 201 | } |
| 202 | |
| 203 | void onUseTakeFocusClicked(HWND hDlg) { |
| 204 | if (IsDlgButtonChecked(hDlg, IDC_USE_TAKE_FOCUS) == BST_CHECKED) |
Mike Hearn | f388977 | 2003-10-22 00:01:46 +0000 | [diff] [blame^] | 205 | addTransaction(section, "UseTakeFocus", ACTION_SET, "Y"); |
Mike Hearn | fae915f | 2003-09-22 21:13:51 +0000 | [diff] [blame] | 206 | else |
Mike Hearn | f388977 | 2003-10-22 00:01:46 +0000 | [diff] [blame^] | 207 | addTransaction(section, "UseTakeFocus", ACTION_SET, "N"); |
Mike Hearn | fae915f | 2003-09-22 21:13:51 +0000 | [diff] [blame] | 208 | } |
| 209 | |
| 210 | |
Alexandre Julliard | 3db78b8 | 2003-08-30 00:40:46 +0000 | [diff] [blame] | 211 | INT_PTR CALLBACK |
| 212 | X11DrvDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) |
| 213 | { |
| 214 | switch (uMsg) { |
| 215 | case WM_INITDIALOG: |
| 216 | break; |
Mike Hearn | cd0b789 | 2003-09-08 18:58:07 +0000 | [diff] [blame] | 217 | |
Alexandre Julliard | 3db78b8 | 2003-08-30 00:40:46 +0000 | [diff] [blame] | 218 | case WM_COMMAND: |
| 219 | switch(HIWORD(wParam)) { |
| 220 | case EN_CHANGE: { |
| 221 | SendMessage(GetParent(hDlg), PSM_CHANGED, 0, 0); |
Mike Hearn | f388977 | 2003-10-22 00:01:46 +0000 | [diff] [blame^] | 222 | if ( ((LOWORD(wParam) == IDC_DESKTOP_WIDTH) || (LOWORD(wParam) == IDC_DESKTOP_HEIGHT)) && !updatingUI ) |
| 223 | setFromDesktopSizeEdits(hDlg); |
Alexandre Julliard | 3db78b8 | 2003-08-30 00:40:46 +0000 | [diff] [blame] | 224 | break; |
| 225 | } |
Mike Hearn | cd0b789 | 2003-09-08 18:58:07 +0000 | [diff] [blame] | 226 | case BN_CLICKED: { |
Mike Hearn | f388977 | 2003-10-22 00:01:46 +0000 | [diff] [blame^] | 227 | if (updatingUI) break; |
Mike Hearn | cd0b789 | 2003-09-08 18:58:07 +0000 | [diff] [blame] | 228 | switch(LOWORD(wParam)) { |
| 229 | case IDC_ENABLE_DESKTOP: onEnableDesktopClicked(hDlg); break; |
Mike Hearn | fae915f | 2003-09-22 21:13:51 +0000 | [diff] [blame] | 230 | case IDC_DX_MOUSE_GRAB: onDXMouseGrabClicked(hDlg); break; |
| 231 | case IDC_USE_TAKE_FOCUS: onUseTakeFocusClicked(hDlg); break; |
| 232 | case IDC_DOUBLE_BUFFER: onDoubleBufferClicked(hDlg); break; |
Mike Hearn | cd0b789 | 2003-09-08 18:58:07 +0000 | [diff] [blame] | 233 | }; |
| 234 | break; |
| 235 | } |
Mike Hearn | 81be7f7 | 2003-09-22 19:26:10 +0000 | [diff] [blame] | 236 | case CBN_SELCHANGE: { |
| 237 | if (LOWORD(wParam) == IDC_SCREEN_DEPTH) onScreenDepthChanged(hDlg); |
| 238 | break; |
| 239 | } |
Mike Hearn | cd0b789 | 2003-09-08 18:58:07 +0000 | [diff] [blame] | 240 | |
Alexandre Julliard | 3db78b8 | 2003-08-30 00:40:46 +0000 | [diff] [blame] | 241 | default: |
| 242 | break; |
| 243 | } |
| 244 | break; |
Mike Hearn | cd0b789 | 2003-09-08 18:58:07 +0000 | [diff] [blame] | 245 | |
| 246 | |
Alexandre Julliard | 3db78b8 | 2003-08-30 00:40:46 +0000 | [diff] [blame] | 247 | case WM_NOTIFY: |
| 248 | switch (((LPNMHDR)lParam)->code) { |
| 249 | case PSN_KILLACTIVE: { |
Alexandre Julliard | 3db78b8 | 2003-08-30 00:40:46 +0000 | [diff] [blame] | 250 | SetWindowLong(hDlg, DWL_MSGRESULT, FALSE); |
| 251 | break; |
| 252 | } |
| 253 | case PSN_APPLY: { |
Alexandre Julliard | 3db78b8 | 2003-08-30 00:40:46 +0000 | [diff] [blame] | 254 | SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR); |
| 255 | break; |
| 256 | } |
| 257 | case PSN_SETACTIVE: { |
| 258 | initX11DrvDlg (hDlg); |
| 259 | break; |
| 260 | } |
| 261 | } |
| 262 | break; |
| 263 | |
| 264 | default: |
| 265 | break; |
| 266 | } |
| 267 | return FALSE; |
| 268 | } |