From 3e09f77dbd809f5081d2ed46903842547ea42b2f Mon Sep 17 00:00:00 2001 From: rephorm Date: Thu, 24 Jan 2002 01:08:52 +0000 Subject: [PATCH] A bunch of little changes. Added basic iconification implementation, including menu for iconified windows, however this is buggy and doesn't work correctly yet, and is therefore commented out. But maybe someone can take the framework and fix it? Added ferite wrapping for timers. SVN revision: 5851 --- src/Makefile.am | 2 +- src/actions.c | 7 ++- src/border.c | 34 ++++++++++ src/border.h | 4 +- src/e_ferite.fec | 161 +++++++++++++++++++++++++++++++++++++++-------- src/epplet.c | 87 ++++++++++++++++++++++--- src/epplet.h | 3 +- src/menu.c | 10 +-- src/menubuild.c | 102 ++++++++++++++++++++++++++++++ src/menubuild.h | 4 +- src/observer.c | 2 +- src/observer.h | 6 +- src/view.c | 27 ++++++-- 13 files changed, 399 insertions(+), 50 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 4740b3af1..77c672f42 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -19,7 +19,7 @@ if USE_FERITE ferite_c = e_ferite_gen_core.c \ e_ferite_gen_header.h \ e_ferite_gen_e.c \ - e_ferite_gen_window.c \ + e_ferite_gen_Border.c \ e_ferite_gen_Epplet.c \ e_ferite_gen_Ebits.c \ e_ferite_gen_EvasObject.c \ diff --git a/src/actions.c b/src/actions.c index 32f2c9669..53a3d9071 100644 --- a/src/actions.c +++ b/src/actions.c @@ -1658,11 +1658,16 @@ e_act_iconify_start (E_Object *object, E_Action *a, void *data, int x, int y, in E_Border *b; D_ENTER; - +#if 0 b = (E_Border*) object; if (!b) b = e_border_current_focused(); if (!b) D_RETURN; if (b->client.is_desktop) D_RETURN; + + D("iconify action start\n"); + e_border_iconify(b); +#endif + D_RETURN; UN(object); UN(a); diff --git a/src/border.c b/src/border.c index b4b05d71e..54c08eaae 100644 --- a/src/border.c +++ b/src/border.c @@ -1750,6 +1750,34 @@ e_border_new(void) D_RETURN_(b); } +void +e_border_iconify(E_Border *b) +{ + D_ENTER; + D("iconfy window!\n"); + b->client.iconified = 1; + b->current.requested.visible = 0; + e_icccm_state_iconified(b->win.client); + b->changed = 1; + e_border_update(b); + D("notify observers of iconification\n"); + e_observee_notify_observers(E_OBSERVEE(b), E_EVENT_WINDOW_ICONIFY); + + D_RETURN; +} + +void +e_border_uniconify(E_Border *b) +{ + b->client.iconified = 0; + b->current.requested.visible = 1; + e_icccm_state_mapped(b->win.client); + b->changed = 1; + e_border_update(b); + /* should be UNICONIFY */ + e_observee_notify_observers(E_OBSERVEE(b), E_EVENT_WINDOW_ICONIFY); +} + void e_border_remove_mouse_grabs(E_Border *b) { @@ -2861,3 +2889,9 @@ e_border_set_gravity(E_Border *b, int gravity) D_RETURN; } +Evas_List +e_border_get_borders_list() +{ + D_ENTER; + D_RETURN_(borders); +} diff --git a/src/border.h b/src/border.h index b0b266173..b06a46d7a 100644 --- a/src/border.h +++ b/src/border.h @@ -209,6 +209,8 @@ void e_border_update(E_Border *b); void e_border_set_layer(E_Border *b, int layer); void e_border_raise(E_Border *b); void e_border_lower(E_Border *b); +void e_border_iconify(E_Border *b); +void e_border_uniconify(E_Border *b); void e_border_raise_above(E_Border *b, E_Border *above); void e_border_lower_below(E_Border *b, E_Border *below); E_Border *e_border_current_focused(void); @@ -219,5 +221,5 @@ int e_border_viewable(E_Border *b); void e_border_print_pos(char *buf, E_Border *b); void e_border_print_size(char *buf, E_Border *b); void e_border_set_gravity(E_Border *b, int gravity); - +Evas_List e_border_get_borders_list(); #endif diff --git a/src/e_ferite.fec b/src/e_ferite.fec index ce23bd7b6..e16aec6d8 100644 --- a/src/e_ferite.fec +++ b/src/e_ferite.fec @@ -10,40 +10,109 @@ header %{ #include "globals.h" #include "observer.h" + #define BorderObj ((E_Border *)(self->odata)) #define BitsObj ((Ebits_Object)self->odata) #define EppObj ((E_Epplet *)(self->odata)) #define EvasObj ((Evas_Object_Wrapper *)(self->odata)) %} -class window { +class Border { + + function Border() + %{ + %} + + function get_name() + %{ + if(BorderObj) + FE_RETURN_STR(BorderObj->client.name, 0); + %} + + function get_title() + %{ + if(BorderObj) + FE_RETURN_STR(BorderObj->client.title, 0); + %} + + function get_class() + %{ + if(BorderObj) + FE_RETURN_STR(BorderObj->client.class, 0); + %} + + function get_x() + %{ + if(BorderObj) + FE_RETURN_LONG(BorderObj->current.x); + %} + + function get_y() + %{ + if(BorderObj) + FE_RETURN_LONG(BorderObj->current.y); + %} + + function get_width() + %{ + if(BorderObj) + FE_RETURN_LONG(BorderObj->current.w); + %} + + function get_height() + %{ + if(BorderObj) + FE_RETURN_LONG(BorderObj->current.h); + %} - function get_name(); - function get_title(); - function get_class(); - function get_x(); - function get_y(); - function get_width(); - function get_height(); function move( number x, number y ); function resize( number width, number height ); function show(); function hide(); - function is_visible(); + function is_visible() + %{ + if(BorderObj) + { + if (BorderObj->current.visible) { FE_RETURN_TRUE; } + else { FE_RETURN_FALSE; } + } + %} + function shade(); function unshade(); function is_shaded(); - function iconify(); - function uniconify(); - function is_iconic(); + function iconify() + %{ + e_border_iconify(BorderObj); + %} + + function uniconify() + %{ + e_border_uniconify(BorderObj); + %} + + function is_iconic() + %{ + if (BorderObj->client.iconified) { FE_RETURN_TRUE } + else { FE_RETURN_FALSE } + %} function is_mapped(); function is_transient(); function is_shaped(); + function raise() + %{ + %} + + function lower() + %{ + %} + + function delete(); function kill(); @@ -79,6 +148,21 @@ namespace e { ecore_event_loop_quit(); %} + function dataCopy(object from, object to) + %{ + to->odata = from->odata; + %} + + function dataCmp(object from, object to) + %{ + if (to->odata == from->odata) {FE_RETURN_TRUE;} + else {FE_RETURN_FALSE;} + %} + + function getTime() + %{ + FE_RETURN_DOUBLE(ecore_get_time()); + %} } class EvasObject @@ -291,6 +375,11 @@ class Ebits */ %} + function free() + %{ + ebits_free(BitsObj); + %} + function show() %{ ebits_show(BitsObj); @@ -321,11 +410,18 @@ class Ebits ebits_resize(BitsObj, w, h); %} - function set_layer(number l) + function setLayer(number l) %{ ebits_set_layer(BitsObj, l); %} + function setState(string bitName, string state) + %{ + ebits_set_named_bit_state(BitsObj, bitName, state); + ffree(bitName); + ffree(state); + %} + function getNamedBitGeometry(string bitName, number x, number y, number w, number h) %{ double xx, yy, ww, hh; @@ -537,38 +633,53 @@ class Epplet FE_RETURN_STR(retval, 0); %} -/* This doesn't work Yet */ -/* function addTimer(string name, number time, string func, number val, object data) %{ - char *buf; + char buf[PATH_MAX]; E_Epplet_CB_Info *cb; cb = e_epplet_cb_new(script, func, data, NULL); - D("got cb info\n") - sprintf(buf, "%s:%s", EppObj->name, name); - D("add timer: %s, time: %f\n", buf, time); - ecore_add_event_timer(buf, time, e_epplet_timer_func, val, cb); - D("timer added\n"); + snprintf(buf, PATH_MAX, "%s:%s", EppObj->name, name); + ecore_add_event_timer(buf, (double)time, e_epplet_timer_func, val, cb); ffree(func); %} function delTimer(string name) %{ - char *buf; + char buf[PATH_MAX]; - sprintf(buf, "%s:%s", EppObj->name, name); + snprintf(buf, PATH_MAX, "%s:%s", EppObj->name, name); ecore_del_event_timer(buf); ffree(name); %} -*/ + function addDesktopObserver(string func_name, object data) %{ E_Epplet_Observer *obs; - obs = e_epplet_observer_new(script, func_name, data); + obs = e_epplet_observer_new(script, func_name, data, "DESKTOP_SWITCH"); e_epplet_observer_register_desktops(obs); ffree(func_name); %} + +/* + function addIconifyObserver(string func_name, object data) + %{ + E_Epplet_Observer *obs; + + obs = e_epplet_observer_new(script, func_name, data, "ICONIFY"); + e_epplet_observer_register_borders(obs); + ffree(func_name); + %} + + function addUnconifyObserver(string func_name, object data) + %{ + E_Epplet_Observer *obs; + + obs = e_epplet_observer_new(script, func_name, data, "UNICONIFY"); + e_epplet_observer_register_borders(obs); + ffree(func_name); + %} +*/ } diff --git a/src/epplet.c b/src/epplet.c index da4e17b30..41545621f 100644 --- a/src/epplet.c +++ b/src/epplet.c @@ -503,7 +503,6 @@ e_epplet_evas_cb (void *_data, Evas _e, Evas_Object _o, D_RETURN; } -/* somthing is wrong here. segfault when calling ferite function */ void e_epplet_timer_func(int val, void *data) { @@ -511,17 +510,17 @@ e_epplet_timer_func(int val, void *data) FeriteVariable **params; D_ENTER; - D("in timer func\n"); +// D("in timer func\n"); cb = data; if (cb->script) { - D("creating params\n"); +// D("creating params\n"); params = __ferite_create_parameter_list_from_data( cb->script, "on", cb->data, (float)val ); - D("calling func\n"); +// D("calling func\n"); __ferite_variable_destroy( cb->script, __ferite_call_function( cb->script, cb->func, params)); __ferite_delete_parameter_list( cb->script, params ); - D("func called, params deleted\n"); +// D("func called, params deleted\n"); } else { @@ -533,7 +532,7 @@ e_epplet_timer_func(int val, void *data) } E_Epplet_Observer * -e_epplet_observer_new(FeriteScript *script, char *func_name, FeriteObject *data) +e_epplet_observer_new(FeriteScript *script, char *func_name, FeriteObject *data, char *event_type) { E_Epplet_Observer *obs; FeriteNamespaceBucket *nsb; @@ -543,14 +542,28 @@ e_epplet_observer_new(FeriteScript *script, char *func_name, FeriteObject *data) obs = NEW(E_Epplet_Observer, 1); memset(obs, 0, sizeof(E_Epplet_Observer)); + if (!strcmp(event_type, "DESKTOP_SWITCH")) + e_observer_init(E_OBSERVER(obs), E_EVENT_DESKTOP_SWITCH, + e_epplet_desktop_observer_func, + (E_Cleanup_Func)e_epplet_observer_cleanup); +#if 0 + else if (!strcmp(event_type, "ICONIFY")) + e_observer_init(E_OBSERVER(obs), E_EVENT_WINDOW_ICONIFY, + e_epplet_border_observer_func, + (E_Cleanup_Func)e_epplet_observer_cleanup); + else if (!strcmp(event_type, "UNICONIFY")) + e_observer_init(E_OBSERVER(obs), E_EVENT_WINDOW_UNICONIFY, + e_epplet_border_observer_func, + (E_Cleanup_Func)e_epplet_observer_cleanup); + else + e_observer_init(E_OBSERVER(obs), E_EVENT_MAX, + e_epplet_desktop_observer_func, + (E_Cleanup_Func)e_epplet_observer_cleanup); +#endif nsb = __ferite_find_namespace( script, script->mainns, func_name, FENS_FNC); if (nsb != NULL) { - e_observer_init(E_OBSERVER(obs), E_EVENT_DESKTOP_SWITCH, - e_epplet_desktop_observer_func, (E_Cleanup_Func)e_epplet_observer_cleanup); - D("initted, event: %i\n", E_OBSERVER(obs)->event); - obs->script = script; obs->func = nsb->data; if (data) @@ -566,6 +579,7 @@ e_epplet_observer_new(FeriteScript *script, char *func_name, FeriteObject *data) static void e_epplet_observer_cleanup(E_Object *o) { + /*FIXME: we need something here!!! Leeeeaky! */ } void @@ -585,6 +599,23 @@ e_epplet_observer_register_desktops(E_Epplet_Observer *obs) } D_RETURN; } +#if 0 +void +e_epplet_observer_register_borders(E_Epplet_Observer *obs) +{ + Evas_List l; + + D_ENTER; + for (l = e_border_get_borders_list(); l; l = l->next) + { + E_Border *b = l->data; + D("registering desktop...\n") + e_observer_register_observee(E_OBSERVER(obs), E_OBSERVEE(b)); + D("desktop registered\n") + } + D_RETURN; +} +#endif void e_epplet_desktop_observer_func(E_Observer *observer, E_Observee *observee) @@ -620,3 +651,39 @@ e_epplet_desktop_observer_func(E_Observer *observer, E_Observee *observee) D_RETURN; } +#if 0 /* don't use this, its currently broken */ +void +e_epplet_border_observer_func(E_Observer *observer, E_Observee *observee) +{ + E_Epplet_Observer *obs; + E_Border *b; + FeriteVariable **params; + + D_ENTER; + + obs = (E_Epplet_Observer *)observer; + b = (E_Border *)observee; + + obs->data->odata = b; + + if (obs->script) + { + /*D("creating params\n");*/ + + params = __ferite_create_parameter_list_from_data( obs->script, "o", + obs->data ); + /*D("calling func: %s\n", obs->func->name);*/ + __ferite_variable_destroy( obs->script, __ferite_call_function( + obs->script, obs->func, params)); + /*D("function called\n");*/ + __ferite_delete_parameter_list( obs->script, params ); + /*D("func called, params deleted\n");*/ + } + else + { + D("ERROR: script does not exist\n"); + } + D_RETURN; +} +#endif + diff --git a/src/epplet.h b/src/epplet.h index fcc7730cf..95dc6fc19 100644 --- a/src/epplet.h +++ b/src/epplet.h @@ -90,8 +90,9 @@ void e_epplet_evas_cb (void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y); void e_epplet_timer_func(int val, void *data); E_Epplet_Observer *e_epplet_observer_new( FeriteScript *script, - char *func_name, FeriteObject *data); + char *func_name, FeriteObject *data, char *event_type); void e_epplet_observer_register_desktops(E_Epplet_Observer *obs); void e_epplet_desktop_observer_func(E_Observer *observer, E_Observee *observee); +/*void e_epplet_border_observer_func(E_Observer *observer, E_Observee *observee);*/ #endif diff --git a/src/menu.c b/src/menu.c index d72652e2a..5fe1e157a 100644 --- a/src/menu.c +++ b/src/menu.c @@ -564,9 +564,10 @@ static void e_menu_item_unselect (E_Menu_Item *mi) { D_ENTER; - - if ((mi) && (mi->menu->selected == mi)) +D("mi unselect\n"); + if ((mi))// && (mi->menu->selected == mi)) { +D("mi && mi->menu->selected == mi\n"); mi->menu->selected = curr_selected_item = NULL; mi->selected = 0; mi->menu->redo_sel = 1; @@ -1240,7 +1241,6 @@ e_menu_hide(E_Menu *m) { D_ENTER; - D("Menu hide!\n"); if (m->selected) { @@ -1282,9 +1282,11 @@ e_menu_show_at_mouse(E_Menu *m, int x, int y, Time t) { D_ENTER; + D("show at mouse\n"); m->current.x = x; m->current.y = y; m->time = t; + D("show menu\n") e_menu_show(m); D_RETURN; @@ -1560,7 +1562,6 @@ e_menu_update_visibility(E_Menu *m) E_Menu_Item *mi; D_ENTER; - mi = m->selected; if (mi) { @@ -1597,6 +1598,7 @@ e_menu_update_base(E_Menu *m) int location_changed = 0; D_ENTER; + if (!m->changed) D_RETURN; diff --git a/src/menubuild.c b/src/menubuild.c index 8574a8d29..158683873 100644 --- a/src/menubuild.c +++ b/src/menubuild.c @@ -4,6 +4,8 @@ #include "exec.h" #include "util.h" #include "file.h" +#include "border.h" +#include "observer.h" #ifdef USE_FERITE # include "e_ferite.h" @@ -11,6 +13,7 @@ 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_cb_exec(E_Menu *m, E_Menu_Item *mi, void *data); static void e_build_menu_unbuild(E_Build_Menu *bm); @@ -22,6 +25,11 @@ 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 E_Menu *e_build_menu_iconified_borders_build(E_Build_Menu *bm); +static void e_build_menu_iconified_borders_rebuild(E_Observer *observer, E_Observee *observee); + + +/* ------------ various callbacks ---------------------- */ static void e_build_menu_cb_exec(E_Menu *m, E_Menu_Item *mi, void *data) { @@ -37,6 +45,21 @@ e_build_menu_cb_exec(E_Menu *m, E_Menu_Item *mi, void *data) UN(mi); } +static void +e_build_menu_cb_uniconify(E_Menu *m, E_Menu_Item *mi, void *data) +{ + E_Border *b; + + D_ENTER; + + b = data; + e_border_uniconify(b); + + D_RETURN; + UN(m); + UN(mi); +} + static void e_build_menu_cb_script(E_Menu *m, E_Menu_Item *mi, void *data) { @@ -58,6 +81,8 @@ e_build_menu_cb_script(E_Menu *m, E_Menu_Item *mi, void *data) UN(data); } +/*--------------------------------------------------------*/ + static void e_build_menu_unbuild(E_Build_Menu *bm) { @@ -485,3 +510,80 @@ e_build_menu_new_from_gnome_apps(char *dir) D_RETURN_(bm); } + +/*------------------------- iconified borders menu ----------------*/ + +E_Build_Menu * +e_build_menu_new_from_iconified_borders() +{ + E_Build_Menu *bm; + Evas_List l; + + D_ENTER; + + bm = NEW(E_Build_Menu, 1); + ZERO(bm, E_Build_Menu, 1); + + e_observer_init(E_OBSERVER(bm), E_EVENT_WINDOW_ICONIFY, e_build_menu_iconified_borders_rebuild, (E_Cleanup_Func) e_build_menu_cleanup); + + for (l = e_border_get_borders_list(); l; l = l->next) + { + E_Border *b = l->data; + e_observer_register_observee(E_OBSERVER(bm), E_OBSERVEE(b)); + } + bm->menu = e_build_menu_iconified_borders_build(bm); + + build_menus = evas_list_prepend(build_menus, bm); + + D_RETURN_(bm); +} + +static void +e_build_menu_iconified_borders_rebuild(E_Observer *observer, E_Observee *observee) +{ + E_Build_Menu *bm; + + D_ENTER; + D("catch iconify, rebuild menu"); + bm = (E_Build_Menu *)observer; + + e_build_menu_unbuild(bm); + bm->menu = e_build_menu_iconified_borders_build(bm); + D_RETURN; +} + +static E_Menu * +e_build_menu_iconified_borders_build(E_Build_Menu *bm) +{ + E_Menu *menu = NULL; + Evas_List l, entries = NULL; + + D_ENTER; + + menu = e_menu_new(); + e_menu_set_padding_icon(menu, 2); + e_menu_set_padding_state(menu, 2); + + for (l = e_border_get_borders_list(); l; l = l->next) + { + E_Border *b; + char *name = NULL; + E_Menu_Item *menuitem; + + b = l->data; + + if (b->client.iconified) + { + e_strdup(name, b->client.title); + D("adding menu item: %s\n", name); + menuitem = e_menu_item_new(name); + e_menu_item_set_callback(menuitem, e_build_menu_cb_uniconify, b); + e_menu_add_item(menu, menuitem); + + IF_FREE(name); + } + } + bm->menus = evas_list_prepend(bm->menus, menu); + + D_RETURN_(menu); +} diff --git a/src/menubuild.h b/src/menubuild.h index e0859c829..cd80fda25 100644 --- a/src/menubuild.h +++ b/src/menubuild.h @@ -3,12 +3,13 @@ #include "e.h" #include "object.h" +#include "observer.h" typedef struct _E_Build_Menu E_Build_Menu; struct _E_Build_Menu { - E_Object o; + E_Observer o; char *file; time_t mod_time; @@ -21,5 +22,6 @@ struct _E_Build_Menu E_Build_Menu *e_build_menu_new_from_db(char *file); E_Build_Menu *e_build_menu_new_from_gnome_apps(char *dir); +E_Build_Menu *e_build_menu_new_from_iconified_windows(); #endif diff --git a/src/observer.c b/src/observer.c index 1895517ef..87e68101c 100644 --- a/src/observer.c +++ b/src/observer.c @@ -107,7 +107,7 @@ e_observee_notify_observers(E_Observee *o, E_Event_Type event) { obs = E_OBSERVER(obs_list->data); - if (obs->event == ECORE_EVENT_MAX || + if (obs->event == E_EVENT_MAX || obs->event == event) { obs->notify_func(obs, o); diff --git a/src/observer.h b/src/observer.h index 2c13655a9..ee60c8806 100644 --- a/src/observer.h +++ b/src/observer.h @@ -17,7 +17,11 @@ typedef void(*E_Notify_Func)(E_Observer *observer, E_Observee *observee); typedef enum _e_event_type { E_EVENT_WINDOW_FOCUS_IN, - E_EVENT_DESKTOP_SWITCH + E_EVENT_WINDOW_ICONIFY, + E_EVENT_WINDOW_UNICONIFY, + E_EVENT_WINDOW_MAXIMIZE, + E_EVENT_DESKTOP_SWITCH, + E_EVENT_MAX } E_Event_Type; struct _e_observer diff --git a/src/view.c b/src/view.c index c6393be38..deffe16fe 100644 --- a/src/view.c +++ b/src/view.c @@ -430,17 +430,36 @@ e_bg_up_cb(void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) } } } -/* else if (_b == 2) + else if (_b == 2) { - exit(0); - }*/ +#if 0 + static E_Build_Menu *buildmenu = NULL; + + if (!buildmenu) + { + D("building iconified windows menu\n"); + buildmenu = e_build_menu_new_from_iconified_borders(); + } + if (buildmenu) + { + static E_Menu *menu = NULL; + menu = buildmenu->menu; + + if (menu) + { + D("showing iconified window menu\n"); + e_menu_show_at_mouse(menu, ev->rx, ev->ry, ev->time); + } + } +#endif + } else if (_b == 3) { static E_Build_Menu *buildmenu = NULL; if (!buildmenu) { - buildmenu = e_build_menu_new_from_gnome_apps("/usr/share/gnome/apps"); + buildmenu = e_build_menu_new_from_gnome_apps("/opt/gnome/share/gnome/apps"); } if (buildmenu) {