From: <enl...@li...> - 2000-12-13 23:32:23
|
Enlightenment CVS committal Author : raster Project : e17 Module : apps/e Log Message: Directory /cvsroot/enlightenment/e17/apps/e/data/fonts added to the repository |
From: <enl...@li...> - 2000-12-13 23:44:24
|
Enlightenment CVS committal Author : raster Project : e17 Module : apps/e Added Files: border.bits.db border2.bits.db borderless.bits.db Log Message: clean up the data section for some organisation.. in preparation for e to have proper abstractions to finding the right data files depending on user config etc. |
From: <enl...@li...> - 2000-12-13 23:44:25
|
Enlightenment CVS committal Author : raster Project : e17 Module : apps/e Added Files: bg.png e_logo.png Log Message: clean up the data section for some organisation.. in preparation for e to have proper abstractions to finding the right data files depending on user config etc. |
From: <enl...@li...> - 2000-12-13 23:44:25
|
Enlightenment CVS committal Author : raster Project : e17 Module : apps/e Added Files: nationff.ttf Log Message: clean up the data section for some organisation.. in preparation for e to have proper abstractions to finding the right data files depending on user config etc. |
From: <enl...@li...> - 2000-12-13 23:44:25
|
Enlightenment CVS committal Author : raster Project : e17 Module : apps/e Added Files: actions.db grabs.db settings.db Log Message: clean up the data section for some organisation.. in preparation for e to have proper abstractions to finding the right data files depending on user config etc. |
From: <enl...@li...> - 2000-12-13 23:44:25
|
Enlightenment CVS committal Author : raster Project : e17 Module : apps/e Added Files: b1.png b2.png b3.png b4.png b5.png b_t1.png b_t2.png b_t3.png bt1.png bt2.png bt3.png bt4.png bt5.png bt6.png bt7.png bt8.png s.png t1.png t2.png t3.png Log Message: clean up the data section for some organisation.. in preparation for e to have proper abstractions to finding the right data files depending on user config etc. |
From: <enl...@li...> - 2000-12-13 23:44:25
|
Enlightenment CVS committal Author : raster Project : e17 Module : apps/e Added Files: build_db.sh Log Message: clean up the data section for some organisation.. in preparation for e to have proper abstractions to finding the right data files depending on user config etc. |
From: <enl...@li...> - 2000-12-13 23:44:26
|
Enlightenment CVS committal Author : raster Project : e17 Module : apps/e Modified Files: actions.c border.c desktops.c Log Message: clean up the data section for some organisation.. in preparation for e to have proper abstractions to finding the right data files depending on user config etc. =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/actions.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- actions.c 2000/12/13 03:14:18 1.6 +++ actions.c 2000/12/13 23:44:24 1.7 @@ -57,7 +57,7 @@ static void _e_action_find(char *action, int act, int button, char *key, Ev_Key_Modifiers mods, void *o) { - char *actions_db = PACKAGE_DATA_DIR"/data/actions.db"; + char *actions_db = PACKAGE_DATA_DIR"/data/config/behavior/default/actions.db"; E_DB_File *db; int i, num; char *a_name = NULL; =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/border.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- border.c 2000/12/13 03:14:18 1.9 +++ border.c 2000/12/13 23:44:24 1.10 @@ -377,7 +377,7 @@ b = e_border_find_by_window(e->win); if (b) { - char *settings_db = PACKAGE_DATA_DIR"/data/settings.db"; + char *settings_db = PACKAGE_DATA_DIR"/data/config/behavior/default/settings.db"; E_DB_File *db; int focus_mode; char buf[4096]; @@ -988,9 +988,9 @@ int pl, pr, pt, pb; if ((!b->client.titlebar) && - (!b->client.border)) e_border_set_bits(b, PACKAGE_DATA_DIR"/data/borderless.bits.db"); - else if (b->current.selected) e_border_set_bits(b, PACKAGE_DATA_DIR"/data/border.bits.db"); - else e_border_set_bits(b, PACKAGE_DATA_DIR"/data/border2.bits.db"); + (!b->client.border)) e_border_set_bits(b, PACKAGE_DATA_DIR"/data/config/appearance/default/borders/borderless.bits.db"); + else if (b->current.selected) e_border_set_bits(b, PACKAGE_DATA_DIR"/data/config/appearance/default/borders/border.bits.db"); + else e_border_set_bits(b, PACKAGE_DATA_DIR"/data/config/appearance/default/borders/border2.bits.db"); pl = pr = pt = pb = 0; if (b->bits.t) ebits_get_insets(b->bits.t, &pl, &pr, &pt, &pb); @@ -1066,7 +1066,7 @@ int max_colors = 216; int font_cache = 1024 * 1024; int image_cache = 8192 * 1024; - char *font_dir = PACKAGE_DATA_DIR"/data/fnt"; + char *font_dir = PACKAGE_DATA_DIR"/data/fonts"; E_Desktop *desk; b = NEW(E_Border, 1); @@ -1223,8 +1223,8 @@ void e_border_attach_mouse_grabs(E_Border *b) { - char *grabs_db = PACKAGE_DATA_DIR"/data/grabs.db"; - char *settings_db = PACKAGE_DATA_DIR"/data/settings.db"; + char *grabs_db = PACKAGE_DATA_DIR"/data/config/behavior/default/grabs.db"; + char *settings_db = PACKAGE_DATA_DIR"/data/config/behavior/default/settings.db"; E_DB_File *db; int focus_mode; char buf[4096]; @@ -1316,8 +1316,8 @@ void e_border_redo_grabs(void) { - char *grabs_db = PACKAGE_DATA_DIR"/data/grabs.db"; - char *settings_db = PACKAGE_DATA_DIR"/data/settings.db"; + char *grabs_db = PACKAGE_DATA_DIR"/data/config/behavior/default/grabs.db"; + char *settings_db = PACKAGE_DATA_DIR"/data/config/behavior/default/settings.db"; static time_t mod_date_grabs = 0; static time_t mod_date_settings = 0; time_t mod; =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/desktops.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- desktops.c 2000/12/11 20:08:38 1.4 +++ desktops.c 2000/12/13 23:44:24 1.5 @@ -372,7 +372,7 @@ int max_colors = 216; int font_cache = 1024 * 1024; int image_cache = 8192 * 1024; - char *font_dir = "./fnt"; + char *font_dir = PACKAGE_DATA_DIR"/data/fonts"; /* software */ desk->evas.desk = evas_new_all(e_display_get(), @@ -398,11 +398,11 @@ Evas e; e = desk->evas.desk; - o = evas_add_image_from_file(e, PACKAGE_DATA_DIR"/data/bg.png"); + o = evas_add_image_from_file(e, PACKAGE_DATA_DIR"/data/images/bg.png"); evas_move(e, o, 0, 0); evas_resize(e, o, screen_w, screen_h); evas_show(e, o); - o = evas_add_image_from_file(e, PACKAGE_DATA_DIR"/data/e_logo.png"); + o = evas_add_image_from_file(e, PACKAGE_DATA_DIR"/data/images/e_logo.png"); evas_move(e, o, 0, 0); evas_show(e, o); } |
From: <enl...@li...> - 2000-12-13 23:44:55
|
Enlightenment CVS committal Author : raster Project : e17 Module : apps/e Modified Files: Makefile.am Log Message: clean up the data section for some organisation.. in preparation for e to have proper abstractions to finding the right data files depending on user config etc. =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/Makefile.am,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- Makefile.am 2000/12/11 20:08:37 1.2 +++ Makefile.am 2000/12/13 23:44:24 1.3 @@ -12,9 +12,7 @@ if test -d $(srcdir)/data; then \ $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/data; \ for d in $(srcdir)/data/*; do \ - if test -f $$d; then \ - $(INSTALL_DATA) $$d $(DESTDIR)$(pkgdatadir)/data; \ - fi \ + cp -ar $$d $(DESTDIR)$(pkgdatadir)/data; \ done \ fi @@ -22,9 +20,7 @@ if test -d data; then \ mkdir $(distdir)/data; \ for d in data/*; do \ - if test -f $$d; then \ - cp -p $$d $(distdir)/d; \ - fi \ + cp -ar $$d $(distdir)/data; \ done \ fi |
From: <enl...@li...> - 2000-12-14 00:12:16
|
Enlightenment CVS committal Author : raster Project : e17 Module : apps/e Modified Files: Makefile.am actions.c border.c desktops.c e.h Added Files: config.c Log Message: first cut at virtualizing =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/Makefile.am,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- Makefile.am 2000/12/11 20:08:38 1.4 +++ Makefile.am 2000/12/14 00:12:16 1.5 @@ -9,6 +9,7 @@ enlightenment_SOURCES = \ actions.c \ border.c \ +config.c \ desktops.c \ exec.c \ icccm.c \ =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/actions.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- actions.c 2000/12/13 23:44:24 1.7 +++ actions.c 2000/12/14 00:12:16 1.8 @@ -57,7 +57,7 @@ static void _e_action_find(char *action, int act, int button, char *key, Ev_Key_Modifiers mods, void *o) { - char *actions_db = PACKAGE_DATA_DIR"/data/config/behavior/default/actions.db"; + char *actions_db; E_DB_File *db; int i, num; char *a_name = NULL; @@ -69,6 +69,7 @@ int a_modifiers = 0; E_Action *a; + actions_db = e_config_get("actions"); db = e_db_open_read(actions_db); if (!db) return; if (!e_db_int_get(db, "/actions/count", &num)) goto error; =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/border.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -3 -r1.10 -r1.11 --- border.c 2000/12/13 23:44:24 1.10 +++ border.c 2000/12/14 00:12:16 1.11 @@ -377,11 +377,12 @@ b = e_border_find_by_window(e->win); if (b) { - char *settings_db = PACKAGE_DATA_DIR"/data/config/behavior/default/settings.db"; + char *settings_db; E_DB_File *db; int focus_mode; char buf[4096]; + settings_db = e_config_get("settings"); b->current.selected = 0; /* settings - click to focus would affect grabs */ db = e_db_open_read(settings_db); @@ -986,12 +987,17 @@ e_border_apply_border(E_Border *b) { int pl, pr, pt, pb; + char *borders, buf[4096], *border; if ((!b->client.titlebar) && - (!b->client.border)) e_border_set_bits(b, PACKAGE_DATA_DIR"/data/config/appearance/default/borders/borderless.bits.db"); - else if (b->current.selected) e_border_set_bits(b, PACKAGE_DATA_DIR"/data/config/appearance/default/borders/border.bits.db"); - else e_border_set_bits(b, PACKAGE_DATA_DIR"/data/config/appearance/default/borders/border2.bits.db"); - + (!b->client.border)) border = "borderless.bits.db"; + else if (b->current.selected) border = "border.bits.db"; + else border = "border2.bits.db"; + + borders = e_config_get("borders"); + sprintf(buf, "%s%s", borders, border); + e_border_set_bits(b, buf); + pl = pr = pt = pb = 0; if (b->bits.t) ebits_get_insets(b->bits.t, &pl, &pr, &pt, &pb); e_icccm_set_frame_size(b->win.client, pl, pr, pt, pb); @@ -1066,9 +1072,10 @@ int max_colors = 216; int font_cache = 1024 * 1024; int image_cache = 8192 * 1024; - char *font_dir = PACKAGE_DATA_DIR"/data/fonts"; + char *font_dir; E_Desktop *desk; + font_dir = e_config_get("fonts"); b = NEW(E_Border, 1); ZERO(b, E_Border, 1); @@ -1223,12 +1230,14 @@ void e_border_attach_mouse_grabs(E_Border *b) { - char *grabs_db = PACKAGE_DATA_DIR"/data/config/behavior/default/grabs.db"; - char *settings_db = PACKAGE_DATA_DIR"/data/config/behavior/default/settings.db"; + char *grabs_db; + char *settings_db; E_DB_File *db; int focus_mode; char buf[4096]; + grabs_db = e_config_get("grabs"); + settings_db = e_config_get("settings"); /* settings - click to focus would affect grabs */ db = e_db_open_read(settings_db); sprintf(buf, "/focus/mode"); @@ -1316,14 +1325,16 @@ void e_border_redo_grabs(void) { - char *grabs_db = PACKAGE_DATA_DIR"/data/config/behavior/default/grabs.db"; - char *settings_db = PACKAGE_DATA_DIR"/data/config/behavior/default/settings.db"; + char *grabs_db; + char *settings_db; static time_t mod_date_grabs = 0; static time_t mod_date_settings = 0; time_t mod; int changed = 0; Evas_List l; + grabs_db = e_config_get("grabs"); + settings_db = e_config_get("settings"); mod = e_file_modified_time(grabs_db); if (mod != mod_date_grabs) changed = 1; mod_date_grabs = mod; =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/desktops.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- desktops.c 2000/12/13 23:44:24 1.5 +++ desktops.c 2000/12/14 00:12:16 1.6 @@ -372,8 +372,9 @@ int max_colors = 216; int font_cache = 1024 * 1024; int image_cache = 8192 * 1024; - char *font_dir = PACKAGE_DATA_DIR"/data/fonts"; + char *font_dir; + font_dir = e_config_get("fonts"); /* software */ desk->evas.desk = evas_new_all(e_display_get(), desk->win.container, @@ -396,13 +397,16 @@ { Evas_Object o; Evas e; + char buf[4096]; e = desk->evas.desk; - o = evas_add_image_from_file(e, PACKAGE_DATA_DIR"/data/images/bg.png"); + sprintf(buf, "%sbg.png", e_config_get("images")); + o = evas_add_image_from_file(e, buf); evas_move(e, o, 0, 0); evas_resize(e, o, screen_w, screen_h); evas_show(e, o); - o = evas_add_image_from_file(e, PACKAGE_DATA_DIR"/data/images/e_logo.png"); + sprintf(buf, "%se_logo.png", e_config_get("images")); + o = evas_add_image_from_file(e, buf); evas_move(e, o, 0, 0); evas_show(e, o); } =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/e.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- e.h 2000/12/13 03:14:18 1.5 +++ e.h 2000/12/14 00:12:16 1.6 @@ -355,3 +355,4 @@ pid_t e_exec_run_in_dir(char *exe, char *dir); pid_t e_run_in_dir_with_env(char *exe, char *dir, int *launch_id_ret, char **env, char *launch_path); +char *e_config_get(char *type); |
From: <enl...@li...> - 2000-12-14 19:36:35
|
Enlightenment CVS committal Author : raster Project : e17 Module : apps/e Dir : e17/apps/e/src Modified Files: config.c e.h main.c util.c Log Message: more virtualization =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/config.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- config.c 2000/12/14 00:12:16 1.1 +++ config.c 2000/12/14 19:36:33 1.2 @@ -1,48 +1,76 @@ #include "e.h" -static char cfg_grabs_db[4096]; -static char cfg_settings_db[4096]; -static char cfg_actions_db[4096]; -static char cfg_borders[4096]; +static char cfg_grabs_db[4096] = ""; +static char cfg_settings_db[4096] = ""; +static char cfg_actions_db[4096] = ""; +static char cfg_borders_db[4096] = ""; +static char cfg_user_dir[4096] = ""; +static char cfg_images_dir[4096] = ""; +static char cfg_fonts_dir[4096] = ""; -char * -e_config_get(char *type) +void +e_config_init(void) { - if (!strcmp(type, "grabs")) - { - sprintf(cfg_grabs_db, - PACKAGE_DATA_DIR"/data/config/behavior/default/grabs.db"); - return cfg_grabs_db; - } - if (!strcmp(type, "settings")) - { - sprintf(cfg_settings_db, - PACKAGE_DATA_DIR"/data/config/behavior/default/settings.db"); - return cfg_settings_db; - } - if (!strcmp(type, "actions")) + if (!e_file_is_dir(e_config_user_dir())) { - sprintf(cfg_actions_db, - PACKAGE_DATA_DIR"/data/config/behavior/default/actions.db"); - return cfg_actions_db; - } - if (!strcmp(type, "borders")) - { - sprintf(cfg_borders, - PACKAGE_DATA_DIR"/data/config/appearance/default/borders/"); - return cfg_borders; - } - if (!strcmp(type, "images")) - { - sprintf(cfg_borders, - PACKAGE_DATA_DIR"/data/images/"); - return cfg_borders; - } - if (!strcmp(type, "fonts")) - { - sprintf(cfg_borders, - PACKAGE_DATA_DIR"/data/fonts/"); - return cfg_borders; + char buf[4096]; + + sprintf(buf, "%s", e_config_user_dir()); + e_file_mkdir(buf); + sprintf(buf, "%sappearance", e_config_user_dir()); + e_file_mkdir(buf); + sprintf(buf, "%sappearance/borders", e_config_user_dir()); + e_file_mkdir(buf); + sprintf(buf, "%sbehavior", e_config_user_dir()); + e_file_mkdir(buf); + sprintf(buf, "%sbehavior/grabs.db", e_config_user_dir()); + e_file_cp(PACKAGE_DATA_DIR"/data/config/behavior/default/grabs.db", buf); + sprintf(buf, "%sbehavior/settings.db", e_config_user_dir()); + e_file_cp(PACKAGE_DATA_DIR"/data/config/behavior/default/settings.db", buf); + sprintf(buf, "%sbehavior/actions.db", e_config_user_dir()); + e_file_cp(PACKAGE_DATA_DIR"/data/config/behavior/default/actions.db", buf); + + sprintf(buf, "%sappearance/borders/border.bits.db", e_config_user_dir()); + e_file_cp(PACKAGE_DATA_DIR"/data/config/appearance/default/borders/border.bits.db", buf); + sprintf(buf, "%sappearance/borders/border2.bits.db", e_config_user_dir()); + e_file_cp(PACKAGE_DATA_DIR"/data/config/appearance/default/borders/border2.bits.db", buf); + sprintf(buf, "%sappearance/borders/borderless.bits.db", e_config_user_dir()); + e_file_cp(PACKAGE_DATA_DIR"/data/config/appearance/default/borders/borderless.bits.db", buf); } +} + +char * +e_config_user_dir(void) +{ + if (cfg_user_dir[0]) return cfg_user_dir; + sprintf(cfg_user_dir, "%s/.e/", e_file_home()); + return cfg_user_dir; +} + +#define E_CONF(_key, _var, _args...) \ +{ \ + if (!strcmp(type, _key)) \ + { \ + if ((_var)[0]) return (_var); \ + sprintf((_var), ## _args); \ + return (_var); \ + } \ +} + +char * +e_config_get(char *type) +{ + E_CONF("grabs", cfg_grabs_db, + PACKAGE_DATA_DIR"/data/config/behavior/default/grabs.db"); + E_CONF("settings", cfg_settings_db, + PACKAGE_DATA_DIR"/data/config/behavior/default/settings.db"); + E_CONF("actions", cfg_actions_db, + PACKAGE_DATA_DIR"/data/config/behavior/default/actions.db"); + E_CONF("borders", cfg_borders_db, + PACKAGE_DATA_DIR"/data/config/appearance/default/borders/"); + E_CONF("images", cfg_images_dir, + PACKAGE_DATA_DIR"/data/images/"); + E_CONF("fonts", cfg_fonts_dir, + PACKAGE_DATA_DIR"/data/fonts/"); return ""; } =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/e.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- e.h 2000/12/14 00:12:16 1.6 +++ e.h 2000/12/14 19:36:33 1.7 @@ -348,6 +348,11 @@ time_t e_file_modified_time(char *file); void e_set_env(char *variable, char *content); +int e_file_exists(char *file); +int e_file_is_dir(char *file); +char *e_file_home(void); +int e_file_mkdir(char *dir); +int e_file_cp(char *src, char *dst); void e_exec_set_args(int argc, char **argv); void e_exec_restart(void); @@ -355,4 +360,6 @@ pid_t e_exec_run_in_dir(char *exe, char *dir); pid_t e_run_in_dir_with_env(char *exe, char *dir, int *launch_id_ret, char **env, char *launch_path); +void e_config_init(void); +char *e_config_user_dir(void); char *e_config_get(char *type); =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/main.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- main.c 2000/12/11 20:08:38 1.2 +++ main.c 2000/12/14 19:36:33 1.3 @@ -38,9 +38,10 @@ int main(int argc, char **argv) { + atexit(cb_exit); e_exec_set_args(argc, argv); - atexit(cb_exit); + e_config_init(); e_display_init(NULL); e_ev_signal_init(); e_event_filter_init(); =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/util.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- util.c 2000/12/11 20:08:38 1.2 +++ util.c 2000/12/14 19:36:33 1.3 @@ -17,3 +17,64 @@ sprintf(env, "%s=%s", variable, content); putenv(env); } + +int +e_file_exists(char *file) +{ + struct stat st; + + if (stat(file, &st) < 0) return 0; + return 1; +} + +int +e_file_is_dir(char *file) +{ + struct stat st; + + if (stat(file, &st) < 0) return 0; + if (S_ISDIR(st.st_mode)) return 1; + return 0; +} + +char * +e_file_home(void) +{ + static char *home = NULL; + + if (home) return home; + home = getenv("HOME"); + if (!home) home = getenv("TMPDIR"); + if (!home) home = "/tmp"; + return home; +} + +static mode_t default_mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; + +int +e_file_mkdir(char *dir) +{ + if (mkdir(dir, default_mode) < 0) return 0; + return 1; +} + +int +e_file_cp(char *src, char *dst) +{ + FILE *f1, *f2; + char buf[4096]; + size_t num; + + f1 = fopen(src, "rb"); + if (!f1) return 0; + f2 = fopen(dst, "wb"); + if (!f2) + { + fclose(f2); + return 0; + } + while ((num = fread(buf, 1, 4096, f1)) > 0) fwrite(buf, 1, num, f2); + fclose(f1); + fclose(f2); + return 1; +} |
From: <enl...@li...> - 2000-12-14 23:13:09
|
Enlightenment CVS committal Author : raster Project : e17 Module : apps/e Dir : e17/apps/e/src Modified Files: config.c Log Message: move code around... neater... =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/config.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- config.c 2000/12/14 19:36:33 1.2 +++ config.c 2000/12/14 23:13:08 1.3 @@ -1,5 +1,15 @@ #include "e.h" +#define E_CONF(_key, _var, _args...) \ +{ \ + if (!strcmp(type, _key)) \ + { \ + if ((_var)[0]) return (_var); \ + sprintf((_var), ## _args); \ + return (_var); \ + } \ +} + static char cfg_grabs_db[4096] = ""; static char cfg_settings_db[4096] = ""; static char cfg_actions_db[4096] = ""; @@ -8,6 +18,33 @@ static char cfg_images_dir[4096] = ""; static char cfg_fonts_dir[4096] = ""; +char * +e_config_get(char *type) +{ + /* for now use the system defaults and not the user copied settings */ + /* so if i chnage stuff i dont have to rm my personaly settings and */ + /* have e re-install them. yes this is different from e16 - the */ + /* complexity of merging system and user settings is just a bit */ + /* much for my liking and have decided, for usability, and */ + /* user-freindliness to keep all settings in the user's home dir, */ + /* as well as all data - so the only place to look is there. If you */ + /* have no data it is all copied over for you the first time E is */ + /* run. It's a design decision. */ + E_CONF("grabs", cfg_grabs_db, + PACKAGE_DATA_DIR"/data/config/behavior/default/grabs.db"); + E_CONF("settings", cfg_settings_db, + PACKAGE_DATA_DIR"/data/config/behavior/default/settings.db"); + E_CONF("actions", cfg_actions_db, + PACKAGE_DATA_DIR"/data/config/behavior/default/actions.db"); + E_CONF("borders", cfg_borders_db, + PACKAGE_DATA_DIR"/data/config/appearance/default/borders/"); + E_CONF("images", cfg_images_dir, + PACKAGE_DATA_DIR"/data/images/"); + E_CONF("fonts", cfg_fonts_dir, + PACKAGE_DATA_DIR"/data/fonts/"); + return ""; +} + void e_config_init(void) { @@ -45,32 +82,4 @@ if (cfg_user_dir[0]) return cfg_user_dir; sprintf(cfg_user_dir, "%s/.e/", e_file_home()); return cfg_user_dir; -} - -#define E_CONF(_key, _var, _args...) \ -{ \ - if (!strcmp(type, _key)) \ - { \ - if ((_var)[0]) return (_var); \ - sprintf((_var), ## _args); \ - return (_var); \ - } \ -} - -char * -e_config_get(char *type) -{ - E_CONF("grabs", cfg_grabs_db, - PACKAGE_DATA_DIR"/data/config/behavior/default/grabs.db"); - E_CONF("settings", cfg_settings_db, - PACKAGE_DATA_DIR"/data/config/behavior/default/settings.db"); - E_CONF("actions", cfg_actions_db, - PACKAGE_DATA_DIR"/data/config/behavior/default/actions.db"); - E_CONF("borders", cfg_borders_db, - PACKAGE_DATA_DIR"/data/config/appearance/default/borders/"); - E_CONF("images", cfg_images_dir, - PACKAGE_DATA_DIR"/data/images/"); - E_CONF("fonts", cfg_fonts_dir, - PACKAGE_DATA_DIR"/data/fonts/"); - return ""; } |
From: <enl...@li...> - 2000-12-15 20:57:13
|
Enlightenment CVS committal Author : raster Project : e17 Module : apps/e Dir : e17/apps/e/data/config/appearance/default/borders/default Log Message: Directory /cvsroot/enlightenment/e17/apps/e/data/config/appearance/default/borders/default added to the repository |
From: <enl...@li...> - 2000-12-15 20:57:13
|
Enlightenment CVS committal Author : raster Project : e17 Module : apps/e Dir : e17/apps/e/data/config/appearance/default/borders/borderless Log Message: Directory /cvsroot/enlightenment/e17/apps/e/data/config/appearance/default/borders/borderless added to the repository |
From: <enl...@li...> - 2000-12-15 23:10:48
|
Enlightenment CVS committal Author : raster Project : e17 Module : apps/e Dir : e17/apps/e Modified Files: Makefile.am Log Message: SHHHHHHHHH cp - just symlink and be quiet! =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/Makefile.am,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- Makefile.am 2000/12/13 23:44:24 1.3 +++ Makefile.am 2000/12/15 22:09:52 1.4 @@ -12,7 +12,7 @@ if test -d $(srcdir)/data; then \ $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/data; \ for d in $(srcdir)/data/*; do \ - cp -ar $$d $(DESTDIR)$(pkgdatadir)/data; \ + cp -afr $$d $(DESTDIR)$(pkgdatadir)/data; \ done \ fi |
From: <enl...@li...> - 2000-12-15 23:42:06
|
Enlightenment CVS committal Author : raster Project : e17 Module : apps/e Dir : e17/apps/e Modified Files: autogen.sh Log Message: borders moved around. much cleaner way of selecting borders now =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/autogen.sh,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- autogen.sh 2000/12/08 22:54:41 1.1 +++ autogen.sh 2000/12/15 21:27:22 1.2 @@ -146,3 +146,24 @@ else echo Skipping configure process. fi + + +cd data/config/appearance/default/borders/ +cd borderless +ln -sf selected-0.sticky-0.shaded-0.bits.db selected-1.sticky-0.shaded-0.bits.db +ln -sf selected-0.sticky-0.shaded-0.bits.db selected-0.sticky-1.shaded-0.bits.db +ln -sf selected-0.sticky-0.shaded-0.bits.db selected-0.sticky-0.shaded-1.bits.db +ln -sf selected-0.sticky-0.shaded-0.bits.db selected-1.sticky-1.shaded-0.bits.db +ln -sf selected-0.sticky-0.shaded-0.bits.db selected-1.sticky-0.shaded-1.bits.db +ln -sf selected-0.sticky-0.shaded-0.bits.db selected-1.sticky-1.shaded-1.bits.db +ln -sf selected-0.sticky-0.shaded-0.bits.db selected-0.sticky-1.shaded-1.bits.db +cd .. +cd default +#ln -sf selected-0.sticky-0.shaded-0.bits.db selected-1.sticky-0.shaded-0.bits.db +ln -sf selected-0.sticky-0.shaded-0.bits.db selected-0.sticky-1.shaded-0.bits.db +ln -sf selected-0.sticky-0.shaded-0.bits.db selected-0.sticky-0.shaded-1.bits.db +ln -sf selected-0.sticky-0.shaded-0.bits.db selected-1.sticky-1.shaded-0.bits.db +ln -sf selected-0.sticky-0.shaded-0.bits.db selected-1.sticky-0.shaded-1.bits.db +ln -sf selected-0.sticky-0.shaded-0.bits.db selected-1.sticky-1.shaded-1.bits.db +ln -sf selected-0.sticky-0.shaded-0.bits.db selected-0.sticky-1.shaded-1.bits.db +cd .. |
From: <enl...@li...> - 2000-12-15 23:42:10
|
Enlightenment CVS committal Author : raster Project : e17 Module : apps/e Dir : e17/apps/e/src Modified Files: actions.c border.c config.c e.h util.c Log Message: borders moved around. much cleaner way of selecting borders now =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/actions.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- actions.c 2000/12/14 00:12:16 1.8 +++ actions.c 2000/12/15 21:27:23 1.9 @@ -747,6 +747,7 @@ e_border_adjust_limits(b); if (si < b->client.h) e_add_event_timer("shader", 0.01, e_act_cb_shade, 1, data); + e_border_apply_border(b); } static void e_act_cb_unshade(int val, void *data); @@ -766,11 +767,13 @@ si = b->client.h - (int)(dif * (double)pix_per_sec); if (si < 0) si = 0; + b->current.shaded = si; b->changed = 1; e_border_adjust_limits(b); if (si > 0) e_add_event_timer("shader", 0.01, e_act_cb_unshade, 1, data); + e_border_apply_border(b); } static void =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/border.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -3 -r1.11 -r1.12 --- border.c 2000/12/14 00:12:16 1.11 +++ border.c 2000/12/15 21:27:23 1.12 @@ -987,15 +987,26 @@ e_border_apply_border(E_Border *b) { int pl, pr, pt, pb; - char *borders, buf[4096], *border; + char *borders, buf[4096], border[4096], *style = NULL; + int prop_selected = 0, prop_sticky = 0, prop_shaded = 0; - if ((!b->client.titlebar) && - (!b->client.border)) border = "borderless.bits.db"; - else if (b->current.selected) border = "border.bits.db"; - else border = "border2.bits.db"; + style = "default"; + if ((!b->client.titlebar) && (!b->client.border)) style = "borderless"; + + if (b->current.selected) prop_selected = 1; + if (b->current.shaded == b->client.h) prop_shaded = 1; + if (b->client.sticky) prop_sticky = 1; + + sprintf(border, "selected-%i.sticky-%i.shaded-%i.bits.db", + prop_selected, prop_sticky, prop_shaded); borders = e_config_get("borders"); - sprintf(buf, "%s%s", borders, border); + sprintf(buf, "%s%s/%s", borders, style, border); + /* if it's not changed - abort and dont do anything */ + if ((b->border_file) && (!strcmp(buf, b->border_file))) return; + IF_FREE(b->border_file); + b->border_file = strdup(buf); + e_border_set_bits(b, buf); pl = pr = pt = pb = 0; =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/config.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- config.c 2000/12/14 23:13:08 1.3 +++ config.c 2000/12/15 21:27:23 1.4 @@ -1,5 +1,7 @@ #include "e.h" +static char cfg_root[] = ""; + #define E_CONF(_key, _var, _args...) \ { \ if (!strcmp(type, _key)) \ @@ -30,6 +32,12 @@ /* as well as all data - so the only place to look is there. If you */ /* have no data it is all copied over for you the first time E is */ /* run. It's a design decision. */ + /* Later when things are a bit mroe stabilised these will look */ + /* something like: */ + /* E_CONF("grabs", cfg_grabs_db, */ + /* "%sbehavior/default/grabs.db", e_config_user_dir()); */ + /* notice it would use the user config location instead */ + /* but for now i'm keeping it as is for development "ease" */ E_CONF("grabs", cfg_grabs_db, PACKAGE_DATA_DIR"/data/config/behavior/default/grabs.db"); E_CONF("settings", cfg_settings_db, @@ -76,10 +84,27 @@ } } +void +e_config_set_user_dir(char *dir) +{ + strcpy(cfg_root, dir); + /* reset the cached dir paths */ + cfg_grabs_db[0] = 0; + cfg_settings_db[0] = 0; + cfg_actions_db[0] = 0; + cfg_borders_db[0] = 0; + cfg_user_dir[0] = 0; + cfg_images_dir[0] = 0; + cfg_fonts_dir[0] = 0; + /* init again - if the user hasnt got all the data */ + e_config_init(); +} + char * e_config_user_dir(void) { if (cfg_user_dir[0]) return cfg_user_dir; + if (cfg_root[0]) return cfg_root; sprintf(cfg_user_dir, "%s/.e/", e_file_home()); return cfg_user_dir; } =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/e.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- e.h 2000/12/14 19:36:33 1.7 +++ e.h 2000/12/15 21:27:23 1.8 @@ -208,6 +208,8 @@ Evas_List grabs; E_Desktop *desk; + char *border_file; + int changed; }; @@ -360,6 +362,7 @@ pid_t e_exec_run_in_dir(char *exe, char *dir); pid_t e_run_in_dir_with_env(char *exe, char *dir, int *launch_id_ret, char **env, char *launch_path); +char *e_config_get(char *type); void e_config_init(void); +void e_config_set_user_dir(char *dir); char *e_config_user_dir(void); -char *e_config_get(char *type); =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/util.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- util.c 2000/12/14 19:36:33 1.3 +++ util.c 2000/12/15 21:27:23 1.4 @@ -70,7 +70,7 @@ f2 = fopen(dst, "wb"); if (!f2) { - fclose(f2); + fclose(f1); return 0; } while ((num = fread(buf, 1, 4096, f1)) > 0) fwrite(buf, 1, num, f2); |
From: <enl...@li...> - 2000-12-15 23:42:10
|
Enlightenment CVS committal Author : raster Project : e17 Module : apps/e Dir : e17/apps/e/data/config/appearance/default/borders/default Added Files: selected-0.sticky-0.shaded-0.bits.db selected-1.sticky-0.shaded-0.bits.db Log Message: borders moved around. much cleaner way of selecting borders now |
From: <enl...@li...> - 2000-12-15 23:42:10
|
Enlightenment CVS committal Author : raster Project : e17 Module : apps/e Dir : e17/apps/e/data/config/appearance/default/borders/borderless Added Files: selected-0.sticky-0.shaded-0.bits.db Log Message: borders moved around. much cleaner way of selecting borders now |
From: <enl...@li...> - 2000-12-15 23:42:10
|
Enlightenment CVS committal Author : raster Project : e17 Module : apps/e Dir : e17/apps/e/data/config/appearance/default/borders Removed Files: border.bits.db border2.bits.db borderless.bits.db Log Message: borders moved around. much cleaner way of selecting borders now |
From: <enl...@li...> - 2000-12-18 21:28:44
|
Enlightenment CVS committal Author : raster Project : e17 Module : apps/e Dir : e17/apps/e/data/orig Added Files: border.xcf Log Message: e17 now handles shaped client windows.. and if they change shape... it also handles clients that re-configfure size and position whilst shaiding & unshading and whilst shaded. it also doesnt segv if a window closes/vanishes whilst shading (i added a subsystem to handle stopping of continuing timed out actions if their object goes away) |
From: <enl...@li...> - 2000-12-18 21:28:45
|
Enlightenment CVS committal Author : raster Project : e17 Module : apps/e Dir : e17/apps/e/src Modified Files: Makefile.am actions.c border.c desktops.c e.h icccm.c Added Files: view.c Log Message: e17 now handles shaped client windows.. and if they change shape... it also handles clients that re-configfure size and position whilst shaiding & unshading and whilst shaded. it also doesnt segv if a window closes/vanishes whilst shading (i added a subsystem to handle stopping of continuing timed out actions if their object goes away) =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/Makefile.am,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- Makefile.am 2000/12/14 00:12:16 1.5 +++ Makefile.am 2000/12/18 21:28:44 1.6 @@ -16,6 +16,7 @@ main.c \ resist.c \ util.c \ +view.c \ e.h enlightenment_LDADD = @evas_libs@ @edb_libs@ @ebits_libs@ @ecore_libs@ -lm $(INTLLIBS) =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/actions.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- actions.c 2000/12/15 21:27:23 1.9 +++ actions.c 2000/12/18 21:28:44 1.10 @@ -2,6 +2,7 @@ static Evas_List action_protos = NULL; static Evas_List current_actions = NULL; +static Evas_List current_timers = NULL; static void _e_action_find(char *action, int act, int button, char *key, Ev_Key_Modifiers mods, void *o); static void _e_action_free(E_Action *a); @@ -292,6 +293,7 @@ { Evas_List l; + e_actions_del_timer_object(o); again: for (l = current_actions; l; l = l->next) { @@ -337,6 +339,64 @@ } void +e_actions_del_timer(void *o, char *name) +{ + Evas_List l; + + again: + for (l = current_timers; l; l = l->next) + { + E_Active_Action_Timer *at; + + at = l->data; + if ((at->object == o) && + (name) && + (at->name) && + (!strcmp(at->name, name))) + { + e_del_event_timer(at->name); + current_timers = evas_list_remove(current_timers, at); + IF_FREE(at->name); + FREE(at); + goto again; + } + } +} + +void +e_actions_add_timer(void *o, char *name) +{ + E_Active_Action_Timer *at; + + at = NEW(E_Active_Action_Timer, 1); + at->object = o; + at->name = strdup(name); + current_timers = evas_list_append(current_timers, at); +} + +void +e_actions_del_timer_object(void *o) +{ + Evas_List l; + + again: + for (l = current_timers; l; l = l->next) + { + E_Active_Action_Timer *at; + + at = l->data; + if (at->object == o) + { + e_del_event_timer(at->name); + current_timers = evas_list_remove(current_timers, at); + IF_FREE(at->name); + FREE(at); + goto again; + } + } +} + +void e_actions_init(void) { e_action_add_proto("Window_Move", e_act_move_start, e_act_move_stop, e_act_move_go); @@ -733,10 +793,17 @@ static double t = 0.0; double dif; int si; - int pix_per_sec = 1600; + int pix_per_sec = 3200; b = data; - if (val == 0) t = e_get_time(); + if (val == 0) + { + OBJ_REF(b); + t = e_get_time(); + e_window_gravity_set(b->win.client, SouthWestGravity); + e_actions_del_timer(b, "shader"); + e_actions_add_timer(b, "shader"); + } dif = e_get_time() - t; @@ -745,9 +812,15 @@ b->current.shaded = si; b->changed = 1; e_border_adjust_limits(b); + e_border_apply_border(b); if (si < b->client.h) e_add_event_timer("shader", 0.01, e_act_cb_shade, 1, data); - e_border_apply_border(b); + else + { + e_actions_del_timer(b, "shader"); + e_window_gravity_reset(b->win.client); + OBJ_UNREF(b); + } } static void e_act_cb_unshade(int val, void *data); @@ -758,10 +831,17 @@ static double t = 0.0; double dif; int si; - int pix_per_sec = 1600; + int pix_per_sec = 3200; b = data; - if (val == 0) t = e_get_time(); + if (val == 0) + { + OBJ_REF(b); + t = e_get_time(); + e_window_gravity_set(b->win.client, SouthWestGravity); + e_actions_del_timer(b, "shader"); + e_actions_add_timer(b, "shader"); + } dif = e_get_time() - t; @@ -771,9 +851,15 @@ b->current.shaded = si; b->changed = 1; e_border_adjust_limits(b); + e_border_apply_border(b); if (si > 0) e_add_event_timer("shader", 0.01, e_act_cb_unshade, 1, data); - e_border_apply_border(b); + else + { + e_actions_del_timer(b, "shader"); + e_window_gravity_reset(b->win.client); + OBJ_UNREF(b); + } } static void =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/border.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -3 -r1.12 -r1.13 --- border.c 2000/12/15 21:27:23 1.12 +++ border.c 2000/12/18 21:28:44 1.13 @@ -119,7 +119,24 @@ if (e->mask & EV_VALUE_W) b->current.requested.w = e->w + pl + pr; if (e->mask & EV_VALUE_H) - b->current.requested.h = e->h + pt + pb; + { + if (b->current.shaded == b->client.h) + { + b->current.shaded = e->h; + } + else if (b->current.shaded != 0) + { + b->current.shaded += b->client.h - e->h; + if (b->current.shaded > b->client.h) + b->current.shaded = b->client.h; + if (b->current.shaded < 1) + b->current.shaded = 1; + } + b->client.w = e->w; + b->client.h = e->h; + + b->current.requested.h = e->h + pt + pb; + } if ((e->mask & EV_VALUE_SIBLING) && (e->mask & EV_VALUE_STACKING)) { E_Border *b_rel; @@ -335,8 +352,11 @@ E_Border *b; b = e_border_find_by_window(e->win); - if (b) + if ((b) && (e->win == b->win.client)) { + b->current.shaped_client = e_icccm_is_shaped(e->win); + b->changed = 1; + b->shape_changed = 1; } } current_ev = NULL; @@ -1014,6 +1034,91 @@ e_icccm_set_frame_size(b->win.client, pl, pr, pt, pb); } +void +e_border_reshape(E_Border *b) +{ + static Window shape_win = 0; + int pl, pr, pt, pb; + + if ((b->current.shaped_client == b->previous.shaped_client) && + (b->current.shape_changes == b->previous.shape_changes) && + (b->current.has_shape == b->previous.has_shape) && + (!b->shape_changed)) + return; + if (!shape_win) shape_win = e_window_override_new(0, 0, 0, 1, 1); + pl = pr = pt = pb = 0; + if (b->bits.t) ebits_get_insets(b->bits.t, &pl, &pr, &pt, &pb); + b->shape_changed = 0; + if ((!b->current.shaped_client) && (!b->current.has_shape)) + { + e_window_set_shape_mask(b->win.main, 0); + return; + } + if ((b->current.shaped_client) && (!b->current.has_shape)) + { + XRectangle rects[4]; + + rects[0].x = 0; rects[0].y = 0; + rects[0].width = b->current.w; rects[0].height = pt; + rects[1].x = 0; rects[1].y = pt; + rects[1].width = pl; rects[1].height = b->current.h - pt - pb; + rects[2].x = b->current.w - pr; rects[2].y = pt; + rects[2].width = pr; rects[2].height = b->current.h - pt - pb; + rects[3].x = 0; rects[3].y = b->current.h - pb; + rects[3].width = b->current.w; rects[3].height = pb; + + e_window_resize(shape_win, b->current.w, b->current.h); + e_window_set_shape_window(shape_win, b->win.client, pl, pt - b->current.shaded); + e_window_clip_shape_by_rectangle(shape_win, pl, pt, b->current.w - pl - pr, b->current.h - pt - pb); + e_window_add_shape_rectangles(shape_win, rects, 4); + e_window_set_shape_window(b->win.main, shape_win, 0, 0); + return; + } + if ((!b->current.shaped_client) && (b->current.has_shape)) + { + e_window_resize(shape_win, b->current.w, b->current.h); + e_window_set_shape_rectangle(shape_win, pl, pt - b->current.shaded, b->current.w - pl - pr, b->current.h - pt - pb); + /* FIXME: later when i actually generate shape masks for borders */ + { + XRectangle rects[4]; + + rects[0].x = 0; rects[0].y = 0; + rects[0].width = b->current.w; rects[0].height = pt; + rects[1].x = 0; rects[1].y = pt; + rects[1].width = pl; rects[1].height = b->current.h - pt - pb; + rects[2].x = b->current.w - pr; rects[2].y = pt; + rects[2].width = pr; rects[2].height = b->current.h - pt - pb; + rects[3].x = 0; rects[3].y = b->current.h - pb; + rects[3].width = b->current.w; rects[3].height = pb; + e_window_add_shape_rectangles(shape_win, rects, 4); + } + e_window_set_shape_window(b->win.main, shape_win, 0, 0); + return; + } + if ((b->current.shaped_client) && (b->current.has_shape)) + { + e_window_resize(shape_win, b->current.w, b->current.h); + e_window_set_shape_window(shape_win, b->win.client, pl, pt - b->current.shaded); + e_window_clip_shape_by_rectangle(shape_win, pl, pt, b->current.w - pl - pr, b->current.h - pt - pb); + /* FIXME: later when i actually generate shape masks for borders */ + { + XRectangle rects[4]; + + rects[0].x = 0; rects[0].y = 0; + rects[0].width = b->current.w; rects[0].height = pt; + rects[1].x = 0; rects[1].y = pt; + rects[1].width = pl; rects[1].height = b->current.h - pt - pb; + rects[2].x = b->current.w - pr; rects[2].y = pt; + rects[2].width = pr; rects[2].height = b->current.h - pt - pb; + rects[3].x = 0; rects[3].y = b->current.h - pb; + rects[3].width = b->current.w; rects[3].height = pb; + e_window_add_shape_rectangles(shape_win, rects, 4); + } + e_window_set_shape_window(b->win.main, shape_win, 0, 0); + return; + } +} + E_Border * e_border_adopt(Window win, int use_client_pos) { @@ -1029,6 +1134,7 @@ XEV_FOCUS | XEV_PROPERTY | XEV_COLORMAP); + e_window_select_shape_events(win); /* parent of the client window listens for these */ e_window_set_events(b->win.container, XEV_CHILD_CHANGE | XEV_CHILD_REDIRECT); /* add to save set & border of 0 */ @@ -1036,10 +1142,11 @@ e_window_set_border_width(win, 0); b->win.client = win; b->current.requested.visible = 1; - /* get size & location hints */ + /* get hints */ e_icccm_get_size_info(win, b); e_icccm_get_mwm_hints(win, b); e_icccm_get_layer(win, b); + b->current.shaped_client = e_icccm_is_shaped(win); /* we have now placed the bugger */ b->placed = 1; /* desk area */ @@ -1593,14 +1700,14 @@ location_changed = 1; if ((b->current.w != b->previous.w) || (b->current.h != b->previous.h)) size_changed = 1; - if ((size_changed) && (b->has_shape)) + if ((size_changed) && (b->current.has_shape)) shape_changed = 1; if (b->bits.new) { e_window_gravity_set(b->win.container, StaticGravity); border_changed = 1; } - if ((border_changed) && (b->has_shape)) + if ((border_changed) && (b->current.has_shape)) shape_changed = 1; if (b->current.visible != b->previous.visible) visibility_changed = 1; @@ -1636,6 +1743,10 @@ int pl, pr, pt, pb, x, y, w, h; int smaller; + if ((b->current.shaped_client) || (b->previous.shaped_client) || + (b->current.shape_changes) || (b->previous.shape_changes) || + (b->current.has_shape) || (b->previous.has_shape)) + b->shape_changed = 1; smaller = 0; if ((b->current.w < b->previous.w) || (b->current.h < b->previous.h)) smaller = 1; @@ -1655,8 +1766,8 @@ e_window_move_resize(b->win.container, b->current.w + 1, b->current.h + 1, - 1, - 1); + 320, + 320); } else { @@ -1720,6 +1831,7 @@ b->client.w, b->client.h); e_cb_border_move_resize(b); } + e_border_reshape(b); if (visibility_changed) { if (b->current.visible) =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/desktops.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- desktops.c 2000/12/14 00:12:16 1.6 +++ desktops.c 2000/12/18 21:28:44 1.7 @@ -63,6 +63,7 @@ } } } + /* handling mouse up events */ static void e_mouse_up(Eevent * ev) @@ -95,6 +96,7 @@ } } } + /* handling mouse move events */ static void e_mouse_move(Eevent * ev) @@ -161,6 +163,7 @@ } } } + /* handling mouse leave events */ static void e_mouse_out(Eevent * ev) @@ -304,7 +307,8 @@ b = l->data; /* if sticky */ -/* e_window_gravity_set(b->win.main, StaticGravity); */ + if (b->client.sticky) + e_window_gravity_set(b->win.main, StaticGravity); e_window_gravity_set(b->win.main, grav); } grav_stick = StaticGravity; =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/e.h,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- e.h 2000/12/15 21:27:23 1.8 +++ e.h 2000/12/18 21:28:44 1.9 @@ -79,7 +79,7 @@ #define OBJ_REF(_e_obj) _e_obj->references++ -#define OBJ_UNREF(_e_obj) _e_obj->references--; +#define OBJ_UNREF(_e_obj) _e_obj->references-- #define OBJ_IF_FREE(_e_obj) if (_e_obj->references == 0) #define OBJ_FREE(_e_obj) _e_obj->e_obj_free(_e_obj) #define OBJ_DO_FREE(_e_obj) \ @@ -121,14 +121,16 @@ e_window_gravity_set(_b->win.t, _grav); \ e_window_gravity_set(_b->win.b, _grav); -typedef struct _E_Object E_Object; -typedef struct _E_Border E_Border; -typedef struct _E_Grab E_Grab; -typedef struct _E_Action E_Action; -typedef struct _E_Action_Proto E_Action_Proto; -typedef struct _E_Desktop E_Desktop; -typedef struct _E_Rect E_Rect; - +typedef struct _E_Object E_Object; +typedef struct _E_Border E_Border; +typedef struct _E_Grab E_Grab; +typedef struct _E_Action E_Action; +typedef struct _E_Action_Proto E_Action_Proto; +typedef struct _E_Desktop E_Desktop; +typedef struct _E_Rect E_Rect; +typedef struct _E_Active_Action_Timer E_Active_Action_Timer; +typedef struct _E_View E_View; + struct _E_Object { OBJ_PROPERTIES; @@ -166,6 +168,9 @@ int visible; int selected; int shaded; + int has_shape; + int shape_changes; + int shaped_client; } current, previous; struct { @@ -174,7 +179,6 @@ double aspect; } base, min, max, step; int layer; - int shaped; char *title; char *name; char *class; @@ -187,7 +191,6 @@ int arrange_ignore; int hidden; int iconified; - int borderless; int titlebar; int border; int handles; @@ -198,11 +201,9 @@ int move, resize; } mode; - int has_shape; - int shape_changes; int ignore_unmap; - + int shape_changed; int placed; Evas_List grabs; @@ -277,6 +278,17 @@ int v1, v2, v3, v4; }; +struct _E_Active_Action_Timer +{ + void *object; + char *name; +}; + +struct _E_View +{ + OBJ_PROPERTIES +}; + void e_action_add_proto(char *action, void (*func_start) (void *o, E_Action *a, void *data, int x, int y, int rx, int ry), void (*func_stop) (void *o, E_Action *a, void *data, int x, int y, int rx, int ry), @@ -286,10 +298,14 @@ void e_action_stop(char *action, int act, int button, char *key, Ev_Key_Modifiers mods, void *o, void *data, int x, int y, int rx, int ry); void e_action_go(char *action, int act, int button, char *key, Ev_Key_Modifiers mods, void *o, void *data, int x, int y, int rx, int ry, int dx, int dy); void e_action_stop_by_object(void *o, void *data, int x, int y, int rx, int ry); - +void e_actions_del_timer(void *o, char *name); +void e_actions_add_timer(void *o, char *name); +void e_actions_del_timer_object(void *o); + void e_border_apply_border(E_Border *b); E_Border * e_border_new(void); E_Border * e_border_adopt(Window win, int use_client_pos); +void e_border_reshape(E_Border *b); void e_border_free(E_Border *b); void e_border_remove_mouse_grabs(E_Border *b); void e_border_attach_mouse_grabs(E_Border *b); @@ -323,6 +339,7 @@ void e_icccm_set_desk_area(Window win, int ax, int ay); void e_icccm_set_desk_area_size(Window win, int ax, int ay); void e_icccm_set_desk(Window win, int d); +int e_icccm_is_shaped(Window win); void e_icccm_handle_property_change(Atom a, E_Border *b); void e_icccm_handle_client_message(Ev_Message *e); void e_icccm_advertise_e_compat(void); =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/icccm.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- icccm.c 2000/12/11 20:08:38 1.3 +++ icccm.c 2000/12/18 21:28:44 1.4 @@ -370,6 +370,24 @@ e_window_property_set(win, a_win_workspace, XA_CARDINAL, 32, props, 1); } +int +e_icccm_is_shaped(Window win) +{ + int w, h, num; + int shaped = 1; + + XRectangle *rect; + e_window_get_geometry(win, NULL, NULL, &w, &h); + rect = e_window_get_shape_rectangles(win, &num); + if (!rect) return 1; + if ((num == 1) && + (rect[0].x == 0) && (rect[0].y == 0) && + (rect[0].width == w) && (rect[0].height == h)) + shaped = 0; + XFree(rect); + return shaped; +} + void e_icccm_handle_property_change(Atom a, E_Border *b) { |
From: <enl...@so...> - 2001-01-02 23:10:15
|
Enlightenment CVS committal Author : raster Project : e17 Module : apps/e Modified Files: actions.c border.c config.c desktops.c e.h icccm.c main.c menu.c Log Message: e17 does..... MENUS! =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/actions.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -3 -r1.10 -r1.11 --- actions.c 2000/12/18 21:28:44 1.10 +++ actions.c 2001/01/02 23:10:12 1.11 @@ -500,6 +500,7 @@ E_Border *b; b = o; + if (b->current.shaded != 0) return; /* 0 | 1 */ /* --+-- */ /* 2 | 3 */ @@ -564,6 +565,7 @@ E_Border *b; b = o; + if (b->current.shaded != 0) return; if (b->mode.resize == 0) { b->current.requested.w -= dx; @@ -606,6 +608,7 @@ E_Border *b; b = o; + if (b->current.shaded != 0) return; /* 4 | 5 */ if (x > (b->current.w / 2)) { @@ -653,6 +656,7 @@ E_Border *b; b = o; + if (b->current.shaded != 0) return; if (b->mode.resize == 4) { b->current.requested.w -= dx; @@ -681,6 +685,7 @@ E_Border *b; b = o; + if (b->current.shaded != 0) return; /* 6 */ /* - */ /* 7 */ @@ -730,6 +735,7 @@ E_Border *b; b = o; + if (b->current.shaded != 0) return; if (b->mode.resize == 6) { b->current.requested.h -= dy; =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/border.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -3 -r1.14 -r1.15 --- border.c 2000/12/29 20:49:17 1.14 +++ border.c 2001/01/02 23:10:12 1.15 @@ -62,12 +62,18 @@ b = l->data; e_border_update(b); } - for (l = evases; l; l = l->next) + for (l = borders; l; l = l->next) { - Evas evas; + E_Border *b; - evas = l->data; - evas_render(evas); + b = l->data; + if (b->first_expose) + { + evas_render(b->evas.l); + evas_render(b->evas.r); + evas_render(b->evas.t); + evas_render(b->evas.b); + } } e_db_runtime_flush(); return; @@ -704,6 +710,7 @@ e = ev->event; { Evas_List l; + E_Border *b; for (l = evases; l; l = l->next) { @@ -713,6 +720,8 @@ if (evas_get_window(evas) == e->win) evas_update_rect(evas, e->x, e->y, e->w, e->h); } + b = e_border_find_by_window(e->win); + if (b) b->first_expose = 1; } current_ev = NULL; } @@ -1146,6 +1155,7 @@ e_icccm_get_size_info(win, b); e_icccm_get_mwm_hints(win, b); e_icccm_get_layer(win, b); + e_icccm_get_title(win, b); b->current.shaped_client = e_icccm_is_shaped(win); /* we have now placed the bugger */ b->placed = 1; @@ -1220,7 +1230,10 @@ b->win.main = e_window_override_new(desk->win.container, 0, 0, 1, 1); b->win.input = e_window_input_new(b->win.main, 0, 0, 1, 1); b->win.container = e_window_override_new(b->win.main, 0, 0, 1, 1); - e_window_set_events(b->win.input, XEV_MOUSE_MOVE | XEV_BUTTON | XEV_IN_OUT); + e_window_set_events_propagate(b->win.input, 1); + e_window_set_events(b->win.input, XEV_MOUSE_MOVE | XEV_BUTTON); + e_window_set_events(b->win.main, XEV_IN_OUT); + e_window_set_events(b->win.container, XEV_IN_OUT); e_window_show(b->win.input); e_window_show(b->win.container); @@ -1264,7 +1277,47 @@ font_dir); b->win.b = evas_get_window(b->evas.b); e_add_child(b->win.main, b->win.b); - + + b->obj.title.l = evas_add_text(b->evas.l, "borzoib", 8, ""); + b->obj.title.r = evas_add_text(b->evas.r, "borzoib", 8, ""); + b->obj.title.t = evas_add_text(b->evas.t, "borzoib", 8, ""); + b->obj.title.b = evas_add_text(b->evas.b, "borzoib", 8, ""); + + b->obj.title_clip.l = evas_add_rectangle(b->evas.l); + b->obj.title_clip.r = evas_add_rectangle(b->evas.r); + b->obj.title_clip.t = evas_add_rectangle(b->evas.t); + b->obj.title_clip.b = evas_add_rectangle(b->evas.b); + + evas_set_color(b->evas.l, b->obj.title_clip.l, 255, 255, 255, 255); + evas_set_color(b->evas.r, b->obj.title_clip.r, 255, 255, 255, 255); + evas_set_color(b->evas.t, b->obj.title_clip.t, 255, 255, 255, 255); + evas_set_color(b->evas.b, b->obj.title_clip.b, 255, 255, 255, 255); + + evas_set_pass_events(b->evas.l, b->obj.title.l, 1); + evas_set_pass_events(b->evas.r, b->obj.title.r, 1); + evas_set_pass_events(b->evas.t, b->obj.title.t, 1); + evas_set_pass_events(b->evas.b, b->obj.title.b, 1); + + evas_set_color(b->evas.l, b->obj.title.l, 0, 0, 0, 255); + evas_set_color(b->evas.r, b->obj.title.r, 0, 0, 0, 255); + evas_set_color(b->evas.t, b->obj.title.t, 0, 0, 0, 255); + evas_set_color(b->evas.b, b->obj.title.b, 0, 0, 0, 255); + + evas_show(b->evas.l, b->obj.title.l); + evas_show(b->evas.r, b->obj.title.r); + evas_show(b->evas.t, b->obj.title.t); + evas_show(b->evas.b, b->obj.title.b); + + evas_show(b->evas.l, b->obj.title_clip.l); + evas_show(b->evas.r, b->obj.title_clip.r); + evas_show(b->evas.t, b->obj.title_clip.t); + evas_show(b->evas.b, b->obj.title_clip.b); + + evas_set_clip(b->evas.l, b->obj.title.l, b->obj.title_clip.l); + evas_set_clip(b->evas.l, b->obj.title.r, b->obj.title_clip.r); + evas_set_clip(b->evas.l, b->obj.title.t, b->obj.title_clip.t); + evas_set_clip(b->evas.l, b->obj.title.b, b->obj.title_clip.b); + e_window_raise(b->win.input); e_window_raise(b->win.container); @@ -1516,11 +1569,11 @@ b->bits.r = ebits_load(file); b->bits.t = ebits_load(file); b->bits.b = ebits_load(file); - + b->bits.new = 1; b->changed = 1; - if (b->bits.t) ebits_get_insets(b->bits.l, &ppl, &ppr, &ppt, &ppb); + if (b->bits.t) ebits_get_insets(b->bits.t, &ppl, &ppr, &ppt, &ppb); b->current.requested.w -= (pl + pr) - (ppl + ppr); b->current.requested.h -= (pt + pb) - (ppt + ppb); b->current.requested.x += (pl - ppl); @@ -1825,11 +1878,44 @@ if (b->bits.r) ebits_resize(b->bits.r, b->current.w, b->current.h); if (b->bits.t) ebits_resize(b->bits.t, b->current.w, b->current.h); if (b->bits.b) ebits_resize(b->bits.b, b->current.w, b->current.h); - + e_icccm_move_resize(b->win.client, b->current.x + pl, b->current.y + pt - b->current.shaded, b->client.w, b->client.h); e_cb_border_move_resize(b); + } + if ((b->client.title) && (b->bits.t)) + { + double tx, ty, tw, th; + + ebits_get_bit_geometry(b->bits.l, "Title_Area", &tx, &ty, &tw, &th); + evas_set_text(b->evas.l, b->obj.title.l, b->client.title); + evas_move(b->evas.l, b->obj.title.l, tx, ty); + evas_move(b->evas.l, b->obj.title_clip.l, tx, ty); + evas_resize(b->evas.l, b->obj.title_clip.l, tw, th); + + ebits_get_bit_geometry(b->bits.r, "Title_Area", &tx, &ty, &tw, &th); + evas_set_text(b->evas.r, b->obj.title.r, b->client.title); + evas_move(b->evas.r, b->obj.title.r, tx, ty); + evas_move(b->evas.r, b->obj.title_clip.r, tx, ty); + evas_resize(b->evas.r, b->obj.title_clip.r, tw, th); + + ebits_get_bit_geometry(b->bits.t, "Title_Area", &tx, &ty, &tw, &th); + evas_set_text(b->evas.t, b->obj.title.t, b->client.title); + evas_move(b->evas.t, b->obj.title.t, tx, ty); + evas_move(b->evas.t, b->obj.title_clip.t, tx, ty); + evas_resize(b->evas.t, b->obj.title_clip.t, tw, th); + + ebits_get_bit_geometry(b->bits.b, "Title_Area", &tx, &ty, &tw, &th); + evas_set_text(b->evas.b, b->obj.title.b, b->client.title); + evas_move(b->evas.b, b->obj.title.b, tx, ty); + evas_move(b->evas.b, b->obj.title_clip.b, tx, ty); + evas_resize(b->evas.b, b->obj.title_clip.b, tw, th); + + evas_set_layer(b->evas.l, b->obj.title.l, 1); + evas_set_layer(b->evas.r, b->obj.title.r, 1); + evas_set_layer(b->evas.t, b->obj.title.t, 1); + evas_set_layer(b->evas.b, b->obj.title.b, 1); } e_border_reshape(b); if (visibility_changed) =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/config.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- config.c 2000/12/15 21:27:23 1.4 +++ config.c 2001/01/02 23:10:12 1.5 @@ -16,6 +16,7 @@ static char cfg_settings_db[4096] = ""; static char cfg_actions_db[4096] = ""; static char cfg_borders_db[4096] = ""; +static char cfg_menus_db[4096] = ""; static char cfg_user_dir[4096] = ""; static char cfg_images_dir[4096] = ""; static char cfg_fonts_dir[4096] = ""; @@ -46,6 +47,8 @@ PACKAGE_DATA_DIR"/data/config/behavior/default/actions.db"); E_CONF("borders", cfg_borders_db, PACKAGE_DATA_DIR"/data/config/appearance/default/borders/"); + E_CONF("menus", cfg_menus_db, + PACKAGE_DATA_DIR"/data/config/appearance/default/menus/"); E_CONF("images", cfg_images_dir, PACKAGE_DATA_DIR"/data/images/"); E_CONF("fonts", cfg_fonts_dir, =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/desktops.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- desktops.c 2000/12/29 20:49:17 1.8 +++ desktops.c 2001/01/02 23:10:12 1.9 @@ -130,6 +130,56 @@ x = e->rx - x; y = e->ry - y; evas_event_button_down(evas, x, y, e->button); + if (e->button == 1) + { + int count; + static E_Menu *menu = NULL; + char buf[4096]; + + if (!menu) + { + menu = e_menu_new(); + for (count = 1; count <= 16; count++) + { + int count2; + E_Menu *menu2; + E_Menu_Item *menuitem; + + sprintf(buf, "Menu item %i", count); + menuitem = e_menu_item_new(buf); + if (count < 10) + { + menu2 = e_menu_new(); + menuitem->submenu = menu2; + } + e_menu_add_item(menu, menuitem); + if (count < 10) + { + for (count2 = 1; count2 <= 14; count2++) + { + E_Menu_Item *menuitem2; + E_Menu *menu3; + int count3; + + sprintf(buf, "Submenu item %i", count2); + menuitem2 = e_menu_item_new(buf); + menu3 = e_menu_new(); + menuitem2->submenu = menu3; + e_menu_add_item(menu2, menuitem2); + for (count3 = 1; count3 <= 12; count3++) + { + E_Menu_Item *menuitem3; + + sprintf(buf, "Submenu item %i", count3); + menuitem3 = e_menu_item_new(buf); + e_menu_add_item(menu3, menuitem3); + } + } + } + } + } + e_menu_show_at_mouse(menu, e->rx, e->ry, e->time); + } if (e->button == 3) e_exec_restart(); return; =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/e.h,v retrieving revision 1.11 retrieving revision 1.12 diff -u -3 -r1.11 -r1.12 --- e.h 2000/12/29 20:49:17 1.11 +++ e.h 2001/01/02 23:10:12 1.12 @@ -153,6 +153,14 @@ Evas l, r, t, b; } evas; struct { + struct { + Evas_Object l, r, t, b; + } title; + struct { + Evas_Object l, r, t, b; + } title_clip; + } obj; + struct { Pixmap l, r, t, b; } pixmap; struct { @@ -212,6 +220,8 @@ E_Desktop *desk; char *border_file; + + int first_expose; int changed; }; @@ -294,13 +304,66 @@ struct _E_Menu { OBJ_PROPERTIES; + + struct { + int x, y, w, h; + int visible; + } current, previous; + struct { + int l, r, t, b; + } border, sel_border; + struct { + Window main, evas; + } win; + Evas evas; + Ebits_Object bg; + Evas_List entries; + char *bg_file; + + int first_expose; + + int recalc_entries; + int redo_sel; + int changed; + + E_Menu_Item *selected; - Window win; + Time time; }; struct _E_Menu_Item { OBJ_PROPERTIES; + + int x, y; + struct { + struct { + int w, h; + } min; + int w, h; + } size; + + Ebits_Object bg; + char *bg_file; + int selected; + + Evas_Object obj_entry; + + char *str; + Evas_Object obj_text; + + char *icon; + Evas_Object obj_icon; + + int radio_group; + int check; + int on; + + E_Menu *menu; + E_Menu *submenu; + + void (*func_select) (E_Menu *m, E_Menu_Item *mi, void *data); + void *func_select_data; }; void e_action_add_proto(char *action, @@ -349,6 +412,7 @@ void e_icccm_get_size_info(Window win, E_Border *b); void e_icccm_get_mwm_hints(Window win, E_Border *b); void e_icccm_get_layer(Window win, E_Border *b); +void e_icccm_get_title(Window win, E_Border *b); void e_icccm_set_frame_size(Window win, int l, int r, int t, int b); void e_icccm_set_desk_area(Window win, int ax, int ay); void e_icccm_set_desk_area_size(Window win, int ax, int ay); =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/icccm.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- icccm.c 2000/12/18 21:28:44 1.4 +++ icccm.c 2001/01/02 23:10:12 1.5 @@ -296,6 +296,7 @@ if (mwmhints->decorations & MWM_DECOR_BORDER) b->client.border = 1; if (mwmhints->decorations & MWM_DECOR_RESIZEH) b->client.handles = 1; if (mwmhints->decorations & MWM_DECOR_TITLE) b->client.titlebar = 1; + e_border_apply_border(b); } FREE(mwmhints); } @@ -322,6 +323,24 @@ } void +e_icccm_get_title(Window win, E_Border *b) +{ + char *title; + + title = e_window_get_title(win); + + if (b->client.title) + { + if ((title) && (!strcmp(title, b->client.title))) return; + b->changed = 1; + FREE(b->client.title); + } + b->client.title = NULL; + if (title) b->client.title = title; + else b->client.title = strdup("No Title"); +} + +void e_icccm_set_frame_size(Window win, int l, int r, int t, int b) { static Atom a_e_frame_size = 0; @@ -392,10 +411,16 @@ e_icccm_handle_property_change(Atom a, E_Border *b) { static Atom a_wm_normal_hints = 0; + static Atom a_motif_wm_hints = 0; + static Atom a_wm_name = 0; E_ATOM(a_wm_normal_hints, "WM_NORMAL_HINTS"); + E_ATOM(a_motif_wm_hints, "_MOTIF_WM_HINTS"); + E_ATOM(a_wm_name, "WM_NAME"); if (a == a_wm_normal_hints) e_icccm_get_size_info(b->win.client, b); + else if (a == a_motif_wm_hints) e_icccm_get_mwm_hints(b->win.client, b); + else if (a == a_wm_name) e_icccm_get_title(b->win.client, b); } void =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/main.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- main.c 2000/12/14 19:36:33 1.3 +++ main.c 2001/01/02 23:10:12 1.4 @@ -50,6 +50,7 @@ e_desktops_init(); e_border_init(); e_actions_init(); + e_menu_init(); setup(); =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/menu.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- menu.c 2000/12/29 20:49:17 1.1 +++ menu.c 2001/01/02 23:10:12 1.2 @@ -1,7 +1,10 @@ #include "e.h" static Evas_List open_menus = NULL; -static Evas_list menus = NULL; +static Evas_List menus = NULL; +static Window menu_event_win = 0; +static int screen_w, screen_h; +static int mouse_x, mouse_y; static void e_idle(void *data); static void e_key_down(Eevent * ev); @@ -12,6 +15,112 @@ static void e_mouse_out(Eevent * ev); static void e_window_expose(Eevent * ev); +static void +e_scroller_timer(int val, void *data) +{ + Evas_List l; + int ok = 0; + int resist = 5; + int scroll_speed = 16; + static double last_time = 0.0, t; + + t = e_get_time(); + if (val != 0) + scroll_speed = (int)(((t - last_time) / 0.02) * (double)scroll_speed); + last_time = t; + + if (mouse_x >= (screen_w - resist)) + { + int scroll = 0; + + for (l = open_menus; l; l = l->next) + { + E_Menu *m; + + m = l->data; + if ((m->current.x + m->current.w) > screen_w) + { + scroll = m->current.x + m->current.w - screen_w; + break; + } + } + if (scroll) + { + if (scroll > scroll_speed) scroll = scroll_speed; + e_menu_scroll_all_by(-scroll, 0); + ok = 1; + } + } + else if (mouse_x < resist) + { + int scroll = 0; + + for (l = open_menus; l; l = l->next) + { + E_Menu *m; + + m = l->data; + if (m->current.x < 0) + { + scroll = -m->current.x; + break; + } + } + if (scroll) + { + if (scroll > scroll_speed) scroll = scroll_speed; + e_menu_scroll_all_by(scroll, 0); + ok = 1; + } + } + if (mouse_y >= (screen_h - resist)) + { + int scroll = 0; + + for (l = open_menus; l; l = l->next) + { + E_Menu *m; + + m = l->data; + if ((m->current.y + m->current.h) > screen_h) + { + scroll = m->current.y + m->current.h - screen_h; + break; + } + } + if (scroll) + { + if (scroll > scroll_speed) scroll = scroll_speed; + e_menu_scroll_all_by(0, -scroll); + ok = 1; + } + } + else if (mouse_y < resist) + { + int scroll = 0; + + for (l = open_menus; l; l = l->next) + { + E_Menu *m; + + m = l->data; + if (m->current.y < 0) + { + scroll = -m->current.y; + break; + } + } + if (scroll) + { + if (scroll > scroll_speed) scroll = scroll_speed; + e_menu_scroll_all_by(0, scroll); + ok = 1; + } + } + if (ok) + e_add_event_timer("menu_scroller", 0.02, e_scroller_timer, val + 1, NULL); +} + static void e_idle(void *data) { @@ -22,34 +131,129 @@ E_Menu *m; m = l->data; - e_menu_update(m); + e_menu_update_base(m); } + for (l = menus; l; l = l->next) + { + E_Menu *m; + + m = l->data; + e_menu_update_shows(m); + } + for (l = menus; l; l = l->next) + { + E_Menu *m; + + m = l->data; + e_menu_update_hides(m); + } + for (l = menus; l; l = l->next) + { + E_Menu *m; + + m = l->data; + e_menu_update_finish(m); + } + for (l = menus; l; l = l->next) + { + E_Menu *m; + + m = l->data; + if (m->first_expose) + evas_render(m->evas); + } e_db_runtime_flush(); return; UN(data); } static void +e_wheel(Eevent * ev) +{ + Ev_Wheel *e; + + e = ev->event; + if (e->win == menu_event_win) + { + } +} + +static void e_key_down(Eevent * ev) { Ev_Key_Down *e; + int ok; e = ev->event; + ok = 0; + if (e->win == menu_event_win) ok = 1; + else + { + Evas_List l; + + for (l = open_menus; l; l = l->next) + { + E_Menu *m; + + m = l->data; + if ((e->win == m->win.main) || (e->win == m->win.evas)) ok = 1; + } + } + if (ok) { + Evas_List l; + E_Menu *m = NULL; + E_Menu_Item *mi = NULL; + + for (l = open_menus; l; l = l->next) + { + m = l->data; + if (m->selected) + { + mi = m->selected; + } + } if (!strcmp(e->key, "Up")) { + e_menu_select(0, -1); } else if (!strcmp(e->key, "Down")) { + e_menu_select(0, 1); } else if (!strcmp(e->key, "Left")) { + e_menu_select(-1, 0); } else if (!strcmp(e->key, "Right")) { + e_menu_select(1, 0); } else if (!strcmp(e->key, "Escape")) { + for (l = menus; l; l = l->next) + { + m = l->data; + + if (m->current.visible) + e_menu_hide(m); + } + } + else if (!strcmp(e->key, "Return")) + { + if (mi) + { + e_menu_callback_item(m, mi); + mi->selected = 0; + mi->menu->selected = NULL; + } + for (l = menus; l; l = l->next) + { + m = l->data; + + if (m->current.visible) + e_menu_hide(m); + } } else { @@ -67,47 +271,901 @@ } } -E_Menu * -e_menu_new(void) +/* handling mouse down events */ +static void +e_mouse_down(Eevent * ev) +{ + Ev_Mouse_Down *e; + + e = ev->event; + { + } +} + +/* handling mouse up events */ +static void +e_mouse_up(Eevent * ev) +{ + Ev_Mouse_Up *e; + + e = ev->event; + if (e->win == menu_event_win) + { + if (open_menus) + { + E_Menu *m; + + m = open_menus->data; + if ((e->time - m->time) > 200) + { + Evas_List l; + + for (l = open_menus; l; l = l->next) + { + m = l->data; + if (m->selected) + { + e_menu_callback_item(m, m->selected); + m->selected->selected = 0; + m->selected = NULL; + break; + } + } + for (l = menus; l; l = l->next) + { + m = l->data; + + if (m->current.visible) + e_menu_hide(m); + } + } + } + } +} + +/* handling mouse move events */ +static void +e_mouse_move(Eevent * ev) { + Ev_Mouse_Move *e; + + e = ev->event; + if (e->win == menu_event_win) + { + Evas_List l; + + mouse_x = e->rx; + mouse_y = e->ry; + for (l = open_menus; l; l = l->next) + { + E_Menu *m; + + m = l->data; + evas_event_move(m->evas, + e->rx - m->current.x, + e->ry - m->current.y); + } + } + else + { + Evas_List l; + + mouse_x = e->rx; + mouse_y = e->ry; + for (l = open_menus; l; l = l->next) + { + E_Menu *m; + + m = l->data; + + evas_event_move(m->evas, + e->rx - m->current.x, + e->ry - m->current.y); + } + } + e_scroller_timer(0, NULL); +} + +/* handling mouse enter events */ +static void +e_mouse_in(Eevent * ev) +{ + Ev_Window_Enter *e; + + e = ev->event; + if (e->win == menu_event_win) + { + } +} + +/* handling mouse leave events */ +static void +e_mouse_out(Eevent * ev) +{ + Ev_Window_Leave *e; + + e = ev->event; + if (e->win == menu_event_win) + { + } + else + { + Evas_List l; + + for (l = open_menus; l; l = l->next) + { + E_Menu *m; + + m = l->data; + if ((e->win == m->win.main) || (e->win == m->win.evas)) + { + evas_event_move(m->evas, -99999999, -99999999); + } + } + } } +/* handling expose events */ +static void +e_window_expose(Eevent * ev) +{ + Ev_Window_Expose *e; + + e = ev->event; + { + Evas_List l; + + for (l = open_menus; l; l = l->next) + { + E_Menu *m; + + m = l->data; + if (e->win == m->win.evas) + { + m->first_expose = 1; + evas_update_rect(m->evas, e->x, e->y, e->w, e->h); + } + } + } +} + +static void +e_menu_item_in_cb(void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) +{ + E_Menu_Item *mi; + Evas_List l; + + mi = _data; + mi->menu->selected = mi; + mi->selected = 1; + mi->menu->redo_sel = 1; + mi->menu->changed = 1; + e_menu_hide_submenus(mi->menu); + if (mi->submenu) + { + e_menu_move_to(mi->submenu, + mi->menu->current.x + mi->menu->current.w, + mi->menu->current.y + mi->y - mi->menu->border.t); + e_menu_show(mi->submenu); + } +} + +static void +e_menu_item_out_cb(void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) +{ + E_Menu_Item *mi; + + mi = _data; + if (mi->menu->selected == mi) mi->menu->selected = NULL; + mi->selected = 0; + mi->menu->redo_sel = 1; + mi->menu->changed = 1; +} + +void +e_menu_callback_item(E_Menu *m, E_Menu_Item *mi) +{ + if (mi->func_select) mi->func_select(m, mi, mi->func_select_data); +} + void +e_menu_item_set_callback(E_Menu_Item *mi, void (*func) (E_Menu *m, E_Menu_Item *mi, void *data), void *data) +{ + mi->func_select = func; + mi->func_select_data = data; +} + +void +e_menu_hide_submenus(E_Menu *menus_after) +{ + Evas_List l; + + for (l = open_menus; l; l = l->next) + { + if (l->data == menus_after) + { + l = l->next; + for (; l; l = l->next) + { + E_Menu *m; + + m = l->data; + e_menu_hide(m); + } + break; + } + } +} + +void +e_menu_select(int dx, int dy) +{ + Evas_List l, ll; + int done = 0; + + for (l = open_menus; (l) && (!done); l = l->next) + { + E_Menu *m; + + m = l->data; + if (m->selected) + { + for (ll = m->entries; (ll) && (!done); ll = ll->next) + { + E_Menu_Item *mi; + + mi = ll->data; + if (mi->selected) + { + if (dy != 0) + { + int ok = 0; + + if ((dy < 0) && (ll->prev)) ok = 1; + else if ((dy > 0) && (ll->next)) ok = 1; + if (ok) + { + if (m->selected) + { + m->selected->selected = 0; + m->redo_sel = 1; + m->changed = 1; + m->selected = NULL; + } + if (dy < 0) mi = ll->prev->data; + else mi = ll->next->data; + m->selected = mi; + mi->selected = 1; + mi->menu->redo_sel = 1; + mi->menu->changed = 1; + e_menu_hide_submenus(mi->menu); + if (mi->submenu) + { + e_menu_move_to(mi->submenu, + mi->menu->current.x + mi->menu->current.w, + mi->menu->current.y + mi->y - mi->menu->border.t); + e_menu_show(mi->submenu); + } + } + } + done = 1; + } + } + if (dx != 0) + { + int ok = 0; + + if ((dx < 0) && (l->prev)) ok = 1; + else if ((dx > 0) && (l->next)) ok = 1; + if (ok) + { + E_Menu_Item *mi = NULL; + E_Menu *mm; + + if (dx < 0) + { + Evas_List ll; + + mm = l->prev->data; + for (ll = mm->entries; (ll) && (!mi); ll = ll->next) + { + E_Menu_Item *mmi; + + mmi = ll->data; + if (mmi->submenu == m) mi = mmi; + } + } + else + { + mm = l->next->data; + if (mm->entries) + mi = mm->entries->data; + } + if (mi) + { + if (m->selected) + { + m->selected->selected = 0; + m->redo_sel = 1; + m->changed = 1; + m->selected = NULL; + } + mm->selected = mi; + mi->selected = 1; + mi->menu->redo_sel = 1; + mi->menu->changed = 1; + e_menu_hide_submenus(mi->menu); + if (mi->submenu) + { + e_menu_move_to(mi->submenu, + mi->menu->current.x + mi->menu->current.w, + mi->menu->current.y + mi->y - mi->menu->border.t); + e_menu_show(mi->submenu); + } + e_menu_update_visibility(mm); + } + } + done = 1; + } + e_menu_update_visibility(m); + } + } + if (!done) + { + if (open_menus) + { + E_Menu *m; + E_Menu_Item *mi; + + m = open_menus->data; + mi = m->entries->data; + m->selected = mi; + mi->selected = 1; + mi->menu->redo_sel = 1; + mi->menu->changed = 1; + if (mi->submenu) + { + e_menu_move_to(mi->submenu, + mi->menu->current.x + mi->menu->current.w, + mi->menu->current.y + mi->y - mi->menu->border.t); + e_menu_show(mi->submenu); + } + } + } +} + +void +e_menu_init(void) +{ + e_window_get_geometry(0, NULL, NULL, &screen_w, &screen_h); + e_event_filter_handler_add(EV_MOUSE_DOWN, e_mouse_down); + e_event_filter_handler_add(EV_MOUSE_UP, e_mouse_up); + e_event_filter_handler_add(EV_MOUSE_MOVE, e_mouse_move); + e_event_filter_handler_add(EV_MOUSE_IN, e_mouse_in); + e_event_filter_handler_add(EV_MOUSE_OUT, e_mouse_out); + e_event_filter_handler_add(EV_WINDOW_EXPOSE, e_window_expose); + e_event_filter_handler_add(EV_KEY_DOWN, e_key_down); + e_event_filter_handler_add(EV_KEY_UP, e_key_up); + e_event_filter_handler_add(EV_MOUSE_WHEEL, e_wheel); + e_event_filter_idle_handler_add(e_idle, NULL); +} + +void +e_menu_event_win_show(void) +{ + /* create it */ + if (!menu_event_win) + { + menu_event_win = e_window_input_new(0, 0, 0, screen_w, screen_h); + e_window_set_events(menu_event_win, XEV_MOUSE_MOVE | XEV_BUTTON | XEV_IN_OUT | XEV_KEY); + e_window_show(menu_event_win); + e_keyboard_grab(menu_event_win); + e_grab_mouse(menu_event_win, 1, 0); + } + /* raise it */ + if (menu_event_win) e_window_raise(menu_event_win); +} + +void +e_menu_event_win_hide(void) +{ + /* destroy it */ + if (menu_event_win) + { + e_keyboard_ungrab(); + e_window_destroy(menu_event_win); + menu_event_win = 0; + } +} + +void +e_menu_set_background(E_Menu *m) +{ + char *menus; + char buf[4096]; + char *style = "default"; + char *part; + int pl, pr, pt, pb; + + menus = e_config_get("menus"); + + part = "base.bits.db"; + sprintf(buf, "%s%s/%s", menus, style, part); + if ((m->bg_file) && (!strcmp(m->bg_file, buf))) return; + + IF_FREE(m->bg_file); + m->bg_file = strdup(buf); + + if (m->bg) ebits_free(m->bg); + m->bg = ebits_load(m->bg_file); + if (m->bg) ebits_set_color_class(m->bg, "Menu BG", 100, 200, 255, 255); + + pl = pr = pt = pb = 0; + if (m->bg) + { + ebits_get_insets(m->bg, &pl, &pr, &pt, &pb); + ebits_add_to_evas(m->bg, m->evas); + ebits_move(m->bg, 0, 0); + ebits_show(m->bg); + ebits_set_layer(m->bg, 0); + } + m->current.w += ((pl + pr) - (m->border.l + m->border.r)); + m->current.h += ((pt + pb) - (m->border.t + m->border.b)); + m->border.l = pl; + m->border.r = pr; + m->border.t = pt; + m->border.b = pb; + m->changed = 1; +} + +void +e_menu_set_sel(E_Menu *m, E_Menu_Item *mi) +{ + char *menus; + char buf[4096]; + char *style = "default"; + char *part; + int pl, pr, pt, pb; + int has_sub = 0; + int selected = 0; + + menus = e_config_get("menus"); + selected = mi->selected; + if (mi->submenu) has_sub = 1; + sprintf(buf, "%s%s/selected-%i.submenu-%i.bits.db", menus, style, + selected, has_sub); + if ((mi->bg_file) && (!strcmp(mi->bg_file, buf))) return; + + IF_FREE(mi->bg_file); + mi->bg_file = strdup(buf); + + if (mi->bg) ebits_free(mi->bg); + mi->bg = ebits_load(mi->bg_file); + if (mi->bg) ebits_set_color_class(mi->bg, "Menu BG", 100, 200, 255, 255); + + pl = pr = pt = pb = 0; + if (mi->bg) + { + ebits_get_insets(mi->bg, &pl, &pr, &pt, &pb); + ebits_add_to_evas(mi->bg, m->evas); + ebits_set_layer(mi->bg, 1); + } + if (m->sel_border.l < pl) {m->sel_border.l = pl; m->recalc_entries = 1;} + if (m->sel_border.r < pr) {m->sel_border.r = pr; m->recalc_entries = 1;} + if (m->sel_border.t < pt) {m->sel_border.t = pt; m->recalc_entries = 1;} + if (m->sel_border.b < pb) {m->sel_border.b = pb; m->recalc_entries = 1;} + m->redo_sel = 1; + m->changed = 1; +} + +void e_menu_free(E_Menu *m) { } +E_Menu * +e_menu_new(void) +{ + E_Menu *m; + int max_colors = 216; + int font_cache = 1024 * 1024; + int image_cache = 8192 * 1024; + char *font_dir; + + font_dir = e_config_get("fonts"); + + m = NEW(E_Menu, 1); + ZERO(m, E_Menu, 1); + + OBJ_INIT(m, e_menu_free); + + m->win.main = e_window_override_new(0, 0, 0, 1, 1); + m->evas = evas_new_all(e_display_get(), + m->win.main, + 0, 0, 1, 1, + RENDER_METHOD_ALPHA_SOFTWARE, + max_colors, + font_cache, + image_cache, + font_dir); + /* aaaaaaaaah. this makes building the menu fast - moves the mouse far */ + /* far far far far away so callbacks and events arent triggerd as we */ + /* create objects that ofter hang around 0,0 - the default place for */ + /* the pointer to be... this means my 2000 entry menu works and comes up */ + /* pretty damn fast - considering i creating it when i click :) - problem */ + /* you can't fit 2000 entires into a window in X - since the limit is */ + /* 65536x65536 fo X - the other problem is i can only really draw in */ + /* the first 32768x32768 pixels of the window - thus limiting the menu */ + /* size to well - 32768x32768 - normally ok - but in extremes not so */ + /* good. We *COULD* do a workaround that meant we did the menu scrolling */ + /* within the evas and faked a menu window that only gets as big as the */ + /* screen - an then re-render it all - but well.. it's an extreme and */ + /* for now i think people will just have to live with a maximum menu size */ + /* of 32768x32768... didums! */ + evas_event_move(m->evas, -999999999, -99999999); + + m->win.evas = evas_get_window(m->evas); + e_window_set_events(m->win.evas, XEV_EXPOSE | XEV_MOUSE_MOVE | XEV_BUTTON | XEV_IN_OUT | XEV_KEY); + e_window_set_events(m->win.main, XEV_IN_OUT | XEV_KEY); + e_window_show(m->win.evas); + e_add_child(m->win.main, m->win.evas); + + e_menu_set_background(m); + + m->current.w = m->border.l + m->border.r; + m->current.h = m->border.t + m->border.b; + m->changed = 1; + + menus = evas_list_prepend(menus, m); + + return m; +} + void e_menu_hide(E_Menu *m) { + m->current.visible = 0; + m->changed = 1; } void e_menu_show(E_Menu *m) { + m->current.visible = 1; + m->changed = 1; } void e_menu_move_to(E_Menu *m, int x, int y) { + m->current.x = x; + m->current.y = y; + m->changed = 1; } void -e_menu_show_at_mouse(E_Menu *m, int x, int y) +e_menu_show_at_mouse(E_Menu *m, int x, int y, Time t) { + m->current.x = x; + m->current.y = y; + m->time = t; + e_menu_show(m); } void e_menu_add_item(E_Menu *m, E_Menu_Item *mi) { + m->entries = evas_list_append(m->entries, mi); + m->recalc_entries = 1; + m->changed = 1; + mi->menu = m; + e_menu_item_realize(m, mi); } void e_menu_del_item(E_Menu *m, E_Menu_Item *mi) { + m->entries = evas_list_remove(m->entries, mi); + m->recalc_entries = 1; + m->changed = 1; + e_menu_item_unrealize(m, mi); + mi->menu = NULL; +} + +void +e_menu_item_update(E_Menu *m, E_Menu_Item *mi) +{ + evas_move(m->evas, mi->obj_text, mi->x + m->sel_border.l, mi->y + m->sel_border.t); + evas_move(m->evas, mi->obj_entry, mi->x, mi->y); + evas_resize(m->evas, mi->obj_entry, mi->size.w + m->sel_border.l + m->sel_border.r, mi->size.h + m->sel_border.t + m->sel_border.b); +} + +void +e_menu_item_unrealize(E_Menu *m, E_Menu_Item *mi) +{ +} + +void +e_menu_item_realize(E_Menu *m, E_Menu_Item *mi) +{ + double tw, th; + + mi->obj_text = evas_add_text(m->evas, "borzoib", 8, mi->str); + mi->obj_entry = evas_add_rectangle(m->evas); + evas_set_color(m->evas, mi->obj_text, 0, 0, 0, 255); + evas_set_color(m->evas, mi->obj_entry, 0, 0, 0, 0); + evas_show(m->evas, mi->obj_text); + evas_show(m->evas, mi->obj_entry); + evas_set_layer(m->evas, mi->obj_text, 10); + evas_set_layer(m->evas, mi->obj_entry, 11); + evas_get_geometry(m->evas, mi->obj_text, NULL, NULL, &tw, &th); + mi->size.min.w = tw; + mi->size.min.h = th; + evas_callback_add(m->evas, mi->obj_entry, CALLBACK_MOUSE_IN, e_menu_item_in_cb, mi); + evas_callback_add(m->evas, mi->obj_entry, CALLBACK_MOUSE_OUT, e_menu_item_out_cb, mi); + e_menu_set_sel(m, mi); +} + +E_Menu_Item * +e_menu_item_new(char *str) +{ + E_Menu_Item *mi; + + mi = NEW(E_Menu_Item, 1); + ZERO(mi, E_Menu_Item, 1); + + mi->str = strdup(str); + + return mi; +} + +void +e_menu_obscure_outside_screen(E_Menu *m) +{ + /* obscure stuff outside the screen boundaries - optimizes rendering */ + evas_clear_obscured_rects(m->evas); + evas_add_obscured_rect(m->evas, + -m->current.x - 100000, + -m->current.y - 100000, + 200000 + screen_w, 100000); + evas_add_obscured_rect(m->evas, + -m->current.x - 100000, + -m->current.y - 100000, + 100000, 200000 + screen_h); + evas_add_obscured_rect(m->evas, + -m->current.x - 100000, + screen_h - m->current.y, + 200000 + screen_w, 100000); + evas_add_obscured_rect(m->evas, + screen_w - m->current.x, + -m->current.y - 100000, + 100000, 200000 + screen_h); +} + +void +e_menu_scroll_all_by(int dx, int dy) +{ + Evas_List l; + + for (l = menus; l; l = l->next) + { + E_Menu *m; + + m = l->data; + if (m->current.visible) + { + m->current.x += dx; + m->current.y += dy; + m->changed = 1; + } + } + for (l = open_menus; l; l = l->next) + { + E_Menu *m; + + m = l->data; + evas_event_move(m->evas, + mouse_x - m->current.x, + mouse_y - m->current.y); + } +} + +void +e_menu_update_visibility(E_Menu *m) +{ + E_Menu_Item *mi; + + mi = m->selected; + if (mi) + { + /* if the entry is off screen - scroll so it's on screen */ + if (m->current.x < 0) + e_menu_scroll_all_by(-m->current.x, 0); + else if ((m->current.x + m->current.w) > screen_w) + { + e_menu_scroll_all_by(screen_w - (m->current.x + m->current.w), 0); + } + if ((m->current.y + m->sel_border.t + mi->y) < 0) + { + if (m->current.y < -(screen_h / 4)) + e_menu_scroll_all_by(0, screen_h / 4); + else + e_menu_scroll_all_by(0, - m->current.y); + } + else if ((m->current.y + m->sel_border.t + mi->y + mi->size.h) > screen_h) + { + if ((m->current.y + m->current.h - screen_h) < (screen_h / 4)) + e_menu_scroll_all_by(0, -(m->current.y + m->current.h - screen_h)); + else + e_menu_scroll_all_by(0, -(screen_h / 4)); + } + } +} + +void +e_menu_update_base(E_Menu *m) +{ + int size_changed = 0; + int location_changed = 0; + + if (!m->changed) return; + + if (m->recalc_entries) + { + Evas_List l; + int max_w, max_h; + int i, count; + + max_w = 0; + max_h = 0; + count = 0; + for (l = m->entries; l; l = l->next) + { + E_Menu_Item *mi; + + mi = l->data; + if (mi->size.min.w > max_w) max_w = mi->size.min.w; + if (mi->size.min.h > max_h) max_h = mi->size.min.h; + count++; + } + m->current.w = m->border.l + m->border.r + max_w + m->sel_border.l + m->sel_border.r; + m->current.h = m->border.b + m->border.t + ((max_h + m->sel_border.t + m->sel_border.b) * count); + i = 0; + for (l = m->entries; l; l = l->next) + { + E_Menu_Item *mi; + + mi = l->data; + mi->size.w = max_w; + mi->size.h = max_h; + mi->x = m->border.l; + mi->y = m->border.t + (i * (max_h + m->sel_border.t + m->sel_border.b)); + e_menu_item_update(m, mi); + i++; + } + m->recalc_entries = 0; + } + if (m->redo_sel) + { + Evas_List l; + + for (l = m->entries; l; l = l->next) + { + E_Menu_Item *mi; + + mi = l->data; + e_menu_set_sel(m, mi); + if (mi) + { + if (mi->bg) + { + ebits_move(mi->bg, mi->x, mi->y); + ebits_resize(mi->bg, + mi->size.w + m->sel_border.l + m->sel_border.r, + mi->size.h + m->sel_border.t + m->sel_border.b); + ebits_show(mi->bg); + } + } + } + m->redo_sel = 0; + } + + if ((m->current.x != m->previous.x) || + (m->current.y != m->previous.y)) + location_changed = 1; + if ((m->current.w != m->previous.w) || + (m->current.h != m->previous.h)) + size_changed = 1; + + if ((location_changed) && (size_changed)) + { + e_window_move_resize(m->win.main, m->current.x, m->current.y, m->current.w, m->current.h); + e_menu_obscure_outside_screen(m); + } + else if (location_changed) + { + e_window_move(m->win.main, m->current.x, m->current.y); + e_menu_obscure_outside_screen(m); + } + else if (size_changed) + { + e_window_resize(m->win.main, m->current.w, m->current.h); + } + if (size_changed) + { + e_window_resize(m->win.evas, m->current.w, m->current.h); + evas_set_output_size(m->evas, m->current.w, m->current.h); + evas_set_output_viewport(m->evas, 0, 0, m->current.w, m->current.h); + if (m->bg) ebits_resize(m->bg, m->current.w, m->current.h); + } +} + +void +e_menu_update_finish(E_Menu *m) +{ + if (!m->changed) return; + m->previous = m->current; + m->changed = 0; +} + +void +e_menu_update_shows(E_Menu *m) +{ + if (!m->changed) return; + if (m->current.visible != m->previous.visible) + { + if (m->current.visible) + { + e_window_raise(m->win.main); + e_menu_event_win_show(); + e_window_show(m->win.main); + open_menus = evas_list_append(open_menus, m); + } + } +} + +void +e_menu_update_hides(E_Menu *m) +{ + if (!m->changed) return; + if (m->current.visible != m->previous.visible) + { + if (!m->current.visible) + { + if (m->selected) + { + E_Menu_Item *mi; + + mi = m->selected; + mi->selected = 0; + e_menu_set_sel(m, mi); + if (mi) + { + if (mi->bg) + { + ebits_move(mi->bg, mi->x, mi->y); + ebits_resize(mi->bg, + mi->size.w + m->sel_border.l + m->sel_border.r, + mi->size.h + m->sel_border.t + m->sel_border.b); + ebits_show(mi->bg); + } + } + m->redo_sel = 1; + m->changed = 1; + m->selected = NULL; + } + open_menus = evas_list_remove(open_menus, m); + e_window_hide(m->win.main); + if (!open_menus) e_menu_event_win_hide(); + } + } } void e_menu_update(E_Menu *m) { + e_menu_update_base(m); + e_menu_update_shows(m); + e_menu_update_hides(m); + e_menu_update_finish(m); } |
From: <enl...@so...> - 2001-01-02 23:10:35
|
Enlightenment CVS committal Author : raster Project : e17 Module : apps/e Log Message: Directory /cvsroot/enlightenment/e17/apps/e/data/config/appearance/default/menus added to the repository |
From: <enl...@so...> - 2001-01-02 23:10:43
|
Enlightenment CVS committal Author : raster Project : e17 Module : apps/e Log Message: Directory /cvsroot/enlightenment/e17/apps/e/data/config/appearance/default/menus/default added to the repository |