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) {