forked from enlightenment/enlightenment
Luncher: Add the second gadget to luncher: Luncher Grid.
Use this gadget on your desktop for a grid of icons to be used to launch applications. The grid is simply a launcher and doesn't have all of the features that the bar has such as iconify, taskbar, styles, etc... Please make sure to update your efl with this to get the related theme updates.
This commit is contained in:
parent
5898477cee
commit
57f854bc59
|
@ -15,6 +15,7 @@ src_modules_luncher_module_la_LDFLAGS = $(MOD_LDFLAGS)
|
||||||
src_modules_luncher_module_la_SOURCES = src/modules/luncher/mod.c \
|
src_modules_luncher_module_la_SOURCES = src/modules/luncher/mod.c \
|
||||||
src/modules/luncher/luncher.h \
|
src/modules/luncher/luncher.h \
|
||||||
src/modules/luncher/bar.c \
|
src/modules/luncher/bar.c \
|
||||||
|
src/modules/luncher/grid.c \
|
||||||
src/modules/luncher/config.c
|
src/modules/luncher/config.c
|
||||||
|
|
||||||
PHONIES += luncher install-luncher
|
PHONIES += luncher install-luncher
|
||||||
|
|
|
@ -918,7 +918,8 @@ _bar_icon_add(Instance *inst, Efreet_Desktop *desktop, E_Client *non_desktop_cli
|
||||||
snprintf(ori, sizeof(ori), "e,state,off,%s", _bar_location_get(inst));
|
snprintf(ori, sizeof(ori), "e,state,off,%s", _bar_location_get(inst));
|
||||||
elm_layout_signal_emit(ic->o_layout, ori, "e");
|
elm_layout_signal_emit(ic->o_layout, ori, "e");
|
||||||
msg = alloca(sizeof(Edje_Message_Int_Set));
|
msg = alloca(sizeof(Edje_Message_Int_Set));
|
||||||
msg->str = strdup(inst->cfg->style);
|
if (inst->cfg->style)
|
||||||
|
msg->str = strdup(inst->cfg->style);
|
||||||
edje_object_message_send(elm_layout_edje_get(ic->o_layout), EDJE_MESSAGE_STRING, 1, msg);
|
edje_object_message_send(elm_layout_edje_get(ic->o_layout), EDJE_MESSAGE_STRING, 1, msg);
|
||||||
|
|
||||||
ic->o_icon = elm_icon_add(ic->o_layout);
|
ic->o_icon = elm_icon_add(ic->o_layout);
|
||||||
|
@ -1074,9 +1075,8 @@ _bar_cb_client_remove(void *data EINA_UNUSED, int type EINA_UNUSED, E_Event_Clie
|
||||||
{
|
{
|
||||||
Icon *ic = NULL;
|
Icon *ic = NULL;
|
||||||
|
|
||||||
if (ev->ec)
|
if (!inst->bar) continue;
|
||||||
ic = _bar_icon_match(inst, ev->ec);
|
if (ev->ec) ic = _bar_icon_match(inst, ev->ec);
|
||||||
|
|
||||||
if (ic)
|
if (ic)
|
||||||
{
|
{
|
||||||
if (ic->starting) elm_layout_signal_emit(ic->o_layout, "e,state,started", "e");
|
if (ic->starting) elm_layout_signal_emit(ic->o_layout, "e,state,started", "e");
|
||||||
|
@ -1117,6 +1117,7 @@ _bar_cb_exec_del(void *data EINA_UNUSED, int type EINA_UNUSED, E_Exec_Instance *
|
||||||
{
|
{
|
||||||
Icon *ic = NULL;
|
Icon *ic = NULL;
|
||||||
|
|
||||||
|
if (!inst->bar) continue;
|
||||||
if (ex->desktop)
|
if (ex->desktop)
|
||||||
{
|
{
|
||||||
ic = eina_hash_find(inst->icons_desktop_hash, ex->desktop->orig_path);
|
ic = eina_hash_find(inst->icons_desktop_hash, ex->desktop->orig_path);
|
||||||
|
@ -1181,8 +1182,8 @@ _bar_cb_exec_client_prop(void *data EINA_UNUSED, int type EINA_UNUSED, E_Event_C
|
||||||
Icon *ic = NULL;
|
Icon *ic = NULL;
|
||||||
char ori[32];
|
char ori[32];
|
||||||
|
|
||||||
|
if (!inst->bar) continue;
|
||||||
ic = _bar_icon_match(inst, ev->ec);
|
ic = _bar_icon_match(inst, ev->ec);
|
||||||
|
|
||||||
if (skip && !ic) continue;
|
if (skip && !ic) continue;
|
||||||
if (!skip)
|
if (!skip)
|
||||||
{
|
{
|
||||||
|
@ -1275,9 +1276,8 @@ _bar_cb_exec_new(void *data EINA_UNUSED, int type, E_Exec_Instance *ex)
|
||||||
Icon *ic = NULL;
|
Icon *ic = NULL;
|
||||||
char ori[32];
|
char ori[32];
|
||||||
|
|
||||||
if (ec)
|
if (!inst->bar) continue;
|
||||||
ic = _bar_icon_match(inst, ec);
|
if (ec) ic = _bar_icon_match(inst, ec);
|
||||||
|
|
||||||
if (ic)
|
if (ic)
|
||||||
{
|
{
|
||||||
if (skip) continue;
|
if (skip) continue;
|
||||||
|
@ -1519,6 +1519,7 @@ _bar_cb_update_icons(EINA_UNUSED void *data, EINA_UNUSED int ev_type, EINA_UNUSE
|
||||||
|
|
||||||
EINA_LIST_FOREACH(luncher_instances, l, inst)
|
EINA_LIST_FOREACH(luncher_instances, l, inst)
|
||||||
{
|
{
|
||||||
|
if (!inst->bar) continue;
|
||||||
if (inst->resize_job) return ECORE_CALLBACK_RENEW;
|
if (inst->resize_job) return ECORE_CALLBACK_RENEW;
|
||||||
inst->resize_job = ecore_job_add(_bar_resize_job, inst);
|
inst->resize_job = ecore_job_add(_bar_resize_job, inst);
|
||||||
}
|
}
|
||||||
|
@ -1922,6 +1923,7 @@ bar_create(Evas_Object *parent, int *id, E_Gadget_Site_Orient orient EINA_UNUSED
|
||||||
*id = inst->cfg->id;
|
*id = inst->cfg->id;
|
||||||
inst->inside = EINA_FALSE;
|
inst->inside = EINA_FALSE;
|
||||||
inst->effect = EINA_FALSE;
|
inst->effect = EINA_FALSE;
|
||||||
|
inst->bar = EINA_TRUE;
|
||||||
inst->icons_desktop_hash = eina_hash_string_superfast_new(NULL);
|
inst->icons_desktop_hash = eina_hash_string_superfast_new(NULL);
|
||||||
inst->icons_clients_hash = eina_hash_pointer_new(NULL);
|
inst->icons_clients_hash = eina_hash_pointer_new(NULL);
|
||||||
inst->o_main = elm_layout_add(parent);
|
inst->o_main = elm_layout_add(parent);
|
||||||
|
|
|
@ -0,0 +1,789 @@
|
||||||
|
#include "luncher.h"
|
||||||
|
static Eina_List *handlers;
|
||||||
|
static Elm_Gengrid_Item_Class _grid_icon_class;
|
||||||
|
static void _grid_resize_job(void *data);
|
||||||
|
|
||||||
|
static void
|
||||||
|
_grid_aspect(Instance *inst)
|
||||||
|
{
|
||||||
|
Evas_Coord w, h, square, root, cell, size;
|
||||||
|
|
||||||
|
evas_object_size_hint_aspect_set(inst->o_main, EVAS_ASPECT_CONTROL_BOTH, 1, 1);
|
||||||
|
if (!eina_list_count(inst->icons))
|
||||||
|
return;
|
||||||
|
evas_object_geometry_get(inst->o_main, 0, 0, &w, &h);
|
||||||
|
size = 0;
|
||||||
|
if ((w + h) > 1)
|
||||||
|
{
|
||||||
|
square = w + h;
|
||||||
|
size = floor((square / eina_list_count(inst->icons)));
|
||||||
|
}
|
||||||
|
inst->size = size;
|
||||||
|
elm_gengrid_item_size_set(inst->o_icon_con, size, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Eina_Bool
|
||||||
|
_grid_check_modifiers(Evas_Modifier *modifiers)
|
||||||
|
{
|
||||||
|
if ((evas_key_modifier_is_set(modifiers, "Alt")) ||
|
||||||
|
(evas_key_modifier_is_set(modifiers, "Control")) ||
|
||||||
|
(evas_key_modifier_is_set(modifiers, "Shift")))
|
||||||
|
return EINA_TRUE;
|
||||||
|
return EINA_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Evas_Object *
|
||||||
|
_grid_gadget_configure(Evas_Object *g)
|
||||||
|
{
|
||||||
|
if (!luncher_config) return NULL;
|
||||||
|
if (luncher_config->config_dialog) return NULL;
|
||||||
|
Instance *inst = evas_object_data_get(g, "instance");
|
||||||
|
return config_luncher(e_zone_current_get(), inst, EINA_TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_grid_instance_watch(void *data, E_Exec_Instance *ex, E_Exec_Watch_Type type)
|
||||||
|
{
|
||||||
|
Icon *ic = data;
|
||||||
|
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case E_EXEC_WATCH_STARTED:
|
||||||
|
if (ic->starting) elm_layout_signal_emit(ic->o_layout, "e,state,started", "e");
|
||||||
|
ic->starting = EINA_FALSE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_grid_icon_del(Instance *inst, Icon *ic)
|
||||||
|
{
|
||||||
|
inst->icons = eina_list_remove(inst->icons, ic);
|
||||||
|
evas_object_del(ic->o_icon);
|
||||||
|
evas_object_del(ic->o_overlay);
|
||||||
|
evas_object_del(ic->o_layout);
|
||||||
|
if (ic->desktop)
|
||||||
|
efreet_desktop_unref(ic->desktop);
|
||||||
|
eina_stringshare_del(ic->icon);
|
||||||
|
eina_stringshare_del(ic->key);
|
||||||
|
if (ic->exec)
|
||||||
|
e_exec_instance_watcher_del(ic->exec, _grid_instance_watch, ic);
|
||||||
|
ic->exec = NULL;
|
||||||
|
_grid_aspect(inst);
|
||||||
|
E_FREE(ic);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_grid_icon_drag_done(E_Drag *drag, int dropped)
|
||||||
|
{
|
||||||
|
Instance *inst = e_object_data_get(E_OBJECT(drag));
|
||||||
|
|
||||||
|
efreet_desktop_unref(drag->data);
|
||||||
|
if (!inst) return;
|
||||||
|
evas_object_smart_callback_call(e_gadget_site_get(inst->o_main), "gadget_site_unlocked", NULL);
|
||||||
|
if (!dropped)
|
||||||
|
grid_recalculate(inst);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_grid_icon_mouse_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_data)
|
||||||
|
{
|
||||||
|
Icon *ic = data;
|
||||||
|
Evas_Event_Mouse_Move *ev = event_data;
|
||||||
|
int dx, dy;
|
||||||
|
|
||||||
|
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
|
||||||
|
if (_grid_check_modifiers(ev->modifiers)) return;
|
||||||
|
|
||||||
|
if (!ic->drag.start) return;
|
||||||
|
|
||||||
|
dx = ev->cur.output.x - ic->drag.x;
|
||||||
|
dy = ev->cur.output.y - ic->drag.y;
|
||||||
|
if (((dx * dx) + (dy * dy)) >
|
||||||
|
(e_config->drag_resist * e_config->drag_resist))
|
||||||
|
{
|
||||||
|
E_Drag *d;
|
||||||
|
Evas_Object *o;
|
||||||
|
Evas_Coord x, y, w, h;
|
||||||
|
unsigned int size;
|
||||||
|
const char *drag_types[] = { "enlightenment/desktop" };
|
||||||
|
|
||||||
|
ic->drag.dnd = 1;
|
||||||
|
ic->drag.start = 0;
|
||||||
|
|
||||||
|
evas_object_geometry_get(ic->o_icon, &x, &y, &w, &h);
|
||||||
|
d = e_drag_new(x, y, drag_types, 1,
|
||||||
|
ic->desktop, -1, NULL, _grid_icon_drag_done);
|
||||||
|
d->button_mask = evas_pointer_button_down_mask_get(e_comp->evas);
|
||||||
|
efreet_desktop_ref(ic->desktop);
|
||||||
|
size = MAX(w, h);
|
||||||
|
o = e_util_desktop_icon_add(ic->desktop, size, e_drag_evas_get(d));
|
||||||
|
e_drag_object_set(d, o);
|
||||||
|
|
||||||
|
e_drag_resize(d, w, h);
|
||||||
|
e_drag_start(d, ic->drag.x, ic->drag.y);
|
||||||
|
e_object_data_set(E_OBJECT(d), ic->inst);
|
||||||
|
if (ic->in_order)
|
||||||
|
e_order_remove(ic->inst->order, ic->desktop);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static Eina_Bool
|
||||||
|
_grid_drag_timer(void *data)
|
||||||
|
{
|
||||||
|
Icon *ic = data;
|
||||||
|
|
||||||
|
ic->drag_timer = NULL;
|
||||||
|
ic->drag.start = 1;
|
||||||
|
evas_object_smart_callback_call(e_gadget_site_get(ic->inst->o_main), "gadget_site_locked", NULL);
|
||||||
|
return EINA_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_grid_icon_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_data)
|
||||||
|
{
|
||||||
|
Icon *ic = data;
|
||||||
|
Evas_Event_Mouse_Up *ev = event_data;
|
||||||
|
|
||||||
|
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
|
||||||
|
if (_grid_check_modifiers(ev->modifiers)) return;
|
||||||
|
|
||||||
|
if (ev->button == 1)
|
||||||
|
{
|
||||||
|
ic->drag.x = ev->output.x;
|
||||||
|
ic->drag.y = ev->output.y;
|
||||||
|
E_FREE_FUNC(ic->drag_timer, ecore_timer_del);
|
||||||
|
ic->drag_timer = ecore_timer_add(.35, _grid_drag_timer, ic);
|
||||||
|
}
|
||||||
|
if (ev->button == 3)
|
||||||
|
{
|
||||||
|
e_gadget_configure(ic->inst->o_main);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_grid_icon_mouse_up(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_data)
|
||||||
|
{
|
||||||
|
Icon *ic = data;
|
||||||
|
Evas_Event_Mouse_Up *ev = event_data;
|
||||||
|
|
||||||
|
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
|
||||||
|
if (_grid_check_modifiers(ev->modifiers)) return;
|
||||||
|
|
||||||
|
if (ev->button == 1)
|
||||||
|
{
|
||||||
|
E_FREE_FUNC(ic->drag_timer, ecore_timer_del);
|
||||||
|
if (ic->drag.dnd)
|
||||||
|
{
|
||||||
|
ic->drag.start = 0;
|
||||||
|
ic->drag.dnd = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ev->button == 1 && ic->desktop)
|
||||||
|
{
|
||||||
|
if (ic->desktop->type == EFREET_DESKTOP_TYPE_APPLICATION)
|
||||||
|
{
|
||||||
|
E_Exec_Instance *ex;
|
||||||
|
|
||||||
|
ex = e_exec(e_zone_current_get(), ic->desktop, NULL, NULL, "luncher");
|
||||||
|
ic->exec = ex;
|
||||||
|
e_exec_instance_watcher_add(ex, _grid_instance_watch, ic);
|
||||||
|
if (!ic->starting) elm_layout_signal_emit(ic->o_layout, "e,state,starting", "e");
|
||||||
|
ic->starting = EINA_TRUE;
|
||||||
|
}
|
||||||
|
else if (ic->desktop->type == EFREET_DESKTOP_TYPE_LINK)
|
||||||
|
{
|
||||||
|
if (!strncasecmp(ic->desktop->url, "file:", 5))
|
||||||
|
{
|
||||||
|
E_Action *act;
|
||||||
|
|
||||||
|
act = e_action_find("fileman");
|
||||||
|
if (act)
|
||||||
|
act->func.go(NULL, ic->desktop->url + 5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_grid_icon_mouse_in(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_data)
|
||||||
|
{
|
||||||
|
Icon *ic = data;
|
||||||
|
Evas_Event_Mouse_In *ev = event_data;
|
||||||
|
|
||||||
|
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
|
||||||
|
if (_grid_check_modifiers(ev->modifiers)) return;
|
||||||
|
|
||||||
|
evas_object_raise(ic->o_layout);
|
||||||
|
elm_object_tooltip_show(obj);
|
||||||
|
ic->active = EINA_TRUE;
|
||||||
|
elm_layout_signal_emit(ic->o_layout, "e,state,focused", "e");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_grid_icon_mouse_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_data EINA_UNUSED)
|
||||||
|
{
|
||||||
|
Icon *ic = data;
|
||||||
|
|
||||||
|
elm_object_tooltip_hide(obj);
|
||||||
|
elm_layout_signal_emit(ic->o_layout, "e,state,unfocused", "e");
|
||||||
|
}
|
||||||
|
|
||||||
|
static Evas_Object *
|
||||||
|
_gengrid_icon_get(void *data, Evas_Object *obj,
|
||||||
|
const char *part)
|
||||||
|
{
|
||||||
|
Icon *ic = data;
|
||||||
|
if (strcmp(part, "elm.swallow.icon"))
|
||||||
|
return NULL;
|
||||||
|
return ic->o_layout;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Icon *
|
||||||
|
_grid_icon_add(Instance *inst, Efreet_Desktop *desktop)
|
||||||
|
{
|
||||||
|
const char *path = NULL, *k = NULL;
|
||||||
|
char buf[4096];
|
||||||
|
int len = 0;
|
||||||
|
Icon *ic;
|
||||||
|
|
||||||
|
ic = E_NEW(Icon, 1);
|
||||||
|
if (desktop)
|
||||||
|
efreet_desktop_ref(desktop);
|
||||||
|
ic->desktop = desktop;
|
||||||
|
ic->inst = inst;
|
||||||
|
ic->preview = NULL;
|
||||||
|
ic->preview_box = NULL;
|
||||||
|
ic->mouse_in_timer = NULL;
|
||||||
|
ic->mouse_out_timer = NULL;
|
||||||
|
ic->active = EINA_FALSE;
|
||||||
|
ic->starting = EINA_FALSE;
|
||||||
|
ic->exec = NULL;
|
||||||
|
|
||||||
|
ic->o_layout = elm_layout_add(inst->o_icon_con);
|
||||||
|
e_theme_edje_object_set(ic->o_layout, "e/gadget/luncher/icon",
|
||||||
|
"e/gadget/luncher/icon");
|
||||||
|
E_FILL(ic->o_layout);
|
||||||
|
evas_object_show(ic->o_layout);
|
||||||
|
|
||||||
|
ic->o_icon = elm_icon_add(ic->o_layout);
|
||||||
|
E_EXPAND(ic->o_icon);
|
||||||
|
|
||||||
|
ic->o_overlay = elm_icon_add(ic->o_layout);
|
||||||
|
E_EXPAND(ic->o_overlay);
|
||||||
|
|
||||||
|
if (!desktop->icon)
|
||||||
|
path = NULL;
|
||||||
|
else if (strncmp(desktop->icon, "/", 1) && !ecore_file_exists(desktop->icon))
|
||||||
|
{
|
||||||
|
path = efreet_icon_path_find(e_config->icon_theme, desktop->icon, inst->size);
|
||||||
|
if (!path)
|
||||||
|
{
|
||||||
|
if (e_util_strcmp(e_config->icon_theme, "hicolor"))
|
||||||
|
path = efreet_icon_path_find("hicolor", desktop->icon, inst->size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (ecore_file_exists(desktop->icon))
|
||||||
|
{
|
||||||
|
path = desktop->icon;
|
||||||
|
}
|
||||||
|
if (!path)
|
||||||
|
{
|
||||||
|
snprintf(buf, sizeof(buf), "e/icons/%s", desktop->icon);
|
||||||
|
if (eina_list_count(e_theme_collection_items_find("base/theme/icons", buf)))
|
||||||
|
{
|
||||||
|
path = e_theme_edje_file_get("base/theme/icons", buf);
|
||||||
|
k = buf;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
path = e_theme_edje_file_get("base/theme/icons", "e/icons/unknown");
|
||||||
|
k = "e/icons/unknown";
|
||||||
|
}
|
||||||
|
if (path && desktop->icon && !k)
|
||||||
|
{
|
||||||
|
len = strlen(desktop->icon);
|
||||||
|
if ((len > 4) && (!strcasecmp(desktop->icon + len - 4, ".edj")))
|
||||||
|
k = "icon";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elm_image_file_set(ic->o_icon, path, k);
|
||||||
|
elm_object_tooltip_text_set(ic->o_icon, desktop->name);
|
||||||
|
elm_object_tooltip_orient_set(ic->o_icon, ELM_TOOLTIP_ORIENT_CENTER);
|
||||||
|
elm_object_tooltip_style_set(ic->o_icon, "luncher");
|
||||||
|
evas_object_size_hint_aspect_set(ic->o_icon, EVAS_ASPECT_CONTROL_BOTH, 1, 1);
|
||||||
|
elm_layout_content_set(ic->o_layout, "e.swallow.icon", ic->o_icon);
|
||||||
|
evas_object_event_callback_add(ic->o_icon, EVAS_CALLBACK_MOUSE_UP,
|
||||||
|
_grid_icon_mouse_up, ic);
|
||||||
|
evas_object_event_callback_priority_add(ic->o_icon, EVAS_CALLBACK_MOUSE_DOWN, 0,
|
||||||
|
_grid_icon_mouse_down, ic);
|
||||||
|
evas_object_event_callback_add(ic->o_icon, EVAS_CALLBACK_MOUSE_MOVE,
|
||||||
|
_grid_icon_mouse_move, ic);
|
||||||
|
evas_object_event_callback_add(ic->o_icon, EVAS_CALLBACK_MOUSE_IN,
|
||||||
|
_grid_icon_mouse_in, ic);
|
||||||
|
evas_object_event_callback_add(ic->o_icon, EVAS_CALLBACK_MOUSE_OUT,
|
||||||
|
_grid_icon_mouse_out, ic);
|
||||||
|
evas_object_show(ic->o_icon);
|
||||||
|
|
||||||
|
elm_image_file_set(ic->o_overlay, path, k);
|
||||||
|
evas_object_size_hint_aspect_set(ic->o_overlay, EVAS_ASPECT_CONTROL_BOTH, 1, 1);
|
||||||
|
elm_layout_content_set(ic->o_layout, "e.swallow.overlay", ic->o_overlay);
|
||||||
|
evas_object_show(ic->o_overlay);
|
||||||
|
|
||||||
|
elm_layout_sizing_eval(ic->o_layout);
|
||||||
|
|
||||||
|
elm_gengrid_item_append(inst->o_icon_con, &_grid_icon_class, ic, NULL, NULL);
|
||||||
|
_grid_aspect(inst);
|
||||||
|
|
||||||
|
return ic;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_grid_empty(Instance *inst)
|
||||||
|
{
|
||||||
|
if (inst->icons)
|
||||||
|
{
|
||||||
|
Icon *ic;
|
||||||
|
Eina_List *l;
|
||||||
|
|
||||||
|
elm_gengrid_clear(inst->o_icon_con);
|
||||||
|
EINA_LIST_FOREACH(inst->icons, l, ic)
|
||||||
|
_grid_icon_del(inst, ic);
|
||||||
|
eina_list_free(inst->icons);
|
||||||
|
inst->icons = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_grid_fill(Instance *inst)
|
||||||
|
{
|
||||||
|
Icon *ic;
|
||||||
|
|
||||||
|
if (inst->order)
|
||||||
|
{
|
||||||
|
Efreet_Desktop *desktop;
|
||||||
|
Eina_List *list;
|
||||||
|
|
||||||
|
EINA_LIST_FOREACH(inst->order->desktops, list, desktop)
|
||||||
|
{
|
||||||
|
ic = _grid_icon_add(inst, desktop);
|
||||||
|
ic->in_order = EINA_TRUE;
|
||||||
|
inst->icons = eina_list_append(inst->icons, ic);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_grid_resize_job(void *data)
|
||||||
|
{
|
||||||
|
Instance *inst = data;
|
||||||
|
Eina_List *l;
|
||||||
|
Icon *ic;
|
||||||
|
|
||||||
|
if (inst)
|
||||||
|
{
|
||||||
|
elm_layout_sizing_eval(inst->o_main);
|
||||||
|
_grid_aspect(inst);
|
||||||
|
EINA_LIST_FOREACH(inst->icons, l, ic)
|
||||||
|
{
|
||||||
|
const char *path = NULL, *key = NULL;
|
||||||
|
int len = 0;
|
||||||
|
|
||||||
|
if (ic->desktop)
|
||||||
|
{
|
||||||
|
if (!ic->desktop->icon)
|
||||||
|
path = NULL;
|
||||||
|
else if (strncmp(ic->desktop->icon, "/", 1) && !ecore_file_exists(ic->desktop->icon))
|
||||||
|
{
|
||||||
|
path = efreet_icon_path_find(e_config->icon_theme, ic->desktop->icon, inst->size);
|
||||||
|
if (!path)
|
||||||
|
{
|
||||||
|
if (e_util_strcmp(e_config->icon_theme, "hicolor"))
|
||||||
|
path = efreet_icon_path_find("hicolor", ic->desktop->icon, inst->size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (ecore_file_exists(ic->desktop->icon))
|
||||||
|
{
|
||||||
|
path = ic->desktop->icon;
|
||||||
|
}
|
||||||
|
if (!path)
|
||||||
|
{
|
||||||
|
elm_image_file_set(ic->o_icon, e_theme_edje_file_get("base/theme/icons", "e/icons/unknown"),
|
||||||
|
"e/icons/unknown");
|
||||||
|
elm_image_file_set(ic->o_overlay, e_theme_edje_file_get("base/theme/icons", "e/icons/unknown"),
|
||||||
|
"e/icons/unknown");
|
||||||
|
}
|
||||||
|
if (path && ic->desktop->icon)
|
||||||
|
{
|
||||||
|
len = strlen(ic->desktop->icon);
|
||||||
|
if ((len > 4) && (!strcasecmp(ic->desktop->icon + len - 4, ".edj")))
|
||||||
|
key = "icon";
|
||||||
|
|
||||||
|
elm_image_file_set(ic->o_icon, path, key);
|
||||||
|
elm_image_file_set(ic->o_overlay, path, key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (ic->icon)
|
||||||
|
{
|
||||||
|
if (strncmp(ic->icon, "/", 1) && !ecore_file_exists(ic->icon))
|
||||||
|
{
|
||||||
|
path = efreet_icon_path_find(e_config->icon_theme, ic->icon, inst->size);
|
||||||
|
if (!path)
|
||||||
|
{
|
||||||
|
if (e_util_strcmp(e_config->icon_theme, "hicolor"))
|
||||||
|
path = efreet_icon_path_find("hicolor", ic->icon, inst->size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (ecore_file_exists(ic->icon))
|
||||||
|
{
|
||||||
|
path = ic->icon;
|
||||||
|
}
|
||||||
|
if (!path)
|
||||||
|
{
|
||||||
|
elm_image_file_set(ic->o_icon, e_theme_edje_file_get("base/theme/icons", "e/icons/unknown"),
|
||||||
|
"e/icons/unknown");
|
||||||
|
elm_image_file_set(ic->o_overlay, e_theme_edje_file_get("base/theme/icons", "e/icons/unknown"),
|
||||||
|
"e/icons/unknown");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
elm_image_file_set(ic->o_icon, path, ic->key);
|
||||||
|
elm_image_file_set(ic->o_overlay, path, ic->key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
elm_image_file_set(ic->o_icon, e_theme_edje_file_get("base/theme/icons", "e/icons/unknown"),
|
||||||
|
"e/icons/unknown");
|
||||||
|
elm_image_file_set(ic->o_overlay, e_theme_edje_file_get("base/theme/icons", "e/icons/unknown"),
|
||||||
|
"e/icons/unknown");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
inst->resize_job = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static Eina_Bool
|
||||||
|
_grid_cb_update_icons(EINA_UNUSED void *data, EINA_UNUSED int ev_type, EINA_UNUSED void *ev)
|
||||||
|
{
|
||||||
|
Instance *inst = NULL;
|
||||||
|
Eina_List *l = NULL;
|
||||||
|
|
||||||
|
EINA_LIST_FOREACH(luncher_instances, l, inst)
|
||||||
|
{
|
||||||
|
if (inst->bar) continue;
|
||||||
|
if (inst->resize_job) return ECORE_CALLBACK_RENEW;
|
||||||
|
inst->resize_job = ecore_job_add(_grid_resize_job, inst);
|
||||||
|
}
|
||||||
|
return ECORE_CALLBACK_PASS_ON;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_grid_resize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_data EINA_UNUSED)
|
||||||
|
{
|
||||||
|
Instance *inst = data;
|
||||||
|
|
||||||
|
if (inst->resize_job) return;
|
||||||
|
inst->resize_job = ecore_job_add(_grid_resize_job, inst);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_grid_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_data EINA_UNUSED)
|
||||||
|
{
|
||||||
|
Instance *inst = data;
|
||||||
|
|
||||||
|
e_object_del(E_OBJECT(inst->order));
|
||||||
|
E_FREE_FUNC(inst->drop_handler, evas_object_del);
|
||||||
|
luncher_instances = eina_list_remove(luncher_instances, inst);
|
||||||
|
free(inst);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_grid_drop_drop(void *data, const char *type, void *event_data)
|
||||||
|
{
|
||||||
|
Instance *inst = data;
|
||||||
|
E_Event_Dnd_Drop *ev = event_data;
|
||||||
|
Efreet_Desktop *desktop = NULL;
|
||||||
|
Eina_List *l = NULL;
|
||||||
|
Icon *ic = NULL;
|
||||||
|
|
||||||
|
evas_object_del(inst->place_holder);
|
||||||
|
inst->place_holder = NULL;
|
||||||
|
if (!strcmp(type, "enlightenment/desktop"))
|
||||||
|
desktop = ev->data;
|
||||||
|
else if (!strcmp(type, "enlightenment/border"))
|
||||||
|
{
|
||||||
|
E_Client *ec;
|
||||||
|
|
||||||
|
ec = ev->data;
|
||||||
|
desktop = ec->desktop;
|
||||||
|
if (!desktop)
|
||||||
|
{
|
||||||
|
desktop = e_desktop_client_create(ec);
|
||||||
|
efreet_desktop_save(desktop);
|
||||||
|
e_desktop_edit(desktop);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!strcmp(type, "text/uri-list"))
|
||||||
|
l = ev->data;
|
||||||
|
|
||||||
|
ic = inst->drop_before;
|
||||||
|
if (ic)
|
||||||
|
{
|
||||||
|
if (desktop)
|
||||||
|
e_order_prepend_relative(inst->order, desktop, ic->desktop);
|
||||||
|
else
|
||||||
|
e_order_files_prepend_relative(inst->order, l, ic->desktop);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (desktop)
|
||||||
|
e_order_append(inst->order, desktop);
|
||||||
|
else
|
||||||
|
e_order_files_append(inst->order, l);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_grid_drop_leave(void *data, const char *type EINA_UNUSED, void *event_data EINA_UNUSED)
|
||||||
|
{
|
||||||
|
Instance *inst = data;
|
||||||
|
|
||||||
|
inst->inside = EINA_FALSE;
|
||||||
|
evas_object_del(inst->place_holder);
|
||||||
|
inst->place_holder = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_grid_drop_move(void *data, const char *type EINA_UNUSED, void *event_data)
|
||||||
|
{
|
||||||
|
Instance *inst = data;
|
||||||
|
E_Event_Dnd_Move *ev = event_data;
|
||||||
|
Evas_Coord x = ev->x, y = ev->y;
|
||||||
|
Eina_List *l;
|
||||||
|
Icon *ic;
|
||||||
|
|
||||||
|
if (!inst->inside)
|
||||||
|
return;
|
||||||
|
|
||||||
|
EINA_LIST_FOREACH(inst->icons, l, ic)
|
||||||
|
{
|
||||||
|
Evas_Coord dx, dy, dw, dh;
|
||||||
|
|
||||||
|
if (!ic->in_order) continue;
|
||||||
|
evas_object_geometry_get(ic->o_layout, &dx, &dy, &dw, &dh);
|
||||||
|
if (E_INSIDE(x, y, dx, dy, dw, dh))
|
||||||
|
inst->drop_before = ic;
|
||||||
|
}
|
||||||
|
if (inst->drop_before)
|
||||||
|
elm_gengrid_item_insert_before(inst->o_icon_con, &_grid_icon_class, inst->place_holder, inst->drop_before->o_layout, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_grid_drop_enter(void *data, const char *type EINA_UNUSED, void *event_data EINA_UNUSED)
|
||||||
|
{
|
||||||
|
Instance *inst = data;
|
||||||
|
|
||||||
|
inst->inside = EINA_TRUE;
|
||||||
|
inst->place_holder = evas_object_rectangle_add(evas_object_evas_get(inst->o_icon_con));
|
||||||
|
evas_object_color_set(inst->place_holder, 0, 0, 0, 0);
|
||||||
|
evas_object_size_hint_min_set(inst->place_holder, inst->size, inst->size);
|
||||||
|
evas_object_size_hint_max_set(inst->place_holder, inst->size, inst->size);
|
||||||
|
evas_object_show(inst->place_holder);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_grid_removed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_data)
|
||||||
|
{
|
||||||
|
Instance *inst = data;
|
||||||
|
char buf[4096];
|
||||||
|
|
||||||
|
if (inst->o_main != event_data) return;
|
||||||
|
if (e_user_dir_snprintf(buf, sizeof(buf), "applications/bar/%s", inst->cfg->dir) >= sizeof(buf))
|
||||||
|
return;
|
||||||
|
|
||||||
|
luncher_config->items = eina_list_remove(luncher_config->items, inst->cfg);
|
||||||
|
eina_stringshare_del(inst->cfg->dir);
|
||||||
|
E_FREE(inst->cfg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_grid_anchor_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
||||||
|
{
|
||||||
|
Instance *inst = data;
|
||||||
|
|
||||||
|
if (inst && inst->o_icon_con)
|
||||||
|
{
|
||||||
|
grid_recalculate(inst);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_grid_order_update(void *data, E_Order *eo EINA_UNUSED)
|
||||||
|
{
|
||||||
|
Instance *inst = data;
|
||||||
|
|
||||||
|
if (inst && inst->o_icon_con)
|
||||||
|
{
|
||||||
|
grid_recalculate(inst);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_grid_created_cb(void *data, Evas_Object *obj, void *event_data EINA_UNUSED)
|
||||||
|
{
|
||||||
|
Instance *inst = data;
|
||||||
|
char buf[4096];
|
||||||
|
const char *drop[] = { "enlightenment/desktop", "enlightenment/border", "text/uri-list" };
|
||||||
|
|
||||||
|
inst->o_icon_con = elm_gengrid_add(inst->o_main);
|
||||||
|
elm_object_style_set(inst->o_icon_con, "no_inset_shadow");
|
||||||
|
elm_gengrid_align_set(inst->o_icon_con, 0.5, 0.5);
|
||||||
|
elm_gengrid_select_mode_set(inst->o_icon_con, ELM_OBJECT_SELECT_MODE_NONE);
|
||||||
|
E_FILL(inst->o_icon_con);
|
||||||
|
elm_layout_content_set(inst->o_main, "e.swallow.grid", inst->o_icon_con);
|
||||||
|
evas_object_show(inst->o_icon_con);
|
||||||
|
|
||||||
|
evas_object_data_set(inst->o_main, "instance", inst);
|
||||||
|
evas_object_data_set(inst->o_icon_con, "instance", inst);
|
||||||
|
|
||||||
|
e_gadget_configure_cb_set(inst->o_main, _grid_gadget_configure);
|
||||||
|
evas_object_smart_callback_del_full(obj, "gadget_created", _grid_created_cb, data);
|
||||||
|
|
||||||
|
if (!inst->cfg->dir)
|
||||||
|
inst->cfg->dir = eina_stringshare_add("default");
|
||||||
|
if (inst->cfg->dir[0] != '/')
|
||||||
|
e_user_dir_snprintf(buf, sizeof(buf), "applications/bar/%s/.order",
|
||||||
|
inst->cfg->dir);
|
||||||
|
else
|
||||||
|
eina_strlcpy(buf, inst->cfg->dir, sizeof(buf));
|
||||||
|
|
||||||
|
inst->order = e_order_new(buf);
|
||||||
|
e_order_update_callback_set(inst->order, _grid_order_update, inst);
|
||||||
|
|
||||||
|
_grid_fill(inst);
|
||||||
|
|
||||||
|
inst->drop_handler =
|
||||||
|
e_gadget_drop_handler_add(inst->o_main, inst,
|
||||||
|
_grid_drop_enter, _grid_drop_move,
|
||||||
|
_grid_drop_leave, _grid_drop_drop,
|
||||||
|
drop, 3);
|
||||||
|
elm_layout_content_set(inst->o_main, "e.swallow.drop", inst->drop_handler);
|
||||||
|
evas_object_show(inst->drop_handler);
|
||||||
|
|
||||||
|
evas_object_event_callback_add(inst->o_main, EVAS_CALLBACK_RESIZE, _grid_resize, inst);
|
||||||
|
_grid_aspect(inst);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Config_Item *
|
||||||
|
_conf_item_get(int *id)
|
||||||
|
{
|
||||||
|
Config_Item *ci;
|
||||||
|
Eina_List *l;
|
||||||
|
|
||||||
|
if (*id > 0)
|
||||||
|
{
|
||||||
|
EINA_LIST_FOREACH(luncher_config->items, l, ci)
|
||||||
|
if (*id == ci->id) return ci;
|
||||||
|
}
|
||||||
|
|
||||||
|
ci = E_NEW(Config_Item, 1);
|
||||||
|
|
||||||
|
if (*id != -1)
|
||||||
|
ci->id = eina_list_count(luncher_config->items)+1;
|
||||||
|
else
|
||||||
|
ci->id = -1;
|
||||||
|
ci->dir = eina_stringshare_add("default");
|
||||||
|
ci->style = NULL;
|
||||||
|
luncher_config->items = eina_list_append(luncher_config->items, ci);
|
||||||
|
|
||||||
|
return ci;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_grid_recalculate_job(void *data)
|
||||||
|
{
|
||||||
|
Instance *inst = data;
|
||||||
|
|
||||||
|
if (inst)
|
||||||
|
{
|
||||||
|
if (inst->o_icon_con)
|
||||||
|
{
|
||||||
|
_grid_empty(inst);
|
||||||
|
_grid_fill(inst);
|
||||||
|
}
|
||||||
|
inst->recalc_job = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EINTERN void
|
||||||
|
grid_recalculate(Instance *inst)
|
||||||
|
{
|
||||||
|
E_FREE_FUNC(inst->recalc_job, ecore_job_del);
|
||||||
|
inst->recalc_job = ecore_job_add(_grid_recalculate_job, inst);
|
||||||
|
}
|
||||||
|
|
||||||
|
EINTERN void
|
||||||
|
grid_reorder(Instance *inst)
|
||||||
|
{
|
||||||
|
char buf[4096];
|
||||||
|
|
||||||
|
if (inst)
|
||||||
|
{
|
||||||
|
E_FREE_FUNC(inst->recalc_job, ecore_job_del);
|
||||||
|
_grid_empty(inst);
|
||||||
|
if (!inst->cfg->dir)
|
||||||
|
inst->cfg->dir = eina_stringshare_add("default");
|
||||||
|
if (inst->cfg->dir[0] != '/')
|
||||||
|
e_user_dir_snprintf(buf, sizeof(buf), "applications/bar/%s/.order",
|
||||||
|
inst->cfg->dir);
|
||||||
|
else
|
||||||
|
eina_strlcpy(buf, inst->cfg->dir, sizeof(buf));
|
||||||
|
e_object_del(E_OBJECT(inst->order));
|
||||||
|
inst->order = e_order_new(buf);
|
||||||
|
e_order_update_callback_set(inst->order, _grid_order_update, inst);
|
||||||
|
_grid_fill(inst);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EINTERN Evas_Object *
|
||||||
|
grid_create(Evas_Object *parent, int *id, E_Gadget_Site_Orient orient EINA_UNUSED)
|
||||||
|
{
|
||||||
|
Instance *inst;
|
||||||
|
|
||||||
|
inst = E_NEW(Instance, 1);
|
||||||
|
inst->size = 0;
|
||||||
|
inst->resize_job = NULL;
|
||||||
|
inst->cfg = _conf_item_get(id);
|
||||||
|
*id = inst->cfg->id;
|
||||||
|
inst->inside = EINA_FALSE;
|
||||||
|
inst->bar = EINA_FALSE;
|
||||||
|
|
||||||
|
_grid_icon_class.item_style = "luncher";
|
||||||
|
_grid_icon_class.func.text_get = NULL;
|
||||||
|
_grid_icon_class.func.content_get = _gengrid_icon_get;
|
||||||
|
_grid_icon_class.func.state_get = NULL;
|
||||||
|
_grid_icon_class.func.del = NULL;
|
||||||
|
|
||||||
|
inst->o_main = elm_layout_add(parent);
|
||||||
|
e_theme_edje_object_set(inst->o_main, "e/gadget/luncher/grid",
|
||||||
|
"e/gadget/luncher/grid");
|
||||||
|
evas_object_event_callback_add(inst->o_main, EVAS_CALLBACK_DEL, _grid_del, inst);
|
||||||
|
evas_object_smart_callback_add(parent, "gadget_created", _grid_created_cb, inst);
|
||||||
|
evas_object_smart_callback_add(parent, "gadget_site_anchor", _grid_anchor_changed_cb, inst);
|
||||||
|
evas_object_smart_callback_add(parent, "gadget_removed", _grid_removed_cb, inst);
|
||||||
|
evas_object_show(inst->o_main);
|
||||||
|
|
||||||
|
E_LIST_HANDLER_APPEND(handlers, E_EVENT_CONFIG_ICON_THEME,
|
||||||
|
_grid_cb_update_icons, NULL);
|
||||||
|
E_LIST_HANDLER_APPEND(handlers, EFREET_EVENT_ICON_CACHE_UPDATE,
|
||||||
|
_grid_cb_update_icons, NULL);
|
||||||
|
|
||||||
|
if (inst->cfg->id < 0) return inst->o_main;
|
||||||
|
luncher_instances = eina_list_append(luncher_instances, inst);
|
||||||
|
|
||||||
|
return inst->o_main;
|
||||||
|
}
|
|
@ -46,6 +46,7 @@ struct _Instance
|
||||||
Ecore_Job *resize_job;
|
Ecore_Job *resize_job;
|
||||||
Ecore_Job *recalc_job;
|
Ecore_Job *recalc_job;
|
||||||
E_Comp_Object_Mover *iconify_provider;
|
E_Comp_Object_Mover *iconify_provider;
|
||||||
|
Eina_Bool bar;
|
||||||
Eina_Bool inside;
|
Eina_Bool inside;
|
||||||
Eina_Bool effect;
|
Eina_Bool effect;
|
||||||
Config_Item *cfg;
|
Config_Item *cfg;
|
||||||
|
@ -84,6 +85,9 @@ EINTERN Evas_Object *config_luncher(E_Zone *zone, Instance *inst, Eina_Bool bar)
|
||||||
EINTERN Evas_Object *bar_create(Evas_Object *parent, int *id, E_Gadget_Site_Orient orient);
|
EINTERN Evas_Object *bar_create(Evas_Object *parent, int *id, E_Gadget_Site_Orient orient);
|
||||||
EINTERN void bar_reorder(Instance *inst);
|
EINTERN void bar_reorder(Instance *inst);
|
||||||
EINTERN void bar_recalculate(Instance *inst);
|
EINTERN void bar_recalculate(Instance *inst);
|
||||||
|
EINTERN Evas_Object *grid_create(Evas_Object *parent, int *id, E_Gadget_Site_Orient orient);
|
||||||
|
EINTERN void grid_reorder(Instance *inst);
|
||||||
|
EINTERN void grid_recalculate(Instance *inst);
|
||||||
|
|
||||||
extern Config *luncher_config;
|
extern Config *luncher_config;
|
||||||
extern Eina_List *luncher_instances;
|
extern Eina_List *luncher_instances;
|
||||||
|
|
|
@ -38,6 +38,7 @@ luncher_init(void)
|
||||||
luncher_config->items = eina_list_append(luncher_config->items, ci);
|
luncher_config->items = eina_list_append(luncher_config->items, ci);
|
||||||
}
|
}
|
||||||
e_gadget_type_add("Luncher Bar", bar_create, NULL);
|
e_gadget_type_add("Luncher Bar", bar_create, NULL);
|
||||||
|
e_gadget_type_add("Luncher Grid", grid_create, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
EINTERN void
|
EINTERN void
|
||||||
|
@ -58,6 +59,7 @@ luncher_shutdown(void)
|
||||||
E_CONFIG_DD_FREE(conf_item_edd);
|
E_CONFIG_DD_FREE(conf_item_edd);
|
||||||
|
|
||||||
e_gadget_type_del("Luncher Bar");
|
e_gadget_type_del("Luncher Bar");
|
||||||
|
e_gadget_type_del("Luncher Grid");
|
||||||
}
|
}
|
||||||
|
|
||||||
E_API E_Module_Api e_modapi =
|
E_API E_Module_Api e_modapi =
|
||||||
|
|
Loading…
Reference in New Issue