diff --git a/src/bin/e_actions.c b/src/bin/e_actions.c index 718455b9a..e5d044da9 100644 --- a/src/bin/e_actions.c +++ b/src/bin/e_actions.c @@ -1283,16 +1283,16 @@ ACT_FN_GO(window_zone_move_by, ) move = 0; zone = e_comp_zone_number_get(move); if (!zone) return; + if (ec->zone == zone) return; max = ec->maximized; fs = ec->fullscreen_policy; fullscreen = ec->fullscreen; if (ec->maximized) e_client_unmaximize(ec, E_MAXIMIZE_BOTH); if (fullscreen) e_client_unfullscreen(ec); e_client_zone_set(ec, zone); -// e_client_desk_set(ec, e_desk_current_get(zone)); if (max) e_client_maximize(ec, max); if (fullscreen) e_client_fullscreen(ec, fs); - evas_object_focus_set(ec->frame, 1); + e_client_focus_set_with_pointer(ec); } /***************************************************************************/ @@ -1313,9 +1313,19 @@ ACT_FN_GO(window_desk_move_to, ) if (sscanf(params, "%d %d", &x, &y) == 2) { E_Desk *desk; + E_Desk *old_desk = ec->desk; + Eina_Bool was_focused = e_client_stack_focused_get(ec); desk = e_desk_at_xy_get(ec->zone, x, y); - if (desk) e_client_desk_set(ec, desk); + if ((desk) && (desk != old_desk)) + { + e_client_desk_set(ec, desk); + if (was_focused) + { + E_Client *ec_focus = e_desk_last_focused_focus(old_desk); + if (ec_focus) e_client_focus_set_with_pointer(ec_focus); + } + } } } diff --git a/src/bin/e_client.c b/src/bin/e_client.c index 414220422..d3dc6bdef 100644 --- a/src/bin/e_client.c +++ b/src/bin/e_client.c @@ -2805,7 +2805,6 @@ e_client_desk_set(E_Client *ec, E_Desk *desk) { E_Event_Client_Desk_Set *ev; E_Desk *old_desk; - Eina_Bool was_focused = ec->focused; E_OBJECT_CHECK(ec); E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE); @@ -2873,11 +2872,6 @@ e_client_desk_set(E_Client *ec, E_Desk *desk) e_client_res_change_geometry_restore(ec); ec->pre_res_change.valid = 0; } - if (was_focused) - { - E_Client *ec_focus = e_desk_last_focused_focus(old_desk); - if (ec_focus) e_client_focus_set_with_pointer(ec_focus); - } } if (ec->stack.prev || ec->stack.next) diff --git a/src/bin/e_comp_x.c b/src/bin/e_comp_x.c index 17a089edd..50f92beb8 100644 --- a/src/bin/e_comp_x.c +++ b/src/bin/e_comp_x.c @@ -2170,8 +2170,19 @@ _e_comp_x_message(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_X_Event_Cl { if (e_util_strcmp(p, ec->desk->window_profile)) { + E_Desk *old_desk = ec->desk; E_Desk *desk = e_comp_desk_window_profile_get(p); - if (desk) e_client_desk_set(ec, desk); + Eina_Bool was_focused = e_client_stack_focused_get(ec); + + if ((desk) && (desk != old_desk)) + { + e_client_desk_set(ec, desk); + if (was_focused) + { + E_Client *ec_focus = e_desk_last_focused_focus(old_desk); + if (ec_focus) e_client_focus_set_with_pointer(ec_focus); + } + } } } free(p); @@ -2245,14 +2256,22 @@ _e_comp_x_message(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_X_Event_Cl char *p = ecore_x_atom_name_get(ev->data.l[1]); if (!e_util_strcmp(ec->e.state.profile.wait, p)) { + E_Desk *old_desk = ec->desk; + E_Desk *desk = ec->e.state.profile.wait_desk; + Eina_Bool was_focused = e_client_stack_focused_get(ec); + eina_stringshare_replace(&ec->e.state.profile.wait, NULL); ec->e.state.profile.wait_for_done = 0; - E_Desk *desk = ec->e.state.profile.wait_desk; - if ((desk) && (desk != ec->desk)) + if ((desk) && (desk != old_desk)) { eina_stringshare_replace(&ec->e.state.profile.name, desk->window_profile); e_client_desk_set(ec, desk); + if (was_focused) + { + E_Client *ec_focus = e_desk_last_focused_focus(old_desk); + if (ec_focus) e_client_focus_set_with_pointer(ec_focus); + } } e_client_desk_window_profile_wait_desk_set(ec, NULL); } diff --git a/src/bin/e_int_client_menu.c b/src/bin/e_int_client_menu.c index c64795978..dac3efd9f 100644 --- a/src/bin/e_int_client_menu.c +++ b/src/bin/e_int_client_menu.c @@ -1318,10 +1318,18 @@ _e_client_menu_cb_sendto(void *data, E_Menu *m, E_Menu_Item *mi EINA_UNUSED) desk = data; ec = e_object_data_get(E_OBJECT(m)); - if ((ec) && (desk)) + if ((ec) && (desk) && (ec->desk != desk)) { + E_Desk *old_desk = ec->desk; + Eina_Bool was_focused = e_client_stack_focused_get(ec); + ec->hidden = 0; e_client_desk_set(ec, desk); + if (was_focused) + { + E_Client *ec_focus = e_desk_last_focused_focus(old_desk); + if (ec_focus) e_client_focus_set_with_pointer(ec_focus); + } } } diff --git a/src/modules/msgbus/msgbus_window.c b/src/modules/msgbus/msgbus_window.c index 353957bb5..fb600641f 100644 --- a/src/modules/msgbus/msgbus_window.c +++ b/src/modules/msgbus/msgbus_window.c @@ -141,8 +141,19 @@ _e_msgbus_window_sendtodesktop_cb( const Eldbus_Service_Interface *iface EINA_UN { if (xdesk < zone->desk_x_count && ydesk < zone->desk_y_count) { + E_Desk *old_desk = ec->desk; + Eina_Bool was_focused = e_client_stack_focused_get(ec); + desk = e_desk_at_xy_get(zone, xdesk, ydesk); - if (desk) e_client_desk_set(ec, desk); + if ((desk) && (desk != old_desk)) + { + e_client_desk_set(ec, desk); + if (was_focused) + { + E_Client *ec_focus = e_desk_last_focused_focus(old_desk); + if (ec_focus) e_client_focus_set_with_pointer(ec_focus); + } + } } } } diff --git a/src/modules/pager/e_mod_main.c b/src/modules/pager/e_mod_main.c index 5d8850f5f..75b3deb86 100644 --- a/src/modules/pager/e_mod_main.c +++ b/src/modules/pager/e_mod_main.c @@ -1240,11 +1240,13 @@ _pager_window_cb_drag_finished(E_Drag *drag, int dropped) else { int dx, dy, x, y, zx, zy, zw, zh; - pw->client->hidden = !p->active_pd->desk->visible; - e_client_desk_set(pw->client, p->active_pd->desk); + E_Client *ec = pw->client; - dx = (pw->client->w / 2); - dy = (pw->client->h / 2); + ec->hidden = !p->active_pd->desk->visible; + e_client_desk_set(ec, p->active_pd->desk); + + dx = (ec->w / 2); + dy = (ec->h / 2); evas_pointer_canvas_xy_get(evas_object_evas_get(p->o_table), &x, &y); e_zone_useful_geometry_get(p->zone, &zx, &zy, &zw, &zh); @@ -1253,26 +1255,22 @@ _pager_window_cb_drag_finished(E_Drag *drag, int dropped) if (dx < x) { x -= dx; - if ((pw->client->w < zw) && - (x + pw->client->w > zx + zw)) - x -= x + pw->client->w - (zx + zw); + if ((ec->w < zw) && (x + ec->w > zx + zw)) + x -= x + ec->w - (zx + zw); } else x = 0; if (dy < y) { y -= dy; - if ((pw->client->h < zh) && - (y + pw->client->h > zy + zh)) - y -= y + pw->client->h - (zy + zh); + if ((ec->h < zh) && (y + ec->h > zy + zh)) + y -= y + ec->h - (zy + zh); } else y = 0; - evas_object_move(pw->client->frame, x, y); + evas_object_move(ec->frame, x, y); - - if (!(pw->client->lock_user_stacking)) - evas_object_raise(pw->client->frame); - evas_object_focus_set(pw->client->frame, 1); + if (!(ec->lock_user_stacking)) evas_object_raise(ec->frame); + evas_object_focus_set(ec->frame, 1); } if (p->active_drop_pd) { @@ -1338,6 +1336,9 @@ _pager_update_drop_position(Pager *p, Evas_Coord x, Evas_Coord y) if (pd) { int zx, zy, zw, zh, vx, vy; + E_Client *ec = pw->client; + E_Desk *old_desk = ec->desk; + Eina_Bool was_focused = e_client_stack_focused_get(ec); pw->drag.in_pager = 1; //makes drags look weird @@ -1347,11 +1348,16 @@ _pager_update_drop_position(Pager *p, Evas_Coord x, Evas_Coord y) e_deskmirror_coord_canvas_to_virtual(pd->o_layout, x + pw->drag.dx, y + pw->drag.dy, &vx, &vy); - pw->client->hidden = !pd->desk->visible; - e_client_desk_set(pw->client, pd->desk); - x = E_CLAMP(vx + zx, zx, zx + zw - pw->client->w); - y = E_CLAMP(vy + zy, zy, zy + zh - pw->client->h); - evas_object_move(pw->client->frame, x, y); + ec->hidden = !pd->desk->visible; + e_client_desk_set(ec, pd->desk); + x = E_CLAMP(vx + zx, zx, zx + zw - ec->w); + y = E_CLAMP(vy + zy, zy, zy + zh - ec->h); + evas_object_move(ec->frame, x, y); + if (was_focused) + { + E_Client *ec_focus = e_desk_last_focused_focus(old_desk); + if (ec_focus) e_client_focus_set_with_pointer(ec_focus); + } } else { @@ -1465,6 +1471,8 @@ _pager_drop_cb_drop(void *data, const char *type, void *event_info) E_Maximize max = ec->maximized; E_Fullscreen fs = ec->fullscreen_policy; Eina_Bool fullscreen = ec->fullscreen; + E_Desk *old_desk = ec->desk; + Eina_Bool was_focused = e_client_stack_focused_get(ec); if (ec->iconic) e_client_uniconify(ec); if (ec->maximized) @@ -1472,8 +1480,13 @@ _pager_drop_cb_drop(void *data, const char *type, void *event_info) if (fullscreen) e_client_unfullscreen(ec); ec->hidden = 0; e_client_desk_set(ec, pd->desk); + if (was_focused) + { + E_Client *ec_focus = e_desk_last_focused_focus(old_desk); + if (ec_focus) e_client_focus_set_with_pointer(ec_focus); + } evas_object_raise(ec->frame); - + if ((!max) && (!fullscreen)) { int zx, zy, zw, zh, mx, my; diff --git a/src/modules/pager/gadget/pager.c b/src/modules/pager/gadget/pager.c index 7d5f826bc..852af0526 100644 --- a/src/modules/pager/gadget/pager.c +++ b/src/modules/pager/gadget/pager.c @@ -2158,11 +2158,13 @@ _pager_window_cb_drag_finished(E_Drag *drag, int dropped) else { int dx, dy, x, y, zx, zy, zw, zh; - pw->client->hidden = !p->active_pd->desk->visible; - e_client_desk_set(pw->client, p->active_pd->desk); + E_Client *ec = pw->client; - dx = (pw->client->w / 2); - dy = (pw->client->h / 2); + ec->hidden = !p->active_pd->desk->visible; + e_client_desk_set(ec, p->active_pd->desk); + + dx = (ec->w / 2); + dy = (ec->h / 2); evas_pointer_canvas_xy_get(evas_object_evas_get(p->o_table), &x, &y); e_zone_useful_geometry_get(p->zone, &zx, &zy, &zw, &zh); @@ -2171,25 +2173,22 @@ _pager_window_cb_drag_finished(E_Drag *drag, int dropped) if (dx < x) { x -= dx; - if ((pw->client->w < zw) && - (x + pw->client->w > zx + zw)) - x -= x + pw->client->w - (zx + zw); + if ((ec->w < zw) && (x + ec->w > zx + zw)) + x -= x + ec->w - (zx + zw); } else x = 0; if (dy < y) { y -= dy; - if ((pw->client->h < zh) && - (y + pw->client->h > zy + zh)) - y -= y + pw->client->h - (zy + zh); + if ((ec->h < zh) && (y + ec->h > zy + zh)) + y -= y + ec->h - (zy + zh); } else y = 0; - evas_object_move(pw->client->frame, x, y); + evas_object_move(ec->frame, x, y); - if (!(pw->client->lock_user_stacking)) - evas_object_raise(pw->client->frame); - evas_object_focus_set(pw->client->frame, 1); + if (!(ec->lock_user_stacking)) evas_object_raise(ec->frame); + evas_object_focus_set(ec->frame, 1); } edje_object_signal_emit(pw->desk->o_desk, "e,action,drag,out", "e"); if (!pw->drag.from_pager) @@ -2231,6 +2230,9 @@ _pager_update_drop_position(Pager *p, Pager_Desk *pd, Evas_Coord x, Evas_Coord y if (pd) { int zx, zy, zw, zh, vx, vy; + E_Client *ec = pw->client; + E_Desk *old_desk = ec->desk; + Eina_Bool was_focused = e_client_stack_focused_get(ec); pw->drag.in_pager = 1; //makes drags look weird @@ -2240,11 +2242,16 @@ _pager_update_drop_position(Pager *p, Pager_Desk *pd, Evas_Coord x, Evas_Coord y e_deskmirror_coord_canvas_to_virtual(pd->o_layout, x + pw->drag.dx, y + pw->drag.dy, &vx, &vy); - pw->client->hidden = !pd->desk->visible; - e_client_desk_set(pw->client, pd->desk); - x = E_CLAMP(vx + zx, zx, zx + zw - pw->client->w); - y = E_CLAMP(vy + zy, zy, zy + zh - pw->client->h); - evas_object_move(pw->client->frame, x, y); + ec->hidden = !pd->desk->visible; + e_client_desk_set(ec, pd->desk); + x = E_CLAMP(vx + zx, zx, zx + zw - ec->w); + y = E_CLAMP(vy + zy, zy, zy + zh - ec->h); + evas_object_move(ec->frame, x, y); + if (was_focused) + { + E_Client *ec_focus = e_desk_last_focused_focus(old_desk); + if (ec_focus) e_client_focus_set_with_pointer(ec_focus); + } } else { @@ -2354,6 +2361,8 @@ _pager_drop_cb_drop(void *data, const char *type, void *event_info) E_Maximize max = ec->maximized; E_Fullscreen fs = ec->fullscreen_policy; Eina_Bool fullscreen = ec->fullscreen; + E_Desk *old_desk = ec->desk; + Eina_Bool was_focused = e_client_stack_focused_get(ec); if (ec->iconic) e_client_uniconify(ec); if (ec->maximized) @@ -2361,6 +2370,11 @@ _pager_drop_cb_drop(void *data, const char *type, void *event_info) if (fullscreen) e_client_unfullscreen(ec); ec->hidden = 0; e_client_desk_set(ec, pd->desk); + if (was_focused) + { + E_Client *ec_focus = e_desk_last_focused_focus(old_desk); + if (ec_focus) e_client_focus_set_with_pointer(ec_focus); + } evas_object_raise(ec->frame); if ((!max) && (!fullscreen)) diff --git a/src/modules/pager_plain/e_mod_main.c b/src/modules/pager_plain/e_mod_main.c index ed0ea4eb7..064d91448 100644 --- a/src/modules/pager_plain/e_mod_main.c +++ b/src/modules/pager_plain/e_mod_main.c @@ -1889,6 +1889,7 @@ _pager_window_cb_mouse_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EI if (pd) { int zx, zy, zw, zh; + E_Client *ec = pw->client; e_zone_useful_geometry_get(pd->desk->zone, &zx, &zy, &zw, &zh); e_layout_coord_canvas_to_virtual(pd->o_layout, @@ -1896,15 +1897,23 @@ _pager_window_cb_mouse_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EI my + pw->drag.dy, &vx, &vy); if (pd != pw->desk) { + E_Desk *old_desk = ec->desk; + Eina_Bool was_focused = e_client_stack_focused_get(ec); + edje_object_signal_emit(pw->desk->o_desk, "e,action,drag,out", "e"); - pw->client->hidden = 0; - e_client_desk_set(pw->client, pd->desk); + ec->hidden = 0; + e_client_desk_set(ec, pd->desk); + if (was_focused) + { + E_Client *ec_focus = e_desk_last_focused_focus(old_desk); + if (ec_focus) e_client_focus_set_with_pointer(ec_focus); + } edje_object_signal_emit(pd->o_desk, "e,action,drag,in", "e"); pd->pager->active_drop_pd = pd; } - mx = E_CLAMP(vx + zx, zx, zx + zw - pw->client->w); - my = E_CLAMP(vy + zy, zy, zy + zh - pw->client->h); - evas_object_move(pw->client->frame, mx, my); + mx = E_CLAMP(vx + zx, zx, zx + zw - ec->w); + my = E_CLAMP(vy + zy, zy, zy + zh - ec->h); + evas_object_move(ec->frame, mx, my); } else { @@ -1966,24 +1975,25 @@ _pager_window_cb_drag_finished(E_Drag *drag, int dropped) if (!dropped) { int zx, zy, zw, zh; + E_Client *ec = pw->client; /* wasn't dropped (on pager). move it to position of mouse on screen */ zone = e_zone_current_get(); desk = e_desk_current_get(zone); - e_client_zone_set(pw->client, zone); - if ((pw->client->desk != desk) && desk->visible) + e_client_zone_set(ec, zone); + if ((ec->desk != desk) && desk->visible) { - pw->client->hidden = 0; - e_client_desk_set(pw->client, desk); + ec->hidden = 0; + e_client_desk_set(ec, desk); } #ifndef HAVE_WAYLAND_ONLY ecore_x_pointer_last_xy_get(&x, &y); #endif - dx = (pw->client->w / 2); - dy = (pw->client->h / 2); + dx = (ec->w / 2); + dy = (ec->h / 2); e_zone_useful_geometry_get(zone, &zx, &zy, &zw, &zh); @@ -1991,24 +2001,21 @@ _pager_window_cb_drag_finished(E_Drag *drag, int dropped) if (dx < x) { x -= dx; - if ((pw->client->w < zw) && - (x + pw->client->w > zx + zw)) - x -= x + pw->client->w - (zx + zw); + if ((ec->w < zw) && (x + ec->w > zx + zw)) + x -= x + ec->w - (zx + zw); } else x = 0; if (dy < y) { y -= dy; - if ((pw->client->h < zh) && - (y + pw->client->h > zy + zh)) - y -= y + pw->client->h - (zy + zh); + if ((ec->h < zh) && (y + ec->h > zy + zh)) + y -= y + ec->h - (zy + zh); } else y = 0; - evas_object_move(pw->client->frame, x, y); + evas_object_move(ec->frame, x, y); - if (!(pw->client->lock_user_stacking)) - evas_object_raise(pw->client->frame); + if (!(ec->lock_user_stacking)) evas_object_raise(ec->frame); } if (pw->desk->pager->active_drop_pd) { @@ -2156,6 +2163,8 @@ _pager_drop_cb_drop(void *data, const char *type, void *event_info) E_Maximize max = ec->maximized; E_Fullscreen fs = ec->fullscreen_policy; Eina_Bool fullscreen = ec->fullscreen; + E_Desk *old_desk = ec->desk; + Eina_Bool was_focused = e_client_stack_focused_get(ec); if (ec->iconic) e_client_uniconify(ec); if (ec->maximized) @@ -2164,6 +2173,11 @@ _pager_drop_cb_drop(void *data, const char *type, void *event_info) if (pd->desk->visible) ec->hidden = 0; e_client_desk_set(ec, pd->desk); + if (was_focused) + { + E_Client *ec_focus = e_desk_last_focused_focus(old_desk); + if (ec_focus) e_client_focus_set_with_pointer(ec_focus); + } evas_object_raise(ec->frame); if ((!max) && (!fullscreen))