From 303bb28fc4df1091faa269ce30bbdbea6ffe1960 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Sun, 21 Apr 2013 14:36:57 +0000 Subject: [PATCH] [desk.cpl] - Overhaul the appearance tab - Fixed and tested to work almost flawlessly on windows xp and windows 7 - Implement selecting the size of a scheme - Implement loading the scheme from a visual style and allow the user to customize it before applying the visual style - Implement showing visual styles preview - Properly load and apply system metrics - Store the scheme in memory as NONCLIENTMETRICS and ICONMETRICS structs instead of arrays of sizes and fonts - Store the loaded themes in a list instead of a global array - Now that this works great in windows, it also mean that we have to modify our colour schemes in the registry to be in the same format with windows and also fix uxtheme to handle system metrics properly svn path=/trunk/; revision=58808 --- reactos/dll/cpl/desk/CMakeLists.txt | 2 + reactos/dll/cpl/desk/advappdlg.c | 295 +++---- reactos/dll/cpl/desk/appearance.c | 287 ++++--- reactos/dll/cpl/desk/appearance.h | 165 ++-- reactos/dll/cpl/desk/desk.h | 14 + reactos/dll/cpl/desk/draw.c | 6 +- reactos/dll/cpl/desk/draw.h | 4 + reactos/dll/cpl/desk/lang/bg-BG.rc | 5 +- reactos/dll/cpl/desk/lang/cs-CZ.rc | 5 +- reactos/dll/cpl/desk/lang/de-DE.rc | 5 +- reactos/dll/cpl/desk/lang/el-GR.rc | 5 +- reactos/dll/cpl/desk/lang/en-US.rc | 5 +- reactos/dll/cpl/desk/lang/es-ES.rc | 5 +- reactos/dll/cpl/desk/lang/fr-FR.rc | 5 +- reactos/dll/cpl/desk/lang/he-IL.rc | 5 +- reactos/dll/cpl/desk/lang/hu-HU.rc | 5 +- reactos/dll/cpl/desk/lang/id-ID.rc | 5 +- reactos/dll/cpl/desk/lang/it-IT.rc | 5 +- reactos/dll/cpl/desk/lang/ja-JP.rc | 5 +- reactos/dll/cpl/desk/lang/nl-NL.rc | 5 +- reactos/dll/cpl/desk/lang/no-NO.rc | 5 +- reactos/dll/cpl/desk/lang/pl-PL.rc | 5 +- reactos/dll/cpl/desk/lang/ro-RO.rc | 5 +- reactos/dll/cpl/desk/lang/ru-RU.rc | 5 +- reactos/dll/cpl/desk/lang/sk-SK.rc | 5 +- reactos/dll/cpl/desk/lang/sv-SE.rc | 5 +- reactos/dll/cpl/desk/lang/uk-UA.rc | 5 +- reactos/dll/cpl/desk/lang/zh-CN.rc | 5 +- reactos/dll/cpl/desk/preview.c | 153 ++-- reactos/dll/cpl/desk/preview.h | 21 +- reactos/dll/cpl/desk/resource.h | 2 + reactos/dll/cpl/desk/theme.c | 1109 ++++++++++++++++++--------- 32 files changed, 1293 insertions(+), 870 deletions(-) diff --git a/reactos/dll/cpl/desk/CMakeLists.txt b/reactos/dll/cpl/desk/CMakeLists.txt index c32c115adbd..b3c5579ad5a 100644 --- a/reactos/dll/cpl/desk/CMakeLists.txt +++ b/reactos/dll/cpl/desk/CMakeLists.txt @@ -22,6 +22,7 @@ add_library(desk SHARED desk.rc draw.c theme.c + muireg.c ${CMAKE_CURRENT_BINARY_DIR}/desk.def) set_module_type(desk cpl UNICODE) @@ -37,6 +38,7 @@ add_importlibs(desk ole32 setupapi shell32 + shlwapi uxtheme kernel32 ntdll) diff --git a/reactos/dll/cpl/desk/advappdlg.c b/reactos/dll/cpl/desk/advappdlg.c index 12cbe95826c..3f1edfcb884 100644 --- a/reactos/dll/cpl/desk/advappdlg.c +++ b/reactos/dll/cpl/desk/advappdlg.c @@ -24,30 +24,30 @@ typedef struct /* This const assigns the color and metric numbers to the elements from the elements list */ -/* Size 1 (width) Size 2 (height) Color 1 Color 2 Font Fontcolor */ +/* Size 1 (width) Size 2 (height) Color 1 Color 2 Font Fontcolor */ const ASSIGNMENT g_Assignment[NUM_ELEMENTS] = -{ {-1, -1, COLOR_DESKTOP, -1, -1, -1}, /* -Desktop */ - {SIZE_CAPTION_Y, -1, COLOR_INACTIVECAPTION, COLOR_GRADIENTINACTIVECAPTION, FONT_CAPTION, -1}, /* inactive window caption */ - {SIZE_BORDER_X, SIZE_BORDER_Y, COLOR_INACTIVEBORDER, -1, -1, -1}, /* inactive window border */ - {SIZE_CAPTION_Y, -1, COLOR_ACTIVECAPTION, COLOR_GRADIENTACTIVECAPTION, FONT_CAPTION, COLOR_CAPTIONTEXT}, /* -active window caption */ - {SIZE_BORDER_X, SIZE_BORDER_Y, COLOR_ACTIVEBORDER, -1, -1, -1}, /* active window border */ - {SIZE_MENU_SIZE_X, SIZE_MENU_Y, COLOR_MENU, -1, FONT_MENU, COLOR_MENUTEXT}, /* menu */ - {SIZE_MENU_SIZE_X, SIZE_MENU_Y, COLOR_HIGHLIGHT, -1, FONT_HILIGHT, COLOR_HIGHLIGHTTEXT}, /* marked element */ - {-1, -1, COLOR_WINDOW, -1 /*COLOR_WINDOWFRAME*/, -1, COLOR_WINDOWTEXT}, /* window */ - {SIZE_SCROLL_X, SIZE_SCROLL_Y, COLOR_SCROLLBAR, -1, -1, -1}, /* scroll bar */ - {-1, -1, COLOR_3DFACE, -1, -1, COLOR_BTNTEXT}, /* 3d objects */ - {SIZE_SMCAPTION_Y, -1, -1, -1, FONT_SMCAPTION, -1}, /* palette window caption */ - {-1, -1, -1, -1, -1, -1}, /* symbol caption FIXME: Access? */ - {SIZE_CAPTION_Y, -1, -1, -1, -1, -1}, /* caption bar */ - {-1, -1, -1, -1, -1, COLOR_GRAYTEXT}, /* inactive menu item FIXME: Access? */ - {-1, -1, -1, -1, FONT_DIALOG, COLOR_WINDOWTEXT}, /* dialog */ - {-1, -1, -1, -1, -1, -1}, /* scrollbar controls FIXME: Access? */ - {-1, -1, COLOR_APPWORKSPACE, -1, -1, -1}, /* application background */ - {-1, -1, -1, -1, -1, -1}, /* small caption bar FIXME: Access? */ - {SIZE_ICON_SPC_X, -1, -1, -1, -1, -1}, /* symbol distance horiz. */ - {SIZE_ICON_SPC_Y, -1, -1, -1, -1, -1}, /* symbol distance vert. */ - {-1, -1, COLOR_INFOBK, -1, FONT_INFO, COLOR_INFOTEXT}, /* quickinfo */ - {SIZE_ICON_X, SIZE_ICON_Y, -1, -1, FONT_ICON, -1}}; /* symbol */ +{ {-1, -1, COLOR_DESKTOP, -1, -1, -1}, /* -Desktop */ + {SIZE_CAPTION_HEIGHT, -1, COLOR_INACTIVECAPTION, COLOR_GRADIENTINACTIVECAPTION, FONT_CAPTION, -1}, /* inactive window caption */ + {SIZE_BORDER_WIDTH, -1, COLOR_INACTIVEBORDER, -1, -1, -1}, /* inactive window border */ + {SIZE_CAPTION_HEIGHT, -1, COLOR_ACTIVECAPTION, COLOR_GRADIENTACTIVECAPTION, FONT_CAPTION, COLOR_CAPTIONTEXT}, /* -active window caption */ + {SIZE_BORDER_WIDTH, -1, COLOR_ACTIVEBORDER, -1, -1, -1}, /* active window border */ + {SIZE_MENU_HEIGHT, SIZE_MENU_WIDTH, COLOR_MENU, -1, FONT_MENU, COLOR_MENUTEXT}, /* menu */ + {SIZE_MENU_HEIGHT, SIZE_MENU_WIDTH, COLOR_HIGHLIGHT, -1, -1, COLOR_HIGHLIGHTTEXT},/* marked element */ + {-1, -1, COLOR_WINDOW, -1 /*COLOR_WINDOWFRAME*/, -1, COLOR_WINDOWTEXT}, /* window */ + {SIZE_SCROLL_WIDTH, SIZE_SCROLL_HEIGHT, COLOR_SCROLLBAR, -1, -1, -1}, /* scroll bar */ + {-1, -1, COLOR_3DFACE, -1, -1, COLOR_BTNTEXT}, /* 3d objects */ + {SIZE_SM_CAPTION_HEIGHT, -1, -1, -1, FONT_SMCAPTION, -1}, /* palette window caption */ + {-1, -1, -1, -1, -1, -1}, /* symbol caption FIXME: Access? */ + {SIZE_CAPTION_HEIGHT, -1, -1, -1, -1, -1}, /* caption bar */ + {-1, -1, -1, -1, -1, COLOR_GRAYTEXT}, /* inactive menu item FIXME: Access? */ + {-1, -1, -1, -1, FONT_MESSAGE, COLOR_WINDOWTEXT}, /* dialog */ + {-1, -1, -1, -1, -1, -1}, /* scrollbar controls FIXME: Access? */ + {-1, -1, COLOR_APPWORKSPACE, -1, -1, -1}, /* application background */ + {-1, -1, -1, -1, -1, -1}, /* small caption bar FIXME: Access? */ + {SIZE_ICON_SPACE_X, -1, -1, -1, -1, -1}, /* symbol distance horiz. */ + {SIZE_ICON_SPACE_Y, -1, -1, -1, -1, -1}, /* symbol distance vert. */ + {-1, -1, COLOR_INFOBK, -1, FONT_STATUS, COLOR_INFOTEXT}, /* quickinfo */ + {SIZE_ICON, -1, -1, -1, FONT_ICON, -1}}; /* symbol */ /******************************************************************************/ @@ -231,20 +231,20 @@ UpdateControls(HWND hwndDlg, GLOBALS *g) UpdateButtonColor(hwndDlg, g, IDC_ADVAPPEARANCE_FONTCOLOR_B, 2, g_Assignment[iElement].FontColor); if (g_Assignment[iElement].Size != -1) - SetDlgItemInt(hwndDlg, IDC_ADVAPPEARANCE_SIZE_E, g->SchemeAdv.Size[g_Assignment[iElement].Size], FALSE); + SetDlgItemInt(hwndDlg, IDC_ADVAPPEARANCE_SIZE_E, SchemeGetMetric(&g->SchemeAdv, g_Assignment[iElement].Size), FALSE); else SetDlgItemText(hwndDlg, IDC_ADVAPPEARANCE_SIZE_E, TEXT("")); hdcDlg = GetDC(hwndDlg); if (g_Assignment[iElement].Font != -1) { - LOGFONT lfFont = g->SchemeAdv.lfFont[g_Assignment[iElement].Font]; + PLOGFONTW plfFont = SchemeGetFont(&g->SchemeAdv, g_Assignment[iElement].Font); - SetDlgItemText(hwndDlg, IDC_ADVAPPEARANCE_FONT_C, lfFont.lfFaceName); - SetDlgItemInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E, -MulDiv(g->SchemeAdv.lfFont[g_Assignment[iElement].Font].lfHeight, 72, GetDeviceCaps(hdcDlg, LOGPIXELSY)),FALSE); - SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONT_C, CB_FINDSTRINGEXACT, -1, (WPARAM)lfFont.lfFaceName); - SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, BM_SETCHECK, g->SchemeAdv.lfFont[g_Assignment[iElement].Font].lfWeight == FW_BOLD?1:0, 0); - SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, BM_SETCHECK, g->SchemeAdv.lfFont[g_Assignment[iElement].Font].lfItalic, 0); + SetDlgItemText(hwndDlg, IDC_ADVAPPEARANCE_FONT_C, plfFont->lfFaceName); + SetDlgItemInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E, -MulDiv(plfFont->lfHeight, 72, GetDeviceCaps(hdcDlg, LOGPIXELSY)),FALSE); + SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONT_C, CB_FINDSTRINGEXACT, -1, (WPARAM)plfFont->lfFaceName); + SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, BM_SETCHECK, plfFont->lfWeight == FW_BOLD?1:0, 0); + SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, BM_SETCHECK, plfFont->lfItalic, 0); } else { @@ -266,15 +266,16 @@ SaveCurrentValues(HWND hwndDlg, GLOBALS *g) if (g_Assignment[g->CurrentElement].Size != -1) { - g->SchemeAdv.Size[g_Assignment[g->CurrentElement].Size] = GetDlgItemInt(hwndDlg, IDC_ADVAPPEARANCE_SIZE_E, &bTranslated, FALSE); + SchemeSetMetric(&g->SchemeAdv, g_Assignment[g->CurrentElement].Size, GetDlgItemInt(hwndDlg, IDC_ADVAPPEARANCE_SIZE_E, &bTranslated, FALSE)); } if (g_Assignment[g->CurrentElement].Font != -1) { - g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfHeight = -MulDiv(GetDlgItemInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E, &bTranslated, FALSE), GetDeviceCaps(hdcDlg, LOGPIXELSY), 72); - g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfWeight = (SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, BM_GETCHECK, 0, 0) == 1) ? FW_BOLD : FW_NORMAL; - g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfItalic = (BYTE)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, BM_GETCHECK, 0, 0); - GetDlgItemText(hwndDlg, IDC_ADVAPPEARANCE_FONT_C, g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfFaceName, LF_FACESIZE * sizeof(TCHAR)); + PLOGFONTW plfFont = SchemeGetFont(&g->SchemeAdv, g_Assignment[g->CurrentElement].Font); + plfFont->lfHeight = -MulDiv(GetDlgItemInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E, &bTranslated, FALSE), GetDeviceCaps(hdcDlg, LOGPIXELSY), 72); + plfFont->lfWeight = (SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, BM_GETCHECK, 0, 0) == 1) ? FW_BOLD : FW_NORMAL; + plfFont->lfItalic = (BYTE)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, BM_GETCHECK, 0, 0); + GetDlgItemText(hwndDlg, IDC_ADVAPPEARANCE_FONT_C, plfFont->lfFaceName, LF_FACESIZE * sizeof(TCHAR)); } ReleaseDC(hwndDlg, hdcDlg); @@ -379,7 +380,7 @@ AdvAppearanceDlg_Init(HWND hwndDlg, GLOBALS *g) SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_SETCURSEL, iDeskIndex, 0); /* Create font for bold button */ - lfButtonFont = g->Scheme.lfFont[FONT_DIALOG]; + lfButtonFont = g->Scheme.ncMetrics.lfMessageFont; lfButtonFont.lfWeight = FW_BOLD; lfButtonFont.lfItalic = FALSE; hMyFont = CreateFontIndirect(&lfButtonFont); @@ -501,27 +502,12 @@ GetSelectedComboInt(HWND hwnd, INT id) return _ttoi(szBuffer); } - -static INT -GetEditedComboInt(HWND hwnd, INT id) -{ - INT nCount; - BOOL bTranslated; - - nCount = GetDlgItemInt(hwnd, id, &bTranslated, FALSE); - if (bTranslated == FALSE) - return 12; - - return nCount; -} - - - INT_PTR CALLBACK AdvAppearanceDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { - INT iListIndex; + INT iSelection, iProperty; GLOBALS* g; + PLOGFONTW plfFont; g = (GLOBALS*)GetWindowLongPtr(hwndDlg, DWLP_USER); @@ -538,6 +524,9 @@ AdvAppearanceDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) break; case WM_COMMAND: + if(g == NULL) + return TRUE; + switch(LOWORD(wParam)) { case IDOK: @@ -561,197 +550,87 @@ AdvAppearanceDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) if (HIWORD(wParam) == CBN_SELCHANGE) { SaveCurrentValues(hwndDlg, g); - iListIndex = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_GETCURSEL, 0, 0); - g->CurrentElement = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_GETITEMDATA, (WPARAM)iListIndex, 0); + iSelection = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_GETCURSEL, 0, 0); + g->CurrentElement = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_GETITEMDATA, iSelection, 0); UpdateControls(hwndDlg, g); } break; case IDC_ADVAPPEARANCE_SIZE_E: - if (g && HIWORD(wParam) == EN_CHANGE) + if (HIWORD(wParam) == EN_CHANGE) { - INT i = (INT)LOWORD(SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_SIZE_UD, UDM_GETPOS,0,0L)); + iProperty = g_Assignment[g->CurrentElement].Size; + if(iProperty == -1) + return TRUE; - switch (g->CurrentElement) - { - case IDX_INACTIVE_CAPTION: - case IDX_ACTIVE_CAPTION: - case IDX_CAPTION_BUTTON: - SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETCYCAPTION, 0, i); - break; + iSelection = LOWORD(SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_SIZE_UD, UDM_GETPOS,0,0L)); + SchemeSetMetric(&g->SchemeAdv, iProperty, iSelection); + SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETSIZE, iProperty, iSelection); - case IDX_MENU: - SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETCYMENU, 0, i); - break; - - case IDX_SCROLLBAR: - SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETCXSCROLLBAR, 0, i); - break; - - case IDX_INACTIVE_BORDER: - case IDX_ACTIVE_BORDER: - SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETCYSIZEFRAME, 0, i); - break; - } + iProperty = g_Assignment[g->CurrentElement].Size2; + if(iProperty != -1) + SchemeSetMetric(&g->SchemeAdv, iProperty, iSelection); } break; case IDC_ADVAPPEARANCE_FONT_C: - if (g && HIWORD(wParam) == CBN_SELCHANGE) + if (HIWORD(wParam) == CBN_SELCHANGE) { - switch (g->CurrentElement) - { - case IDX_INACTIVE_CAPTION: - case IDX_ACTIVE_CAPTION: - GetSelectedComboText(hwndDlg, IDC_ADVAPPEARANCE_FONT_C, - g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfFaceName); - SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv); - break; + iProperty = g_Assignment[g->CurrentElement].Font; + if(iProperty == -1) + return TRUE; - case IDX_MENU: - GetSelectedComboText(hwndDlg, IDC_ADVAPPEARANCE_FONT_C, - g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfFaceName); - SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv); - break; - - case IDX_DIALOG: - GetSelectedComboText(hwndDlg, IDC_ADVAPPEARANCE_FONT_C, - g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfFaceName); - SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv); - break; - } + plfFont = SchemeGetFont(&g->SchemeAdv, iProperty); + GetSelectedComboText(hwndDlg, IDC_ADVAPPEARANCE_FONT_C, plfFont->lfFaceName); + SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETFONT, iProperty, (LPARAM)plfFont); } break; case IDC_ADVAPPEARANCE_FONTSIZE_E: - if (g && HIWORD(wParam) == CBN_SELCHANGE) + if ((HIWORD(wParam) == CBN_SELCHANGE || HIWORD(wParam) == CBN_EDITCHANGE)) { - HDC hdcDlg = GetDC(hwndDlg); - INT i; + HDC hdcDlg; - switch (g->CurrentElement) - { - case IDX_INACTIVE_CAPTION: - case IDX_ACTIVE_CAPTION: - i = GetSelectedComboInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E); - g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfHeight = - -MulDiv(i , GetDeviceCaps(hdcDlg, LOGPIXELSY), 72); - SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv); - break; + iProperty = g_Assignment[g->CurrentElement].Font; + if(iProperty == -1) + return TRUE; - case IDX_MENU: - i = GetSelectedComboInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E); - g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfHeight = - -MulDiv(i , GetDeviceCaps(hdcDlg, LOGPIXELSY), 72); - SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv); - break; + hdcDlg = GetDC(hwndDlg); - case IDX_DIALOG: - i = GetSelectedComboInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E); - g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfHeight = - -MulDiv(i , GetDeviceCaps(hdcDlg, LOGPIXELSY), 72); - SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv); - break; - } - - ReleaseDC(hwndDlg, hdcDlg); - } - else if (g && HIWORD(wParam) == CBN_EDITCHANGE) - { - HDC hdcDlg = GetDC(hwndDlg); - INT i; - - switch (g->CurrentElement) - { - case IDX_INACTIVE_CAPTION: - case IDX_ACTIVE_CAPTION: - i = GetEditedComboInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E); - g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfHeight = - -MulDiv(i , GetDeviceCaps(hdcDlg, LOGPIXELSY), 72); - SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv); - break; - - case IDX_MENU: - i = GetEditedComboInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E); - g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfHeight = - -MulDiv(i , GetDeviceCaps(hdcDlg, LOGPIXELSY), 72); - SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv); - break; - - case IDX_DIALOG: - i = GetEditedComboInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E); - g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfHeight = - -MulDiv(i , GetDeviceCaps(hdcDlg, LOGPIXELSY), 72); - SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv); - break; - } + plfFont = SchemeGetFont(&g->SchemeAdv, iProperty); + iSelection = GetSelectedComboInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E); + plfFont->lfHeight = -MulDiv(iSelection , GetDeviceCaps(hdcDlg, LOGPIXELSY), 72); + SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv); ReleaseDC(hwndDlg, hdcDlg); } break; case IDC_ADVAPPEARANCE_FONTBOLD: - if (g && HIWORD(wParam) == BN_CLICKED) + if (HIWORD(wParam) == BN_CLICKED) { - INT i; + iProperty = g_Assignment[g->CurrentElement].Font; + if(iProperty == -1) + return TRUE; - switch (g->CurrentElement) - { - case IDX_INACTIVE_CAPTION: - case IDX_ACTIVE_CAPTION: - i = (INT)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, BM_GETCHECK, 0, 0); - g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfWeight = - (i == BST_CHECKED) ? FW_BOLD : FW_NORMAL; - SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv); - break; - - case IDX_MENU: - i = (INT)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, BM_GETCHECK, 0, 0); - - g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfWeight = - (i == BST_CHECKED) ? FW_BOLD : FW_NORMAL; - SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv); - break; - - case IDX_DIALOG: - i = (INT)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, BM_GETCHECK, 0, 0); - g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfWeight = - (i == BST_CHECKED) ? FW_BOLD : FW_NORMAL; - SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv); - break; - } + plfFont = SchemeGetFont(&g->SchemeAdv, iProperty); + iSelection = (INT)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, BM_GETCHECK, 0, 0); + plfFont->lfWeight = (iSelection == BST_CHECKED) ? FW_BOLD : FW_NORMAL; + SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETFONT, iProperty, (LPARAM)plfFont); } break; case IDC_ADVAPPEARANCE_FONTITALIC: - if (g && HIWORD(wParam) == BN_CLICKED) + if (HIWORD(wParam) == BN_CLICKED) { - INT i; + iProperty = g_Assignment[g->CurrentElement].Font; + if(iProperty == -1) + return TRUE; - switch (g->CurrentElement) - { - case IDX_INACTIVE_CAPTION: - case IDX_ACTIVE_CAPTION: - i = (INT)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, BM_GETCHECK, 0, 0); - g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfItalic = - (i == BST_CHECKED) ? TRUE : FALSE; - SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv); - break; - - case IDX_MENU: - i = (INT)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, BM_GETCHECK, 0, 0); - g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfItalic = - (i == BST_CHECKED) ? TRUE : FALSE; - SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv); - break; - - case IDX_DIALOG: - i = (INT)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, BM_GETCHECK, 0, 0); - g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfItalic = - (i == BST_CHECKED) ? TRUE : FALSE; - SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv); - break; - } + plfFont = SchemeGetFont(&g->SchemeAdv, iProperty); + iSelection = (INT)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, BM_GETCHECK, 0, 0); + plfFont->lfItalic = (iSelection == BST_CHECKED) ? TRUE : FALSE; + SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETFONT, iProperty, (LPARAM)plfFont); } break; diff --git a/reactos/dll/cpl/desk/appearance.c b/reactos/dll/cpl/desk/appearance.c index 092c433ca8d..e095e4dff5a 100644 --- a/reactos/dll/cpl/desk/appearance.c +++ b/reactos/dll/cpl/desk/appearance.c @@ -13,90 +13,154 @@ /******************************************************************************/ static void -AppearancePage_ShowColorScemes(GLOBALS *g, HWND hwndColor, INT ThemeId) +AppearancePage_UpdateThemePreview(HWND hwndDlg, GLOBALS *g) { - int i, iListIndex; - - SendMessage(hwndColor, CB_RESETCONTENT , 0, 0); - - if(g->bThemeActive == FALSE) + if (g->ActiveTheme.ThemeActive == FALSE) { - for(i = 0; i < g_TemplateCount; i++) - { - iListIndex = SendMessage(hwndColor, CB_ADDSTRING, 0, (LPARAM)g_ColorSchemes[i].strLegacyName); - SendMessage(hwndColor, CB_SETITEMDATA, iListIndex, i); - if (lstrcmp(g_ColorSchemes[i].strKeyName, g->strSelectedStyle) == 0) - { - g->SchemeId = i; - SendMessage(hwndColor, CB_SETCURSEL, (WPARAM)iListIndex, 0); - } - } + SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->Scheme); + SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SET_HDC_PREVIEW, 0, 0); } else { - PTHEME pTheme = (PTHEME)DSA_GetItemPtr(g->Themes, ThemeId); - for(i = 0; i < pTheme->ColorsCount; i++) + RECT rcWindow; + GetClientRect(GetDlgItem(hwndDlg, IDC_APPEARANCE_PREVIEW), &rcWindow); + DrawThemePreview(g->hdcThemePreview, &g->Scheme, &g->ActiveTheme, &rcWindow); + + SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SET_HDC_PREVIEW, 0, (LPARAM)g->hdcThemePreview); + } +} + +static void +AppearancePage_LoadSelectedScheme(HWND hwndDlg, GLOBALS *g) +{ + if (g->ActiveTheme.ThemeActive == FALSE ) + { + LoadSchemeFromReg(&g->Scheme, &g->ActiveTheme); + } + else + { + LoadSchemeFromTheme(&g->Scheme, &g->ActiveTheme); + } + + g_GlobalData.desktop_color = g->Scheme.crColor[COLOR_DESKTOP]; +} + +static void +AppearancePage_ShowStyles(HWND hwndDlg, int nIDDlgItem, PTHEME_STYLE pStyles, PTHEME_STYLE pActiveStyle) +{ + int iListIndex; + HWND hwndList = GetDlgItem(hwndDlg, nIDDlgItem); + PTHEME_STYLE pCurrentStyle; + + SendMessage(hwndList, CB_RESETCONTENT , 0, 0); + + for (pCurrentStyle = pStyles; + pCurrentStyle; + pCurrentStyle = pCurrentStyle->NextStyle) + { + iListIndex = SendMessage(hwndList, CB_ADDSTRING, 0, (LPARAM)pCurrentStyle->DisplayName); + SendMessage(hwndList, CB_SETITEMDATA, iListIndex, (LPARAM)pCurrentStyle); + if (pCurrentStyle == pActiveStyle) { - PTHEME_STYLE pStyleName; - pStyleName = (PTHEME_STYLE)DSA_GetItemPtr(pTheme->Colors, i); - iListIndex = SendMessage(hwndColor, CB_ADDSTRING, 0, (LPARAM)pStyleName->DisplayName); - SendMessage(hwndColor, CB_SETITEMDATA, iListIndex, i); - if(i == 0 || (g->pszColorName && wcscmp(pStyleName->StlyeName, g->pszColorName) == 0)) - { - g->SchemeId = i; - SendMessage(hwndColor, CB_SETCURSEL, (WPARAM)iListIndex, 0); - } + SendMessage(hwndList, CB_SETCURSEL, (WPARAM)iListIndex, 0); } } } +static void +AppearancePage_ShowColorSchemes(HWND hwndDlg, GLOBALS *g) +{ + AppearancePage_ShowStyles(hwndDlg, + IDC_APPEARANCE_COLORSCHEME, + g->ActiveTheme.Theme->ColoursList, + g->ActiveTheme.Color); +} + +static void +AppearancePage_ShowSizes(HWND hwndDlg, GLOBALS *g) +{ + PTHEME_STYLE pSizes; + + if (g->ActiveTheme.Theme->SizesList) + pSizes = g->ActiveTheme.Theme->SizesList; + else + pSizes = g->ActiveTheme.Color->ChildStyle; + + AppearancePage_ShowStyles(hwndDlg, + IDC_APPEARANCE_SIZE, + pSizes, + g->ActiveTheme.Size); +} + static INT_PTR AppearancePage_OnInit(HWND hwndDlg) { - INT i, /*TemplateCount,*/ iListIndex; + INT iListIndex; HWND hwndColor, hwndTheme; GLOBALS *g; + RECT rcPreview; + HDC hdcScreen; + PTHEME pTheme; - g = (GLOBALS*)LocalAlloc(LPTR, sizeof(GLOBALS)); + g = (GLOBALS*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(GLOBALS)); if (g == NULL) return FALSE; SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)g); - LoadCurrentScheme(&g->Scheme); - g->SchemeAdv = g->Scheme; - g->bThemeChanged = FALSE; - g->bSchemeChanged = FALSE; - g->hBoldFont = g->hItalicFont = NULL; - g->hbmpColor[0] = g->hbmpColor[1] = g->hbmpColor[2] = NULL; - g->bInitializing = FALSE; - g->bThemeActive = FALSE; - - LoadThemes(g); - - /*TemplateCount = */ LoadSchemePresetEntries(g->strSelectedStyle); - - hwndColor = GetDlgItem(hwndDlg, IDC_APPEARANCE_COLORSCHEME); - g->SchemeId = -1; g->bInitializing = TRUE; - hwndTheme = GetDlgItem(hwndDlg, IDC_APPEARANCE_VISUAL_STYLE); - for(i = 0; i < g->ThemesCount; i++) + if (!LoadCurrentScheme(&g->Scheme)) + return FALSE; + + g->pThemes = LoadThemes(); + if (g->pThemes) { - PTHEME pTheme = (PTHEME)DSA_GetItemPtr(g->Themes, i); - iListIndex = SendMessage(hwndTheme, CB_ADDSTRING, 0, (LPARAM)pTheme->displayName); - SendMessage(hwndTheme, CB_SETITEMDATA, iListIndex, i); - if((!pTheme->themeFileName && !IsThemeActive()) || - (pTheme->themeFileName && g->pszThemeFileName && wcscmp(pTheme->themeFileName, g->pszThemeFileName) == 0 )) + if (!GetActiveTheme(g->pThemes, &g->ActiveTheme)) + g->ActiveTheme.ThemeActive = FALSE; + + /* + * Keep a copy of the selected classic theme in order to select this + * when user selects the classic theme (and not a horrible random theme ) + */ + if (!GetActiveClassicTheme(g->pThemes, &g->ClassicTheme)) { - g->ThemeId = i; - g->bThemeActive = (pTheme->themeFileName != NULL); - SendMessage(hwndTheme, CB_SETCURSEL, (WPARAM)iListIndex, 0); - AppearancePage_ShowColorScemes(g, hwndColor, i); + g->ClassicTheme.Theme = g->pThemes; + g->ClassicTheme.Color = g->pThemes->ColoursList; + g->ClassicTheme.Size = g->ClassicTheme.Color->ChildStyle; } - } + if (g->ActiveTheme.ThemeActive == FALSE) + g->ActiveTheme = g->ClassicTheme; + GetClientRect(GetDlgItem(hwndDlg, IDC_APPEARANCE_PREVIEW), &rcPreview); + + hdcScreen = GetDC(NULL); + g->hbmpThemePreview = CreateCompatibleBitmap(hdcScreen, rcPreview.right, rcPreview.bottom); + g->hdcThemePreview = CreateCompatibleDC(hdcScreen); + SelectObject(g->hdcThemePreview, g->hbmpThemePreview); + ReleaseDC(NULL, hdcScreen); + + hwndColor = GetDlgItem(hwndDlg, IDC_APPEARANCE_COLORSCHEME); + hwndTheme = GetDlgItem(hwndDlg, IDC_APPEARANCE_VISUAL_STYLE); + + for (pTheme = g->pThemes; pTheme; pTheme = pTheme->NextTheme) + { + iListIndex = SendMessage(hwndTheme, CB_ADDSTRING, 0, (LPARAM)pTheme->DisplayName); + SendMessage(hwndTheme, CB_SETITEMDATA, iListIndex, (LPARAM)pTheme); + if (pTheme == g->ActiveTheme.Theme) + { + SendMessage(hwndTheme, CB_SETCURSEL, (WPARAM)iListIndex, 0); + } + } + + if (g->ActiveTheme.Theme) + { + AppearancePage_ShowColorSchemes(hwndDlg, g); + AppearancePage_ShowSizes(hwndDlg, g); + AppearancePage_UpdateThemePreview(hwndDlg, g); + } + } g->bInitializing = FALSE; return FALSE; @@ -105,11 +169,11 @@ AppearancePage_OnInit(HWND hwndDlg) static VOID AppearancePage_OnDestroy(HWND hwndDlg, GLOBALS *g) { - LocalFree(g); + HeapFree(GetProcessHeap(), 0, g); } -static INT -GetSelectedId(HWND hwndDlg, int nIDDlgItem) +static PVOID +GetSelectedData(HWND hwndDlg, int nIDDlgItem) { HWND hwndCombo; INT sel; @@ -117,8 +181,8 @@ GetSelectedId(HWND hwndDlg, int nIDDlgItem) hwndCombo = GetDlgItem(hwndDlg, nIDDlgItem); sel = SendMessage(hwndCombo, CB_GETCURSEL, 0, 0); if (sel == CB_ERR) - return -1; - return (INT)SendMessage(hwndCombo, CB_GETITEMDATA, (WPARAM)sel, 0); + return NULL; + return (PVOID)SendMessage(hwndCombo, CB_GETITEMDATA, (WPARAM)sel, 0); } INT_PTR CALLBACK @@ -139,6 +203,9 @@ AppearancePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) break; case WM_COMMAND: + if(g == NULL || g->bInitializing) + return FALSE; + switch (LOWORD(wParam)) { case IDC_APPEARANCE_EFFECTS: @@ -148,11 +215,6 @@ AppearancePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) PropSheet_Changed(GetParent(hwndDlg), hwndDlg); g->Scheme = g->SchemeAdv; g->bSchemeChanged = TRUE; - // Effects dialog doesn't change the color scheme, therefore the following lines are commented out, until fixed finally - //g->SchemeId = -1; /* Customized */ - //SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_SETCURSEL, (WPARAM)-1, 0); - //SetDlgItemText(hwndDlg, IDC_APPEARANCE_COLORSCHEME, TEXT("")); - SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->Scheme); } break; @@ -163,54 +225,71 @@ AppearancePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) PropSheet_Changed(GetParent(hwndDlg), hwndDlg); g->bSchemeChanged = TRUE; g->Scheme = g->SchemeAdv; - g->SchemeId = -1; /* Customized */ g_GlobalData.desktop_color = g->Scheme.crColor[COLOR_DESKTOP]; - SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_SETCURSEL, (WPARAM)-1, 0); - SetDlgItemText(hwndDlg, IDC_APPEARANCE_COLORSCHEME, TEXT("")); - - SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->Scheme); + AppearancePage_UpdateThemePreview(hwndDlg, g); } break; case IDC_APPEARANCE_COLORSCHEME: - if (HIWORD(wParam) == CBN_SELCHANGE && !g->bInitializing) + if (HIWORD(wParam) == CBN_SELCHANGE) { - INT SchemeId = GetSelectedId(hwndDlg, IDC_APPEARANCE_COLORSCHEME); + g->ActiveTheme.Color = (PTHEME_STYLE)GetSelectedData(hwndDlg, IDC_APPEARANCE_COLORSCHEME); + if (g->ActiveTheme.Color->ChildStyle != NULL) + g->ActiveTheme.Size = g->ActiveTheme.Color->ChildStyle; + + g->bSchemeChanged = TRUE; + if (g->ActiveTheme.ThemeActive) + g->bThemeChanged = TRUE; PropSheet_Changed(GetParent(hwndDlg), hwndDlg); - if(g->bThemeActive == FALSE) - { - COLOR_SCHEME Scheme; + AppearancePage_LoadSelectedScheme(hwndDlg, g); + AppearancePage_ShowSizes(hwndDlg, g); + AppearancePage_UpdateThemePreview(hwndDlg, g); + } + break; - g->bSchemeChanged = TRUE; - if (SchemeId != -1 && LoadSchemeFromReg(&Scheme, SchemeId)) - { - g->Scheme = Scheme; - g_GlobalData.desktop_color = g->Scheme.crColor[COLOR_DESKTOP]; - SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&Scheme); - } - } + case IDC_APPEARANCE_VISUAL_STYLE: + if (HIWORD(wParam) == CBN_SELCHANGE) + { + PTHEME pTheme = (PTHEME)GetSelectedData(hwndDlg, IDC_APPEARANCE_VISUAL_STYLE); + + if (g->ClassicTheme.Theme == pTheme) + g->ActiveTheme = g->ClassicTheme; else { - g->bThemeChanged = TRUE; + g->ActiveTheme.Theme = pTheme; + g->ActiveTheme.Size = pTheme->SizesList; + g->ActiveTheme.Color = pTheme->ColoursList; + g->ActiveTheme.ThemeActive = TRUE; } - } - break; - case IDC_APPEARANCE_VISUAL_STYLE: - if (HIWORD(wParam) == CBN_SELCHANGE && !g->bInitializing) - { - INT ThemeId = GetSelectedId(hwndDlg, IDC_APPEARANCE_VISUAL_STYLE); - HWND hwndColor = GetDlgItem(hwndDlg, IDC_APPEARANCE_COLORSCHEME); + + g->bThemeChanged = TRUE; + g->bSchemeChanged = TRUE; PropSheet_Changed(GetParent(hwndDlg), hwndDlg); - g->bThemeActive = (ThemeId!=0); - g->bThemeChanged = TRUE; - AppearancePage_ShowColorScemes(g, hwndColor, ThemeId); + AppearancePage_ShowColorSchemes(hwndDlg, g); + AppearancePage_ShowSizes(hwndDlg, g); + AppearancePage_LoadSelectedScheme(hwndDlg, g); + AppearancePage_UpdateThemePreview(hwndDlg, g); } break; + + case IDC_APPEARANCE_SIZE: + if (HIWORD(wParam) == CBN_SELCHANGE) + { + g->ActiveTheme.Size = (PTHEME_STYLE)GetSelectedData(hwndDlg, IDC_APPEARANCE_SIZE); + g->bSchemeChanged = TRUE; + if(g->ActiveTheme.ThemeActive) + g->bThemeChanged = TRUE; + + PropSheet_Changed(GetParent(hwndDlg), hwndDlg); + + AppearancePage_LoadSelectedScheme(hwndDlg, g); + AppearancePage_UpdateThemePreview(hwndDlg, g); + } } break; @@ -220,21 +299,19 @@ AppearancePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { case PSN_APPLY: - g->ThemeId = GetSelectedId(hwndDlg, IDC_APPEARANCE_VISUAL_STYLE); - g->SchemeId = GetSelectedId(hwndDlg, IDC_APPEARANCE_COLORSCHEME); - - if(g->bSchemeChanged) + if (g->bThemeChanged) { - ApplyScheme(&g->Scheme, g->SchemeId); + ActivateTheme(&g->ActiveTheme); } - if(g->bThemeChanged) + if (g->bSchemeChanged) { - PTHEME pTheme = (PTHEME)DSA_GetItemPtr(g->Themes, g->ThemeId); - ActivateTheme(pTheme, g->SchemeId, 0); + ApplyScheme(&g->Scheme, &g->ActiveTheme); + if (g->ActiveTheme.ThemeActive == FALSE) + g->ClassicTheme = g->ActiveTheme; } - SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->Scheme); + AppearancePage_UpdateThemePreview(hwndDlg, g); g->bThemeChanged = FALSE; g->bSchemeChanged = FALSE; SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, (LONG_PTR)PSNRET_NOERROR); @@ -248,7 +325,7 @@ AppearancePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) if (g->Scheme.crColor[COLOR_DESKTOP] != g_GlobalData.desktop_color) { g->Scheme.crColor[COLOR_DESKTOP] = g_GlobalData.desktop_color; - SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->Scheme); + AppearancePage_UpdateThemePreview(hwndDlg, g); } break; } diff --git a/reactos/dll/cpl/desk/appearance.h b/reactos/dll/cpl/desk/appearance.h index 6aef607d0f4..8e8b6c57b85 100644 --- a/reactos/dll/cpl/desk/appearance.h +++ b/reactos/dll/cpl/desk/appearance.h @@ -1,39 +1,31 @@ /* Some definitions for theme */ -#define SIZE_BORDER_X 0 -#define SIZE_BORDER_Y 1 -#define SIZE_CAPTION_Y 2 -#define SIZE_ICON_X 3 -#define SIZE_ICON_Y 4 -#define SIZE_ICON_SPC_X 5 -#define SIZE_ICON_SPC_Y 6 -#define SIZE_MENU_SIZE_X 7 -#define SIZE_MENU_Y 8 -#define SIZE_SCROLL_X 9 -#define SIZE_SCROLL_Y 10 -#define SIZE_SMCAPTION_Y 11 -#define SIZE_EDGE_X 12 -#define SIZE_EDGE_Y 13 -#define SIZE_FRAME_Y 14 -#define SIZE_MENU_CHECK_X 15 -#define SIZE_MENU_CHECK_Y 16 -#define SIZE_MENU_SIZE_Y 17 -#define SIZE_SIZE_X 18 -#define SIZE_SIZE_Y 19 - -#define FONT_CAPTION 0 -#define FONT_SMCAPTION 1 -#define FONT_HILIGHT 2 -#define FONT_MENU 2 -#define FONT_ICON 3 -#define FONT_INFO 4 -#define FONT_DIALOG 5 - -#define NUM_ELEMENTS 22 -#define NUM_FONTS 6 -#define NUM_SIZES 20 -#define NUM_COLORS 31 -#define MAX_TEMPLATES 50 -#define MAX_TEMPLATENAMELENTGH 80 +#define SIZE_BORDER_WIDTH 0 +#define SIZE_SCROLL_WIDTH 1 +#define SIZE_SCROLL_HEIGHT 2 +#define SIZE_CAPTION_WIDTH 3 +#define SIZE_CAPTION_HEIGHT 4 +#define SIZE_SM_CAPTION_WIDTH 5 +#define SIZE_SM_CAPTION_HEIGHT 6 +#define SIZE_MENU_WIDTH 7 +#define SIZE_MENU_HEIGHT 8 + +#define SIZE_ICON_SPACE_X 9 +#define SIZE_ICON_SPACE_Y 10 +#define SIZE_ICON 11 + +#define FONT_CAPTION 0 +#define FONT_SMCAPTION 1 +#define FONT_MENU 2 +#define FONT_STATUS 3 +#define FONT_MESSAGE 4 +#define FONT_ICON 5 + +#define NUM_ELEMENTS 22 +#define NUM_FONTS 6 +#define NUM_SIZES 9 +#define NUM_COLORS 31 +#define MAX_TEMPLATES 50 +#define MAX_TEMPLATENAMELENTGH 80 /* Some typedefs for theme */ @@ -61,56 +53,66 @@ typedef struct typedef struct { + NONCLIENTMETRICSW ncMetrics; + ICONMETRICSW icMetrics; COLORREF crColor[NUM_COLORS]; - LOGFONT lfFont[NUM_FONTS]; - INT Size[NUM_SIZES]; + INT iIconSize; BOOL bFlatMenus; EFFECTS Effects; -} COLOR_SCHEME; +} COLOR_SCHEME, *PCOLOR_SCHEME; -typedef struct -{ - TCHAR strKeyName[4]; - TCHAR strSizeName[4]; - TCHAR strDisplayName[MAX_TEMPLATENAMELENTGH]; - TCHAR strLegacyName[MAX_TEMPLATENAMELENTGH]; -} SCHEME_PRESET; +/* + * The classic theme has several different 'colours' and every colour has + * several sizes. On visual styles however a theme has different colours + * and different sizes. In other words the user can select a combination + * of colour and size. + * That means that for the classic theme THEME.SizesList is unused and + * every color has some child styles that corespond its sizes. + * The themes for visual styles however will use both ColoursList and SizesList + * and ChildStyle will not be used. + */ /* struct for holding theme colors and sizes */ typedef struct _THEME_STYLE { - WCHAR* StlyeName; - WCHAR* DisplayName; + struct _THEME_STYLE *NextStyle; + struct _THEME_STYLE *ChildStyle; + PWSTR StyleName; + PWSTR DisplayName; } THEME_STYLE, *PTHEME_STYLE; typedef struct _THEME { - WCHAR* themeFileName; - WCHAR* displayName; - HDSA Colors; - int ColorsCount; - HDSA Sizes; - int SizesCount; - + struct _THEME *NextTheme; + PWSTR ThemeFileName; + PWSTR DisplayName; + THEME_STYLE *ColoursList; + THEME_STYLE *SizesList; } THEME, *PTHEME; -/* This is the global structure used to store the current values. - A pointer of this get's passed to the functions either directly - or by passing hwnd and getting the pointer by GetWindowLongPtr */ +typedef struct _THEME_SELECTION +{ + BOOL ThemeActive; + PTHEME Theme; + PTHEME_STYLE Color; + PTHEME_STYLE Size; +} THEME_SELECTION, *PTHEME_SELECTION; + +/* + * This is the global structure used to store the current values. + * A pointer of this get's passed to the functions either directly + * or by passing hwnd and getting the pointer by GetWindowLongPtr. + */ typedef struct tagGLOBALS { - HDSA Themes; - int ThemesCount; - BOOL bThemeActive; + PTHEME pThemes; - INT ThemeId; - INT SchemeId; /* Theme is customized if SchemeId == -1 */ - INT SizeID; - TCHAR strSelectedStyle[4]; - - LPWSTR pszThemeFileName; - LPWSTR pszColorName; - LPWSTR pszSizeName; + /* + * Keep a copy of the selected classic theme in order to select this + * when user selects the classic theme (and not a horrible random theme ) + */ + THEME_SELECTION ClassicTheme; + THEME_SELECTION ActiveTheme; COLOR_SCHEME Scheme; COLOR_SCHEME SchemeAdv; @@ -121,20 +123,25 @@ typedef struct tagGLOBALS HFONT hBoldFont; HFONT hItalicFont; BOOL bInitializing; + + HBITMAP hbmpThemePreview; + HDC hdcThemePreview; } GLOBALS; -extern SCHEME_PRESET g_ColorSchemes[MAX_TEMPLATES]; -extern INT g_TemplateCount; - /* prototypes for theme.c */ -VOID LoadCurrentScheme(COLOR_SCHEME* scheme); -BOOL LoadSchemeFromReg(COLOR_SCHEME* scheme, INT SchemeId); -VOID ApplyScheme(COLOR_SCHEME* scheme, INT SchemeId); -BOOL SaveScheme(COLOR_SCHEME* scheme, LPCTSTR strLegacyName); -INT LoadSchemePresetEntries(LPTSTR pszSelectedStyle); -VOID LoadThemes(GLOBALS *g); -HRESULT ActivateTheme(PTHEME pTheme, int iColor, int iSize); -void CleanupThemes(GLOBALS *g); +VOID SchemeSetMetric(COLOR_SCHEME *scheme, int id, int value); +int SchemeGetMetric(COLOR_SCHEME *scheme, int id); +PLOGFONTW SchemeGetFont(COLOR_SCHEME *scheme, int id); +PTHEME LoadThemes(VOID); +BOOL GetActiveTheme(PTHEME pThemeList, PTHEME_SELECTION pSelectedTheme); +BOOL GetActiveClassicTheme(PTHEME pThemeList, PTHEME_SELECTION pSelectedTheme); +BOOL LoadCurrentScheme(PCOLOR_SCHEME scheme); +BOOL LoadSchemeFromReg(PCOLOR_SCHEME scheme, PTHEME_SELECTION pSelectedTheme); +BOOL LoadSchemeFromTheme(PCOLOR_SCHEME scheme, PTHEME_SELECTION pSelectedTheme); +VOID ApplyScheme(PCOLOR_SCHEME scheme, PTHEME_SELECTION pSelectedTheme); +BOOL ActivateTheme(PTHEME_SELECTION pSelectedTheme); +void CleanupThemes(IN PTHEME pThemeList); +BOOL DrawThemePreview(HDC hdcMem, PCOLOR_SCHEME scheme, PTHEME_SELECTION pSelectedTheme, PRECT prcWindow); /* prototypes for appearance.c */ INT_PTR CALLBACK AppearancePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); diff --git a/reactos/dll/cpl/desk/desk.h b/reactos/dll/cpl/desk/desk.h index c9ce87cd76b..1ebe2b480b6 100644 --- a/reactos/dll/cpl/desk/desk.h +++ b/reactos/dll/cpl/desk/desk.h @@ -14,6 +14,8 @@ #include #include #include +#include +#include #include #include #include @@ -21,6 +23,7 @@ #include #include #include +#include #include "appearance.h" #include "preview.h" @@ -105,6 +108,7 @@ typedef struct _GLOBAL_DATA } GLOBAL_DATA, *PGLOBAL_DATA; extern GLOBAL_DATA g_GlobalData; +extern HWND hCPLWindow; BOOL DisplayAdvancedSettings(HWND hWndParent, PDISPLAY_DEVICE_ENTRY DisplayDevice); @@ -116,3 +120,13 @@ HPSXA WINAPI SHCreatePropSheetExtArrayEx(HKEY,LPCWSTR,UINT,IDataObject*); INT_PTR CALLBACK AdvGeneralPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); + +LONG +RegLoadMUIStringW(IN HKEY hKey, + IN LPCWSTR pszValue OPTIONAL, + OUT LPWSTR pszOutBuf, + IN DWORD cbOutBuf, + OUT LPDWORD pcbData OPTIONAL, + IN DWORD Flags, + IN LPCWSTR pszDirectory OPTIONAL); + diff --git a/reactos/dll/cpl/desk/draw.c b/reactos/dll/cpl/desk/draw.c index 6c5840d5bab..ef70338c16f 100644 --- a/reactos/dll/cpl/desk/draw.c +++ b/reactos/dll/cpl/desk/draw.c @@ -98,7 +98,11 @@ MyIntDrawRectEdge(HDC hdc, LPRECT rc, UINT uType, UINT uFlags, COLOR_SCHEME *sch RBOuterPen = GetStockObject(DC_PEN); { HBRUSH hbr; - hbr = CreateSolidBrush(scheme->crColor[COLOR_BTNFACE]); + + if((uFlags & MY_BF_ACTIVEBORDER)) + hbr = CreateSolidBrush(scheme->crColor[COLOR_ACTIVEBORDER]); + else + hbr = CreateSolidBrush(scheme->crColor[COLOR_BTNFACE]); FillRect(hdc, &InnerRect, hbr); DeleteObject(hbr); } diff --git a/reactos/dll/cpl/desk/draw.h b/reactos/dll/cpl/desk/draw.h index 8ecb0ae6d3d..25abefb5bf8 100644 --- a/reactos/dll/cpl/desk/draw.h +++ b/reactos/dll/cpl/desk/draw.h @@ -10,3 +10,7 @@ BOOL MyDrawCaptionTemp(HWND hwnd, HDC hdc, const RECT *rect, HFONT hFont, HICON hIcon, LPCWSTR str, UINT uFlags, COLOR_SCHEME *scheme); DWORD MyDrawMenuBarTemp(HWND Wnd, HDC DC, LPRECT Rect, HMENU Menu, HFONT Font, COLOR_SCHEME *scheme); + +#define MY_BF_ACTIVEBORDER 0x1000000 +#define MY_BF_INACTIVEBORDER 0x2000000 + diff --git a/reactos/dll/cpl/desk/lang/bg-BG.rc b/reactos/dll/cpl/desk/lang/bg-BG.rc index cd6da67c860..ffbf3290d91 100644 --- a/reactos/dll/cpl/desk/lang/bg-BG.rc +++ b/reactos/dll/cpl/desk/lang/bg-BG.rc @@ -46,7 +46,7 @@ BEGIN PUSHBUTTON "Захранване...", IDC_SCREENS_POWER_BUTTON, 165, 171, 61, 13 END -IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 204 +IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 234 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Облик" FONT 8, "MS Shell Dlg" @@ -57,6 +57,8 @@ BEGIN COMBOBOX IDC_APPEARANCE_VISUAL_STYLE, 7, 140, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "Разцветка", IDC_STATIC, 7, 160, 64, 7 COMBOBOX IDC_APPEARANCE_COLORSCHEME, 7, 170, 134, 90 , CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Size", IDC_STATIC, 7, 190, 64, 7 + COMBOBOX IDC_APPEARANCE_SIZE, 7, 200, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&Ефекти", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15 PUSHBUTTON "Още", IDC_APPEARANCE_ADVANCED, 182, 170, 56, 15 END @@ -233,6 +235,7 @@ BEGIN IDS_MESSBOX "Кутия за съобщения" IDS_MESSTEXT "Текст на съобщенията" IDS_BUTTEXT "Добре" + IDS_CLASSIC_THEME "Classic Theme" END STRINGTABLE DISCARDABLE diff --git a/reactos/dll/cpl/desk/lang/cs-CZ.rc b/reactos/dll/cpl/desk/lang/cs-CZ.rc index 6a0bdd568d6..0b000619f03 100644 --- a/reactos/dll/cpl/desk/lang/cs-CZ.rc +++ b/reactos/dll/cpl/desk/lang/cs-CZ.rc @@ -50,7 +50,7 @@ BEGIN PUSHBUTTON "Na&pájení...", IDC_SCREENS_POWER_BUTTON, 165, 171, 61, 13 END -IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 204 +IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 234 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Vzhled" FONT 8, "MS Shell Dlg" @@ -61,6 +61,8 @@ BEGIN COMBOBOX IDC_APPEARANCE_VISUAL_STYLE, 7, 140, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "Schéma", IDC_STATIC, 7, 160, 64, 7 COMBOBOX IDC_APPEARANCE_COLORSCHEME, 7, 170, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Size", IDC_STATIC, 7, 190, 64, 7 + COMBOBOX IDC_APPEARANCE_SIZE, 7, 200, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&Efekty...", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15 PUSHBUTTON "Upřesnit", IDC_APPEARANCE_ADVANCED, 182, 170, 56, 15 END @@ -237,6 +239,7 @@ BEGIN IDS_MESSBOX "Okno zprávy" IDS_MESSTEXT "Text zprávy" IDS_BUTTEXT "OK" + IDS_CLASSIC_THEME "Classic Theme" END STRINGTABLE DISCARDABLE diff --git a/reactos/dll/cpl/desk/lang/de-DE.rc b/reactos/dll/cpl/desk/lang/de-DE.rc index 47f27b61b82..75a3204cbde 100644 --- a/reactos/dll/cpl/desk/lang/de-DE.rc +++ b/reactos/dll/cpl/desk/lang/de-DE.rc @@ -44,7 +44,7 @@ BEGIN PUSHBUTTON "Energieoptionen", IDC_SCREENS_POWER_BUTTON, 165, 171, 61, 13 END -IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 204 +IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 234 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Darstellung" FONT 8, "MS Shell Dlg" @@ -55,6 +55,8 @@ BEGIN COMBOBOX IDC_APPEARANCE_VISUAL_STYLE, 7, 140, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "Farbschema", IDC_STATIC, 7, 160, 64, 7 COMBOBOX IDC_APPEARANCE_COLORSCHEME, 7, 170, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Size", IDC_STATIC, 7, 190, 64, 7 + COMBOBOX IDC_APPEARANCE_SIZE, 7, 200, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&Effekte...", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15 PUSHBUTTON "Erweitert", IDC_APPEARANCE_ADVANCED, 182, 170, 56, 15 END @@ -231,6 +233,7 @@ BEGIN IDS_MESSBOX "Dialogfeld" IDS_MESSTEXT "Dialogfeldtext" IDS_BUTTEXT "OK" + IDS_CLASSIC_THEME "Classic Theme" END STRINGTABLE DISCARDABLE diff --git a/reactos/dll/cpl/desk/lang/el-GR.rc b/reactos/dll/cpl/desk/lang/el-GR.rc index 9e751f322ba..dd7aa32556f 100644 --- a/reactos/dll/cpl/desk/lang/el-GR.rc +++ b/reactos/dll/cpl/desk/lang/el-GR.rc @@ -44,7 +44,7 @@ BEGIN PUSHBUTTON "Ενέργεια...", IDC_SCREENS_POWER_BUTTON, 165, 171, 61, 13 END -IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 204 +IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 234 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Εμφάνιση" FONT 8, "MS Shell Dlg" @@ -55,6 +55,8 @@ BEGIN COMBOBOX IDC_APPEARANCE_VISUAL_STYLE, 7, 140, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "Συνδυασμός χρωμάτων", IDC_STATIC, 7, 160, 64, 7 COMBOBOX IDC_APPEARANCE_COLORSCHEME, 7, 170, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Μέγεθος", IDC_STATIC, 7, 190, 64, 7 + COMBOBOX IDC_APPEARANCE_SIZE, 7, 200, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&Effects...", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15 PUSHBUTTON "Για προχωρημένους", IDC_APPEARANCE_ADVANCED, 182, 170, 56, 15 END @@ -231,6 +233,7 @@ BEGIN IDS_MESSBOX "Παράθυρο μηνύματος" IDS_MESSTEXT "Κείμενο μυνήματος" IDS_BUTTEXT "OK" + IDS_CLASSIC_THEME "Κλασικό θέμα" END STRINGTABLE DISCARDABLE diff --git a/reactos/dll/cpl/desk/lang/en-US.rc b/reactos/dll/cpl/desk/lang/en-US.rc index b46909470b8..f083021b804 100644 --- a/reactos/dll/cpl/desk/lang/en-US.rc +++ b/reactos/dll/cpl/desk/lang/en-US.rc @@ -44,7 +44,7 @@ BEGIN PUSHBUTTON "P&ower...", IDC_SCREENS_POWER_BUTTON, 165, 171, 61, 13 END -IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 204 +IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 234 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Appearance" FONT 8, "MS Shell Dlg" @@ -55,6 +55,8 @@ BEGIN COMBOBOX IDC_APPEARANCE_VISUAL_STYLE, 7, 140, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "Colorscheme", IDC_STATIC, 7, 160, 64, 7 COMBOBOX IDC_APPEARANCE_COLORSCHEME, 7, 170, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Size", IDC_STATIC, 7, 190, 64, 7 + COMBOBOX IDC_APPEARANCE_SIZE, 7, 200, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&Effects...", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15 PUSHBUTTON "Ad&vanced...", IDC_APPEARANCE_ADVANCED, 182, 170, 56, 15 END @@ -231,6 +233,7 @@ BEGIN IDS_MESSBOX "Message Box" IDS_MESSTEXT "Message Text" IDS_BUTTEXT "OK" + IDS_CLASSIC_THEME "Classic Theme" END STRINGTABLE DISCARDABLE diff --git a/reactos/dll/cpl/desk/lang/es-ES.rc b/reactos/dll/cpl/desk/lang/es-ES.rc index 29a90bf4dd7..3ca528aafe4 100644 --- a/reactos/dll/cpl/desk/lang/es-ES.rc +++ b/reactos/dll/cpl/desk/lang/es-ES.rc @@ -52,7 +52,7 @@ BEGIN PUSHBUTTON "E&nergía...", IDC_SCREENS_POWER_BUTTON, 165, 171, 61, 13 END -IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 204 +IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 234 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Apariencia" FONT 8, "MS Shell Dlg" @@ -63,6 +63,8 @@ BEGIN COMBOBOX IDC_APPEARANCE_VISUAL_STYLE, 7, 140, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "Com&binación de colores", IDC_STATIC, 7, 160, 90, 7 // 64 COMBOBOX IDC_APPEARANCE_COLORSCHEME, 7, 170, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Size", IDC_STATIC, 7, 190, 64, 7 + COMBOBOX IDC_APPEARANCE_SIZE, 7, 200, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&Efectos...", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15 PUSHBUTTON "Opciones &avanzadas", IDC_APPEARANCE_ADVANCED, 182, 170, 56, 15 END @@ -239,6 +241,7 @@ BEGIN IDS_MESSBOX "Cuadro de mensaje" IDS_MESSTEXT "Texto del mensaje" IDS_BUTTEXT "Aceptar" + IDS_CLASSIC_THEME "Classic Theme" END STRINGTABLE DISCARDABLE diff --git a/reactos/dll/cpl/desk/lang/fr-FR.rc b/reactos/dll/cpl/desk/lang/fr-FR.rc index fb9a5161168..9c4a78a18ce 100644 --- a/reactos/dll/cpl/desk/lang/fr-FR.rc +++ b/reactos/dll/cpl/desk/lang/fr-FR.rc @@ -47,7 +47,7 @@ BEGIN PUSHBUTTON "&Gestion de l'alimentation...", IDC_SCREENS_POWER_BUTTON, 165, 171, 61, 13 END -IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 204 +IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 234 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Apparence" FONT 8, "MS Shell Dlg" @@ -58,6 +58,8 @@ BEGIN COMBOBOX IDC_APPEARANCE_VISUAL_STYLE, 7, 140, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "Modèle de couleurs", IDC_STATIC, 7, 160, 64, 7 COMBOBOX IDC_APPEARANCE_COLORSCHEME, 7, 170, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Size", IDC_STATIC, 7, 190, 64, 7 + COMBOBOX IDC_APPEARANCE_SIZE, 7, 200, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&Effets...", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15 PUSHBUTTON "Avancé", IDC_APPEARANCE_ADVANCED, 182, 170, 56, 15 END @@ -234,6 +236,7 @@ BEGIN IDS_MESSBOX "Boîte de message" IDS_MESSTEXT "Texte de message" IDS_BUTTEXT "OK" + IDS_CLASSIC_THEME "Classic Theme" END STRINGTABLE DISCARDABLE diff --git a/reactos/dll/cpl/desk/lang/he-IL.rc b/reactos/dll/cpl/desk/lang/he-IL.rc index eca3f2e4c18..983dd853183 100644 --- a/reactos/dll/cpl/desk/lang/he-IL.rc +++ b/reactos/dll/cpl/desk/lang/he-IL.rc @@ -44,7 +44,7 @@ BEGIN PUSHBUTTON "P&ower...", IDC_SCREENS_POWER_BUTTON, 165, 171, 61, 13 END -IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 204 +IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 234 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "מראה" FONT 8, "MS Shell Dlg" @@ -55,6 +55,8 @@ BEGIN COMBOBOX IDC_APPEARANCE_VISUAL_STYLE, 7, 140, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "ערכת צבעים", IDC_STATIC, 7, 160, 64, 7 COMBOBOX IDC_APPEARANCE_COLORSCHEME, 7, 170, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Size", IDC_STATIC, 7, 190, 64, 7 + COMBOBOX IDC_APPEARANCE_SIZE, 7, 200, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "אפקטים...", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15 PUSHBUTTON "מתקדם...", IDC_APPEARANCE_ADVANCED, 182, 170, 56, 15 END @@ -231,6 +233,7 @@ BEGIN IDS_MESSBOX "Message Box" IDS_MESSTEXT "Message Text" IDS_BUTTEXT "אישור" + IDS_CLASSIC_THEME "Classic Theme" END STRINGTABLE DISCARDABLE diff --git a/reactos/dll/cpl/desk/lang/hu-HU.rc b/reactos/dll/cpl/desk/lang/hu-HU.rc index cd6f9a33149..03ee031d7a4 100644 --- a/reactos/dll/cpl/desk/lang/hu-HU.rc +++ b/reactos/dll/cpl/desk/lang/hu-HU.rc @@ -45,7 +45,7 @@ BEGIN PUSHBUTTON "P&ower...", IDC_SCREENS_POWER_BUTTON, 165, 171, 61, 13 END -IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 204 +IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 234 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Megjelenés" FONT 8, "MS Shell Dlg" @@ -56,6 +56,8 @@ BEGIN COMBOBOX IDC_APPEARANCE_VISUAL_STYLE, 7, 140, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "Colorscheme", IDC_STATIC, 7, 160, 64, 7 COMBOBOX IDC_APPEARANCE_COLORSCHEME, 7, 170, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Size", IDC_STATIC, 7, 190, 64, 7 + COMBOBOX IDC_APPEARANCE_SIZE, 7, 200, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&Effects...", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15 PUSHBUTTON "Advanced", IDC_APPEARANCE_ADVANCED, 182, 170, 56, 15 END @@ -232,6 +234,7 @@ BEGIN IDS_MESSBOX "Message Box" IDS_MESSTEXT "Message Text" IDS_BUTTEXT "OK" + IDS_CLASSIC_THEME "Classic Theme" END STRINGTABLE DISCARDABLE diff --git a/reactos/dll/cpl/desk/lang/id-ID.rc b/reactos/dll/cpl/desk/lang/id-ID.rc index dd7bf1b4bdb..3fda1e855db 100644 --- a/reactos/dll/cpl/desk/lang/id-ID.rc +++ b/reactos/dll/cpl/desk/lang/id-ID.rc @@ -44,7 +44,7 @@ BEGIN PUSHBUTTON "P&ower...", IDC_SCREENS_POWER_BUTTON, 165, 171, 61, 13 END -IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 204 +IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 234 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Penampilan" FONT 8, "MS Shell Dlg" @@ -55,6 +55,8 @@ BEGIN COMBOBOX IDC_APPEARANCE_VISUAL_STYLE, 7, 140, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "SkemaWarna", IDC_STATIC, 7, 160, 64, 7 COMBOBOX IDC_APPEARANCE_COLORSCHEME, 7, 170, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Size", IDC_STATIC, 7, 190, 64, 7 + COMBOBOX IDC_APPEARANCE_SIZE, 7, 200, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&Effects...", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15 PUSHBUTTON "Lanjutan", IDC_APPEARANCE_ADVANCED, 182, 170, 56, 15 END @@ -231,6 +233,7 @@ BEGIN IDS_MESSBOX "Kotak Pesan" IDS_MESSTEXT "Teks Pesan" IDS_BUTTEXT "OK" + IDS_CLASSIC_THEME "Classic Theme" END STRINGTABLE DISCARDABLE diff --git a/reactos/dll/cpl/desk/lang/it-IT.rc b/reactos/dll/cpl/desk/lang/it-IT.rc index 4988f9de3c1..b1238afa2b8 100644 --- a/reactos/dll/cpl/desk/lang/it-IT.rc +++ b/reactos/dll/cpl/desk/lang/it-IT.rc @@ -44,7 +44,7 @@ BEGIN PUSHBUTTON "Alim&entazione...", IDC_SCREENS_POWER_BUTTON, 165, 171, 61, 13 END -IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 204 +IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 234 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Aspetto" FONT 8, "MS Shell Dlg" @@ -55,6 +55,8 @@ BEGIN COMBOBOX IDC_APPEARANCE_VISUAL_STYLE, 7, 140, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "Schema dei colori", IDC_STATIC, 7, 160, 64, 7 COMBOBOX IDC_APPEARANCE_COLORSCHEME, 7, 170, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Size", IDC_STATIC, 7, 190, 64, 7 + COMBOBOX IDC_APPEARANCE_SIZE, 7, 200, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&Effetti...", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15 PUSHBUTTON "A&vanzato...", IDC_APPEARANCE_ADVANCED, 182, 170, 56, 15 END @@ -231,6 +233,7 @@ BEGIN IDS_MESSBOX "Messaggi" IDS_MESSTEXT "Testo dei messaggi" IDS_BUTTEXT "OK" + IDS_CLASSIC_THEME "Classic Theme" END STRINGTABLE DISCARDABLE diff --git a/reactos/dll/cpl/desk/lang/ja-JP.rc b/reactos/dll/cpl/desk/lang/ja-JP.rc index 14783433b43..9e1c84fdfe0 100644 --- a/reactos/dll/cpl/desk/lang/ja-JP.rc +++ b/reactos/dll/cpl/desk/lang/ja-JP.rc @@ -44,7 +44,7 @@ BEGIN PUSHBUTTON "電源(&O)...", IDC_SCREENS_POWER_BUTTON, 165, 171, 61, 13 END -IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 204 +IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 234 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "デザイン" FONT 9, "MS UI Gothic" @@ -55,6 +55,8 @@ BEGIN COMBOBOX IDC_APPEARANCE_VISUAL_STYLE, 7, 140, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "配色", IDC_STATIC, 7, 160, 64, 7 COMBOBOX IDC_APPEARANCE_COLORSCHEME, 7, 170, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Size", IDC_STATIC, 7, 190, 64, 7 + COMBOBOX IDC_APPEARANCE_SIZE, 7, 200, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "効果(&E)...", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15 PUSHBUTTON "詳細設定(&V)...", IDC_APPEARANCE_ADVANCED, 182, 170, 56, 15 END @@ -231,6 +233,7 @@ BEGIN IDS_MESSBOX "メッセージ ボックス" IDS_MESSTEXT "メッセージ テキスト" IDS_BUTTEXT "OK" + IDS_CLASSIC_THEME "Classic Theme" END STRINGTABLE DISCARDABLE diff --git a/reactos/dll/cpl/desk/lang/nl-NL.rc b/reactos/dll/cpl/desk/lang/nl-NL.rc index 70a0db5383b..ab9516ae4a4 100644 --- a/reactos/dll/cpl/desk/lang/nl-NL.rc +++ b/reactos/dll/cpl/desk/lang/nl-NL.rc @@ -46,7 +46,7 @@ BEGIN PUSHBUTTON "&Energie...", IDC_SCREENS_POWER_BUTTON, 165, 171, 61, 13 END -IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 204 +IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 234 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Vormgeving" FONT 8, "MS Shell Dlg" @@ -57,6 +57,8 @@ BEGIN COMBOBOX IDC_APPEARANCE_VISUAL_STYLE, 7, 140, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "Kleurenschema", IDC_STATIC, 7, 160, 64, 7 COMBOBOX IDC_APPEARANCE_COLORSCHEME, 7, 170, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Size", IDC_STATIC, 7, 190, 64, 7 + COMBOBOX IDC_APPEARANCE_SIZE, 7, 200, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&Effecten...", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15 PUSHBUTTON "Geavan&ceerd...", IDC_APPEARANCE_ADVANCED, 182, 170, 56, 15 END @@ -233,6 +235,7 @@ BEGIN IDS_MESSBOX "Berichtvenster" IDS_MESSTEXT "Berichttekst" IDS_BUTTEXT "OK" + IDS_CLASSIC_THEME "Classic Theme" END STRINGTABLE DISCARDABLE diff --git a/reactos/dll/cpl/desk/lang/no-NO.rc b/reactos/dll/cpl/desk/lang/no-NO.rc index 76dd114d364..1805f18f3f7 100644 --- a/reactos/dll/cpl/desk/lang/no-NO.rc +++ b/reactos/dll/cpl/desk/lang/no-NO.rc @@ -44,7 +44,7 @@ BEGIN PUSHBUTTON "S&trøm...", IDC_SCREENS_POWER_BUTTON, 165, 171, 61, 13 END -IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 204 +IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 234 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Utseende" FONT 8, "MS Shell Dlg" @@ -55,6 +55,8 @@ BEGIN COMBOBOX IDC_APPEARANCE_VISUAL_STYLE, 7, 140, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "Fargevalg", IDC_STATIC, 7, 160, 64, 7 COMBOBOX IDC_APPEARANCE_COLORSCHEME, 7, 170, 134, 90 , CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Size", IDC_STATIC, 7, 190, 64, 7 + COMBOBOX IDC_APPEARANCE_SIZE, 7, 200, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&Effekter...", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15 PUSHBUTTON "Avansert", IDC_APPEARANCE_ADVANCED, 182, 170, 56, 15 END @@ -231,6 +233,7 @@ BEGIN IDS_MESSBOX "Meldingboks" IDS_MESSTEXT "Meldingtekst" IDS_BUTTEXT "OK" + IDS_CLASSIC_THEME "Classic Theme" END STRINGTABLE DISCARDABLE diff --git a/reactos/dll/cpl/desk/lang/pl-PL.rc b/reactos/dll/cpl/desk/lang/pl-PL.rc index 4c4d978a50e..9d5a591dbeb 100644 --- a/reactos/dll/cpl/desk/lang/pl-PL.rc +++ b/reactos/dll/cpl/desk/lang/pl-PL.rc @@ -53,7 +53,7 @@ BEGIN PUSHBUTTON "Z&asilanie...", IDC_SCREENS_POWER_BUTTON, 165, 171, 61, 13 END -IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 204 +IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 234 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Wygląd" FONT 8, "MS Shell Dlg" @@ -64,6 +64,8 @@ BEGIN COMBOBOX IDC_APPEARANCE_VISUAL_STYLE, 7, 140, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "Schemat kolorów", IDC_STATIC, 7, 160, 64, 7 COMBOBOX IDC_APPEARANCE_COLORSCHEME, 7, 170, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Size", IDC_STATIC, 7, 190, 64, 7 + COMBOBOX IDC_APPEARANCE_SIZE, 7, 200, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&Efekty...", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15 PUSHBUTTON "Zaawansowane", IDC_APPEARANCE_ADVANCED, 182, 170, 56, 15 END @@ -240,6 +242,7 @@ BEGIN IDS_MESSBOX "Okno komunikatu" IDS_MESSTEXT "Treść wiadomości" IDS_BUTTEXT "OK" + IDS_CLASSIC_THEME "Classic Theme" END STRINGTABLE DISCARDABLE diff --git a/reactos/dll/cpl/desk/lang/ro-RO.rc b/reactos/dll/cpl/desk/lang/ro-RO.rc index 42117943d67..bcf43ee8d95 100644 --- a/reactos/dll/cpl/desk/lang/ro-RO.rc +++ b/reactos/dll/cpl/desk/lang/ro-RO.rc @@ -45,7 +45,7 @@ BEGIN PUSHBUTTON "&Energie…", IDC_SCREENS_POWER_BUTTON, 165, 171, 61, 13 END -IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 204 +IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 234 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Aspect" FONT 8, "MS Shell Dlg" @@ -56,6 +56,8 @@ BEGIN COMBOBOX IDC_APPEARANCE_VISUAL_STYLE, 7, 140, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "Colorit", IDC_STATIC, 7, 160, 64, 7 COMBOBOX IDC_APPEARANCE_COLORSCHEME, 7, 170, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Size", IDC_STATIC, 7, 190, 64, 7 + COMBOBOX IDC_APPEARANCE_SIZE, 7, 200, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&Efecte…", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15 PUSHBUTTON "A&vansate…", IDC_APPEARANCE_ADVANCED, 182, 170, 56, 15 END @@ -232,6 +234,7 @@ BEGIN IDS_MESSBOX "Fereastră mesaj" IDS_MESSTEXT "Text mesaj" IDS_BUTTEXT "Î&nchide" + IDS_CLASSIC_THEME "Classic Theme" END STRINGTABLE DISCARDABLE diff --git a/reactos/dll/cpl/desk/lang/ru-RU.rc b/reactos/dll/cpl/desk/lang/ru-RU.rc index 7cf56ed5776..573f3e6bfa4 100644 --- a/reactos/dll/cpl/desk/lang/ru-RU.rc +++ b/reactos/dll/cpl/desk/lang/ru-RU.rc @@ -44,7 +44,7 @@ BEGIN PUSHBUTTON "П&итание...", IDC_SCREENS_POWER_BUTTON, 165, 171, 61, 13 END -IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 204 +IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 234 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Оформление" FONT 8, "MS Shell Dlg" @@ -55,6 +55,8 @@ BEGIN COMBOBOX IDC_APPEARANCE_VISUAL_STYLE, 7, 140, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "Цветовая схема", IDC_STATIC, 7, 160, 64, 7 COMBOBOX IDC_APPEARANCE_COLORSCHEME, 7, 170, 134, 90 , CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Size", IDC_STATIC, 7, 190, 64, 7 + COMBOBOX IDC_APPEARANCE_SIZE, 7, 200, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&Эффекты...", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15 PUSHBUTTON "Дополнительно", IDC_APPEARANCE_ADVANCED, 182, 170, 56, 15 END @@ -231,6 +233,7 @@ BEGIN IDS_MESSBOX "Окно сообщения" IDS_MESSTEXT "Сообщение" IDS_BUTTEXT "OK" + IDS_CLASSIC_THEME "Classic Theme" END STRINGTABLE DISCARDABLE diff --git a/reactos/dll/cpl/desk/lang/sk-SK.rc b/reactos/dll/cpl/desk/lang/sk-SK.rc index eabd0459d5b..05575c09982 100644 --- a/reactos/dll/cpl/desk/lang/sk-SK.rc +++ b/reactos/dll/cpl/desk/lang/sk-SK.rc @@ -52,7 +52,7 @@ BEGIN PUSHBUTTON "N&apájanie...", IDC_SCREENS_POWER_BUTTON, 165, 171, 61, 13 END -IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 204 +IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 234 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Vzhľad" FONT 8, "MS Shell Dlg" @@ -63,6 +63,8 @@ BEGIN COMBOBOX IDC_APPEARANCE_VISUAL_STYLE, 7, 140, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "&Farebná schéma", IDC_STATIC, 7, 160, 64, 7 COMBOBOX IDC_APPEARANCE_COLORSCHEME, 7, 170, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Size", IDC_STATIC, 7, 190, 64, 7 + COMBOBOX IDC_APPEARANCE_SIZE, 7, 200, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&Efekty...", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15 PUSHBUTTON "&Spresniť", IDC_APPEARANCE_ADVANCED, 182, 170, 56, 15 END @@ -239,6 +241,7 @@ BEGIN IDS_MESSBOX "Okno správy" IDS_MESSTEXT "Text správy" IDS_BUTTEXT "OK" + IDS_CLASSIC_THEME "Classic Theme" END STRINGTABLE DISCARDABLE diff --git a/reactos/dll/cpl/desk/lang/sv-SE.rc b/reactos/dll/cpl/desk/lang/sv-SE.rc index 94c8f869df4..eb2f1e597bf 100644 --- a/reactos/dll/cpl/desk/lang/sv-SE.rc +++ b/reactos/dll/cpl/desk/lang/sv-SE.rc @@ -47,7 +47,7 @@ BEGIN PUSHBUTTON "P&ower...", IDC_SCREENS_POWER_BUTTON, 165, 171, 61, 13 END -IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 204 +IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 234 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Utseende" FONT 8, "MS Shell Dlg" @@ -58,6 +58,8 @@ BEGIN COMBOBOX IDC_APPEARANCE_VISUAL_STYLE, 7, 140, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "Item", IDC_STATIC, 7, 160, 64, 7 COMBOBOX IDC_APPEARANCE_COLORSCHEME, 7, 170, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Size", IDC_STATIC, 7, 190, 64, 7 + COMBOBOX IDC_APPEARANCE_SIZE, 7, 200, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&Effects...", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15 PUSHBUTTON "Advanced", IDC_APPEARANCE_ADVANCED, 182, 170, 56, 15 END @@ -234,6 +236,7 @@ BEGIN IDS_MESSBOX "Message Box" IDS_MESSTEXT "Message Text" IDS_BUTTEXT "OK" + IDS_CLASSIC_THEME "Classic Theme" END STRINGTABLE DISCARDABLE diff --git a/reactos/dll/cpl/desk/lang/uk-UA.rc b/reactos/dll/cpl/desk/lang/uk-UA.rc index bd595e6fee1..c5cb1404c1b 100644 --- a/reactos/dll/cpl/desk/lang/uk-UA.rc +++ b/reactos/dll/cpl/desk/lang/uk-UA.rc @@ -52,7 +52,7 @@ BEGIN PUSHBUTTON "&Живлення...", IDC_SCREENS_POWER_BUTTON, 165, 171, 61, 13 END -IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 204 +IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 234 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Оформлення" FONT 8, "MS Shell Dlg" @@ -63,6 +63,8 @@ BEGIN COMBOBOX IDC_APPEARANCE_VISUAL_STYLE, 7, 140, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "Колірна схема", IDC_STATIC, 7, 160, 64, 7 COMBOBOX IDC_APPEARANCE_COLORSCHEME, 7, 170, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Size", IDC_STATIC, 7, 190, 64, 7 + COMBOBOX IDC_APPEARANCE_SIZE, 7, 200, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&Ефекти...", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15 PUSHBUTTON "Додатково", IDC_APPEARANCE_ADVANCED, 182, 170, 56, 15 END @@ -239,6 +241,7 @@ BEGIN IDS_MESSBOX "Вікно повідомлення" IDS_MESSTEXT "Повідомлення" IDS_BUTTEXT "OK" + IDS_CLASSIC_THEME "Classic Theme" END STRINGTABLE DISCARDABLE diff --git a/reactos/dll/cpl/desk/lang/zh-CN.rc b/reactos/dll/cpl/desk/lang/zh-CN.rc index 50e58181851..12131d68fec 100644 --- a/reactos/dll/cpl/desk/lang/zh-CN.rc +++ b/reactos/dll/cpl/desk/lang/zh-CN.rc @@ -51,7 +51,7 @@ BEGIN PUSHBUTTON "电源(&O)...", IDC_SCREENS_POWER_BUTTON, 165, 171, 61, 13 END -IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 204 +IDD_APPEARANCE DIALOGEX DISCARDABLE 0, 0, 246, 234 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "外观" FONT 9, "MS Shell Dlg" @@ -62,6 +62,8 @@ BEGIN COMBOBOX IDC_APPEARANCE_VISUAL_STYLE, 7, 140, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "色彩方案", IDC_STATIC, 7, 160, 64, 7 COMBOBOX IDC_APPEARANCE_COLORSCHEME, 7, 170, 134, 90 , CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Size", IDC_STATIC, 7, 190, 64, 7 + COMBOBOX IDC_APPEARANCE_SIZE, 7, 200, 134, 90, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "效果(&E)...", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15 PUSHBUTTON "高级(&D)", IDC_APPEARANCE_ADVANCED, 182, 170, 56, 15 END @@ -238,6 +240,7 @@ BEGIN IDS_MESSBOX "消息框" IDS_MESSTEXT "消息内容" IDS_BUTTEXT "确定" + IDS_CLASSIC_THEME "Classic Theme" END STRINGTABLE DISCARDABLE diff --git a/reactos/dll/cpl/desk/preview.c b/reactos/dll/cpl/desk/preview.c index a230ecb0d7f..453cd144af6 100644 --- a/reactos/dll/cpl/desk/preview.c +++ b/reactos/dll/cpl/desk/preview.c @@ -12,6 +12,8 @@ static const TCHAR szPreviewWndClass[] = TEXT("PreviewWndClass"); typedef struct _PREVIEW_DATA { + HDC hdcPreview; + HWND hwndParent; COLOR_SCHEME Scheme; @@ -80,27 +82,27 @@ static VOID UpdatePreviewTheme(HWND hwnd, PPREVIEW_DATA pPreviewData, COLOR_SCHE DeleteObject(pPreviewData->hbrWindow); pPreviewData->hbrWindow = CreateSolidBrush(scheme->crColor[COLOR_WINDOW]); - pPreviewData->cxEdge = scheme->Size[SIZE_EDGE_X] - 2; /* SM_CXEDGE */ - pPreviewData->cyEdge = scheme->Size[SIZE_EDGE_Y] - 2; /* SM_CYEDGE */ + pPreviewData->cxEdge = 2; /* SM_CXEDGE */ + pPreviewData->cyEdge = 2; /* SM_CYEDGE */ - pPreviewData->cySizeFrame = scheme->Size[SIZE_FRAME_Y] - 1; /* SM_CYSIZEFRAME */ + pPreviewData->cySizeFrame = scheme->ncMetrics.iBorderWidth; /* SM_CYSIZEFRAME */ - pPreviewData->cyCaption = scheme->Size[SIZE_CAPTION_Y]; /* SM_CYCAPTION */ - pPreviewData->cyMenu = scheme->Size[SIZE_MENU_Y]; /* SM_CYMENU */ - pPreviewData->cxScrollbar = scheme->Size[SIZE_SCROLL_X]; /* SM_CXVSCROLL */ - pPreviewData->cyBorder = scheme->Size[SIZE_BORDER_Y]; /* SM_CYBORDER */ + pPreviewData->cyCaption = scheme->ncMetrics.iCaptionHeight+1; /* SM_CYCAPTION */ + pPreviewData->cyMenu = scheme->ncMetrics.iMenuHeight -1; /* SM_CYMENU */ + pPreviewData->cxScrollbar = scheme->ncMetrics.iScrollWidth; /* SM_CXVSCROLL */ + pPreviewData->cyBorder = scheme->ncMetrics.iBorderWidth; /* SM_CYBORDER */ if (pPreviewData->hCaptionFont != NULL) DeleteObject(pPreviewData->hCaptionFont); - pPreviewData->hCaptionFont = CreateFontIndirect(&scheme->lfFont[FONT_CAPTION]); + pPreviewData->hCaptionFont = CreateFontIndirect(&scheme->ncMetrics.lfCaptionFont); if (pPreviewData->hMenuFont != NULL) DeleteObject(pPreviewData->hMenuFont); - pPreviewData->hMenuFont = CreateFontIndirect(&scheme->lfFont[FONT_MENU]); + pPreviewData->hMenuFont = CreateFontIndirect(&scheme->ncMetrics.lfMenuFont); if (pPreviewData->hMessageFont != NULL) DeleteObject(pPreviewData->hMessageFont); - pPreviewData->hMessageFont = CreateFontIndirect(&scheme->lfFont[FONT_DIALOG]); + pPreviewData->hMessageFont = CreateFontIndirect(&scheme->ncMetrics.lfMessageFont); pPreviewData->Scheme = *scheme; InvalidateRect(hwnd, NULL, FALSE); @@ -258,18 +260,25 @@ OnPaint(HWND hwnd, PPREVIEW_DATA pPreviewData) hdc = BeginPaint(hwnd, &ps); + if(pPreviewData->hdcPreview) + { + BitBlt(hdc,0,0, pPreviewData->rcDesktop.right, pPreviewData->rcDesktop.bottom, pPreviewData->hdcPreview, 0,0, SRCCOPY); + EndPaint(hwnd, &ps); + return; + } + /* Desktop */ FillRect(hdc, &pPreviewData->rcDesktop, pPreviewData->hbrDesktop); /* Inactive Window */ - MyDrawEdge(hdc, &pPreviewData->rcInactiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE, scheme); + MyDrawEdge(hdc, &pPreviewData->rcInactiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE | MY_BF_INACTIVEBORDER, scheme); SetTextColor(hdc, scheme->crColor[COLOR_INACTIVECAPTIONTEXT]); MyDrawCaptionTemp(NULL, hdc, &pPreviewData->rcInactiveCaption, pPreviewData->hCaptionFont, NULL, pPreviewData->lpInAct, DC_GRADIENT | DC_ICON | DC_TEXT, scheme); MyDrawCaptionButtons(hdc, &pPreviewData->rcInactiveCaption, TRUE, pPreviewData->cyCaption - 2, scheme); /* Active Window */ - MyDrawEdge(hdc, &pPreviewData->rcActiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE, scheme); + MyDrawEdge(hdc, &pPreviewData->rcActiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE | MY_BF_ACTIVEBORDER, scheme); SetTextColor(hdc, scheme->crColor[COLOR_CAPTIONTEXT]); MyDrawCaptionTemp(NULL, hdc, &pPreviewData->rcActiveCaption, pPreviewData->hCaptionFont, NULL, pPreviewData->lpAct, DC_ACTIVE | DC_GRADIENT | DC_ICON | DC_TEXT, scheme); @@ -308,7 +317,7 @@ OnPaint(HWND hwnd, PPREVIEW_DATA pPreviewData) CopyRect(&rc, &pPreviewData->rcDialogClient); rc.left += 4; rc.top += 2; - SetTextColor(hdc, scheme->crColor[COLOR_BTNTEXT]); + SetTextColor(hdc, scheme->crColor[COLOR_WINDOWTEXT]); hOldFont = SelectObject(hdc, pPreviewData->hMessageFont); DrawText(hdc, pPreviewData->lpMessText, -1, &rc, DT_LEFT); SelectObject(hdc, hOldFont); @@ -445,56 +454,78 @@ PreviewWndProc(HWND hwnd, HeapFree(GetProcessHeap(), 0, pPreviewData); break; - case PVM_GETCYCAPTION: - return pPreviewData->cyCaption; - - case PVM_SETCYCAPTION: - if ((INT)lParam > 0) - { - pPreviewData->cyCaption = (INT)lParam; - CalculateItemSize(pPreviewData); - InvalidateRect(hwnd, NULL, FALSE); - } - break; - - case PVM_GETCYMENU: - return pPreviewData->cyMenu; - - case PVM_SETCYMENU: - if ((INT)lParam > 0) - { - pPreviewData->cyMenu = (INT)lParam; - CalculateItemSize(pPreviewData); - InvalidateRect(hwnd, NULL, FALSE); - } - break; - - case PVM_GETCXSCROLLBAR: - return pPreviewData->cxScrollbar; - - case PVM_SETCXSCROLLBAR: - if ((INT)lParam > 0) - { - pPreviewData->cxScrollbar = (INT)lParam; - CalculateItemSize(pPreviewData); - InvalidateRect(hwnd, NULL, FALSE); - } - break; - - case PVM_GETCYSIZEFRAME: - return pPreviewData->cySizeFrame; - - case PVM_SETCYSIZEFRAME: - if ((INT)lParam > 0) - { - pPreviewData->cySizeFrame = (INT)lParam; - CalculateItemSize(pPreviewData); - InvalidateRect(hwnd, NULL, FALSE); - } - break; - case PVM_UPDATETHEME: UpdatePreviewTheme(hwnd, pPreviewData, (COLOR_SCHEME *)lParam); + CalculateItemSize(pPreviewData); + InvalidateRect(hwnd, NULL, FALSE); + break; + + case PVM_SETSIZE: + SchemeSetMetric(&pPreviewData->Scheme, wParam, lParam); + pPreviewData->cySizeFrame = pPreviewData->Scheme.ncMetrics.iBorderWidth; /* SM_CYSIZEFRAME */ + pPreviewData->cyCaption = pPreviewData->Scheme.ncMetrics.iCaptionHeight+1; /* SM_CYCAPTION */ + pPreviewData->cyMenu = pPreviewData->Scheme.ncMetrics.iMenuHeight -1; /* SM_CYMENU */ + pPreviewData->cxScrollbar = pPreviewData->Scheme.ncMetrics.iScrollWidth; /* SM_CXVSCROLL */ + pPreviewData->cyBorder = pPreviewData->Scheme.ncMetrics.iBorderWidth; /* SM_CYBORDER */ + CalculateItemSize(pPreviewData); + InvalidateRect(hwnd, NULL, FALSE); + break; + + case PVM_SETFONT: + { + PLOGFONTW plfFont; + HFONT* phFont; + + switch(wParam) + { + case FONT_CAPTION: phFont = &pPreviewData->hCaptionFont; break; + case FONT_MENU: phFont = &pPreviewData->hMenuFont; break; + case FONT_MESSAGE: phFont = &pPreviewData->hMessageFont; break; + default: return TRUE; + } + + plfFont = SchemeGetFont(&pPreviewData->Scheme, wParam); + memcpy(plfFont, (PVOID)lParam, sizeof(LOGFONTW)); + + DeleteObject(*phFont); + *phFont = CreateFontIndirect(plfFont); + + InvalidateRect(hwnd, NULL, FALSE); + break; + } + + case PVM_SETCOLOR: + pPreviewData->Scheme.crColor[wParam] = lParam; + switch(wParam) + { + case COLOR_SCROLLBAR: + DeleteObject(pPreviewData->hbrScrollbar); + pPreviewData->hbrScrollbar = CreateSolidBrush(pPreviewData->Scheme.crColor[wParam]); + break; + case COLOR_DESKTOP: + DeleteObject(pPreviewData->hbrDesktop); + pPreviewData->hbrDesktop = CreateSolidBrush(pPreviewData->Scheme.crColor[wParam]); + break; + case COLOR_WINDOW: + DeleteObject(pPreviewData->hbrWindow); + pPreviewData->hbrWindow = CreateSolidBrush(pPreviewData->Scheme.crColor[wParam]); + break; + } + + CalculateItemSize(pPreviewData); + InvalidateRect(hwnd, NULL, FALSE); + break; + + case PVM_GETSIZE: + return SchemeGetMetric(&pPreviewData->Scheme, wParam); + case PVM_GETFONT: + return (LRESULT)SchemeGetFont(&pPreviewData->Scheme, wParam); + case PVM_GETCOLOR: + return pPreviewData->Scheme.crColor[wParam]; + + case PVM_SET_HDC_PREVIEW: + pPreviewData->hdcPreview = (HDC)lParam; + InvalidateRect(hwnd, NULL, FALSE); break; default: diff --git a/reactos/dll/cpl/desk/preview.h b/reactos/dll/cpl/desk/preview.h index 987f02415ee..b4363c404ae 100644 --- a/reactos/dll/cpl/desk/preview.h +++ b/reactos/dll/cpl/desk/preview.h @@ -21,19 +21,14 @@ #define IDX_APPSPACE 16 #define IDX_QUICKINFO 20 -#define PVM_GETCYCAPTION (WM_USER+1) -#define PVM_SETCYCAPTION (WM_USER+2) - -#define PVM_GETCYMENU (WM_USER+3) -#define PVM_SETCYMENU (WM_USER+4) - -#define PVM_GETCXSCROLLBAR (WM_USER+5) -#define PVM_SETCXSCROLLBAR (WM_USER+6) - -#define PVM_GETCYSIZEFRAME (WM_USER+7) -#define PVM_SETCYSIZEFRAME (WM_USER+8) - -#define PVM_UPDATETHEME (WM_USER+13) +#define PVM_SETSIZE (WM_USER+1) +#define PVM_GETSIZE (WM_USER+2) +#define PVM_SETFONT (WM_USER+3) +#define PVM_GETFONT (WM_USER+4) +#define PVM_SETCOLOR (WM_USER+5) +#define PVM_GETCOLOR (WM_USER+6) +#define PVM_SET_HDC_PREVIEW (WM_USER+7) +#define PVM_UPDATETHEME (WM_USER+8) BOOL RegisterPreviewControl(IN HINSTANCE hInstance); VOID UnregisterPreviewControl(IN HINSTANCE hInstance); diff --git a/reactos/dll/cpl/desk/resource.h b/reactos/dll/cpl/desk/resource.h index 0936a09410c..89773bd1a27 100644 --- a/reactos/dll/cpl/desk/resource.h +++ b/reactos/dll/cpl/desk/resource.h @@ -97,6 +97,7 @@ #define IDC_APPEARANCE_EFFECTS 1503 #define IDC_APPEARANCE_ADVANCED 1504 #define IDC_APPEARANCE_VISUAL_STYLE 1505 +#define IDC_APPEARANCE_SIZE 1506 #define IDS_INACTWIN 1510 #define IDS_ACTWIN 1511 @@ -104,6 +105,7 @@ #define IDS_MESSBOX 1513 #define IDS_MESSTEXT 1514 #define IDS_BUTTEXT 1515 +#define IDS_CLASSIC_THEME 1516 /* Update these IDs when you change the string id list */ #define IDS_ITEM_FIRST (IDS_ITEM_3D_OBJECTS) diff --git a/reactos/dll/cpl/desk/theme.c b/reactos/dll/cpl/desk/theme.c index 6e8ad7d170c..4eb22944912 100644 --- a/reactos/dll/cpl/desk/theme.c +++ b/reactos/dll/cpl/desk/theme.c @@ -9,113 +9,159 @@ #include "desk.h" -static BOOL g_PresetLoaded = FALSE; -INT g_TemplateCount = 0; - -static INT g_ColorList[NUM_COLORS]; - -static const TCHAR g_CPColors[] = TEXT("Control Panel\\Colors"); -static const TCHAR g_CPANewSchemes[] = TEXT("Control Panel\\Appearance\\New Schemes"); -static const TCHAR g_SelectedStyle[] = TEXT("SelectedStyle"); +static const WCHAR g_CPColors[] = L"Control Panel\\Colors"; +static const WCHAR g_CPANewSchemes[] = L"Control Panel\\Appearance\\New Schemes"; +static const WCHAR g_CPMetrics[] = L"Control Panel\\Desktop\\WindowMetrics"; +static const WCHAR g_SelectedStyle[] = L"SelectedStyle"; /******************************************************************************/ -SCHEME_PRESET g_ColorSchemes[MAX_TEMPLATES]; - /* This is the list of names for the colors stored in the registry */ -static const TCHAR *g_RegColorNames[NUM_COLORS] = - {TEXT("Scrollbar"), /* 00 = COLOR_SCROLLBAR */ - TEXT("Background"), /* 01 = COLOR_DESKTOP */ - TEXT("ActiveTitle"), /* 02 = COLOR_ACTIVECAPTION */ - TEXT("InactiveTitle"), /* 03 = COLOR_INACTIVECAPTION */ - TEXT("Menu"), /* 04 = COLOR_MENU */ - TEXT("Window"), /* 05 = COLOR_WINDOW */ - TEXT("WindowFrame"), /* 06 = COLOR_WINDOWFRAME */ - TEXT("MenuText"), /* 07 = COLOR_MENUTEXT */ - TEXT("WindowText"), /* 08 = COLOR_WINDOWTEXT */ - TEXT("TitleText"), /* 09 = COLOR_CAPTIONTEXT */ - TEXT("ActiveBorder"), /* 10 = COLOR_ACTIVEBORDER */ - TEXT("InactiveBorder"), /* 11 = COLOR_INACTIVEBORDER */ - TEXT("AppWorkSpace"), /* 12 = COLOR_APPWORKSPACE */ - TEXT("Hilight"), /* 13 = COLOR_HIGHLIGHT */ - TEXT("HilightText"), /* 14 = COLOR_HIGHLIGHTTEXT */ - TEXT("ButtonFace"), /* 15 = COLOR_BTNFACE */ - TEXT("ButtonShadow"), /* 16 = COLOR_BTNSHADOW */ - TEXT("GrayText"), /* 17 = COLOR_GRAYTEXT */ - TEXT("ButtonText"), /* 18 = COLOR_BTNTEXT */ - TEXT("InactiveTitleText"), /* 19 = COLOR_INACTIVECAPTIONTEXT */ - TEXT("ButtonHilight"), /* 20 = COLOR_BTNHIGHLIGHT */ - TEXT("ButtonDkShadow"), /* 21 = COLOR_3DDKSHADOW */ - TEXT("ButtonLight"), /* 22 = COLOR_3DLIGHT */ - TEXT("InfoText"), /* 23 = COLOR_INFOTEXT */ - TEXT("InfoWindow"), /* 24 = COLOR_INFOBK */ - TEXT("ButtonAlternateFace"), /* 25 = COLOR_ALTERNATEBTNFACE */ - TEXT("HotTrackingColor"), /* 26 = COLOR_HOTLIGHT */ - TEXT("GradientActiveTitle"), /* 27 = COLOR_GRADIENTACTIVECAPTION */ - TEXT("GradientInactiveTitle"), /* 28 = COLOR_GRADIENTINACTIVECAPTION */ - TEXT("MenuHilight"), /* 29 = COLOR_MENUHILIGHT */ - TEXT("MenuBar"), /* 30 = COLOR_MENUBAR */ -}; - -/* This is the list of used metrics and their numbers */ -static const int g_SizeMetric[NUM_SIZES] = -{ - SM_CXBORDER, /* 00: SIZE_BORDER_X */ - SM_CYBORDER, /* 01: SIZE_BORDER_Y */ - SM_CYSIZE, /* 02: SIZE_CAPTION_Y */ - SM_CXICON, /* 03: SIZE_ICON_X */ - SM_CYICON, /* 04: SIZE_ICON_Y */ - SM_CXICONSPACING, /* 05: SIZE_ICON_SPC_X */ - SM_CYICONSPACING, /* 06: SIZE_ICON_SPC_Y */ - SM_CXMENUSIZE, /* 07: SIZE_MENU_SIZE_X */ - SM_CYMENU, /* 08: SIZE_MENU_Y */ - SM_CXVSCROLL, /* 09: SIZE_SCROLL_X */ - SM_CYHSCROLL, /* 10: SIZE_SCROLL_Y */ - SM_CYSMSIZE, /* 11: SIZE_SMCAPTION_Y */ - SM_CXEDGE, /* 12: SIZE_EDGE_X */ - SM_CYEDGE, /* 13: SIZE_EDGE_Y */ - SM_CYSIZEFRAME, /* 14: SIZE_FRAME_Y */ - SM_CXMENUCHECK, /* 15: SIZE_MENU_CHECK_X */ - SM_CYMENUCHECK, /* 16: SIZE_MENU_CHECK_Y */ - SM_CYMENUSIZE, /* 17: SIZE_MENU_SIZE_Y */ - SM_CXSIZE, /* 18: SIZE_SIZE_X */ - SM_CYSIZE /* 19: SIZE_SIZE_Y */ +static const WCHAR *g_RegColorNames[NUM_COLORS] = { + L"Scrollbar", /* 00 = COLOR_SCROLLBAR */ + L"Background", /* 01 = COLOR_DESKTOP */ + L"ActiveTitle", /* 02 = COLOR_ACTIVECAPTION */ + L"InactiveTitle", /* 03 = COLOR_INACTIVECAPTION */ + L"Menu", /* 04 = COLOR_MENU */ + L"Window", /* 05 = COLOR_WINDOW */ + L"WindowFrame", /* 06 = COLOR_WINDOWFRAME */ + L"MenuText", /* 07 = COLOR_MENUTEXT */ + L"WindowText", /* 08 = COLOR_WINDOWTEXT */ + L"TitleText", /* 09 = COLOR_CAPTIONTEXT */ + L"ActiveBorder", /* 10 = COLOR_ACTIVEBORDER */ + L"InactiveBorder", /* 11 = COLOR_INACTIVEBORDER */ + L"AppWorkSpace", /* 12 = COLOR_APPWORKSPACE */ + L"Hilight", /* 13 = COLOR_HIGHLIGHT */ + L"HilightText", /* 14 = COLOR_HIGHLIGHTTEXT */ + L"ButtonFace", /* 15 = COLOR_BTNFACE */ + L"ButtonShadow", /* 16 = COLOR_BTNSHADOW */ + L"GrayText", /* 17 = COLOR_GRAYTEXT */ + L"ButtonText", /* 18 = COLOR_BTNTEXT */ + L"InactiveTitleText", /* 19 = COLOR_INACTIVECAPTIONTEXT */ + L"ButtonHilight", /* 20 = COLOR_BTNHIGHLIGHT */ + L"ButtonDkShadow", /* 21 = COLOR_3DDKSHADOW */ + L"ButtonLight", /* 22 = COLOR_3DLIGHT */ + L"InfoText", /* 23 = COLOR_INFOTEXT */ + L"InfoWindow", /* 24 = COLOR_INFOBK */ + L"ButtonAlternateFace", /* 25 = COLOR_ALTERNATEBTNFACE */ + L"HotTrackingColor", /* 26 = COLOR_HOTLIGHT */ + L"GradientActiveTitle", /* 27 = COLOR_GRADIENTACTIVECAPTION */ + L"GradientInactiveTitle", /* 28 = COLOR_GRADIENTINACTIVECAPTION */ + L"MenuHilight", /* 29 = COLOR_MENUHILIGHT */ + L"MenuBar", /* 30 = COLOR_MENUBAR */ }; /******************************************************************************/ -VOID LoadCurrentScheme(COLOR_SCHEME* scheme) +VOID +SchemeSetMetric(IN COLOR_SCHEME *scheme, int id, int value) { - INT i; - NONCLIENTMETRICS NonClientMetrics; + switch(id) + { + case SIZE_BORDER_WIDTH: scheme->ncMetrics.iBorderWidth = value; break; + case SIZE_SCROLL_WIDTH: scheme->ncMetrics.iScrollWidth = value; break; + case SIZE_SCROLL_HEIGHT: scheme->ncMetrics.iScrollHeight = value; break; + case SIZE_CAPTION_WIDTH: scheme->ncMetrics.iCaptionWidth = value; break; + case SIZE_CAPTION_HEIGHT: scheme->ncMetrics.iCaptionHeight = value; break; + case SIZE_SM_CAPTION_WIDTH: scheme->ncMetrics.iSmCaptionWidth = value; break; + case SIZE_SM_CAPTION_HEIGHT: scheme->ncMetrics.iSmCaptionHeight = value; break; + case SIZE_MENU_WIDTH: scheme->ncMetrics.iMenuWidth = value; break; + case SIZE_MENU_HEIGHT: scheme->ncMetrics.iMenuHeight = value; break; + case SIZE_ICON: scheme->iIconSize = value; break; + case SIZE_ICON_SPACE_X: scheme->icMetrics.iHorzSpacing = value; break; + case SIZE_ICON_SPACE_Y: scheme->icMetrics.iVertSpacing = value; break; + } +} + +int +SchemeGetMetric(IN COLOR_SCHEME *scheme, int id) +{ + switch (id) + { + case SIZE_BORDER_WIDTH: return scheme->ncMetrics.iBorderWidth; + case SIZE_SCROLL_WIDTH: return scheme->ncMetrics.iScrollWidth; + case SIZE_SCROLL_HEIGHT: return scheme->ncMetrics.iScrollHeight; + case SIZE_CAPTION_WIDTH: return scheme->ncMetrics.iCaptionWidth; + case SIZE_CAPTION_HEIGHT: return scheme->ncMetrics.iCaptionHeight; + case SIZE_SM_CAPTION_WIDTH: return scheme->ncMetrics.iSmCaptionWidth; + case SIZE_SM_CAPTION_HEIGHT: return scheme->ncMetrics.iSmCaptionHeight; + case SIZE_MENU_WIDTH: return scheme->ncMetrics.iMenuWidth; + case SIZE_MENU_HEIGHT: return scheme->ncMetrics.iMenuHeight; + case SIZE_ICON: return scheme->iIconSize; + case SIZE_ICON_SPACE_X: return scheme->icMetrics.iHorzSpacing; + case SIZE_ICON_SPACE_Y: return scheme->icMetrics.iVertSpacing; + } + return 0; +} + +PLOGFONTW +SchemeGetFont(IN COLOR_SCHEME *scheme, int id) +{ + switch (id) + { + case FONT_CAPTION: return &scheme->ncMetrics.lfCaptionFont; + case FONT_SMCAPTION: return &scheme->ncMetrics.lfSmCaptionFont; + case FONT_MENU: return &scheme->ncMetrics.lfMenuFont; + case FONT_STATUS: return &scheme->ncMetrics.lfStatusFont; + case FONT_MESSAGE: return &scheme->ncMetrics.lfMessageFont; + case FONT_ICON: return &scheme->icMetrics.lfFont; + } + return NULL; +} + +/* + * LoadCurrentScheme: Populates the passed scheme based on the current system settings + */ +BOOL +LoadCurrentScheme(OUT COLOR_SCHEME *scheme) +{ + INT i, Result; + HKEY hKey; + BOOL ret; /* Load colors */ for (i = 0; i < NUM_COLORS; i++) { - g_ColorList[i] = i; scheme->crColor[i] = (COLORREF)GetSysColor(i); } - /* Load sizes */ - for (i = 0; i < NUM_SIZES; i++) - { - scheme->Size[i] = GetSystemMetrics(g_SizeMetric[i]); - } + /* Load non client metrics */ + scheme->ncMetrics.cbSize = sizeof(NONCLIENTMETRICSW); + ret = SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, + sizeof(NONCLIENTMETRICSW), + &scheme->ncMetrics, + 0); + if (!ret) return FALSE; - /* Load fonts */ - NonClientMetrics.cbSize = sizeof(NONCLIENTMETRICS); - SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &NonClientMetrics, 0); - scheme->lfFont[FONT_CAPTION] = NonClientMetrics.lfCaptionFont; - scheme->lfFont[FONT_SMCAPTION] = NonClientMetrics.lfSmCaptionFont; - scheme->lfFont[FONT_MENU] = NonClientMetrics.lfMenuFont; - scheme->lfFont[FONT_INFO] = NonClientMetrics.lfStatusFont; - scheme->lfFont[FONT_DIALOG] = NonClientMetrics.lfMessageFont; - SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &scheme->lfFont[FONT_ICON], 0); + /* Load icon metrics */ + scheme->icMetrics.cbSize = sizeof(ICONMETRICSW); + ret = SystemParametersInfoW(SPI_GETICONMETRICS, + sizeof(ICONMETRICSW), + &scheme->icMetrics, + 0); + if (!ret) return FALSE; + + /* Load flat menu style */ + ret = SystemParametersInfoW(SPI_GETFLATMENU, + 0, + &scheme->bFlatMenus, + 0); + if (!ret) return FALSE; /* Effects */ /* "Use the following transition effect for menus and tooltips" */ - SystemParametersInfo(SPI_GETMENUANIMATION, sizeof(BOOL), &scheme->Effects.bMenuAnimation, 0); - SystemParametersInfo(SPI_GETMENUFADE, sizeof(BOOL), &scheme->Effects.bMenuFade, 0); + ret = SystemParametersInfoW(SPI_GETMENUANIMATION, + 0, + &scheme->Effects.bMenuAnimation, + 0); + if (!ret) return FALSE; + + ret = SystemParametersInfoW(SPI_GETMENUFADE, + 0, + &scheme->Effects.bMenuFade, + 0); + if (!ret) return FALSE; + /* FIXME: XP seems to use grayed checkboxes to reflect differences between menu and tooltips settings * Just keep them in sync for now: */ @@ -123,151 +169,166 @@ VOID LoadCurrentScheme(COLOR_SCHEME* scheme) scheme->Effects.bTooltipFade = scheme->Effects.bMenuFade; /* Show content of windows during dragging */ - SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0, &scheme->Effects.bDragFullWindows, 0); + ret = SystemParametersInfoW(SPI_GETDRAGFULLWINDOWS, + 0, + &scheme->Effects.bDragFullWindows, + 0); + if (!ret) return FALSE; /* "Hide underlined letters for keyboard navigation until I press the Alt key" */ - SystemParametersInfo(SPI_GETKEYBOARDCUES, 0, &scheme->Effects.bKeyboardCues, 0); -} + ret = SystemParametersInfoW(SPI_GETKEYBOARDCUES, + 0, + &scheme->Effects.bKeyboardCues, + 0); + if (!ret) return FALSE; -BOOL LoadSchemeFromReg(COLOR_SCHEME* scheme, INT SchemeId) -{ - INT i; - TCHAR strSelectedStyle[4]; - TCHAR strSizeName[20] = TEXT("Sizes\\0"); - TCHAR strValueName[10]; - HKEY hkNewSchemes, hkScheme, hkSize; - DWORD dwType, dwLength; - UINT64 iSize; - BOOL Ret = FALSE; - - if (!g_PresetLoaded) - LoadSchemePresetEntries(strSelectedStyle); - - if (SchemeId == -1) - return FALSE; - - if (RegOpenKeyEx(HKEY_CURRENT_USER, g_CPANewSchemes, 0, KEY_READ, &hkNewSchemes) == ERROR_SUCCESS) + /* Read the icon size from registry */ + Result = RegOpenKeyW(HKEY_CURRENT_USER, g_CPMetrics, &hKey); + if(Result == ERROR_SUCCESS) { - if (RegOpenKeyEx(hkNewSchemes, g_ColorSchemes[SchemeId].strKeyName, 0, KEY_READ, &hkScheme) == ERROR_SUCCESS) - { - lstrcpyn(&strSizeName[6], g_ColorSchemes[SchemeId].strSizeName, 3); - if (RegOpenKeyEx(hkScheme, strSizeName, 0, KEY_READ, &hkSize) == ERROR_SUCCESS) - { - Ret = TRUE; - - dwLength = sizeof(DWORD); - if (RegQueryValueEx(hkSize, TEXT("FlatMenus"), NULL, &dwType, (LPBYTE)&scheme->bFlatMenus, &dwLength) != ERROR_SUCCESS || - dwType != REG_DWORD) - { - /* Failed to read registry value */ - scheme->bFlatMenus = FALSE; - } - - for (i = 0; i < NUM_COLORS; i++) - { - wsprintf(strValueName, TEXT("Color #%d"), i); - dwLength = sizeof(COLORREF); - if (RegQueryValueEx(hkSize, strValueName, NULL, &dwType, (LPBYTE)&scheme->crColor[i], &dwLength) != ERROR_SUCCESS || - dwType != REG_DWORD) - { - /* Failed to read registry value, initialize with current setting for now */ - scheme->crColor[i] = GetSysColor(i); - } - } - - for (i = 0; i < NUM_FONTS; i++) - { - wsprintf(strValueName, TEXT("Font #%d"), i); - dwLength = sizeof(LOGFONT); - if (RegQueryValueEx(hkSize, strValueName, NULL, &dwType, (LPBYTE)&scheme->lfFont[i], &dwLength) != ERROR_SUCCESS || - dwType != REG_BINARY || dwLength != sizeof(LOGFONT)) - { - /* Failed to read registry value */ - Ret = FALSE; - } - } - - for (i = 0; i < NUM_SIZES; i++) - { - wsprintf(strValueName, TEXT("Size #%d"), i); - dwLength = sizeof(UINT64); - if (RegQueryValueEx(hkSize, strValueName, NULL, &dwType, (LPBYTE)&iSize, &dwLength) != ERROR_SUCCESS || - dwType != REG_QWORD || dwLength != sizeof(UINT64)) - { - /* Failed to read registry value, initialize with current setting for now */ - scheme->Size[i] = GetSystemMetrics(g_SizeMetric[i]); - } - else - scheme->Size[i] = (INT)iSize; - } - RegCloseKey(hkSize); - } - RegCloseKey(hkScheme); - } - RegCloseKey(hkNewSchemes); + scheme->iIconSize = SHRegGetIntW(hKey, L"Shell Icon Size", 32); + RegCloseKey(hKey); } + return TRUE; +} + +/* + * LoadSchemeFromReg: Populates the passed scheme with values retireved from registry + */ +BOOL +LoadSchemeFromReg(OUT COLOR_SCHEME *scheme, IN PTHEME_SELECTION pSelectedTheme) +{ + INT i; + WCHAR strValueName[10], strSchemeKey[MAX_PATH]; + HKEY hkScheme = NULL; + DWORD dwType, dwLength; + UINT64 iSize; + BOOL Ret = TRUE; + LONG result; + + wsprintf(strSchemeKey, L"%s\\%s\\Sizes\\%s", + g_CPANewSchemes, + pSelectedTheme->Color->StyleName, + pSelectedTheme->Size->StyleName); + + result = RegOpenKeyW(HKEY_CURRENT_USER, strSchemeKey, &hkScheme); + if (result != ERROR_SUCCESS) return FALSE; + + scheme->bFlatMenus = SHRegGetIntW(hkScheme, L"FlatMenus", 0); + + for (i = 0; i < NUM_COLORS; i++) + { + wsprintf(strValueName, L"Color #%d", i); + dwLength = sizeof(COLORREF); + result = RegQueryValueExW(hkScheme, + strValueName, + NULL, + &dwType, + (LPBYTE)&scheme->crColor[i], + &dwLength); + if (result != ERROR_SUCCESS || dwType != REG_DWORD) + { + /* Failed to read registry value, initialize with current setting for now */ + scheme->crColor[i] = GetSysColor(i); + } + } + + for (i = 0; i < NUM_FONTS; i++) + { + PLOGFONTW lpfFont = SchemeGetFont(scheme, i); + + wsprintf(strValueName, L"Font #%d", i); + dwLength = sizeof(LOGFONT); + result = RegQueryValueExW(hkScheme, + strValueName, + NULL, + &dwType, + (LPBYTE)lpfFont, + &dwLength); + if (result != ERROR_SUCCESS || dwType != REG_BINARY || + dwLength != sizeof(LOGFONT)) + { + /* Failed to read registry value */ + Ret = FALSE; + } + } + + for (i = 0; i < NUM_SIZES; i++) + { + wsprintf(strValueName, L"Size #%d", i); + dwLength = sizeof(UINT64); + result = RegQueryValueExW(hkScheme, + strValueName, + NULL, + &dwType, + (LPBYTE)&iSize, + &dwLength); + if (result != ERROR_SUCCESS || dwType != REG_QWORD || + dwLength != sizeof(UINT64)) + { + /* Failed to read registry value, initialize with current setting for now */ + } + else + { + SchemeSetMetric(scheme, i, (int)iSize); + } + } + + RegCloseKey(hkScheme); + return Ret; } -VOID ApplyScheme(COLOR_SCHEME* scheme, INT SchemeId) +/* + ApplyScheme: Applies the selected scheme and stores its id in the registry if needed + */ +VOID +ApplyScheme(IN COLOR_SCHEME *scheme, IN PTHEME_SELECTION pSelectedTheme) { INT i, Result; HKEY hKey; - TCHAR clText[16]; - NONCLIENTMETRICS NonClientMetrics; - ICONMETRICS IconMetrics; + WCHAR clText[16], *StyleName; + INT ColorList[NUM_COLORS]; - /* Apply Colors from global variable */ - SetSysColors(NUM_COLORS, g_ColorList, scheme->crColor); + /* Apply system colors */ + for (i = 0; i < NUM_COLORS; i++) + ColorList[i] = i; + SetSysColors(NUM_COLORS, ColorList, scheme->crColor); /* Save colors to registry */ - Result = RegCreateKeyEx(HKEY_CURRENT_USER, g_CPColors, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hKey, NULL); + Result = RegCreateKeyW(HKEY_CURRENT_USER, g_CPColors, &hKey); if (Result == ERROR_SUCCESS) { for (i = 0; i < NUM_COLORS; i++) { - DWORD red = GetRValue(scheme->crColor[i]); - DWORD green = GetGValue(scheme->crColor[i]); - DWORD blue = GetBValue(scheme->crColor[i]); - wsprintf(clText, TEXT("%d %d %d"), red, green, blue); - RegSetValueEx(hKey, g_RegColorNames[i], 0, REG_SZ, (BYTE *)clText, (lstrlen(clText) + 1) * sizeof(TCHAR)); + wsprintf(clText, + L"%d %d %d", + GetRValue(scheme->crColor[i]), + GetGValue(scheme->crColor[i]), + GetBValue(scheme->crColor[i])); + + RegSetValueExW(hKey, + g_RegColorNames[i], + 0, + REG_SZ, + (BYTE *)clText, + (lstrlen(clText) + 1) * sizeof(WCHAR)); } RegCloseKey(hKey); } /* Apply non client metrics */ - NonClientMetrics.cbSize = sizeof(NONCLIENTMETRICS); - SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &NonClientMetrics, 0); - NonClientMetrics.lfCaptionFont = scheme->lfFont[FONT_CAPTION]; - NonClientMetrics.lfSmCaptionFont = scheme->lfFont[FONT_SMCAPTION]; - NonClientMetrics.lfMenuFont = scheme->lfFont[FONT_MENU]; - NonClientMetrics.lfStatusFont = scheme->lfFont[FONT_INFO]; - NonClientMetrics.lfMessageFont = scheme->lfFont[FONT_DIALOG]; - NonClientMetrics.iBorderWidth = scheme->Size[SIZE_BORDER_X]; - NonClientMetrics.iScrollWidth = scheme->Size[SIZE_SCROLL_X]; - NonClientMetrics.iScrollHeight = scheme->Size[SIZE_SCROLL_Y]; - NonClientMetrics.iCaptionWidth = scheme->Size[SIZE_CAPTION_Y]; - NonClientMetrics.iCaptionHeight = scheme->Size[SIZE_CAPTION_Y]; - NonClientMetrics.iSmCaptionWidth = scheme->Size[SIZE_SMCAPTION_Y]; - NonClientMetrics.iSmCaptionHeight = scheme->Size[SIZE_SMCAPTION_Y]; - NonClientMetrics.iMenuWidth = scheme->Size[SIZE_MENU_SIZE_X]; - NonClientMetrics.iMenuHeight = scheme->Size[SIZE_MENU_Y]; - SystemParametersInfo(SPI_SETNONCLIENTMETRICS, - sizeof(NONCLIENTMETRICS), - &NonClientMetrics, - SPIF_UPDATEINIFILE | SPIF_SENDCHANGE); + SystemParametersInfoW(SPI_SETNONCLIENTMETRICS, + sizeof(NONCLIENTMETRICS), + &scheme->ncMetrics, + SPIF_UPDATEINIFILE | SPIF_SENDCHANGE); /* Apply icon metrics */ - IconMetrics.cbSize = sizeof(ICONMETRICS); - SystemParametersInfo(SPI_GETICONMETRICS, sizeof(ICONMETRICS), &IconMetrics, 0); - IconMetrics.iHorzSpacing = scheme->Size[SIZE_ICON_SPC_X]; - IconMetrics.iVertSpacing = scheme->Size[SIZE_ICON_SPC_Y]; - IconMetrics.lfFont = scheme->lfFont[FONT_ICON]; - SystemParametersInfo(SPI_SETICONMETRICS, - sizeof(ICONMETRICS), - &IconMetrics, - SPIF_UPDATEINIFILE | SPIF_SENDCHANGE); + SystemParametersInfoW(SPI_SETICONMETRICS, + sizeof(ICONMETRICS), + &scheme->icMetrics, + SPIF_UPDATEINIFILE | SPIF_SENDCHANGE); /* Effects, save only when needed: */ /* FIXME: XP seems to use grayed checkboxes to reflect differences between menu and tooltips settings @@ -275,170 +336,374 @@ VOID ApplyScheme(COLOR_SCHEME* scheme, INT SchemeId) */ scheme->Effects.bTooltipAnimation = scheme->Effects.bMenuAnimation; scheme->Effects.bTooltipFade = scheme->Effects.bMenuFade; - SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, scheme->Effects.bDragFullWindows, (PVOID)&scheme->Effects.bDragFullWindows, SPIF_SENDCHANGE | SPIF_UPDATEINIFILE); - SystemParametersInfo(SPI_SETKEYBOARDCUES, 0, IntToPtr(scheme->Effects.bKeyboardCues), SPIF_SENDCHANGE | SPIF_UPDATEINIFILE); - //SystemParametersInfo(SPI_SETACTIVEWINDOWTRACKING, 0, (PVOID)&scheme->Effects.bActiveWindowTracking, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE); - //SystemParametersInfo(SPI_SETMENUANIMATION, 0, (PVOID)&scheme->Effects.bMenuAnimation, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE); - //SystemParametersInfo(SPI_SETCOMBOBOXANIMATION, 0, (PVOID)&scheme->Effects.bComboBoxAnimation, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE); - //SystemParametersInfo(SPI_SETLISTBOXSMOOTHSCROLLING, 0, (PVOID)&scheme->Effects.bListBoxSmoothScrolling, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE); - //SystemParametersInfo(SPI_SETGRADIENTCAPTIONS, 0, (PVOID)&scheme->Effects.bGradientCaptions, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE); - //SystemParametersInfo(SPI_SETACTIVEWNDTRKZORDER, 0, (PVOID)&scheme->Effects.bActiveWndTrkZorder, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE); - //SystemParametersInfo(SPI_SETHOTTRACKING, 0, (PVOID)&scheme->Effects.bHotTracking, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE); - SystemParametersInfo(SPI_SETMENUFADE, 0, (PVOID)&scheme->Effects.bMenuFade, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE); - //SystemParametersInfo(SPI_SETSELECTIONFADE, 0, (PVOID)&scheme->Effects.bSelectionFade, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE); - SystemParametersInfo(SPI_SETTOOLTIPANIMATION, 0, (PVOID)&scheme->Effects.bTooltipAnimation, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE); - SystemParametersInfo(SPI_SETTOOLTIPFADE, 0, (PVOID)&scheme->Effects.bTooltipFade, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE); - //SystemParametersInfo(SPI_SETCURSORSHADOW, 0, (PVOID)&scheme->Effects.bCursorShadow, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE); - //SystemParametersInfo(SPI_SETUIEFFECTS, 0, (PVOID)&scheme->Effects.bUiEffects, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE); + SystemParametersInfoW(SPI_SETDRAGFULLWINDOWS, scheme->Effects.bDragFullWindows, (PVOID)&scheme->Effects.bDragFullWindows, SPIF_SENDCHANGE | SPIF_UPDATEINIFILE); + SystemParametersInfoW(SPI_SETKEYBOARDCUES, 0, IntToPtr(scheme->Effects.bKeyboardCues), SPIF_SENDCHANGE | SPIF_UPDATEINIFILE); + //SystemParametersInfoW(SPI_SETACTIVEWINDOWTRACKING, 0, (PVOID)&scheme->Effects.bActiveWindowTracking, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE); + //SystemParametersInfoW(SPI_SETMENUANIMATION, 0, (PVOID)&scheme->Effects.bMenuAnimation, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE); + //SystemParametersInfoW(SPI_SETCOMBOBOXANIMATION, 0, (PVOID)&scheme->Effects.bComboBoxAnimation, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE); + //SystemParametersInfoW(SPI_SETLISTBOXSMOOTHSCROLLING, 0, (PVOID)&scheme->Effects.bListBoxSmoothScrolling, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE); + //SystemParametersInfoW(SPI_SETGRADIENTCAPTIONS, 0, (PVOID)&scheme->Effects.bGradientCaptions, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE); + //SystemParametersInfoW(SPI_SETACTIVEWNDTRKZORDER, 0, (PVOID)&scheme->Effects.bActiveWndTrkZorder, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE); + //SystemParametersInfoW(SPI_SETHOTTRACKING, 0, (PVOID)&scheme->Effects.bHotTracking, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE); + SystemParametersInfoW(SPI_SETMENUFADE, 0, (PVOID)&scheme->Effects.bMenuFade, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE); + //SystemParametersInfoW(SPI_SETSELECTIONFADE, 0, (PVOID)&scheme->Effects.bSelectionFade, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE); + SystemParametersInfoW(SPI_SETTOOLTIPANIMATION, 0, (PVOID)&scheme->Effects.bTooltipAnimation, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE); + SystemParametersInfoW(SPI_SETTOOLTIPFADE, 0, (PVOID)&scheme->Effects.bTooltipFade, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE); + //SystemParametersInfoW(SPI_SETCURSORSHADOW, 0, (PVOID)&scheme->Effects.bCursorShadow, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE); + //SystemParametersInfoW(SPI_SETUIEFFECTS, 0, (PVOID)&scheme->Effects.bUiEffects, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE); - /* Save SchemeId */ - Result = RegOpenKeyEx(HKEY_CURRENT_USER, g_CPANewSchemes, 0, KEY_ALL_ACCESS, &hKey); - if (Result == ERROR_SUCCESS) + /* Save SchemeId in the registry */ + if (pSelectedTheme->Theme != NULL && pSelectedTheme->ThemeActive == FALSE) { - if (SchemeId == -1) - clText[0] = TEXT('\0'); - else - lstrcpy(clText, g_ColorSchemes[SchemeId].strKeyName); - RegSetValueEx(hKey, g_SelectedStyle, 0, REG_SZ, (BYTE *)clText, (lstrlen(clText) + 1) * sizeof(TCHAR)); - RegCloseKey(hKey); + StyleName = pSelectedTheme->Color->StyleName; + SHSetValueW(HKEY_CURRENT_USER, + g_CPANewSchemes, + g_SelectedStyle, + REG_SZ, + StyleName, + (lstrlenW(StyleName) + 1) * sizeof(WCHAR)); } } -BOOL SaveScheme(COLOR_SCHEME* scheme, LPCTSTR strLegacyName) +static THEME* +CreateTheme(LPCWSTR pszName, LPCWSTR pszDisplayName) { - /* FIXME: Implement */ - return FALSE; + PTHEME pTheme; + + pTheme = (PTHEME) malloc(sizeof(THEME)); + if (pTheme == NULL) return NULL; + + pTheme->DisplayName = _wcsdup(pszDisplayName); + if (pTheme->DisplayName == NULL) + { + free(pTheme); + return NULL; + } + + pTheme->ColoursList = NULL; + pTheme->NextTheme = NULL; + pTheme->SizesList = NULL; + + if (pszName == NULL) + { + pTheme->ThemeFileName = NULL; + return pTheme; + } + + pTheme->ThemeFileName = _wcsdup(pszName); + if (pTheme->ThemeFileName == NULL) + { + free(pTheme->DisplayName); + free(pTheme); + return NULL; + } + + return pTheme; } -INT LoadSchemePresetEntries(LPTSTR pszSelectedStyle) +static PTHEME_STYLE +CreateStyle(LPCWSTR pszName, LPCWSTR pszDisplayName) { - HKEY hkNewSchemes, hkScheme, hkSizes, hkSize; - FILETIME ftLastWriteTime; - DWORD dwLength, dwType; - DWORD dwDisposition; - INT iStyle, iSize, iTemplateIndex; + PTHEME_STYLE pStyle; + + pStyle = (PTHEME_STYLE) malloc(sizeof(THEME_STYLE)); + if (pStyle == NULL) return NULL; + + pStyle->StyleName = _wcsdup(pszName); + if (pStyle->StyleName == NULL) + { + free(pStyle); + return NULL; + } + + pStyle->DisplayName = _wcsdup(pszDisplayName); + if (pStyle->DisplayName == NULL) + { + free(pStyle->StyleName); + free(pStyle); + return NULL; + } + + pStyle->ChildStyle = NULL; + pStyle->NextStyle = NULL; + + return pStyle; +} + +static void +CleanupStyles(IN PTHEME_STYLE pStylesList) +{ + PTHEME_STYLE pStyle, pStyleOld; + + pStyle = pStylesList; + while (pStyle) + { + if (pStyle->ChildStyle) CleanupStyles(pStyle->ChildStyle); + if (pStyle->DisplayName) free(pStyle->DisplayName); + if (pStyle->StyleName) free(pStyle->StyleName); + + pStyleOld = pStyle; + pStyle = pStyle->NextStyle; + free(pStyleOld); + } +} + +void +CleanupThemes(IN PTHEME pThemeList) +{ + PTHEME pTheme, pThemeOld; + + pTheme = pThemeList; + while (pTheme) + { + CleanupStyles(pTheme->ColoursList); + if (pTheme->SizesList) CleanupStyles(pTheme->SizesList); + if (pTheme->DisplayName) free(pTheme->DisplayName); + if (pTheme->ThemeFileName) free(pTheme->ThemeFileName); + + pThemeOld = pTheme; + pTheme = pTheme->NextTheme; + free(pThemeOld); + } +} + +static PTHEME_STYLE +FindStyle(IN PTHEME_STYLE pStylesList, IN PCWSTR StyleName) +{ + PTHEME_STYLE pStyle; + + for (pStyle = pStylesList; pStyle; pStyle = pStyle->NextStyle) + { + if (_wcsicmp(pStyle->StyleName, StyleName) == 0) + { + return pStyle; + } + } + + /* If we can't find the style requested, return the first one */ + return pStylesList; +} + +/* + * LoadSchemeSizes: Returns a list of sizes from the registry key of a scheme + */ +static PTHEME_STYLE +LoadSchemeSizes(IN HKEY hkScheme) +{ + HKEY hkSizes, hkSize; INT Result; + INT iStyle; + WCHAR wstrSizeName[5], wstrDisplayName[50]; + THEME_STYLE *List = NULL, *pCurrentStyle; - lstrcpy(pszSelectedStyle, TEXT("")); + Result = RegOpenKeyW(hkScheme, L"Sizes", &hkSizes); + if (Result != ERROR_SUCCESS) return NULL; - iTemplateIndex = 0; - Result = RegCreateKeyEx(HKEY_CURRENT_USER, g_CPANewSchemes, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hkNewSchemes, &dwDisposition); - if (Result == ERROR_SUCCESS) + iStyle = 0; + while ((RegEnumKeyW(hkSizes, iStyle, wstrSizeName, 5) == ERROR_SUCCESS)) { - /* First find out the currently selected template */ - dwLength = 4 * sizeof(TCHAR); - RegQueryValueEx(hkNewSchemes, g_SelectedStyle, NULL, &dwType, (LPBYTE)pszSelectedStyle, &dwLength); + iStyle++; - /* Check if already loaded */ - if (g_PresetLoaded) + Result = RegOpenKeyW(hkSizes, wstrSizeName, &hkSize); + if (Result != ERROR_SUCCESS) continue; + + Result = RegLoadMUIStringW(hkSize, + L"DisplayName", + wstrDisplayName, + sizeof(wstrDisplayName), + NULL, + 0, + NULL); + if (Result != ERROR_SUCCESS) { - RegCloseKey(hkNewSchemes); - return g_TemplateCount; + Result = RegLoadMUIStringW(hkSize, + L"LegacyName", + wstrDisplayName, + sizeof(wstrDisplayName), + NULL, + 0, + NULL); + } + + if (Result == ERROR_SUCCESS) + pCurrentStyle = CreateStyle(wstrSizeName, wstrDisplayName); + else + pCurrentStyle = CreateStyle(wstrSizeName, wstrSizeName); + + if (pCurrentStyle != NULL) + { + pCurrentStyle->NextStyle = List; + List = pCurrentStyle; } - iStyle = 0; - dwLength = MAX_TEMPLATENAMELENTGH; - while((RegEnumKeyEx(hkNewSchemes, iStyle, g_ColorSchemes[iTemplateIndex].strKeyName, &dwLength, - NULL, NULL, NULL, &ftLastWriteTime) == ERROR_SUCCESS) && (iTemplateIndex < MAX_TEMPLATES)) - { - /* Is it really a template or one of the other entries */ - if (dwLength <= 4) - { - if (RegOpenKeyEx(hkNewSchemes, g_ColorSchemes[iTemplateIndex].strKeyName, 0, KEY_READ, &hkScheme) == ERROR_SUCCESS) - { - if (RegOpenKeyEx(hkScheme, TEXT("Sizes"), 0, KEY_READ, &hkSizes) == ERROR_SUCCESS) - { - iSize = 0; - dwLength = 3; - while((RegEnumKeyEx(hkSizes, iSize, g_ColorSchemes[iTemplateIndex].strSizeName, &dwLength, - NULL, NULL, NULL, &ftLastWriteTime) == ERROR_SUCCESS) && (iSize <= 4)) - { - if(RegOpenKeyEx(hkSizes, g_ColorSchemes[iTemplateIndex].strSizeName, 0, KEY_READ, &hkSize) == ERROR_SUCCESS) - { - dwLength = MAX_TEMPLATENAMELENTGH; - RegQueryValueEx(hkSize, TEXT("DisplayName"), NULL, &dwType, (LPBYTE)&g_ColorSchemes[iTemplateIndex].strDisplayName, &dwLength); - dwLength = MAX_TEMPLATENAMELENTGH; - RegQueryValueEx(hkSize, TEXT("LegacyName"), NULL, &dwType, (LPBYTE)&g_ColorSchemes[iTemplateIndex].strLegacyName, &dwLength); - RegCloseKey(hkSize); - } - iSize++; - iTemplateIndex++; - dwLength = 3; - } - RegCloseKey(hkSizes); - } - RegCloseKey(hkScheme); - } - } - iStyle++; - dwLength = MAX_TEMPLATENAMELENTGH; - } - RegCloseKey(hkNewSchemes); - g_PresetLoaded = TRUE; - g_TemplateCount = iTemplateIndex; + RegCloseKey(hkSize); } - return iTemplateIndex; + + RegCloseKey(hkSizes); + return List; } -typedef HRESULT (WINAPI * ENUMTHEMESTYLE) (LPCWSTR, LPWSTR, DWORD, PTHEMENAMES); +/* + LoadClassicColorSchemes: Returns a list of classic theme colours from the registry key of a scheme +*/ +static THEME_STYLE* +LoadClassicColorSchemes(VOID) +{ + INT Result; + HKEY hkNewSchemes, hkScheme; + INT iStyle; + WCHAR wstrStyleName[5], wstrDisplayName[50]; + THEME_STYLE *List = NULL, *pCurrentStyle; -BOOL AddThemeStyles(LPCWSTR pszThemeFileName, HDSA* Styles, int* count, ENUMTHEMESTYLE enumTheme) + Result = RegOpenKeyW(HKEY_CURRENT_USER, g_CPANewSchemes, &hkNewSchemes); + if (Result != ERROR_SUCCESS) return NULL; + + iStyle = 0; + while ((RegEnumKeyW(hkNewSchemes, iStyle, wstrStyleName, 5) == ERROR_SUCCESS)) + { + iStyle++; + + Result = RegOpenKeyW(hkNewSchemes, wstrStyleName, &hkScheme); + if (Result != ERROR_SUCCESS) continue; + + Result = RegLoadMUIStringW(hkScheme, + L"DisplayName", + wstrDisplayName, + sizeof(wstrDisplayName), + NULL, + 0, + NULL); + + if (Result == ERROR_SUCCESS) + pCurrentStyle = CreateStyle(wstrStyleName, wstrDisplayName); + else + pCurrentStyle = CreateStyle(wstrStyleName, wstrStyleName); + + if (pCurrentStyle != NULL) + { + pCurrentStyle->NextStyle = List; + pCurrentStyle->ChildStyle = LoadSchemeSizes(hkScheme); + if(pCurrentStyle->ChildStyle == NULL) + CleanupStyles(pCurrentStyle); + else + List = pCurrentStyle; + } + + RegCloseKey(hkScheme); + } + + RegCloseKey(hkNewSchemes); + return List; +} + +typedef HRESULT (WINAPI *ENUMTHEMESTYLE) (LPCWSTR, LPWSTR, DWORD, PTHEMENAMES); + +static THEME_STYLE* +EnumThemeStyles(IN LPCWSTR pszThemeFileName, IN ENUMTHEMESTYLE pfnEnumTheme) { DWORD index = 0; THEMENAMES names; - THEME_STYLE StyleName; + THEME_STYLE *List = NULL, **ppPrevStyle, *pCurrentStyle; - *Styles = DSA_Create(sizeof(THEMENAMES),1); - *count = 0; + ppPrevStyle = &List; - while (SUCCEEDED (enumTheme (pszThemeFileName, NULL, index++, &names))) + while (SUCCEEDED(pfnEnumTheme (pszThemeFileName, NULL, index++, &names))) { - StyleName.StlyeName = _wcsdup(names.szName); - StyleName.DisplayName = _wcsdup(names.szDisplayName); - (*count)++; - DSA_InsertItem(*Styles, *count, &StyleName); + pCurrentStyle = CreateStyle(names.szName, names.szDisplayName); + if(pCurrentStyle == NULL) break; + + *ppPrevStyle = pCurrentStyle; + ppPrevStyle = &pCurrentStyle->NextStyle; } - return TRUE; + return List; } -BOOL CALLBACK EnumThemeProc(LPVOID lpReserved, - LPCWSTR pszThemeFileName, - LPCWSTR pszThemeName, - LPCWSTR pszToolTip, LPVOID lpReserved2, - LPVOID lpData) +BOOL CALLBACK +EnumThemeProc(IN LPVOID lpReserved, + IN LPCWSTR pszThemeFileName, + IN LPCWSTR pszThemeName, + IN LPCWSTR pszToolTip, + IN LPVOID lpReserved2, + IN OUT LPVOID lpData) { - THEME theme; - GLOBALS *g = (GLOBALS *) lpData; + PTHEME *List, pTheme; - theme.themeFileName = _wcsdup(pszThemeFileName); - theme.displayName = _wcsdup(pszThemeName); - AddThemeStyles( pszThemeFileName, &theme.Sizes, &theme.SizesCount, (ENUMTHEMESTYLE)EnumThemeSizes); - AddThemeStyles( pszThemeFileName, &theme.Colors, &theme.ColorsCount, (ENUMTHEMESTYLE)EnumThemeColors); + List = (PTHEME*)lpData; - DSA_InsertItem(g->Themes, DSA_APPEND , &theme); - g->ThemesCount++; + pTheme = CreateTheme(pszThemeFileName, pszThemeName); + if (pTheme == NULL) return FALSE; + + pTheme->SizesList = EnumThemeStyles( pszThemeFileName, (ENUMTHEMESTYLE)EnumThemeSizes); + pTheme->ColoursList = EnumThemeStyles( pszThemeFileName, (ENUMTHEMESTYLE)EnumThemeColors); + if(pTheme->SizesList == NULL || pTheme->ColoursList == NULL) + { + CleanupThemes(pTheme); + return FALSE; + } + + pTheme->NextTheme = *List; + *List = pTheme; return TRUE; } -void LoadThemes(GLOBALS *g) +/* + LoadThemes: Returns a list that contains tha classic theme and + the visual styles of the system +*/ +PTHEME +LoadThemes() { - WCHAR themesPath[MAX_PATH]; HRESULT hret; - THEME ClassicTheme; + PTHEME pClassicTheme; + WCHAR strClassicTheme[40]; + WCHAR szThemesPath[MAX_PATH], *pszClassicTheme; + int res; + + /* Insert the classic theme */ + res = LoadString(hApplet, IDS_CLASSIC_THEME, strClassicTheme, 40); + pszClassicTheme = (res > 0 ? strClassicTheme : L"Classic Theme"); + pClassicTheme = CreateTheme(NULL, pszClassicTheme); + if (pClassicTheme == NULL) return NULL; + pClassicTheme->ColoursList = LoadClassicColorSchemes(); + + /* Get path to themes folder */ + ZeroMemory(szThemesPath, sizeof(szThemesPath)); + hret = SHGetFolderPathW (NULL, CSIDL_RESOURCES, NULL, SHGFP_TYPE_DEFAULT, szThemesPath); + if (FAILED(hret)) return pClassicTheme; + lstrcatW (szThemesPath, L"\\Themes"); + + /* Enumerate themes */ + hret = EnumThemes( szThemesPath, EnumThemeProc, &pClassicTheme->NextTheme); + if (FAILED(hret)) + { + pClassicTheme->NextTheme = NULL; + if (pClassicTheme->ColoursList == NULL) + { + free(pClassicTheme->DisplayName); + free(pClassicTheme); + return NULL; + } + } + + return pClassicTheme; +} + +/* + * GetActiveTheme: Gets the active theme and populates pSelectedTheme + * with entries from the list of loaded themes + */ +BOOL +GetActiveTheme(IN PTHEME pThemeList, OUT PTHEME_SELECTION pSelectedTheme) +{ WCHAR szThemeFileName[MAX_PATH]; WCHAR szColorBuff[MAX_PATH]; WCHAR szSizeBuff[MAX_PATH]; - - /* Initialize themes dsa */ - g->Themes = DSA_Create(sizeof(THEME),5); - - /* Insert the classic theme */ - memset(&ClassicTheme, 0, sizeof(THEME)); - ClassicTheme.displayName = _wcsdup(L"Classic Theme"); - DSA_InsertItem(g->Themes, 0, &ClassicTheme); - g->ThemesCount = 1; + PTHEME pTheme; + HRESULT hret; + + ZeroMemory(pSelectedTheme, sizeof(THEME_SELECTION)); /* Retrieve the name of the current theme */ hret = GetCurrentThemeName(szThemeFileName, @@ -447,92 +712,172 @@ void LoadThemes(GLOBALS *g) MAX_PATH, szSizeBuff, MAX_PATH); + if (FAILED(hret)) return FALSE; - if (FAILED (hret)) + for (pTheme = pThemeList; pTheme; pTheme = pTheme->NextTheme) { - g->pszThemeFileName = NULL; - g->pszColorName = NULL; - g->pszSizeName = NULL; + if(pTheme->ThemeFileName && + _wcsicmp(pTheme->ThemeFileName, szThemeFileName) == 0) + { + break; + } } - else - { - /* Cache the name of the active theme */ - g->pszThemeFileName = _wcsdup(szThemeFileName); - g->pszColorName = _wcsdup(szColorBuff); - g->pszSizeName = _wcsdup(szSizeBuff); - } - /* Get path to themes folder */ - hret = SHGetFolderPathW (NULL, CSIDL_RESOURCES, NULL, SHGFP_TYPE_CURRENT, themesPath); - if (FAILED (hret)) - return; - lstrcatW (themesPath, L"\\Themes"); - /* Enumerate themes */ - hret = EnumThemes(themesPath, EnumThemeProc, g); + if (pTheme == NULL) return FALSE; + + pSelectedTheme->ThemeActive = TRUE; + pSelectedTheme->Theme = pTheme; + pSelectedTheme->Color = FindStyle(pTheme->ColoursList, szColorBuff); + pSelectedTheme->Size = FindStyle(pTheme->SizesList, szSizeBuff); + + return TRUE; } -HRESULT ActivateTheme(PTHEME pTheme, int iColor, int iSize) +/* + GetActiveTheme: Gets the active classic theme and populates pSelectedTheme + with entries from the list of loaded themes +*/ +BOOL +GetActiveClassicTheme(IN PTHEME pThemeList, OUT PTHEME_SELECTION pSelectedTheme) +{ + INT Result; + WCHAR szSelectedClassicScheme[5], szSelectedClassicSize[5]; + HKEY hkNewSchemes; + DWORD dwType, dwDisplayNameLength; + PTHEME_STYLE pCurrentStyle, pCurrentSize; + + ZeroMemory(pSelectedTheme, sizeof(THEME_SELECTION)); + + /* Assume failure */ + szSelectedClassicScheme[0] = 0; + szSelectedClassicSize[0] = 0; + + Result = RegOpenKeyW(HKEY_CURRENT_USER, g_CPANewSchemes, &hkNewSchemes); + if (Result != ERROR_SUCCESS) return FALSE; + + dwType = REG_SZ; + dwDisplayNameLength = sizeof(szSelectedClassicScheme); + Result = RegQueryValueEx(hkNewSchemes, L"SelectedStyle", NULL, &dwType, + (LPBYTE)&szSelectedClassicScheme, &dwDisplayNameLength); + if (Result == ERROR_SUCCESS) + { + dwType = REG_SZ; + dwDisplayNameLength = sizeof(szSelectedClassicSize); + Result = SHGetValue(hkNewSchemes, szSelectedClassicScheme, L"SelectedSize", + &dwType, szSelectedClassicSize, &dwDisplayNameLength); + } + + RegCloseKey(hkNewSchemes); + + pCurrentStyle = FindStyle(pThemeList->ColoursList, szSelectedClassicScheme); + pCurrentSize = FindStyle(pCurrentStyle->ChildStyle, szSelectedClassicSize); + + pSelectedTheme->Theme = pThemeList; + pSelectedTheme->Color = pCurrentStyle; + pSelectedTheme->Size = pCurrentSize; + + return TRUE; +} + +BOOL +ActivateTheme(IN PTHEME_SELECTION pSelectedTheme) { - PTHEME_STYLE pThemeColor; - PTHEME_STYLE pThemeSize; HTHEMEFILE hThemeFile = 0; HRESULT hret; - if(pTheme->themeFileName) + if (pSelectedTheme->ThemeActive) { - pThemeColor = (PTHEME_STYLE)DSA_GetItemPtr(pTheme->Colors, iColor); - pThemeSize = (PTHEME_STYLE)DSA_GetItemPtr(pTheme->Sizes, iSize); - - hret = OpenThemeFile(pTheme->themeFileName, - pThemeColor->StlyeName, - pThemeSize->StlyeName, + hret = OpenThemeFile(pSelectedTheme->Theme->ThemeFileName, + pSelectedTheme->Color->StyleName, + pSelectedTheme->Size->StyleName, &hThemeFile, 0); - if(!SUCCEEDED(hret)) - { - return hret; - } - + if (!SUCCEEDED(hret)) return FALSE; } hret = ApplyTheme(hThemeFile, "", 0); - if(pTheme->themeFileName) + if (pSelectedTheme->ThemeActive) { - hret = CloseThemeFile(hThemeFile); + CloseThemeFile(hThemeFile); } - return hret; + return SUCCEEDED(hret); } -int CALLBACK CleanUpThemeStlyeCallback(void *p, void *pData) +BOOL +LoadSchemeFromTheme(OUT PCOLOR_SCHEME scheme, IN PTHEME_SELECTION pSelectedTheme) { - PTHEME_STYLE pStyle = (PTHEME_STYLE)p; + HTHEMEFILE hThemeFile = 0; + HRESULT hret; + HTHEME hTheme; + int i; - free(pStyle->DisplayName); - free(pStyle->StlyeName); + hret = OpenThemeFile(pSelectedTheme->Theme->ThemeFileName, + pSelectedTheme->Color->StyleName, + pSelectedTheme->Size->StyleName, + &hThemeFile, + 0); + + if (!SUCCEEDED(hret)) return FALSE; + + hTheme = OpenThemeDataFromFile(hThemeFile, hCPLWindow, L"WINDOW", 0); + if (hTheme == NULL) return FALSE; + + /* Load colors */ + for (i = 0; i < NUM_COLORS; i++) + { + scheme->crColor[i] = GetThemeSysColor(hTheme,i); + } + + /* Load sizes */ + /* I wonder why GetThemeSysInt doesn't work here */ + scheme->ncMetrics.iBorderWidth = GetThemeSysSize(hTheme, SM_CXFRAME); + scheme->ncMetrics.iScrollWidth = GetThemeSysSize(hTheme, SM_CXVSCROLL); + scheme->ncMetrics.iScrollHeight = GetThemeSysSize(hTheme, SM_CYHSCROLL); + scheme->ncMetrics.iCaptionWidth = GetThemeSysSize(hTheme, SM_CXSIZE); + scheme->ncMetrics.iCaptionHeight = GetThemeSysSize(hTheme, SM_CYSIZE); + scheme->ncMetrics.iSmCaptionWidth = GetThemeSysSize(hTheme, SM_CXSMSIZE); + scheme->ncMetrics.iSmCaptionHeight = GetThemeSysSize(hTheme, SM_CYSMSIZE); + scheme->ncMetrics.iMenuWidth = GetThemeSysSize(hTheme, SM_CXMENUSIZE); + scheme->ncMetrics.iMenuHeight = GetThemeSysSize(hTheme, SM_CYMENUSIZE); + + /* Load fonts */ + GetThemeSysFont(hTheme, TMT_CAPTIONFONT, &scheme->ncMetrics.lfCaptionFont); + GetThemeSysFont(hTheme, TMT_SMALLCAPTIONFONT, &scheme->ncMetrics.lfSmCaptionFont); + GetThemeSysFont(hTheme, TMT_MENUFONT, &scheme->ncMetrics.lfMenuFont ); + GetThemeSysFont(hTheme, TMT_STATUSFONT, &scheme->ncMetrics.lfStatusFont); + GetThemeSysFont(hTheme, TMT_MSGBOXFONT, &scheme->ncMetrics.lfMessageFont); + GetThemeSysFont(hTheme, TMT_ICONTITLEFONT, &scheme->icMetrics.lfFont); + + CloseThemeData(hTheme); return TRUE; } -int CALLBACK CleanUpThemeCallback(void *p, void *pData) +BOOL +DrawThemePreview(IN HDC hdcMem, IN PCOLOR_SCHEME scheme, IN PTHEME_SELECTION pSelectedTheme, IN PRECT prcWindow) { - PTHEME pTheme = (PTHEME)p; + HBRUSH hbrBack; + HRESULT hres; - free(pTheme->displayName); - free(pTheme->themeFileName); - DSA_DestroyCallback(pTheme->Colors, CleanUpThemeStlyeCallback, NULL); - DSA_DestroyCallback(pTheme->Sizes, CleanUpThemeStlyeCallback, NULL); + hbrBack = CreateSolidBrush(scheme->crColor[COLOR_DESKTOP]); - return TRUE; + FillRect(hdcMem, prcWindow, hbrBack); + DeleteObject(hbrBack); + + InflateRect(prcWindow, -10, -10); + + hres = DrawNCPreview(hdcMem, + DNCP_DRAW_ALL, + prcWindow, + pSelectedTheme->Theme->ThemeFileName, + pSelectedTheme->Color->StyleName, + pSelectedTheme->Size->StyleName, + &scheme->ncMetrics, + scheme->crColor); + + return SUCCEEDED(hres); } -void CleanupThemes(GLOBALS *g) -{ - free(g->pszThemeFileName); - free(g->pszColorName); - free(g->pszSizeName); - - DSA_DestroyCallback(g->Themes, CleanUpThemeCallback, NULL); -}