diff options
author | Ton Roosendaal <ton@blender.org> | 2012-10-28 18:49:40 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2012-10-28 18:49:40 +0400 |
commit | d800cffaf10cb73446d4f3739bca968224f3a1dc (patch) | |
tree | 87cec79561dd045054f66e0af3b7c0b14eb96893 /source/blender/windowmanager | |
parent | 520e1b20902b953aa440706f9c5e5c52149e972a (diff) |
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.
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 66 |
1 files changed, 32 insertions, 34 deletions
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index d21075c56b9..1506bd88d03 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -2913,6 +2913,37 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int U } } + /* 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 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int U } } - /* 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 */ |