E_Zone_Private *priv = PRI(zone)
typedef struct _E_Zone_Private E_Zone_Private;
+typedef struct _E_Zone_Private_Client E_Zone_Private_Client;
struct _E_Zone_Private
{
} events;
};
+struct _E_Zone_Private_Client
+{
+ E_Zone *zone;
+ E_Client *ec;
+
+ struct wl_listener client_destroy;
+ struct wl_listener client_eval_post_new_client;
+ struct wl_listener client_focus_set;
+ struct wl_listener client_iconify;
+ 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;
+ struct wl_listener client_activate_done;
+ struct wl_listener client_fullscreen;
+ struct wl_listener client_unfullscreen;
+};
+
+
/* E_Zone is a child object of E_Comp. There is one zone per screen
* in a xinerama setup. Each zone has one or more desktops.
*/
#endif
static void
-_e_zone_cb_hook_client_del(void *d, E_Client *ec)
+_zone_cb_client_destroy(struct wl_listener *listener, void *data)
{
#ifdef REFACTOR_ZONE_DESK
+ E_Zone_Private_Client *zone_client;
E_Zone *zone;
+ E_Client *ec;
E_Desk *desk;
- 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;
+ zone_client = wl_container_of(listener, zone_client, client_destroy);
+ zone = zone_client->zone;
+ ec = zone_client->ec;
desk = e_zone_desk_find_by_ec(zone, ec);
EINA_SAFETY_ON_NULL_RETURN(desk);
wl_signal_emit_mutable(&PRI(zone)->events.client_remove, ec);
e_desk_client_del(desk, ec);
+
+ wl_list_remove(&zone_client->client_unfullscreen.link);
+ wl_list_remove(&zone_client->client_fullscreen.link);
+ 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);
+ wl_list_remove(&zone_client->client_unstick.link);
+ wl_list_remove(&zone_client->client_stick.link);
+ wl_list_remove(&zone_client->client_uniconify.link);
+ wl_list_remove(&zone_client->client_iconify.link);
+ wl_list_remove(&zone_client->client_focus_set.link);
+ wl_list_remove(&zone_client->client_eval_post_new_client.link);
+ wl_list_remove(&zone_client->client_destroy.link);
+
+ E_FREE(zone_client);
+
#else
evas_object_data_del(ec->frame, ZONE_EC_DATA_KEY);
#endif
}
static void
-_e_zone_cb_hook_client_eval_post_new_client(void *d, E_Client *ec)
+_zone_cb_client_eval_post_new_client(struct wl_listener *listener, void *data)
{
+ E_Zone_Private_Client *zone_client;
E_Zone *zone;
+ E_Client *ec;
int tx, ty, tw, th;
int nw, nh;
int zx = 0, zy = 0, zw = 0, zh = 0;
- 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;
+ zone_client = wl_container_of(listener, zone_client, client_eval_post_new_client);
+ zone = zone_client->zone;
+ ec = zone_client->ec;
e_zone_useful_geometry_get(zone, &zx, &zy, &zw, &zh);
/* enforce wm size hints for initial sizing */
}
static void
-_e_zone_cb_hook_client_focus_set(void *d, E_Client *ec)
+_zone_cb_client_focus_set(struct wl_listener *listener, void *data)
{
+ E_Zone_Private_Client *zone_client;
E_Zone *zone;
+ E_Client *ec;
E_Desk *desk;
- 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;
+ zone_client = wl_container_of(listener, zone_client, client_focus_set);
+ zone = zone_client->zone;
+ ec = zone_client->ec;
desk = e_zone_desk_find_by_ec(zone, ec);
EINA_SAFETY_ON_NULL_RETURN(desk);
}
static void
-_e_zone_cb_hook_client_iconify(void *d, E_Client *ec)
+_zone_cb_client_iconify(struct wl_listener *listener, void *data)
{
+ E_Zone_Private_Client *zone_client;
E_Zone *zone;
+ E_Client *ec;
E_Desk *desk;
- 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;
+ zone_client = wl_container_of(listener, zone_client, client_iconify);
+ zone = zone_client->zone;
+ ec = zone_client->ec;
desk = e_zone_desk_find_by_ec(zone, ec);
EINA_SAFETY_ON_NULL_RETURN(desk);
}
static void
-_e_zone_cb_hook_client_uniconify(void *d, E_Client *ec)
+_zone_cb_client_uniconify(struct wl_listener *listener, void *data)
{
+ E_Zone_Private_Client *zone_client;
E_Zone *zone;
+ E_Client *ec;
E_Desk *desk;
Eina_Bool not_raise;
- 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;
+ zone_client = wl_container_of(listener, zone_client, client_uniconify);
+ zone = zone_client->zone;
+ ec = zone_client->ec;
desk = e_zone_desk_find_by_ec(zone, ec);
EINA_SAFETY_ON_NULL_RETURN(desk);
}
static void
-_e_zone_cb_hook_client_stick(void *d, E_Client *ec)
+_zone_cb_client_stick(struct wl_listener *listener, void *data)
{
+ E_Zone_Private_Client *zone_client;
E_Zone *zone;
+ E_Client *ec;
E_Desk *desk;
- 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;
+ zone_client = wl_container_of(listener, zone_client, client_stick);
+ zone = zone_client->zone;
+ ec = zone_client->ec;
desk = e_zone_desk_find_by_ec(zone, ec);
EINA_SAFETY_ON_NULL_RETURN(desk);
}
static void
-_e_zone_cb_hook_client_unstick(void *d, E_Client *ec)
+_zone_cb_client_unstick(struct wl_listener *listener, void *data)
{
+ E_Zone_Private_Client *zone_client;
E_Zone *zone;
+ E_Client *ec;
E_Desk *desk, *curr_desk;
- 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;
+ zone_client = wl_container_of(listener, zone_client, client_unstick);
+ zone = zone_client->zone;
+ ec = zone_client->ec;
desk = e_zone_desk_find_by_ec(zone, ec);
EINA_SAFETY_ON_NULL_RETURN(desk);
}
static void
-_e_zone_cb_hook_client_maximize(void *d, E_Client *ec)
+_zone_cb_client_maximize(struct wl_listener *listener, void *data)
{
+ E_Zone_Private_Client *zone_client;
E_Zone *zone;
+ E_Client *ec;
E_Desk *desk;
int desk_x, desk_y;
+ E_Maximize max;
- EINA_SAFETY_ON_NULL_RETURN(ec);
+ zone_client = wl_container_of(listener, zone_client, client_maximize);
+ zone = zone_client->zone;
+ ec = zone_client->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;
+ max = *((E_Maximize *)data);
desk = e_zone_desk_find_by_ec(zone, ec);
EINA_SAFETY_ON_NULL_RETURN(desk);
ec->saved.zone = zone->num;
- _e_zone_client_maximize(zone, desk, ec, ec->requested_max);
+ _e_zone_client_maximize(zone, desk, ec, max);
}
static void
-_e_zone_cb_hook_client_unmaximize(void *d, E_Client *ec)
+_zone_cb_client_unmaximize(struct wl_listener *listener, void *data)
{
+ E_Zone_Private_Client *zone_client;
E_Zone *zone;
+ E_Client *ec;
E_Maximize max;
- EINA_SAFETY_ON_NULL_RETURN(ec);
+ zone_client = wl_container_of(listener, zone_client, client_unmaximize);
+ zone = zone_client->zone;
+ ec = zone_client->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;
+ max = *((E_Maximize *)data);
if (ec->maximized & E_MAXIMIZE_TYPE)
{
- max = ec->requested_max;
-
ec->pre_res_change.valid = 0;
ec->changes.need_maximize = 0;
}
static void
-_e_zone_cb_hook_client_activate_done(void *d, E_Client *ec)
+_zone_cb_client_activate_done(struct wl_listener *listener, void *data)
{
+ E_Zone_Private_Client *zone_client;
E_Zone *zone;
+ E_Client *ec;
E_Desk *desk;
- 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;
+ zone_client = wl_container_of(listener, zone_client, client_activate_done);
+ zone = zone_client->zone;
+ ec = zone_client->ec;
desk = e_zone_desk_find_by_ec(zone, ec);
EINA_SAFETY_ON_NULL_RETURN(desk);
}
static void
-_e_zone_cb_hook_client_fullscreen(void *d, E_Client *ec)
+_zone_cb_client_fullscreen(struct wl_listener *listener, void *data)
{
+ E_Zone_Private_Client *zone_client;
E_Zone *zone;
+ E_Client *ec;
E_Desk *desk;
int x, y, w, h;
+ E_Fullscreen fullscreen_policy;
- EINA_SAFETY_ON_NULL_RETURN(ec);
+ zone_client = wl_container_of(listener, zone_client, client_fullscreen);
+ zone = zone_client->zone;
+ ec = zone_client->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;
+ fullscreen_policy = *((E_Fullscreen *)data);
desk = e_zone_desk_find_by_ec(zone, ec);
EINA_SAFETY_ON_NULL_RETURN(desk);
ec->fullscreen = 1;
if ((eina_list_count(e_comp->zones) > 1) ||
- (ec->fullscreen_policy == E_FULLSCREEN_RESIZE))
+ (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)
+ else if (fullscreen_policy == E_FULLSCREEN_ZOOM)
{
/* compositor backends! */
evas_object_smart_callback_call(ec->frame, "fullscreen_zoom", NULL);
}
static void
-_e_zone_cb_hook_client_unfullscreen(void *d, E_Client *ec)
+_zone_cb_client_unfullscreen(struct wl_listener *listener, void *data)
{
+ E_Zone_Private_Client *zone_client;
E_Zone *zone;
+ E_Client *ec;
E_Desk *desk;
+ E_Fullscreen fullscreen_policy;
- EINA_SAFETY_ON_NULL_RETURN(ec);
+ zone_client = wl_container_of(listener, zone_client, client_unfullscreen);
+ zone = zone_client->zone;
+ ec = zone_client->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;
+ fullscreen_policy = *((E_Fullscreen *)data);
desk = e_zone_desk_find_by_ec(zone, ec);
EINA_SAFETY_ON_NULL_RETURN(desk);
ec->need_fullscreen = 0;
desk->fullscreen_clients = eina_list_remove(desk->fullscreen_clients, ec);
- if (ec->fullscreen_policy == E_FULLSCREEN_ZOOM)
+ if (fullscreen_policy == E_FULLSCREEN_ZOOM)
evas_object_smart_callback_call(ec->frame, "unfullscreen_zoom", NULL);
if (!e_client_util_ignored_get(ec))
e_client_frame_update(ec);
- ec->fullscreen_policy = 0;
-
evas_object_smart_callback_call(ec->frame, "unfullscreen", NULL);
e_client_util_move_resize_without_frame(ec, zone->x + ec->saved.x,
e_zone_all_edge_flip_eval();
- E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_DEL, _e_zone_cb_hook_client_del, zone);
-#ifdef REFACTOR_ZONE_DESK
+ // CLIENT HOOK Handlers
E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_NEW_CLIENT_POST, _e_zone_cb_hook_client_new_client_post, zone);
- E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_EVAL_POST_NEW_CLIENT, _e_zone_cb_hook_client_eval_post_new_client, zone);
- E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_FOCUS_SET, _e_zone_cb_hook_client_focus_set, zone);
- E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_ICONIFY, _e_zone_cb_hook_client_iconify, zone);
- 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_UNSTICK, _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);
- 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);
- E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_UNFULLSCREEN, _e_zone_cb_hook_client_unfullscreen, zone);
-#endif
+
if (starting) return zone;
ev = E_NEW(E_Event_Zone_Add, 1);
{
#ifdef REFACTOR_ZONE_DESK
E_Desk *desk;
+ E_Zone_Private_Client *zone_client;
EINA_SAFETY_ON_NULL_RETURN(zone);
EINA_SAFETY_ON_NULL_RETURN(ec);
if (e_zone_has_ec(zone, ec)) return;
+ zone_client = E_NEW(E_Zone_Private_Client, 1);
+ EINA_SAFETY_ON_NULL_RETURN(zone_client);
+
+ zone_client->zone = zone;
+ zone_client->ec = ec;
+
+ // e_client listeners
+ zone_client->client_destroy.notify = _zone_cb_client_destroy;
+ e_client_destroy_listener_add(ec, &zone_client->client_destroy);
+
+ zone_client->client_eval_post_new_client.notify = _zone_cb_client_eval_post_new_client;
+ e_client_eval_post_new_client_listener_add(ec, &zone_client->client_eval_post_new_client);
+
+ zone_client->client_focus_set.notify = _zone_cb_client_focus_set;
+ e_client_focus_set_listener_add(ec, &zone_client->client_focus_set);
+
+ zone_client->client_iconify.notify = _zone_cb_client_iconify;
+ e_client_iconify_listener_add(ec, &zone_client->client_iconify);
+
+ zone_client->client_uniconify.notify = _zone_cb_client_uniconify;
+ e_client_uniconify_listener_add(ec, &zone_client->client_uniconify);
+
+ zone_client->client_stick.notify = _zone_cb_client_stick;
+ e_client_stick_listener_add(ec, &zone_client->client_stick);
+
+ zone_client->client_unstick.notify = _zone_cb_client_unstick;
+ e_client_unstick_listener_add(ec, &zone_client->client_unstick);
+
+ 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);
+
+ zone_client->client_activate_done.notify = _zone_cb_client_activate_done;
+ e_client_activate_done_listener_add(ec, &zone_client->client_activate_done);
+
+ zone_client->client_fullscreen.notify = _zone_cb_client_fullscreen;
+ e_client_fullscreen_listener_add(ec, &zone_client->client_fullscreen);
+
+ zone_client->client_unfullscreen.notify = _zone_cb_client_unfullscreen;
+ e_client_unfullscreen_listener_add(ec, &zone_client->client_unfullscreen);
+
_e_zone_client_set(zone, ec);
_e_zone_client_data_set(zone, ec);