From cfc1ddeff71570d702fc0c1c79d36249086849b9 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 7 Jun 2018 20:32:51 +0200 Subject: [PATCH 1/2] GHOST/X11: Xinput/XIM support caused double key-up All keyboard events were sending double key events (including modifiers) when xinput was enabled with gnome (causing much confusion!). I cant test if XIM works, but this isn't useful to send double events, so disabling for now. --- intern/ghost/intern/GHOST_SystemX11.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp index 93a9f3589f4..62befc2f227 100644 --- a/intern/ghost/intern/GHOST_SystemX11.cpp +++ b/intern/ghost/intern/GHOST_SystemX11.cpp @@ -571,10 +571,8 @@ processEvents( } /* dispatch event to XIM server */ - if ((XFilterEvent(&xevent, (Window)NULL) == True) && (xevent.type != KeyRelease)) { - /* do nothing now, the event is consumed by XIM. - * however, KeyRelease event should be processed - * here, otherwise modifiers remain activated. */ + if ((XFilterEvent(&xevent, (Window)NULL) == True)) { + /* do nothing now, the event is consumed by XIM. */ continue; } #endif From 8f49299134b504a59558aad8e66a81ae3c6c9748 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 7 Jun 2018 20:37:28 +0200 Subject: [PATCH 2/2] WM: fix drag events applying after release --- source/blender/windowmanager/intern/wm_event_system.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index f820a0a1b8d..5974d4fddee 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -2252,9 +2252,14 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers) /* eventstate stores if previous event was a KM_PRESS, in case that * wasn't handled, the KM_RELEASE will become a KM_CLICK */ - if (win && event->val == KM_PRESS) { - win->eventstate->check_click = true; - win->eventstate->check_drag = true; + if (win != NULL) { + if (event->val == KM_PRESS) { + win->eventstate->check_click = true; + win->eventstate->check_drag = true; + } + else if (event->val == KM_RELEASE) { + win->eventstate->check_drag = false; + } } if (win && win->eventstate->prevtype == event->type) {