[E_CLIENT_HOOK_RESIZE_UPDATE] = NULL,
[E_CLIENT_HOOK_RESIZE_END] = NULL,
[E_CLIENT_HOOK_FULLSCREEN_PRE] = NULL,
+ [E_CLIENT_HOOK_FULLSCREEN] = NULL,
[E_CLIENT_HOOK_DEL] = NULL,
[E_CLIENT_HOOK_UNREDIRECT] = NULL,
[E_CLIENT_HOOK_REDIRECT] = NULL,
EINTERN void
e_client_fullscreen(E_Client *ec, E_Fullscreen policy)
{
- int x, y, w, h;
- E_Zone *zone;
-
E_OBJECT_CHECK(ec);
E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
- zone = e_comp_zone_find_by_ec(ec);
- if (!zone) return;
-
if ((ec->shaded) || (ec->shading) || (ec->fullscreen)) return;
+ // call the fullscreen_pre hook of a client
_e_client_hook_call(E_CLIENT_HOOK_FULLSCREEN_PRE, ec);
- if (ec->skip_fullscreen) return;
- if (!ec->desk->visible) return;
- if (ec->new_client)
- {
- ec->need_fullscreen = 1;
- return;
- }
- if (e_comp->nocomp_ec && (ec->desk == e_comp->nocomp_ec->desk))
- e_comp->nocomp_ec = ec;
- ec->desk->fullscreen_clients = eina_list_append(ec->desk->fullscreen_clients, ec);
- ec->pre_res_change.valid = 0;
-
- if (ec->maximized)
- {
- x = ec->saved.x;
- y = ec->saved.y;
- w = ec->saved.w;
- h = ec->saved.h;
- }
- else
- {
- ec->saved.x = ec->client.x - zone->x;
- ec->saved.y = ec->client.y - zone->y;
- ec->saved.w = ec->client.w;
- ec->saved.h = ec->client.h;
- }
- ec->saved.maximized = ec->maximized;
- ec->saved.zone = zone->num;
-
- if (ec->maximized)
- {
- e_client_unmaximize(ec, E_MAXIMIZE_BOTH);
- ec->saved.x = x;
- ec->saved.y = y;
- ec->saved.w = w;
- ec->saved.h = h;
- }
-
- ec->saved.layer = ec->layer;
- e_client_layer_set(ec, E_LAYER_CLIENT_FULLSCREEN);
+ ec->fullscreen_policy = policy;
- ec->fullscreen = 1;
- if ((eina_list_count(e_comp->zones) > 1) ||
- (policy == E_FULLSCREEN_RESIZE))
- {
- e_client_frame_geometry_set(ec, zone->x, zone->y, zone->w, zone->h);
- }
- else if (policy == E_FULLSCREEN_ZOOM)
- {
- /* compositor backends! */
- evas_object_smart_callback_call(ec->frame, "fullscreen_zoom", NULL);
- }
+ // call the fullscreen hook of a client
+ _e_client_hook_call(E_CLIENT_HOOK_FULLSCREEN, ec);
- if (!e_client_util_ignored_get(ec))
- e_client_frame_update(ec);
- ec->fullscreen_policy = policy;
evas_object_smart_callback_call(ec->frame, "fullscreen", NULL);
_e_client_event_simple(ec, E_EVENT_CLIENT_FULLSCREEN);
E_CLIENT_HOOK_RESIZE_UPDATE,
E_CLIENT_HOOK_RESIZE_END,
E_CLIENT_HOOK_FULLSCREEN_PRE,
+ E_CLIENT_HOOK_FULLSCREEN,
E_CLIENT_HOOK_DEL,
E_CLIENT_HOOK_UNREDIRECT,
E_CLIENT_HOOK_REDIRECT,
}
}
+static void
+_e_zone_cb_hook_client_fullscreen(void *d, E_Client *ec)
+{
+ E_Zone *zone;
+ E_Desk *desk, *nocomp_ec_desk;
+ int x, y, w, h;
+
+ EINA_SAFETY_ON_NULL_RETURN(ec);
+
+ zone = (E_Zone *)d;
+ EINA_SAFETY_ON_NULL_RETURN(zone);
+
+ // FIXME: A ec is set the current zone now.
+ // We need to make a policy for the placement of the ec at the zone.
+ if (zone != e_zone_current_get()) return;
+
+ desk = e_zone_desk_find_by_ec(zone, ec);
+ EINA_SAFETY_ON_NULL_RETURN(desk);
+
+ if (ec->skip_fullscreen) return;
+
+ if (!desk->visible) return;
+
+ if (ec->new_client)
+ {
+ ec->need_fullscreen = 1;
+ return;
+ }
+
+ nocomp_ec_desk = e_zone_desk_find_by_ec(zone, e_comp->nocomp_ec);
+ if (e_comp->nocomp_ec && (desk == nocomp_ec_desk))
+ e_comp->nocomp_ec = ec;
+ desk->fullscreen_clients = eina_list_append(desk->fullscreen_clients, ec);
+ ec->pre_res_change.valid = 0;
+
+ if (ec->maximized)
+ {
+ x = ec->saved.x;
+ y = ec->saved.y;
+ w = ec->saved.w;
+ h = ec->saved.h;
+ }
+ else
+ {
+ ec->saved.x = ec->client.x - zone->x;
+ ec->saved.y = ec->client.y - zone->y;
+ ec->saved.w = ec->client.w;
+ ec->saved.h = ec->client.h;
+ }
+ ec->saved.maximized = ec->maximized;
+ ec->saved.zone = zone->num;
+
+ if (ec->maximized)
+ {
+ e_client_unmaximize(ec, E_MAXIMIZE_BOTH);
+ ec->saved.x = x;
+ ec->saved.y = y;
+ ec->saved.w = w;
+ ec->saved.h = h;
+ }
+
+ ec->saved.layer = ec->layer;
+ e_client_layer_set(ec, E_LAYER_CLIENT_FULLSCREEN);
+
+ ec->fullscreen = 1;
+ if ((eina_list_count(e_comp->zones) > 1) ||
+ (ec->fullscreen_policy == E_FULLSCREEN_RESIZE))
+ {
+ e_client_frame_geometry_set(ec, zone->x, zone->y, zone->w, zone->h);
+ }
+ else if (ec->fullscreen_policy == E_FULLSCREEN_ZOOM)
+ {
+ /* compositor backends! */
+ evas_object_smart_callback_call(ec->frame, "fullscreen_zoom", NULL);
+ }
+
+ if (!e_client_util_ignored_get(ec))
+ e_client_frame_update(ec);
+
+ evas_object_smart_callback_call(ec->frame, "fullscreen", NULL);
+}
+
static void
_e_zone_client_data_set(E_Zone *zone, E_Client *ec)
{
E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_MAXIMIZE, _e_zone_cb_hook_client_maximize, zone);
E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_UNMAXIMIZE, _e_zone_cb_hook_client_unmaximize, zone);
E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_ACTIVATE_DONE, _e_zone_cb_hook_client_activate_done, zone);
+ E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_FULLSCREEN, _e_zone_cb_hook_client_fullscreen, zone);
if (starting) return zone;