[KSPROXY]
[reactos.git] / reactos / dll / cpl / desk / appearance.c
index f46c991..9a09169 100644 (file)
@@ -127,11 +127,28 @@ LoadCurrentTheme(GLOBALS* g)
        g->Theme.lfFont[FONT_INFO] = NonClientMetrics.lfStatusFont;
        g->Theme.lfFont[FONT_DIALOG] = NonClientMetrics.lfMessageFont;
        SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &g->Theme.lfFont[FONT_ICON], 0);
+
+    /* Effects */
+   /* "Use the following transition effect for menus and tooltips" */
+    SystemParametersInfo(SPI_GETMENUANIMATION, sizeof(BOOL), &g->Theme.Effects.bMenuAnimation, 0);
+    SystemParametersInfo(SPI_GETMENUFADE, sizeof(BOOL), &g->Theme.Effects.bMenuFade, 0);
+    /* FIXME: XP seems to use grayed checkboxes to reflect differences between menu and tooltips settings
+     * Just keep them in sync for now:
+     */
+    g->Theme.Effects.bTooltipAnimation  = g->Theme.Effects.bMenuAnimation;
+    g->Theme.Effects.bTooltipFade       = g->Theme.Effects.bMenuFade;
+
+    /* show content of windows during dragging */
+    //SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, g->Theme.Effects.bDragFullWindows, NULL, SPIF_SENDCHANGE | SPIF_UPDATEINIFILE);
+    SystemParametersInfoW(SPI_GETDRAGFULLWINDOWS, 0, &g->Theme.Effects.bDragFullWindows, 0);
+
+    /* "Hide underlined letters for keyboard navigation until I press the Alt key" */
+    SystemParametersInfo(SPI_GETKEYBOARDCUES, 0, &g->Theme.Effects.bKeyboardCues, 0);
 }
 
 
 static BOOL
-LoadThemeFromReg(GLOBALS* g, INT iPreset)
+LoadThemeFromReg(GLOBALS* g)
 {
        INT i;
        TCHAR strSizeName[20] = {TEXT("Sizes\\0")};
@@ -139,6 +156,7 @@ LoadThemeFromReg(GLOBALS* g, INT iPreset)
        HKEY hkNewSchemes, hkScheme, hkSize;
        DWORD dwType, dwLength;
        BOOL Ret = FALSE;
+       INT iPreset = g->Theme.Id;
 
        if(RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Appearance\\New Schemes"),
                0, KEY_READ, &hkNewSchemes) == ERROR_SUCCESS)
@@ -205,6 +223,12 @@ LoadThemeFromReg(GLOBALS* g, INT iPreset)
        return Ret;
 }
 
+static VOID
+_UpdateUserPref(UINT SpiGet,UINT SpiSet,BOOL *pbFlag)
+{
+    SystemParametersInfo(SpiSet, 0, (PVOID)pbFlag, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE);
+}
+#define UPDATE_USERPREF(NAME,pbFlag) _UpdateUserPref(SPI_GET ## NAME, SPI_SET ## NAME, pbFlag)
 
 static VOID
 ApplyTheme(GLOBALS* g)
@@ -220,8 +244,6 @@ ApplyTheme(GLOBALS* g)
        if (!g->Theme.bHasChanged)
                return;
 
-       g->Theme.bHasChanged = FALSE;
-
        /* Update some globals */
        g->crCOLOR_BTNFACE = g->Theme.crColor[COLOR_BTNFACE];
        g->crCOLOR_BTNTEXT = g->Theme.crColor[COLOR_BTNTEXT];
@@ -334,6 +356,36 @@ ApplyTheme(GLOBALS* g)
 
                RegCloseKey(hKey);
        }
+
+    /* Effects, save only when needed: */
+    /* FIXME: XP seems to use grayed checkboxes to reflect differences between menu and tooltips settings
+     * Just keep them in sync for now.
+     */
+    g->Theme.Effects.bTooltipAnimation  = g->Theme.Effects.bMenuAnimation;
+    g->Theme.Effects.bTooltipFade       = g->Theme.Effects.bMenuFade;
+    SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, g->Theme.Effects.bDragFullWindows, NULL, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE);
+    //UPDATE_USERPREF(KEYBOARDCUES, &g->Theme.Effects.bKeyboardCues);
+    //UPDATE_USERPREF(ACTIVEWINDOWTRACKING, &g->Theme.Effects.bActiveWindowTracking);
+    //UPDATE_USERPREF(MENUANIMATION, &g->Theme.Effects.bMenuAnimation);
+    //UPDATE_USERPREF(COMBOBOXANIMATION, &g->Theme.Effects.bComboBoxAnimation);
+    //UPDATE_USERPREF(LISTBOXSMOOTHSCROLLING, &g->Theme.Effects.bListBoxSmoothScrolling);
+    //UPDATE_USERPREF(GRADIENTCAPTIONS, &g->Theme.Effects.bGradientCaptions);
+    //UPDATE_USERPREF(ACTIVEWNDTRKZORDER, &g->Theme.Effects.bActiveWndTrkZorder);
+    //UPDATE_USERPREF(HOTTRACKING, &g->Theme.Effects.bHotTracking);
+    UPDATE_USERPREF(MENUFADE, &g->Theme.Effects.bMenuFade);
+    //UPDATE_USERPREF(SELECTIONFADE, &g->Theme.Effects.bSelectionFade);
+    UPDATE_USERPREF(TOOLTIPANIMATION, &g->Theme.Effects.bTooltipAnimation);
+    UPDATE_USERPREF(TOOLTIPFADE, &g->Theme.Effects.bTooltipFade);
+    //UPDATE_USERPREF(CURSORSHADOW, &g->Theme.Effects.bCursorShadow);
+    //UPDATE_USERPREF(UIEFFECTS, &g->Theme.Effects.bUiEffects);
+       /* Save ThemeId */
+       Result = RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Appearance\\New Schemes"), 0, KEY_ALL_ACCESS, &hKey);
+       if (Result == ERROR_SUCCESS)
+       {
+               lstrcpy(clText, g->ThemeTemplates[g->Theme.Id].strKeyName);
+               RegSetValueEx(hKey, TEXT("SelectedStyle"), 0, REG_SZ, (BYTE *)clText, (lstrlen(clText)+1) * sizeof (TCHAR));
+               RegCloseKey(hKey);
+       }
 }
 
 
@@ -438,7 +490,7 @@ AppearancePage_OnDestroy(HWND hwndDlg, GLOBALS *g)
 INT_PTR CALLBACK
 AppearancePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
-       INT i, index;
+       INT i;
        GLOBALS *g;
        LPNMHDR lpnm;
 
@@ -455,6 +507,19 @@ AppearancePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
                case WM_COMMAND:
                        switch (LOWORD(wParam))
                        {
+                               case IDC_APPEARANCE_EFFECTS:
+                                       DialogBoxParam(hApplet, (LPCTSTR)IDD_EFFAPPEARANCE,
+                                               hwndDlg, EffAppearanceDlgProc, (LPARAM)g);
+
+                                       /* Was anything changed in the effects appearance dialog? */
+                                       if (memcmp(&g->Theme, &g->ThemeAdv, sizeof(THEME)) != 0)
+                                       {
+                                               PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
+                                               g->Theme = g->ThemeAdv;
+                                               g->Theme.bHasChanged = TRUE;
+                                       }
+                                       break;
+
                                case IDC_APPEARANCE_ADVANCED:
                                        DialogBoxParam(hApplet, (LPCTSTR)IDD_ADVAPPEARANCE,
                                                hwndDlg, AdvAppearanceDlgProc, (LPARAM)g);
@@ -474,8 +539,9 @@ AppearancePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
                                                PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
                                                g->Theme.bHasChanged = TRUE;
                                                i = SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_GETCURSEL, 0, 0);
-                                               index = SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_GETITEMDATA, (WPARAM)i, 0);
-                                               LoadThemeFromReg(g, index);
+                                               g->Theme.Id = SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_GETITEMDATA, (WPARAM)i, 0);
+                                               LoadThemeFromReg(g);
+                                               //SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, WM_PAINT, 0, 0);
                                        }
                                        break;