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

View File

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

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

View File

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

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

View File

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

View File

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

View File

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