efl/src/lib/elementary/elm_color_class.c

835 lines
28 KiB
C

#ifdef HAVE_CONFIG_H
# include "elementary_config.h"
#endif
#include <Elementary.h>
#include "elm_priv.h"
#include "elm_color_class.h"
#include "elm_colorselector_eo.h"
//static Eldbus_Proxy *cc_proxy;
//static Ecore_Event_Handler *h1;
//static Ecore_Event_Handler *h2;
typedef struct Colorclass
{
Eina_Stringshare *name;
struct {
unsigned char r, g, b, a;
} color[3];
Eina_Stringshare *desc;
} Colorclass;
typedef struct Colorclass_UI
{
EINA_INLIST;
Evas_Object *ly;
Evas_Object *gl;
Evas_Object *reset;
Evas_Object *cs;
//uint64_t winid;
Ecore_Timer *timer;
Colorclass *current; //actually Elm_Color_Overlay
unsigned int num; //color[num]
Eina_Bool changed : 1;
Eina_Bool change_reset : 1;
Eina_Bool exist : 1;
} Colorclass_UI;
#if 0
typedef enum
{
COLORCLASS_SIGNAL_EDIT,
COLORCLASS_SIGNAL_CHANGED,
COLORCLASS_SIGNAL_RESET,
} Colorclass_Signals;
static const Eldbus_Signal colorclass_editor_signals[] =
{
[COLORCLASS_SIGNAL_EDIT] = {"Edit", ELDBUS_ARGS({"t", "Window ID"}), 0},
[COLORCLASS_SIGNAL_CHANGED] = {"Changed", ELDBUS_ARGS({"t", "Window ID"}, {"s", "Color class name"}, {"a(iiii)", "Colors"}), 0},
[COLORCLASS_SIGNAL_RESET] = {"Reset", ELDBUS_ARGS({"t", "Window ID"}, {"b", "Color class name"}), 0},
{NULL, NULL, 0}
};
static Eina_Inlist *remote_ccuis;
static Eldbus_Service_Interface *remote_iface;
#endif
static Elm_Color_Class_Name_Cb tl_cb;
static Elm_Color_Class_List_Cb list_cb;
static int
_colorclass_sort(Elm_Object_Item *a, Elm_Object_Item *b)
{
Edje_Color_Class *a1, *b1;
a1 = elm_object_item_data_get(a);
b1 = elm_object_item_data_get(b);
return strcmp(a1->name, b1->name);
}
static void
_colorclass_cc_update(Colorclass_UI *cc, int num)
{
char buf[128];
snprintf(buf, sizeof(buf), "elm_colorclass_color%d", num + 1);
edje_color_class_set(buf,
cc->current->color[num].r, cc->current->color[num].g, cc->current->color[num].b, cc->current->color[num].a,
0, 0, 0, 0,
0, 0, 0, 0);
}
#if 0
static void
_dbus_signal_changed(Colorclass_UI *cc)
{
Eldbus_Message *msg;
Eldbus_Message_Iter *iter, *array, *struc;
int x;
msg = eldbus_service_signal_new(remote_iface, COLORCLASS_SIGNAL_CHANGED);
eldbus_message_arguments_append(msg, "t", cc->winid);
eldbus_message_arguments_append(msg, "s", cc->current->name);
iter = eldbus_message_iter_get(msg);
array = eldbus_message_iter_container_new(iter, 'a', "(iiii)");
for (x = 0; x < 3; x++)
{
eldbus_message_iter_arguments_append(array, "(iiii)", &struc);
eldbus_message_iter_arguments_append(struc, "iiii",
cc->current->color[x].r, cc->current->color[x].g, cc->current->color[x].b, cc->current->color[x].a);
eldbus_message_iter_container_close(array, struc);
}
eldbus_message_iter_container_close(iter, array);
eldbus_service_signal_send(remote_iface, msg);
}
#endif
static void
_colorclass_select(void *data, Evas_Object *obj EINA_UNUSED, const char *sig, const char *src EINA_UNUSED)
{
Colorclass_UI *cc = data;
const char *s;
s = sig + sizeof("elm,colorclass,select,") - 1;
switch (s[0])
{
case '1':
cc->num = 0;
break;
case '2':
cc->num = 1;
break;
case '3':
cc->num = 2;
break;
}
elm_colorselector_color_set(cc->cs, cc->current->color[cc->num].r, cc->current->color[cc->num].g,
cc->current->color[cc->num].b, cc->current->color[cc->num].a);
}
static void
_colorclass_changed(void *data, const Efl_Event *event EINA_UNUSED)
{
Colorclass_UI *cc = data;
elm_colorselector_color_get(cc->cs, (int*)&cc->current->color[cc->num].r, (int*)&cc->current->color[cc->num].g,
(int*)&cc->current->color[cc->num].b, (int*)&cc->current->color[cc->num].a);
//if (cc->winid && remote_iface)
//_dbus_signal_changed(cc);
//else
edje_color_class_set(cc->current->name,
cc->current->color[0].r, cc->current->color[0].g, cc->current->color[0].b, cc->current->color[0].a,
cc->current->color[1].r, cc->current->color[1].g, cc->current->color[1].b, cc->current->color[1].a,
cc->current->color[2].r, cc->current->color[2].g, cc->current->color[2].b, cc->current->color[2].a);
edje_color_class_set("elm_colorclass_text",
cc->current->color[0].r, cc->current->color[0].g, cc->current->color[0].b, cc->current->color[0].a,
cc->current->color[1].r, cc->current->color[1].g, cc->current->color[1].b, cc->current->color[1].a,
cc->current->color[2].r, cc->current->color[2].g, cc->current->color[2].b, cc->current->color[2].a);
_colorclass_cc_update(cc, cc->num);
cc->change_reset = 0;
cc->changed = 1;
}
static void
_colorclass_reset(void *data, const Efl_Event *event EINA_UNUSED)
{
Colorclass_UI *cc = data;
Colorclass color;
if (!cc->current)
{
efl_event_callback_stop(event->object);
return;
}
//if (cc->winid && remote_iface)
//{
//Eldbus_Message *msg;
//msg = eldbus_service_signal_new(remote_iface, COLORCLASS_SIGNAL_RESET);
//eldbus_message_arguments_append(msg, "t", cc->winid);
//eldbus_message_arguments_append(msg, "s", cc->current->name);
//eldbus_service_signal_send(remote_iface, msg);
//cc->change_reset = 1;
//efl_event_callback_stop(event->object);
//return;
//}
edje_color_class_del(cc->current->name);
edje_color_class_get(cc->current->name,
(int*)&color.color[0].r, (int*)&color.color[0].g, (int*)&color.color[0].b, (int*)&color.color[0].a,
(int*)&color.color[1].r, (int*)&color.color[1].g, (int*)&color.color[1].b, (int*)&color.color[1].a,
(int*)&color.color[2].r, (int*)&color.color[2].g, (int*)&color.color[2].b, (int*)&color.color[2].a);
cc->changed = !!memcmp(color.color, cc->current->color, sizeof(color.color));
cc->change_reset = 1;
memcpy(cc->current->color, color.color, sizeof(color.color));
edje_color_class_set("elm_colorclass_text",
color.color[0].r, color.color[0].g, color.color[0].b, color.color[0].a,
color.color[1].r, color.color[1].g, color.color[1].b, color.color[1].a,
color.color[2].r, color.color[2].g, color.color[2].b, color.color[2].a);
elm_colorselector_color_set(cc->cs, color.color[cc->num].r, color.color[cc->num].g,
color.color[cc->num].b, color.color[cc->num].a);
_colorclass_cc_update(cc, 0);
_colorclass_cc_update(cc, 1);
_colorclass_cc_update(cc, 2);
}
static void
_colorclass_activate(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
{
Colorclass_UI *cc = data;
Elm_Object_Item *it = event_info;
Edje_Color_Class *ecc;
Colorclass *lcc;
Eina_List *l;
ecc = elm_object_item_data_get(it);
EINA_LIST_FOREACH(_elm_config->color_overlays, l, lcc)
{
if (!eina_streq(lcc->name, ecc->name)) continue;
cc->current = lcc;
break;
}
if (cc->current)
{
_elm_config->color_overlays = eina_list_remove_list(_elm_config->color_overlays, l);
cc->exist = 1;
}
else
{
cc->current = calloc(1, sizeof(Colorclass)); //actually Elm_Color_Overlay
if (!cc->current) return;
memcpy(cc->current, ecc, sizeof(Elm_Color_Overlay));
cc->current->name = eina_stringshare_ref(ecc->name);
}
_colorclass_cc_update(cc, 0);
_colorclass_cc_update(cc, 1);
_colorclass_cc_update(cc, 2);
edje_color_class_set("elm_colorclass_text",
cc->current->color[0].r, cc->current->color[0].g, cc->current->color[0].b, cc->current->color[0].a,
cc->current->color[1].r, cc->current->color[1].g, cc->current->color[1].b, cc->current->color[1].a,
cc->current->color[2].r, cc->current->color[2].g, cc->current->color[2].b, cc->current->color[2].a);
elm_colorselector_color_set(cc->cs, cc->current->color[0].r, cc->current->color[0].g,
cc->current->color[0].b, cc->current->color[0].a);
elm_layout_signal_emit(cc->ly, "elm,colors,show", "elm");
}
static void
_colorclass_apply(Colorclass_UI *cc)
{
if ((cc->changed && (!cc->change_reset)) || cc->exist)
_elm_config->color_overlays = eina_list_prepend(_elm_config->color_overlays, cc->current);
else
{
eina_stringshare_del(cc->current->name);
free(cc->current);
}
}
static void
_colorclass_save(Colorclass_UI *cc)
{
if (cc->current)
{
_colorclass_apply(cc);
if (cc->changed || (cc->exist && cc->change_reset))
{
elm_config_save();
elm_config_all_flush();
}
}
}
static void
_colorclass_deactivate(void *data, Evas_Object *obj EINA_UNUSED, const char *sig EINA_UNUSED, const char *src EINA_UNUSED)
{
Colorclass_UI *cc = data;
_colorclass_save(cc);
cc->exist = cc->change_reset = cc->changed = 0;
cc->current = NULL;
cc->num = 0;
elm_layout_signal_emit(cc->ly, "elm,colors,hide", "elm");
elm_genlist_item_selected_set(elm_genlist_selected_item_get(cc->gl), 0);
}
static void
_colorclass_dismiss(void *data, Evas_Object *obj EINA_UNUSED, const char *sig EINA_UNUSED, const char *src EINA_UNUSED)
{
Colorclass_UI *cc = data;
evas_object_smart_callback_call(cc->ly, "dismissed", NULL);
}
static void
_colorclass_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Colorclass_UI *cc = data;
_colorclass_save(cc);
//if (cc->winid)
//remote_ccuis = eina_inlist_remove(remote_ccuis, EINA_INLIST_GET(cc));
//if (cc->winid && remote_iface && (!remote_ccuis))
//{
//Eldbus_Connection *conn;
//conn = eldbus_service_connection_get(remote_iface);
//eldbus_name_release(conn, ELM_COLOR_CLASS_METHOD_BASE, NULL, NULL);
//ELM_SAFE_FREE(remote_iface, eldbus_service_interface_unregister);
//eldbus_connection_unref(conn);
//}
free(cc);
}
static char *
_colorclass_text_get(Edje_Color_Class *ecc, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
{
if (ecc->desc && ecc->desc[0]) return strdup(ecc->desc);
return strdup(ecc->name ?: "");
}
static void
_colorclass_item_del(Edje_Color_Class *ecc, Evas_Object *obj EINA_UNUSED)
{
eina_stringshare_del(ecc->name);
eina_stringshare_del(ecc->desc);
free(ecc);
}
#if 0
static void
_dbus_request_name_cb(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED)
{
unsigned int flag;
Colorclass_UI *cc = data;
if (eldbus_message_error_get(msg, NULL, NULL) ||
(!eldbus_message_arguments_get(msg, "u", &flag)) ||
(!(flag & ELDBUS_NAME_REQUEST_REPLY_PRIMARY_OWNER)))
{
/* FIXME: translate */
elm_object_text_set(cc->ly, "The color editor could not assume ownership of the DBus interface.");
elm_object_signal_emit(cc->ly, "elm,state,info", "elm");
return;
}
if (cc->winid && remote_ccuis)
eldbus_service_signal_emit(remote_iface, COLORCLASS_SIGNAL_EDIT, cc->winid);
}
static Evas_Object *
_colorclass_find_win(uint64_t winid)
{
Evas_Object *win;
Eina_List *l;
pid_t pid = getpid();
EINA_LIST_FOREACH(_elm_win_list, l, win)
{
Ecore_Evas *ee;
const char *engine_name;
uint64_t id = elm_win_window_id_get(win);
ee = ecore_evas_ecore_evas_get(evas_object_evas_get(win));
engine_name = ecore_evas_engine_name_get(ee);
if (!strncmp(engine_name, "wayland", sizeof("wayland") - 1))
id = ((uint64_t)id << 32) + pid;
if (id == winid) return win;
}
return NULL;
}
static void
_dbus_edit_helper(Eldbus_Message_Iter *array, Colorclass *lcc)
{
Eldbus_Message_Iter *struc, *array2, *struc2;
int x;
char *desc = "";
eldbus_message_iter_arguments_append(array, "(ssa(iiii))", &struc);
if (lcc)
{
if (lcc->desc && lcc->desc[0])
desc = tl_cb ? tl_cb((char*)lcc->desc) : (char*)lcc->desc;
eldbus_message_iter_arguments_append(struc, "ss", lcc->name, desc);
}
else
eldbus_message_iter_arguments_append(struc, "ss", "", desc);
array2 = eldbus_message_iter_container_new(struc, 'a', "(iiii)");
for (x = 0; x < 3; x++)
{
eldbus_message_iter_arguments_append(array2, "(iiii)", &struc2);
if (lcc)
eldbus_message_iter_arguments_append(struc2, "iiii",
lcc->color[x].r, lcc->color[x].g, lcc->color[x].b, lcc->color[x].a);
else
eldbus_message_iter_arguments_append(struc2, "iiii", 0, 0, 0, 0);
eldbus_message_iter_container_close(array2, struc2);
}
eldbus_message_iter_container_close(struc, array2);
eldbus_message_iter_container_close(array, struc);
}
static Eina_Bool
_dbus_edit(void *d EINA_UNUSED, int t EINA_UNUSED, Elementary_Colorclass_Edit_Data *ev)
{
Evas_Object *win;
Eldbus_Message *msg;
Eldbus_Message_Iter *iter, *array;
Eina_Iterator *it;
Eina_List *eccs = NULL;
win = _colorclass_find_win(ev->winid);
if (!win) return ECORE_CALLBACK_RENEW;
msg = eldbus_proxy_method_call_new(cc_proxy, "SendCC");
iter = eldbus_message_iter_get(msg);
eldbus_message_arguments_append(msg, "t", ev->winid);
eldbus_message_arguments_append(msg, "b", 0);
iter = eldbus_message_iter_get(msg);
array = eldbus_message_iter_container_new(iter, 'a', "(ssa(iiii))");
if (list_cb)
eccs = list_cb();
it = edje_color_class_active_iterator_new();
if (it || eccs)
{
Edje_Color_Class *ecc;
Eina_Hash *test = NULL;
if (it && eccs)
test = eina_hash_string_superfast_new(NULL);
if (it)
{
EINA_ITERATOR_FOREACH(it, ecc)
{
if (test)
eina_hash_add(test, ecc->name, ecc);
_dbus_edit_helper(array, (Colorclass*)ecc);
}
}
EINA_LIST_FREE(eccs, ecc)
{
if (test && (!eina_hash_find(test, ecc->name)))
{
eina_hash_add(test, ecc->name, ecc);
_dbus_edit_helper(array, (Colorclass*)ecc);
}
}
eina_hash_free(test);
}
else
_dbus_edit_helper(array, NULL);
eldbus_message_iter_container_close(iter, array);
eina_iterator_free(it);
eldbus_proxy_send(cc_proxy, msg, NULL, NULL, -1);
return ECORE_CALLBACK_RENEW;
}
static Eina_Bool
_dbus_changed(void *d EINA_UNUSED, int t EINA_UNUSED, Elementary_Colorclass_Changed_Data *ev)
{
Eina_Value idv, array;
uint64_t id;
char *name;
Evas_Object *win;
unsigned int i;
int color[3][4];
eina_value_struct_value_get(ev->value, "arg0", &idv);
eina_value_get(&idv, &id);
win = _colorclass_find_win(id);
eina_value_flush(&idv);
if (!win) return ECORE_CALLBACK_RENEW;
eina_value_struct_value_get(ev->value, "arg1", &idv);
eina_value_get(&idv, &name);
eina_value_struct_value_get(ev->value, "arg2", &array);
if (eina_value_array_count(&array) != 3)
{
ERR("Someone is failing at sending color class data over dbus!");
goto out;
}
for (i = 0; i < eina_value_array_count(&array); i++)
{
Eina_Value struc2, c;
eina_value_array_value_get(&array, i, &struc2);
eina_value_struct_value_get(&struc2, "arg0", &c);
eina_value_get(&c, &color[i][0]);
eina_value_struct_value_get(&struc2, "arg1", &c);
eina_value_get(&c, &color[i][1]);
eina_value_struct_value_get(&struc2, "arg2", &c);
eina_value_get(&c, &color[i][2]);
eina_value_struct_value_get(&struc2, "arg3", &c);
eina_value_get(&c, &color[i][3]);
eina_value_flush(&c);
eina_value_flush(&struc2);
}
edje_color_class_set(name, color[0][0], color[0][1], color[0][2], color[0][3],
color[1][0], color[1][1], color[1][2], color[1][3],
color[2][0], color[2][1], color[2][2], color[2][3]);
out:
eina_value_flush(&idv);
eina_value_flush(&array);
return ECORE_CALLBACK_RENEW;
}
static Eina_Bool
_dbus_reset(void *d EINA_UNUSED, int t EINA_UNUSED, Elementary_Colorclass_Reset_Data *ev)
{
Evas_Object *win;
Eldbus_Message *msg;
Eldbus_Message_Iter *iter, *array;
Colorclass color;
win = _colorclass_find_win(ev->winid);
if (!win) return ECORE_CALLBACK_RENEW;
msg = eldbus_proxy_method_call_new(cc_proxy, "SendCC");
iter = eldbus_message_iter_get(msg);
eldbus_message_arguments_append(msg, "t", ev->winid);
eldbus_message_arguments_append(msg, "b", 1);
iter = eldbus_message_iter_get(msg);
array = eldbus_message_iter_container_new(iter, 'a', "(ssa(iiii))");
color.name = ev->name;
color.desc = NULL;
edje_color_class_del(ev->name);
edje_color_class_get(ev->name,
(int*)&color.color[0].r, (int*)&color.color[0].g, (int*)&color.color[0].b, (int*)&color.color[0].a,
(int*)&color.color[1].r, (int*)&color.color[1].g, (int*)&color.color[1].b, (int*)&color.color[1].a,
(int*)&color.color[2].r, (int*)&color.color[2].g, (int*)&color.color[2].b, (int*)&color.color[2].a);
_dbus_edit_helper(array, &color);
eldbus_message_iter_container_close(iter, array);
eldbus_proxy_send(cc_proxy, msg, NULL, NULL, -1);
return ECORE_CALLBACK_RENEW;
}
#endif
static Elm_Genlist_Item_Class itc =
{
.item_style = "default",
.func = {
.text_get = (Elm_Genlist_Item_Text_Get_Cb)_colorclass_text_get,
.del = (Elm_Genlist_Item_Del_Cb)_colorclass_item_del
},
.version = ELM_GENLIST_ITEM_CLASS_VERSION
};
#if 0
static Colorclass_UI *
_dbus_ccui_find(uint64_t winid)
{
Colorclass_UI *cc;
EINA_INLIST_FOREACH(remote_ccuis, cc)
if (cc->winid == winid)
return cc;
return NULL;
}
static Eldbus_Message *
_dbus_close(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
{
Colorclass_UI *cc;
uint64_t winid;
if (!eldbus_message_arguments_get(msg, "t", &winid))
return eldbus_message_method_return_new(msg);
cc = _dbus_ccui_find(winid);
if (cc)
{
evas_object_smart_callback_call(cc->ly, "application_closed", NULL);
ELM_SAFE_FREE(cc->timer, ecore_timer_del);
}
return eldbus_message_method_return_new(msg);
}
static Eldbus_Message *
_dbus_send_cc(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
{
Colorclass_UI *cc;
Eldbus_Message_Iter *array, *struc;
uint64_t winid;
Eina_Bool reset;
if (!eldbus_message_arguments_get(msg, "tba(ssa(iiii))", &winid, &reset, &array))
return eldbus_message_method_return_new(msg);
cc = _dbus_ccui_find(winid);
if (!cc)
return eldbus_message_method_return_new(msg);
ELM_SAFE_FREE(cc->timer, ecore_timer_del);
while (eldbus_message_iter_get_and_next(array, 'r', &struc))
{
Colorclass *ecc;
const char *name, *desc;
Eldbus_Message_Iter *array2, *struc2;
int i = 0;
eldbus_message_iter_arguments_get(struc, "ssa(iiii)", &name, &desc, &array2);
if ((!name[0]) && (!desc[0]) && (!elm_genlist_items_count(cc->gl)))
break;
ecc = malloc(sizeof(Colorclass));
ecc->name = eina_stringshare_add(name);
ecc->desc = eina_stringshare_add(desc);
while (eldbus_message_iter_get_and_next(array2, 'r', &struc2))
{
if (i > 2)
{
ERR("Someone failed at trying to send color class data!");
break;
}
eldbus_message_iter_arguments_get(struc2, "iiii",
&ecc->color[i].r, &ecc->color[i].g, &ecc->color[i].b, &ecc->color[i].a);
i++;
}
if (reset)
{
cc->changed = !!memcmp(ecc->color, cc->current->color, sizeof(ecc->color));
cc->change_reset = 1;
memcpy(cc->current->color, ecc->color, sizeof(ecc->color));
edje_color_class_set("elm_colorclass_text",
ecc->color[0].r, ecc->color[0].g, ecc->color[0].b, ecc->color[0].a,
ecc->color[1].r, ecc->color[1].g, ecc->color[1].b, ecc->color[1].a,
ecc->color[2].r, ecc->color[2].g, ecc->color[2].b, ecc->color[2].a);
elm_colorselector_color_set(cc->cs, ecc->color[cc->num].r, ecc->color[cc->num].g,
ecc->color[cc->num].b, ecc->color[cc->num].a);
_colorclass_cc_update(cc, 0);
_colorclass_cc_update(cc, 1);
_colorclass_cc_update(cc, 2);
free(ecc);
return eldbus_message_method_return_new(msg);
}
else
elm_genlist_item_sorted_insert(cc->gl, &itc, ecc, NULL, 0, (Eina_Compare_Cb)_colorclass_sort, NULL, NULL);
}
if (elm_genlist_items_count(cc->gl))
elm_object_signal_emit(cc->ly, "elm,state,loaded", "elm");
else
elm_object_text_set(cc->ly, "No color scheme available!");
return eldbus_message_method_return_new(msg);
}
static Eina_Bool
_dbus_timeout(Colorclass_UI *cc)
{
ELM_SAFE_FREE(cc->timer, ecore_timer_del);
evas_object_smart_callback_call(cc->ly, "timeout", NULL);
/* FIXME: translate */
elm_object_text_set(cc->ly, "Application was unable to provide color scheme info");
return EINA_FALSE;
}
#endif
/* internal */ void
elm_color_class_init(void)
{
//eldbus_init();
//cc_proxy = elementary_colorclass_proxy_get(eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION), ELM_COLOR_CLASS_METHOD_BASE, NULL);
//h1 = ecore_event_handler_add(ELEMENTARY_COLORCLASS_EDIT_EVENT, (Ecore_Event_Handler_Cb)_dbus_edit, NULL);
//h2 = ecore_event_handler_add(ELEMENTARY_COLORCLASS_CHANGED_EVENT, (Ecore_Event_Handler_Cb)_dbus_changed, NULL);
//h2 = ecore_event_handler_add(ELEMENTARY_COLORCLASS_RESET_EVENT, (Ecore_Event_Handler_Cb)_dbus_reset, NULL);
}
void
elm_color_class_shutdown(void)
{
//Eldbus_Connection *conn = eldbus_object_connection_get(eldbus_proxy_object_get(cc_proxy));
//ELM_SAFE_FREE(cc_proxy, eldbus_proxy_unref);
//eldbus_connection_unref(conn);
//ecore_event_handler_del(h1);
//ecore_event_handler_del(h2);
//h1 = h2 = NULL;
//eldbus_shutdown();
}
#if 0
static const Eldbus_Method colorclass_editor_methods[] =
{
{ "SendCC", ELDBUS_ARGS({"t", "Window ID"}, {"b", "reset"}, {"a(ssa(iiii))", "Array of color classes"}), NULL, _dbus_send_cc, 0},
{ "Close", ELDBUS_ARGS({"t", "Window ID"}), NULL, _dbus_close, 0},
{NULL, NULL, NULL, NULL, 0}
};
static const Eldbus_Service_Interface_Desc base_desc =
{
ELM_COLOR_CLASS_METHOD_BASE, colorclass_editor_methods, colorclass_editor_signals, NULL, NULL, NULL
};
#endif
EAPI Evas_Object *
elm_color_class_editor_add(Evas_Object *obj)
{
Evas_Object *ly, *bt, *gl, *cs;
Colorclass_UI *cc;
Edje_Color_Class *ecc, *ecc2;
Eina_Iterator *it;
Eina_Hash *test = NULL;
Eina_List *ccs = NULL;
cc = calloc(1, sizeof(Colorclass_UI));
if (!cc) return NULL;
//if (!winid)
{
it = edje_color_class_active_iterator_new();
EINA_ITERATOR_FOREACH(it, ecc)
{
Colorclass *lcc;
ecc2 = malloc(sizeof(Edje_Color_Class));
if (!ecc2) continue;
memcpy(ecc2, ecc, sizeof(Edje_Color_Class));
ecc2->name = eina_stringshare_add(ecc->name);
if (tl_cb)
ecc2->desc = eina_stringshare_add(tl_cb((char*)ecc->desc));
else
ecc2->desc = eina_stringshare_add(ecc->desc);
if (list_cb && (!test))
test = eina_hash_string_superfast_new(NULL);
if (test)
eina_hash_add(test, ecc->name, ecc2);
lcc = (Colorclass*)ecc;
edje_color_class_set(lcc->name,
lcc->color[0].r, lcc->color[0].g, lcc->color[0].b, lcc->color[0].a,
lcc->color[1].r, lcc->color[1].g, lcc->color[1].b, lcc->color[1].a,
lcc->color[2].r, lcc->color[2].g, lcc->color[2].b, lcc->color[2].a);
ccs = eina_list_append(ccs, ecc2);
}
eina_iterator_free(it);
}
#if 0
else
{
if (!remote_iface)
{
Eldbus_Connection *dbus_conn;
dbus_conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION);
eldbus_name_request(dbus_conn, ELM_COLOR_CLASS_METHOD_BASE, ELDBUS_NAME_REQUEST_FLAG_DO_NOT_QUEUE,
_dbus_request_name_cb, cc);
remote_iface = eldbus_service_interface_register(dbus_conn, "/", &base_desc);
}
cc->timer = ecore_timer_add(1.5, (Ecore_Task_Cb)_dbus_timeout, cc);
remote_ccuis = eina_inlist_append(remote_ccuis, EINA_INLIST_GET(cc));
}
cc->winid = winid;
#endif
cc->ly = ly = elm_layout_add(obj);
if (!elm_layout_theme_set(ly, "layout", "colorclass", "base"))
CRI("Failed to set layout!");
elm_layout_signal_callback_add(ly, "elm,colorclass,select,*", "elm", _colorclass_select, cc);
elm_layout_signal_callback_add(ly, "elm,colorclass,deactivate", "elm", _colorclass_deactivate, cc);
elm_layout_signal_callback_add(ly, "elm,colorclass,dismiss", "elm", _colorclass_dismiss, cc);
evas_object_event_callback_add(ly, EVAS_CALLBACK_DEL, _colorclass_del, cc);
cc->gl = gl = elm_genlist_add(ly);
elm_genlist_homogeneous_set(gl, 1);
elm_scroller_bounce_set(gl, 0, 0);
elm_scroller_policy_set(gl, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
elm_genlist_mode_set(gl, ELM_LIST_COMPRESS);
elm_object_part_content_set(ly, "elm.swallow.list", gl);
evas_object_smart_callback_add(gl, "selected", _colorclass_activate, cc);
cc->reset = bt = elm_button_add(ly);
elm_object_style_set(bt, "colorclass");
/* FIXME: translate */
elm_object_text_set(bt, "Reset");
elm_object_part_content_set(ly, "elm.swallow.reset", bt);
efl_event_callback_add
(bt, EFL_INPUT_EVENT_CLICKED, _colorclass_reset, cc);
cc->cs = cs = elm_colorselector_add(ly);
elm_colorselector_mode_set(cs, ELM_COLORSELECTOR_COMPONENTS);
elm_object_part_content_set(ly, "elm.swallow.colors", cs);
efl_event_callback_add
(cs, ELM_COLORSELECTOR_EVENT_CHANGED_USER, _colorclass_changed, cc);
EINA_LIST_FREE(ccs, ecc)
elm_genlist_item_append(gl, &itc, ecc, NULL, 0, NULL, NULL);
//if (winid)
//{
///* FIXME: translate */
//elm_object_text_set(ly, "Loading color scheme...");
//elm_object_signal_emit(ly, "elm,state,info", "elm");
//elm_object_signal_emit(ly, "elm,state,remote", "elm");
//}
//else
if (list_cb)
{
ccs = list_cb();
EINA_LIST_FREE(ccs, ecc)
{
if (test)
{
if (eina_hash_find(test, ecc->name))
{
eina_stringshare_del(ecc->name);
eina_stringshare_del(ecc->desc);
free(ecc);
continue;
}
eina_hash_add(test, ecc->name, ecc);
}
elm_genlist_item_sorted_insert(gl, &itc, ecc, NULL, 0, (Eina_Compare_Cb)_colorclass_sort, NULL, NULL);
}
}
eina_hash_free(test);
return ly;
}
EAPI void
elm_color_class_translate_cb_set(Elm_Color_Class_Name_Cb cb)
{
tl_cb = cb;
}
EAPI void
elm_color_class_list_cb_set(Elm_Color_Class_List_Cb cb)
{
list_cb = cb;
}
EAPI Eina_List *
elm_color_class_util_edje_file_list(Eina_File *f)
{
Edje_Color_Class *ecc, *ecc2;
Eina_Iterator *it;
Eina_List *ret = NULL;
EINA_SAFETY_ON_NULL_RETURN_VAL(f, NULL);
it = edje_mmap_color_class_iterator_new(f);
if (!it) return NULL;
EINA_ITERATOR_FOREACH(it, ecc)
{
ecc2 = malloc(sizeof(Edje_Color_Class));
if (!ecc2) continue;
memcpy(ecc2, ecc, sizeof(Edje_Color_Class));
ecc2->name = eina_stringshare_add(ecc->name);
if (tl_cb)
ecc2->desc = eina_stringshare_add(tl_cb((char*)ecc->desc));
else
ecc2->desc = eina_stringshare_add(ecc->desc);
ret = eina_list_append(ret, ecc2);
}
eina_iterator_free(it);
return ret;
}