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:
authorTon Roosendaal <ton@blender.org>2012-10-26 20:46:26 +0400
committerTon Roosendaal <ton@blender.org>2012-10-26 20:46:26 +0400
commitdd176509fd95bb9d42d98599a3c4303da99dfa01 (patch)
treea1916329ec3001975fe33fd072f71ca0925faaa1
parent3dfceecace6e5797f2c05d215f5967658066bc17 (diff)
Bugfix for new handling of double-click:
The modifier keys were getting own key as modifier :) Made it not possible to use them for events. Still open issue: for some reason modifer key 'press' gets swallowed. Digging into that.
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c84
1 files changed, 44 insertions, 40 deletions
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index c2c381e54f7..be26400c10c 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -2874,37 +2874,51 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int U
}
}
- /* 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;
+ /* double click test */
+ if (event.type == evt->prevtype && event.val == KM_PRESS) {
+ if ((ABS(event.x - evt->prevclickx)) <= 2 &&
+ (ABS(event.y - evt->prevclicky)) <= 2 &&
+ ((PIL_check_seconds_timer() - evt->prevclicktime) * 1000 < U.dbl_click_time))
+ {
+ // printf("double click\n");
+ evt->val= event.val = KM_DBL_CLICK;
+ }
+ }
+
+ /* 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
@@ -2921,16 +2935,6 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int U
if (event.type == ESCKEY && event.val == KM_PRESS)
G.is_break = TRUE;
- /* double click test */
- if (event.type == evt->prevtype && event.val == KM_PRESS) {
- if ((ABS(event.x - evt->prevclickx)) <= 2 &&
- (ABS(event.y - evt->prevclicky)) <= 2 &&
- ((PIL_check_seconds_timer() - evt->prevclicktime) * 1000 < U.dbl_click_time))
- {
- printf("double key click\n");
- event.val = KM_DBL_CLICK;
- }
- }
if (event.val == KM_RELEASE) {
evt->prevclicktime = PIL_check_seconds_timer();
evt->prevclickx = event.x;