2 * WineCfg libraries tabsheet
4 * Copyright 2004 Robert van Herk
5 * Copyright 2004 Mike Hearn
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.
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.
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
23 #define NONAMELESSUNION
26 #include <wine/debug.h>
32 WINE_DEFAULT_DEBUG_CHANNEL(winecfg
);
41 UNKNOWN
/* Special value indicating an erronous DLL override mode */
50 /* Convert a registry string to a dllmode */
51 static enum dllmode
string_to_mode(char *in
)
58 out
= HeapAlloc(GetProcessHeap(), 0, len
);
60 /* remove the spaces */
61 for (i
= j
= 0; i
<= len
; ++i
) {
67 /* parse the string */
69 if (strcmp(out
, "builtin,native") == 0) res
= BUILTIN_NATIVE
;
70 if (strcmp(out
, "native,builtin") == 0) res
= NATIVE_BUILTIN
;
71 if (strcmp(out
, "builtin") == 0) res
= BUILTIN
;
72 if (strcmp(out
, "native") == 0) res
= NATIVE
;
73 if (strcmp(out
, "") == 0) res
= DISABLE
;
75 HeapFree(GetProcessHeap(), 0, out
);
79 /* Convert a dllmode to a registry string. */
80 static char* mode_to_string(enum dllmode mode
)
84 case NATIVE
: return "native";
85 case BUILTIN
: return "builtin";
86 case NATIVE_BUILTIN
: return "native,builtin";
87 case BUILTIN_NATIVE
: return "builtin,native";
88 case DISABLE
: return "";
89 default: assert(FALSE
); return "";
93 /* Convert a dllmode to a pretty string for display. TODO: use translations. */
94 static char* mode_to_label(enum dllmode mode
)
96 WINE_FIXME("translate me");
97 return mode_to_string(mode
);
100 /* Convert a control id (IDC_ constant) to a dllmode */
101 static enum dllmode
id_to_mode(DWORD id
)
105 case IDC_RAD_BUILTIN
: return BUILTIN
;
106 case IDC_RAD_NATIVE
: return NATIVE
;
107 case IDC_RAD_NATIVE_BUILTIN
: return NATIVE_BUILTIN
;
108 case IDC_RAD_BUILTIN_NATIVE
: return BUILTIN_NATIVE
;
109 case IDC_RAD_DISABLE
: return DISABLE
;
110 default: assert( FALSE
); return 0; /* should not be reached */
114 /* Convert a dllmode to a control id (IDC_ constant) */
115 static DWORD
mode_to_id(enum dllmode mode
)
119 case BUILTIN
: return IDC_RAD_BUILTIN
;
120 case NATIVE
: return IDC_RAD_NATIVE
;
121 case NATIVE_BUILTIN
: return IDC_RAD_NATIVE_BUILTIN
;
122 case BUILTIN_NATIVE
: return IDC_RAD_BUILTIN_NATIVE
;
123 case DISABLE
: return IDC_RAD_DISABLE
;
124 default: assert( FALSE
); return 0; /* should not be reached */
128 static void set_controls_from_selection(HWND dialog
)
130 int index
= SendDlgItemMessage(dialog
, IDC_DLLS_LIST
, LB_GETCURSEL
, 0, 0);
135 if (index
== -1) /* no selection */
137 for (i
= IDC_RAD_BUILTIN
; i
<= IDC_RAD_DISABLE
; i
++)
140 CheckRadioButton(dialog
, IDC_RAD_BUILTIN
, IDC_RAD_DISABLE
, -1);
145 /* enable the controls */
146 for (i
= IDC_RAD_BUILTIN
; i
<= IDC_RAD_DISABLE
; i
++)
149 dll
= (struct dll
*) SendDlgItemMessage(dialog
, IDC_DLLS_LIST
, LB_GETITEMDATA
, index
, 0);
151 id
= mode_to_id(dll
->mode
);
153 CheckRadioButton(dialog
, IDC_RAD_BUILTIN
, IDC_RAD_DISABLE
, id
);
157 static void clear_settings(HWND dialog
)
159 int count
= SendDlgItemMessage(dialog
, IDC_DLLS_LIST
, LB_GETCOUNT
, 0, 0);
162 WINE_TRACE("count=%d\n", count
);
164 for (i
= 0; i
< count
; i
++)
166 struct dll
*dll
= (struct dll
*) SendDlgItemMessage(dialog
, IDC_DLLS_LIST
, LB_GETITEMDATA
, 0, 0);
168 SendDlgItemMessage(dialog
, IDC_DLLS_LIST
, LB_DELETESTRING
, 0, 0);
170 HeapFree(GetProcessHeap(), 0, dll
->name
);
171 HeapFree(GetProcessHeap(), 0, dll
);
175 static void load_library_settings(HWND dialog
)
177 char **overrides
= enumerate_values(keypath("DllOverrides"));
181 sel
= SendDlgItemMessage(dialog
, IDC_DLLS_LIST
, LB_GETCURSEL
, 0, 0);
183 WINE_TRACE("sel=%d\n", sel
);
185 clear_settings(dialog
);
187 if (!overrides
|| *overrides
== NULL
)
189 set_controls_from_selection(dialog
);
190 disable(IDC_DLLS_REMOVEDLL
);
191 HeapFree(GetProcessHeap(), 0, overrides
);
195 enable(IDC_DLLS_REMOVEDLL
);
197 for (p
= overrides
; *p
!= NULL
; p
++)
200 char *str
, *value
, *label
;
203 value
= get(keypath("DllOverrides"), *p
, NULL
);
205 label
= mode_to_label(string_to_mode(value
));
207 str
= HeapAlloc(GetProcessHeap(), 0, strlen(*p
) + 2 + strlen(label
) + 2);
213 dll
= HeapAlloc(GetProcessHeap(), 0, sizeof(struct dll
));
215 dll
->mode
= string_to_mode(value
);
217 index
= SendDlgItemMessage(dialog
, IDC_DLLS_LIST
, LB_ADDSTRING
, (WPARAM
) -1, (LPARAM
) str
);
218 SendDlgItemMessage(dialog
, IDC_DLLS_LIST
, LB_SETITEMDATA
, index
, (LPARAM
) dll
);
220 HeapFree(GetProcessHeap(), 0, str
);
225 HeapFree(GetProcessHeap(), 0, overrides
);
227 /* restore the previous selection, if possible */
228 if (sel
>= count
- 1) sel
= count
- 1;
229 else if (sel
== -1) sel
= 0;
231 SendDlgItemMessage(dialog
, IDC_DLLS_LIST
, LB_SETCURSEL
, sel
, 0);
233 set_controls_from_selection(dialog
);
236 /* Called when the application is initialized (cannot reinit!) */
237 static void init_libsheet(HWND dialog
)
239 /* clear the add dll controls */
240 SendDlgItemMessage(dialog
, IDC_DLLCOMBO
, WM_SETTEXT
, 1, (LPARAM
) "");
241 disable(IDC_DLLS_ADDDLL
);
245 static void on_add_combo_change(HWND dialog
)
249 SendDlgItemMessage(dialog
, IDC_DLLCOMBO
, WM_GETTEXT
, sizeof(buffer
), (LPARAM
) buffer
);
252 enable(IDC_DLLS_ADDDLL
)
254 disable(IDC_DLLS_ADDDLL
);
257 static void set_dllmode(HWND dialog
, DWORD id
)
264 mode
= id_to_mode(id
);
266 sel
= SendDlgItemMessage(dialog
, IDC_DLLS_LIST
, LB_GETCURSEL
, 0, 0);
267 if (sel
== -1) return;
269 dll
= (struct dll
*) SendDlgItemMessage(dialog
, IDC_DLLS_LIST
, LB_GETITEMDATA
, sel
, 0);
271 str
= mode_to_string(mode
);
272 WINE_TRACE("Setting %s to %s\n", dll
->name
, str
);
274 SendMessage(GetParent(dialog
), PSM_CHANGED
, 0, 0);
275 set(keypath("DllOverrides"), dll
->name
, str
);
277 load_library_settings(dialog
); /* ... and refresh */
280 static void on_add_click(HWND dialog
)
284 ZeroMemory(buffer
, sizeof(buffer
));
286 SendDlgItemMessage(dialog
, IDC_DLLCOMBO
, WM_GETTEXT
, sizeof(buffer
), (LPARAM
) buffer
);
288 SendDlgItemMessage(dialog
, IDC_DLLCOMBO
, WM_SETTEXT
, 0, (LPARAM
) "");
289 disable(IDC_DLLS_ADDDLL
);
291 WINE_TRACE("Adding %s as native, builtin", buffer
);
293 SendMessage(GetParent(dialog
), PSM_CHANGED
, 0, 0);
294 set(keypath("DllOverrides"), buffer
, "native,builtin");
296 load_library_settings(dialog
);
298 SendDlgItemMessage(dialog
, IDC_DLLS_LIST
, LB_SELECTSTRING
, (WPARAM
) 0, (LPARAM
) buffer
);
300 set_controls_from_selection(dialog
);
303 static void on_remove_click(HWND dialog
)
305 int sel
= SendDlgItemMessage(dialog
, IDC_DLLS_LIST
, LB_GETCURSEL
, 0, 0);
308 if (sel
== LB_ERR
) return;
310 dll
= (struct dll
*) SendDlgItemMessage(dialog
, IDC_DLLS_LIST
, LB_GETITEMDATA
, sel
, 0);
312 SendDlgItemMessage(dialog
, IDC_DLLS_LIST
, LB_DELETESTRING
, sel
, 0);
314 SendMessage(GetParent(dialog
), PSM_CHANGED
, 0, 0);
315 set(keypath("DllOverrides"), dll
->name
, NULL
);
317 HeapFree(GetProcessHeap(), 0, dll
->name
);
318 HeapFree(GetProcessHeap(), 0, dll
);
320 if (SendDlgItemMessage(dialog
, IDC_DLLS_LIST
, LB_GETCOUNT
, 0, 0) > 0)
321 SendDlgItemMessage(dialog
, IDC_DLLS_LIST
, LB_SETCURSEL
, max(sel
- 1, 0), 0);
323 disable(IDC_DLLS_REMOVEDLL
);
325 set_controls_from_selection(dialog
);
329 LibrariesDlgProc (HWND hDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
337 set_window_title(hDlg
);
340 switch (((LPNMHDR
)lParam
)->code
) {
342 load_library_settings(hDlg
);
347 switch(HIWORD(wParam
)) {
349 /* FIXME: when the user hits enter in the DLL combo box we should invoke the add
350 * add button, rather than the propsheet OK button. But I don't know how to do that!
354 if(LOWORD(wParam
) == IDC_DLLCOMBO
)
356 on_add_combo_change(hDlg
);
361 switch(LOWORD(wParam
)) {
362 case IDC_RAD_BUILTIN
:
364 case IDC_RAD_BUILTIN_NATIVE
:
365 case IDC_RAD_NATIVE_BUILTIN
:
366 case IDC_RAD_DISABLE
:
367 set_dllmode(hDlg
, LOWORD(wParam
));
370 case IDC_DLLS_ADDDLL
:
373 case IDC_DLLS_REMOVEDLL
:
374 on_remove_click(hDlg
);
379 set_controls_from_selection(hDlg
);