[winecfg 14] AppDefaults page implemention, code cleanup
Mike Hearn
mike at theoretic.com
Mon Sep 29 10:38:28 CDT 2003
Mike Hearn <mike at theoretic.com>
Move Applications tab before Libraries tab
Add convenience makefile dependencies
Improve return_if_fail
Partly implement appdefaults UI
Replace usage of EnableWindow with clearer enable/disable macros
diff -ur --exclude-from=diff-exclusions ../head/programs/winecfg/drive.c programs/winecfg/drive.c
--- ../head/programs/winecfg/drive.c 2003-09-19 13:32:52.000000000 +0100
+++ programs/winecfg/drive.c 2003-09-29 16:36:24.000000000 +0100
@@ -285,52 +285,52 @@
#define BOX_MODE_CD_AUTODETECT 2
#define BOX_MODE_NONE 3
#define BOX_MODE_NORMAL 4
-void enable_labelserial_box(HWND hDlg, int mode)
+void enable_labelserial_box(HWND dialog, int mode)
{
WINE_TRACE("mode=%d\n", mode);
switch (mode) {
case BOX_MODE_CD_ASSIGN:
- EnableWindow( GetDlgItem( hDlg, IDC_RADIO_AUTODETECT ), 1 );
- EnableWindow( GetDlgItem( hDlg, IDC_RADIO_ASSIGN ), 1 );
- EnableWindow( GetDlgItem( hDlg, IDC_EDIT_DEVICE ), 0 );
- EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_BROWSE_DEVICE ), 0 );
- EnableWindow( GetDlgItem( hDlg, IDC_EDIT_SERIAL ), 1 );
- EnableWindow( GetDlgItem( hDlg, IDC_EDIT_LABEL ), 1 );
- EnableWindow( GetDlgItem( hDlg, IDC_STATIC_SERIAL ), 1);
- EnableWindow( GetDlgItem( hDlg, IDC_STATIC_LABEL ), 1);
+ enable(IDC_RADIO_AUTODETECT);
+ enable(IDC_RADIO_ASSIGN);
+ disable(IDC_EDIT_DEVICE);
+ disable(IDC_BUTTON_BROWSE_DEVICE);
+ enable(IDC_EDIT_SERIAL);
+ enable(IDC_EDIT_LABEL);
+ enable(IDC_STATIC_SERIAL);
+ enable(IDC_STATIC_LABEL);
break;
case BOX_MODE_CD_AUTODETECT:
- EnableWindow( GetDlgItem( hDlg, IDC_RADIO_AUTODETECT ), 1 );
- EnableWindow( GetDlgItem( hDlg, IDC_RADIO_ASSIGN ), 1 );
- EnableWindow( GetDlgItem( hDlg, IDC_EDIT_DEVICE ), 1 );
- EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_BROWSE_DEVICE ), 1 );
- EnableWindow( GetDlgItem( hDlg, IDC_EDIT_SERIAL ), 0 );
- EnableWindow( GetDlgItem( hDlg, IDC_EDIT_LABEL ), 0 );
- EnableWindow( GetDlgItem( hDlg, IDC_STATIC_SERIAL ), 0);
- EnableWindow( GetDlgItem( hDlg, IDC_STATIC_LABEL ), 0);
+ enable(IDC_RADIO_AUTODETECT);
+ enable(IDC_RADIO_ASSIGN);
+ enable(IDC_EDIT_DEVICE);
+ enable(IDC_BUTTON_BROWSE_DEVICE);
+ disable(IDC_EDIT_SERIAL);
+ disable(IDC_EDIT_LABEL);
+ disable(IDC_STATIC_SERIAL);
+ disable(IDC_STATIC_LABEL);
break;
case BOX_MODE_NONE:
- EnableWindow( GetDlgItem( hDlg, IDC_RADIO_AUTODETECT ), 0 );
- EnableWindow( GetDlgItem( hDlg, IDC_RADIO_ASSIGN ), 0 );
- EnableWindow( GetDlgItem( hDlg, IDC_EDIT_DEVICE ), 0 );
- EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_BROWSE_DEVICE ), 0 );
- EnableWindow( GetDlgItem( hDlg, IDC_EDIT_SERIAL ), 0 );
- EnableWindow( GetDlgItem( hDlg, IDC_EDIT_LABEL ), 0 );
- EnableWindow( GetDlgItem( hDlg, IDC_STATIC_SERIAL ), 0);
- EnableWindow( GetDlgItem( hDlg, IDC_STATIC_LABEL ), 0);
+ disable(IDC_RADIO_AUTODETECT);
+ disable(IDC_RADIO_ASSIGN);
+ disable(IDC_EDIT_DEVICE);
+ disable(IDC_BUTTON_BROWSE_DEVICE);
+ disable(IDC_EDIT_SERIAL);
+ disable(IDC_EDIT_LABEL);
+ disable(IDC_STATIC_SERIAL);
+ disable(IDC_STATIC_LABEL);
break;
case BOX_MODE_NORMAL:
- EnableWindow( GetDlgItem( hDlg, IDC_RADIO_AUTODETECT ), 0 );
- EnableWindow( GetDlgItem( hDlg, IDC_RADIO_ASSIGN ), 1 );
- EnableWindow( GetDlgItem( hDlg, IDC_EDIT_DEVICE ), 0 );
- EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_BROWSE_DEVICE ), 0 );
- EnableWindow( GetDlgItem( hDlg, IDC_EDIT_SERIAL ), 1 );
- EnableWindow( GetDlgItem( hDlg, IDC_EDIT_LABEL ), 1 );
- EnableWindow( GetDlgItem( hDlg, IDC_STATIC_SERIAL ), 1);
- EnableWindow( GetDlgItem( hDlg, IDC_STATIC_LABEL ), 1);
+ disable(IDC_RADIO_AUTODETECT);
+ enable(IDC_RADIO_ASSIGN);
+ disable(IDC_EDIT_DEVICE);
+ disable(IDC_BUTTON_BROWSE_DEVICE);
+ enable(IDC_EDIT_SERIAL);
+ enable(IDC_EDIT_LABEL);
+ enable(IDC_STATIC_SERIAL);
+ enable(IDC_STATIC_LABEL);
break;
}
}
diff -ur --exclude-from=diff-exclusions ../head/programs/winecfg/En.rc programs/winecfg/En.rc
--- ../head/programs/winecfg/En.rc 2003-09-25 12:04:48.000000000 +0100
+++ programs/winecfg/En.rc 2003-09-29 14:19:29.000000000 +0100
@@ -51,11 +51,23 @@
STYLE WS_CHILD | WS_DISABLED
FONT 8, "MS Sans Serif"
BEGIN
- CONTROL "List2",IDC_LIST_APPS,"SysListView32",LVS_LIST |
+/* CONTROL "List2",IDC_LIST_APPS,"SysListView32",LVS_LIST |
LVS_NOLABELWRAP | WS_BORDER | WS_TABSTOP,16,39,226,108
- GROUPBOX "Application Specific Setting",IDC_STATIC,8,4,244,151
- LTEXT "These settings allow you to overwrite Wine default settings (as specified in other configuration tabs) on a per-application basis.",
- IDC_STATIC,15,17,228,20
+ */
+ CONTROL "Configuring global settings",IDC_EDITING_GLOBAL,
+ "Button",BS_AUTORADIOBUTTON,8,8,244,10
+ CONTROL "Configuring application specific setttings",IDC_EDITING_APP,
+ "Button",BS_AUTORADIOBUTTON,8,18,244,10
+
+
+ LTEXT "Here you can override the default settings on a per-application basis:",
+ IDC_STATIC,8,35,244,20
+
+ LISTBOX IDC_LIST_APPS,8,48,244,108,WS_TABSTOP | WS_VSCROLL
+
+ PUSHBUTTON "Add new application...",IDC_ADD_APPDEFAULT,170,155,82,14
+ PUSHBUTTON "Remove",IDC_REMOVE_APPDEFAULT,130,155,37,14
+
END
IDD_X11DRVCFG DIALOG DISCARDABLE 0, 0, 260, 250
@@ -65,9 +77,9 @@
LTEXT "Screen color depth: ",IDC_STATIC,8,10,60,30
COMBOBOX IDC_SCREEN_DEPTH,70,8,180,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
- CONTROL "Can DirectX programs prevent the mouse leaving their window?",IDC_DX_MOUSE_GRAB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,35,242,8
- CONTROL "Enable desktop double buffering",IDC_DOUBLE_BUFFER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,45,242,8
- CONTROL "UseTakeFocus (FIXME)",IDC_USE_TAKE_FOCUS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,55,242,8
+ CONTROL "Can DirectX programs prevent the mouse leaving their window?",IDC_DX_MOUSE_GRAB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,35,230,8
+ CONTROL "Enable desktop double buffering",IDC_DOUBLE_BUFFER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,45,230,8
+ CONTROL "UseTakeFocus (FIXME)",IDC_USE_TAKE_FOCUS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,55,230,8
GROUPBOX " Window settings ",IDC_STATIC,8,25,244,120
diff -ur --exclude-from=diff-exclusions ../head/programs/winecfg/main.c programs/winecfg/main.c
--- ../head/programs/winecfg/main.c 2003-09-17 14:34:45.000000000 +0100
+++ programs/winecfg/main.c 2003-09-27 21:51:23.000000000 +0100
@@ -162,20 +162,6 @@
}
-INT_PTR CALLBACK
-AppDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
-{
- switch (uMsg)
- {
- case WM_COMMAND:
- break;
-
- default:
- break;
- }
- return FALSE;
-}
-
#define NUM_PROPERTY_PAGES 5
INT_PTR
doPropertySheet (HINSTANCE hInstance, HWND hOwner)
@@ -197,31 +183,31 @@
psp[0].lParam = 0;
/*
- * Fill out the (Libraries) PROPSHEETPAGE data structure
+ * Fill out the (Applications) PROPSHEETPAGE data structure
* for the property sheet
*/
psp[1].dwSize = sizeof (PROPSHEETPAGE);
psp[1].dwFlags = PSP_USETITLE;
psp[1].hInstance = hInstance;
- psp[1].u.pszTemplate = MAKEINTRESOURCE (IDD_DLLCFG);
+ psp[1].u.pszTemplate = MAKEINTRESOURCE (IDD_APPCFG);
psp[1].u2.pszIcon = NULL;
- psp[1].pfnDlgProc = DllDlgProc;
- psp[1].pszTitle = "Libraries";
+ psp[1].pfnDlgProc = AppDlgProc;
+ psp[1].pszTitle = "Applications";
psp[1].lParam = 0;
/*
- * Fill out the (Applications) PROPSHEETPAGE data structure
+ * Fill out the (Libraries) PROPSHEETPAGE data structure
* for the property sheet
*/
psp[2].dwSize = sizeof (PROPSHEETPAGE);
psp[2].dwFlags = PSP_USETITLE;
psp[2].hInstance = hInstance;
- psp[2].u.pszTemplate = MAKEINTRESOURCE (IDD_APPCFG);
+ psp[2].u.pszTemplate = MAKEINTRESOURCE (IDD_DLLCFG);
psp[2].u2.pszIcon = NULL;
- psp[2].pfnDlgProc = AppDlgProc;
- psp[2].pszTitle = "Applications";
+ psp[2].pfnDlgProc = DllDlgProc;
+ psp[2].pszTitle = "Libraries";
psp[2].lParam = 0;
-
+
/*
* Fill out the (X11Drv) PROPSHEETPAGE data structure
* for the property sheet
@@ -256,6 +242,7 @@
psh.nPages = NUM_PROPERTY_PAGES;
psh.u3.ppsp = (LPCPROPSHEETPAGE) & psp;
psh.pfnCallback = (PFNPROPSHEETCALLBACK) PropSheetCallback;
+ psh.u2.nStartPage = 0;
/*
* Display the modal property sheet
@@ -293,8 +280,9 @@
InitCommonControls ();
if (doPropertySheet (hInstance, NULL) > 0) {
WINE_TRACE("OK\n");
- } else
+ } else {
WINE_TRACE("Cancel\n");
+ }
ExitProcess (0);
diff -ur --exclude-from=diff-exclusions ../head/programs/winecfg/Makefile.in programs/winecfg/Makefile.in
--- ../head/programs/winecfg/Makefile.in 2003-08-30 01:49:00.000000000 +0100
+++ programs/winecfg/Makefile.in 2003-09-29 14:24:40.000000000 +0100
@@ -11,10 +11,14 @@
main.c \
properties.c \
winecfg.c \
- x11drvdlg.c
+ x11drvdlg.c \
+ appdefaults.c
RC_SRCS = winecfg.rc
@MAKE_PROG_RULES@
### Dependencies:
+winecfg.res: En.rc
+
+winecfg.o: winecfg.h
\ No newline at end of file
diff -ur --exclude-from=diff-exclusions ../head/programs/winecfg/resource.h programs/winecfg/resource.h
--- ../head/programs/winecfg/resource.h 2003-09-25 12:04:52.000000000 +0100
+++ programs/winecfg/resource.h 2003-09-29 14:18:50.000000000 +0100
@@ -45,7 +45,6 @@
#define IDC_SYSCOLORS 1017
#define IDC_PRIVATEMAP 1018
#define IDC_PERFECTGRAPH 1019
-#define IDC_LIST_APPS 1021
#define IDC_MANAGED 1022
#define IDC_DESKTOP_WIDTH 1023
#define IDC_DESKTOP_HEIGHT 1024
@@ -67,6 +66,8 @@
#define IDC_EDIT_REAL 1039
#define IDC_BUTTON_REAL 1040
#define IDC_BUTTON_FOLDERS 1041
+
+/* drive editing */
#define IDC_LIST_DRIVES 1042
#define IDC_BUTTON_ADD 1043
#define IDC_BUTTON_REMOVE 1044
@@ -102,8 +103,17 @@
#define IDC_STATIC_LABEL 1073
#define IDC_ENABLE_DESKTOP 1074
#define IDS_DRIVE_NO_C 1075
+
+/* x11drv */
#define IDC_ENABLE_MANAGED 1076
#define IDC_SCREEN_DEPTH 1077
#define IDC_DX_MOUSE_GRAB 1078
#define IDC_USE_TAKE_FOCUS 1079
#define IDC_DOUBLE_BUFFER 1080
+
+/* applications tab */
+#define IDC_LIST_APPS 1021
+#define IDC_EDITING_GLOBAL 1081
+#define IDC_EDITING_APP 1082
+#define IDC_ADD_APPDEFAULT 1083
+#define IDC_REMOVE_APPDEFAULT 1084
diff -ur --exclude-from=diff-exclusions ../head/programs/winecfg/winecfg.c programs/winecfg/winecfg.c
--- ../head/programs/winecfg/winecfg.c 2003-09-25 12:00:59.000000000 +0100
+++ programs/winecfg/winecfg.c 2003-09-29 16:35:28.000000000 +0100
@@ -22,7 +22,6 @@
* TODO: (in rough order of priority)
* - A mind bogglingly vast amount of stuff
*
- * - Complete X11DRV page, so all controls are hooked up
* - Implement autodetect for drive configuration
* - Figure out whether we need the virtual vs real drive selection stuff at the top of the property page
* - Implement explicit mode vs instant-apply mode
@@ -36,6 +35,10 @@
* Minor things that should be done someday:
* - Make the desktop size UI a combo box, with a Custom option, so it's more obvious what you might want to choose here
*
+ * BUGS:
+ * - WineLook default fallback doesn't work
+ * - x11drv page triggers key writes on entry
+ *
*/
#include <assert.h>
@@ -94,7 +97,7 @@
}
goto end;
}
-
+
res = RegQueryValueExA( hSubKey, valueName, NULL, NULL, NULL, &dataLength);
if( res == ERROR_FILE_NOT_FOUND ) {
WINE_TRACE("Value not present - using default\n");
diff -ur --exclude-from=diff-exclusions ../head/programs/winecfg/winecfg.h programs/winecfg/winecfg.h
--- ../head/programs/winecfg/winecfg.h 2003-09-19 13:32:55.000000000 +0100
+++ programs/winecfg/winecfg.h 2003-09-29 14:41:23.000000000 +0100
@@ -37,10 +37,10 @@
#define IS_OPTION_FALSE(ch) \
((ch) == 'n' || (ch) == 'N' || (ch) == 'f' || (ch) == 'F' || (ch) == '0')
-#define return_if_fail(try, ret) \
+#define return_if_fail(try) \
if (!(try)) { \
- WINE_ERR("assertion (##try) failed, returning\n"); \
- return ret; \
+ WINE_ERR("check (" #try ") at %s:%d failed, returning\n", __FILE__, __LINE__ - 1); \
+ return; \
}
#define WRITEME(owner) MessageBox(owner, "Write me!", "", MB_OK | MB_ICONEXCLAMATION);
@@ -63,6 +63,13 @@
extern int instantApply; /* non-zero means apply all changes instantly */
+#define EDITING_GLOBAL 0
+#define EDITING_APP 1
+extern int appSettings; /* non-zero means we are editing appdefault settings */
+
+/* returns a string of the form AppDefaults\\appname.exe\\section */
+/* no explicit free is needed of the string returned by this function */
+char *getSectionForApp(char *section);
/* Commits a transaction to the registry */
void processTransaction(struct transaction *trans);
@@ -101,10 +108,14 @@
INT_PTR CALLBACK DriveDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK DriveEditDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
+INT_PTR CALLBACK AppDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
/* some basic utilities to make win32 suck less */
char *getDialogItemText(HWND hDlg, WORD controlID);
+#define disable(id) EnableWindow(GetDlgItem(dialog, id), 0);
+#define enable(id) EnableWindow(GetDlgItem(dialog, id), 1);
-#define WINE_KEY_ROOT "Software\\Wine\\WineCfg\\Config"
+
+#define WINE_KEY_ROOT "Software\\Wine\\Wine\\Config"
#endif
diff -ur --exclude-from=diff-exclusions ../head/programs/winecfg/x11drvdlg.c programs/winecfg/x11drvdlg.c
--- ../head/programs/winecfg/x11drvdlg.c 2003-09-25 12:03:20.000000000 +0100
+++ programs/winecfg/x11drvdlg.c 2003-09-29 16:32:06.000000000 +0100
@@ -35,35 +35,37 @@
WINE_DEFAULT_DEBUG_CHANNEL(winecfg);
#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? */
+#define section (appSettings == EDITING_GLOBAL ? "x11drv" : (getSectionForApp("x11drv")))
int updatingUI;
-void updateGUIForDesktopMode(HWND hDlg) {
+void updateGUIForDesktopMode(HWND dialog) {
WINE_TRACE("\n");
updatingUI = TRUE;
/* do we have desktop mode enabled? */
if (doesConfigValueExist("x11drv", "Desktop") == S_OK) {
- CheckDlgButton(hDlg, IDC_ENABLE_DESKTOP, BST_CHECKED);
+ CheckDlgButton(dialog, IDC_ENABLE_DESKTOP, BST_CHECKED);
/* enable the controls */
- EnableWindow(GetDlgItem(hDlg, IDC_DESKTOP_WIDTH), 1);
- EnableWindow(GetDlgItem(hDlg, IDC_DESKTOP_HEIGHT), 1);
- EnableWindow(GetDlgItem(hDlg, IDC_DESKTOP_SIZE), 1);
- EnableWindow(GetDlgItem(hDlg, IDC_DESKTOP_BY), 1);
- SetWindowText(GetDlgItem(hDlg, IDC_DESKTOP_WIDTH), "640");
- SetWindowText(GetDlgItem(hDlg, IDC_DESKTOP_HEIGHT), "480");
+ enable(IDC_DESKTOP_WIDTH);
+ enable(IDC_DESKTOP_HEIGHT);
+ enable(IDC_DESKTOP_SIZE);
+ enable(IDC_DESKTOP_BY);
+
+ SetWindowText(GetDlgItem(dialog, IDC_DESKTOP_WIDTH), "640");
+ SetWindowText(GetDlgItem(dialog, IDC_DESKTOP_HEIGHT), "480");
}
else {
- CheckDlgButton(hDlg, IDC_ENABLE_DESKTOP, BST_UNCHECKED);
+ CheckDlgButton(dialog, IDC_ENABLE_DESKTOP, BST_UNCHECKED);
/* disable the controls */
- EnableWindow(GetDlgItem(hDlg, IDC_DESKTOP_WIDTH), 0);
- EnableWindow(GetDlgItem(hDlg, IDC_DESKTOP_HEIGHT), 0);
- EnableWindow(GetDlgItem(hDlg, IDC_DESKTOP_SIZE), 0);
- EnableWindow(GetDlgItem(hDlg, IDC_DESKTOP_BY), 0);
+ disable(IDC_DESKTOP_WIDTH);
+ disable(IDC_DESKTOP_HEIGHT);
+ disable(IDC_DESKTOP_SIZE);
+ disable(IDC_DESKTOP_BY);
- SetWindowText(GetDlgItem(hDlg, IDC_DESKTOP_WIDTH), "");
- SetWindowText(GetDlgItem(hDlg, IDC_DESKTOP_HEIGHT), "");
+ SetWindowText(GetDlgItem(dialog, IDC_DESKTOP_WIDTH), "");
+ SetWindowText(GetDlgItem(dialog, IDC_DESKTOP_HEIGHT), "");
}
updatingUI = FALSE;
--- /dev/null 2003-01-30 10:24:37.000000000 +0000
+++ programs/winecfg/appdefaults.c 2003-09-29 16:29:13.000000000 +0100
@@ -0,0 +1,147 @@
+/*
+ * Application defaults page
+ *
+ * Copyright 2003 Mike Hearn
+ *
+ * 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
+ *
+ */
+
+#include <stdio.h>
+
+#include "winecfg.h"
+#include <windef.h>
+#include <winbase.h>
+#include <winreg.h>
+#include <wine/debug.h>
+
+#include "resource.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(winecfg);
+
+int appSettings = EDITING_GLOBAL; /* start by editing global */
+char *currentApp; /* the app we are currently editing, or NULL if editing global */
+
+char *getSectionForApp(char *section) {
+ static char *lastResult = NULL;
+ if (lastResult) HeapFree(GetProcessHeap(), 0, lastResult);
+ lastResult = HeapAlloc(GetProcessHeap(), 0, strlen("AppDefaults\\") + strlen(currentApp) + 2 /* \\ */ + strlen(section) + 1 /* terminator */);
+ sprintf(lastResult, "AppDefaults\\%s\\%s", currentApp, section);
+ return lastResult;
+}
+
+static void configureFor(HWND dialog, int mode) {
+ CheckRadioButton(dialog, IDC_EDITING_GLOBAL, IDC_EDITING_APP, mode == EDITING_APP ? IDC_EDITING_APP : IDC_EDITING_GLOBAL);
+ if (mode == EDITING_GLOBAL) {
+ disable(IDC_LIST_APPS);
+ disable(IDC_ADD_APPDEFAULT);
+ disable(IDC_REMOVE_APPDEFAULT);
+ if (currentApp) HeapFree(GetProcessHeap(), 0, currentApp);
+ } else {
+ enable(IDC_LIST_APPS);
+ enable(IDC_ADD_APPDEFAULT);
+ enable(IDC_REMOVE_APPDEFAULT);
+ }
+ appSettings = mode;
+}
+
+/* fill the dialog with the current appdefault entries */
+static void refreshDialog(HWND dialog) {
+ HKEY key;
+ char *subKeyName = HeapAlloc(GetProcessHeap(), 0, MAX_NAME_LENGTH);
+ DWORD sizeOfSubKeyName = MAX_NAME_LENGTH;
+ int i, itemIndex;
+
+ WINE_TRACE("\n");
+
+ /* Clear the listbox */
+ SendMessageA(GetDlgItem(dialog, IDC_LIST_APPS), LB_RESETCONTENT, 0, 0);
+
+ return_if_fail(
+ RegCreateKey(HKEY_LOCAL_MACHINE, WINE_KEY_ROOT "\\AppDefaults", &key) == ERROR_SUCCESS
+ );
+
+ /* Iterate over each subkey in the AppDefaults tree */
+ for (i = 0;
+ RegEnumKeyEx(key, i, subKeyName, &sizeOfSubKeyName, NULL, NULL, NULL, NULL ) != ERROR_NO_MORE_ITEMS;
+ ++i, sizeOfSubKeyName = MAX_NAME_LENGTH) {
+
+ WINE_TRACE("appdefault entry=%s\n", subKeyName);
+ itemIndex = SendMessageA(GetDlgItem(dialog, IDC_LIST_APPS), LB_ADDSTRING ,(WPARAM) -1, (LPARAM) subKeyName);
+ }
+
+ configureFor(dialog, appSettings);
+
+ WINE_TRACE("done\n");
+ RegCloseKey(key);
+ HeapFree(GetProcessHeap(), 0, subKeyName);
+}
+
+static void onAppsListSelChange(HWND dialog) {
+ int newPos = SendDlgItemMessage(dialog, IDC_LIST_APPS, LB_GETCURSEL, 0, 0);
+ int appLen = SendDlgItemMessage(dialog, IDC_LIST_APPS, LB_GETTEXTLEN, newPos, 0);
+ if (currentApp) HeapFree(GetProcessHeap(), 0, currentApp);
+ currentApp = HeapAlloc(GetProcessHeap(), 0, appLen+1);
+ return_if_fail(
+ SendDlgItemMessage(dialog, IDC_LIST_APPS, LB_GETTEXT, newPos, (LPARAM) currentApp) != LB_ERR
+ );
+ WINE_TRACE("new selection is %s\n", currentApp);
+}
+
+INT_PTR CALLBACK
+AppDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ switch (uMsg)
+ {
+ case WM_COMMAND: switch (LOWORD(wParam)) {
+ case IDC_EDITING_APP:
+ configureFor(hDlg, EDITING_APP);
+ break;
+ case IDC_EDITING_GLOBAL:
+ configureFor(hDlg, EDITING_GLOBAL);
+ break;
+ case IDC_ADD_APPDEFAULT:
+ WRITEME(hDlg);
+ break;
+ case IDC_REMOVE_APPDEFAULT:
+ WRITEME(hDlg);
+ break;
+ case IDC_LIST_APPS:
+ if (HIWORD(wParam) == LBN_SELCHANGE) onAppsListSelChange(hDlg);
+ break;
+ }
+ break;
+
+ case WM_NOTIFY: switch(((LPNMHDR)lParam)->code) {
+ case PSN_KILLACTIVE:
+ SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
+ break;
+ case PSN_APPLY:
+ SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
+ break;
+ case PSN_SETACTIVE:
+ refreshDialog(hDlg);
+ break;
+
+ };
+ break;
+
+ case WM_INITDIALOG:
+ WINE_TRACE("Init appdefaults\n");
+ break;
+
+ }
+ return FALSE;
+}
More information about the wine-patches
mailing list