efl/src/lib/elementary/elm_app_client_view.c

316 lines
8.9 KiB
C

#ifdef HAVE_CONFIG_H
# include "elementary_config.h"
#endif
#include <Elementary.h>
#include "elm_priv.h"
#define MY_CLASS ELM_APP_CLIENT_VIEW_CLASS
#define MY_CLASS_NAME "Elm_App_Client_View"
typedef struct
{
Eldbus_Proxy *view_proxy;
Elm_App_View_State state;
Eina_Stringshare *path;
} Elm_App_Client_View_Data;
static const char *_string_prop_get(const Eina_Value *v)
{
const char *str;
if (!v)
return "";
eina_value_get(v, &str);
return str;
}
static int _int_prop_get(const Eina_Value *v)
{
int num;
if (!v)
return 0;
eina_value_get(v, &num);
return num;
}
static short _short_prop_get(const Eina_Value *v)
{
short num;
if (!v)
return 0;
eina_value_get(v, &num);
return num;
}
static void
_prop_changed(void *user_data, Eldbus_Proxy *proxy EINA_UNUSED, void *event_info)
{
Eldbus_Proxy_Event_Property_Changed *prop_event = event_info;
Elm_App_Client_View *eo = user_data;
const Eina_Value *v = prop_event->value;
Elm_App_Client_View_Data *cdata = efl_data_scope_get(eo, MY_CLASS);
if (!strcmp(prop_event->name, "Title"))
efl_event_callback_legacy_call(eo, ELM_APP_CLIENT_VIEW_EVENT_TITLE_CHANGED, (void *) _string_prop_get(v));
else if (!strcmp(prop_event->name, "IconName"))
efl_event_callback_legacy_call(eo, ELM_APP_CLIENT_VIEW_EVENT_ICON_CHANGED, (void *) _string_prop_get(v));
else if (!strcmp(prop_event->name, "IconPixels"))
efl_event_callback_legacy_call(eo, ELM_APP_CLIENT_VIEW_EVENT_ICON_PIXELS_CHANGED, NULL);
else if (!strcmp(prop_event->name, "NewEvents"))
efl_event_callback_legacy_call(eo, ELM_APP_CLIENT_VIEW_EVENT_NEW_EVENTS_CHANGED, (void *)(uintptr_t)_int_prop_get(v));
else if (!strcmp(prop_event->name, "Progress"))
efl_event_callback_legacy_call(eo, ELM_APP_CLIENT_VIEW_EVENT_PROGRESS_CHANGED, (void *)(uintptr_t)_short_prop_get(v));
else if (!strcmp(prop_event->name, "State"))
{
cdata->state = _string_state_to_id(_string_prop_get(v));
efl_event_callback_legacy_call(eo, ELM_APP_CLIENT_VIEW_EVENT_STATE_CHANGED, (void *)(uintptr_t)cdata->state);
}
else if (!strcmp(prop_event->name, "WindowId"))
efl_event_callback_legacy_call(eo, ELM_APP_CLIENT_VIEW_EVENT_WINDOW_CHANGED, (void *)(uintptr_t)_int_prop_get(v));
else
return;
efl_event_callback_legacy_call(eo, ELM_APP_CLIENT_VIEW_EVENT_PROPERTY_CHANGED, (void *) prop_event->name);
}
static void
_props_loaded(void *user_data, Eldbus_Proxy *proxy EINA_UNUSED, void *event_info EINA_UNUSED)
{
const Eina_Hash *props = eldbus_proxy_property_local_get_all(proxy);
Eina_Iterator *iter;
Eina_Hash_Tuple *t;
iter = eina_hash_iterator_tuple_new(props);
EINA_ITERATOR_FOREACH(iter, t)
{
Eldbus_Proxy_Event_Property_Changed event;
event.name = t->key;
event.proxy = proxy;
event.value = t->data;
_prop_changed(user_data, proxy, &event);
}
eina_iterator_free(iter);
}
void
elm_app_client_view_internal_state_set(Eo *eo, Elm_App_View_State state)
{
Elm_App_Client_View_Data *cdata;
Eina_Bool changed = EINA_FALSE;
EINA_SAFETY_ON_NULL_RETURN(eo);
EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo, ELM_APP_CLIENT_VIEW_CLASS));
cdata = efl_data_scope_get(eo, MY_CLASS);
changed = cdata->state != state;
cdata->state = state;
if (!changed)
return;
efl_event_callback_legacy_call(eo, ELM_APP_CLIENT_VIEW_EVENT_STATE_CHANGED, (void *)(uintptr_t)cdata->state);
}
EOLIAN static Eo *
_elm_app_client_view_efl_object_finalize(Eo *eo, Elm_App_Client_View_Data *data)
{
Elm_App_Client *parent = NULL;
const char *package = data->path;
Eldbus_Connection *conn;
Eldbus_Object *obj;
parent = efl_parent_get(eo);
EINA_SAFETY_ON_TRUE_RETURN_VAL((!parent) ||
(!efl_isa(parent, ELM_APP_CLIENT_CLASS)), NULL);
EINA_SAFETY_ON_NULL_RETURN_VAL(data->path, NULL);
package = elm_app_client_package_get(parent);
eldbus_init();
conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION);
obj = eldbus_object_get(conn, package, data->path);
data->view_proxy = eldbus_proxy_get(obj,
"org.enlightenment.ApplicationView1");
eldbus_proxy_properties_monitor(data->view_proxy, EINA_TRUE);
eldbus_proxy_event_callback_add(data->view_proxy,
ELDBUS_PROXY_EVENT_PROPERTY_CHANGED,
_prop_changed, eo);
eldbus_proxy_event_callback_add(data->view_proxy,
ELDBUS_PROXY_EVENT_PROPERTY_LOADED,
_props_loaded, eo);
return efl_finalize(efl_super(eo, MY_CLASS));
}
static void
_dbus_state_set_cb(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending)
{
Elm_App_Client_View *eo = data;
Elm_App_Client_View_Cb cb = eldbus_pending_data_del(pending, "cb");
void *user_data = eldbus_pending_data_del(pending, "user_data");
const char *error = NULL, *error_message = NULL;
if (!cb) return;
if (!eldbus_message_error_get(msg, &error, &error_message))
error_message = NULL;
cb(user_data, eo, error, error_message);
}
static void
_dbus_action_do(Eo *eo, Eldbus_Proxy *proxy, const char *action, Elm_App_Client_View_Cb cb, const void *data)
{
Eldbus_Pending *pending;
if (!cb)
{
eldbus_proxy_call(proxy, action, NULL, NULL, -1, "");
return;
}
pending = eldbus_proxy_call(proxy, action, _dbus_state_set_cb, eo, -1, "");
eldbus_pending_data_set(pending, "cb", cb);
eldbus_pending_data_set(pending, "user_data", data);
}
EOLIAN static void
_elm_app_client_view_resume(Eo *eo, Elm_App_Client_View_Data *data, Elm_App_Client_View_Cb cb, const void *user_data)
{
_dbus_action_do(eo, data->view_proxy, "Resume", cb, user_data);
}
EOLIAN static void
_elm_app_client_view_pause(Eo *eo, Elm_App_Client_View_Data *data, Elm_App_Client_View_Cb cb, const void *user_data)
{
_dbus_action_do(eo, data->view_proxy, "Pause", cb, user_data);
}
EOLIAN static void
_elm_app_client_view_close(Eo *eo, Elm_App_Client_View_Data *data, Elm_App_Client_View_Cb cb, const void *user_data)
{
_dbus_action_do(eo, data->view_proxy, "Close", cb, user_data);
}
EOLIAN static const char*
_elm_app_client_view_title_get(Eo *eo EINA_UNUSED, Elm_App_Client_View_Data *data)
{
Eina_Value *v;
v = eldbus_proxy_property_local_get(data->view_proxy, "Title");
return _string_prop_get(v);
}
EOLIAN static const char*
_elm_app_client_view_icon_get(Eo *eo EINA_UNUSED, Elm_App_Client_View_Data *data)
{
Eina_Value *v;
v = eldbus_proxy_property_local_get(data->view_proxy, "IconName");
return _string_prop_get(v);
}
EOLIAN static void
_elm_app_client_view_icon_pixels_get(Eo *obj EINA_UNUSED, Elm_App_Client_View_Data *pd EINA_UNUSED,
unsigned int *w EINA_UNUSED, unsigned int *h EINA_UNUSED,
Eina_Bool *has_alpha EINA_UNUSED, const unsigned char **pixels EINA_UNUSED)
{
//TODO
}
EOLIAN static unsigned short
_elm_app_client_view_progress_get(Eo *eo EINA_UNUSED, Elm_App_Client_View_Data *data)
{
Eina_Value *v;
v = eldbus_proxy_property_local_get(data->view_proxy, "Progress");
return _short_prop_get(v);
}
EOLIAN static int
_elm_app_client_view_new_events_get(Eo *eo EINA_UNUSED, Elm_App_Client_View_Data *data)
{
Eina_Value *v;
v = eldbus_proxy_property_local_get(data->view_proxy, "NewEvents");
return _int_prop_get(v);
}
EOLIAN static Elm_App_View_State
_elm_app_client_view_state_get(Eo *eo EINA_UNUSED, Elm_App_Client_View_Data *data)
{
return data->state;
}
EOLIAN static int
_elm_app_client_view_window_get(Eo *eo EINA_UNUSED, Elm_App_Client_View_Data *data)
{
Eina_Value *v;
v = eldbus_proxy_property_local_get(data->view_proxy, "WindowId");
return _int_prop_get(v);
}
EOLIAN static void
_elm_app_client_view_path_set(Eo *eo, Elm_App_Client_View_Data *data, const char *path)
{
if (efl_finalized_get(eo))
{
ERR("Can't set id after object has been created.");
return;
}
data->path = eina_stringshare_add(path);
}
EOLIAN static const char*
_elm_app_client_view_path_get(Eo *eo EINA_UNUSED, Elm_App_Client_View_Data *data)
{
Eldbus_Object *obj;
obj = eldbus_proxy_object_get(data->view_proxy);
return eldbus_object_path_get(obj);
}
EOLIAN static const char*
_elm_app_client_view_package_get(Eo *eo EINA_UNUSED, Elm_App_Client_View_Data *data)
{
Eldbus_Object *obj;
obj = eldbus_proxy_object_get(data->view_proxy);
return eldbus_object_bus_name_get(obj);
}
EOLIAN static void
_elm_app_client_view_efl_object_destructor(Eo *eo, Elm_App_Client_View_Data *data)
{
Eldbus_Object *obj;
Eldbus_Connection *conn;
eldbus_proxy_properties_monitor(data->view_proxy, EINA_FALSE);
obj = eldbus_proxy_object_get(data->view_proxy);
conn = eldbus_object_connection_get(obj);
eldbus_proxy_unref(data->view_proxy);
eldbus_object_unref(obj);
eldbus_connection_unref(conn);
eldbus_shutdown();
eina_stringshare_del(data->path);
efl_destructor(efl_super(eo, MY_CLASS));
}
#include "elm_app_client_view.eo.c"