This is what it looks like:
![Screenshot_20230310_015941](/uploads/99b3d279bcddbd40212808a045444a7b/Screenshot_20230310_015941.png)
-- v11: winecfg: Add an option to set WinRT app dark theme.
From: Mohamad Al-Jaf mohamadaljaf@gmail.com
--- dlls/windows.ui/tests/uisettings.c | 8 ++--- programs/winecfg/resource.h | 29 +++++++++-------- programs/winecfg/theme.c | 52 +++++++++++++++++++++++++++--- programs/winecfg/winecfg.rc | 30 ++++++++++------- 4 files changed, 87 insertions(+), 32 deletions(-)
diff --git a/dlls/windows.ui/tests/uisettings.c b/dlls/windows.ui/tests/uisettings.c index bd1e7a02d20..8d739cb7bef 100644 --- a/dlls/windows.ui/tests/uisettings.c +++ b/dlls/windows.ui/tests/uisettings.c @@ -152,15 +152,15 @@ static void test_UISettings(void) type = UIColorType_Foreground; hr = IUISettings3_GetColorValue( uisettings3, type, &value ); ok( hr == S_OK, "GetColorValue returned %#lx\n", hr ); - todo_wine ok( value.A == 255 && value.R == 255 && value.G == 255 && value.B == 255, - "got unexpected value.A == %d value.R == %d value.G == %d value.B == %d\n", value.A, value.R, value.G, value.B ); + ok( value.A == 255 && value.R == 255 && value.G == 255 && value.B == 255, + "got unexpected value.A == %d value.R == %d value.G == %d value.B == %d\n", value.A, value.R, value.G, value.B );
reset_color( &value ); type = UIColorType_Background; hr = IUISettings3_GetColorValue( uisettings3, type, &value ); ok( hr == S_OK, "GetColorValue returned %#lx\n", hr ); - todo_wine ok( value.A == 255 && value.R == 0 && value.G == 0 && value.B == 0, - "got unexpected value.A == %d value.R == %d value.G == %d value.B == %d\n", value.A, value.R, value.G, value.B ); + ok( value.A == 255 && value.R == 0 && value.G == 0 && value.B == 0, + "got unexpected value.A == %d value.R == %d value.G == %d value.B == %d\n", value.A, value.R, value.G, value.B );
done: set_app_theme( default_theme ); diff --git a/programs/winecfg/resource.h b/programs/winecfg/resource.h index dd46bc71b40..cd7eaaf711e 100644 --- a/programs/winecfg/resource.h +++ b/programs/winecfg/resource.h @@ -163,19 +163,22 @@ #define IDC_THEME_SIZECOMBO 1403 #define IDC_THEME_SIZETEXT 1404 #define IDC_THEME_THEMECOMBO 1405 -#define IDC_THEME_INSTALL 1406 -#define IDC_LIST_SFPATHS 1407 -#define IDC_LINK_SFPATH 1408 -#define IDC_EDIT_SFPATH 1409 -#define IDC_BROWSE_SFPATH 1410 -#define IDC_SYSPARAM_COMBO 1411 -#define IDC_SYSPARAM_SIZE_TEXT 1412 -#define IDC_SYSPARAM_SIZE 1413 -#define IDC_SYSPARAM_SIZE_UD 1414 -#define IDC_SYSPARAM_COLOR_TEXT 1415 -#define IDC_SYSPARAM_COLOR 1416 -#define IDC_SYSPARAM_FONT 1417 -#define IDC_ENABLE_FILE_ASSOCIATIONS 1418 +#define IDC_THEME_APPCOMBO 1406 +#define IDC_THEME_APPCOMBO_LIGHT 1407 +#define IDC_THEME_APPCOMBO_DARK 1408 +#define IDC_THEME_INSTALL 1409 +#define IDC_LIST_SFPATHS 1410 +#define IDC_LINK_SFPATH 1411 +#define IDC_EDIT_SFPATH 1412 +#define IDC_BROWSE_SFPATH 1413 +#define IDC_SYSPARAM_COMBO 1414 +#define IDC_SYSPARAM_SIZE_TEXT 1415 +#define IDC_SYSPARAM_SIZE 1416 +#define IDC_SYSPARAM_SIZE_UD 1417 +#define IDC_SYSPARAM_COLOR_TEXT 1418 +#define IDC_SYSPARAM_COLOR 1419 +#define IDC_SYSPARAM_FONT 1420 +#define IDC_ENABLE_FILE_ASSOCIATIONS 1421
#define IDC_SYSPARAMS_BUTTON 8400 #define IDC_SYSPARAMS_BUTTON_TEXT 8401 diff --git a/programs/winecfg/theme.c b/programs/winecfg/theme.c index bbc4d3cc11f..84337b4fcb1 100644 --- a/programs/winecfg/theme.c +++ b/programs/winecfg/theme.c @@ -418,11 +418,48 @@ static void enable_size_and_color_controls (HWND dialog, BOOL enable) EnableWindow (GetDlgItem (dialog, IDC_THEME_SIZECOMBO), enable); EnableWindow (GetDlgItem (dialog, IDC_THEME_SIZETEXT), enable); } + +static DWORD get_app_theme(void) +{ + DWORD ret = 0, len = sizeof(ret), type; + HKEY hkey; + + if (RegOpenKeyExW( HKEY_CURRENT_USER, L"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize", 0, KEY_QUERY_VALUE, &hkey )) + return 1; + if (RegQueryValueExW( hkey, L"AppsUseLightTheme", NULL, &type, (BYTE *)&ret, &len ) || type != REG_DWORD) + ret = 1; + + RegCloseKey( hkey ); + return ret; +}
static void init_dialog (HWND dialog) { - SendDlgItemMessageW(dialog, IDC_SYSPARAM_SIZE_UD, UDM_SETBUDDY, - (WPARAM)GetDlgItem(dialog, IDC_SYSPARAM_SIZE), 0); + DWORD apps_use_light_theme; + WCHAR apps_theme_str[256]; + + static const struct + { + int id; + DWORD value; + } + app_themes[] = + { + { IDC_THEME_APPCOMBO_LIGHT, 1 }, + { IDC_THEME_APPCOMBO_DARK, 0 }, + }; + + SendDlgItemMessageW( dialog, IDC_THEME_APPCOMBO, CB_RESETCONTENT, 0, 0 ); + + LoadStringW( GetModuleHandleW(NULL), app_themes[0].id, apps_theme_str, ARRAY_SIZE(apps_theme_str) ); + SendDlgItemMessageW( dialog, IDC_THEME_APPCOMBO, CB_ADDSTRING, 0, (LPARAM)apps_theme_str ); + LoadStringW( GetModuleHandleW(NULL), app_themes[1].id, apps_theme_str, ARRAY_SIZE(apps_theme_str) ); + SendDlgItemMessageW( dialog, IDC_THEME_APPCOMBO, CB_ADDSTRING, 0, (LPARAM)apps_theme_str ); + + apps_use_light_theme = get_app_theme(); + SendDlgItemMessageW( dialog, IDC_THEME_APPCOMBO, CB_SETCURSEL, app_themes[apps_use_light_theme].value, 0 ); + + SendDlgItemMessageW( dialog, IDC_SYSPARAM_SIZE_UD, UDM_SETBUDDY, (WPARAM)GetDlgItem(dialog, IDC_SYSPARAM_SIZE), 0 ); }
static void update_dialog (HWND dialog) @@ -450,8 +487,9 @@ static void update_dialog (HWND dialog) }
static void on_theme_changed(HWND dialog) { - int index = SendMessageW (GetDlgItem (dialog, IDC_THEME_THEMECOMBO), - CB_GETCURSEL, 0, 0); + int index; + + index = SendMessageW (GetDlgItem (dialog, IDC_THEME_THEMECOMBO), CB_GETCURSEL, 0, 0); if (!update_color_and_size (index, GetDlgItem (dialog, IDC_THEME_COLORCOMBO), GetDlgItem (dialog, IDC_THEME_SIZECOMBO))) { @@ -463,6 +501,11 @@ static void on_theme_changed(HWND dialog) { { enable_size_and_color_controls (dialog, TRUE); } + + index = SendMessageW (GetDlgItem (dialog, IDC_THEME_APPCOMBO), CB_GETCURSEL, 0, 0); + set_reg_key_dword(HKEY_CURRENT_USER, L"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize", + L"AppsUseLightTheme", !index); + theme_dirty = TRUE; }
@@ -1148,6 +1191,7 @@ ThemeDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) if (updating_ui) break; switch (LOWORD(wParam)) { + case IDC_THEME_APPCOMBO: /* fall through */ case IDC_THEME_THEMECOMBO: on_theme_changed(hDlg); break; case IDC_THEME_COLORCOMBO: /* fall through */ case IDC_THEME_SIZECOMBO: theme_dirty = TRUE; break; diff --git a/programs/winecfg/winecfg.rc b/programs/winecfg/winecfg.rc index 8775b3b691b..b2b51ffbf70 100644 --- a/programs/winecfg/winecfg.rc +++ b/programs/winecfg/winecfg.rc @@ -92,6 +92,12 @@ BEGIN IDS_AUDIO_SPEAKER_MONO "Mono" END
+STRINGTABLE +BEGIN + IDC_THEME_APPCOMBO_LIGHT "Light" + IDC_THEME_APPCOMBO_DARK "Dark" +END + STRINGTABLE BEGIN IDC_SYSPARAMS_BUTTON "Controls Background" @@ -157,7 +163,7 @@ BEGIN PUSHBUTTON "Add appli&cation...",IDC_APP_ADDAPP, 15,174,112,14 PUSHBUTTON "&Remove application",IDC_APP_REMOVEAPP, 133,174,112,14 LTEXT "&Windows Version:",IDC_STATIC,17,196,80,8 - COMBOBOX IDC_WINVER,100,194,145,56,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_WINVER,100,194,145,56,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END
IDD_GRAPHCFG DIALOG 0, 0, 260, 220 @@ -195,7 +201,7 @@ BEGIN LTEXT "Existing &overrides:",IDC_STATIC,16,86,100,8 LISTBOX IDC_DLLS_LIST,16,96,140,112,WS_BORDER | WS_TABSTOP | WS_VSCROLL PUSHBUTTON "&Edit...",IDC_DLLS_EDITDLL,164,96,82,14 - PUSHBUTTON "&Remove",IDC_DLLS_REMOVEDLL,164,114,82,14 + PUSHBUTTON "&Remove",IDC_DLLS_REMOVEDLL,164,114,82,14 END
IDD_LOADORDER DIALOG 80, 90, 160, 92 @@ -238,10 +244,10 @@ BEGIN LTEXT "&Path:",IDC_STATIC_PATH,15,123,42,9 EDITTEXT IDC_EDIT_PATH,59,120,122,13,ES_AUTOHSCROLL | WS_TABSTOP PUSHBUTTON "&Browse...",IDC_BUTTON_BROWSE_PATH,186,120,60,13 - + LTEXT "&Type:",IDC_STATIC_TYPE,15,138,42,10 COMBOBOX IDC_COMBO_TYPE,59,135,77,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - + PUSHBUTTON "Show Advan&ced",IDC_BUTTON_SHOW_HIDE_ADVANCED,146,135,100,13 LTEXT "De&vice:",IDC_STATIC_DEVICE,15,153,42,9 EDITTEXT IDC_EDIT_DEVICE,59,150,122,13,ES_AUTOHSCROLL | WS_TABSTOP @@ -283,13 +289,15 @@ STYLE WS_CHILD | WS_DISABLED FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Appearance",IDC_STATIC,8,4,244,90 - LTEXT "&Theme:",IDC_STATIC,15,15,130,8 - COMBOBOX IDC_THEME_THEMECOMBO,15,25,130,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "&Install theme...",IDC_THEME_INSTALL,152,25,93,13 - LTEXT "&Color:",IDC_THEME_COLORTEXT,15,40,105,8 - COMBOBOX IDC_THEME_COLORCOMBO,15,50,105,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "&Size:",IDC_THEME_SIZETEXT,126,40,120,8 - COMBOBOX IDC_THEME_SIZECOMBO,126,50,120,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "&Theme:",IDC_STATIC,15,15,105,8 + COMBOBOX IDC_THEME_THEMECOMBO,15,25,105,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "&WinRT app theme:",IDC_STATIC,126,15,119,8 + COMBOBOX IDC_THEME_APPCOMBO,126,25,119,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "&Install theme...",IDC_THEME_INSTALL,157,50,88,13 + LTEXT "&Color:",IDC_THEME_COLORTEXT,15,40,60,8 + COMBOBOX IDC_THEME_COLORCOMBO,15,50,60,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "&Size:",IDC_THEME_SIZETEXT,80,40,71,8 + COMBOBOX IDC_THEME_SIZECOMBO,80,50,71,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP LTEXT "It&em:",IDC_STATIC,15,65,105,8 COMBOBOX IDC_SYSPARAM_COMBO,15,75,105,120,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP | CBS_SORT LTEXT "C&olor:",IDC_SYSPARAM_COLOR_TEXT,126,65,25,8,WS_DISABLED
I've tested all the translations for the languages that Wine supports and Hebrew seems to be the longest in terms of pixels. The second layout could not accommodate it.
This is the current version with the longest translations for `Install theme` and `WinRT app theme`:
![Screenshot_20230328_030931](/uploads/0fbfbd01b684facd9da54e57651e796e/Screenshot_20230328_030931.png)
Here it is in English:
![Screenshot_20230328_031657](/uploads/c527c7ba64557dc9c192d082179cfb6c/Screenshot_20230328_031657.png)
I made sure the elements lined up vertically using the ruler guidelines.