Enlightenment CVS committal Author : devilhorns Project : e_modules Module : mixer
Dir : e_modules/mixer Modified Files: e_mod_main.c e_mod_main.h mixer.edc module.eap Added Files: AUTHORS COPYING COPYING-PLAIN ChangeLog INSTALL Makefile.am NEWS README autogen.sh config.h.in configure.in mixer-volume-high.png mixer-volume-low.png mixer-volume-medium.png mixer-volume-muted.png mute.png mute_active.png Log Message: Start of a mixer module. Don't bother building, it does nothing yet :) =================================================================== RCS file: /cvs/e/e_modules/mixer/e_mod_main.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- e_mod_main.c 15 Aug 2006 02:33:01 -0000 1.1 +++ e_mod_main.c 7 Sep 2006 13:46:25 -0000 1.2 @@ -1,385 +1,350 @@ #include <e.h> #include "e_mod_main.h" -// #include "e_mixer.h" -#if TIME_WITH_SYS_TIME -# include <sys/time.h> -# include <time.h> -#else -# if HAVE_SYS_TIME_H -# include <sys/time.h> -# else -# include <time.h> -# endif -#endif - -/* Func Proto Requirements for Gadcon */ -static E_Gadcon_Client *_gc_init (E_Gadcon * gc, const char *name, - const char *id, const char *style); -static void _gc_shutdown (E_Gadcon_Client * gcc); -static void _gc_orient (E_Gadcon_Client * gcc); -static char *_gc_label (void); -static Evas_Object *_gc_icon (Evas * evas); + +/* Gadcon Protos */ +static E_Gadcon_Client *_gc_init (E_Gadcon * gc, const char *name, + const char *id, const char *style); +static void _gc_shutdown (E_Gadcon_Client * gcc); +static void _gc_orient (E_Gadcon_Client * gcc); +static char *_gc_label (void); +static Evas_Object *_gc_icon (Evas * evas); /* Module Protos */ -static void _mixer_cb_mouse_down (void *data, Evas * e, Evas_Object * obj, - void *event_info); -static void _mixer_menu_cb_configure (void *data, E_Menu * m, - E_Menu_Item * mi); -static void _mixer_menu_cb_post (void *data, E_Menu * m); -static int _mixer_cb_check (void *data); -static Config_Item *_mixer_config_item_get (const char *id); +static Config_Item *_mixer_config_item_get (const char *id); +static void _mixer_menu_cb_post (void *data, E_Menu *m); +static void _mixer_cb_mouse_down (void *data, Evas *e, + Evas_Object *obj, + void *event_info); +static void _mixer_menu_cb_configure (void *data, E_Menu *m, + E_Menu_Item *mi); +static void _mixer_window_show (void *data, int simple); static E_Config_DD *conf_edd = NULL; static E_Config_DD *conf_item_edd = NULL; Config *mixer_config = NULL; -/* Define the class and gadcon functions this module provides */ -static const E_Gadcon_Client_Class _gc_class = { - GADCON_CLIENT_CLASS_VERSION, - "mixer", {_gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon} +static const E_Gadcon_Client_Class _gc_class = +{ + GADCON_CLIENT_CLASS_VERSION, "mixer", + {_gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon}, + E_GADCON_CLIENT_STYLE_PLAIN }; typedef struct _Instance Instance; +typedef struct _Mixer Mixer; +typedef struct _Mixer_Win Mixer_Win; + struct _Instance { - E_Gadcon_Client *gcc; - Evas_Object *mixer; - Evas_Object *slider; - Ecore_Timer *check_timer; + E_Gadcon_Client *gcc; + Mixer *mixer; }; -static E_Gadcon_Client * -_gc_init (E_Gadcon * gc, const char *name, const char *id, const char *style) +struct _Mixer { - Evas_Object *o, *bar; - E_Gadcon_Client *gcc; - //Evas_List *mixer_system, *mixer_list, *mixer_elem_list; - //Mixer *mixer; - //Mixer_Elem *mixer_elem; - //int l, r; - Instance *inst; - char buf[4096]; - Config_Item *ci; - - inst = E_NEW (Instance, 1); - - ci = _mixer_config_item_get (id); - if (!ci->id) - ci->id = evas_stringshare_add (id); - - - o = edje_object_add (gc->evas); - snprintf (buf, sizeof (buf), "%s/mixer.edj", - e_module_dir_get (mixer_config->module)); - if (!e_theme_edje_object_set - (o, "base/theme/modules/mixer", "modules/mixer/main")) - edje_object_file_set (o, buf, "modules/mixer/main"); - - evas_object_show (o); - -/* - mixer_system = mixer_system_get_list(); - mixer_list = mixer_system_open(evas_list_data(mixer_system)); - mixer = evas_list_data(mixer_list); - mixer_elem_list = mixer->elems; - mixer_elem = evas_list_data(mixer_elem_list); - mixer_get_volume(mixer_elem, l, r); - ci->volume = l + r / 2; -*/ - - bar = e_widget_slider_add(gc->evas, 1, 0, _("%3.0f %%"), 0, 100, 1, 0, NULL, &ci->volume, 100); - edje_object_part_swallow(o, "mixerbar", bar); -// evas_object_pass_events_set(bar, 1); - evas_object_show (bar); - - gcc = e_gadcon_client_new (gc, name, id, style, o); - gcc->data = inst; - inst->gcc = gcc; - inst->mixer = o; - inst->slider = bar; + Instance *inst; + Evas *evas; + Mixer_Win *win; + + Evas_Object *base; +}; - evas_object_event_callback_add (o, EVAS_CALLBACK_MOUSE_DOWN, - _mixer_cb_mouse_down, inst); - evas_object_event_callback_add (bar, EVAS_CALLBACK_MOUSE_DOWN, - _mixer_cb_mouse_down, inst); +struct _Mixer_Win +{ + Mixer *mixer; + E_Win *window; - mixer_config->instances = - evas_list_append (mixer_config->instances, inst); + Evas_Object *bg_obj; +}; - _mixer_cb_check (inst); - return gcc; +static E_Gadcon_Client * +_gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style) +{ + Instance *inst; + Config_Item *ci; + Mixer *mixer; + E_Gadcon_Client *gcc; + char buf[4096]; + + inst = E_NEW(Instance, 1); + if (!inst) return NULL; + + ci = _mixer_config_item_get(id); + if (!ci->id) ci->id = evas_stringshare_add(id); + + mixer = E_NEW(Mixer, 1); + if (!mixer) return NULL; + mixer->inst = inst; + mixer->evas = gc->evas; + inst->mixer = mixer; + + snprintf(buf, sizeof(buf), "%s/mixer.edj", + e_module_dir_get(mixer_config->module)); + + mixer->base = edje_object_add(gc->evas); + edje_object_file_set(mixer->base, buf, "e/modules/mixer/main"); + evas_object_show(mixer->base); + + gcc = e_gadcon_client_new(gc, name, id, style, mixer->base); + gcc->data = inst; + inst->gcc = gcc; + + evas_object_event_callback_add(mixer->base, EVAS_CALLBACK_MOUSE_DOWN, + _mixer_cb_mouse_down, inst); + + mixer_config->instances = evas_list_append(mixer_config->instances, inst); + return gcc; } static void -_gc_shutdown (E_Gadcon_Client * gcc) +_gc_shutdown(E_Gadcon_Client *gcc) { - Instance *inst; - - inst = gcc->data; - if (inst->check_timer) - ecore_timer_del (inst->check_timer); - mixer_config->instances = - evas_list_remove (mixer_config->instances, inst); - - evas_object_event_callback_del (inst->mixer, EVAS_CALLBACK_MOUSE_DOWN, - _mixer_cb_mouse_down); - - /* FIXME: slider doesnt like mouse events */ - - evas_object_event_callback_del (inst->slider, EVAS_CALLBACK_MOUSE_DOWN, - _mixer_cb_mouse_down); - - evas_object_del (inst->mixer); - free (inst); - inst = NULL; + Instance *inst; + Mixer *mixer; + + inst = gcc->data; + if (!inst) return; + mixer = inst->mixer; + if (!mixer) return; + + if (mixer->win) + { + if (mixer->win->bg_obj) evas_object_del(mixer->win->bg_obj); + e_object_del(E_OBJECT(mixer->win->window)); + E_FREE(mixer->win); + } + + if (mixer->base) evas_object_del(mixer->base); + + mixer_config->instances = evas_list_remove(mixer_config->instances, inst); + E_FREE(mixer); + E_FREE(inst); } static void -_gc_orient (E_Gadcon_Client * gcc) +_gc_orient(E_Gadcon_Client *gcc) { - Instance *inst; - Evas_Coord mw, mh; - - inst = gcc->data; - edje_object_size_min_calc (inst->mixer, &mw, &mh); - e_gadcon_client_min_size_set (gcc, mw, mh); + e_gadcon_client_aspect_set(gcc, 16, 16); + e_gadcon_client_min_size_set(gcc, 16, 16); } static char * -_gc_label (void) +_gc_label(void) { - return D_ ("Mixer"); + return _("Mixer"); } static Evas_Object * -_gc_icon (Evas * evas) +_gc_icon(Evas *evas) { - Evas_Object *o; - char buf[4096]; + Evas_Object *o; + char buf[4096]; + + snprintf (buf, sizeof(buf), "%s/module.eap", + e_module_dir_get(mixer_config->module)); - o = edje_object_add (evas); - snprintf (buf, sizeof (buf), "%s/module.eap", - e_module_dir_get (mixer_config->module)); - edje_object_file_set (o, buf, "icon"); - return o; + o = edje_object_add(evas); + edje_object_file_set(o, buf, "icon"); + return o; } static void -_mixer_cb_mouse_down (void *data, Evas * e, Evas_Object * obj, - void *event_info) +_mixer_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info) { - Instance *inst; - Evas_Event_Mouse_Down *ev; + Instance *inst; + Evas_Event_Mouse_Down *ev; - inst = data; - ev = event_info; - if ((ev->button == 3) && (!mixer_config->menu)) - { - E_Menu *mn; - E_Menu_Item *mi; - int x, y, w, h; - - mn = e_menu_new (); - e_menu_post_deactivate_callback_set (mn, _mixer_menu_cb_post, inst); - mixer_config->menu = mn; - - mi = e_menu_item_new (mn); - e_menu_item_label_set (mi, D_ ("Configuration")); - e_util_menu_item_edje_icon_set (mi, "enlightenment/configuration"); - e_menu_item_callback_set (mi, _mixer_menu_cb_configure, inst); - - mi = e_menu_item_new (mn); - e_menu_item_separator_set (mi, 1); - - e_gadcon_client_util_menu_items_append (inst->gcc, mn, 0); - e_gadcon_canvas_zone_geometry_get (inst->gcc->gadcon, &x, &y, &w, &h); - e_menu_activate_mouse (mn, - e_util_zone_current_get (e_manager_current_get - ()), x + ev->output.x, - y + ev->output.y, 1, 1, - E_MENU_POP_DIRECTION_DOWN, ev->timestamp); - evas_event_feed_mouse_up (inst->gcc->gadcon->evas, ev->button, - EVAS_BUTTON_NONE, ev->timestamp, NULL); - } + inst = data; + if (!inst) return; + + ev = event_info; + if ((ev->button == 3) && (!mixer_config->menu)) + { + E_Menu *mn; + E_Menu_Item *mi; + E_Zone *zone; + int x, y, w, h; + + zone = e_util_zone_current_get(e_manager_current_get()); + + mn = e_menu_new(); + e_menu_post_deactivate_callback_set(mn, _mixer_menu_cb_post, inst); + mixer_config->menu = mn; + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, _("Configuration")); + e_util_menu_item_edje_icon_set(mi, "enlightenment/configuration"); + // e_menu_item_callback_set (mi, _mixer_menu_cb_configure, inst); + + mi = e_menu_item_new(mn); + e_menu_item_separator_set(mi, 1); + + e_gadcon_client_util_menu_items_append(inst->gcc, mn, 0); + e_gadcon_canvas_zone_geometry_get(inst->gcc->gadcon, &x, &y, &w, &h); + e_menu_activate_mouse(mn,zone, x + ev->output.x, y + ev->output.y, + 1, 1, E_MENU_POP_DIRECTION_DOWN, ev->timestamp); + evas_event_feed_mouse_up(inst->gcc->gadcon->evas, ev->button, + EVAS_BUTTON_NONE, ev->timestamp, NULL); + } + else if (ev->button == 1) + { + if (ev->flags == EVAS_BUTTON_DOUBLE_CLICK) + { + /* Call full mixer window */ + } + else if (ev->flags == EVAS_BUTTON_NONE) + { + /* Call a simple window */ + _mixer_window_show(inst, 0); + } + } } static void -_mixer_menu_cb_post (void *data, E_Menu * m) +_mixer_menu_cb_post(void *data, E_Menu *m) { - if (!mixer_config->menu) - return; - e_object_del (E_OBJECT (mixer_config->menu)); - mixer_config->menu = NULL; + if (!mixer_config->menu) return; + e_object_del(E_OBJECT(mixer_config->menu)); + mixer_config->menu = NULL; } -static void -_mixer_menu_cb_configure (void *data, E_Menu * m, E_Menu_Item * mi) +static Config_Item * +_mixer_config_item_get(const char *id) { - Instance *inst; - Config_Item *ci; + Evas_List *l; + Config_Item *ci; - inst = data; - ci = _mixer_config_item_get (inst->gcc->id); - _config_mixer_module (ci); -} + for (l = mixer_config->items; l; l = l->next) + { + ci = l->data; + if (!ci->id) continue; + if (!strcmp(ci->id, id)) return ci; + } -void -_mixer_config_updated (const char *id) -{ - Evas_List *l; - Config_Item *ci; + ci = E_NEW(Config_Item, 1); + ci->id = evas_stringshare_add(id); + ci->volume = 10; - if (!mixer_config) - return; - ci = _mixer_config_item_get (id); - /* FIXME: stuff here */ + mixer_config->items = evas_list_append(mixer_config->items, ci); + return ci; } -static int -_mixer_cb_check (void *data) +EAPI E_Module_Api e_modapi = { - Instance *inst; - Config_Item *ci; - time_t current_time; - struct tm *local_time; - char buf[1024]; - - inst = data; - ci = _mixer_config_item_get (inst->gcc->id); - /* FIXME: stuff here */ - - return 1; -} - -static Config_Item * -_mixer_config_item_get (const char *id) -{ - Evas_List *l; - Config_Item *ci; - - for (l = mixer_config->items; l; l = l->next) - { - ci = l->data; - if (!ci->id) - continue; - if (!strcmp (ci->id, id)) - return ci; - } - - ci = E_NEW (Config_Item, 1); - ci->id = evas_stringshare_add (id); - ci->volume = 10; - /* FIXME: stuff here */ - - mixer_config->items = evas_list_append (mixer_config->items, ci); - return ci; -} - -EAPI E_Module_Api e_modapi = { - E_MODULE_API_VERSION, - "Mixer" + E_MODULE_API_VERSION, "Mixer" }; EAPI void * -e_modapi_init (E_Module * m) +e_modapi_init(E_Module *m) { - bindtextdomain (PACKAGE, LOCALEDIR); - bind_textdomain_codeset (PACKAGE, "UTF-8"); - - conf_item_edd = E_CONFIG_DD_NEW ("Mixer_Config_Item", Config_Item); + conf_item_edd = E_CONFIG_DD_NEW("Mixer_Config_Item", Config_Item); #undef T #undef D #define T Config_Item #define D conf_item_edd - E_CONFIG_VAL (D, T, id, STR); - E_CONFIG_VAL (D, T, volume, INT); + E_CONFIG_VAL(D, T, id, STR); + E_CONFIG_VAL(D, T, volume, INT); - conf_edd = E_CONFIG_DD_NEW ("Mixer_Config", Config); + conf_edd = E_CONFIG_DD_NEW("Mixer_Config", Config); #undef T #undef D #define T Config #define D conf_edd - E_CONFIG_LIST (D, T, items, conf_item_edd); + E_CONFIG_LIST(D, T, items, conf_item_edd); - mixer_config = e_config_domain_load ("module.mixer", conf_edd); - if (!mixer_config) - { - Config_Item *ci; + mixer_config = e_config_domain_load("module.mixer", conf_edd); + if (!mixer_config) + { + Config_Item *ci; - mixer_config = E_NEW (Config, 1); + mixer_config = E_NEW(Config, 1); - ci = E_NEW (Config_Item, 1); - ci->id = evas_stringshare_add ("0"); - ci->volume = 10; + ci = E_NEW(Config_Item, 1); + ci->id = evas_stringshare_add("0"); + ci->volume = 10; - mixer_config->items = evas_list_append (mixer_config->items, ci); - } - mixer_config->module = m; + mixer_config->items = evas_list_append(mixer_config->items, ci); + } + mixer_config->module = m; - e_gadcon_provider_register (&_gc_class); - return m; + e_gadcon_provider_register(&_gc_class); + return m; } EAPI int -e_modapi_shutdown (E_Module * m) +e_modapi_shutdown(E_Module *m) { - mixer_config->module = NULL; - e_gadcon_provider_unregister (&_gc_class); + mixer_config->module = NULL; + e_gadcon_provider_unregister(&_gc_class); - if (mixer_config->config_dialog) - e_object_del (E_OBJECT (mixer_config->config_dialog)); - if (mixer_config->menu) - { - e_menu_post_deactivate_callback_set (mixer_config->menu, NULL, NULL); - e_object_del (E_OBJECT (mixer_config->menu)); - mixer_config->menu = NULL; - } - - while (mixer_config->items) - { - Config_Item *ci; - - ci = mixer_config->items->data; - mixer_config->items = - evas_list_remove_list (mixer_config->items, mixer_config->items); - if (ci->id) - evas_stringshare_del (ci->id); - free (ci); - ci = NULL; - } - - free (mixer_config); - mixer_config = NULL; - E_CONFIG_DD_FREE (conf_item_edd); - E_CONFIG_DD_FREE (conf_edd); - return 1; + if (mixer_config->config_dialog) + e_object_del(E_OBJECT(mixer_config->config_dialog)); + + if (mixer_config->menu) + { + e_menu_post_deactivate_callback_set(mixer_config->menu, NULL, NULL); + e_object_del(E_OBJECT(mixer_config->menu)); + mixer_config->menu = NULL; + } + + while (mixer_config->items) + { + Config_Item *ci; + + ci = mixer_config->items->data; + mixer_config->items = evas_list_remove_list(mixer_config->items, + mixer_config->items); + if (ci->id) evas_stringshare_del(ci->id); + E_FREE(ci); + } + + E_FREE(mixer_config); + E_CONFIG_DD_FREE(conf_item_edd); + E_CONFIG_DD_FREE(conf_edd); + return 1; } EAPI int -e_modapi_save (E_Module * m) +e_modapi_save(E_Module *m) { - Evas_List *l; + Evas_List *l; - for (l = mixer_config->instances; l; l = l->next) - { - Instance *inst; - Config_Item *ci; - - inst = l->data; - ci = _mixer_config_item_get (inst->gcc->id); - if (ci->id) - evas_stringshare_del (ci->id); - ci->id = evas_stringshare_add (inst->gcc->id); - } - e_config_domain_save ("module.mixer", conf_edd, mixer_config); - return 1; + for (l = mixer_config->instances; l; l = l->next) + { + Instance *inst; + Config_Item *ci; + + inst = l->data; + ci = _mixer_config_item_get(inst->gcc->id); + if (ci->id) evas_stringshare_del(ci->id); + ci->id = evas_stringshare_add(inst->gcc->id); + } + e_config_domain_save("module.mixer", conf_edd, mixer_config); + return 1; } EAPI int -e_modapi_about (E_Module * m) +e_modapi_about(E_Module *m) { - e_module_dialog_show (m, D_ ("Mixer"), - D_ ("Mixer module lets you change volume.")); - return 1; + e_module_dialog_show(m, _("Mixer"), + _("Mixer module lets you change volume.")); + return 1; +} + +static void +_mixer_window_show(void *data, int simple) +{ + /* Use simple to determine if we are showing a full mixer, + * or just a simple Master/PCM slider */ + + Instance *inst; + Mixer *mixer; + + inst = data; + if (!inst) return; + + mixer = inst->mixer; + if (!mixer) return; + } =================================================================== RCS file: /cvs/e/e_modules/mixer/e_mod_main.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- e_mod_main.h 15 Aug 2006 02:33:01 -0000 1.1 +++ e_mod_main.h 7 Sep 2006 13:46:25 -0000 1.2 @@ -1,38 +1,31 @@ -#define D_(str) dgettext(PACKAGE, str) - #ifndef E_MOD_MAIN_H #define E_MOD_MAIN_H -#define RESOLUTION_MINUTE 0 -#define RESOLUTION_SECOND 1 - typedef struct _Config Config; typedef struct _Config_Item Config_Item; struct _Config { - E_Module *module; + E_Module *module; E_Config_Dialog *config_dialog; - E_Menu *menu; - Evas_List *instances; - Evas_List *items; + E_Menu *menu; + Evas_List *instances; + Evas_List *items; }; struct _Config_Item { const char *id; - int volume; + int volume; }; EAPI extern E_Module_Api e_modapi; -EAPI void *e_modapi_init(E_Module *m); -EAPI int e_modapi_shutdown(E_Module *m); -EAPI int e_modapi_save(E_Module *m); -EAPI int e_modapi_about(E_Module *m); +EAPI void *e_modapi_init (E_Module *m); +EAPI int e_modapi_shutdown (E_Module *m); +EAPI int e_modapi_save (E_Module *m); +EAPI int e_modapi_about (E_Module *m); -void _config_mixer_module(Config_Item *ci); -void _mixer_config_updated(const char *id); extern Config *mixer_config; #endif =================================================================== RCS file: /cvs/e/e_modules/mixer/mixer.edc,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- mixer.edc 15 Aug 2006 02:33:01 -0000 1.1 +++ mixer.edc 7 Sep 2006 13:46:25 -0000 1.2 @@ -1,91 +1,44 @@ -fonts { - font: "VeraMono.ttf" "VeraMono"; +images +{ + image: "mixer-volume-high.png" COMP; + image: "mixer-volume-medium.png" COMP; + image: "mixer-volume-low.png" COMP; + image: "mixer-volume-muted.png" COMP; } collections { - group + group { - name: "modules/mixer/main"; - parts + name: "e/modules/mixer/main"; + max: 128 128; + parts { - part + part { - name: "base"; - type: RECT; - mouse_events: 1; - description + name: "icon"; + type: IMAGE; + description { state: "default" 0.0; - color: 255 255 255 255; - } - } - part - { - name: "mixerlabel"; - type: TEXT; - effect: OUTLINE_SOFT_SHADOW; - clip_to: "base"; - mouse_events: 1; - description - { - state: "default" 0.0; - visible: 1; - align: 0.0 0.5; - rel1 + aspect: 1.0 1.0; + aspect_preference: BOTH; + rel1 { relative: 0.0 0.0; - offset: 0 4; - } - rel2 - { - relative: 0.0 1.0; - offset: 1 -3; + offset: 2 2; } - color: 255 255 255 255; - color2: 0 0 0 96; - color3: 0 0 0 32; - text { - text: "Volume"; - font: "VeraMono"; - size: 10; - min: 1 1; - align: 0.0 0.5; - text_class: "module_large"; - } - } - } - part - { - name: "mixerbar"; - type: SWALLOW; - clip_to: "base"; - mouse_events: 1; - description - { - state: "default" 0.0; - visible: 1; - align: 0.5 0.5; - rel1 + rel2 { - relative: 1.0 0.0; - to_x: mixerlabel; - offset: 0 4; + relative: 1.0 1.0; + offset: -3 -3; } - rel2 + image { - relative: 1.0 1.0; - offset: -1 -3; + normal: "mixer-volume-high.png"; } - } - } - } - /* Close Parts */ - programs - { - } - /* Close Programs */ - } - /* Close Group */ -} -/* Close Coll */ + } + } /* end icon part */ + } /* end parts */ + } /* end group */ +} /* end collections */ =================================================================== RCS file: /cvs/e/e_modules/mixer/module.eap,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 Binary files /tmp/cvsBusn1C and /tmp/cvsxt53A9 differ ------------------------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs