Made the registry cache more general.
This commit is contained in:
parent
f192bb60f8
commit
3bbb7fd243
|
@ -40,7 +40,7 @@ static void update_comboboxes(HWND dialog)
|
|||
char *winver;
|
||||
|
||||
/* retrieve the registry values */
|
||||
winver = get_reg_key(keypath(""), "Version", "");
|
||||
winver = get_reg_key(config_key, keypath(""), "Version", "");
|
||||
|
||||
/* empty winver means use automatic mode (ie the builtin dll linkage heuristics) */
|
||||
WINE_TRACE("winver is %s\n", *winver != '\0' ? winver : "null (automatic mode)");
|
||||
|
@ -279,7 +279,7 @@ static void on_remove_app_click(HWND dialog)
|
|||
assert( selection != 0 ); /* user cannot click this button when "default settings" is selected */
|
||||
|
||||
section[strlen(section)] = '\0'; /* remove last backslash */
|
||||
set_reg_key(section, NULL, NULL); /* delete the section */
|
||||
set_reg_key(config_key, section, NULL, NULL); /* delete the section */
|
||||
ListView_DeleteItem(listview, selection);
|
||||
ListView_SetItemState(listview, selection - 1, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
|
||||
|
||||
|
@ -296,12 +296,12 @@ static void on_winver_change(HWND dialog)
|
|||
if (selection == 0)
|
||||
{
|
||||
WINE_TRACE("automatic/default selected so removing current setting\n");
|
||||
set_reg_key(keypath(""), "Version", NULL);
|
||||
set_reg_key(config_key, keypath(""), "Version", NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
WINE_TRACE("setting Version key to value '%s'\n", ver[selection - 1].szVersion);
|
||||
set_reg_key(keypath(""), "Version", ver[selection - 1].szVersion);
|
||||
set_reg_key(config_key, keypath(""), "Version", ver[selection - 1].szVersion);
|
||||
}
|
||||
|
||||
/* enable the apply button */
|
||||
|
|
|
@ -55,7 +55,7 @@ static void selectAudioDriver(HWND hDlg, const char *drivername)
|
|||
{
|
||||
if (!strcmp (pAudioDrv->szDriver, drivername))
|
||||
{
|
||||
set_reg_key("Drivers", "Audio", (char *) pAudioDrv->szDriver);
|
||||
set_reg_key(config_key, "Drivers", "Audio", (char *) pAudioDrv->szDriver);
|
||||
SendMessage(GetParent(hDlg), PSM_CHANGED, (WPARAM) hDlg, 0); /* enable apply button */
|
||||
SendDlgItemMessage(hDlg, IDC_AUDIO_DRIVER, CB_SETCURSEL,
|
||||
(WPARAM) i, 0);
|
||||
|
@ -66,7 +66,7 @@ static void selectAudioDriver(HWND hDlg, const char *drivername)
|
|||
|
||||
static void initAudioDlg (HWND hDlg)
|
||||
{
|
||||
char *curAudioDriver = get_reg_key("Drivers", "Audio", "alsa");
|
||||
char *curAudioDriver = get_reg_key(config_key, "Drivers", "Audio", "alsa");
|
||||
const AUDIO_DRIVER *pAudioDrv = NULL;
|
||||
int i;
|
||||
|
||||
|
|
|
@ -310,14 +310,14 @@ static int fill_drives_list(HWND dialog)
|
|||
static void on_options_click(HWND dialog)
|
||||
{
|
||||
if (IsDlgButtonChecked(dialog, IDC_SHOW_DIRSYM_LINK) == BST_CHECKED)
|
||||
set_reg_key("", "ShowDirSymLinks", "Y");
|
||||
set_reg_key(config_key, "", "ShowDirSymLinks", "Y");
|
||||
else
|
||||
set_reg_key("", "ShowDirSymLinks", "N");
|
||||
set_reg_key(config_key, "", "ShowDirSymLinks", "N");
|
||||
|
||||
if (IsDlgButtonChecked(dialog, IDC_SHOW_DOT_FILES) == BST_CHECKED)
|
||||
set_reg_key("", "ShowDotFiles", "Y");
|
||||
set_reg_key(config_key, "", "ShowDotFiles", "Y");
|
||||
else
|
||||
set_reg_key("", "ShowDotFiles", "N");
|
||||
set_reg_key(config_key, "", "ShowDotFiles", "N");
|
||||
}
|
||||
|
||||
static void on_add_click(HWND dialog)
|
||||
|
@ -684,10 +684,10 @@ static void init_listview_columns(HWND dialog)
|
|||
|
||||
static void load_drive_options(HWND dialog)
|
||||
{
|
||||
if (!strcmp(get_reg_key("", "ShowDirSymLinks", "N"), "Y"))
|
||||
if (!strcmp(get_reg_key(config_key, "", "ShowDirSymLinks", "N"), "Y"))
|
||||
CheckDlgButton(dialog, IDC_SHOW_DIRSYM_LINK, BST_CHECKED);
|
||||
|
||||
if (!strcmp(get_reg_key("", "ShowDotFiles", "N"), "Y"))
|
||||
if (!strcmp(get_reg_key(config_key, "", "ShowDotFiles", "N"), "Y"))
|
||||
CheckDlgButton(dialog, IDC_SHOW_DOT_FILES, BST_CHECKED);
|
||||
}
|
||||
|
||||
|
|
|
@ -174,7 +174,7 @@ static void clear_settings(HWND dialog)
|
|||
|
||||
static void load_library_settings(HWND dialog)
|
||||
{
|
||||
char **overrides = enumerate_values(keypath("DllOverrides"));
|
||||
char **overrides = enumerate_values(config_key, keypath("DllOverrides"));
|
||||
char **p;
|
||||
int sel, count = 0;
|
||||
|
||||
|
@ -201,7 +201,7 @@ static void load_library_settings(HWND dialog)
|
|||
const char *label;
|
||||
struct dll *dll;
|
||||
|
||||
value = get_reg_key(keypath("DllOverrides"), *p, NULL);
|
||||
value = get_reg_key(config_key, keypath("DllOverrides"), *p, NULL);
|
||||
|
||||
label = mode_to_label(string_to_mode(value));
|
||||
|
||||
|
@ -273,7 +273,7 @@ static void set_dllmode(HWND dialog, DWORD id)
|
|||
WINE_TRACE("Setting %s to %s\n", dll->name, str);
|
||||
|
||||
SendMessage(GetParent(dialog), PSM_CHANGED, 0, 0);
|
||||
set_reg_key(keypath("DllOverrides"), dll->name, str);
|
||||
set_reg_key(config_key, keypath("DllOverrides"), dll->name, str);
|
||||
|
||||
load_library_settings(dialog); /* ... and refresh */
|
||||
}
|
||||
|
@ -292,7 +292,7 @@ static void on_add_click(HWND dialog)
|
|||
WINE_TRACE("Adding %s as native, builtin", buffer);
|
||||
|
||||
SendMessage(GetParent(dialog), PSM_CHANGED, 0, 0);
|
||||
set_reg_key(keypath("DllOverrides"), buffer, "native,builtin");
|
||||
set_reg_key(config_key, keypath("DllOverrides"), buffer, "native,builtin");
|
||||
|
||||
load_library_settings(dialog);
|
||||
|
||||
|
@ -313,7 +313,7 @@ static void on_remove_click(HWND dialog)
|
|||
SendDlgItemMessage(dialog, IDC_DLLS_LIST, LB_DELETESTRING, sel, 0);
|
||||
|
||||
SendMessage(GetParent(dialog), PSM_CHANGED, 0, 0);
|
||||
set_reg_key(keypath("DllOverrides"), dll->name, NULL);
|
||||
set_reg_key(config_key, keypath("DllOverrides"), dll->name, NULL);
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, dll->name);
|
||||
HeapFree(GetProcessHeap(), 0, dll);
|
||||
|
|
|
@ -81,7 +81,7 @@ void set_window_title(HWND dialog)
|
|||
* not. Caller is responsible for releasing the result.
|
||||
*
|
||||
*/
|
||||
static char *get_config_key (const char *subkey, const char *name, const char *def)
|
||||
static char *get_config_key (HKEY root, const char *subkey, const char *name, const char *def)
|
||||
{
|
||||
LPBYTE buffer = NULL;
|
||||
DWORD len;
|
||||
|
@ -90,7 +90,7 @@ static char *get_config_key (const char *subkey, const char *name, const char *d
|
|||
|
||||
WINE_TRACE("subkey=%s, name=%s, def=%s\n", subkey, name, def);
|
||||
|
||||
res = RegOpenKey(config_key, subkey, &hSubKey);
|
||||
res = RegOpenKey(root, subkey, &hSubKey);
|
||||
if (res != ERROR_SUCCESS)
|
||||
{
|
||||
if (res == ERROR_FILE_NOT_FOUND)
|
||||
|
@ -123,7 +123,7 @@ static char *get_config_key (const char *subkey, const char *name, const char *d
|
|||
|
||||
WINE_TRACE("buffer=%s\n", buffer);
|
||||
end:
|
||||
if (hSubKey && hSubKey != config_key) RegCloseKey(hSubKey);
|
||||
if (hSubKey && hSubKey != root) RegCloseKey(hSubKey);
|
||||
|
||||
return (char*)buffer;
|
||||
}
|
||||
|
@ -139,7 +139,7 @@ end:
|
|||
*
|
||||
* If valueName or value is NULL, an empty section will be created
|
||||
*/
|
||||
static int set_config_key(const char *subkey, const char *name, const char *value) {
|
||||
static int set_config_key(HKEY root, const char *subkey, const char *name, const char *value) {
|
||||
DWORD res = 1;
|
||||
HKEY key = NULL;
|
||||
|
||||
|
@ -149,10 +149,10 @@ static int set_config_key(const char *subkey, const char *name, const char *valu
|
|||
|
||||
if (subkey[0])
|
||||
{
|
||||
res = RegCreateKey(config_key, subkey, &key);
|
||||
res = RegCreateKey(root, subkey, &key);
|
||||
if (res != ERROR_SUCCESS) goto end;
|
||||
}
|
||||
else key = config_key;
|
||||
else key = root;
|
||||
if (name == NULL || value == NULL) goto end;
|
||||
|
||||
res = RegSetValueEx(key, name, 0, REG_SZ, value, strlen(value) + 1);
|
||||
|
@ -160,7 +160,7 @@ static int set_config_key(const char *subkey, const char *name, const char *valu
|
|||
|
||||
res = 0;
|
||||
end:
|
||||
if (key && key != config_key) RegCloseKey(key);
|
||||
if (key && key != root) RegCloseKey(key);
|
||||
if (res != 0) WINE_ERR("Unable to set configuration key %s in section %s to %s, res=%ld\n", name, subkey, value, res);
|
||||
return res;
|
||||
}
|
||||
|
@ -168,14 +168,14 @@ end:
|
|||
/* removes the requested value from the registry, however, does not
|
||||
* remove the section if empty. Returns S_OK (0) on success.
|
||||
*/
|
||||
static HRESULT remove_value(const char *subkey, const char *name)
|
||||
static HRESULT remove_value(HKEY root, const char *subkey, const char *name)
|
||||
{
|
||||
HRESULT hr;
|
||||
HKEY key;
|
||||
|
||||
WINE_TRACE("subkey=%s, name=%s\n", subkey, name);
|
||||
|
||||
hr = RegOpenKey(config_key, subkey, &key);
|
||||
hr = RegOpenKey(root, subkey, &key);
|
||||
if (hr != S_OK) return hr;
|
||||
|
||||
hr = RegDeleteValue(key, name);
|
||||
|
@ -185,10 +185,10 @@ static HRESULT remove_value(const char *subkey, const char *name)
|
|||
}
|
||||
|
||||
/* removes the requested subkey from the registry, assuming it exists */
|
||||
static HRESULT remove_path(char *section) {
|
||||
static HRESULT remove_path(HKEY root, char *section) {
|
||||
WINE_TRACE("section=%s\n", section);
|
||||
|
||||
return RegDeleteKey(config_key, section);
|
||||
return RegDeleteKey(root, section);
|
||||
}
|
||||
|
||||
|
||||
|
@ -209,7 +209,8 @@ static HRESULT remove_path(char *section) {
|
|||
struct setting
|
||||
{
|
||||
struct list entry;
|
||||
char *path; /* path in the registry rooted at the config key */
|
||||
HKEY root; /* the key on which path is rooted */
|
||||
char *path; /* path in the registry rooted at root */
|
||||
char *name; /* name of the registry value. if null, this means delete the key */
|
||||
char *value; /* contents of the registry value. if null, this means delete the value */
|
||||
};
|
||||
|
@ -240,7 +241,7 @@ static void free_setting(struct setting *setting)
|
|||
* If already in the list, the contents as given there will be
|
||||
* returned. You are expected to HeapFree the result.
|
||||
*/
|
||||
char *get_reg_key(const char *path, const char *name, const char *def)
|
||||
char *get_reg_key(HKEY root, const char *path, const char *name, const char *def)
|
||||
{
|
||||
struct list *cursor;
|
||||
struct setting *s;
|
||||
|
@ -253,6 +254,7 @@ char *get_reg_key(const char *path, const char *name, const char *def)
|
|||
{
|
||||
s = LIST_ENTRY(cursor, struct setting, entry);
|
||||
|
||||
if (root != s->root) continue;
|
||||
if (strcasecmp(path, s->path) != 0) continue;
|
||||
if (strcasecmp(name, s->name) != 0) continue;
|
||||
|
||||
|
@ -261,7 +263,7 @@ char *get_reg_key(const char *path, const char *name, const char *def)
|
|||
}
|
||||
|
||||
/* no, so get from the registry */
|
||||
val = get_config_key(path, name, def);
|
||||
val = get_config_key(root, path, name, def);
|
||||
|
||||
WINE_TRACE("returning %s\n", val);
|
||||
|
||||
|
@ -281,7 +283,7 @@ char *get_reg_key(const char *path, const char *name, const char *def)
|
|||
*
|
||||
* These values will be copied when necessary.
|
||||
*/
|
||||
void set_reg_key(const char *path, const char *name, const char *value)
|
||||
void set_reg_key(HKEY root, const char *path, const char *name, const char *value)
|
||||
{
|
||||
struct list *cursor;
|
||||
struct setting *s;
|
||||
|
@ -295,6 +297,7 @@ void set_reg_key(const char *path, const char *name, const char *value)
|
|||
{
|
||||
struct setting *s = LIST_ENTRY(cursor, struct setting, entry);
|
||||
|
||||
if (root != s->root) continue;
|
||||
if (strcasecmp(s->path, path) != 0) continue;
|
||||
if ((s->name && name) && strcasecmp(s->name, name) != 0) continue;
|
||||
|
||||
|
@ -323,6 +326,7 @@ void set_reg_key(const char *path, const char *name, const char *value)
|
|||
|
||||
/* otherwise add a new setting for it */
|
||||
s = HeapAlloc(GetProcessHeap(), 0, sizeof(struct setting));
|
||||
s->root = root;
|
||||
s->path = strdupA(path);
|
||||
s->name = name ? strdupA(name) : NULL;
|
||||
s->value = value ? strdupA(value) : NULL;
|
||||
|
@ -337,7 +341,7 @@ void set_reg_key(const char *path, const char *name, const char *value)
|
|||
* you are expected to HeapFree each element of the array, which is null
|
||||
* terminated, as well as the array itself.
|
||||
*/
|
||||
char **enumerate_values(char *path)
|
||||
char **enumerate_values(HKEY root, char *path)
|
||||
{
|
||||
HKEY key;
|
||||
DWORD res, i = 0;
|
||||
|
@ -345,7 +349,7 @@ char **enumerate_values(char *path)
|
|||
int valueslen = 0;
|
||||
struct list *cursor;
|
||||
|
||||
res = RegOpenKey(config_key, path, &key);
|
||||
res = RegOpenKey(root, path, &key);
|
||||
if (res == ERROR_SUCCESS)
|
||||
{
|
||||
while (TRUE)
|
||||
|
@ -444,9 +448,9 @@ char **enumerate_values(char *path)
|
|||
* returns true if the given key/value pair exists in the registry or
|
||||
* has been written to.
|
||||
*/
|
||||
BOOL reg_key_exists(const char *path, const char *name)
|
||||
BOOL reg_key_exists(HKEY root, const char *path, const char *name)
|
||||
{
|
||||
char *val = get_reg_key(path, name, NULL);
|
||||
char *val = get_reg_key(root, path, name, NULL);
|
||||
|
||||
if (val)
|
||||
{
|
||||
|
@ -462,13 +466,13 @@ static void process_setting(struct setting *s)
|
|||
if (s->value)
|
||||
{
|
||||
WINE_TRACE("Setting %s:%s to '%s'\n", s->path, s->name, s->value);
|
||||
set_config_key(s->path, s->name, s->value);
|
||||
set_config_key(s->root, s->path, s->name, s->value);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* NULL name means remove that path/section entirely */
|
||||
if (s->path && s->name) remove_value(s->path, s->name);
|
||||
else if (s->path && !s->name) remove_path(s->path);
|
||||
if (s->path && s->name) remove_value(s->root, s->path, s->name);
|
||||
else if (s->path && !s->name) remove_path(s->root, s->path);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -44,15 +44,18 @@ extern char *current_app; /* NULL means editing global settings */
|
|||
set_reg_key won't be committed to the registry until process_all_settings is called,
|
||||
however get_reg_key will still return accurate information.
|
||||
|
||||
The root HKEY has to be non-ambiguous. So only the registry roots (HKCU, HKLM, ...) or
|
||||
the global config_key are allowed here.
|
||||
|
||||
You are expected to HeapFree the result of get_reg_key. The parameters to set_reg_key will
|
||||
be copied, so free them too when necessary.
|
||||
*/
|
||||
|
||||
void set_reg_key(const char *path, const char *name, const char *value);
|
||||
char *get_reg_key(const char *path, const char *name, const char *def);
|
||||
BOOL reg_key_exists(const char *path, const char *name);
|
||||
void set_reg_key(HKEY root, const char *path, const char *name, const char *value);
|
||||
char *get_reg_key(HKEY root, const char *path, const char *name, const char *def);
|
||||
BOOL reg_key_exists(HKEY root, const char *path, const char *name);
|
||||
void apply(void);
|
||||
char **enumerate_values(char *path);
|
||||
char **enumerate_values(HKEY root, char *path);
|
||||
|
||||
/* returns a string of the form "AppDefaults\\appname.exe\\section", or just "section" if
|
||||
the user is editing the global settings.
|
||||
|
|
|
@ -44,7 +44,7 @@ static void update_gui_for_desktop_mode(HWND dialog) {
|
|||
updating_ui = TRUE;
|
||||
|
||||
/* do we have desktop mode enabled? */
|
||||
if (reg_key_exists(keypath("X11 Driver"), "Desktop"))
|
||||
if (reg_key_exists(config_key, keypath("X11 Driver"), "Desktop"))
|
||||
{
|
||||
char* buf, *bufindex;
|
||||
CheckDlgButton(dialog, IDC_ENABLE_DESKTOP, BST_CHECKED);
|
||||
|
@ -54,7 +54,7 @@ static void update_gui_for_desktop_mode(HWND dialog) {
|
|||
enable(IDC_DESKTOP_SIZE);
|
||||
enable(IDC_DESKTOP_BY);
|
||||
|
||||
buf = get_reg_key(keypath("X11 Driver"), "Desktop", "640x480");
|
||||
buf = get_reg_key(config_key, keypath("X11 Driver"), "Desktop", "640x480");
|
||||
bufindex = strchr(buf, 'x');
|
||||
if (bufindex) {
|
||||
*bufindex = 0;
|
||||
|
@ -99,7 +99,7 @@ static void init_dialog (HWND dialog)
|
|||
SendDlgItemMessage(dialog, IDC_SCREEN_DEPTH, CB_ADDSTRING, 0, (LPARAM) "24 bit");
|
||||
SendDlgItemMessage(dialog, IDC_SCREEN_DEPTH, CB_ADDSTRING, 0, (LPARAM) "32 bit"); /* is this valid? */
|
||||
|
||||
buf = get_reg_key(keypath("X11 Driver"), "ScreenDepth", "24");
|
||||
buf = get_reg_key(config_key, keypath("X11 Driver"), "ScreenDepth", "24");
|
||||
if (strcmp(buf, "8") == 0)
|
||||
SendDlgItemMessage(dialog, IDC_SCREEN_DEPTH, CB_SETCURSEL, 0, 0);
|
||||
else if (strcmp(buf, "16") == 0)
|
||||
|
@ -115,14 +115,14 @@ static void init_dialog (HWND dialog)
|
|||
SendDlgItemMessage(dialog, IDC_DESKTOP_WIDTH, EM_LIMITTEXT, RES_MAXLEN, 0);
|
||||
SendDlgItemMessage(dialog, IDC_DESKTOP_HEIGHT, EM_LIMITTEXT, RES_MAXLEN, 0);
|
||||
|
||||
buf = get_reg_key(keypath("X11 Driver"), "DXGrab", "Y");
|
||||
buf = get_reg_key(config_key, keypath("X11 Driver"), "DXGrab", "Y");
|
||||
if (IS_OPTION_TRUE(*buf))
|
||||
CheckDlgButton(dialog, IDC_DX_MOUSE_GRAB, BST_CHECKED);
|
||||
else
|
||||
CheckDlgButton(dialog, IDC_DX_MOUSE_GRAB, BST_UNCHECKED);
|
||||
HeapFree(GetProcessHeap(), 0, buf);
|
||||
|
||||
buf = get_reg_key(keypath("X11 Driver"), "DesktopDoubleBuffered", "Y");
|
||||
buf = get_reg_key(config_key, keypath("X11 Driver"), "DesktopDoubleBuffered", "Y");
|
||||
if (IS_OPTION_TRUE(*buf))
|
||||
CheckDlgButton(dialog, IDC_DOUBLE_BUFFER, BST_CHECKED);
|
||||
else
|
||||
|
@ -154,7 +154,7 @@ static void set_from_desktop_edits(HWND dialog) {
|
|||
|
||||
new = HeapAlloc(GetProcessHeap(), 0, strlen(width) + strlen(height) + 2 /* x + terminator */);
|
||||
sprintf(new, "%sx%s", width, height);
|
||||
set_reg_key(keypath("X11 Driver"), "Desktop", new);
|
||||
set_reg_key(config_key, keypath("X11 Driver"), "Desktop", new);
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, width);
|
||||
HeapFree(GetProcessHeap(), 0, height);
|
||||
|
@ -167,7 +167,7 @@ static void on_enable_desktop_clicked(HWND dialog) {
|
|||
if (IsDlgButtonChecked(dialog, IDC_ENABLE_DESKTOP) == BST_CHECKED) {
|
||||
set_from_desktop_edits(dialog);
|
||||
} else {
|
||||
set_reg_key(keypath("X11 Driver"), "Desktop", NULL);
|
||||
set_reg_key(config_key, keypath("X11 Driver"), "Desktop", NULL);
|
||||
}
|
||||
|
||||
update_gui_for_desktop_mode(dialog);
|
||||
|
@ -181,23 +181,23 @@ static void on_screen_depth_changed(HWND dialog) {
|
|||
if (updating_ui) return;
|
||||
|
||||
*spaceIndex = '\0';
|
||||
set_reg_key(keypath("X11 Driver"), "ScreenDepth", newvalue);
|
||||
set_reg_key(config_key, keypath("X11 Driver"), "ScreenDepth", newvalue);
|
||||
HeapFree(GetProcessHeap(), 0, newvalue);
|
||||
}
|
||||
|
||||
static void on_dx_mouse_grab_clicked(HWND dialog) {
|
||||
if (IsDlgButtonChecked(dialog, IDC_DX_MOUSE_GRAB) == BST_CHECKED)
|
||||
set_reg_key(keypath("X11 Driver"), "DXGrab", "Y");
|
||||
set_reg_key(config_key, keypath("X11 Driver"), "DXGrab", "Y");
|
||||
else
|
||||
set_reg_key(keypath("X11 Driver"), "DXGrab", "N");
|
||||
set_reg_key(config_key, keypath("X11 Driver"), "DXGrab", "N");
|
||||
}
|
||||
|
||||
|
||||
static void on_double_buffer_clicked(HWND dialog) {
|
||||
if (IsDlgButtonChecked(dialog, IDC_DOUBLE_BUFFER) == BST_CHECKED)
|
||||
set_reg_key(keypath("X11 Driver"), "DesktopDoubleBuffered", "Y");
|
||||
set_reg_key(config_key, keypath("X11 Driver"), "DesktopDoubleBuffered", "Y");
|
||||
else
|
||||
set_reg_key(keypath("X11 Driver"), "DesktopDoubleBuffered", "N");
|
||||
set_reg_key(config_key, keypath("X11 Driver"), "DesktopDoubleBuffered", "N");
|
||||
}
|
||||
|
||||
INT_PTR CALLBACK
|
||||
|
|
Loading…
Reference in New Issue