Eina_Bool hide_by_request;
Eina_Bool focus_check;
+
+ E_Client *modal;
};
static int _e_client_hooks_delete = 0;
}
static void
+_e_input_thread_client_free(void *data)
+{
+ E_Input_Thread_Request_EClient_Data *ec_data = data;
+ EINA_SAFETY_ON_NULL_RETURN(ec_data);
+
+ INF("[input thread|%s] ec: %p\n", __func__, ec_data->ec);
+ e_input_thread_client_free(e_input_thread_client_get(ec_data->ec));
+}
+
+static void
_e_client_free(E_Client *ec)
{
g_rec_mutex_lock(&e_comp->ec_list_mutex);
+ E_Input_Thread_Request_EClient_Data ec_data;
+ memset(&ec_data, 0, sizeof(E_Input_Thread_Request_EClient_Data));
+
e_comp_object_redirected_set(ec->frame, 0);
e_comp_object_render_update_del(ec->frame);
e_uuid_store_entry_del(ec->uuid);
+ ec_data.ec = ec;
+ INF("[%s] ec: %p\n", __func__, ec);
+ e_input_thread_safe_call(_e_input_thread_client_free, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
+
_e_client_private_finish(ec);
free(ec);
}
static void
+_e_input_thread_client_del(void *data)
+{
+ E_Input_Thread_Request_EClient_Data *ec_data = data;
+ EINA_SAFETY_ON_NULL_RETURN(ec_data);
+
+ INF("[input thread|%s] ec: %p\n", __func__, ec_data->ec);
+ e_input_thread_client_del(e_input_thread_client_get(ec_data->ec));
+}
+
+static void
_e_client_del(E_Client *ec)
{
E_Client *child;
E_Pixmap_Type type;
+ E_Input_Thread_Request_EClient_Data ec_data;
+ memset(&ec_data, 0, sizeof(E_Input_Thread_Request_EClient_Data));
g_rec_mutex_lock(&e_comp->ec_list_mutex);
if (ec->parent)
{
+ if (e_client_modal_child_get(ec->parent) == ec)
+ e_client_modal_child_set(ec->parent, NULL);
ec->parent->transients = eina_list_remove(ec->parent->transients, ec);
ec->parent = NULL;
}
e_comp_visibility_calculation_set(EINA_TRUE);
+ ec_data.ec = ec;
+ INF("[%s] ec: %p\n", __func__, ec);
+ e_input_thread_safe_call(_e_input_thread_client_del, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
+
g_rec_mutex_unlock(&e_comp->ec_list_mutex);
}
if (ec->hung)
{
ec->hung = 0;
- evas_object_smart_callback_call(ec->frame, "unhung", NULL);
E_FREE_FUNC(ec->kill_timer, ecore_timer_del);
}
}
if (!ec->hung)
{
ec->hung = 1;
- evas_object_smart_callback_call(ec->frame, "hung", NULL);
/* FIXME: if below dialog is up - hide it now */
}
if (ec->delete_requested)
}
static void
-_e_input_thread_client_visible_set(void *data)
+_e_input_thread_client_visibility_set(void *data)
{
E_Input_Thread_Request_EClient_Data *ec_data = data;
EINA_SAFETY_ON_NULL_RETURN(ec_data);
- INF("[input thread|%s] ec(%p), visible(%d)\n", __func__, ec_data->ec, ec_data->visible);
- e_input_thread_client_visible_set(e_input_thread_client_get(ec_data->ec), ec_data->visible);
+ INF("[input thread|%s] ec(%p), visibility(%d)\n", __func__, ec_data->ec, ec_data->visibility);
+ e_input_thread_client_visibility_set(e_input_thread_client_get(ec_data->ec), ec_data->visibility);
}
EINTERN void
ec->visibility.obscured = visibility;
ec_data.ec = ec;
- ec_data.visible = ec->visibility.obscured;
+ ec_data.visibility = ec->visibility.obscured;
- INF("[%s] ec(%p), visible(%d)\n", __func__, ec, ec->visibility.obscured);
- e_input_thread_safe_call(_e_input_thread_client_visible_set, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
+ INF("[%s] ec(%p), visibility(%d)\n", __func__, ec, ec->visibility.obscured);
+ e_input_thread_safe_call(_e_input_thread_client_visibility_set, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
}
static Eina_Bool
cdata->mapped = set;
}
+EINTERN void
+e_client_modal_child_set(E_Client *ec, E_Client *modal)
+{
+ API_ENTRY;
+
+ E_Client *old_modal = priv->modal;
+ if (old_modal == modal) return;
+
+ ELOGF("E_CLIENT", "SET modal. new(ec:%p, win:0x%08zx), old(ec:%p, win:0x%08zx)", ec,
+ modal, e_client_util_win_get(modal), old_modal, e_client_util_win_get(old_modal));
+
+ // TODO: if ec has a modal window already, then how does we do?
+ priv->modal = modal;
+}
+
+EINTERN E_Client *
+e_client_modal_child_get(E_Client *ec)
+{
+ API_ENTRY_VAL(NULL);
+ return priv->modal;
+}
+
+EINTERN void
+e_client_modal_state_set(E_Client *ec, Eina_Bool modal)
+{
+ if (!ec) return;
+ ec->netwm.state.modal = modal;
+
+ if (ec->parent)
+ {
+ if (ec->netwm.state.modal)
+ e_client_modal_child_set(ec->parent, ec);
+ else
+ e_client_modal_child_set(ec->parent, NULL);
+ }
+}
+
+EINTERN Eina_Bool
+e_client_is_modal_state(E_Client *ec)
+{
+ if (!ec) return EINA_FALSE;
+ return ec->netwm.state.modal;
+}
////////////////////////////////////////////////
EINTERN Eina_Bool
// store the E_Maximize value
ec->maximized = max;
ec->changes.need_unmaximize = 0;
-
- evas_object_smart_callback_call(ec->frame, "maximize_done", NULL);
}
else
{
if (!ec->fullscreen)
{
- evas_object_smart_callback_call(ec->frame, "unmaximize_pre", NULL);
-
// call the unmaximize hook of a client
wl_signal_emit(&PRI(ec)->events.unmaximize, &max);
-
- evas_object_smart_callback_call(ec->frame, "unmaximize_done", NULL);
}
ec->maximized = E_MAXIMIZE_NONE;
}
}
+static void
+_e_input_thread_client_layer_set(void *data)
+{
+ E_Input_Thread_Request_EClient_Data *ec_data = data;
+ EINA_SAFETY_ON_NULL_RETURN(ec_data);
+
+ INF("[input thread|%s] ec(%p), layer(%d)\n", __func__, ec_data->ec, ec_data->layer);
+ e_input_thread_client_layer_set(e_input_thread_client_get(ec_data->ec), ec_data->layer);
+}
+
+EINTERN void
+e_client_input_thread_layer_set(E_Client *ec, E_Layer layer)
+{
+ EINA_SAFETY_ON_NULL_RETURN(ec);
+
+ E_Input_Thread_Request_EClient_Data ec_data;
+ memset(&ec_data, 0, sizeof(E_Input_Thread_Request_EClient_Data));
+
+ ec_data.ec = ec;
+ ec_data.layer = layer;
+
+ INF("[%s] ec(%p), layer(%d)\n", __func__, ec, layer);
+ e_input_thread_safe_call(_e_input_thread_client_layer_set, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
+}
+
E_API Eina_Bool
e_client_layer_set(E_Client *ec,
E_Layer layer)
if (ec->layer_pending || ec->layer_block)
{
ec->layer = layer;
+ e_client_input_thread_layer_set(ec, layer);
return EINA_TRUE;
}
}
ec_data.ec = ec;
ec_data.wl_surface = ec->comp_data ? ec->comp_data->wl_surface : NULL;
- ec_data.visible = ec->visible;
ec_data.is_video = EINA_FALSE;
if (name)
ec_data.ec = ec;
ec_data.wl_surface = ec->comp_data ? ec->comp_data->wl_surface : NULL;
- ec_data.visible = EINA_FALSE;
if (name)
strncpy(ec_data.netwm_name, name, sizeof(ec_data.netwm_name)-1);