e clients - make sure we handle client with a NULL zone

This commit is contained in:
Carsten Haitzler 2015-03-11 18:34:38 +09:00
parent d93bb6c899
commit 03f05d16e5
2 changed files with 44 additions and 11 deletions

View File

@ -401,6 +401,7 @@ _e_client_revert_focus(E_Client *ec)
if (stopping) return;
if (!ec->focused) return;
if (!ec->zone) return;
desk = e_desk_current_get(ec->zone);
if (ec->desk == desk)
evas_object_focus_set(ec->frame, 0);
@ -963,8 +964,11 @@ _e_client_resize_handle(E_Client *ec)
h = new_h;
if (e_config->screen_limits == E_CLIENT_OFFSCREEN_LIMIT_ALLOW_NONE)
{
w = MIN(w, ec->zone->w);
h = MIN(h, ec->zone->h);
if (ec->zone)
{
w = MIN(w, ec->zone->w);
h = MIN(h, ec->zone->h);
}
}
e_client_resize_limit(ec, &new_w, &new_h);
if ((ec->resize_mode == E_POINTER_RESIZE_TL) ||
@ -1066,8 +1070,11 @@ _e_client_resize_key_down(void *data EINA_UNUSED, int type EINA_UNUSED, void *ev
goto stop;
if (e_config->screen_limits == E_CLIENT_OFFSCREEN_LIMIT_ALLOW_NONE)
{
w = MIN(w, action_client->zone->w);
h = MIN(h, action_client->zone->h);
if (action_client->zone)
{
w = MIN(w, action_client->zone->w);
h = MIN(h, action_client->zone->h);
}
}
e_client_resize_limit(action_client, &w, &h);
evas_object_resize(action_client->frame, w, h);
@ -1125,6 +1132,7 @@ _e_client_zones_layout_calc(E_Client *ec, int *zx, int *zy, int *zw, int *zh)
int x, y, w, h;
E_Zone *zone_above, *zone_below, *zone_left, *zone_right;
if (!ec->zone) return;
x = ec->zone->x;
y = ec->zone->y;
w = ec->zone->w;
@ -1503,6 +1511,7 @@ _e_client_maximize(E_Client *ec, E_Maximize max)
int ecx, ecy, ecw, ech;
Eina_Bool override = ec->maximize_override;
if (!ec->zone) return;
zx = zy = zw = zh = 0;
ec->maximize_override = 1;
@ -1686,7 +1695,7 @@ _e_client_eval(E_Client *ec)
if (!_e_client_hook_call(E_CLIENT_HOOK_EVAL_PRE_NEW_CLIENT, ec)) return;
if (ec->new_client && (!e_client_util_ignored_get(ec)))
if ((ec->new_client) && (!e_client_util_ignored_get(ec)) && (ec->zone))
{
int zx = 0, zy = 0, zw = 0, zh = 0;
@ -2880,7 +2889,7 @@ e_client_mouse_move(E_Client *ec, Evas_Point *output)
ec->shelf_fix.y = 0;
ec->shelf_fix.modified = 0;
evas_object_move(ec->frame, new_x, new_y);
e_zone_flip_coords_handle(ec->zone, output->x, output->y);
if (ec->zone) e_zone_flip_coords_handle(ec->zone, output->x, output->y);
}
else if (e_client_util_resizing_get(ec))
{
@ -2894,7 +2903,7 @@ e_client_mouse_move(E_Client *ec, Evas_Point *output)
ec->drag.x = output->x;
ec->drag.y = output->y;
}
else
else if (ec->zone)
{
int dx, dy;
@ -2975,6 +2984,7 @@ e_client_res_change_geometry_restore(E_Client *ec)
E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
if (!ec->pre_res_change.valid) return;
if (ec->new_client) return;
if (!ec->zone) return;
memcpy(&pre_res_change, &ec->pre_res_change, sizeof(pre_res_change));
@ -3376,7 +3386,7 @@ e_client_focused_set(E_Client *ec)
if (ec == focused) return;
focused = ec;
if (ec)
if ((ec) && (ec->zone))
{
ec->focused = 1;
e_client_urgent_set(ec, 0);
@ -3403,7 +3413,7 @@ e_client_focused_set(E_Client *ec)
}
}
while (ec_unfocus)
while ((ec_unfocus) && (ec_unfocus->zone))
{
ec_unfocus->want_focus = ec_unfocus->focused = 0;
if (!e_object_is_del(E_OBJECT(ec_unfocus)))
@ -3533,6 +3543,7 @@ e_client_lost_windows_get(E_Zone *zone)
EINA_LIST_FOREACH(e_comp->clients, l, ec)
{
if (ec->zone != zone) continue;
if (!ec->zone) continue;
if (!E_INTERSECTS(ec->zone->x + loss_overlap,
ec->zone->y + loss_overlap,
@ -3610,6 +3621,7 @@ e_client_maximize(E_Client *ec, E_Maximize max)
E_OBJECT_CHECK(ec);
E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
if (!ec->zone) return;
if (!(max & E_MAXIMIZE_DIRECTION)) max |= E_MAXIMIZE_BOTH;
if ((ec->shaded) || (ec->shading)) return;
@ -3670,6 +3682,7 @@ e_client_unmaximize(E_Client *ec, E_Maximize max)
{
E_OBJECT_CHECK(ec);
E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
if (!ec->zone) return;
if (!(max & E_MAXIMIZE_DIRECTION))
{
CRI("BUG: Unmaximize call without direction!");
@ -3781,6 +3794,7 @@ e_client_fullscreen(E_Client *ec, E_Fullscreen policy)
E_OBJECT_CHECK(ec);
E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
if (!ec->zone) return;
if ((ec->shaded) || (ec->shading) || ec->fullscreen) return;
if (ec->new_client)
@ -3858,6 +3872,7 @@ e_client_unfullscreen(E_Client *ec)
{
E_OBJECT_CHECK(ec);
E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
if (!ec->zone) return;
if ((ec->shaded) || (ec->shading)) return;
if (!ec->fullscreen) return;
ec->pre_res_change.valid = 0;
@ -3898,6 +3913,7 @@ e_client_iconify(E_Client *ec)
{
E_OBJECT_CHECK(ec);
E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
if (!ec->zone) return;
if (ec->shading || ec->iconic) return;
ec->iconic = 1;
ec->want_focus = ec->take_focus = 0;
@ -3933,6 +3949,7 @@ e_client_uniconify(E_Client *ec)
E_OBJECT_CHECK(ec);
E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
if (!ec->zone) return;
if (ec->shading || (!ec->iconic)) return;
desk = e_desk_current_get(ec->desk->zone);
e_client_desk_set(ec, desk);
@ -3962,6 +3979,7 @@ e_client_urgent_set(E_Client *ec, Eina_Bool urgent)
{
E_OBJECT_CHECK(ec);
E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
if (!ec->zone) return;
urgent = !!urgent;
if (urgent == ec->urgent) return;
@ -3993,6 +4011,7 @@ e_client_stick(E_Client *ec)
E_OBJECT_CHECK(ec);
E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
if (!ec->zone) return;
if (ec->sticky) return;
desk = ec->desk;
ec->desk = NULL;
@ -4026,6 +4045,7 @@ e_client_unstick(E_Client *ec)
E_OBJECT_CHECK(ec);
E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
if (!ec->zone) return;
/* Set the desk before we unstick the client */
if (!ec->sticky) return;
desk = e_desk_current_get(ec->zone);
@ -4109,6 +4129,7 @@ e_client_comp_hidden_set(E_Client *ec, Eina_Bool hidden)
{
E_OBJECT_CHECK(ec);
E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
if (!ec->zone) return;
hidden = !!hidden;
if (ec->comp_hidden == hidden) return;
@ -4122,6 +4143,7 @@ EAPI void
e_client_act_move_keyboard(E_Client *ec)
{
EINA_SAFETY_ON_NULL_RETURN(ec);
if (!ec->zone) return;
if (!_e_client_move_begin(ec))
return;
@ -4141,6 +4163,7 @@ EAPI void
e_client_act_resize_keyboard(E_Client *ec)
{
EINA_SAFETY_ON_NULL_RETURN(ec);
if (!ec->zone) return;
ec->resize_mode = E_POINTER_RESIZE_TL;
if (!e_client_resize_begin(ec))
@ -4161,6 +4184,7 @@ e_client_act_move_begin(E_Client *ec, E_Binding_Event_Mouse_Button *ev)
{
E_OBJECT_CHECK(ec);
E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
if (!ec->zone) return;
if (e_client_util_resizing_get(ec) || (ec->moving)) return;
if (!_e_client_move_begin(ec))
return;
@ -4182,6 +4206,7 @@ e_client_act_move_end(E_Client *ec, E_Binding_Event_Mouse_Button *ev EINA_UNUSED
{
E_OBJECT_CHECK(ec);
E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
if (!ec->zone) return;
if (!ec->moving) return;
e_zone_edge_enable();
_e_client_move_end(ec);
@ -4194,6 +4219,7 @@ e_client_act_resize_begin(E_Client *ec, E_Binding_Event_Mouse_Button *ev)
{
E_OBJECT_CHECK(ec);
E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
if (!ec->zone) return;
if (ec->lock_user_size || ec->shaded || ec->shading) return;
if (e_client_util_resizing_get(ec) || (ec->moving)) return;
if (ev)
@ -4258,6 +4284,7 @@ e_client_act_resize_end(E_Client *ec, E_Binding_Event_Mouse_Button *ev EINA_UNUS
{
E_OBJECT_CHECK(ec);
E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
if (!ec->zone) return;
if (e_client_util_resizing_get(ec))
{
_e_client_resize_end(ec);
@ -4273,6 +4300,7 @@ e_client_act_menu_begin(E_Client *ec, E_Binding_Event_Mouse_Button *ev, int key)
{
E_OBJECT_CHECK(ec);
E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
if (!ec->zone) return;
if (ec->border_menu) return;
if (ev)
e_int_client_menu_show(ec, ev->canvas.x, ev->canvas.y, key, ev->timestamp);
@ -4290,6 +4318,7 @@ e_client_act_close_begin(E_Client *ec)
{
E_OBJECT_CHECK(ec);
E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
if (!ec->zone) return;
if (ec->lock_close) return;
if (ec->icccm.delete_request)
{
@ -4307,6 +4336,7 @@ e_client_act_kill_begin(E_Client *ec)
{
E_OBJECT_CHECK(ec);
E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
if (!ec->zone) return;
if (ec->internal) return;
if (ec->lock_close) return;
if ((ec->netwm.pid > 1) && (e_config->kill_process))
@ -4518,6 +4548,7 @@ e_client_signal_move_begin(E_Client *ec, const char *sig, const char *src EINA_U
{
E_OBJECT_CHECK(ec);
E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
if (!ec->zone) return;
if (e_client_util_resizing_get(ec) || (ec->moving)) return;
if (!_e_client_move_begin(ec)) return;
@ -4531,6 +4562,7 @@ e_client_signal_move_end(E_Client *ec, const char *sig EINA_UNUSED, const char *
{
E_OBJECT_CHECK(ec);
E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
if (!ec->zone) return;
if (!ec->moving) return;
_e_client_move_end(ec);
e_zone_edge_enable();
@ -4752,6 +4784,7 @@ e_client_pointer_warp_to_center(E_Client *ec)
int x, y;
E_Client *cec = NULL;
if (!ec->zone) return 0;
if (e_config->disable_all_pointer_warps) return 0;
/* Only warp the pointer if it is not already in the area of
* the given border */

View File

@ -1462,8 +1462,8 @@ _e_comp_intercept_focus(void *data, Evas_Object *obj, Eina_Bool focus)
}
/* FIXME: hack for deskflip animation:
* dont update focus when sliding previous desk */
if ((!ec->sticky) &&
(ec->desk != e_desk_current_get(ec->desk->zone)))
if ((!ec->sticky) && (ec->desk) &&
(ec->desk != e_desk_current_get(ec->desk->zone)))
{
return;
}