Sweden-Number/programs/winecfg/appdefaults.c

159 lines
4.7 KiB
C

/*
* 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 */
static int needToRefresh = 1;
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);
} 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:
if (SendDlgItemMessage(hDlg, IDC_LIST_APPS, LB_GETCURSEL, 0, 0) == LB_ERR) {
/* no selection, so select the first one */
SendDlgItemMessage(hDlg, IDC_LIST_APPS, LB_SETCURSEL, 0, 0);
onAppsListSelChange(hDlg);
}
configureFor(hDlg, EDITING_APP);
break;
case IDC_EDITING_GLOBAL:
configureFor(hDlg, EDITING_GLOBAL);
break;
case IDC_ADD_APPDEFAULT:
WRITEME(hDlg);
refreshDialog(hDlg);
break;
case IDC_REMOVE_APPDEFAULT:
WRITEME(hDlg);
refreshDialog(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:
if (needToRefresh) {
refreshDialog(hDlg);
needToRefresh = 0;
}
break;
}
break;
case WM_INITDIALOG:
WINE_TRACE("Init appdefaults\n");
break;
}
return FALSE;
}