]> git.saurik.com Git - wxWidgets.git/commitdiff
Applied patch [ 1307056 ] [wxMSW] Focus showing fix for Win2k/XP
authorJulian Smart <julian@anthemion.co.uk>
Sun, 23 Oct 2005 10:53:16 +0000 (10:53 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Sun, 23 Oct 2005 10:53:16 +0000 (10:53 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@35989 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/msw/missing.h
include/wx/msw/window.h
src/msw/window.cpp

index a27be621c674d1b547b9a06cff783d8e6f13f683..fda8af03a7fc21117db0840c86243fb8c9097ed6 100644 (file)
     #define WM_UPDATEUISTATE    0x0128
 #endif
 
+#ifndef WM_CHANGEUISTATE
+    #define WM_CHANGEUISTATE    0x0127
+#endif
+
 #ifndef WM_PRINTCLIENT
     #define WM_PRINTCLIENT 0x318
 #endif
index bfd3cc190f8a6dcdcd505d1ed2c9d349a3128885..2a91ebb3c0dcbdd656bdd81ffd3a7554903fb1f0 100644 (file)
@@ -469,10 +469,13 @@ protected:
     // the background, false otherwise (i.e. the system should erase it)
     bool DoEraseBackground(WXHDC hDC);
 
-    // generate WM_UPDATEUISTATE if it's needed for the OS we're running under
+    // generate WM_CHANGEUISTATE if it's needed for the OS we're running under
     //
-    // the parameter should be one of UIS_XXX constants
-    void MSWUpdateUIState(int action);
+    // action should be one of the UIS_XXX constants
+    // state should be one or more of the UISF_XXX constants
+    // if action == UIS_INITIALIZE then it doesn't seem to matter what we use
+    // for state as the system will decide for us what needs to be set
+    void MSWUpdateUIState(int action, int state = 0);
 
 private:
     // common part of all ctors
index 66fcdf4355af805c49fe4b9273ff4239e9528caa..48d244b115cceb5ab09c2ff5bb8286ab059fbe5d 100644 (file)
@@ -831,9 +831,9 @@ void wxWindowMSW::WarpPointer(int x, int y)
     }
 }
 
-void wxWindowMSW::MSWUpdateUIState(int action)
+void wxWindowMSW::MSWUpdateUIState(int action, int state)
 {
-    // WM_UPDATEUISTATE only appeared in Windows 2000 so it can do us no good
+    // WM_CHANGEUISTATE only appeared in Windows 2000 so it can do us no good
     // to use it on older systems -- and could possibly do some harm
     static int s_needToUpdate = -1;
     if ( s_needToUpdate == -1 )
@@ -845,11 +845,9 @@ void wxWindowMSW::MSWUpdateUIState(int action)
 
     if ( s_needToUpdate )
     {
-        // NB: it doesn't seem to matter what we put in wParam, whether we
-        //     include just one UISF_XXX or both, both are affected, no idea
-        //     why
-        ::SendMessage(GetHwnd(), WM_UPDATEUISTATE,
-                      MAKEWPARAM(action, UISF_HIDEFOCUS | UISF_HIDEACCEL), 0);
+        // we send WM_CHANGEUISTATE so if nothing needs changing then the system
+        // won't send WM_UPDATEUISTATE
+        ::SendMessage(GetHwnd(), WM_CHANGEUISTATE, MAKEWPARAM(action, state), 0);
     }
 }
 
@@ -2106,9 +2104,8 @@ bool wxWindowMSW::MSWProcessMessage(WXMSG* pMsg)
                 {
                     // as we don't call IsDialogMessage(), which would take of
                     // this by default, we need to manually send this message
-                    // so that controls could change their appearance
-                    // appropriately
-                    MSWUpdateUIState(UIS_CLEAR);
+                    // so that controls can change their UI state if needed
+                    MSWUpdateUIState(UIS_CLEAR, UISF_HIDEFOCUS);
 
                     return true;
                 }
@@ -4656,7 +4653,7 @@ bool wxWindowMSW::HandleMouseMove(int x, int y, WXUINT flags)
             GenerateMouseLeave();
         }
     }
-#endif // HAVE_TRACKMOUSEEVENT 
+#endif // HAVE_TRACKMOUSEEVENT
 
 #if wxUSE_MOUSEEVENT_HACK
     // Windows often generates mouse events even if mouse position hasn't