309 lines
7.5 KiB
C
309 lines
7.5 KiB
C
#include "e.h"
|
|
#include "e_flaunch.h"
|
|
#include "e_cfg.h"
|
|
|
|
static Evas_Object *_theme_obj_new(Evas *e, const char *custom_dir, const char *group);
|
|
|
|
static void
|
|
_e_flaunch_cb_button_select(void *data, Evas_Object *obj, const char *emission, const char *source)
|
|
{
|
|
E_Flaunch_App *fla;
|
|
|
|
fla = data;
|
|
if (fla->callback.func) fla->callback.func((void *)fla->callback.data);
|
|
}
|
|
|
|
static E_Flaunch_App *
|
|
_e_fluanch_button_add(E_Flaunch *fl, const char *label, int expander, void (*func) (void *data), const void *data)
|
|
{
|
|
E_Flaunch_App *fla;
|
|
Evas_Object *o;
|
|
|
|
fla = E_NEW(E_Flaunch_App, 1);
|
|
if (!fla) return NULL;
|
|
if (expander)
|
|
o = _theme_obj_new(fl->zone->container->bg_evas,
|
|
fl->themedir,
|
|
"e/modules/flaunch/button/default");
|
|
else
|
|
o = _theme_obj_new(fl->zone->container->bg_evas,
|
|
fl->themedir,
|
|
"e/modules/flaunch/button/start");
|
|
edje_object_part_text_set(o, "e.text.label", label);
|
|
fla->flaunch = fl;
|
|
fla->obj = o;
|
|
fla->callback.func = func;
|
|
if (!data) data = fla;
|
|
fla->callback.data = data;
|
|
edje_object_signal_callback_add(o, "e,action,do,select", "",
|
|
_e_flaunch_cb_button_select, fla);
|
|
return fla;
|
|
}
|
|
|
|
static void
|
|
_e_flaunch_button_del(E_Flaunch_App *fla)
|
|
{
|
|
evas_object_del(fla->obj);
|
|
if (fla->desktop) eina_stringshare_del(fla->desktop);
|
|
free(fla);
|
|
}
|
|
|
|
static void
|
|
_e_fluanch_cb_app_button(void *data)
|
|
{
|
|
E_Flaunch_App *fla;
|
|
Efreet_Desktop *desktop;
|
|
|
|
fla = data;
|
|
if (!fla->desktop) return;
|
|
desktop = efreet_util_desktop_file_id_find(fla->desktop);
|
|
if (!desktop) return;
|
|
if (fla->flaunch->desktop_run_func) fla->flaunch->desktop_run_func(desktop);
|
|
}
|
|
|
|
static E_Flaunch_App *
|
|
_e_flaunch_app_add(E_Flaunch *fl, const char *deskfile)
|
|
{
|
|
E_Flaunch_App *fla;
|
|
Efreet_Desktop *desktop;
|
|
const char *label = "";
|
|
|
|
desktop = efreet_util_desktop_file_id_find(deskfile);
|
|
if (desktop) label = desktop->name;
|
|
fla = _e_fluanch_button_add(fl, label, 1, _e_fluanch_cb_app_button, NULL);
|
|
if (deskfile) fla->desktop = eina_stringshare_add(deskfile);
|
|
fl->apps = eina_list_append(fl->apps, fla);
|
|
e_box_pack_end(fl->app_box_obj, fla->obj);
|
|
e_box_pack_options_set(fla->obj, 1, 1, 1, 1, 0.5, 0.5, 0, 0, 9999, 9999);
|
|
evas_object_show(fla->obj);
|
|
return fla;
|
|
}
|
|
|
|
static void
|
|
_e_flaunch_apps_clear(E_Flaunch *fl)
|
|
{
|
|
E_Flaunch_App *fla;
|
|
|
|
EINA_LIST_FREE(fl->apps, fla)
|
|
_e_flaunch_button_del(fla);
|
|
}
|
|
|
|
static void
|
|
_e_flaunch_apps_populate(E_Flaunch *fl)
|
|
{
|
|
E_Flaunch_App *fla;
|
|
Eina_List *bar_desktops;
|
|
Eina_List *l;
|
|
int num = 0, max, count;
|
|
|
|
// FIXME: 3 should become config here
|
|
max = 3;
|
|
// for now just look for any apps in "category" 'Bar' and add the first 3
|
|
// FIXME: category should be configurable...
|
|
bar_desktops = efreet_util_desktop_category_list("Bar");
|
|
if (bar_desktops)
|
|
{
|
|
Efreet_Desktop *desktop;
|
|
|
|
count = eina_list_count(bar_desktops);
|
|
if (count < max)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < (max - count) / 2; i++)
|
|
{
|
|
_e_flaunch_app_add(fl, "");
|
|
num++;
|
|
}
|
|
}
|
|
EINA_LIST_FOREACH(bar_desktops, l, desktop)
|
|
{
|
|
if (desktop->orig_path)
|
|
{
|
|
const char *dname;
|
|
|
|
dname = ecore_file_file_get(desktop->orig_path);
|
|
if (dname)
|
|
{
|
|
_e_flaunch_app_add(fl, dname);
|
|
num++;
|
|
}
|
|
}
|
|
if (num >= max) break;
|
|
}
|
|
}
|
|
while (num < max)
|
|
{
|
|
_e_flaunch_app_add(fl, "");
|
|
num++;
|
|
}
|
|
}
|
|
|
|
static void
|
|
_e_fluanch_cb_home_button(void *data)
|
|
{
|
|
printf("FIXME: this 'start' button has no defined behavior\n");
|
|
}
|
|
|
|
static void
|
|
_e_flaunch_free(E_Flaunch *fl)
|
|
{
|
|
Ecore_Event_Handler *handle;
|
|
|
|
if (fl->repopulate_timer) ecore_timer_del(fl->repopulate_timer);
|
|
_e_flaunch_apps_clear(fl);
|
|
_e_flaunch_button_del(fl->start_button);
|
|
eina_stringshare_del(fl->themedir);
|
|
evas_object_del(fl->app_box_obj);
|
|
evas_object_del(fl->box_obj);
|
|
EINA_LIST_FREE(fl->handlers, handle)
|
|
ecore_event_handler_del(handle);
|
|
free(fl);
|
|
}
|
|
|
|
static int
|
|
_e_flaunch_cb_zone_move_resize(void *data, int type, void *event)
|
|
{
|
|
E_Event_Zone_Move_Resize *ev;
|
|
E_Flaunch *fl;
|
|
|
|
ev = event;
|
|
fl = data;
|
|
if (fl->zone == ev->zone)
|
|
{
|
|
evas_object_move(fl->box_obj, fl->zone->x, fl->zone->y + fl->zone->h - fl->height);
|
|
evas_object_resize(fl->box_obj, fl->zone->w, fl->height);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
_e_flaunch_cb_delayed_repopulate(void *data)
|
|
{
|
|
E_Flaunch *fl;
|
|
|
|
fl = data;
|
|
_e_flaunch_apps_clear(fl);
|
|
_e_flaunch_apps_populate(fl);
|
|
fl->repopulate_timer = NULL;
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
_e_flaunch_cb_desktop_list_change(void *data, int type, void *event)
|
|
{
|
|
E_Flaunch *fl;
|
|
|
|
fl = data;
|
|
if (fl->repopulate_timer) ecore_timer_del(fl->repopulate_timer);
|
|
fl->repopulate_timer = ecore_timer_add(0.5, _e_flaunch_cb_delayed_repopulate, fl);
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
_e_flaunch_cb_desktop_change(void *data, int type, void *event)
|
|
{
|
|
E_Flaunch *fl;
|
|
|
|
fl = data;
|
|
if (fl->repopulate_timer) ecore_timer_del(fl->repopulate_timer);
|
|
fl->repopulate_timer = ecore_timer_add(0.5, _e_flaunch_cb_delayed_repopulate, fl);
|
|
return 1;
|
|
}
|
|
|
|
EAPI int
|
|
e_flaunch_init(void)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
EAPI int
|
|
e_flaunch_shutdown(void)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
EAPI E_Flaunch *
|
|
e_flaunch_new(E_Zone *zone, const char *themedir)
|
|
{
|
|
E_Flaunch *fl;
|
|
Evas_Object *o;
|
|
|
|
fl = E_OBJECT_ALLOC(E_Flaunch, E_FLAUNCH_TYPE, _e_flaunch_free);
|
|
if (!fl) return NULL;
|
|
fl->zone = zone;
|
|
|
|
fl->themedir = eina_stringshare_add(themedir);
|
|
|
|
// FIXME: height should become config
|
|
fl->height = 30 * e_scale;
|
|
|
|
o = e_box_add(fl->zone->container->bg_evas);
|
|
e_box_orientation_set(o, 1);
|
|
e_box_homogenous_set(o, 0);
|
|
fl->box_obj = o;
|
|
|
|
fl->start_button = _e_fluanch_button_add(fl, "*", 0,
|
|
_e_fluanch_cb_home_button, fl);
|
|
e_box_pack_end(fl->box_obj, fl->start_button->obj);
|
|
e_box_pack_options_set(fl->start_button->obj, 1, 1, 0, 1, 0.5, 0.5, fl->height, 0, fl->height, 9999);
|
|
evas_object_show(fl->start_button->obj);
|
|
|
|
o = e_box_add(fl->zone->container->bg_evas);
|
|
e_box_orientation_set(o, 1);
|
|
e_box_homogenous_set(o, 1);
|
|
fl->app_box_obj = o;
|
|
|
|
e_box_pack_end(fl->box_obj, fl->app_box_obj);
|
|
e_box_pack_options_set(fl->app_box_obj, 1, 1, 1, 1, 0.5, 0.5, 0, 0, 9999, 9999);
|
|
|
|
_e_flaunch_apps_populate(fl);
|
|
|
|
evas_object_move(fl->box_obj, fl->zone->x, fl->zone->y + fl->zone->h - fl->height);
|
|
evas_object_resize(fl->box_obj, fl->zone->w, fl->height);
|
|
evas_object_show(fl->app_box_obj);
|
|
evas_object_layer_set(fl->box_obj, 10);
|
|
evas_object_show(fl->box_obj);
|
|
|
|
fl->handlers = eina_list_append
|
|
(fl->handlers, ecore_event_handler_add
|
|
(E_EVENT_ZONE_MOVE_RESIZE, _e_flaunch_cb_zone_move_resize, fl));
|
|
fl->handlers = eina_list_append
|
|
(fl->handlers, ecore_event_handler_add
|
|
(EFREET_EVENT_DESKTOP_LIST_CHANGE, _e_flaunch_cb_desktop_list_change, fl));
|
|
fl->handlers = eina_list_append
|
|
(fl->handlers, ecore_event_handler_add
|
|
(EFREET_EVENT_DESKTOP_CHANGE, _e_flaunch_cb_desktop_change, fl));
|
|
|
|
return fl;
|
|
}
|
|
|
|
EAPI void
|
|
e_flaunch_desktop_exec_callback_set(E_Flaunch *fl, void (*func) (Efreet_Desktop *desktop))
|
|
{
|
|
fl->desktop_run_func = func;
|
|
}
|
|
|
|
|
|
static Evas_Object *
|
|
_theme_obj_new(Evas *e, const char *custom_dir, const char *group)
|
|
{
|
|
Evas_Object *o;
|
|
|
|
o = edje_object_add(e);
|
|
if (!e_theme_edje_object_set(o, "base/theme/modules/illume", group))
|
|
{
|
|
if (custom_dir)
|
|
{
|
|
char buf[PATH_MAX];
|
|
|
|
snprintf(buf, sizeof(buf), "%s/illume.edj", custom_dir);
|
|
if (edje_object_file_set(o, buf, group))
|
|
{
|
|
printf("OK FALLBACK %s\n", buf);
|
|
}
|
|
}
|
|
}
|
|
return o;
|
|
}
|