forked from enlightenment/enlightenment
e17 can build apps menu (right mosue click on desktop) from
"/usr/share/gnome/apps" dir now (/usr/share/pixmaps is hardcoded to pixmap dir... need to figre this right... but it can be done...) :) qworks quite ok.. :) SVN revision: 4424
This commit is contained in:
parent
49685ab578
commit
e59150b4a8
|
@ -21,7 +21,7 @@ ipc.c \
|
||||||
keys.c \
|
keys.c \
|
||||||
main.c \
|
main.c \
|
||||||
menu.c \
|
menu.c \
|
||||||
menudb.c \
|
menubuild.c \
|
||||||
pack.c \
|
pack.c \
|
||||||
resist.c \
|
resist.c \
|
||||||
shelf.c \
|
shelf.c \
|
||||||
|
|
5
src/e.h
5
src/e.h
|
@ -774,6 +774,7 @@ void *e_memdup(void *data, int size);
|
||||||
int e_glob_matches(char *str, char *glob);
|
int e_glob_matches(char *str, char *glob);
|
||||||
int e_file_can_exec(struct stat *st);
|
int e_file_can_exec(struct stat *st);
|
||||||
char *e_file_link(char *link);
|
char *e_file_link(char *link);
|
||||||
|
Evas_List e_file_list_dir(char *dir);
|
||||||
|
|
||||||
void e_exec_set_args(int argc, char **argv);
|
void e_exec_set_args(int argc, char **argv);
|
||||||
void e_exec_restart(void);
|
void e_exec_restart(void);
|
||||||
|
@ -959,11 +960,9 @@ void e_menu_item_set_scale_icon(E_Menu_Item *mi, int scale);
|
||||||
void e_menu_set_padding_icon(E_Menu *m, int pad);
|
void e_menu_set_padding_icon(E_Menu *m, int pad);
|
||||||
void e_menu_set_padding_state(E_Menu *m, int pad);
|
void e_menu_set_padding_state(E_Menu *m, int pad);
|
||||||
|
|
||||||
void e_build_menu_unbuild(E_Build_Menu *bm);
|
|
||||||
E_Menu *e_build_menu_build_number(E_Build_Menu *bm, E_DB_File *db, int num);
|
|
||||||
void e_build_menu_build(E_Build_Menu *bm);
|
|
||||||
void e_build_menu_free(E_Build_Menu *bm);
|
void e_build_menu_free(E_Build_Menu *bm);
|
||||||
E_Build_Menu *e_build_menu_new_from_db(char *file);
|
E_Build_Menu *e_build_menu_new_from_db(char *file);
|
||||||
|
E_Build_Menu *e_build_menu_new_from_gnome_apps(char *dir);
|
||||||
|
|
||||||
void e_fs_add_event_handler(void (*func) (EfsdEvent *ev));
|
void e_fs_add_event_handler(void (*func) (EfsdEvent *ev));
|
||||||
void e_fs_init(void);
|
void e_fs_init(void);
|
||||||
|
|
|
@ -0,0 +1,406 @@
|
||||||
|
#include "e.h"
|
||||||
|
|
||||||
|
Evas_List build_menus = NULL;
|
||||||
|
|
||||||
|
static void e_build_menu_cb_exec(E_Menu *m, E_Menu_Item *mi, void *data);
|
||||||
|
|
||||||
|
static void e_build_menu_unbuild(E_Build_Menu *bm);
|
||||||
|
|
||||||
|
static void e_build_menu_db_poll(int val, void *data);
|
||||||
|
static E_Menu *e_build_menu_db_build_number(E_Build_Menu *bm, E_DB_File *db, int num);
|
||||||
|
static void e_build_menu_db_build(E_Build_Menu *bm);
|
||||||
|
|
||||||
|
static void e_build_menu_gnome_apps_poll(int val, void *data);
|
||||||
|
static void e_build_menu_gnome_apps_build(E_Build_Menu *bm);
|
||||||
|
|
||||||
|
static void
|
||||||
|
e_build_menu_cb_exec(E_Menu *m, E_Menu_Item *mi, void *data)
|
||||||
|
{
|
||||||
|
char *exe;
|
||||||
|
|
||||||
|
exe = data;
|
||||||
|
e_exec_run(exe);
|
||||||
|
return;
|
||||||
|
UN(m);
|
||||||
|
UN(mi);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
e_build_menu_unbuild(E_Build_Menu *bm)
|
||||||
|
{
|
||||||
|
Evas_List l;
|
||||||
|
|
||||||
|
bm->menu = NULL;
|
||||||
|
if (bm->menus)
|
||||||
|
{
|
||||||
|
for (l = bm->menus; l; l = l->next)
|
||||||
|
{
|
||||||
|
E_Menu *m;
|
||||||
|
|
||||||
|
m = l->data;
|
||||||
|
e_menu_hide(m);
|
||||||
|
e_menu_update_shows(m);
|
||||||
|
e_menu_update_hides(m);
|
||||||
|
e_menu_update_finish(m);
|
||||||
|
OBJ_DO_FREE(m);
|
||||||
|
}
|
||||||
|
bm->menus = evas_list_free(bm->menus);
|
||||||
|
}
|
||||||
|
if (bm->commands)
|
||||||
|
{
|
||||||
|
for (l = bm->commands; l; l = l->next)
|
||||||
|
{
|
||||||
|
IF_FREE(l->data);
|
||||||
|
}
|
||||||
|
bm->commands = evas_list_free(bm->commands);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* BUILDING from DB's */
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
e_build_menu_db_poll(int val, void *data)
|
||||||
|
{
|
||||||
|
time_t mod;
|
||||||
|
E_Build_Menu *bm;
|
||||||
|
|
||||||
|
bm = data;
|
||||||
|
mod = e_file_modified_time(bm->file);
|
||||||
|
if (mod <= bm->mod_time)
|
||||||
|
{
|
||||||
|
e_add_event_timer(bm->file, 1.0, e_build_menu_db_poll, 0, data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
bm->mod_time = mod;
|
||||||
|
|
||||||
|
e_build_menu_unbuild(bm);
|
||||||
|
e_build_menu_db_build(bm);
|
||||||
|
if (!bm->menu) bm->mod_time = 0;
|
||||||
|
|
||||||
|
e_add_event_timer(bm->file, 1.0, e_build_menu_db_poll, 0, data);
|
||||||
|
return;
|
||||||
|
UN(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
e_build_menu_gnome_apps_poll(int val, void *data)
|
||||||
|
{
|
||||||
|
time_t mod;
|
||||||
|
E_Build_Menu *bm;
|
||||||
|
|
||||||
|
bm = data;
|
||||||
|
mod = e_file_modified_time(bm->file);
|
||||||
|
if (mod <= bm->mod_time)
|
||||||
|
{
|
||||||
|
e_add_event_timer(bm->file, 1.0, e_build_menu_gnome_apps_poll, 0, data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
bm->mod_time = mod;
|
||||||
|
|
||||||
|
e_build_menu_unbuild(bm);
|
||||||
|
e_build_menu_gnome_apps_build(bm);
|
||||||
|
if (!bm->menu) bm->mod_time = 0;
|
||||||
|
|
||||||
|
e_add_event_timer(bm->file, 1.0, e_build_menu_gnome_apps_poll, 0, data);
|
||||||
|
return;
|
||||||
|
UN(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
static E_Menu *
|
||||||
|
e_build_menu_db_build_number(E_Build_Menu *bm, E_DB_File *db, int num)
|
||||||
|
{
|
||||||
|
E_Menu *menu;
|
||||||
|
char buf[4096];
|
||||||
|
int num2, i2;
|
||||||
|
|
||||||
|
sprintf(buf, "/menu/%i/count", num);
|
||||||
|
if (!e_db_int_get(db, buf, &num2)) return NULL;
|
||||||
|
menu = e_menu_new();
|
||||||
|
e_menu_set_padding_icon(menu, 2);
|
||||||
|
e_menu_set_padding_state(menu, 2);
|
||||||
|
for (i2 = 0; i2 < num2; i2++)
|
||||||
|
{
|
||||||
|
E_Menu_Item *menuitem;
|
||||||
|
char *text, *icon, *exe;
|
||||||
|
int ok, sub, sep;
|
||||||
|
|
||||||
|
sprintf(buf, "/menu/%i/%i/text", num, i2);
|
||||||
|
text = e_db_str_get(db, buf);
|
||||||
|
sprintf(buf, "/menu/%i/%i/icon", num, i2);
|
||||||
|
icon = e_db_str_get(db, buf);
|
||||||
|
sprintf(buf, "/menu/%i/%i/command", num, i2);
|
||||||
|
exe = e_db_str_get(db, buf);
|
||||||
|
sprintf(buf, "/menu/%i/%i/submenu", num, i2);
|
||||||
|
ok = e_db_int_get(db, buf, &sub);
|
||||||
|
sep = 0;
|
||||||
|
sprintf(buf, "/menu/%i/%i/separator", num, i2);
|
||||||
|
e_db_int_get(db, buf, &sep);
|
||||||
|
menuitem = e_menu_item_new(text);
|
||||||
|
e_menu_item_set_icon(menuitem, icon);
|
||||||
|
if ((icon) && (text)) e_menu_item_set_scale_icon(menuitem, 1);
|
||||||
|
IF_FREE(text);
|
||||||
|
IF_FREE(icon);
|
||||||
|
if (sep) e_menu_item_set_separator(menuitem, 1);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (ok)
|
||||||
|
{
|
||||||
|
E_Menu *menu2;
|
||||||
|
|
||||||
|
menu2 = e_build_menu_db_build_number(bm, db, sub);
|
||||||
|
e_menu_item_set_submenu(menuitem, menu2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (exe)
|
||||||
|
{
|
||||||
|
e_menu_item_set_callback(menuitem, e_build_menu_cb_exec, exe);
|
||||||
|
bm->commands = evas_list_prepend(bm->commands, exe);
|
||||||
|
}
|
||||||
|
e_menu_add_item(menu, menuitem);
|
||||||
|
}
|
||||||
|
bm->menus = evas_list_prepend(bm->menus, menu);
|
||||||
|
return menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
e_build_menu_db_build(E_Build_Menu *bm)
|
||||||
|
{
|
||||||
|
E_DB_File *db;
|
||||||
|
int num;
|
||||||
|
|
||||||
|
e_db_flush();
|
||||||
|
db = e_db_open_read(bm->file);
|
||||||
|
if (!db) return;
|
||||||
|
|
||||||
|
if (!e_db_int_get(db, "/menu/count", &num)) goto error;
|
||||||
|
if (num > 0) bm->menu = e_build_menu_db_build_number(bm, db, 0);
|
||||||
|
error:
|
||||||
|
e_db_close(db);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* BUILD from GNOME APPS directory structure */
|
||||||
|
|
||||||
|
|
||||||
|
static E_Menu *
|
||||||
|
e_build_menu_gnome_apps_build_dir(E_Build_Menu *bm, char *dir)
|
||||||
|
{
|
||||||
|
E_Menu *menu = NULL;
|
||||||
|
Evas_List l, entries = NULL;
|
||||||
|
|
||||||
|
menu = e_menu_new();
|
||||||
|
e_menu_set_padding_icon(menu, 2);
|
||||||
|
e_menu_set_padding_state(menu, 2);
|
||||||
|
/* build the order of things to scan ...*/
|
||||||
|
{
|
||||||
|
FILE *f;
|
||||||
|
char buf[4096];
|
||||||
|
Evas_List dirlist = NULL;
|
||||||
|
|
||||||
|
/* read .order file */
|
||||||
|
sprintf(buf, "%s/.order", dir);
|
||||||
|
f = fopen(buf, "rb");
|
||||||
|
if (f)
|
||||||
|
{
|
||||||
|
while (fgets(buf, 4096, f))
|
||||||
|
{
|
||||||
|
int buf_len;
|
||||||
|
|
||||||
|
buf_len = strlen(buf);
|
||||||
|
if (buf_len > 0)
|
||||||
|
{
|
||||||
|
if (buf[buf_len - 1] == '\n')
|
||||||
|
buf[buf_len - 1] = 0;
|
||||||
|
entries = evas_list_append(entries, strdup(buf));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
|
/* read dir listing in alphabetical order and use that to suppliment */
|
||||||
|
dirlist = e_file_list_dir(dir);
|
||||||
|
for (l = dirlist; l; l = l->next)
|
||||||
|
{
|
||||||
|
char *s;
|
||||||
|
|
||||||
|
s = l->data;
|
||||||
|
/* if it isnt a "dot" file or dir */
|
||||||
|
if (s[0] != '.')
|
||||||
|
{
|
||||||
|
Evas_List ll;
|
||||||
|
int have_it;
|
||||||
|
|
||||||
|
have_it = 0;
|
||||||
|
for (ll = entries; ll; ll = ll->next)
|
||||||
|
{
|
||||||
|
if (!strcmp(ll->data, s))
|
||||||
|
{
|
||||||
|
have_it = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!have_it)
|
||||||
|
entries = evas_list_append(entries, strdup(s));
|
||||||
|
}
|
||||||
|
free(s);
|
||||||
|
}
|
||||||
|
if (dirlist) evas_list_free(dirlist);
|
||||||
|
}
|
||||||
|
/* now go thru list... */
|
||||||
|
for (l = entries; l; l = l->next)
|
||||||
|
{
|
||||||
|
char *s;
|
||||||
|
char buf[4096];
|
||||||
|
E_Menu_Item *menuitem;
|
||||||
|
char *icon, *name, *exe;
|
||||||
|
E_Menu *sub;
|
||||||
|
FILE *f;
|
||||||
|
|
||||||
|
f = NULL;
|
||||||
|
icon = NULL;
|
||||||
|
exe = NULL;
|
||||||
|
name = NULL;
|
||||||
|
sub = NULL;
|
||||||
|
s = l->data;
|
||||||
|
sprintf(buf, "%s/%s", dir, s);
|
||||||
|
/* if its a subdir... */
|
||||||
|
if (e_file_is_dir(buf))
|
||||||
|
{
|
||||||
|
sub = e_build_menu_gnome_apps_build_dir(bm, buf);
|
||||||
|
sprintf(buf, "%s/%s/.directory", dir, s);
|
||||||
|
|
||||||
|
f = fopen(buf, "rb");
|
||||||
|
}
|
||||||
|
/* regular file */
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sprintf(buf, "%s/%s", dir, s);
|
||||||
|
|
||||||
|
f = fopen(buf, "rb");
|
||||||
|
}
|
||||||
|
if (f)
|
||||||
|
{
|
||||||
|
while (fgets(buf, 4096, f))
|
||||||
|
{
|
||||||
|
int buf_len;
|
||||||
|
|
||||||
|
buf_len = strlen(buf);
|
||||||
|
if (buf_len > 0)
|
||||||
|
{
|
||||||
|
if (buf[buf_len - 1] == '\n')
|
||||||
|
buf[buf_len - 1] = 0;
|
||||||
|
/* look for Name= */
|
||||||
|
if ((!name) &&
|
||||||
|
(((e_glob_matches(buf, "Name[en]=*")) ||
|
||||||
|
(e_glob_matches(buf, "Name=*")))))
|
||||||
|
{
|
||||||
|
char *eq;
|
||||||
|
|
||||||
|
eq = strchr(buf, '=');
|
||||||
|
if (eq)
|
||||||
|
name = strdup(eq + 1);
|
||||||
|
}
|
||||||
|
/* look for Icon= */
|
||||||
|
else if ((!icon) &&
|
||||||
|
((e_glob_matches(buf, "Icon=*"))))
|
||||||
|
{
|
||||||
|
char *eq;
|
||||||
|
|
||||||
|
eq = strchr(buf, '=');
|
||||||
|
if (eq)
|
||||||
|
{
|
||||||
|
char buf2[4096];
|
||||||
|
|
||||||
|
sprintf(buf2, "/usr/share/pixmaps/%s", eq +1);
|
||||||
|
icon = strdup(buf2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* look for Icon= */
|
||||||
|
else if ((!exe) &&
|
||||||
|
((e_glob_matches(buf, "Exec=*"))))
|
||||||
|
{
|
||||||
|
char *eq;
|
||||||
|
|
||||||
|
eq = strchr(buf, '=');
|
||||||
|
if (eq)
|
||||||
|
exe = strdup(eq + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!name) name = strdup(s);
|
||||||
|
menuitem = e_menu_item_new(name);
|
||||||
|
if (icon) e_menu_item_set_icon(menuitem, icon);
|
||||||
|
if ((icon) && (name)) e_menu_item_set_scale_icon(menuitem, 1);
|
||||||
|
if (exe)
|
||||||
|
{
|
||||||
|
e_menu_item_set_callback(menuitem, e_build_menu_cb_exec, exe);
|
||||||
|
bm->commands = evas_list_prepend(bm->commands, exe);
|
||||||
|
}
|
||||||
|
if (sub) e_menu_item_set_submenu(menuitem, sub);
|
||||||
|
e_menu_add_item(menu, menuitem);
|
||||||
|
|
||||||
|
IF_FREE(name);
|
||||||
|
IF_FREE(icon);
|
||||||
|
free(s);
|
||||||
|
}
|
||||||
|
if (entries) evas_list_free(entries);
|
||||||
|
bm->menus = evas_list_prepend(bm->menus, menu);
|
||||||
|
return menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
e_build_menu_gnome_apps_build(E_Build_Menu *bm)
|
||||||
|
{
|
||||||
|
E_Menu *menu;
|
||||||
|
|
||||||
|
menu = e_build_menu_gnome_apps_build_dir(bm, bm->file);
|
||||||
|
bm->menu = menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
e_build_menu_free(E_Build_Menu *bm)
|
||||||
|
{
|
||||||
|
e_del_event_timer(bm->file);
|
||||||
|
e_build_menu_unbuild(bm);
|
||||||
|
IF_FREE(bm->file);
|
||||||
|
build_menus = evas_list_remove(build_menus, bm);
|
||||||
|
FREE(bm);
|
||||||
|
}
|
||||||
|
|
||||||
|
E_Build_Menu *
|
||||||
|
e_build_menu_new_from_db(char *file)
|
||||||
|
{
|
||||||
|
E_Build_Menu *bm;
|
||||||
|
|
||||||
|
if (!file) return NULL;
|
||||||
|
bm = NEW(E_Build_Menu, 1);
|
||||||
|
ZERO(bm, E_Build_Menu, 1);
|
||||||
|
OBJ_INIT(bm, e_build_menu_free);
|
||||||
|
|
||||||
|
bm->file = strdup(file);
|
||||||
|
|
||||||
|
build_menus = evas_list_prepend(build_menus, bm);
|
||||||
|
e_build_menu_db_poll(0, bm);
|
||||||
|
return bm;
|
||||||
|
}
|
||||||
|
|
||||||
|
E_Build_Menu *
|
||||||
|
e_build_menu_new_from_gnome_apps(char *dir)
|
||||||
|
{
|
||||||
|
E_Build_Menu *bm;
|
||||||
|
|
||||||
|
if (!dir) return NULL;
|
||||||
|
bm = NEW(E_Build_Menu, 1);
|
||||||
|
ZERO(bm, E_Build_Menu, 1);
|
||||||
|
OBJ_INIT(bm, e_build_menu_free);
|
||||||
|
|
||||||
|
bm->file = strdup(dir);
|
||||||
|
|
||||||
|
build_menus = evas_list_prepend(build_menus, bm);
|
||||||
|
e_build_menu_gnome_apps_poll(0, bm);
|
||||||
|
return bm;
|
||||||
|
}
|
171
src/menudb.c
171
src/menudb.c
|
@ -1,171 +0,0 @@
|
||||||
#include "e.h"
|
|
||||||
|
|
||||||
Evas_List build_menus = NULL;
|
|
||||||
|
|
||||||
static void e_build_menu_poll(int val, void *data);
|
|
||||||
|
|
||||||
static void
|
|
||||||
e_build_menu_poll(int val, void *data)
|
|
||||||
{
|
|
||||||
time_t mod;
|
|
||||||
E_Build_Menu *bm;
|
|
||||||
|
|
||||||
bm = data;
|
|
||||||
mod = e_file_modified_time(bm->file);
|
|
||||||
if (mod <= bm->mod_time)
|
|
||||||
{
|
|
||||||
e_add_event_timer(bm->file, 1.0, e_build_menu_poll, 0, data);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
bm->mod_time = mod;
|
|
||||||
|
|
||||||
e_build_menu_unbuild(bm);
|
|
||||||
e_build_menu_build(bm);
|
|
||||||
if (!bm->menu) bm->mod_time = 0;
|
|
||||||
|
|
||||||
e_add_event_timer(bm->file, 1.0, e_build_menu_poll, 0, data);
|
|
||||||
return;
|
|
||||||
UN(val);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
e_build_menu_cb_exec(E_Menu *m, E_Menu_Item *mi, void *data)
|
|
||||||
{
|
|
||||||
char *exe;
|
|
||||||
|
|
||||||
exe = data;
|
|
||||||
e_exec_run(exe);
|
|
||||||
return;
|
|
||||||
UN(m);
|
|
||||||
UN(mi);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
e_build_menu_unbuild(E_Build_Menu *bm)
|
|
||||||
{
|
|
||||||
Evas_List l;
|
|
||||||
|
|
||||||
bm->menu = NULL;
|
|
||||||
if (bm->menus)
|
|
||||||
{
|
|
||||||
for (l = bm->menus; l; l = l->next)
|
|
||||||
{
|
|
||||||
E_Menu *m;
|
|
||||||
|
|
||||||
m = l->data;
|
|
||||||
e_menu_hide(m);
|
|
||||||
e_menu_update_shows(m);
|
|
||||||
e_menu_update_hides(m);
|
|
||||||
e_menu_update_finish(m);
|
|
||||||
OBJ_DO_FREE(m);
|
|
||||||
}
|
|
||||||
bm->menus = evas_list_free(bm->menus);
|
|
||||||
}
|
|
||||||
if (bm->commands)
|
|
||||||
{
|
|
||||||
for (l = bm->commands; l; l = l->next)
|
|
||||||
{
|
|
||||||
IF_FREE(l->data);
|
|
||||||
}
|
|
||||||
bm->commands = evas_list_free(bm->commands);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
E_Menu *
|
|
||||||
e_build_menu_build_number(E_Build_Menu *bm, E_DB_File *db, int num)
|
|
||||||
{
|
|
||||||
E_Menu *menu;
|
|
||||||
char buf[4096];
|
|
||||||
int num2, i2;
|
|
||||||
|
|
||||||
sprintf(buf, "/menu/%i/count", num);
|
|
||||||
if (!e_db_int_get(db, buf, &num2)) return NULL;
|
|
||||||
menu = e_menu_new();
|
|
||||||
e_menu_set_padding_icon(menu, 2);
|
|
||||||
e_menu_set_padding_state(menu, 2);
|
|
||||||
for (i2 = 0; i2 < num2; i2++)
|
|
||||||
{
|
|
||||||
E_Menu_Item *menuitem;
|
|
||||||
char *text, *icon, *exe;
|
|
||||||
int ok, sub, sep;
|
|
||||||
|
|
||||||
sprintf(buf, "/menu/%i/%i/text", num, i2);
|
|
||||||
text = e_db_str_get(db, buf);
|
|
||||||
sprintf(buf, "/menu/%i/%i/icon", num, i2);
|
|
||||||
icon = e_db_str_get(db, buf);
|
|
||||||
sprintf(buf, "/menu/%i/%i/command", num, i2);
|
|
||||||
exe = e_db_str_get(db, buf);
|
|
||||||
sprintf(buf, "/menu/%i/%i/submenu", num, i2);
|
|
||||||
ok = e_db_int_get(db, buf, &sub);
|
|
||||||
sep = 0;
|
|
||||||
sprintf(buf, "/menu/%i/%i/separator", num, i2);
|
|
||||||
e_db_int_get(db, buf, &sep);
|
|
||||||
menuitem = e_menu_item_new(text);
|
|
||||||
e_menu_item_set_icon(menuitem, icon);
|
|
||||||
if ((icon) && (text)) e_menu_item_set_scale_icon(menuitem, 1);
|
|
||||||
IF_FREE(text);
|
|
||||||
IF_FREE(icon);
|
|
||||||
if (sep) e_menu_item_set_separator(menuitem, 1);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (ok)
|
|
||||||
{
|
|
||||||
E_Menu *menu2;
|
|
||||||
|
|
||||||
menu2 = e_build_menu_build_number(bm, db, sub);
|
|
||||||
e_menu_item_set_submenu(menuitem, menu2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (exe)
|
|
||||||
{
|
|
||||||
e_menu_item_set_callback(menuitem, e_build_menu_cb_exec, exe);
|
|
||||||
bm->commands = evas_list_prepend(bm->commands, exe);
|
|
||||||
}
|
|
||||||
e_menu_add_item(menu, menuitem);
|
|
||||||
}
|
|
||||||
bm->menus = evas_list_prepend(bm->menus, menu);
|
|
||||||
return menu;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
e_build_menu_build(E_Build_Menu *bm)
|
|
||||||
{
|
|
||||||
E_DB_File *db;
|
|
||||||
int num;
|
|
||||||
|
|
||||||
e_db_flush();
|
|
||||||
db = e_db_open_read(bm->file);
|
|
||||||
if (!db) return;
|
|
||||||
|
|
||||||
if (!e_db_int_get(db, "/menu/count", &num)) goto error;
|
|
||||||
if (num > 0) bm->menu = e_build_menu_build_number(bm, db, 0);
|
|
||||||
error:
|
|
||||||
e_db_close(db);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
e_build_menu_free(E_Build_Menu *bm)
|
|
||||||
{
|
|
||||||
e_del_event_timer(bm->file);
|
|
||||||
e_build_menu_unbuild(bm);
|
|
||||||
IF_FREE(bm->file);
|
|
||||||
build_menus = evas_list_remove(build_menus, bm);
|
|
||||||
FREE(bm);
|
|
||||||
}
|
|
||||||
|
|
||||||
E_Build_Menu *
|
|
||||||
e_build_menu_new_from_db(char *file)
|
|
||||||
{
|
|
||||||
E_Build_Menu *bm;
|
|
||||||
|
|
||||||
if (!file) return NULL;
|
|
||||||
bm = NEW(E_Build_Menu, 1);
|
|
||||||
ZERO(bm, E_Build_Menu, 1);
|
|
||||||
OBJ_INIT(bm, e_build_menu_free);
|
|
||||||
|
|
||||||
bm->file = strdup(file);
|
|
||||||
|
|
||||||
build_menus = evas_list_prepend(build_menus, bm);
|
|
||||||
e_build_menu_poll(0, bm);
|
|
||||||
return bm;
|
|
||||||
}
|
|
35
src/util.c
35
src/util.c
|
@ -166,3 +166,38 @@ e_file_link(char *link)
|
||||||
buf[count] = 0;
|
buf[count] = 0;
|
||||||
return strdup(buf);
|
return strdup(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Evas_List
|
||||||
|
e_file_list_dir(char *dir)
|
||||||
|
{
|
||||||
|
DIR *dirp;
|
||||||
|
struct dirent *dp;
|
||||||
|
Evas_List list;
|
||||||
|
|
||||||
|
dirp = opendir(dir);
|
||||||
|
if (!dirp) return NULL;
|
||||||
|
list = NULL;
|
||||||
|
while ((dp = readdir(dirp)))
|
||||||
|
{
|
||||||
|
printf("%s\n", dp->d_name);
|
||||||
|
if ((strcmp(dp->d_name, ".")) &&
|
||||||
|
(strcmp(dp->d_name, "..")))
|
||||||
|
{
|
||||||
|
Evas_List l;
|
||||||
|
|
||||||
|
/* insertion sort */
|
||||||
|
for (l = list; l; l = l->next)
|
||||||
|
{
|
||||||
|
if (strcmp(l->data, dp->d_name) > 0)
|
||||||
|
{
|
||||||
|
list = evas_list_prepend_relative(list, strdup(dp->d_name), l->data);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* nowhwre to go? just append it */
|
||||||
|
if (!l) list = evas_list_append(list, strdup(dp->d_name));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
closedir(dirp);
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
15
src/view.c
15
src/view.c
|
@ -90,6 +90,20 @@ e_bg_up_cb(void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y)
|
||||||
}
|
}
|
||||||
else if (_b == 3)
|
else if (_b == 3)
|
||||||
{
|
{
|
||||||
|
static E_Build_Menu *buildmenu = NULL;
|
||||||
|
|
||||||
|
if (!buildmenu)
|
||||||
|
{
|
||||||
|
buildmenu = e_build_menu_new_from_gnome_apps("/usr/share/gnome/apps");
|
||||||
|
}
|
||||||
|
if (buildmenu)
|
||||||
|
{
|
||||||
|
static E_Menu *menu = NULL;
|
||||||
|
menu = buildmenu->menu;
|
||||||
|
if (menu)
|
||||||
|
e_menu_show_at_mouse(menu, ev->rx, ev->ry, ev->time);
|
||||||
|
}
|
||||||
|
/*
|
||||||
static E_Menu *menu = NULL;
|
static E_Menu *menu = NULL;
|
||||||
|
|
||||||
if (!menu)
|
if (!menu)
|
||||||
|
@ -105,6 +119,7 @@ e_bg_up_cb(void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y)
|
||||||
}
|
}
|
||||||
if (menu)
|
if (menu)
|
||||||
e_menu_show_at_mouse(menu, ev->rx, ev->ry, ev->time);
|
e_menu_show_at_mouse(menu, ev->rx, ev->ry, ev->time);
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ev->button == 1)
|
if (ev->button == 1)
|
||||||
|
|
Loading…
Reference in New Issue