winecfg: Allow to configure the desktop separately for each application.

This commit is contained in:
Alexandre Julliard 2008-04-25 14:36:45 +02:00
parent ad5876734d
commit f0bd1ee70b
1 changed files with 64 additions and 55 deletions

View File

@ -28,6 +28,7 @@
#include <stdio.h> #include <stdio.h>
#include <windows.h> #include <windows.h>
#include <wine/unicode.h>
#include <wine/debug.h> #include <wine/debug.h>
#include "resource.h" #include "resource.h"
@ -45,6 +46,15 @@ WINE_DEFAULT_DEBUG_CHANNEL(winecfg);
static const WCHAR logpixels_reg[] = {'S','y','s','t','e','m','\\','C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\','H','a','r','d','w','a','r','e',' ','P','r','o','f','i','l','e','s','\\','C','u','r','r','e','n','t','\\','S','o','f','t','w','a','r','e','\\','F','o','n','t','s',0}; static const WCHAR logpixels_reg[] = {'S','y','s','t','e','m','\\','C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\','H','a','r','d','w','a','r','e',' ','P','r','o','f','i','l','e','s','\\','C','u','r','r','e','n','t','\\','S','o','f','t','w','a','r','e','\\','F','o','n','t','s',0};
static const WCHAR logpixels[] = {'L','o','g','P','i','x','e','l','s',0}; static const WCHAR logpixels[] = {'L','o','g','P','i','x','e','l','s',0};
static const WCHAR desktopW[] = {'D','e','s','k','t','o','p',0};
static const WCHAR defaultW[] = {'D','e','f','a','u','l','t',0};
static const WCHAR explorerW[] = {'E','x','p','l','o','r','e','r',0};
static const WCHAR explorer_desktopsW[] = {'E','x','p','l','o','r','e','r','\\',
'D','e','s','k','t','o','p','s',0};
static const WCHAR x11_driverW[] = {'X','1','1',' ','D','r','i','v','e','r',0};
static const WCHAR default_resW[] = {'8','0','0','x','6','0','0',0};
static struct SHADERMODE static struct SHADERMODE
{ {
UINT displayStrID; UINT displayStrID;
@ -58,64 +68,55 @@ static struct SHADERMODE
int updating_ui; int updating_ui;
static void update_gui_for_desktop_mode(HWND dialog) { /* convert the x11 desktop key to the new explorer config */
int desktopenabled = FALSE; static void convert_x11_desktop_key(void)
{
char *buf;
if (!(buf = get_reg_key(config_key, "X11 Driver", "Desktop", NULL))) return;
set_reg_key(config_key, "Explorer\\Desktops", "Default", buf);
set_reg_key(config_key, "Explorer", "Desktop", "Default");
set_reg_key(config_key, "X11 Driver", "Desktop", NULL);
HeapFree(GetProcessHeap(), 0, buf);
}
static void update_gui_for_desktop_mode(HWND dialog)
{
WCHAR *buf, *bufindex;
const WCHAR *desktop_name = current_app ? current_app : defaultW;
WINE_TRACE("\n"); WINE_TRACE("\n");
updating_ui = TRUE; updating_ui = TRUE;
if (current_app) buf = get_reg_keyW(config_key, explorer_desktopsW, desktop_name, NULL);
if (buf && (bufindex = strchrW(buf, 'x')))
{ {
disable(IDC_ENABLE_DESKTOP); *bufindex = 0;
disable(IDC_DESKTOP_WIDTH); ++bufindex;
disable(IDC_DESKTOP_HEIGHT); SetWindowTextW(GetDlgItem(dialog, IDC_DESKTOP_WIDTH), buf);
disable(IDC_DESKTOP_SIZE); SetWindowTextW(GetDlgItem(dialog, IDC_DESKTOP_HEIGHT), bufindex);
disable(IDC_DESKTOP_BY); } else {
return; SetWindowText(GetDlgItem(dialog, IDC_DESKTOP_WIDTH), "800");
SetWindowText(GetDlgItem(dialog, IDC_DESKTOP_HEIGHT), "600");
} }
enable(IDC_ENABLE_DESKTOP); HeapFree(GetProcessHeap(), 0, buf);
/* do we have desktop mode enabled? */ /* do we have desktop mode enabled? */
if (reg_key_exists(config_key, keypath("X11 Driver"), "Desktop")) if (reg_key_exists(config_key, keypath("Explorer"), "Desktop"))
{ {
char* buf, *bufindex;
CheckDlgButton(dialog, IDC_ENABLE_DESKTOP, BST_CHECKED); CheckDlgButton(dialog, IDC_ENABLE_DESKTOP, BST_CHECKED);
enable(IDC_DESKTOP_WIDTH);
buf = get_reg_key(config_key, keypath("X11 Driver"), "Desktop", "800x600"); enable(IDC_DESKTOP_HEIGHT);
/* note: this test must match the one in x11drv */ enable(IDC_DESKTOP_SIZE);
if( buf[0] != 'n' && buf[0] != 'N' && buf[0] != 'F' && buf[0] != 'f' enable(IDC_DESKTOP_BY);
&& buf[0] != '0') {
desktopenabled = TRUE;
enable(IDC_DESKTOP_WIDTH);
enable(IDC_DESKTOP_HEIGHT);
enable(IDC_DESKTOP_SIZE);
enable(IDC_DESKTOP_BY);
bufindex = strchr(buf, 'x');
if (bufindex) {
*bufindex = 0;
++bufindex;
SetWindowText(GetDlgItem(dialog, IDC_DESKTOP_WIDTH), buf);
SetWindowText(GetDlgItem(dialog, IDC_DESKTOP_HEIGHT), bufindex);
} else {
WINE_TRACE("Desktop registry entry is malformed\n");
SetWindowText(GetDlgItem(dialog, IDC_DESKTOP_WIDTH), "800");
SetWindowText(GetDlgItem(dialog, IDC_DESKTOP_HEIGHT), "600");
}
}
HeapFree(GetProcessHeap(), 0, buf);
} }
if (!desktopenabled) else
{ {
CheckDlgButton(dialog, IDC_ENABLE_DESKTOP, BST_UNCHECKED); CheckDlgButton(dialog, IDC_ENABLE_DESKTOP, BST_UNCHECKED);
disable(IDC_DESKTOP_WIDTH); disable(IDC_DESKTOP_WIDTH);
disable(IDC_DESKTOP_HEIGHT); disable(IDC_DESKTOP_HEIGHT);
disable(IDC_DESKTOP_SIZE); disable(IDC_DESKTOP_SIZE);
disable(IDC_DESKTOP_BY); disable(IDC_DESKTOP_BY);
SetWindowText(GetDlgItem(dialog, IDC_DESKTOP_WIDTH), "");
SetWindowText(GetDlgItem(dialog, IDC_DESKTOP_HEIGHT), "");
} }
updating_ui = FALSE; updating_ui = FALSE;
@ -126,6 +127,7 @@ static void init_dialog(HWND dialog)
unsigned int it; unsigned int it;
char* buf; char* buf;
convert_x11_desktop_key();
update_gui_for_desktop_mode(dialog); update_gui_for_desktop_mode(dialog);
updating_ui = TRUE; updating_ui = TRUE;
@ -182,30 +184,37 @@ static void init_dialog(HWND dialog)
updating_ui = FALSE; updating_ui = FALSE;
} }
static void set_from_desktop_edits(HWND dialog) { static void set_from_desktop_edits(HWND dialog)
char *width, *height, *new; {
static const WCHAR x[] = {'x',0};
static const WCHAR def_width[] = {'8','0','0',0};
static const WCHAR def_height[] = {'6','0','0',0};
WCHAR *width, *height, *new;
const WCHAR *desktop_name = current_app ? current_app : defaultW;
if (updating_ui) return; if (updating_ui) return;
WINE_TRACE("\n"); WINE_TRACE("\n");
width = get_text(dialog, IDC_DESKTOP_WIDTH); width = get_textW(dialog, IDC_DESKTOP_WIDTH);
height = get_text(dialog, IDC_DESKTOP_HEIGHT); height = get_textW(dialog, IDC_DESKTOP_HEIGHT);
if (width == NULL || strcmp(width, "") == 0) { if (!width || !width[0]) {
HeapFree(GetProcessHeap(), 0, width); HeapFree(GetProcessHeap(), 0, width);
width = strdupA("800"); width = strdupW(def_width);
} }
if (!height || !height[0]) {
if (height == NULL || strcmp(height, "") == 0) {
HeapFree(GetProcessHeap(), 0, height); HeapFree(GetProcessHeap(), 0, height);
height = strdupA("600"); height = strdupW(def_height);
} }
new = HeapAlloc(GetProcessHeap(), 0, strlen(width) + strlen(height) + 2 /* x + terminator */); new = HeapAlloc(GetProcessHeap(), 0, (strlenW(width) + strlenW(height) + 2) * sizeof(WCHAR));
sprintf(new, "%sx%s", width, height); strcpyW( new, width );
set_reg_key(config_key, keypath("X11 Driver"), "Desktop", new); strcatW( new, x );
strcatW( new, height );
set_reg_keyW(config_key, explorer_desktopsW, desktop_name, new);
set_reg_keyW(config_key, keypathW(explorerW), desktopW, desktop_name);
HeapFree(GetProcessHeap(), 0, width); HeapFree(GetProcessHeap(), 0, width);
HeapFree(GetProcessHeap(), 0, height); HeapFree(GetProcessHeap(), 0, height);
HeapFree(GetProcessHeap(), 0, new); HeapFree(GetProcessHeap(), 0, new);
@ -217,7 +226,7 @@ static void on_enable_desktop_clicked(HWND dialog) {
if (IsDlgButtonChecked(dialog, IDC_ENABLE_DESKTOP) == BST_CHECKED) { if (IsDlgButtonChecked(dialog, IDC_ENABLE_DESKTOP) == BST_CHECKED) {
set_from_desktop_edits(dialog); set_from_desktop_edits(dialog);
} else { } else {
set_reg_key(config_key, keypath("X11 Driver"), "Desktop", NULL); set_reg_key(config_key, keypath("Explorer"), "Desktop", NULL);
} }
update_gui_for_desktop_mode(dialog); update_gui_for_desktop_mode(dialog);