e client focus - fix focus if moving focused window to new desk - long

fix client focus the very very very long way vs
418319fc94
This commit is contained in:
Carsten Haitzler 2017-09-01 19:29:03 +09:00
parent 42d3e30f5c
commit 9ae24a3a4a
8 changed files with 157 additions and 74 deletions

View File

@ -1283,16 +1283,16 @@ ACT_FN_GO(window_zone_move_by, )
move = 0; move = 0;
zone = e_comp_zone_number_get(move); zone = e_comp_zone_number_get(move);
if (!zone) return; if (!zone) return;
if (ec->zone == zone) return;
max = ec->maximized; max = ec->maximized;
fs = ec->fullscreen_policy; fs = ec->fullscreen_policy;
fullscreen = ec->fullscreen; fullscreen = ec->fullscreen;
if (ec->maximized) e_client_unmaximize(ec, E_MAXIMIZE_BOTH); if (ec->maximized) e_client_unmaximize(ec, E_MAXIMIZE_BOTH);
if (fullscreen) e_client_unfullscreen(ec); if (fullscreen) e_client_unfullscreen(ec);
e_client_zone_set(ec, zone); e_client_zone_set(ec, zone);
// e_client_desk_set(ec, e_desk_current_get(zone));
if (max) e_client_maximize(ec, max); if (max) e_client_maximize(ec, max);
if (fullscreen) e_client_fullscreen(ec, fs); 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) if (sscanf(params, "%d %d", &x, &y) == 2)
{ {
E_Desk *desk; 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); 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);
}
}
} }
} }

View File

@ -2805,7 +2805,6 @@ e_client_desk_set(E_Client *ec, E_Desk *desk)
{ {
E_Event_Client_Desk_Set *ev; E_Event_Client_Desk_Set *ev;
E_Desk *old_desk; E_Desk *old_desk;
Eina_Bool was_focused = ec->focused;
E_OBJECT_CHECK(ec); E_OBJECT_CHECK(ec);
E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE); 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); e_client_res_change_geometry_restore(ec);
ec->pre_res_change.valid = 0; 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) if (ec->stack.prev || ec->stack.next)

View File

@ -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)) 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); 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); 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]); char *p = ecore_x_atom_name_get(ev->data.l[1]);
if (!e_util_strcmp(ec->e.state.profile.wait, p)) 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); eina_stringshare_replace(&ec->e.state.profile.wait, NULL);
ec->e.state.profile.wait_for_done = 0; ec->e.state.profile.wait_for_done = 0;
E_Desk *desk = ec->e.state.profile.wait_desk; if ((desk) && (desk != old_desk))
if ((desk) && (desk != ec->desk))
{ {
eina_stringshare_replace(&ec->e.state.profile.name, eina_stringshare_replace(&ec->e.state.profile.name,
desk->window_profile); desk->window_profile);
e_client_desk_set(ec, 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);
}
} }
e_client_desk_window_profile_wait_desk_set(ec, NULL); e_client_desk_window_profile_wait_desk_set(ec, NULL);
} }

View File

@ -1318,10 +1318,18 @@ _e_client_menu_cb_sendto(void *data, E_Menu *m, E_Menu_Item *mi EINA_UNUSED)
desk = data; desk = data;
ec = e_object_data_get(E_OBJECT(m)); 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; ec->hidden = 0;
e_client_desk_set(ec, 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);
}
} }
} }

View File

@ -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) 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); 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);
}
}
} }
} }
} }

View File

@ -1240,11 +1240,13 @@ _pager_window_cb_drag_finished(E_Drag *drag, int dropped)
else else
{ {
int dx, dy, x, y, zx, zy, zw, zh; int dx, dy, x, y, zx, zy, zw, zh;
pw->client->hidden = !p->active_pd->desk->visible; E_Client *ec = pw->client;
e_client_desk_set(pw->client, p->active_pd->desk);
dx = (pw->client->w / 2); ec->hidden = !p->active_pd->desk->visible;
dy = (pw->client->h / 2); 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); 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); 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) if (dx < x)
{ {
x -= dx; x -= dx;
if ((pw->client->w < zw) && if ((ec->w < zw) && (x + ec->w > zx + zw))
(x + pw->client->w > zx + zw)) x -= x + ec->w - (zx + zw);
x -= x + pw->client->w - (zx + zw);
} }
else x = 0; else x = 0;
if (dy < y) if (dy < y)
{ {
y -= dy; y -= dy;
if ((pw->client->h < zh) && if ((ec->h < zh) && (y + ec->h > zy + zh))
(y + pw->client->h > zy + zh)) y -= y + ec->h - (zy + zh);
y -= y + pw->client->h - (zy + zh);
} }
else y = 0; else y = 0;
evas_object_move(pw->client->frame, x, y); evas_object_move(ec->frame, x, y);
if (!(ec->lock_user_stacking)) evas_object_raise(ec->frame);
if (!(pw->client->lock_user_stacking)) evas_object_focus_set(ec->frame, 1);
evas_object_raise(pw->client->frame);
evas_object_focus_set(pw->client->frame, 1);
} }
if (p->active_drop_pd) if (p->active_drop_pd)
{ {
@ -1338,6 +1336,9 @@ _pager_update_drop_position(Pager *p, Evas_Coord x, Evas_Coord y)
if (pd) if (pd)
{ {
int zx, zy, zw, zh, vx, vy; 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; pw->drag.in_pager = 1;
//makes drags look weird //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, e_deskmirror_coord_canvas_to_virtual(pd->o_layout,
x + pw->drag.dx, x + pw->drag.dx,
y + pw->drag.dy, &vx, &vy); y + pw->drag.dy, &vx, &vy);
pw->client->hidden = !pd->desk->visible; ec->hidden = !pd->desk->visible;
e_client_desk_set(pw->client, pd->desk); e_client_desk_set(ec, pd->desk);
x = E_CLAMP(vx + zx, zx, zx + zw - pw->client->w); x = E_CLAMP(vx + zx, zx, zx + zw - ec->w);
y = E_CLAMP(vy + zy, zy, zy + zh - pw->client->h); y = E_CLAMP(vy + zy, zy, zy + zh - ec->h);
evas_object_move(pw->client->frame, x, y); 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 else
{ {
@ -1465,6 +1471,8 @@ _pager_drop_cb_drop(void *data, const char *type, void *event_info)
E_Maximize max = ec->maximized; E_Maximize max = ec->maximized;
E_Fullscreen fs = ec->fullscreen_policy; E_Fullscreen fs = ec->fullscreen_policy;
Eina_Bool fullscreen = ec->fullscreen; 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->iconic) e_client_uniconify(ec);
if (ec->maximized) 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); if (fullscreen) e_client_unfullscreen(ec);
ec->hidden = 0; ec->hidden = 0;
e_client_desk_set(ec, pd->desk); 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); evas_object_raise(ec->frame);
if ((!max) && (!fullscreen)) if ((!max) && (!fullscreen))
{ {
int zx, zy, zw, zh, mx, my; int zx, zy, zw, zh, mx, my;

View File

@ -2158,11 +2158,13 @@ _pager_window_cb_drag_finished(E_Drag *drag, int dropped)
else else
{ {
int dx, dy, x, y, zx, zy, zw, zh; int dx, dy, x, y, zx, zy, zw, zh;
pw->client->hidden = !p->active_pd->desk->visible; E_Client *ec = pw->client;
e_client_desk_set(pw->client, p->active_pd->desk);
dx = (pw->client->w / 2); ec->hidden = !p->active_pd->desk->visible;
dy = (pw->client->h / 2); 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); 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); 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) if (dx < x)
{ {
x -= dx; x -= dx;
if ((pw->client->w < zw) && if ((ec->w < zw) && (x + ec->w > zx + zw))
(x + pw->client->w > zx + zw)) x -= x + ec->w - (zx + zw);
x -= x + pw->client->w - (zx + zw);
} }
else x = 0; else x = 0;
if (dy < y) if (dy < y)
{ {
y -= dy; y -= dy;
if ((pw->client->h < zh) && if ((ec->h < zh) && (y + ec->h > zy + zh))
(y + pw->client->h > zy + zh)) y -= y + ec->h - (zy + zh);
y -= y + pw->client->h - (zy + zh);
} }
else y = 0; else y = 0;
evas_object_move(pw->client->frame, x, y); evas_object_move(ec->frame, x, y);
if (!(pw->client->lock_user_stacking)) if (!(ec->lock_user_stacking)) evas_object_raise(ec->frame);
evas_object_raise(pw->client->frame); evas_object_focus_set(ec->frame, 1);
evas_object_focus_set(pw->client->frame, 1);
} }
edje_object_signal_emit(pw->desk->o_desk, "e,action,drag,out", "e"); edje_object_signal_emit(pw->desk->o_desk, "e,action,drag,out", "e");
if (!pw->drag.from_pager) 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) if (pd)
{ {
int zx, zy, zw, zh, vx, vy; 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; pw->drag.in_pager = 1;
//makes drags look weird //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, e_deskmirror_coord_canvas_to_virtual(pd->o_layout,
x + pw->drag.dx, x + pw->drag.dx,
y + pw->drag.dy, &vx, &vy); y + pw->drag.dy, &vx, &vy);
pw->client->hidden = !pd->desk->visible; ec->hidden = !pd->desk->visible;
e_client_desk_set(pw->client, pd->desk); e_client_desk_set(ec, pd->desk);
x = E_CLAMP(vx + zx, zx, zx + zw - pw->client->w); x = E_CLAMP(vx + zx, zx, zx + zw - ec->w);
y = E_CLAMP(vy + zy, zy, zy + zh - pw->client->h); y = E_CLAMP(vy + zy, zy, zy + zh - ec->h);
evas_object_move(pw->client->frame, x, y); 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 else
{ {
@ -2354,6 +2361,8 @@ _pager_drop_cb_drop(void *data, const char *type, void *event_info)
E_Maximize max = ec->maximized; E_Maximize max = ec->maximized;
E_Fullscreen fs = ec->fullscreen_policy; E_Fullscreen fs = ec->fullscreen_policy;
Eina_Bool fullscreen = ec->fullscreen; 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->iconic) e_client_uniconify(ec);
if (ec->maximized) 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); if (fullscreen) e_client_unfullscreen(ec);
ec->hidden = 0; ec->hidden = 0;
e_client_desk_set(ec, pd->desk); 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); evas_object_raise(ec->frame);
if ((!max) && (!fullscreen)) if ((!max) && (!fullscreen))

View File

@ -1889,6 +1889,7 @@ _pager_window_cb_mouse_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EI
if (pd) if (pd)
{ {
int zx, zy, zw, zh; int zx, zy, zw, zh;
E_Client *ec = pw->client;
e_zone_useful_geometry_get(pd->desk->zone, &zx, &zy, &zw, &zh); e_zone_useful_geometry_get(pd->desk->zone, &zx, &zy, &zw, &zh);
e_layout_coord_canvas_to_virtual(pd->o_layout, 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); my + pw->drag.dy, &vx, &vy);
if (pd != pw->desk) 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"); edje_object_signal_emit(pw->desk->o_desk, "e,action,drag,out", "e");
pw->client->hidden = 0; ec->hidden = 0;
e_client_desk_set(pw->client, pd->desk); 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"); edje_object_signal_emit(pd->o_desk, "e,action,drag,in", "e");
pd->pager->active_drop_pd = pd; pd->pager->active_drop_pd = pd;
} }
mx = E_CLAMP(vx + zx, zx, zx + zw - pw->client->w); mx = E_CLAMP(vx + zx, zx, zx + zw - ec->w);
my = E_CLAMP(vy + zy, zy, zy + zh - pw->client->h); my = E_CLAMP(vy + zy, zy, zy + zh - ec->h);
evas_object_move(pw->client->frame, mx, my); evas_object_move(ec->frame, mx, my);
} }
else else
{ {
@ -1966,24 +1975,25 @@ _pager_window_cb_drag_finished(E_Drag *drag, int dropped)
if (!dropped) if (!dropped)
{ {
int zx, zy, zw, zh; int zx, zy, zw, zh;
E_Client *ec = pw->client;
/* wasn't dropped (on pager). move it to position of mouse on screen */ /* wasn't dropped (on pager). move it to position of mouse on screen */
zone = e_zone_current_get(); zone = e_zone_current_get();
desk = e_desk_current_get(zone); desk = e_desk_current_get(zone);
e_client_zone_set(pw->client, zone); e_client_zone_set(ec, zone);
if ((pw->client->desk != desk) && desk->visible) if ((ec->desk != desk) && desk->visible)
{ {
pw->client->hidden = 0; ec->hidden = 0;
e_client_desk_set(pw->client, desk); e_client_desk_set(ec, desk);
} }
#ifndef HAVE_WAYLAND_ONLY #ifndef HAVE_WAYLAND_ONLY
ecore_x_pointer_last_xy_get(&x, &y); ecore_x_pointer_last_xy_get(&x, &y);
#endif #endif
dx = (pw->client->w / 2); dx = (ec->w / 2);
dy = (pw->client->h / 2); dy = (ec->h / 2);
e_zone_useful_geometry_get(zone, &zx, &zy, &zw, &zh); 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) if (dx < x)
{ {
x -= dx; x -= dx;
if ((pw->client->w < zw) && if ((ec->w < zw) && (x + ec->w > zx + zw))
(x + pw->client->w > zx + zw)) x -= x + ec->w - (zx + zw);
x -= x + pw->client->w - (zx + zw);
} }
else x = 0; else x = 0;
if (dy < y) if (dy < y)
{ {
y -= dy; y -= dy;
if ((pw->client->h < zh) && if ((ec->h < zh) && (y + ec->h > zy + zh))
(y + pw->client->h > zy + zh)) y -= y + ec->h - (zy + zh);
y -= y + pw->client->h - (zy + zh);
} }
else y = 0; else y = 0;
evas_object_move(pw->client->frame, x, y); evas_object_move(ec->frame, x, y);
if (!(pw->client->lock_user_stacking)) if (!(ec->lock_user_stacking)) evas_object_raise(ec->frame);
evas_object_raise(pw->client->frame);
} }
if (pw->desk->pager->active_drop_pd) 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_Maximize max = ec->maximized;
E_Fullscreen fs = ec->fullscreen_policy; E_Fullscreen fs = ec->fullscreen_policy;
Eina_Bool fullscreen = ec->fullscreen; 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->iconic) e_client_uniconify(ec);
if (ec->maximized) if (ec->maximized)
@ -2164,6 +2173,11 @@ _pager_drop_cb_drop(void *data, const char *type, void *event_info)
if (pd->desk->visible) if (pd->desk->visible)
ec->hidden = 0; ec->hidden = 0;
e_client_desk_set(ec, pd->desk); 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); evas_object_raise(ec->frame);
if ((!max) && (!fullscreen)) if ((!max) && (!fullscreen))