struct wl_listener client_fullscreen;
struct wl_listener client_unfullscreen;
struct wl_listener client_focus_set;
+ struct wl_listener client_iconify;
+ struct wl_listener client_uniconify;
// comp_object listeners
struct wl_listener comp_object_raise;
wl_list_remove(&eda_client->comp_object_lower.link);
wl_list_remove(&eda_client->comp_object_raise.link);
+ wl_list_remove(&eda_client->client_uniconify.link);
+ wl_list_remove(&eda_client->client_iconify.link);
wl_list_remove(&eda_client->client_focus_set.link);
wl_list_remove(&eda_client->client_unfullscreen.link);
wl_list_remove(&eda_client->client_fullscreen.link);
}
static void
+_desk_area_cb_client_iconify(struct wl_listener *listener, void *data)
+{
+ E_Desk_Area_Private_Client *eda_client;
+ E_Desk_Area *eda;
+ E_Client *ec;
+
+ eda_client = wl_container_of(listener, eda_client, client_iconify);
+ eda = eda_client->eda;
+ ec = eda_client->ec;
+
+ e_comp_wl_remote_surface_image_save(ec);
+
+ ec->iconic = 1;
+ ec->want_focus = ec->take_focus = 0;
+ ec->changes.visible = 0;
+ if (ec->fullscreen)
+ eda->fullscreen_clients = eina_list_remove(eda->fullscreen_clients, ec);
+ e_client_comp_hidden_set(ec, 1);
+ evas_object_hide(ec->frame);
+ e_client_urgent_set(ec, ec->icccm.urgent);
+
+ e_client_iconify_event_send(ec);
+
+ if (e_config->transient.iconify)
+ {
+ E_Client *child;
+ Eina_List *list = eina_list_clone(ec->transients);
+
+ EINA_LIST_FREE(list, child)
+ {
+ if ((child->exp_iconify.type != E_ICONIFIED_TYPE_ICONIFY_BY_CLIENT) &&
+ (e_client_is_parent_iconify_by_client(child)))
+ {
+ e_client_iconified_type_set(child, E_ICONIFIED_TYPE_PARENT_ICONIFY_BY_CLIENT);
+ child->exp_iconify.by_client = 1;
+ e_policy_client_iconic_state_change_send(child, 1);
+ }
+ e_client_iconify(child);
+ }
+ }
+}
+
+static void
+_desk_area_cb_client_uniconify(struct wl_listener *listener, void *data)
+{
+ E_Desk_Area_Private_Client *eda_client;
+ E_Desk_Area *eda;
+ E_Client *ec;
+ Eina_Bool not_raise;
+
+ eda_client = wl_container_of(listener, eda_client, client_uniconify);
+ eda = eda_client->eda;
+ ec = eda_client->ec;
+
+ e_comp_wl_remote_surface_image_save_cancel(ec);
+
+ not_raise = ec->exp_iconify.not_raise;
+
+ ec->exp_iconify.by_client = 0;
+ e_client_iconified_type_set(ec, E_ICONIFIED_TYPE_NONE);
+
+ if (e_config->transient.iconify)
+ {
+ E_Client *child;
+ Eina_List *list = eina_list_clone(ec->transients);
+
+ EINA_LIST_FREE(list, child)
+ {
+ if (e_client_transient_policy_get(child) == E_TRANSIENT_BELOW)
+ {
+ child->exp_iconify.not_raise = not_raise;
+ e_client_uniconify(child);
+ }
+ }
+ }
+
+ if (!not_raise)
+ e_client_raise(ec);
+
+ if (ec->internal)
+ {
+ ELOGF("EDA", "UNICONIFY|internal object force show. eda:%p", ec, eda);
+ evas_object_show(ec->frame);
+ }
+
+ if (ec->pixmap)
+ {
+ E_Comp_Wl_Client_Data *cdata;
+
+ cdata = e_client_cdata_get(ec);
+
+ if (e_pixmap_usable_get(ec->pixmap))
+ {
+ if (cdata && cdata->mapped)
+ {
+ ELOGF("EDA", "UNICONIFY|object show. eda:%p frame_visible:%d",
+ ec, eda, evas_object_visible_get(ec->frame));
+ evas_object_show(ec->frame);
+ }
+ else
+ {
+ ELOGF("EDA", "UNICONIFY|object no show. currently unmapped. eda:%p",
+ ec, eda);
+ }
+ }
+ else
+ {
+ if (!ec->exp_iconify.buffer_flush &&
+ !ec->exp_iconify.deiconify_update)
+ {
+ if (cdata && cdata->mapped)
+ {
+ ELOGF("EDA", "UNICONIFY|object show. no use buffer flush. eda:%p frame_visible:%d",
+ ec, eda, evas_object_visible_get(ec->frame));
+ evas_object_show(ec->frame);
+ }
+ }
+ }
+ }
+
+ e_client_comp_hidden_set(ec, 0);
+ ec->deskshow = ec->iconic = 0;
+
+#if 0 // focus should be set to the top window not uniconify window
+ if (ec->pixmap && e_pixmap_usable_get(ec->pixmap))
+ e_client_frame_focus_set(ec, EINA_TRUE);
+#endif
+
+ // send the uniconify event of a client
+ e_client_uniconify_event_send(ec);
+
+ if (e_config->transient.iconify)
+ {
+ E_Client *child;
+ Eina_List *list = eina_list_clone(ec->transients);
+
+ EINA_LIST_FREE(list, child)
+ {
+ if (e_client_transient_policy_get(child) == E_TRANSIENT_ABOVE)
+ {
+ if (child->exp_iconify.type == E_ICONIFIED_TYPE_PARENT_ICONIFY_BY_CLIENT)
+ e_policy_client_iconic_state_change_send(child, 0);
+ child->exp_iconify.not_raise = not_raise;
+ e_client_uniconify(child);
+ }
+ }
+ }
+
+ ec->exp_iconify.not_raise = 0;
+}
+
+static void
_desk_area_cb_comp_object_lower(struct wl_listener *listener, void *data)
{
E_Desk_Area_Private_Client *eda_client;
e_client_unfullscreen_listener_add(ec, &eda_client->client_unfullscreen);
eda_client->client_focus_set.notify = _desk_area_cb_client_focus_set;
e_client_focus_set_listener_add(ec, &eda_client->client_focus_set);
+ eda_client->client_iconify.notify = _desk_area_cb_client_iconify;
+ e_client_iconify_listener_add(ec, &eda_client->client_iconify);
+ eda_client->client_uniconify.notify = _desk_area_cb_client_uniconify;
+ e_client_uniconify_listener_add(ec, &eda_client->client_uniconify);
// e_comp_object listeners
eda_client->comp_object_lower.notify = _desk_area_cb_comp_object_lower;
struct wl_listener client_destroy;
struct wl_listener client_eval_post_new_client;
struct wl_listener client_focus_set;
+#ifdef REFACTOR_DESK_AREA
+#else
struct wl_listener client_iconify;
struct wl_listener client_uniconify;
+#endif
struct wl_listener client_stick;
struct wl_listener client_unstick;
struct wl_listener client_maximize;
wl_list_remove(&zone_client->client_maximize.link);
wl_list_remove(&zone_client->client_unstick.link);
wl_list_remove(&zone_client->client_stick.link);
+#ifdef REFACTOR_DESK_AREA
+#else
wl_list_remove(&zone_client->client_uniconify.link);
wl_list_remove(&zone_client->client_iconify.link);
+#endif
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_desk_client_add(e_desk_current_get(zone), ec);
}
+#ifdef REFACTOR_DESK_AREA
+#else
static void
_zone_cb_client_iconify(struct wl_listener *listener, void *data)
{
ec->exp_iconify.not_raise = 0;
}
+#endif
static void
_zone_cb_client_stick(struct wl_listener *listener, void *data)
zone_client->client_focus_set.notify = _zone_cb_client_focus_set;
e_client_focus_set_listener_add(ec, &zone_client->client_focus_set);
+#ifdef REFACTOR_DESK_AREA
+#else
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);
+#endif
zone_client->client_stick.notify = _zone_cb_client_stick;
e_client_stick_listener_add(ec, &zone_client->client_stick);