[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51706] trunk/blender/source/blender/ windowmanager/intern/wm_event_system.c: Event system fix:

Ton Roosendaal ton at blender.org
Sun Oct 28 15:49:41 CET 2012


Revision: 51706
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51706
Author:   ton
Date:     2012-10-28 14:49:40 +0000 (Sun, 28 Oct 2012)
Log Message:
-----------
Event system fix:

Now modifier key press gets generated without having own modifier set.
Same happens for double clicks on modifiers.

This also fixes case: press shift twice first, modifier fails.

Modified Paths:
--------------
    trunk/blender/source/blender/windowmanager/intern/wm_event_system.c

Modified: trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2012-10-28 12:20:38 UTC (rev 51705)
+++ trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2012-10-28 14:49:40 UTC (rev 51706)
@@ -2913,6 +2913,37 @@
 				}
 			}
 
+			/* modifiers assign to eventstate, so next event gets the modifer (makes modifier key events work) */
+			/* assigning both first and second is strange - campbell */
+			switch (event.type) {
+				case LEFTSHIFTKEY: case RIGHTSHIFTKEY:
+					evt->shift = (event.val == KM_PRESS) ?
+								((evt->ctrl || evt->alt || evt->oskey) ? (KM_MOD_FIRST | KM_MOD_SECOND) : KM_MOD_FIRST) :
+								FALSE;
+					break;
+				case LEFTCTRLKEY: case RIGHTCTRLKEY:
+					evt->ctrl = (event.val == KM_PRESS) ?
+								((evt->shift || evt->alt || evt->oskey) ? (KM_MOD_FIRST | KM_MOD_SECOND) : KM_MOD_FIRST) :
+								FALSE;
+					break;
+				case LEFTALTKEY: case RIGHTALTKEY:
+					evt->alt = (event.val == KM_PRESS) ?
+								((evt->ctrl || evt->shift || evt->oskey) ? (KM_MOD_FIRST | KM_MOD_SECOND) : KM_MOD_FIRST) :
+								FALSE;
+					break;
+				case OSKEY:
+					evt->oskey = (event.val == KM_PRESS) ?
+								((evt->ctrl || evt->alt || evt->shift) ? (KM_MOD_FIRST | KM_MOD_SECOND) : KM_MOD_FIRST) :
+								FALSE;
+					break;
+				default:
+					if (event.val == KM_PRESS && event.keymodifier == 0)
+						evt->keymodifier = event.type;  /* only set in eventstate, for next event */
+					else if (event.val == KM_RELEASE && event.keymodifier == event.type)
+						event.keymodifier = evt->keymodifier = 0;
+					break;
+			}
+
 			/* double click test */
 			if (event.type == evt->prevtype && event.val == KM_PRESS) {
 				if ((ABS(event.x - evt->prevclickx)) <= 2 &&
@@ -2924,46 +2955,13 @@
 				}
 			}
 			
-			/* prevent modifier keys getting own key as modifier */
-			if (event.val != KM_DBL_CLICK) {
-
-				/* modifiers */
-				/* assigning both first and second is strange - campbell */
-				switch (event.type) {
-					case LEFTSHIFTKEY: case RIGHTSHIFTKEY:
-						event.shift = evt->shift = (event.val == KM_PRESS) ?
-						            ((evt->ctrl || evt->alt || evt->oskey) ? (KM_MOD_FIRST | KM_MOD_SECOND) : KM_MOD_FIRST) :
-						            FALSE;
-						break;
-					case LEFTCTRLKEY: case RIGHTCTRLKEY:
-						event.ctrl = evt->ctrl = (event.val == KM_PRESS) ?
-						            ((evt->shift || evt->alt || evt->oskey) ? (KM_MOD_FIRST | KM_MOD_SECOND) : KM_MOD_FIRST) :
-						            FALSE;
-						break;
-					case LEFTALTKEY: case RIGHTALTKEY:
-						event.alt = evt->alt = (event.val == KM_PRESS) ?
-						            ((evt->ctrl || evt->shift || evt->oskey) ? (KM_MOD_FIRST | KM_MOD_SECOND) : KM_MOD_FIRST) :
-						            FALSE;
-						break;
-					case OSKEY:
-						event.oskey = evt->oskey = (event.val == KM_PRESS) ?
-						            ((evt->ctrl || evt->alt || evt->shift) ? (KM_MOD_FIRST | KM_MOD_SECOND) : KM_MOD_FIRST) :
-						            FALSE;
-						break;
-					default:
-						if (event.val == KM_PRESS && event.keymodifier == 0)
-							evt->keymodifier = event.type;  /* only set in eventstate, for next event */
-						else if (event.val == KM_RELEASE && event.keymodifier == event.type)
-							event.keymodifier = evt->keymodifier = 0;
-						break;
-				}
-			}
 			/* this case happens on some systems that on holding a key pressed,
 			 * generate press events without release, we still want to keep the
 			 * modifier in win->eventstate, but for the press event of the same
 			 * key we don't want the key modifier */
 			if (event.keymodifier == event.type)
 				event.keymodifier = 0;
+			
 			/* this case happened with an external numpad, it's not really clear
 			 * why, but it's also impossible to map a key modifier to an unknwon
 			 * key, so it shouldn't harm */




More information about the Bf-blender-cvs mailing list