EINTERN void
e_client_stick(E_Client *ec)
{
- E_Desk *desk;
-
E_OBJECT_CHECK(ec);
E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
if (ec->sticky) return;
- desk = ec->desk;
- ec->desk = NULL;
- ec->sticky = 1;
- ec->hidden = 0;
- e_client_desk_set(ec, desk);
- evas_object_smart_callback_call(ec->frame, "stick", NULL);
-
- if (e_config->transient.desktop)
- {
- E_Client *child;
- Eina_List *list = eina_list_clone(ec->transients);
-
- EINA_LIST_FREE(list, child)
- {
- child->sticky = 1;
- evas_object_show(ec->frame);
- }
- }
- // call the stick hook of a client
+ // call the stick hook of a client
_e_client_hook_call(E_CLIENT_HOOK_STICK, ec);
// send the sticky property event of a client
}
static void
+_e_zone_cb_hook_client_stick(void *d, E_Client *ec)
+{
+ E_Zone *zone;
+ 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;
+
+ desk = e_zone_desk_find_by_ec(zone, ec);
+ EINA_SAFETY_ON_NULL_RETURN(desk);
+
+ e_desk_client_del(desk, ec);
+ ec->sticky = 1;
+ ec->hidden = 0;
+
+ e_client_desk_set(ec, desk);
+
+ evas_object_smart_callback_call(ec->frame, "stick", NULL);
+
+ if (e_config->transient.desktop)
+ {
+ E_Client *child;
+ Eina_List *list = eina_list_clone(ec->transients);
+
+ EINA_LIST_FREE(list, child)
+ {
+ child->sticky = 1;
+ evas_object_show(ec->frame);
+ }
+ }
+}
+
+static void
_e_zone_client_data_set(E_Zone *zone, E_Client *ec)
{
E_Zone *data;
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_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);
if (starting) return zone;