diff --git a/configure.in b/configure.in index 8888c4fe2..6ff1f4c18 100644 --- a/configure.in +++ b/configure.in @@ -185,6 +185,7 @@ src/modules/clock/Makefile src/modules/flame/Makefile src/modules/snow/Makefile src/modules/battery/Makefile +src/modules/temperature/Makefile data/Makefile data/fonts/Makefile data/images/Makefile diff --git a/data/themes/default.edc b/data/themes/default.edc index 77cca10d6..aef4c286c 100644 --- a/data/themes/default.edc +++ b/data/themes/default.edc @@ -269,6 +269,11 @@ images { image: "e17_battery_090.png" COMP; image: "e17_battery_100.png" COMP; image: "e17_battery_ac.png" COMP; + + image: "e17_temperature_base.png" COMP; + image: "e17_temperature_mid.png" COMP; + image: "e17_temperature_overlay.png" COMP; + } collections { @@ -5435,4 +5440,175 @@ collections { } } } + group { + name: "modules/temperature/main"; + max: 128 128; + script { + public message(Msg_Type:type, id, ...) { + if ((type == MSG_FLOAT) && (id == 1)) { + new Float:val; + val = getfarg(2); + set_drag(PART:"temp_top", 0.0, val); + } + } + } + parts { + part { + name: "base"; + clip_to: "fade_clip"; + description { + state: "default" 0.0; + aspect: 0.387 0.387; + align: 0.0 0.5; + max: 48 124; + rel1 { + relative: 0.0 0.0; + } + rel2 { + relative: 1.0 1.0; + } + image { + normal: "e17_temperature_base.png"; + } + } + } + part { + name: "temp"; + clip_to: "temp_clip"; + description { + state: "default" 0.0; + rel1 { + to: "base"; + } + rel2 { + to: "base"; + } + image { + normal: "e17_temperature_mid.png"; + } + } + } + part { + name: "overlay"; + clip_to: "fade_clip"; + description { + state: "default" 0.0; + rel1 { + to: "base"; + } + rel2 { + to: "base"; + } + image { + normal: "e17_temperature_overlay.png"; + } + } + } + part { + name: "reading"; + type: TEXT; + effect: SOFT_SHADOW; + clip_to: "fade_clip"; + description { + state: "default" 0.0; + align: 1.0 0.0; + rel1 { + relative: 1.0 0.0; + to_x: "temp"; + } + rel2 { + relative: 1.0 0.0; + } + color: 255 255 255 255; + color3: 0 0 0 32; + text { + text: "99^C"; + font: "Edje Vera"; + size: 7; + min: 1 1; + align: 0.0 0.0; + } + } + } + part { + name: "fade_clip"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "faded" 0.0; + color: 255 255 255 128; + } + } + part { +// +10 -46 / 124 + name: "temp_clip"; + type: RECT; + clip_to: "fade_clip"; + mouse_events: 0; + description { + state: "default" 0.0; + rel1 { + to_x: "base"; + to_y: "temp_top"; + } + rel2 { + to: "base"; + } + } + } + part { +// +10 -46 / 124 + name: "temp_top"; + type: RECT; + dragable { + x: 0 0 0; + y: -1 1 0; + confine: "temp_limit"; + } + mouse_events: 0; + description { + state: "default" 0.0; + visible: 0; + } + } + part { +// +10 -46 / 124 + name: "temp_limit"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + visible: 0; + rel1 { + relative: 0.0 0.081; + to: "base"; + } + rel2 { + relative: 1.0 0.637; + to: "base"; + } + } + } + } + programs { + program { + name: "on"; + signal: "enable"; + source: ""; + action: STATE_SET "default" 0.0; + target: "fade_clip"; + } + program { + name: "off"; + signal: "disable"; + source: ""; + action: STATE_SET "faded" 0.0; + target: "fade_clip"; + } + } + } } diff --git a/data/themes/images/Makefile.am b/data/themes/images/Makefile.am index ec18d966d..19a21f62e 100644 --- a/data/themes/images/Makefile.am +++ b/data/themes/images/Makefile.am @@ -243,4 +243,8 @@ e17_battery_070.png \ e17_battery_080.png \ e17_battery_090.png \ e17_battery_100.png \ -e17_battery_ac.png +e17_battery_ac.png \ +e17_temperature_base.png \ +e17_temperature_mid.png \ +e17_temperature_overlay.png + diff --git a/src/bin/e_border.c b/src/bin/e_border.c index 0d3b990ad..9d8784059 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -2300,6 +2300,7 @@ _e_border_menu_show(E_Border *bd, Evas_Coord x, Evas_Coord y) E_Menu_Item *mi; E_App *a; + if (e_menu_grab_window_get()) return; if (!_e_border_menu) _e_border_menu = e_menu_new(); else @@ -2440,4 +2441,3 @@ _e_border_menu_cb_icon_edit(void *data, E_Menu *m, E_Menu_Item *mi) please install e_util_eapp_edit\n \ or make sure it is in your PATH\n"); } - diff --git a/src/bin/e_config.c b/src/bin/e_config.c index bab9d0a2b..a120a7e35 100644 --- a/src/bin/e_config.c +++ b/src/bin/e_config.c @@ -88,6 +88,10 @@ e_config_init(void) em->name = strdup("battery"); e_config->modules = evas_list_append(e_config->modules, em); em->enabled = 1; + em = E_NEW(E_Config_Module, 1); + em->name = strdup("temperature"); + e_config->modules = evas_list_append(e_config->modules, em); + em->enabled = 1; } } diff --git a/src/bin/e_container.c b/src/bin/e_container.c index 45a98e5fa..ec02c970d 100644 --- a/src/bin/e_container.c +++ b/src/bin/e_container.c @@ -335,6 +335,8 @@ _e_container_cb_bg_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *ev ev = (Evas_Event_Mouse_Down *)event_info; con = data; + if (e_menu_grab_window_get()) return; + if (ev->button == 1) { E_Menu *m; diff --git a/src/bin/e_menu.c b/src/bin/e_menu.c index 469feab5d..386681f9c 100644 --- a/src/bin/e_menu.c +++ b/src/bin/e_menu.c @@ -617,6 +617,12 @@ e_menu_idler_before(void) } } +Ecore_X_Window +e_menu_grab_window_get(void) +{ + return _e_menu_win; +} + /* local subsystem functions */ static void _e_menu_free(E_Menu *m) diff --git a/src/bin/e_menu.h b/src/bin/e_menu.h index 1234428a4..131755992 100644 --- a/src/bin/e_menu.h +++ b/src/bin/e_menu.h @@ -138,5 +138,6 @@ EAPI void e_menu_item_callback_set(E_Menu_Item *mi, void (*func) (void EAPI void e_menu_item_active_set(E_Menu_Item *mi, int active); EAPI void e_menu_idler_before(void); - + +EAPI Ecore_X_Window e_menu_grab_window_get(void); #endif diff --git a/src/modules/Makefile.am b/src/modules/Makefile.am index 001815cd8..ed5b4719b 100644 --- a/src/modules/Makefile.am +++ b/src/modules/Makefile.am @@ -6,4 +6,5 @@ dropshadow \ clock \ flame \ snow \ -battery +battery \ +temperature diff --git a/src/modules/battery/e_mod_main.c b/src/modules/battery/e_mod_main.c index a968a7dab..60a7b082d 100644 --- a/src/modules/battery/e_mod_main.c +++ b/src/modules/battery/e_mod_main.c @@ -34,7 +34,7 @@ init(E_Module *m) if (m->api->version < E_MODULE_API_VERSION) { e_error_dialog_show("Module API Error", - "Error initializing Module: IBar\n" + "Error initializing Module: Battery\n" "It requires a minimum module API version of: %i.\n" "The module API advertized by Enlightenment is: %i.\n" "Aborting module.", @@ -91,7 +91,10 @@ int about(E_Module *m) { e_error_dialog_show("Enlightenment Battery Module", - "A simple module to give E17 a battery meter."); + "A basic battery meter that uses either ACPI or APM\n" + "on Linux to monitor your battery and AC power adaptor\n" + "status. This will only work under Linux and is only\n" + "as accurate as your BIOS or kernel drivers."); return 1; } @@ -113,7 +116,8 @@ _battery_init(E_Module *m) E_CONFIG_VAL(D, T, width, INT); E_CONFIG_VAL(D, T, x, DOUBLE); E_CONFIG_VAL(D, T, y, DOUBLE); - + E_CONFIG_VAL(D, T, poll_time, DOUBLE); + e->conf = e_config_domain_load("module.battery", e->conf_edd); if (!e->conf) { @@ -121,10 +125,12 @@ _battery_init(E_Module *m) e->conf->width = 64; e->conf->x = 1.0; e->conf->y = 1.0; + e->conf->poll_time = 30.0; } E_CONFIG_LIMIT(e->conf->width, 2, 256); E_CONFIG_LIMIT(e->conf->x, 0.0, 1.0); E_CONFIG_LIMIT(e->conf->y, 0.0, 1.0); + E_CONFIG_LIMIT(e->conf->poll_time, 0.5, 1000.0); managers = e_manager_list(); for (l = managers; l; l = l->next) @@ -162,18 +168,109 @@ _battery_shutdown(Battery *e) free(e); } +static void +_battery_menu_fast(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Battery *e; + + e = data; + e->conf->poll_time = 1.0; + ecore_timer_del(e->face->battery_check_timer); + e->face->battery_check_timer = ecore_timer_add(e->face->bat->conf->poll_time, _battery_cb_check, e->face); + e_config_save_queue(); +} + +static void +_battery_menu_medium(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Battery *e; + + e = data; + e->conf->poll_time = 5.0; + ecore_timer_del(e->face->battery_check_timer); + e->face->battery_check_timer = ecore_timer_add(e->face->bat->conf->poll_time, _battery_cb_check, e->face); + e_config_save_queue(); +} + +static void +_battery_menu_normal(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Battery *e; + + e = data; + e->conf->poll_time = 10.0; + ecore_timer_del(e->face->battery_check_timer); + e->face->battery_check_timer = ecore_timer_add(e->face->bat->conf->poll_time, _battery_cb_check, e->face); + e_config_save_queue(); +} + +static void +_battery_menu_slow(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Battery *e; + + e = data; + e->conf->poll_time = 30.0; + ecore_timer_del(e->face->battery_check_timer); + e->face->battery_check_timer = ecore_timer_add(e->face->bat->conf->poll_time, _battery_cb_check, e->face); + e_config_save_queue(); +} + +static void +_battery_menu_very_slow(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Battery *e; + + e = data; + e->conf->poll_time = 60.0; + ecore_timer_del(e->face->battery_check_timer); + e->face->battery_check_timer = ecore_timer_add(e->face->bat->conf->poll_time, _battery_cb_check, e->face); + e_config_save_queue(); +} + static E_Menu * _battery_config_menu_new(Battery *e) { E_Menu *mn; E_Menu_Item *mi; - /* FIXME: hook callbacks to each menu item */ mn = e_menu_new(); mi = e_menu_item_new(mn); - e_menu_item_label_set(mi, "(Unused)"); -/* e_menu_item_callback_set(mi, _battery_cb_time_set, e);*/ + e_menu_item_label_set(mi, "Check Fast (1 sec)"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (e->conf->poll_time == 1.0) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _battery_menu_fast, e); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "Check Medium (5 sec)"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (e->conf->poll_time == 5.0) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _battery_menu_medium, e); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "Check Normal (10 sec)"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (e->conf->poll_time == 10.0) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _battery_menu_normal, e); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "Check Slow (30 sec)"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (e->conf->poll_time == 30.0) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _battery_menu_slow, e); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "Check Very Slow (60 sec)"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (e->conf->poll_time == 60.0) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _battery_menu_very_slow, e); + e->config_menu = mn; return mn; @@ -230,7 +327,7 @@ _battery_face_init(Battery_Face *ef) ef->battery_prev_drain = 1; ef->battery_prev_ac = -1; ef->battery_prev_battery = -1; - ef->battery_check_timer = ecore_timer_add(1.0, _battery_cb_check, ef); + ef->battery_check_timer = ecore_timer_add(ef->bat->conf->poll_time, _battery_cb_check, ef); _battery_cb_check(ef); @@ -434,9 +531,9 @@ _battery_linux_acpi_check(Battery_Face *ef) char *name; name = bats->data; + bats = evas_list_remove_list(bats, bats); if ((!strcmp(name, ".")) || (!strcmp(name, ".."))) { - bats = evas_list_remove_list(bats, bats); free(name); continue; } @@ -447,12 +544,12 @@ _battery_linux_acpi_check(Battery_Face *ef) int design_cap = 0; int last_full = 0; - fgets(buf2, sizeof(buf2), f); buf[sizeof(buf2) - 1] = 0; - fgets(buf2, sizeof(buf2), f); buf[sizeof(buf2) - 1] = 0; + fgets(buf2, sizeof(buf2), f); buf2[sizeof(buf2) - 1] = 0; + fgets(buf2, sizeof(buf2), f); buf2[sizeof(buf2) - 1] = 0; sscanf(buf2, "%*[^:]: %250s %*s", buf); if (!strcmp(buf, "unknown")) design_cap_unknown = 1; else sscanf(buf2, "%*[^:]: %i %*s", &design_cap); - fgets(buf2, sizeof(buf2), f); buf[sizeof(buf2) - 1] = 0; + fgets(buf2, sizeof(buf2), f); buf2[sizeof(buf2) - 1] = 0; sscanf(buf2, "%*[^:]: %250s %*s", buf); if (!strcmp(buf, "unknown")) last_full_unknown = 1; else sscanf(buf2, "%*[^:]: %i %*s", &last_full); @@ -470,17 +567,17 @@ _battery_linux_acpi_check(Battery_Face *ef) int rate = 1; int level = 0; - fgets(buf2, sizeof(buf2), f); buf[sizeof(buf2) - 1] = 0; + fgets(buf2, sizeof(buf2), f); buf2[sizeof(buf2) - 1] = 0; sscanf(buf2, "%*[^:]: %250s", present); - fgets(buf2, sizeof(buf2), f); buf[sizeof(buf2) - 1] = 0; + fgets(buf2, sizeof(buf2), f); buf2[sizeof(buf2) - 1] = 0; sscanf(buf2, "%*[^:]: %250s", capacity_state); - fgets(buf2, sizeof(buf2), f); buf[sizeof(buf2) - 1] = 0; + fgets(buf2, sizeof(buf2), f); buf2[sizeof(buf2) - 1] = 0; sscanf(buf2, "%*[^:]: %250s", charging_state); - fgets(buf2, sizeof(buf2), f); buf[sizeof(buf2) - 1] = 0; + fgets(buf2, sizeof(buf2), f); buf2[sizeof(buf2) - 1] = 0; sscanf(buf2, "%*[^:]: %250s %*s", buf); if (!strcmp(buf, "unknown")) rate_unknown = 1; else sscanf(buf2, "%*[^:]: %i %*s", &rate); - fgets(buf2, sizeof(buf2), f); buf[sizeof(buf2) - 1] = 0; + fgets(buf2, sizeof(buf2), f); buf2[sizeof(buf2) - 1] = 0; sscanf(buf2, "%*[^:]: %250s %*s", buf); if (!strcmp(buf, "unknown")) level_unknown = 1; else sscanf(buf2, "%*[^:]: %i %*s", &level); @@ -491,7 +588,6 @@ _battery_linux_acpi_check(Battery_Face *ef) bat_drain += rate; bat_level += level; } - bats = evas_list_remove_list(bats, bats); free(name); } diff --git a/src/modules/battery/e_mod_main.h b/src/modules/battery/e_mod_main.h index 8a4fce46d..b7690f5bf 100644 --- a/src/modules/battery/e_mod_main.h +++ b/src/modules/battery/e_mod_main.h @@ -13,6 +13,7 @@ struct _Config { int width; double x, y; + double poll_time; }; struct _Battery diff --git a/src/modules/ibar/e_mod_main.c b/src/modules/ibar/e_mod_main.c index 99b0ec54f..243e92a78 100644 --- a/src/modules/ibar/e_mod_main.c +++ b/src/modules/ibar/e_mod_main.c @@ -32,9 +32,11 @@ static void _ibar_config_menu_del(IBar *ib, E_Menu *m); static void _ibar_cb_width_fixed(void *data, E_Menu *m, E_Menu_Item *mi); static void _ibar_cb_width_auto(void *data, E_Menu *m, E_Menu_Item *mi); static void _ibar_cb_width_fill(void *data, E_Menu *m, E_Menu_Item *mi); +static void _ibar_bar_iconsize_change(IBar_Bar *ibb); static IBar_Icon *_ibar_bar_icon_find(IBar_Bar *ibb, E_App *a); static void _ibar_bar_icon_del(IBar_Icon *ic); static IBar_Icon *_ibar_bar_icon_new(IBar_Bar *ibb, E_App *a); +static void _ibar_bar_icon_resize(IBar_Icon *ic); static void _ibar_bar_icon_reorder_before(IBar_Icon *ic, IBar_Icon *before); static void _ibar_bar_icon_reorder_after(IBar_Icon *ic, IBar_Icon *after); static void _ibar_bar_frame_resize(IBar_Bar *ibb); @@ -360,6 +362,216 @@ _ibar_app_change(void *data, E_App *a, E_App_Change ch) } } +/* FIXME: none of these work runtime... only on restart */ +static void +_ibar_cb_iconsize_microscopic(void *data, E_Menu *m, E_Menu_Item *mi) +{ + IBar *ib; + Evas_List *l; + + ib = data; + ib->conf->iconsize = 8; + for (l = ib->bars; l; l = l->next) + { + IBar_Bar *ibb; + + ibb = l->data; + _ibar_bar_iconsize_change(ibb); + _ibar_bar_edge_change(ibb, ib->conf->edge); + } + e_config_save_queue(); +} + +static void +_ibar_cb_iconsize_tiny(void *data, E_Menu *m, E_Menu_Item *mi) +{ + IBar *ib; + Evas_List *l; + + ib = data; + ib->conf->iconsize = 12; + for (l = ib->bars; l; l = l->next) + { + IBar_Bar *ibb; + + ibb = l->data; + _ibar_bar_iconsize_change(ibb); + _ibar_bar_edge_change(ibb, ib->conf->edge); + } + e_config_save_queue(); +} + +static void +_ibar_cb_iconsize_very_small(void *data, E_Menu *m, E_Menu_Item *mi) +{ + IBar *ib; + Evas_List *l; + + ib = data; + ib->conf->iconsize = 16; + for (l = ib->bars; l; l = l->next) + { + IBar_Bar *ibb; + + ibb = l->data; + _ibar_bar_iconsize_change(ibb); + _ibar_bar_edge_change(ibb, ib->conf->edge); + } + e_config_save_queue(); +} + +static void +_ibar_cb_iconsize_small(void *data, E_Menu *m, E_Menu_Item *mi) +{ + IBar *ib; + Evas_List *l; + + ib = data; + ib->conf->iconsize = 24; + for (l = ib->bars; l; l = l->next) + { + IBar_Bar *ibb; + + ibb = l->data; + _ibar_bar_iconsize_change(ibb); + _ibar_bar_edge_change(ibb, ib->conf->edge); + } + e_config_save_queue(); +} + +static void +_ibar_cb_iconsize_medium(void *data, E_Menu *m, E_Menu_Item *mi) +{ + IBar *ib; + Evas_List *l; + + ib = data; + ib->conf->iconsize = 32; + for (l = ib->bars; l; l = l->next) + { + IBar_Bar *ibb; + + ibb = l->data; + _ibar_bar_iconsize_change(ibb); + _ibar_bar_edge_change(ibb, ib->conf->edge); + } + e_config_save_queue(); +} + +static void +_ibar_cb_iconsize_large(void *data, E_Menu *m, E_Menu_Item *mi) +{ + IBar *ib; + Evas_List *l; + + ib = data; + ib->conf->iconsize = 40; + for (l = ib->bars; l; l = l->next) + { + IBar_Bar *ibb; + + ibb = l->data; + _ibar_bar_iconsize_change(ibb); + _ibar_bar_edge_change(ibb, ib->conf->edge); + } + e_config_save_queue(); +} + +static void +_ibar_cb_iconsize_very_large(void *data, E_Menu *m, E_Menu_Item *mi) +{ + IBar *ib; + Evas_List *l; + + ib = data; + ib->conf->iconsize = 48; + for (l = ib->bars; l; l = l->next) + { + IBar_Bar *ibb; + + ibb = l->data; + _ibar_bar_iconsize_change(ibb); + _ibar_bar_edge_change(ibb, ib->conf->edge); + } + e_config_save_queue(); +} + +static void +_ibar_cb_iconsize_extremely_large(void *data, E_Menu *m, E_Menu_Item *mi) +{ + IBar *ib; + Evas_List *l; + + ib = data; + ib->conf->iconsize = 56; + for (l = ib->bars; l; l = l->next) + { + IBar_Bar *ibb; + + ibb = l->data; + _ibar_bar_iconsize_change(ibb); + _ibar_bar_edge_change(ibb, ib->conf->edge); + } + e_config_save_queue(); +} + +static void +_ibar_cb_iconsize_huge(void *data, E_Menu *m, E_Menu_Item *mi) +{ + IBar *ib; + Evas_List *l; + + ib = data; + ib->conf->iconsize = 64; + for (l = ib->bars; l; l = l->next) + { + IBar_Bar *ibb; + + ibb = l->data; + _ibar_bar_iconsize_change(ibb); + _ibar_bar_edge_change(ibb, ib->conf->edge); + } + e_config_save_queue(); +} + +static void +_ibar_cb_iconsize_enormous(void *data, E_Menu *m, E_Menu_Item *mi) +{ + IBar *ib; + Evas_List *l; + + ib = data; + ib->conf->iconsize = 96; + for (l = ib->bars; l; l = l->next) + { + IBar_Bar *ibb; + + ibb = l->data; + _ibar_bar_iconsize_change(ibb); + _ibar_bar_edge_change(ibb, ib->conf->edge); + } + e_config_save_queue(); +} + +static void +_ibar_cb_iconsize_gigantic(void *data, E_Menu *m, E_Menu_Item *mi) +{ + IBar *ib; + Evas_List *l; + + ib = data; + ib->conf->iconsize = 128; + for (l = ib->bars; l; l = l->next) + { + IBar_Bar *ibb; + + ibb = l->data; + _ibar_bar_iconsize_change(ibb); + _ibar_bar_edge_change(ibb, ib->conf->edge); + } + e_config_save_queue(); +} + static E_Menu * _ibar_config_menu_new(IBar *ib) { @@ -372,28 +584,105 @@ _ibar_config_menu_new(IBar *ib) mi = e_menu_item_new(mn); e_menu_item_label_set(mi, "Fixed width"); e_menu_item_radio_set(mi, 1); - e_menu_item_radio_group_set(mi, 2); + e_menu_item_radio_group_set(mi, 1); if (ib->conf->width > 0) e_menu_item_toggle_set(mi, 1); e_menu_item_callback_set(mi, _ibar_cb_width_fixed, ib); mi = e_menu_item_new(mn); e_menu_item_label_set(mi, "Auto fit icons"); e_menu_item_radio_set(mi, 1); - e_menu_item_radio_group_set(mi, 2); + e_menu_item_radio_group_set(mi, 1); if (ib->conf->width < 0) e_menu_item_toggle_set(mi, 1); e_menu_item_callback_set(mi, _ibar_cb_width_auto, ib); mi = e_menu_item_new(mn); e_menu_item_label_set(mi, "Fill edge"); e_menu_item_radio_set(mi, 1); - e_menu_item_radio_group_set(mi, 2); + e_menu_item_radio_group_set(mi, 1); if (ib->conf->width == 0) e_menu_item_toggle_set(mi, 1); e_menu_item_callback_set(mi, _ibar_cb_width_fill, ib); -/* mi = e_menu_item_new(mn); e_menu_item_separator_set(mi, 1); + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "Microscopic"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 2); + if (ib->conf->iconsize == 8) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _ibar_cb_iconsize_microscopic, ib); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "Tiny"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 2); + if (ib->conf->iconsize == 12) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _ibar_cb_iconsize_tiny, ib); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "Very Small"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 2); + if (ib->conf->iconsize == 16) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _ibar_cb_iconsize_very_small, ib); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "Small"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 2); + if (ib->conf->iconsize == 24) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _ibar_cb_iconsize_small, ib); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "Medium"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 2); + if (ib->conf->iconsize == 32) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _ibar_cb_iconsize_medium, ib); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "Large"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 2); + if (ib->conf->iconsize == 40) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _ibar_cb_iconsize_large, ib); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "Very Large"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 2); + if (ib->conf->iconsize == 48) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _ibar_cb_iconsize_very_large, ib); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "Exteremely Large"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 2); + if (ib->conf->iconsize == 56) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _ibar_cb_iconsize_extremely_large, ib); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "Huge"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 2); + if (ib->conf->iconsize == 64) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _ibar_cb_iconsize_huge, ib); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "Enormous"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 2); + if (ib->conf->iconsize == 96) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _ibar_cb_iconsize_enormous, ib); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "Gigantic"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 2); + if (ib->conf->iconsize == 128) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _ibar_cb_iconsize_gigantic, ib); + +/* mi = e_menu_item_new(mn); e_menu_item_label_set(mi, "Auto hide"); e_menu_item_check_set(mi, 1); @@ -484,6 +773,22 @@ _ibar_cb_width_fill(void *data, E_Menu *m, E_Menu_Item *mi) e_config_save_queue(); } +static void +_ibar_bar_iconsize_change(IBar_Bar *ibb) +{ + Evas_List *l; + + for (l = ibb->icons; l; l = l->next) + { + IBar_Icon *ic; + + ic = l->data; + _ibar_bar_icon_resize(ic); + } + _ibar_bar_convert_move_resize_to_config(ibb); + _ibar_bar_frame_resize(ibb); +} + static IBar_Icon * _ibar_bar_icon_find(IBar_Bar *ibb, E_App *a) { @@ -608,6 +913,28 @@ _ibar_bar_icon_new(IBar_Bar *ibb, E_App *a) return ic; } +static void +_ibar_bar_icon_resize(IBar_Icon *ic) +{ + Evas_Object *o; + Evas_Coord bw, bh; + + e_box_freeze(ic->ibb->box_object); + o = ic->icon_object; + edje_extern_object_min_size_set(o, ic->ibb->ibar->conf->iconsize, ic->ibb->ibar->conf->iconsize); + edje_object_part_swallow(ic->bg_object, "item", o); + edje_object_size_min_calc(ic->bg_object, &bw, &bh); + + e_box_pack_options_set(ic->bg_object, + 1, 1, /* fill */ + 0, 0, /* expand */ + 0.5, 0.5, /* align */ + bw, bh, /* min */ + bw, bh /* max */ + ); + e_box_thaw(ic->ibb->box_object); +} + static void _ibar_bar_icon_reorder_before(IBar_Icon *ic, IBar_Icon *before) { diff --git a/src/modules/temperature/Makefile.am b/src/modules/temperature/Makefile.am new file mode 100644 index 000000000..c05f9d558 --- /dev/null +++ b/src/modules/temperature/Makefile.am @@ -0,0 +1,26 @@ +MAINTAINERCLEANFILES = Makefile.in +MODULE = temperature + +# data files for the module +filesdir = $(libdir)/enlightenment/modules/$(MODULE) +files_DATA = \ +module_icon.png + +EXTRA_DIST = $(files_DATA) + +# the module .so file +INCLUDES = -I. \ + -I$(top_srcdir) \ + -I$(includedir) \ + -I$(top_srcdir)$(MODULE) \ + -I$(top_srcdir)/src/bin \ + -I$(top_srcdir)/src/lib \ + -I$(top_srcdir)/src/modules \ + @e_cflags@ +pkgdir = $(libdir)/enlightenment/modules/$(MODULE) +pkg_LTLIBRARIES = module.la +module_la_SOURCES = e_mod_main.c \ + e_mod_main.h +module_la_LIBADD = @e_libs@ @dlopen_libs@ +module_la_LDFLAGS = -module -avoid-version +module_la_DEPENDENCIES = $(top_builddir)/config.h diff --git a/src/modules/temperature/e_mod_main.c b/src/modules/temperature/e_mod_main.c new file mode 100644 index 000000000..1f423d77b --- /dev/null +++ b/src/modules/temperature/e_mod_main.c @@ -0,0 +1,794 @@ +#include "e.h" +#include "e_mod_main.h" + +/* TODO List: + * + * should support proepr resize and move handles in the edje. + * + */ + +/* module private routines */ +static Temperature *_temperature_init(E_Module *m); +static void _temperature_shutdown(Temperature *e); +static E_Menu *_temperature_config_menu_new(Temperature *e); +static void _temperature_config_menu_del(Temperature *e, E_Menu *m); +static void _temperature_face_init(Temperature_Face *ef); +static void _temperature_face_free(Temperature_Face *ef); +static void _temperature_face_reconfigure(Temperature_Face *ef); +static void _temperature_cb_face_down(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _temperature_cb_face_up(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _temperature_cb_face_move(void *data, Evas *e, Evas_Object *obj, void *event_info); +static int _temperature_cb_event_container_resize(void *data, int type, void *event); +static int _temperature_cb_check(void *data); +static void _temperature_level_set(Temperature_Face *ef, double level); + +/* public module routines. all modules must have these */ +void * +init(E_Module *m) +{ + Temperature *e; + + /* check module api version */ + if (m->api->version < E_MODULE_API_VERSION) + { + e_error_dialog_show("Module API Error", + "Error initializing Module: Temperature\n" + "It requires a minimum module API version of: %i.\n" + "The module API advertized by Enlightenment is: %i.\n" + "Aborting module.", + E_MODULE_API_VERSION, + m->api->version); + return NULL; + } + /* actually init temperature */ + e = _temperature_init(m); + m->config_menu = _temperature_config_menu_new(e); + return e; +} + +int +shutdown(E_Module *m) +{ + Temperature *e; + + e = m->data; + if (e) + { + if (m->config_menu) + { + _temperature_config_menu_del(e, e->config_menu1); + _temperature_config_menu_del(e, e->config_menu2); + _temperature_config_menu_del(e, e->config_menu3); + _temperature_config_menu_del(e, m->config_menu); + m->config_menu = NULL; + } + _temperature_shutdown(e); + } + return 1; +} + +int +save(E_Module *m) +{ + Temperature *e; + + e = m->data; + e_config_domain_save("module.temperature", e->conf_edd, e->conf); + return 1; +} + +int +info(E_Module *m) +{ + char buf[4096]; + + m->label = strdup("Temperature"); + snprintf(buf, sizeof(buf), "%s/module_icon.png", e_module_dir_get(m)); + m->icon_file = strdup(buf); + return 1; +} + +int +about(E_Module *m) +{ + e_error_dialog_show("Enlightenment Temperature Module", + "A module to measure the ACPI Thermal sensor on Linux.\n" + "It is especially useful for modern Laptops with high speed\n" + "CPUs that generate a lot of heat."); + return 1; +} + +/* module private routines */ +static Temperature * +_temperature_init(E_Module *m) +{ + Temperature *e; + Evas_List *managers, *l, *l2; + + e = calloc(1, sizeof(Temperature)); + if (!e) return NULL; + + e->conf_edd = E_CONFIG_DD_NEW("Temperature_Config", Config); +#undef T +#undef D +#define T Config +#define D e->conf_edd + E_CONFIG_VAL(D, T, width, INT); + E_CONFIG_VAL(D, T, x, DOUBLE); + E_CONFIG_VAL(D, T, y, DOUBLE); + E_CONFIG_VAL(D, T, poll_time, DOUBLE); + E_CONFIG_VAL(D, T, low, INT); + E_CONFIG_VAL(D, T, high, INT); + + e->conf = e_config_domain_load("module.temperature", e->conf_edd); + if (!e->conf) + { + e->conf = E_NEW(Config, 1); + e->conf->width = 64; + e->conf->x = 0.9; + e->conf->y = 1.0; + e->conf->poll_time = 10.0; + e->conf->low = 30; + e->conf->high = 80; + } + E_CONFIG_LIMIT(e->conf->width, 2, 256); + E_CONFIG_LIMIT(e->conf->x, 0.0, 1.0); + E_CONFIG_LIMIT(e->conf->y, 0.0, 1.0); + E_CONFIG_LIMIT(e->conf->poll_time, 0.5, 1000.0); + E_CONFIG_LIMIT(e->conf->low, 0, 100); + E_CONFIG_LIMIT(e->conf->high, 0, 200); + + managers = e_manager_list(); + for (l = managers; l; l = l->next) + { + E_Manager *man; + + man = l->data; + for (l2 = man->containers; l2; l2 = l2->next) + { + E_Container *con; + Temperature_Face *ef; + + con = l2->data; + ef = calloc(1, sizeof(Temperature_Face)); + if (ef) + { + ef->temp = e; + ef->con = con; + ef->evas = con->bg_evas; + _temperature_face_init(ef); + e->face = ef; + } + } + } + return e; +} + +static void +_temperature_shutdown(Temperature *e) +{ + free(e->conf); + E_CONFIG_DD_FREE(e->conf_edd); + + _temperature_face_free(e->face); + free(e); +} + +static void +_temperature_menu_fast(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Temperature *e; + + e = data; + e->conf->poll_time = 1.0; + ecore_timer_del(e->face->temperature_check_timer); + e->face->temperature_check_timer = ecore_timer_add(e->face->temp->conf->poll_time, _temperature_cb_check, e->face); + e_config_save_queue(); +} + +static void +_temperature_menu_medium(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Temperature *e; + + e = data; + e->conf->poll_time = 5.0; + ecore_timer_del(e->face->temperature_check_timer); + e->face->temperature_check_timer = ecore_timer_add(e->face->temp->conf->poll_time, _temperature_cb_check, e->face); + e_config_save_queue(); +} + +static void +_temperature_menu_normal(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Temperature *e; + + e = data; + e->conf->poll_time = 10.0; + ecore_timer_del(e->face->temperature_check_timer); + e->face->temperature_check_timer = ecore_timer_add(e->face->temp->conf->poll_time, _temperature_cb_check, e->face); + e_config_save_queue(); +} + +static void +_temperature_menu_slow(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Temperature *e; + + e = data; + e->conf->poll_time = 30.0; + ecore_timer_del(e->face->temperature_check_timer); + e->face->temperature_check_timer = ecore_timer_add(e->face->temp->conf->poll_time, _temperature_cb_check, e->face); + e_config_save_queue(); +} + +static void +_temperature_menu_very_slow(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Temperature *e; + + e = data; + e->conf->poll_time = 60.0; + ecore_timer_del(e->face->temperature_check_timer); + e->face->temperature_check_timer = ecore_timer_add(e->face->temp->conf->poll_time, _temperature_cb_check, e->face); + e_config_save_queue(); +} + +static void +_temperature_menu_low_10(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Temperature *e; + + e = data; + e->conf->low = 10; + _temperature_cb_check(e->face); + e_config_save_queue(); +} + +static void +_temperature_menu_low_20(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Temperature *e; + + e = data; + e->conf->low = 20; + _temperature_cb_check(e->face); + e_config_save_queue(); +} + +static void +_temperature_menu_low_30(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Temperature *e; + + e = data; + e->conf->low = 30; + _temperature_cb_check(e->face); + e_config_save_queue(); +} + +static void +_temperature_menu_low_40(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Temperature *e; + + e = data; + e->conf->low = 40; + _temperature_cb_check(e->face); + e_config_save_queue(); +} + +static void +_temperature_menu_low_50(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Temperature *e; + + e = data; + e->conf->low = 50; + _temperature_cb_check(e->face); + e_config_save_queue(); +} + +static void +_temperature_menu_high_20(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Temperature *e; + + e = data; + e->conf->high = 20; + _temperature_cb_check(e->face); + e_config_save_queue(); +} + +static void +_temperature_menu_high_30(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Temperature *e; + + e = data; + e->conf->high = 30; + _temperature_cb_check(e->face); + e_config_save_queue(); +} + +static void +_temperature_menu_high_40(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Temperature *e; + + e = data; + e->conf->high = 40; + _temperature_cb_check(e->face); + e_config_save_queue(); +} + +static void +_temperature_menu_high_50(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Temperature *e; + + e = data; + e->conf->high = 50; + _temperature_cb_check(e->face); + e_config_save_queue(); +} + +static void +_temperature_menu_high_60(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Temperature *e; + + e = data; + e->conf->high = 60; + _temperature_cb_check(e->face); + e_config_save_queue(); +} + +static void +_temperature_menu_high_70(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Temperature *e; + + e = data; + e->conf->high = 70; + _temperature_cb_check(e->face); + e_config_save_queue(); +} + +static void +_temperature_menu_high_80(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Temperature *e; + + e = data; + e->conf->high = 80; + _temperature_cb_check(e->face); + e_config_save_queue(); +} + +static void +_temperature_menu_high_90(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Temperature *e; + + e = data; + e->conf->high = 90; + _temperature_cb_check(e->face); + e_config_save_queue(); +} + +static void +_temperature_menu_high_100(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Temperature *e; + + e = data; + e->conf->high = 100; + _temperature_cb_check(e->face); + e_config_save_queue(); +} + +static E_Menu * +_temperature_config_menu_new(Temperature *e) +{ + E_Menu *mn; + E_Menu_Item *mi; + + mn = e_menu_new(); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "Fast (1 sec)"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (e->conf->poll_time == 1.0) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _temperature_menu_fast, e); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "Medium (5 sec)"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (e->conf->poll_time == 5.0) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _temperature_menu_medium, e); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "Normal (10 sec)"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (e->conf->poll_time == 10.0) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _temperature_menu_normal, e); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "Slow (30 sec)"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (e->conf->poll_time == 30.0) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _temperature_menu_slow, e); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "Very Slow (60 sec)"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (e->conf->poll_time == 60.0) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _temperature_menu_very_slow, e); + + e->config_menu1 = mn; + + mn = e_menu_new(); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "10°C"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (e->conf->low == 10) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _temperature_menu_low_10, e); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "20°C"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (e->conf->low == 20) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _temperature_menu_low_20, e); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "30°C"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (e->conf->low == 30) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _temperature_menu_low_30, e); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "40°C"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (e->conf->low == 40) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _temperature_menu_low_40, e); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "50°C"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (e->conf->low == 50) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _temperature_menu_low_50, e); + + e->config_menu2 = mn; + + mn = e_menu_new(); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "20°C"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (e->conf->high == 20) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _temperature_menu_high_20, e); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "30°C"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (e->conf->high == 30) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _temperature_menu_high_30, e); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "40°C"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (e->conf->high == 40) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _temperature_menu_high_40, e); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "50°C"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (e->conf->high == 50) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _temperature_menu_high_50, e); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "60°C"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (e->conf->high == 60) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _temperature_menu_high_60, e); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "70°C"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (e->conf->high == 70) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _temperature_menu_high_70, e); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "80°C"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (e->conf->high == 80) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _temperature_menu_high_80, e); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "90°C"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (e->conf->high == 90) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _temperature_menu_high_90, e); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "100°C"); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (e->conf->high == 100) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _temperature_menu_high_100, e); + + e->config_menu3 = mn; + + mn = e_menu_new(); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "Check Interval"); + e_menu_item_submenu_set(mi, e->config_menu1); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "Low Temperature"); + e_menu_item_submenu_set(mi, e->config_menu2); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, "High Temperature"); + e_menu_item_submenu_set(mi, e->config_menu3); + + e->config_menu = mn; + + return mn; +} + +static void +_temperature_config_menu_del(Temperature *e, E_Menu *m) +{ + e_object_del(E_OBJECT(m)); +} + +static void +_temperature_face_init(Temperature_Face *ef) +{ + Evas_Coord ww, hh, bw, bh; + Evas_Object *o; + + ef->ev_handler_container_resize = + ecore_event_handler_add(E_EVENT_CONTAINER_RESIZE, + _temperature_cb_event_container_resize, + ef); + evas_output_viewport_get(ef->evas, NULL, NULL, &ww, &hh); + ef->fx = ef->temp->conf->x * (ww - ef->temp->conf->width); + ef->fy = ef->temp->conf->y * (hh - ef->temp->conf->width); + + evas_event_freeze(ef->evas); + o = edje_object_add(ef->evas); + ef->temp_object = o; + + edje_object_file_set(o, + /* FIXME: "default.eet" needs to come from conf */ + e_path_find(path_themes, "default.eet"), + "modules/temperature/main"); + evas_object_show(o); + + o = evas_object_rectangle_add(ef->evas); + ef->event_object = o; + evas_object_layer_set(o, 2); + evas_object_repeat_events_set(o, 1); + evas_object_color_set(o, 0, 0, 0, 0); + + evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _temperature_cb_face_down, ef); + evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_UP, _temperature_cb_face_up, ef); + evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_MOVE, _temperature_cb_face_move, ef); + evas_object_show(o); + + edje_object_size_min_calc(ef->temp_object, &bw, &bh); + ef->minsize = bh; + ef->minsize = bw; + + _temperature_face_reconfigure(ef); + + ef->temperature_check_timer = ecore_timer_add(ef->temp->conf->poll_time, _temperature_cb_check, ef); + + _temperature_cb_check(ef); + + evas_event_thaw(ef->evas); +} + +static void +_temperature_face_free(Temperature_Face *ef) +{ + ecore_timer_del(ef->temperature_check_timer); + ecore_event_handler_del(ef->ev_handler_container_resize); + evas_object_del(ef->temp_object); + evas_object_del(ef->event_object); + free(ef); +} + +static void +_temperature_face_reconfigure(Temperature_Face *ef) +{ + Evas_Coord minw, minh, maxw, maxh, ww, hh; + + edje_object_size_min_calc(ef->temp_object, &minw, &maxh); + edje_object_size_max_get(ef->temp_object, &maxw, &minh); + evas_output_viewport_get(ef->evas, NULL, NULL, &ww, &hh); + ef->fx = ef->temp->conf->x * (ww - ef->temp->conf->width); + ef->fy = ef->temp->conf->y * (hh - ef->temp->conf->width); + ef->fw = ef->temp->conf->width; + ef->minsize = minw; + ef->maxsize = maxw; + + evas_object_move(ef->temp_object, ef->fx, ef->fy); + evas_object_resize(ef->temp_object, ef->temp->conf->width, ef->temp->conf->width); + evas_object_move(ef->event_object, ef->fx, ef->fy); + evas_object_resize(ef->event_object, ef->temp->conf->width, ef->temp->conf->width); +} + +static void +_temperature_cb_face_down(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Down *ev; + Temperature_Face *ef; + + ev = event_info; + ef = data; + if (ev->button == 3) + { + e_menu_activate_mouse(ef->temp->config_menu, ef->con, + ev->output.x, ev->output.y, 1, 1, + E_MENU_POP_DIRECTION_DOWN); + e_util_container_fake_mouse_up_all_later(ef->con); + } + else if (ev->button == 2) + { + ef->resize = 1; + } + else if (ev->button == 1) + { + ef->move = 1; + } + evas_pointer_canvas_xy_get(e, &ef->xx, &ef->yy); +} + +static void +_temperature_cb_face_up(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Up *ev; + Temperature_Face *ef; + Evas_Coord ww, hh; + + ev = event_info; + ef = data; + ef->move = 0; + ef->resize = 0; + evas_output_viewport_get(ef->evas, NULL, NULL, &ww, &hh); + ef->temp->conf->width = ef->fw; + ef->temp->conf->x = (double)ef->fx / (double)(ww - ef->temp->conf->width); + ef->temp->conf->y = (double)ef->fy / (double)(hh - ef->temp->conf->width); + e_config_save_queue(); +} + +static void +_temperature_cb_face_move(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Move *ev; + Temperature_Face *ef; + Evas_Coord cx, cy, sw, sh; + + evas_pointer_canvas_xy_get(e, &cx, &cy); + evas_output_viewport_get(e, NULL, NULL, &sw, &sh); + + ev = event_info; + ef = data; + if (ef->move) + { + ef->fx += cx - ef->xx; + ef->fy += cy - ef->yy; + if (ef->fx < 0) ef->fx = 0; + if (ef->fy < 0) ef->fy = 0; + if (ef->fx + ef->fw > sw) ef->fx = sw - ef->fw; + if (ef->fy + ef->fw > sh) ef->fy = sh - ef->fw; + evas_object_move(ef->temp_object, ef->fx, ef->fy); + evas_object_move(ef->event_object, ef->fx, ef->fy); + } + else if (ef->resize) + { + Evas_Coord d; + + d = cx - ef->xx; + ef->fw += d; + if (ef->fw < ef->minsize) ef->fw = ef->minsize; + if (ef->fw > ef->maxsize) ef->fw = ef->maxsize; + if (ef->fx + ef->fw > sw) ef->fw = sw - ef->fx; + if (ef->fy + ef->fw > sh) ef->fw = sh - ef->fy; + evas_object_resize(ef->temp_object, ef->fw, ef->fw); + evas_object_resize(ef->event_object, ef->fw, ef->fw); + } + ef->xx = ev->cur.canvas.x; + ef->yy = ev->cur.canvas.y; +} + +static int +_temperature_cb_event_container_resize(void *data, int type, void *event) +{ + Temperature_Face *ef; + + ef = data; + _temperature_face_reconfigure(ef); + return 1; +} + +static int +_temperature_cb_check(void *data) +{ + Temperature_Face *ef; + int ret = 0; + Evas_List *therms; + + ef = data; + therms = e_file_ls("/proc/acpi/thermal_zone"); + if (!therms) + { + /* disable therm object */ + } + else + { + while (therms) + { + char buf[4096], units[32]; + char *name; + FILE *f; + int temp = 0; + + name = therms->data; + therms = evas_list_remove_list(therms, therms); + snprintf(buf, sizeof(buf), "/proc/acpi/thermal_zone/%s/temperature", name); + f = fopen(buf, "rb"); + if (f) + { + fgets(buf, sizeof(buf), f); buf[sizeof(buf) - 1] = 0; + units[0] = 0; + if (sscanf(buf, "%*[^:]: %i %20s", &temp, units) == 2) + { + /* temp == temperature as a double */ + /* units = string ("C" == celcius, "F" = farenheight) */ + _temperature_level_set(ef, ((double)temp - ef->temp->conf->low) / ef->temp->conf->high); + snprintf(buf, sizeof(buf), "%i°C", temp, units); + edje_object_part_text_set(ef->temp_object, "reading", buf); + } + fclose(f); + } + free(name); + } + } + return 1; +} + +static void +_temperature_level_set(Temperature_Face *ef, double level) +{ + Edje_Message_Float msg; + + if (level < 0.0) level = 0.0; + else if (level > 1.0) level = 1.0; + msg.val = level; + edje_object_message_send(ef->temp_object, EDJE_MESSAGE_FLOAT, 1, &msg); +} diff --git a/src/modules/temperature/e_mod_main.h b/src/modules/temperature/e_mod_main.h new file mode 100644 index 000000000..0df1c4c0c --- /dev/null +++ b/src/modules/temperature/e_mod_main.h @@ -0,0 +1,55 @@ +#ifndef E_MOD_MAIN_H +#define E_MOD_MAIN_H + +typedef struct _Config Config; +typedef struct _Temperature Temperature; +typedef struct _Temperature_Face Temperature_Face; + +struct _Config +{ + int width; + double x, y; + double poll_time; + int low, high; +}; + +struct _Temperature +{ + E_Menu *config_menu; + E_Menu *config_menu1; + E_Menu *config_menu2; + E_Menu *config_menu3; + Temperature_Face *face; + + E_Config_DD *conf_edd; + Config *conf; +}; + +struct _Temperature_Face +{ + Temperature *temp; + E_Container *con; + Evas *evas; + + Evas_Object *temp_object; + Evas_Object *event_object; + + Evas_Coord minsize, maxsize; + + unsigned char move : 1; + unsigned char resize : 1; + Evas_Coord xx, yy; + Evas_Coord fx, fy, fw; + + Ecore_Timer *temperature_check_timer; + + Ecore_Event_Handler *ev_handler_container_resize; +}; + +EAPI void *init (E_Module *m); +EAPI int shutdown (E_Module *m); +EAPI int save (E_Module *m); +EAPI int info (E_Module *m); +EAPI int about (E_Module *m); + +#endif diff --git a/src/modules/temperature/module_icon.png b/src/modules/temperature/module_icon.png new file mode 100644 index 000000000..063caf2ab Binary files /dev/null and b/src/modules/temperature/module_icon.png differ