//#endif
[E_CLIENT_HOOK_STICK] = NULL,
[E_CLIENT_HOOK_UNSTICK] = NULL,
+ [E_CLIENT_HOOK_MAXIMIZE] = NULL,
};
static Eina_Inlist *_e_client_intercept_hooks[] =
////////////////////////////////////////////////
-static void
-_e_client_maximize(E_Client *ec, E_Maximize max)
-{
- int x1, yy1, x2, y2;
- int w, h, pw, ph;
- int zx, zy, zw, zh;
- int ecx, ecy, ecw, ech;
- int desk_x, desk_y, desk_w, desk_h;
- Eina_Bool override = ec->maximize_override;
- E_Zone *zone;
-
- zx = zy = zw = zh = 0;
- ec->maximize_override = 1;
-
- zone = e_comp_zone_find_by_ec(ec);
- if (!zone) return;
-
- if (ec->desk_area.enable && ec->desk_area.desk_area)
- {
- desk_x = ec->desk_area.desk_area->x;
- desk_y = ec->desk_area.desk_area->y;
- desk_w = ec->desk_area.desk_area->w;
- desk_h = ec->desk_area.desk_area->h;
- }
- else
- {
- desk_x = ec->desk->geom.x;
- desk_y = ec->desk->geom.y;
- desk_w = ec->desk->geom.w;
- desk_h = ec->desk->geom.h;
- }
-
- switch (max & E_MAXIMIZE_TYPE)
- {
- case E_MAXIMIZE_NONE:
- /* Ignore */
- break;
-
- case E_MAXIMIZE_FULLSCREEN:
- w = desk_w;
- h = desk_h;
-
- e_client_resize_limit(ec, &w, &h);
- /* center x-direction */
- x1 = desk_x + (desk_w - w) / 2;
- /* center y-direction */
- yy1 = desk_y + (desk_h - h) / 2;
-
- switch (max & E_MAXIMIZE_DIRECTION)
- {
- case E_MAXIMIZE_BOTH:
- e_client_maximized_geometry_set(ec, x1, yy1, w, h);
- break;
-
- case E_MAXIMIZE_VERTICAL:
- e_client_maximized_geometry_set(ec, ec->x, yy1, ec->w, h);
- break;
-
- case E_MAXIMIZE_HORIZONTAL:
- e_client_maximized_geometry_set(ec, x1, ec->y, w, ec->h);
- break;
-
- case E_MAXIMIZE_LEFT:
- e_client_maximized_geometry_set(ec, desk_x, desk_y, w / 2, h);
- break;
-
- case E_MAXIMIZE_RIGHT:
- e_client_maximized_geometry_set(ec, x1, desk_y, w / 2, h);
- break;
- }
- break;
-
- case E_MAXIMIZE_SMART:
- case E_MAXIMIZE_EXPAND:
- if (ec->desk->visible)
- {
- // base_output_resolution
- if (ec->base_output_resolution.use)
- {
- zx = desk_x;
- zy = desk_y;
- zw = ec->base_output_resolution.w;
- zh = ec->base_output_resolution.h;
- }
- else
- {
- e_zone_desk_useful_geometry_get(zone, ec->desk, &zx, &zy, &zw, &zh);
- }
- }
- else
- {
- x1 = desk_x;
- yy1 = desk_y;
- x2 = desk_x + desk_w;
- y2 = desk_y + desk_h;
- e_maximize_client_shelf_fill(ec, &x1, &yy1, &x2, &y2, max);
- zx = x1, zy = yy1;
- zw = x2 - x1;
- zh = y2 - yy1;
- }
- w = zw, h = zh;
-
- evas_object_smart_callback_call(ec->frame, "maximize", NULL);
- e_comp_object_frame_xy_unadjust(ec->frame, ec->x, ec->y, &ecx, &ecy);
- e_comp_object_frame_wh_unadjust(ec->frame, ec->w, ec->h, &ecw, &ech);
-
- if (ecw < zw)
- w = ecw;
-
- if (ech < zh)
- h = ech;
-
- if (ecx < zx) // window left not useful coordinates
- x1 = zx;
- else if (ecx + ecw > zx + zw) // window right not useful coordinates
- x1 = zx + zw - ecw;
- else // window normal position
- x1 = ecx;
-
- if (ecy < zy) // window top not useful coordinates
- yy1 = zy;
- else if (ecy + ech > zy + zh) // window bottom not useful coordinates
- yy1 = zy + zh - ech;
- else // window normal position
- yy1 = ecy;
-
- switch (max & E_MAXIMIZE_DIRECTION)
- {
- case E_MAXIMIZE_BOTH:
- e_client_maximized_geometry_set(ec, zx, zy, zw, zh);
- break;
-
- case E_MAXIMIZE_VERTICAL:
- e_client_maximized_geometry_set(ec, ec->x, zy, ec->w, zh);
- break;
-
- case E_MAXIMIZE_HORIZONTAL:
- e_client_maximized_geometry_set(ec, zx, ec->y, zw, ec->h);
- break;
-
- case E_MAXIMIZE_LEFT:
- e_client_maximized_geometry_set(ec, zx, zy, zw / 2, zh);
- break;
-
- case E_MAXIMIZE_RIGHT:
- e_client_maximized_geometry_set(ec, zx + zw / 2, zy, zw / 2, zh);
- break;
- }
-
- break;
-
- case E_MAXIMIZE_FILL:
- x1 = desk_x;
- yy1 = desk_y;
- x2 = desk_x + desk_w;
- y2 = desk_y + desk_h;
-
- /* walk through all shelves */
- e_maximize_client_shelf_fill(ec, &x1, &yy1, &x2, &y2, max);
-
- /* walk through all windows */
- e_maximize_client_client_fill(ec, &x1, &yy1, &x2, &y2, max);
-
- w = x2 - x1;
- h = y2 - yy1;
- pw = w;
- ph = h;
- e_client_resize_limit(ec, &w, &h);
- /* center x-direction */
- x1 = x1 + (pw - w) / 2;
- /* center y-direction */
- yy1 = yy1 + (ph - h) / 2;
-
- switch (max & E_MAXIMIZE_DIRECTION)
- {
- case E_MAXIMIZE_BOTH:
- e_client_maximized_geometry_set(ec, x1, yy1, w, h);
- break;
-
- case E_MAXIMIZE_VERTICAL:
- e_client_maximized_geometry_set(ec, ec->x, yy1, ec->w, h);
- break;
-
- case E_MAXIMIZE_HORIZONTAL:
- e_client_maximized_geometry_set(ec, x1, ec->y, w, ec->h);
- break;
-
- case E_MAXIMIZE_LEFT:
- e_client_maximized_geometry_set(ec, desk_x, desk_y, w / 2, h);
- break;
-
- case E_MAXIMIZE_RIGHT:
- e_client_maximized_geometry_set(ec, x1, desk_y, w / 2, h);
- break;
- }
- break;
- }
- if (ec->maximize_override)
- ec->maximize_override = override;
-}
-
////////////////////////////////////////////////
static void
_e_client_aux_hint_eval(E_Client *ec)
E_API void
e_client_maximize(E_Client *ec, E_Maximize max)
{
- int desk_x, desk_y;
- 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 (!(max & E_MAXIMIZE_DIRECTION)) max |= E_MAXIMIZE_BOTH;
if ((ec->shaded) || (ec->shading)) return;
return;
}
- if (ec->desk_area.enable && ec->desk_area.desk_area)
- {
- desk_x = ec->desk_area.desk_area->x;
- desk_y = ec->desk_area.desk_area->y;
- }
- else
- {
- desk_x = ec->desk->geom.x;
- desk_y = ec->desk->geom.y;
- }
+ // store the E_Maximize value requested
+ ec->requested_max = max;
- evas_object_smart_callback_call(ec->frame, "maximize_pre", NULL);
-
- if (ec->fullscreen)
- e_client_unfullscreen(ec);
- ec->pre_res_change.valid = 0;
- if (!(ec->maximized & E_MAXIMIZE_HORIZONTAL))
- {
- /* Horizontal hasn't been set */
- ec->saved.x = ec->client.x - desk_x;
- ec->saved.w = ec->client.w;
- }
- if (!(ec->maximized & E_MAXIMIZE_VERTICAL))
- {
- /* Vertical hasn't been set */
- ec->saved.y = ec->client.y - desk_y;
- ec->saved.h = ec->client.h;
- }
-
- ec->saved.zone = zone->num;
+ // call the maximize hook of a client
+ _e_client_hook_call(E_CLIENT_HOOK_MAXIMIZE, ec);
- _e_client_maximize(ec, max);
+ // clear the E_Maximize value requested
+ ec->requested_max = E_MAXIMIZE_NONE;
+ // store the E_Maximize value
ec->maximized = max;
ec->changes.need_unmaximize = 0;
//#endif
E_CLIENT_HOOK_STICK,
E_CLIENT_HOOK_UNSTICK,
+ E_CLIENT_HOOK_MAXIMIZE,
E_CLIENT_HOOK_LAST,
} E_Client_Hook_Point;
unsigned int take_focus : 1;
unsigned int want_focus : 1;
unsigned int user_skip_winlist : 1;
+ E_Maximize requested_max;
E_Maximize maximized;
E_Fullscreen fullscreen_policy; // TODO: should be removed - yigl
E_Transient transient_policy;
// TODO: deprecated.
}
+static void
+_e_zone_client_maximize(E_Zone *zone, E_Desk *desk, E_Client *ec, E_Maximize max)
+{
+ int x1, yy1, x2, y2;
+ int w, h, pw, ph;
+ int zx, zy, zw, zh;
+ int ecx, ecy, ecw, ech;
+ int desk_x, desk_y, desk_w, desk_h;
+ Eina_Bool override = ec->maximize_override;
+
+ zx = zy = zw = zh = 0;
+ ec->maximize_override = 1;
+
+ if (ec->desk_area.enable && ec->desk_area.desk_area)
+ {
+ desk_x = ec->desk_area.desk_area->x;
+ desk_y = ec->desk_area.desk_area->y;
+ desk_w = ec->desk_area.desk_area->w;
+ desk_h = ec->desk_area.desk_area->h;
+ }
+ else
+ {
+ desk_x = desk->geom.x;
+ desk_y = desk->geom.y;
+ desk_w = desk->geom.w;
+ desk_h = desk->geom.h;
+ }
+
+ switch (max & E_MAXIMIZE_TYPE)
+ {
+ case E_MAXIMIZE_NONE:
+ /* Ignore */
+ break;
+
+ case E_MAXIMIZE_FULLSCREEN:
+ w = desk_w;
+ h = desk_h;
+
+ e_client_resize_limit(ec, &w, &h);
+ /* center x-direction */
+ x1 = desk_x + (desk_w - w) / 2;
+ /* center y-direction */
+ yy1 = desk_y + (desk_h - h) / 2;
+
+ switch (max & E_MAXIMIZE_DIRECTION)
+ {
+ case E_MAXIMIZE_BOTH:
+ e_client_maximized_geometry_set(ec, x1, yy1, w, h);
+ break;
+
+ case E_MAXIMIZE_VERTICAL:
+ e_client_maximized_geometry_set(ec, ec->x, yy1, ec->w, h);
+ break;
+
+ case E_MAXIMIZE_HORIZONTAL:
+ e_client_maximized_geometry_set(ec, x1, ec->y, w, ec->h);
+ break;
+
+ case E_MAXIMIZE_LEFT:
+ e_client_maximized_geometry_set(ec, desk_x, desk_y, w / 2, h);
+ break;
+
+ case E_MAXIMIZE_RIGHT:
+ e_client_maximized_geometry_set(ec, x1, desk_y, w / 2, h);
+ break;
+ }
+ break;
+
+ case E_MAXIMIZE_SMART:
+ case E_MAXIMIZE_EXPAND:
+ if (desk->visible)
+ {
+ // base_output_resolution
+ if (ec->base_output_resolution.use)
+ {
+ zx = desk_x;
+ zy = desk_y;
+ zw = ec->base_output_resolution.w;
+ zh = ec->base_output_resolution.h;
+ }
+ else
+ {
+ e_zone_desk_useful_geometry_get(zone, desk, &zx, &zy, &zw, &zh);
+ }
+ }
+ else
+ {
+ x1 = desk_x;
+ yy1 = desk_y;
+ x2 = desk_x + desk_w;
+ y2 = desk_y + desk_h;
+ e_maximize_client_shelf_fill(ec, &x1, &yy1, &x2, &y2, max);
+ zx = x1, zy = yy1;
+ zw = x2 - x1;
+ zh = y2 - yy1;
+ }
+ w = zw, h = zh;
+
+ evas_object_smart_callback_call(ec->frame, "maximize", NULL);
+ e_comp_object_frame_xy_unadjust(ec->frame, ec->x, ec->y, &ecx, &ecy);
+ e_comp_object_frame_wh_unadjust(ec->frame, ec->w, ec->h, &ecw, &ech);
+
+ if (ecw < zw)
+ w = ecw;
+
+ if (ech < zh)
+ h = ech;
+
+ if (ecx < zx) // window left not useful coordinates
+ x1 = zx;
+ else if (ecx + ecw > zx + zw) // window right not useful coordinates
+ x1 = zx + zw - ecw;
+ else // window normal position
+ x1 = ecx;
+
+ if (ecy < zy) // window top not useful coordinates
+ yy1 = zy;
+ else if (ecy + ech > zy + zh) // window bottom not useful coordinates
+ yy1 = zy + zh - ech;
+ else // window normal position
+ yy1 = ecy;
+
+ switch (max & E_MAXIMIZE_DIRECTION)
+ {
+ case E_MAXIMIZE_BOTH:
+ e_client_maximized_geometry_set(ec, zx, zy, zw, zh);
+ break;
+
+ case E_MAXIMIZE_VERTICAL:
+ e_client_maximized_geometry_set(ec, ec->x, zy, ec->w, zh);
+ break;
+
+ case E_MAXIMIZE_HORIZONTAL:
+ e_client_maximized_geometry_set(ec, zx, ec->y, zw, ec->h);
+ break;
+
+ case E_MAXIMIZE_LEFT:
+ e_client_maximized_geometry_set(ec, zx, zy, zw / 2, zh);
+ break;
+
+ case E_MAXIMIZE_RIGHT:
+ e_client_maximized_geometry_set(ec, zx + zw / 2, zy, zw / 2, zh);
+ break;
+ }
+
+ break;
+
+ case E_MAXIMIZE_FILL:
+ x1 = desk_x;
+ yy1 = desk_y;
+ x2 = desk_x + desk_w;
+ y2 = desk_y + desk_h;
+
+ /* walk through all shelves */
+ e_maximize_client_shelf_fill(ec, &x1, &yy1, &x2, &y2, max);
+
+ /* walk through all windows */
+ e_maximize_client_client_fill(ec, &x1, &yy1, &x2, &y2, max);
+
+ w = x2 - x1;
+ h = y2 - yy1;
+ pw = w;
+ ph = h;
+ e_client_resize_limit(ec, &w, &h);
+ /* center x-direction */
+ x1 = x1 + (pw - w) / 2;
+ /* center y-direction */
+ yy1 = yy1 + (ph - h) / 2;
+
+ switch (max & E_MAXIMIZE_DIRECTION)
+ {
+ case E_MAXIMIZE_BOTH:
+ e_client_maximized_geometry_set(ec, x1, yy1, w, h);
+ break;
+
+ case E_MAXIMIZE_VERTICAL:
+ e_client_maximized_geometry_set(ec, ec->x, yy1, ec->w, h);
+ break;
+
+ case E_MAXIMIZE_HORIZONTAL:
+ e_client_maximized_geometry_set(ec, x1, ec->y, w, ec->h);
+ break;
+
+ case E_MAXIMIZE_LEFT:
+ e_client_maximized_geometry_set(ec, desk_x, desk_y, w / 2, h);
+ break;
+
+ case E_MAXIMIZE_RIGHT:
+ e_client_maximized_geometry_set(ec, x1, desk_y, w / 2, h);
+ break;
+ }
+ break;
+ }
+ if (ec->maximize_override)
+ ec->maximize_override = override;
+}
+
static void
_e_zone_client_apply_auto_placement(E_Zone *zone, E_Client *ec)
{
}
}
+static void
+_e_zone_cb_hook_client_maximize(void *d, E_Client *ec)
+{
+ E_Zone *zone;
+ E_Desk *desk;
+ int desk_x, desk_y;
+
+ 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->desk_area.enable && ec->desk_area.desk_area)
+ {
+ desk_x = ec->desk_area.desk_area->x;
+ desk_y = ec->desk_area.desk_area->y;
+ }
+ else
+ {
+ desk_x = desk->geom.x;
+ desk_y = desk->geom.y;
+ }
+
+ evas_object_smart_callback_call(ec->frame, "maximize_pre", NULL);
+
+ if (ec->fullscreen)
+ e_client_unfullscreen(ec);
+
+ ec->pre_res_change.valid = 0;
+
+ if (!(ec->maximized & E_MAXIMIZE_HORIZONTAL))
+ {
+ /* Horizontal hasn't been set */
+ ec->saved.x = ec->client.x - desk_x;
+ ec->saved.w = ec->client.w;
+ }
+ if (!(ec->maximized & E_MAXIMIZE_VERTICAL))
+ {
+ /* Vertical hasn't been set */
+ ec->saved.y = ec->client.y - desk_y;
+ ec->saved.h = ec->client.h;
+ }
+
+ ec->saved.zone = zone->num;
+
+ _e_zone_client_maximize(zone, desk, ec, ec->requested_max);
+}
+
static void
_e_zone_client_data_set(E_Zone *zone, E_Client *ec)
{
E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_UNICONIFY, _e_zone_cb_hook_client_uniconify, zone);
E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_STICK, _e_zone_cb_hook_client_stick, zone);
E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_STICK, _e_zone_cb_hook_client_unstick, zone);
+ E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_MAXIMIZE, _e_zone_cb_hook_client_maximize, zone);
if (starting) return zone;