track button mask for all drags, only end drag when mask has depopulated

previously, beginning a drag with the left button, then pressing and
releasing another button would result in the drag terminating without
the original button being released
This commit is contained in:
Mike Blumenkrantz 2015-08-12 15:39:42 -04:00
parent d1ed90d160
commit 442d63d8d6
13 changed files with 20 additions and 1 deletions

View File

@ -3015,6 +3015,7 @@ e_client_mouse_move(E_Client *ec, Evas_Point *output)
drag_types, 1, ec, -1,
NULL,
_e_client_cb_drag_finished);
client_drag->button_mask = evas_pointer_button_down_mask_get(e_comp->evas);
e_drag_resize(client_drag, w, h);
o = e_client_icon_add(ec, client_drag->evas);

View File

@ -364,6 +364,7 @@ _e_comp_wl_data_device_cb_drag_start(struct wl_client *client, struct wl_resourc
evas_pointer_canvas_xy_get(e_comp->evas, &x, &y);
e_comp->wl_comp_data->drag = e_drag_new(x, y,
NULL, 0, NULL, 0, NULL, _e_comp_wl_data_device_drag_finished);
e_comp->wl_comp_data->drag->button_mask = evas_pointer_button_down_mask_get(e_comp->evas);
if (ec)
e_drag_object_set(e_comp->wl_comp_data->drag, ec->frame);
e_drag_start(e_comp->wl_comp_data->drag, x, y);

View File

@ -1197,6 +1197,11 @@ _e_dnd_cb_mouse_up(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
if (ev->window != _drag_win) return ECORE_CALLBACK_PASS_ON;
if (_drag_current && _drag_current->button_mask)
{
_drag_current->button_mask &= ~(1 << (ev->buttons - 1));
if (_drag_current->button_mask) return ECORE_CALLBACK_RENEW;
}
_e_drag_end(ev->x, ev->y);
return ECORE_CALLBACK_PASS_ON;

View File

@ -44,6 +44,7 @@ struct _E_Drag
int x, y, w, h;
int dx, dy;
unsigned int button_mask;
E_Layer layer;
unsigned char visible : 1;

View File

@ -7562,7 +7562,7 @@ _e_fm2_cb_icon_mouse_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_
}
static void
_e_fm2_cb_icon_mouse_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
_e_fm2_cb_icon_mouse_move(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info)
{
Evas_Event_Mouse_Move *ev;
E_Fm2_Icon *ic;
@ -7699,6 +7699,7 @@ _e_fm2_cb_icon_mouse_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA
d = e_drag_new(0, 0, drag_types, 1,
sel, sel_length, NULL, _e_fm2_cb_drag_finished);
d->button_mask = evas_pointer_button_down_mask_get(e);
if (layout)
d->x = ic->sd->x, d->y = ic->sd->y;
else

View File

@ -2302,6 +2302,7 @@ _e_gadcon_client_drag_begin(E_Gadcon_Client *gcc, int x, int y)
drag_types, 1, gcc, -1, NULL,
e_gadcon_drag_finished_cb);
if (!drag) return;
drag->button_mask = evas_pointer_button_down_mask_get(e_comp->evas);
o = gcc->client_class->func.icon((E_Gadcon_Client_Class *)gcc->client_class,
e_drag_evas_get(drag));

View File

@ -1009,6 +1009,7 @@ _e_int_menus_apps_drag(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi)
efreet_desktop_ref(desktop);
drag = e_drag_new(x, y, drag_types, 1, desktop, -1,
NULL, NULL);
drag->button_mask = evas_pointer_button_down_mask_get(e_comp->evas);
size = MIN(w, h);
o = e_util_desktop_icon_add(desktop, size, e_drag_evas_get(drag));

View File

@ -1536,6 +1536,7 @@ on_move(void *data, Evas_Object *o EINA_UNUSED, const char *em EINA_UNUSED, cons
drag_types, 1, drag_gcc, -1, NULL,
e_gadcon_drag_finished_cb);
if (!drag) return;
drag->button_mask = evas_pointer_button_down_mask_get(e_comp->evas);
o = drag_gcc->client_class->func.icon((E_Gadcon_Client_Class *)drag_gcc->client_class,
e_drag_evas_get(drag));

View File

@ -1834,6 +1834,7 @@ _ibar_cb_icon_mouse_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_
evas_object_geometry_get(ic->o_icon, &x, &y, &w, &h);
d = e_drag_new(x, y, drag_types, 1,
ic->app, -1, NULL, _ibar_cb_drag_finished);
d->button_mask = evas_pointer_button_down_mask_get(e_comp->evas);
efreet_desktop_ref(ic->app);
size = MAX(w, h);
o = e_util_desktop_icon_add(ic->app, size, e_drag_evas_get(d));

View File

@ -783,6 +783,7 @@ _ibox_cb_icon_mouse_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_
evas_object_geometry_get(ic->o_icon, &x, &y, &w, &h);
d = e_drag_new(x, y, drag_types, 1,
ic->client, -1, NULL, _ibox_cb_drag_finished);
d->button_mask = evas_pointer_button_down_mask_get(e_comp->evas);
o = e_client_icon_add(ic->client, e_drag_evas_get(d));
e_drag_object_set(d, o);

View File

@ -1188,6 +1188,7 @@ _pager_window_cb_mouse_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EI
drag = e_drag_new(x, y, drag_types, 2, pw->desk->pager, -1,
_pager_window_cb_drag_convert,
_pager_window_cb_drag_finished);
drag->button_mask = evas_pointer_button_down_mask_get(e_comp->evas);
/* this is independent of the original mirror */
o = e_deskmirror_mirror_copy(pw->o_mirror);
@ -1587,6 +1588,7 @@ _pager_desk_cb_mouse_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA
evas_object_geometry_get(pd->o_desk, &x, &y, &w, &h);
drag = e_drag_new(x, y, drag_types, 1, pd, -1,
NULL, _pager_desk_cb_drag_finished);
drag->button_mask = evas_pointer_button_down_mask_get(e_comp->evas);
/* redraw the desktop theme above */
o = e_comp_object_util_mirror_add(pd->o_layout);

View File

@ -1922,6 +1922,7 @@ _pager_window_cb_mouse_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EI
drag = e_drag_new(x, y, drag_types, 2, pw, -1,
_pager_window_cb_drag_convert,
_pager_window_cb_drag_finished);
drag->button_mask = evas_pointer_button_down_mask_get(e_comp->evas);
o = edje_object_add(drag->evas);
e_theme_edje_object_set(o, "base/theme/modules/pager",
@ -2297,6 +2298,7 @@ _pager_desk_cb_mouse_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA
evas_object_geometry_get(pd->o_desk, &x, &y, &w, &h);
drag = e_drag_new(x, y, drag_types, 1, pd, -1,
NULL, _pager_desk_cb_drag_finished);
drag->button_mask = evas_pointer_button_down_mask_get(e_comp->evas);
/* redraw the desktop theme above */
o = edje_object_add(drag->evas);

View File

@ -203,6 +203,7 @@ _xwl_fixes_selection_notify(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_X_Even
evas_pointer_canvas_xy_get(e_comp->evas, &x, &y);
e_comp->wl_comp_data->drag_client = e_pixmap_find_client(E_PIXMAP_TYPE_X, ev->owner);
e_comp->wl_comp_data->drag = e_drag_new(x, y, names, num, NULL, 0, NULL, _xwayland_drop);
e_comp->wl_comp_data->drag->button_mask = evas_pointer_button_down_mask_get(e_comp->evas);
ecore_x_window_move_resize(e_comp->cm_selection, 0, 0, e_comp->w, e_comp->h);
ecore_x_window_show(e_comp->cm_selection);
e_drag_start(e_comp->wl_comp_data->drag, x, y);