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
This commit is contained in:
rephorm 2002-01-24 01:08:52 +00:00 committed by rephorm
parent 1afbdb13ef
commit 3e09f77dbd
13 changed files with 399 additions and 50 deletions

View File

@ -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 \

View File

@ -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);

View File

@ -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);
}

View File

@ -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

View File

@ -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);
%}
*/
}

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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);
}

View File

@ -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

View File

@ -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);

View File

@ -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

View File

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