Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2014-05-20 08:19:18 +0400
committerCampbell Barton <ideasman42@gmail.com>2014-05-20 08:21:13 +0400
commitcb023ce0fd1a0cd0844e938363585d0dcdd565ec (patch)
tree41f37ed7b7485dd446c4b51b606a056e0e941fd8 /source/blender/windowmanager
parent3abb2e0a3de51544d66cb85d5e5f8aad6845aac1 (diff)
Fix T34255: Modifier keys ignored when activating windows
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r--source/blender/windowmanager/intern/wm_window.c63
1 files changed, 50 insertions, 13 deletions
diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index 44e31f46167..ddc20e36fef 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;