[Bf-blender-cvs] [cb023ce] master: Fix T34255: Modifier keys ignored when activating windows

Campbell Barton noreply at git.blender.org
Tue May 20 06:21:22 CEST 2014


Commit: cb023ce0fd1a0cd0844e938363585d0dcdd565ec
Author: Campbell Barton
Date:   Tue May 20 14:19:18 2014 +1000
https://developer.blender.org/rBcb023ce0fd1a0cd0844e938363585d0dcdd565ec

Fix T34255: Modifier keys ignored when activating windows

===================================================================

M	source/blender/windowmanager/intern/wm_window.c

===================================================================

diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index 44e31f4..ddc20e3 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -747,6 +747,10 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_ptr
 				GHOST_TEventKeyData kdata;
 				wmEvent event;
 				int wx, wy;
+				const int keymodifier = ((query_qual(SHIFT)     ? KM_SHIFT : 0) |
+				                         (query_qual(CONTROL)   ? KM_CTRL  : 0) |
+				                         (query_qual(ALT)       ? KM_ALT   : 0) |
+				                         (query_qual(OS)        ? KM_OSKEY : 0));
 				
 				wm->winactive = win; /* no context change! c->wm->windrawable is drawable, or for area queues */
 				
@@ -756,25 +760,58 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_ptr
 				/* bad ghost support for modifier keys... so on activate we set the modifiers again */
 
 				/* TODO: This is not correct since a modifier may be held when a window is activated...
-				 * better solve this at ghost level. attempted fix r54450 but it caused bug [#34255] */
+				 * better solve this at ghost level. attempted fix r54450 but it caused bug [#34255]
+				 *
+				 * For now don't send GHOST_kEventKeyDown events, just set the 'eventstate'.
+				 */
 				kdata.ascii = '\0';
 				kdata.utf8_buf[0] = '\0';
-				if (win->eventstate->shift && !query_qual(SHIFT)) {
-					kdata.key = GHOST_kKeyLeftShift;
-					wm_event_add_ghostevent(wm, win, GHOST_kEventKeyUp, time, &kdata);
+
+				if (win->eventstate->shift) {
+					if ((keymodifier & KM_SHIFT) == 0) {
+						kdata.key = GHOST_kKeyLeftShift;
+						wm_event_add_ghostevent(wm, win, GHOST_kEventKeyUp, time, &kdata);
+					}
+				}
+				else {
+					if (keymodifier & KM_SHIFT) {
+						win->eventstate->shift = KM_MOD_FIRST;
+					}
 				}
-				if (win->eventstate->ctrl && !query_qual(CONTROL)) {
-					kdata.key = GHOST_kKeyLeftControl;
-					wm_event_add_ghostevent(wm, win, GHOST_kEventKeyUp, time, &kdata);
+				if (win->eventstate->ctrl) {
+					if ((keymodifier & KM_CTRL) == 0) {
+						kdata.key = GHOST_kKeyLeftControl;
+						wm_event_add_ghostevent(wm, win, GHOST_kEventKeyUp, time, &kdata);
+					}
 				}
-				if (win->eventstate->alt && !query_qual(ALT)) {
-					kdata.key = GHOST_kKeyLeftAlt;
-					wm_event_add_ghostevent(wm, win, GHOST_kEventKeyUp, time, &kdata);
+				else {
+					if (keymodifier & KM_CTRL) {
+						win->eventstate->ctrl = KM_MOD_FIRST;
+					}
 				}
-				if (win->eventstate->oskey && !query_qual(OS)) {
-					kdata.key = GHOST_kKeyOS;
-					wm_event_add_ghostevent(wm, win, GHOST_kEventKeyUp, time, &kdata);
+				if (win->eventstate->alt) {
+					if ((keymodifier & KM_ALT) == 0) {
+						kdata.key = GHOST_kKeyLeftAlt;
+						wm_event_add_ghostevent(wm, win, GHOST_kEventKeyUp, time, &kdata);
+					}
 				}
+				else {
+					if (keymodifier & KM_ALT) {
+						win->eventstate->alt = KM_MOD_FIRST;
+					}
+				}
+				if (win->eventstate->oskey) {
+					if ((keymodifier & KM_OSKEY) == 0) {
+						kdata.key = GHOST_kKeyOS;
+						wm_event_add_ghostevent(wm, win, GHOST_kEventKeyUp, time, &kdata);
+					}
+				}
+				else {
+					if (keymodifier & KM_OSKEY) {
+						win->eventstate->oskey = KM_MOD_FIRST;
+					}
+				}
+
 				/* keymodifier zero, it hangs on hotkeys that open windows otherwise */
 				win->eventstate->keymodifier = 0;




More information about the Bf-blender-cvs mailing list