[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [35618] trunk/blender/intern/ghost/intern: Fix [#25480] Unable to use Windows titlebar icons after Loopcut

Nathan Letwory nathan at letworyinteractive.com
Fri Mar 18 22:59:46 CET 2011


Revision: 35618
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35618
Author:   jesterking
Date:     2011-03-18 21:59:45 +0000 (Fri, 18 Mar 2011)
Log Message:
-----------
Fix [#25480] Unable to use Windows titlebar icons after Loopcut
reported by Georg K
with patch [#26469] Windows mouse fix
by Alexander Kuznetsov

The amount of mouse grabs wasn't properly balanced with ungrabs, thus preventing from using proper mouse input outside client area.

Modified Paths:
--------------
    trunk/blender/intern/ghost/intern/GHOST_SystemWin32.cpp
    trunk/blender/intern/ghost/intern/GHOST_WindowWin32.cpp
    trunk/blender/intern/ghost/intern/GHOST_WindowWin32.h

Modified: trunk/blender/intern/ghost/intern/GHOST_SystemWin32.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_SystemWin32.cpp	2011-03-18 20:57:32 UTC (rev 35617)
+++ trunk/blender/intern/ghost/intern/GHOST_SystemWin32.cpp	2011-03-18 21:59:45 UTC (rev 35618)
@@ -862,19 +862,19 @@
 				// Mouse events, processed
 				////////////////////////////////////////////////////////////////////////
 				case WM_LBUTTONDOWN:
-					window->registerMouseClickEvent(true);
+					window->registerMouseClickEvent(0);
 					event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskLeft);
 					break;
 				case WM_MBUTTONDOWN:
-					window->registerMouseClickEvent(true);
+					window->registerMouseClickEvent(0);
 					event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskMiddle);
 					break;
 				case WM_RBUTTONDOWN:
-					window->registerMouseClickEvent(true);
+					window->registerMouseClickEvent(0);
 					event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskRight);
 					break;
 				case WM_XBUTTONDOWN:
-					window->registerMouseClickEvent(true);
+					window->registerMouseClickEvent(0);
 					if ((short) HIWORD(wParam) == XBUTTON1){
 						event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskButton4);
 					}else if((short) HIWORD(wParam) == XBUTTON2){
@@ -882,19 +882,19 @@
 					}
 					break;
 				case WM_LBUTTONUP:
-					window->registerMouseClickEvent(false);
+					window->registerMouseClickEvent(1);
 					event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskLeft);
 					break;
 				case WM_MBUTTONUP:
-					window->registerMouseClickEvent(false);
+					window->registerMouseClickEvent(1);
 					event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskMiddle);
 					break;
 				case WM_RBUTTONUP:
-					window->registerMouseClickEvent(false);
+					window->registerMouseClickEvent(1);
 					event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskRight);
 					break;
 				case WM_XBUTTONUP:
-					window->registerMouseClickEvent(false);
+					window->registerMouseClickEvent(1);
 					if ((short) HIWORD(wParam) == XBUTTON1){
 						event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskButton4);
 					}else if((short) HIWORD(wParam) == XBUTTON2){

Modified: trunk/blender/intern/ghost/intern/GHOST_WindowWin32.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_WindowWin32.cpp	2011-03-18 20:57:32 UTC (rev 35617)
+++ trunk/blender/intern/ghost/intern/GHOST_WindowWin32.cpp	2011-03-18 21:59:45 UTC (rev 35618)
@@ -125,6 +125,7 @@
 	m_hDC(0),
 	m_hGlRc(0),
 	m_hasMouseCaptured(false),
+	m_hasGrabMouse(false),
 	m_nPressedButtons(0),
 	m_customCursor(0),
 	m_wintab(NULL),
@@ -831,28 +832,34 @@
 
 void GHOST_WindowWin32::lostMouseCapture()
 {
-	if (m_hasMouseCaptured) {
-		m_hasMouseCaptured = false;
-		m_nPressedButtons = 0;
-	}
+	if(m_hasMouseCaptured)
+		{	m_hasGrabMouse = false;
+			m_nPressedButtons = 0;
+			m_hasMouseCaptured = false;
+		};
 }
 
-void GHOST_WindowWin32::registerMouseClickEvent(bool press)
+void GHOST_WindowWin32::registerMouseClickEvent(int press)
 {
-	if (press) {
-		if (!m_hasMouseCaptured) {
+
+	switch(press)
+	{
+		case 0:	m_nPressedButtons++;	break;
+		case 1:	if(m_nPressedButtons)	m_nPressedButtons--; break;
+		case 2:	m_hasGrabMouse=true;	break;
+		case 3: m_hasGrabMouse=false;	break;
+	}
+
+	if(!m_nPressedButtons && !m_hasGrabMouse && m_hasMouseCaptured)
+	{
+			::ReleaseCapture();
+			m_hasMouseCaptured = false;
+	}
+	else if((m_nPressedButtons || m_hasGrabMouse) && !m_hasMouseCaptured)
+	{
 			::SetCapture(m_hWnd);
 			m_hasMouseCaptured = true;
-		}
-		m_nPressedButtons++;
-	} else {
-		if (m_nPressedButtons) {
-			m_nPressedButtons--;
-			if (!m_nPressedButtons) {
-				::ReleaseCapture();
-				m_hasMouseCaptured = false;
-			}
-		}
+
 	}
 }
 
@@ -924,7 +931,7 @@
 			if(mode == GHOST_kGrabHide)
 				setWindowCursorVisibility(false);
 		}
-		registerMouseClickEvent(true);
+		registerMouseClickEvent(2);
 	}
 	else {
 		if (m_cursorGrab==GHOST_kGrabHide) {
@@ -943,7 +950,7 @@
 		/* Almost works without but important otherwise the mouse GHOST location can be incorrect on exit */
 		setCursorGrabAccum(0, 0);
 		m_cursorGrabBounds.m_l= m_cursorGrabBounds.m_r= -1; /* disable */
-		registerMouseClickEvent(false);
+		registerMouseClickEvent(3);
 	}
 	
 	return GHOST_kSuccess;

Modified: trunk/blender/intern/ghost/intern/GHOST_WindowWin32.h
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_WindowWin32.h	2011-03-18 20:57:32 UTC (rev 35617)
+++ trunk/blender/intern/ghost/intern/GHOST_WindowWin32.h	2011-03-18 21:59:45 UTC (rev 35618)
@@ -251,9 +251,13 @@
 	 * for any real button press, controls mouse
 	 * capturing).
 	 *
-	 * @param press True the event was a button press.
+	 * @param press	
+	 *		0 - mouse pressed
+	 *		1 - mouse released
+	 *		2 - operator grab
+	 *		3 - operator ungrab
 	 */
-	void registerMouseClickEvent(bool press);
+	void registerMouseClickEvent(int press);
 
 	/**
 	 * Inform the window that it has lost mouse capture,
@@ -342,6 +346,9 @@
 	static HDC s_firstHDC;
 	/** Flag for if window has captured the mouse */
 	bool m_hasMouseCaptured;
+	/** Flag if an operator grabs the mouse with WM_cursor_grab/ungrab() 
+	 * Multiple grabs must be realesed with a single ungrab*/
+	bool m_hasGrabMouse;
 	/** Count of number of pressed buttons */
 	int m_nPressedButtons;
 	/** HCURSOR structure of the custom cursor */




More information about the Bf-blender-cvs mailing list