diff --git a/.cvsignore b/.cvsignore index e64e843..1bcf1c2 100644 --- a/.cvsignore +++ b/.cvsignore @@ -1,24 +1,2 @@ -.deps -.libs Makefile -Makefile.in -aclocal.m4 -autom4te.cache -config.guess -config.h -config.h.in -config.log -config.status -config.sub configure -depcomp -install-sh -libtool -missing -ltmain.sh -stamp-h1 -*.lo -*.la -*.edj -*.spec -*.tar.gz diff --git a/mixer/e_mod_config.c b/mixer/e_mod_config.c new file mode 100644 index 0000000..dcd1918 --- /dev/null +++ b/mixer/e_mod_config.c @@ -0,0 +1,151 @@ +#include +#include "e_mod_main.h" + +struct _E_Config_Dialog_Data +{ +// int resolution; +}; + +/* Protos */ +static void *_create_data (E_Config_Dialog * cfd); +static void _free_data (E_Config_Dialog * cfd, E_Config_Dialog_Data * cfdata); +static Evas_Object *_basic_create_widgets (E_Config_Dialog * cfd, Evas * evas, + E_Config_Dialog_Data * cfdata); +static int _basic_apply_data (E_Config_Dialog * cfd, + E_Config_Dialog_Data * cfdata); +static void onTimeCheckChange (void *data, Evas_Object * obj); +static void onDateCheckChange (void *data, Evas_Object * obj); + +void +_config_mixer_module (Config_Item * ci) +{ + E_Config_Dialog *cfd; + E_Config_Dialog_View *v; + E_Container *con; + char buf[4096]; + + v = E_NEW (E_Config_Dialog_View, 1); + + v->create_cfdata = _create_data; + v->free_cfdata = _free_data; + v->basic.apply_cfdata = _basic_apply_data; + v->basic.create_widgets = _basic_create_widgets; + + snprintf (buf, sizeof (buf), "%s/module.eap", + e_module_dir_get (mixer_config->module)); + con = e_container_current_get (e_manager_current_get ()); + cfd = e_config_dialog_new (con, D_ ("Mixer Configuration"), "Mixer", "_e_modules_mixer_config_dialog", buf, 0, v, ci); + mixer_config->config_dialog = cfd; +} + +static void +_fill_data (Config_Item * ci, E_Config_Dialog_Data * cfdata) +{ +// cfdata->resolution = ci->resolution; +} + +static void * +_create_data (E_Config_Dialog * cfd) +{ + E_Config_Dialog_Data *cfdata; + Config_Item *ci; + + ci = cfd->data; + cfdata = E_NEW (E_Config_Dialog_Data, 1); + + _fill_data (ci, cfdata); + return cfdata; +} + +static void +_free_data (E_Config_Dialog * cfd, E_Config_Dialog_Data * cfdata) +{ + if (!mixer_config) + return; + mixer_config->config_dialog = NULL; + free (cfdata); + cfdata = NULL; +} + +static Evas_Object * +_basic_create_widgets (E_Config_Dialog * cfd, Evas * evas, + E_Config_Dialog_Data * cfdata) +{ + Evas_Object *o; +// Evas_Object *of, *ob, *time_entry, *time_check, *date_entry, *date_check; +// E_Radio_Group *rg; + + o = e_widget_list_add (evas, 0, 0); +/* + of = e_widget_framelist_add (evas, D_ ("Resolution"), 0); + rg = e_widget_radio_group_new (&(cfdata->resolution)); + ob = e_widget_radio_add (evas, D_ ("1 Minute"), RESOLUTION_MINUTE, rg); + e_widget_framelist_object_append (of, ob); + ob = e_widget_radio_add (evas, D_ ("1 Second"), RESOLUTION_SECOND, rg); + e_widget_framelist_object_append (of, ob); + e_widget_list_object_append (o, of, 1, 1, 0.5); + + of = e_widget_frametable_add (evas, D_ ("Date"), 1); + date_check = + e_widget_check_add (evas, D_ ("Show Date"), &(cfdata->show_date)); + if (cfdata->show_date) + e_widget_check_checked_set (date_check, 1); + e_widget_frametable_object_append (of, date_check, 0, 0, 1, 1, 1, 0, 1, 0); + date_entry = e_widget_entry_add (evas, &cfdata->date_format); + e_widget_on_change_hook_set (date_check, onDateCheckChange, date_entry); + e_widget_disabled_set (date_entry, !cfdata->show_date); + e_widget_min_size_set (date_entry, 150, 1); + e_widget_frametable_object_append (of, date_entry, 0, 1, 1, 1, 1, 0, 1, 0); + ob = + e_widget_label_add (evas, D_ ("Consult strftime(3) for format syntax")); + e_widget_frametable_object_append (of, ob, 0, 2, 1, 1, 1, 0, 1, 0); + e_widget_list_object_append (o, of, 1, 1, 0.5); + + of = e_widget_frametable_add (evas, D_ ("Time"), 1); + time_check = + e_widget_check_add (evas, D_ ("Show Time"), &(cfdata->show_time)); + if (cfdata->show_time) + e_widget_check_checked_set (time_check, 1); + e_widget_frametable_object_append (of, time_check, 0, 0, 1, 1, 1, 0, 1, 0); + time_entry = e_widget_entry_add (evas, &cfdata->time_format); + e_widget_on_change_hook_set (time_check, onTimeCheckChange, time_entry); + e_widget_disabled_set (time_entry, !cfdata->show_time); + e_widget_min_size_set (time_entry, 150, 1); + e_widget_frametable_object_append (of, time_entry, 0, 1, 1, 1, 1, 0, 1, 0); + ob = + e_widget_label_add (evas, D_ ("Consult strftime(3) for format syntax")); + e_widget_frametable_object_append (of, ob, 0, 2, 1, 1, 1, 0, 1, 0); + e_widget_list_object_append (o, of, 1, 1, 0.5); +*/ + return o; +} + +static int +_basic_apply_data (E_Config_Dialog * cfd, E_Config_Dialog_Data * cfdata) +{ +// Config_Item *ci; + +// ci = cfd->data; + + +// e_config_save_queue (); + +// _mixer_config_updated (ci->id); + return 1; +} + +static void +onTimeCheckChange (void *data, Evas_Object * obj) +{ + int checked = e_widget_check_checked_get (obj); + + e_widget_disabled_set (data, !checked); +} + +static void +onDateCheckChange (void *data, Evas_Object * obj) +{ + int checked = e_widget_check_checked_get (obj); + + e_widget_disabled_set (data, !checked); +} diff --git a/mixer/e_mod_main.c b/mixer/e_mod_main.c new file mode 100644 index 0000000..3093472 --- /dev/null +++ b/mixer/e_mod_main.c @@ -0,0 +1,385 @@ +#include +#include "e_mod_main.h" +// #include "e_mixer.h" +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# 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); + +/* 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 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} +}; + +typedef struct _Instance Instance; +struct _Instance +{ + E_Gadcon_Client *gcc; + Evas_Object *mixer; + Evas_Object *slider; + Ecore_Timer *check_timer; +}; + +static E_Gadcon_Client * +_gc_init (E_Gadcon * gc, const char *name, const char *id, const char *style) +{ + 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; + + 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); + + mixer_config->instances = + evas_list_append (mixer_config->instances, inst); + + _mixer_cb_check (inst); + return gcc; +} + +static void +_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; +} + +static void +_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); +} + +static char * +_gc_label (void) +{ + return D_ ("Mixer"); +} + +static Evas_Object * +_gc_icon (Evas * evas) +{ + Evas_Object *o; + char buf[4096]; + + 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; +} + +static void +_mixer_cb_mouse_down (void *data, Evas * e, Evas_Object * obj, + void *event_info) +{ + 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); + } +} + +static void +_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; +} + +static void +_mixer_menu_cb_configure (void *data, E_Menu * m, E_Menu_Item * mi) +{ + Instance *inst; + Config_Item *ci; + + inst = data; + ci = _mixer_config_item_get (inst->gcc->id); + _config_mixer_module (ci); +} + +void +_mixer_config_updated (const char *id) +{ + Evas_List *l; + Config_Item *ci; + + if (!mixer_config) + return; + ci = _mixer_config_item_get (id); + /* FIXME: stuff here */ +} + +static int +_mixer_cb_check (void *data) +{ + 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" +}; + +EAPI void * +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); +#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); + + 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); + + mixer_config = e_config_domain_load ("module.mixer", conf_edd); + if (!mixer_config) + { + Config_Item *ci; + + mixer_config = E_NEW (Config, 1); + + 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; + + e_gadcon_provider_register (&_gc_class); + return m; +} + +EAPI int +e_modapi_shutdown (E_Module * m) +{ + 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; +} + +EAPI int +e_modapi_save (E_Module * m) +{ + 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; +} + +EAPI int +e_modapi_about (E_Module * m) +{ + e_module_dialog_show (m, D_ ("Mixer"), + D_ ("Mixer module lets you change volume.")); + return 1; +} diff --git a/mixer/e_mod_main.h b/mixer/e_mod_main.h new file mode 100644 index 0000000..d4756ff --- /dev/null +++ b/mixer/e_mod_main.h @@ -0,0 +1,38 @@ +#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_Config_Dialog *config_dialog; + E_Menu *menu; + Evas_List *instances; + Evas_List *items; +}; + +struct _Config_Item +{ + const char *id; + 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); + +void _config_mixer_module(Config_Item *ci); +void _mixer_config_updated(const char *id); +extern Config *mixer_config; + +#endif diff --git a/mixer/mixer.edc b/mixer/mixer.edc new file mode 100644 index 0000000..464664e --- /dev/null +++ b/mixer/mixer.edc @@ -0,0 +1,91 @@ +fonts { + font: "VeraMono.ttf" "VeraMono"; +} + +collections +{ + group + { + name: "modules/mixer/main"; + parts + { + part + { + name: "base"; + type: RECT; + mouse_events: 1; + 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 + { + relative: 0.0 0.0; + offset: 0 4; + } + rel2 + { + relative: 0.0 1.0; + offset: 1 -3; + } + 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 + { + relative: 1.0 0.0; + to_x: mixerlabel; + offset: 0 4; + } + rel2 + { + relative: 1.0 1.0; + offset: -1 -3; + } + } + } + } + /* Close Parts */ + programs + { + } + /* Close Programs */ + } + /* Close Group */ +} +/* Close Coll */ diff --git a/mixer/module.eap b/mixer/module.eap new file mode 100644 index 0000000..515c932 Binary files /dev/null and b/mixer/module.eap differ