[COMCTL32] -Differentiate between v5 and v6 toolbar and make their CCM_SETVERSION...
authorGiannis Adamopoulos <gadamopoulos@reactos.org>
Mon, 5 Jun 2017 14:23:42 +0000 (14:23 +0000)
committerGiannis Adamopoulos <gadamopoulos@reactos.org>
Mon, 5 Jun 2017 14:23:42 +0000 (14:23 +0000)
svn path=/trunk/; revision=74922

reactos/dll/win32/comctl32/comctl32.h
reactos/dll/win32/comctl32/commctrl.c
reactos/dll/win32/comctl32/toolbar.c

index 32ba0fe..e347efd 100644 (file)
@@ -177,6 +177,10 @@ extern void UPDOWN_Register(void) DECLSPEC_HIDDEN;
 extern void UPDOWN_Unregister(void) DECLSPEC_HIDDEN;
 extern void BUTTON_Register();
 extern void BUTTON_Unregister();
+#ifdef __REACTOS__
+extern void TOOLBARv6_Register(void) DECLSPEC_HIDDEN;
+extern void TOOLBARv6_Unregister(void) DECLSPEC_HIDDEN;
+#endif
 
 int MONTHCAL_MonthLength(int month, int year) DECLSPEC_HIDDEN;
 int MONTHCAL_CalculateDayOfWeek(SYSTEMTIME *date, BOOL inplace) DECLSPEC_HIDDEN;
index 2a6f774..443b389 100644 (file)
@@ -207,7 +207,7 @@ static HANDLE CreateComctl32ActCtx(BOOL bV6)
     return ret;
 }
 
-static void RegisterControls()
+static void RegisterControls(BOOL bV6)
 {
     ANIMATE_Register ();
     COMBOEX_Register ();
@@ -225,14 +225,23 @@ static void RegisterControls()
     STATUS_Register ();
     SYSLINK_Register ();
     TAB_Register ();
-    TOOLBAR_Register ();
     TOOLTIPS_Register ();
     TRACKBAR_Register ();
     TREEVIEW_Register ();
     UPDOWN_Register ();
+
+    if (!bV6)
+    {
+        TOOLBAR_Register ();
+    }
+    else
+    {
+        BUTTON_Register();
+        TOOLBARv6_Register();
+    }
 }
 
-static void UnregisterControls()
+static void UnregisterControls(BOOL bV6)
 {
     ANIMATE_Unregister ();
     COMBOEX_Unregister ();
@@ -250,11 +259,21 @@ static void UnregisterControls()
     STATUS_Unregister ();
     SYSLINK_Unregister ();
     TAB_Unregister ();
-    TOOLBAR_Unregister ();
     TOOLTIPS_Unregister ();
     TRACKBAR_Unregister ();
     TREEVIEW_Unregister ();
     UPDOWN_Unregister ();
+
+    if (!bV6)
+    {
+        TOOLBAR_Unregister ();
+    }
+    else
+    {
+        BUTTON_Unregister();
+        TOOLBARv6_Unregister ();
+    }
+
 }
 
 static void InitializeClasses()
@@ -267,15 +286,14 @@ static void InitializeClasses()
     /* Register the classes once no matter what */
     hActCtx5 = CreateComctl32ActCtx(FALSE);
     activated = (hActCtx5 != INVALID_HANDLE_VALUE ? ActivateActCtx(hActCtx5, &ulCookie) : FALSE);
-    RegisterControls();      /* Register the classes pretending to be v5 */
+    RegisterControls(FALSE);      /* Register the classes pretending to be v5 */
     if (activated) DeactivateActCtx(0, ulCookie);
 
     hActCtx6 = CreateComctl32ActCtx(TRUE);
     if (hActCtx6 != INVALID_HANDLE_VALUE)
     {
         activated = ActivateActCtx(hActCtx6, &ulCookie);
-        RegisterControls();      /* Register the classes pretending to be v6 */
-        BUTTON_Register();
+        RegisterControls(TRUE);      /* Register the classes pretending to be v6 */
         if (activated) DeactivateActCtx(0, ulCookie);
 
         /* Initialize the themed controls only when the v6 manifest is present */
@@ -291,7 +309,7 @@ static void UninitializeClasses()
 
     hActCtx5 = CreateComctl32ActCtx(FALSE);
     activated = (hActCtx5 != INVALID_HANDLE_VALUE ? ActivateActCtx(hActCtx5, &ulCookie) : FALSE);
-    UnregisterControls();
+    UnregisterControls(FALSE);
     if (activated) DeactivateActCtx(0, ulCookie);
 
     hActCtx6 = CreateComctl32ActCtx(TRUE);
@@ -299,8 +317,7 @@ static void UninitializeClasses()
     {
         activated = ActivateActCtx(hActCtx6, &ulCookie);
         THEMING_Uninitialize();
-        UnregisterControls();
-        BUTTON_Unregister();
+        UnregisterControls(TRUE);
         if (activated) DeactivateActCtx(0, ulCookie);
     }
 }
index 62ac44e..c5a704f 100644 (file)
@@ -5268,6 +5268,16 @@ TOOLBAR_SetVersion (TOOLBAR_INFO *infoPtr, INT iVersion)
 {
     INT iOldVersion = infoPtr->iVersion;
 
+#ifdef __REACTOS__
+    /* The v6 control doesn't support changing its version */
+    if (iOldVersion == 6)
+        return iOldVersion;
+
+    /* And a control that is not v6 can't be set to be a v6 one */
+    if (iVersion >= 6)
+        return -1;
+#endif
+
     infoPtr->iVersion = iVersion;
 
     if (infoPtr->iVersion >= 5)
@@ -6178,7 +6188,11 @@ TOOLBAR_NCCalcSize (HWND hwnd, WPARAM wParam, LPARAM lParam)
 
 
 static LRESULT
+#ifdef __REACTOS__
+TOOLBAR_NCCreate (HWND hwnd, WPARAM wParam, const CREATESTRUCTW *lpcs, int iVersion)
+#else
 TOOLBAR_NCCreate (HWND hwnd, WPARAM wParam, const CREATESTRUCTW *lpcs)
+#endif
 {
     TOOLBAR_INFO *infoPtr;
     DWORD styleadd = 0;
@@ -6212,7 +6226,11 @@ TOOLBAR_NCCreate (HWND hwnd, WPARAM wParam, const CREATESTRUCTW *lpcs)
     infoPtr->dwDTFlags = (lpcs->style & TBSTYLE_LIST) ? DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS: DT_CENTER | DT_END_ELLIPSIS;
     infoPtr->bAnchor = FALSE; /* no anchor highlighting */
     infoPtr->bDragOutSent = FALSE;
+#ifdef __REACTOS__
+    infoPtr->iVersion = iVersion;
+#else
     infoPtr->iVersion = 0;
+#endif
     infoPtr->hwndSelf = hwnd;
     infoPtr->bDoRedraw = TRUE;
     infoPtr->clrBtnHighlight = CLR_DEFAULT;
@@ -7003,7 +7021,11 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
            return TOOLBAR_NCCalcSize (hwnd, wParam, lParam);
 
        case WM_NCCREATE:
+#ifdef __REACTOS__
+           return TOOLBAR_NCCreate (hwnd, wParam, (CREATESTRUCTW*)lParam, 0);
+#else
            return TOOLBAR_NCCreate (hwnd, wParam, (CREATESTRUCTW*)lParam);
+#endif
 
        case WM_NCPAINT:
            return TOOLBAR_NCPaint (hwnd, wParam, lParam);
@@ -7089,6 +7111,40 @@ TOOLBAR_Unregister (void)
     UnregisterClassW (TOOLBARCLASSNAMEW, NULL);
 }
 
+#ifdef __REACTOS__
+static LRESULT WINAPI
+ToolbarV6WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+    if (uMsg == WM_NCCREATE)
+        return TOOLBAR_NCCreate (hwnd, wParam, (CREATESTRUCTW*)lParam, 6);
+    else
+        return ToolbarWindowProc(hwnd, uMsg, wParam, lParam);
+}
+
+VOID
+TOOLBARv6_Register (void)
+{
+    WNDCLASSW wndClass;
+
+    ZeroMemory (&wndClass, sizeof(WNDCLASSW));
+    wndClass.style         = CS_GLOBALCLASS | CS_DBLCLKS;
+    wndClass.lpfnWndProc   = ToolbarV6WindowProc;
+    wndClass.cbClsExtra    = 0;
+    wndClass.cbWndExtra    = sizeof(TOOLBAR_INFO *);
+    wndClass.hCursor       = LoadCursorW (0, (LPWSTR)IDC_ARROW);
+    wndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
+    wndClass.lpszClassName = TOOLBARCLASSNAMEW;
+
+    RegisterClassW (&wndClass);
+}
+
+VOID
+TOOLBARv6_Unregister (void)
+{
+    UnregisterClassW (TOOLBARCLASSNAMEW, NULL);
+}
+#endif
+
 static HIMAGELIST TOOLBAR_InsertImageList(PIMLENTRY **pies, INT *cies, HIMAGELIST himl, INT id)
 {
     HIMAGELIST himlold;