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); -}