Various Sticky fixes (tm)

* Revert 776bfa64a5 and c3dad7953a (some X11 systems are doing
stupid things forcing me to do an extra check that completely breaks the
click type handling on other systems using the slightly changed
implementation from those commits - see T44278)
* Fix sample lines in Compositor+VSE

(And yes, this time I tested on both of my systems to make sure
everything is fine)
This commit is contained in:
Julian Eisel 2015-04-06 23:10:21 +02:00
parent 33a9247334
commit bcc9a23548
7 changed files with 34 additions and 24 deletions

View File

@ -277,6 +277,10 @@ static int eyedropper_modal(bContext *C, wmOperator *op, const wmEvent *event)
eyedropper_cancel(C, op);
return OPERATOR_CANCELLED;
case LEFTMOUSE:
/* two release events are sent on KM_CLICK, so ignore second one */
if (event->click_type == KM_CLICK) {
break;
}
if (event->val == KM_RELEASE) {
if (eye->accum_tot == 0) {
eyedropper_color_sample(C, eye, event->x, event->y);

View File

@ -511,6 +511,10 @@ static int edbm_dupli_extrude_cursor_invoke(bContext *C, wmOperator *op, const w
bool done = false;
bool use_proj;
if (ELEM(event->click_type, KM_CLICK, KM_HOLD)) {
return OPERATOR_CANCELLED;
}
em_setup_viewcontext(C, &vc);
ED_view3d_init_mats_rv3d(vc.obedit, vc.rv3d);

View File

@ -2950,11 +2950,11 @@ static int image_sample_modal(bContext *C, wmOperator *op, const wmEvent *event)
switch (event->type) {
case LEFTMOUSE:
case RIGHTMOUSE: // XXX hardcoded
if (event->val == KM_RELEASE) {
image_sample_exit(C, op);
return OPERATOR_CANCELLED;
}
break;
if (event->val == KM_RELEASE) {
image_sample_exit(C, op);
return OPERATOR_CANCELLED;
}
break;
case MOUSEMOVE:
image_sample_apply(C, op, event);
break;

View File

@ -609,8 +609,11 @@ static int sample_modal(bContext *C, wmOperator *op, const wmEvent *event)
switch (event->type) {
case LEFTMOUSE:
case RIGHTMOUSE: // XXX hardcoded
sample_exit(C, op);
return OPERATOR_CANCELLED;
if (event->val == KM_RELEASE) {
sample_exit(C, op);
return OPERATOR_CANCELLED;
}
break;
case MOUSEMOVE:
sample_apply(C, op, event);
break;

View File

@ -201,8 +201,10 @@ static int sample_modal(bContext *C, wmOperator *op, const wmEvent *event)
switch (event->type) {
case LEFTMOUSE:
case RIGHTMOUSE: /* XXX hardcoded */
sample_exit(C, op);
return OPERATOR_CANCELLED;
if (event->val == KM_RELEASE) {
sample_exit(C, op);
return OPERATOR_CANCELLED;
}
case MOUSEMOVE:
sample_apply(C, op, event);
break;

View File

@ -2994,7 +2994,7 @@ static wmWindow *wm_event_cursor_other_windows(wmWindowManager *wm, wmWindow *wi
* - #KM_PRESS && time since first #KM_PRESS > U.click_timeout --> send #KM_HOLD
* - #KM_PRESS after a #KM_RELEASE && time since previous #KM_PRESS < U.dbl_click_time --> send #KM_DBL_CLICK
*
* \note: only #KM_DBL_CLICK and #KM_CLICK are handled here, #KM_HOLD in #wm_window_event_clicktype_init (wm_window.c)
* \note: only #KM_DBL_CLICK is handled here, rest in #wm_window_event_clicktype_init (wm_window.c)
*/
static void wm_event_clicktype_init(wmWindow *win, wmEvent *event, wmEvent *event_state)
{
@ -3025,16 +3025,6 @@ static void wm_event_clicktype_init(wmWindow *win, wmEvent *event, wmEvent *even
}
}
/* click */
if ((PIL_check_seconds_timer() - event->click_time) * 1000 <= U.click_timeout) {
if (event->val == KM_RELEASE) {
click_type = KM_CLICK;
if (G.debug & (G_DEBUG_HANDLERS | G_DEBUG_EVENTS)) {
printf("%s Send click event\n", __func__);
}
}
}
if (click_type != event->click_type) {
event_state->click_type = event->click_type = click_type;
}

View File

@ -1107,9 +1107,9 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_ptr
}
/**
* #KM_DBL_CLICK and #KM_CLICK are set in wm_event_clicktype_init (wm_event_system.c)
* Normally, #KM_HOLD should be there too, but we need a time precision of a few
* milliseconds for it, which we can't get from there
* #KM_DBL_CLICK is set in wm_event_clicktype_init (wm_event_system.c)
* Normally, this should be there too, but for #KM_CLICK/#KM_HOLD, we need a
* time precision of a few milliseconds, which we can't get from there
*/
static void wm_window_event_clicktype_init(const bContext *C)
{
@ -1150,7 +1150,14 @@ static void wm_window_event_clicktype_init(const bContext *C)
/* the actual test */
if ((PIL_check_seconds_timer() - event->click_time) * 1000 <= U.click_timeout) {
/* sending of KM_CLICK is handled in wm_event_clicktype_init (wm_event_system.c) */
/* for any reason some X11 systems send two release events triggering two KM_CLICK
* events - making the rules more strict by checking for prevval resolves this */
if (event->val == KM_RELEASE && event->prevval != KM_RELEASE) {
click_type = KM_CLICK;
if (G.debug & (G_DEBUG_HANDLERS | G_DEBUG_EVENTS)) {
printf("%s Send click event\n", __func__);
}
}
}
else if (event->is_key_pressed) {
click_type = KM_HOLD;