struct wl_listener client_uniconify;
struct wl_listener client_stick;
struct wl_listener client_unstick;
+ struct wl_listener client_maximize;
+ struct wl_listener client_unmaximize;
// comp_object listeners
struct wl_listener comp_object_raise;
}
}
+
+
static void
_e_desk_area_cb_hook_subsurface_create(void *data, E_Client *ec)
{
wl_list_remove(&eda_client->comp_object_lower.link);
wl_list_remove(&eda_client->comp_object_raise.link);
+ wl_list_remove(&eda_client->client_unmaximize.link);
+ wl_list_remove(&eda_client->client_maximize.link);
wl_list_remove(&eda_client->client_unstick.link);
wl_list_remove(&eda_client->client_stick.link);
wl_list_remove(&eda_client->client_uniconify.link);
}
static void
+_e_desk_area_ec_maximize(E_Desk_Area *eda, E_Client *ec, E_Maximize max)
+{
+ int x1, yy1, x2, y2;
+//FIXME: TODO: This is ugly. Use the x,y,w,y of this desk_area
+ int zx, zy, zw, zh;
+ Eina_Bool override = ec->maximize_override;
+
+//FIXME: TODO: This is ugly. Use the x,y,w,y of this desk_area
+// Obstacles of zone should be the desk_areas by the window manager policy.
+// If the Obstacles assigns the desk_areas, this maximize callback does not need
+// e_zone_desk_useful_geometry_get() function. Because the geometry of this desk_area
+// already be calcuated by the obstacles desk_areas. Therefore, the zx, zy, zw, zh in
+// this function can use the x,y,w,h of this desk_area.
+ E_Desk *desk;
+ E_Zone *zone;
+ desk = eda->desk;
+ zone = desk->zone;
+
+ zx = zy = zw = zh = 0;
+ ec->maximize_override = 1;
+
+ switch (max & E_MAXIMIZE_TYPE)
+ {
+ case E_MAXIMIZE_NONE:
+ /* Ignore */
+ break;
+
+ case E_MAXIMIZE_FULLSCREEN:
+ case E_MAXIMIZE_FILL:
+ if (ec->base_output_resolution.use)
+ {
+ zx = eda->x;
+ zy = eda->y;
+ zw = ec->base_output_resolution.w;
+ zh = ec->base_output_resolution.h;
+ }
+ else
+ {
+ //FIXME: TODO: This is ugly. Use the x,y,w,y of this desk_area
+ e_zone_desk_useful_geometry_get(zone, desk, &zx, &zy, &zw, &zh, EINA_FALSE);
+ }
+
+ 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_SMART:
+ case E_MAXIMIZE_EXPAND:
+ if (desk->visible)
+ {
+ // base_output_resolution
+ if (ec->base_output_resolution.use)
+ {
+ zx = eda->x;
+ zy = eda->y;
+ zw = ec->base_output_resolution.w;
+ zh = ec->base_output_resolution.h;
+ }
+ else
+ {
+ //FIXME: TODO: This is ugly. Use the x,y,w,y of this desk_area
+ e_zone_desk_useful_geometry_get(zone, desk, &zx, &zy, &zw, &zh, EINA_TRUE);
+ }
+ }
+ else
+ {
+ x1 = eda->x;
+ yy1 = eda->y;
+ x2 = eda->x + eda->w;
+ y2 = eda->y + eda->h;
+ e_maximize_client_shelf_fill(ec, &x1, &yy1, &x2, &y2, max);
+ zx = x1, zy = yy1;
+ zw = x2 - x1;
+ zh = y2 - yy1;
+ }
+
+ evas_object_smart_callback_call(ec->frame, "maximize", NULL);
+
+ 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;
+ }
+
+ if (ec->maximize_override)
+ ec->maximize_override = override;
+}
+
+static void
+_desk_area_cb_client_maximize(struct wl_listener *listener, void *data)
+{
+ E_Desk_Area_Private_Client *eda_client;
+ E_Desk_Area *eda;
+ E_Client *ec;
+ E_Maximize max;
+
+ eda_client = wl_container_of(listener, eda_client, client_maximize);
+ eda = eda_client->eda;
+ ec = eda_client->ec;
+
+ max = *((E_Maximize *)data);
+
+ ec->pre_res_change.valid = 0;
+
+ if (!ec->fullscreen)
+ {
+ evas_object_smart_callback_call(ec->frame, "maximize_pre", NULL);
+
+ if (!(ec->maximized & E_MAXIMIZE_HORIZONTAL))
+ {
+ /* Horizontal hasn't been set */
+ ec->saved.x = ec->client.x - eda->x;
+ ec->saved.w = ec->client.w;
+ }
+ if (!(ec->maximized & E_MAXIMIZE_VERTICAL))
+ {
+ /* Vertical hasn't been set */
+ ec->saved.y = ec->client.y - eda->y;
+ ec->saved.h = ec->client.h;
+ }
+
+ _e_desk_area_ec_maximize(eda, ec, max);
+ }
+}
+
+static void
+_desk_area_cb_client_unmaximize(struct wl_listener *listener, void *data)
+{
+ E_Desk_Area_Private_Client *eda_client;
+ E_Desk_Area *eda;
+ E_Client *ec;
+ E_Maximize max;
+
+ eda_client = wl_container_of(listener, eda_client, client_unmaximize);
+ eda = eda_client->eda;
+ ec = eda_client->ec;
+
+ if (ec->fullscreen) return;
+
+ max = *((E_Maximize *)data);
+
+ if (ec->maximized & E_MAXIMIZE_TYPE)
+ {
+ ec->pre_res_change.valid = 0;
+ ec->changes.need_maximize = 0;
+
+ if ((ec->maximized & E_MAXIMIZE_TYPE) == E_MAXIMIZE_FULLSCREEN)
+ {
+ E_Maximize tmp_max = ec->maximized;
+
+ //un-set maximized state for updating frame.
+ ec->maximized = E_MAXIMIZE_NONE;
+ e_client_frame_update(ec);
+ // re-set maximized state for unmaximize smart callback.
+ ec->maximized = tmp_max;
+ evas_object_smart_callback_call(ec->frame, "unfullscreen", NULL);
+ // un-set maximized state.
+ ec->maximized = E_MAXIMIZE_NONE;
+ e_client_util_move_resize_without_frame(ec,
+ ec->saved.x + eda->x,
+ ec->saved.y + eda->y,
+ ec->saved.w, ec->saved.h);
+ ec->saved.x = ec->saved.y = ec->saved.w = ec->saved.h = 0;
+ }
+ else
+ {
+ int w, h, x, y;
+ Eina_Bool horiz = EINA_FALSE, vert = EINA_FALSE;
+
+ w = ec->client.w;
+ h = ec->client.h;
+ x = ec->client.x;
+ y = ec->client.y;
+
+ if (max & E_MAXIMIZE_VERTICAL)
+ {
+ /* Remove vertical */
+ h = ec->saved.h;
+ vert = EINA_TRUE;
+ y = ec->saved.y + eda->y;
+ if ((max & E_MAXIMIZE_VERTICAL) == E_MAXIMIZE_VERTICAL)
+ {
+ ec->maximized &= ~E_MAXIMIZE_VERTICAL;
+ ec->maximized &= ~E_MAXIMIZE_LEFT;
+ ec->maximized &= ~E_MAXIMIZE_RIGHT;
+ }
+ if ((max & E_MAXIMIZE_LEFT) == E_MAXIMIZE_LEFT)
+ ec->maximized &= ~E_MAXIMIZE_LEFT;
+ if ((max & E_MAXIMIZE_RIGHT) == E_MAXIMIZE_RIGHT)
+ ec->maximized &= ~E_MAXIMIZE_RIGHT;
+ }
+ if (max & E_MAXIMIZE_HORIZONTAL)
+ {
+ /* Remove horizontal */
+ w = ec->saved.w;
+ x = ec->saved.x + eda->x;
+ horiz = EINA_TRUE;
+ ec->maximized &= ~E_MAXIMIZE_HORIZONTAL;
+ }
+
+ if (!(ec->maximized & E_MAXIMIZE_DIRECTION))
+ {
+ ec->maximized = E_MAXIMIZE_NONE;
+ e_client_frame_update(ec);
+ evas_object_smart_callback_call(ec->frame, "unmaximize", NULL);
+ e_client_resize_limit(ec, &w, &h);
+ e_client_pos_set(ec, x, y);
+ if ((ec->saved.w != 0) && (ec->saved.h != 0))
+ {
+ if ((w != ec->saved.w) || (h != ec->saved.h))
+ {
+ e_policy_visibility_client_defer_move(ec);
+ }
+ }
+ }
+ else
+ {
+ evas_object_smart_callback_call(ec->frame, "unmaximize", NULL);
+ e_client_resize_limit(ec, &w, &h);
+ e_client_pos_set(ec, x, y);
+ if ((ec->saved.w != 0) && (ec->saved.h != 0))
+ {
+ if ((w != ec->saved.w) || (h != ec->saved.h))
+ {
+ e_policy_visibility_client_defer_move(ec);
+ }
+ }
+ }
+ if (vert)
+ ec->saved.h = ec->saved.y = 0;
+ if (horiz)
+ ec->saved.w = ec->saved.x = 0;
+ }
+ }
+}
+
+static void
_desk_area_cb_comp_object_lower(struct wl_listener *listener, void *data)
{
E_Desk_Area_Private_Client *eda_client;
e_client_stick_listener_add(ec, &eda_client->client_stick);
eda_client->client_unstick.notify = _desk_area_cb_client_unstick;
e_client_unstick_listener_add(ec, &eda_client->client_unstick);
+ eda_client->client_maximize.notify = _desk_area_cb_client_maximize;
+ e_client_maximize_listener_add(ec, &eda_client->client_maximize);
+ eda_client->client_unmaximize.notify = _desk_area_cb_client_unmaximize;
+ e_client_unmaximize_listener_add(ec, &eda_client->client_unmaximize);
// e_comp_object listeners
eda_client->comp_object_lower.notify = _desk_area_cb_comp_object_lower;
struct wl_listener client_uniconify;
struct wl_listener client_stick;
struct wl_listener client_unstick;
-#endif
struct wl_listener client_maximize;
struct wl_listener client_unmaximize;
+#endif
struct wl_listener client_activate_done;
#ifdef REFACTOR_DESK_AREA
#else
return 1;
}
+#ifdef REFACTOR_DESK_AREA
+#else
static void
_e_zone_client_maximize(E_Zone *zone, E_Desk *desk, E_Client *ec, E_Maximize max)
{
zx = zy = zw = zh = 0;
ec->maximize_override = 1;
-#ifdef REFACTOR_DESK_AREA
- desk_x = desk->geom.x;
- desk_y = desk->geom.y;
- desk_w = desk->geom.w;
- desk_h = desk->geom.h;
-#else
if (ec->desk_area.enable && ec->desk_area.desk_area)
{
desk_x = ec->desk_area.desk_area->x;
desk_w = desk->geom.w;
desk_h = desk->geom.h;
}
-#endif
switch (max & E_MAXIMIZE_TYPE)
{
if (ec->maximize_override)
ec->maximize_override = override;
}
+#endif
static void
_e_zone_client_apply_auto_placement(E_Zone *zone, E_Client *ec)
wl_list_remove(&zone_client->client_fullscreen.link);
#endif
wl_list_remove(&zone_client->client_activate_done.link);
- wl_list_remove(&zone_client->client_unmaximize.link);
- wl_list_remove(&zone_client->client_maximize.link);
#ifdef REFACTOR_DESK_AREA
#else
+ wl_list_remove(&zone_client->client_unmaximize.link);
+ wl_list_remove(&zone_client->client_maximize.link);
wl_list_remove(&zone_client->client_unstick.link);
wl_list_remove(&zone_client->client_stick.link);
wl_list_remove(&zone_client->client_uniconify.link);
}
}
}
-#endif
static void
_zone_cb_client_maximize(struct wl_listener *listener, void *data)
desk = e_zone_desk_find_by_ec(zone, ec);
EINA_SAFETY_ON_NULL_RETURN(desk);
-#ifdef REFACTOR_DESK_AREA
- desk_x = desk->geom.x;
- desk_y = desk->geom.y;
-#else
if (ec->desk_area.enable && ec->desk_area.desk_area)
{
desk_x = ec->desk_area.desk_area->x;
desk_x = desk->geom.x;
desk_y = desk->geom.y;
}
-#endif
+
ec->pre_res_change.valid = 0;
if (!ec->fullscreen)
ec->saved.w = ec->saved.x = 0;
}
}
-
}
+#endif
static void
_zone_cb_client_activate_done(struct wl_listener *listener, void *data)
zone_client->client_unstick.notify = _zone_cb_client_unstick;
e_client_unstick_listener_add(ec, &zone_client->client_unstick);
-#endif
zone_client->client_maximize.notify = _zone_cb_client_maximize;
e_client_maximize_listener_add(ec, &zone_client->client_maximize);
zone_client->client_unmaximize.notify = _zone_cb_client_unmaximize;
e_client_unmaximize_listener_add(ec, &zone_client->client_unmaximize);
+#endif
zone_client->client_activate_done.notify = _zone_cb_client_activate_done;
e_client_activate_done_listener_add(ec, &zone_client->client_activate_done);