From 26a35cdf01536d980c63bc751789e1cf081d0454 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Sun, 12 Jun 2011 15:05:22 +0000 Subject: [PATCH] backlight config tab, module, slider and core in. somehow doesnt work with hal atm even tho i think i sent the right dbus req. hmmm. get response.. of 0 for getting bl. for xrandr it works. SVN revision: 60242 --- configure.ac | 3 + data/themes/default.edc | 22 +- data/themes/images/Makefile.am | 3 +- data/themes/images/bulb.png | Bin 0 -> 3252 bytes src/bin/Makefile.am | 2 + src/bin/e_actions.c | 68 +++- src/bin/e_backlight.c | 373 +++++++++++++++++++ src/bin/e_backlight.h | 36 ++ src/bin/e_config.c | 4 + src/bin/e_config.h | 6 + src/bin/e_includes.h | 1 + src/bin/e_main.c | 10 + src/bin/e_widget_slider.c | 1 + src/modules/Makefile.am | 3 + src/modules/backlight/.cvsignore | 7 + src/modules/backlight/Makefile.am | 28 ++ src/modules/backlight/e-module-backlight.edj | Bin 0 -> 8910 bytes src/modules/backlight/e_mod_main.c | 283 ++++++++++++++ src/modules/backlight/e_mod_main.h | 10 + src/modules/backlight/module.desktop.in | 6 + src/modules/conf_display/e_int_config_dpms.c | 69 +++- 21 files changed, 910 insertions(+), 25 deletions(-) create mode 100644 data/themes/images/bulb.png create mode 100644 src/bin/e_backlight.c create mode 100644 src/bin/e_backlight.h create mode 100644 src/modules/backlight/.cvsignore create mode 100644 src/modules/backlight/Makefile.am create mode 100644 src/modules/backlight/e-module-backlight.edj create mode 100644 src/modules/backlight/e_mod_main.c create mode 100644 src/modules/backlight/e_mod_main.h create mode 100644 src/modules/backlight/module.desktop.in diff --git a/configure.ac b/configure.ac index 4f9f0c10f..95e97b2bc 100644 --- a/configure.ac +++ b/configure.ac @@ -711,6 +711,7 @@ AC_E_OPTIONAL_MODULE([everything], true) AC_E_OPTIONAL_MODULE([systray], true) AC_E_OPTIONAL_MODULE([comp], true) AC_E_OPTIONAL_MODULE([shot], true) +AC_E_OPTIONAL_MODULE([backlight], true) SUSPEND="" HIBERNATE="" @@ -856,6 +857,8 @@ src/modules/comp/Makefile src/modules/comp/module.desktop src/modules/shot/Makefile src/modules/shot/module.desktop +src/modules/backlight/Makefile +src/modules/backlight/module.desktop src/preload/Makefile data/Makefile data/images/Makefile diff --git a/data/themes/default.edc b/data/themes/default.edc index 0f0609e46..35a8e638f 100644 --- a/data/themes/default.edc +++ b/data/themes/default.edc @@ -11882,10 +11882,30 @@ collections { } +///////////////////////////////////////////////////////////////////////////// +/*** MOD: BACKLIGHT ***/ + group { name: "e/modules/backlight/main"; + images { + image: "bulb.png" COMP; + } + min: 16 16; + max: 128 128; + parts { + part { + name: "base"; + description { + state: "default" 0.0; + aspect: 1.0 1.0; + aspect_preference: BOTH; + image.normal: "bulb.png"; + } + } + } + } + ///////////////////////////////////////////////////////////////////////////// #define CLOCK_SECONDS 1 /*** MOD: CLOCK ***/ - group { name: "e/modules/clock/digital"; min: 56 16; max: 512 128; diff --git a/data/themes/images/Makefile.am b/data/themes/images/Makefile.am index 2e55c21bb..b9b20cefd 100644 --- a/data/themes/images/Makefile.am +++ b/data/themes/images/Makefile.am @@ -453,4 +453,5 @@ flip_pmb.png \ flip_pmt.png \ flip_shad.png \ flip_t.png \ -flip_colon.png +flip_colon.png \ +bulb.png diff --git a/data/themes/images/bulb.png b/data/themes/images/bulb.png new file mode 100644 index 0000000000000000000000000000000000000000..105a7431f4c5dbe380562bfd8b60dcd16403e152 GIT binary patch literal 3252 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

q}(5V)6|EciMnEE&m5ZXD>r%!iQG?0000jv4 literal 0 HcmV?d00001 diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am index 872792bfb..21cadf276 100644 --- a/src/bin/Makefile.am +++ b/src/bin/Makefile.am @@ -37,6 +37,7 @@ e_acpi.h \ e_actions.h \ e_alert.h \ e_atoms.h \ +e_backlight.h \ e_bg.h \ e_bindings.h \ e_border.h \ @@ -184,6 +185,7 @@ e_acpi.c \ e_actions.c \ e_alert.c \ e_atoms.c \ +e_backlight.c \ e_bg.c \ e_bindings.c \ e_border.c \ diff --git a/src/bin/e_actions.c b/src/bin/e_actions.c index 1a5eced35..4759c5299 100644 --- a/src/bin/e_actions.c +++ b/src/bin/e_actions.c @@ -1237,14 +1237,13 @@ _e_actions_zone_get(E_Object *obj) { if (obj) { - if (obj->type == E_MANAGER_TYPE) - return e_util_zone_current_get((E_Manager *)obj); - else if (obj->type == E_CONTAINER_TYPE) - return e_util_zone_current_get(((E_Container *)obj)->manager); - else if (obj->type == E_ZONE_TYPE) - return e_util_zone_current_get(((E_Zone *)obj)->container->manager); - else - return e_util_zone_current_get(e_manager_current_get()); + if (obj->type == (int)E_MANAGER_TYPE) return e_util_zone_current_get((E_Manager *)obj); + else if (obj->type == (int)E_CONTAINER_TYPE) return e_util_zone_current_get(((E_Container *)obj)->manager); + else if (obj->type == (int)E_ZONE_TYPE) return (E_Zone *)obj; + else if (obj->type == (int)E_BORDER_TYPE) return ((E_Border *)obj)->zone; + else if (obj->type == (int)E_SHELF_TYPE) return ((E_Shelf *)obj)->zone; + else if (obj->type == (int)E_POPUP_TYPE) return ((E_Popup *)obj)->zone; + else if (obj->type == (int)E_WIN_TYPE) return ((E_Win *)obj)->border->zone; } return e_util_zone_current_get(e_manager_current_get()); } @@ -2635,12 +2634,30 @@ ACT_FN_END_MOUSE(delayed_action, ) ACT_FN_GO_ACPI(dim_screen, __UNUSED__) { - printf("Dim Screen\n"); + E_Zone *zone = _e_actions_zone_get(obj); + e_backlight_mode_set(zone, E_BACKLIGHT_MODE_DIM); } ACT_FN_GO_ACPI(undim_screen, __UNUSED__) { - printf("Undim Screen\n"); + E_Zone *zone = _e_actions_zone_get(obj); + e_backlight_mode_set(zone, E_BACKLIGHT_MODE_NORMAL); +} + +ACT_FN_GO_ACPI(backlight_set, ) +{ + E_Zone *zone = _e_actions_zone_get(obj); + double v = atof(params); + e_backlight_mode_set(zone, E_BACKLIGHT_MODE_NORMAL); + e_backlight_level_set(zone, v, -1.0); +} + +ACT_FN_GO_ACPI(backlight_adjust, ) +{ + E_Zone *zone = _e_actions_zone_get(obj); + double v = atof(params); + e_backlight_mode_set(zone, E_BACKLIGHT_MODE_NORMAL); + e_backlight_level_set(zone, e_backlight_level_get(zone) + v, -1.0); } /* local subsystem globals */ @@ -2933,6 +2950,29 @@ e_actions_init(void) "screen_send_by", NULL, "syntax: N-offset, example: -2", 1); + ACT_GO_ACPI(dim_screen); + e_action_predef_name_set(N_("Screen"), N_("Dim"), "dim_screen", + NULL, NULL, 0); + ACT_GO_ACPI(undim_screen); + e_action_predef_name_set(N_("Screen"), N_("Undim"), "undim_screen", + NULL, NULL, 0); + ACT_GO_ACPI(backlight_set); + e_action_predef_name_set(N_("Screen"), N_("Backlight Set"), "backlight_set", + NULL, "syntax: brightness(0.0 - 1.0), example: 0.5", 1); + e_action_predef_name_set(N_("Screen"), N_("Backlight Min"), "backlight_set", + "0.0", NULL, 0); + e_action_predef_name_set(N_("Screen"), N_("Backlight Mid"), "backlight_set", + "0.5", NULL, 0); + e_action_predef_name_set(N_("Screen"), N_("Backlight Max"), "backlight_set", + "1.0", NULL, 0); + ACT_GO_ACPI(backlight_adjust); + e_action_predef_name_set(N_("Screen"), N_("Backlight Adjust"), "backlight_adjust", + NULL, "syntax: brightness(-1.0 - 1.0), example: -0.2", 1); + e_action_predef_name_set(N_("Screen"), N_("Backlight Up"), "backlight_adjust", + "0.1", NULL, 0); + e_action_predef_name_set(N_("Screen"), N_("Backlight Down"), "backlight_adjust", + "-0.1", NULL, 0); + /* window_move_to_center */ ACT_GO(window_move_to_center); e_action_predef_name_set(N_("Window : Actions"), N_("Move To Center"), @@ -3077,14 +3117,6 @@ e_actions_init(void) ACT_END_KEY(delayed_action); ACT_END_MOUSE(delayed_action); - ACT_GO_ACPI(dim_screen); - e_action_predef_name_set(N_("Acpi"), N_("Dim Screen"), "dim_screen", - NULL, NULL, 0); - - ACT_GO_ACPI(undim_screen); - e_action_predef_name_set(N_("Acpi"), N_("Undim Screen"), "undim_screen", - NULL, NULL, 0); - return 1; } diff --git a/src/bin/e_backlight.c b/src/bin/e_backlight.c new file mode 100644 index 000000000..fb6ae3141 --- /dev/null +++ b/src/bin/e_backlight.c @@ -0,0 +1,373 @@ +#include "e.h" +#include +#include + +// FIXME: backlight should be tied per zone but this implementation is just +// a signleton right now as thats 99% of use cases. but api supports +// doing more. for now make it work in the singleton + +// FIXME: backlight should have config values for: +// 1. normal mode (eg on login/ start of e) +// 2. dim level (eg 0.5) +// 3. anim slide time (eg 0.5) + +// FIXME: tried using hal backlight stuff... doesn't work +//#define HAL_BL 1 + +#define MODE_RANDR 0 +#define MODE_HAL 1 + +static double bl_val = 1.0; +static double bl_animval = 1.0; +static E_Backlight_Mode bl_mode = E_BACKLIGHT_MODE_NORMAL; +static int sysmode = MODE_RANDR; +static Ecore_Animator *bl_anim = NULL; + +#ifdef HAL_BL +static E_DBus_Connection *_hal_conn = NULL; +static const char *_hal_bl_dev = NULL; +static const char *_hal_bl_iface = NULL; +static int _hal_nlevels = 1; +#endif + +static void _e_backlight_update(E_Zone *zone); +static void _e_backlight_set(E_Zone *zone, double val); +static Eina_Bool _bl_anim(void *data, double pos); + +EINTERN int +e_backlight_init(void) +{ + e_backlight_update(); + e_backlight_level_set(NULL, 0.0, 0.0); + e_backlight_level_set(NULL, e_config->backlight.normal, 1.0); + return 1; +} + +EINTERN int +e_backlight_shutdown(void) +{ +#ifdef HAL_BL + if (_hal_conn) + { + e_dbus_connection_close(_hal_conn); + _hal_conn = NULL; + e_hal_shutdown(); + e_dbus_shutdown(); + if (_hal_bl_dev) + { + eina_stringshare_del(_hal_bl_dev); + _hal_bl_dev = NULL; + } + if (_hal_bl_iface) + { + eina_stringshare_del(_hal_bl_iface); + _hal_bl_iface = NULL; + } + } +#endif + if (bl_anim) ecore_animator_del(bl_anim); + bl_anim = NULL; + return 1; +} + +EAPI void +e_backlight_update(void) +{ + Eina_List *m, *c, *z; + E_Manager *man; + E_Container *con; + E_Zone *zone; + + EINA_LIST_FOREACH(e_manager_list(), m, man) + { + EINA_LIST_FOREACH(man->containers, c, con) + { + EINA_LIST_FOREACH(con->zones, z, zone) + { + _e_backlight_update(zone); + } + } + } +} + +EAPI void +e_backlight_level_set(E_Zone *zone, double val, double tim) +{ + double bl_now; + // zone == NULL == everything + // set backlight associated with zone to val over period of tim + // if tim == 0.0 - then do it instantnly, if time == -1 use some default + // transition time + if (!zone) e_backlight_update(); + else _e_backlight_update(zone); + if (val == bl_val) return; + if (!zone) zone = e_util_zone_current_get(e_manager_current_get()); + bl_now = bl_val; + bl_val = val; + if (bl_mode != E_BACKLIGHT_MODE_NORMAL) return; + if (tim < 0.0) tim = e_config->backlight.transition; + // FIXME: save bl level for normal + if (tim == 0.0) + { + if (bl_anim) + { + ecore_animator_del(bl_anim); + bl_anim = NULL; + } + _e_backlight_set(zone, val); + return; + } + if (bl_anim) ecore_animator_del(bl_anim); + bl_anim = ecore_animator_timeline_add(tim, _bl_anim, zone); + bl_animval = bl_now; +} + +EAPI double +e_backlight_level_get(E_Zone *zone) +{ + // zone == NULL == everything + if (!zone) e_backlight_update(); + else _e_backlight_update(zone); + return bl_val; +} + +EAPI void +e_backlight_mode_set(E_Zone *zone, E_Backlight_Mode mode) +{ + // zone == NULL == everything + if (bl_mode == mode) return; + bl_mode = mode; + if (bl_mode == E_BACKLIGHT_MODE_NORMAL) + e_backlight_level_set(zone, bl_val, -1.0); + else if (bl_mode == E_BACKLIGHT_MODE_OFF) + e_backlight_level_set(zone, 0.0, -1.0); + else if (bl_mode == E_BACKLIGHT_MODE_DIM) + e_backlight_level_set(zone, 0.0, -1.0); + else if (bl_mode == E_BACKLIGHT_MODE_DIM) + e_backlight_level_set(zone, e_config->backlight.dim, -1.0); + else if (bl_mode == E_BACKLIGHT_MODE_MAX) + e_backlight_level_set(zone, 1.0, -1.0); +} + +EAPI E_Backlight_Mode +e_backlight_mode_get(E_Zone *zone __UNUSED__) +{ + // zone == NULL == everything + return bl_mode; +} + +/* local subsystem functions */ +#ifdef HAL_BL +void +_e_backlight_hal_val_reply(void *data __UNUSED__, + DBusMessage *reply, + DBusError *error) +{ + dbus_uint32_t val; + + if (dbus_error_is_set(error)) + { + printf("Error: %s - %s\n", error->name, error->message); + return; + } + dbus_message_get_args(reply, error, DBUS_TYPE_UINT32, + &val, DBUS_TYPE_INVALID); + printf("Received: %i\n", val); +} + +static void +_e_backlight_hal_val_get(void) +{ + DBusMessage *msg; + + if (!_hal_bl_dev) return; + msg = dbus_message_new_method_call + ("org.freedesktop.Hal", + _hal_bl_dev, + _hal_bl_iface, + "GetBrightness" + ); + e_dbus_message_send(_hal_conn, msg, _e_backlight_hal_val_reply, -1, NULL); + dbus_message_unref(msg); +} + +static void +_e_backlight_hal_val_set(double val) +{ + DBusMessage *msg; + dbus_uint32_t ival = 0; + + if (!_hal_bl_dev) return; + msg = dbus_message_new_method_call + ("org.freedesktop.Hal", + _hal_bl_dev, + _hal_bl_iface, + "SetBrightness" + ); + ival = val * (_hal_nlevels - 1); + printf("hal set %i\n", ival); + dbus_message_append_args(msg, DBUS_TYPE_UINT32, &ival, DBUS_TYPE_INVALID); + dbus_message_set_no_reply(msg, EINA_TRUE); + e_dbus_message_send(_hal_conn, msg, NULL, -1, NULL); + dbus_message_unref(msg); +} + +static void +_e_backlight_prop(void *data __UNUSED__, + void *reply_data, + DBusError *error) +{ + E_Hal_Properties *ret = reply_data; + int err; + int nlevels; + const Eina_List *sl; + + if (!ret) goto error; + + if (dbus_error_is_set(error)) + { + dbus_error_free(error); + goto error; + } + nlevels = e_hal_property_bool_get(ret, "laptop_panel.num_levels", &err); + if (err) goto error; + _hal_nlevels = nlevels; + printf("nlevels: %i\n", nlevels); + + sl = e_hal_property_strlist_get(ret, "info.interfaces", &err); + if (err) goto error; + if (sl) + { + if (_hal_bl_iface) eina_stringshare_del(_hal_bl_iface); + _hal_bl_iface = eina_stringshare_add(sl->data); + printf("%s\n", _hal_bl_iface); + } + _e_backlight_hal_val_get(); + return; +error: + if (_hal_bl_dev) + { + eina_stringshare_del(_hal_bl_dev); + _hal_bl_dev = NULL; + } + if (_hal_bl_iface) + { + eina_stringshare_del(_hal_bl_iface); + _hal_bl_iface = NULL; + } +} + +static void +_e_backlight_panel_found(void *user_data __UNUSED__, + void *reply_data, + DBusError *error) +{ + E_Hal_Manager_Find_Device_By_Capability_Return *ret = reply_data; + Eina_List *l; + char *device; + + if (!ret || !ret->strings) return; + + if (dbus_error_is_set(error)) + { + dbus_error_free(error); + return; + } + if (!_hal_bl_dev) + { + EINA_LIST_FOREACH(ret->strings, l, device) + { + printf("BL+: %s\n", device); + if (!_hal_bl_dev) _hal_bl_dev = eina_stringshare_add(device); + } + } + if (_hal_bl_dev) + { + e_hal_device_get_all_properties(_hal_conn, _hal_bl_dev, + _e_backlight_prop, NULL); + } +} +#endif + +static void +_e_backlight_update(E_Zone *zone) +{ + double x_bl = -1.0; + Ecore_X_Window root; + Ecore_X_Randr_Output *out; + int num = 0; + + root = zone->container->manager->root; + // try randr + out = ecore_x_randr_window_outputs_get(root, &num); + if ((out) && (num > 0)) + x_bl = ecore_x_randr_output_backlight_level_get(root, out[0]); + if (out) free(out); + if (x_bl >= 0.0) + { + bl_val = x_bl; + sysmode = MODE_RANDR; + } + else + { +#ifdef HAL_BL + sysmode = MODE_HAL; + if (!_hal_conn) + { + e_dbus_init(); + e_hal_init(); + _hal_conn = e_dbus_bus_get(DBUS_BUS_SYSTEM); + } + if (_hal_conn) + { + if (!_hal_bl_dev) + e_hal_manager_find_device_by_capability + (_hal_conn, "laptop_panel", + _e_backlight_panel_found, NULL); + } +#endif + } +} + +static void +_e_backlight_set(E_Zone *zone, double val) +{ + if (sysmode == MODE_RANDR) + { + Ecore_X_Window root; + Ecore_X_Randr_Output *out; + int num = 0; + + root = zone->container->manager->root; + out = ecore_x_randr_window_outputs_get(root, &num); + if ((out) && (num > 0)) + { + ecore_x_randr_output_backlight_level_set(root, out[0], val); + } + if (out) free(out); + } + else if (sysmode == MODE_HAL) + { +#ifdef HAL_BL + _e_backlight_hal_val_set(val); +#endif + } +} + +static Eina_Bool +_bl_anim(void *data, double pos) +{ + E_Zone *zone = data; + double v; + + // FIXME: if zone is deleted while anim going... bad things. + pos = ecore_animator_pos_map(pos, ECORE_POS_MAP_DECELERATE, 0.0, 0.0); + v = (bl_animval * (1.0 - pos)) + (bl_val *pos); + _e_backlight_set(zone, v); + if (pos >= 1.0) + { + bl_anim = NULL; + return EINA_FALSE; + } + return EINA_TRUE; +} diff --git a/src/bin/e_backlight.h b/src/bin/e_backlight.h new file mode 100644 index 000000000..848a17fcf --- /dev/null +++ b/src/bin/e_backlight.h @@ -0,0 +1,36 @@ +#ifdef E_TYPEDEFS + +//typedef struct _E_Screen E_Screen; + +typedef enum _E_Backlight_Mode +{ + E_BACKLIGHT_MODE_NORMAL = 0, + E_BACKLIGHT_MODE_OFF = 1, + E_BACKLIGHT_MODE_MIN = 2, + E_BACKLIGHT_MODE_DIM = 3, + E_BACKLIGHT_MODE_MAX = 4 + // for the future. right now not working as we'd need an optical + // sensor support framework +// E_BACKLIGHT_MODE_AUTO = 5 +} E_Backlight_Mode; + +#else +#ifndef E_BACKLIGHT_H +#define E_BACKLIGHT_H + +//struct _E_Screen +//{ +// int screen, escreen; +// int x, y, w, h; +//}; + +EINTERN int e_backlight_init(void); +EINTERN int e_backlight_shutdown(void); +EAPI void e_backlight_update(void); +EAPI void e_backlight_level_set(E_Zone *zone, double val, double tim); +EAPI double e_backlight_level_get(E_Zone *zone); +EAPI void e_backlight_mode_set(E_Zone *zone, E_Backlight_Mode mode); +EAPI E_Backlight_Mode e_backlight_mode_get(E_Zone *zone); + +#endif +#endif diff --git a/src/bin/e_config.c b/src/bin/e_config.c index 88594dae9..ab8a5196f 100644 --- a/src/bin/e_config.c +++ b/src/bin/e_config.c @@ -906,6 +906,10 @@ e_config_init(void) E_CONFIG_LIST(D, T, env_vars, _e_config_env_var_edd); + E_CONFIG_VAL(D, T, backlight.normal, DOUBLE); + E_CONFIG_VAL(D, T, backlight.dim, DOUBLE); + E_CONFIG_VAL(D, T, backlight.transition, DOUBLE); + e_config_load(); e_config_save_queue(); diff --git a/src/bin/e_config.h b/src/bin/e_config.h index 8fe1a4633..9454f156f 100644 --- a/src/bin/e_config.h +++ b/src/bin/e_config.h @@ -343,6 +343,12 @@ struct _E_Config unsigned char null_container_win; Eina_List *env_vars; + + struct { + double normal; + double dim; + double transition; + } backlight; }; struct _E_Config_Env_Var diff --git a/src/bin/e_includes.h b/src/bin/e_includes.h index 82460a18f..5666b605f 100644 --- a/src/bin/e_includes.h +++ b/src/bin/e_includes.h @@ -138,3 +138,4 @@ #include "e_widget_toolbook.h" #include "e_acpi.h" #include "e_env.h" +#include "e_backlight.h" diff --git a/src/bin/e_main.c b/src/bin/e_main.c index 3993e8263..eab79bac2 100644 --- a/src/bin/e_main.c +++ b/src/bin/e_main.c @@ -959,6 +959,16 @@ main(int argc, char **argv) e_acpi_init(); _e_main_shutdown_push(e_acpi_shutdown); + e_init_status_set(_("Setup Backlight")); + TS("backlight"); + /* setup dpms */ + if (!e_backlight_init()) + { + e_error_message_show(_("Enlightenment cannot configure the backlight.")); + _e_main_shutdown(-1); + } + _e_main_shutdown_push(e_backlight_shutdown); + e_init_status_set(_("Setup DPMS")); TS("dpms"); /* setup dpms */ diff --git a/src/bin/e_widget_slider.c b/src/bin/e_widget_slider.c index 39be27afb..b16d886b4 100644 --- a/src/bin/e_widget_slider.c +++ b/src/bin/e_widget_slider.c @@ -223,6 +223,7 @@ _e_wid_cb_changed(void *data, Evas_Object *obj __UNUSED__, void *event_info __UN if (wd->dval) *(wd->dval) = e_slider_value_get(wd->o_slider); else if (wd->ival) *(wd->ival) = e_slider_value_get(wd->o_slider); e_widget_change(wd->o_widget); + evas_object_smart_callback_call(wd->o_widget, "changed", NULL); } static void diff --git a/src/modules/Makefile.am b/src/modules/Makefile.am index fb2c93737..c9585f871 100644 --- a/src/modules/Makefile.am +++ b/src/modules/Makefile.am @@ -175,3 +175,6 @@ if USE_MODULE_SHOT SUBDIRS += shot endif +if USE_MODULE_BACKLIGHT +SUBDIRS += backlight +endif diff --git a/src/modules/backlight/.cvsignore b/src/modules/backlight/.cvsignore new file mode 100644 index 000000000..06d064a84 --- /dev/null +++ b/src/modules/backlight/.cvsignore @@ -0,0 +1,7 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +module.la +module.desktop diff --git a/src/modules/backlight/Makefile.am b/src/modules/backlight/Makefile.am new file mode 100644 index 000000000..6c994b88b --- /dev/null +++ b/src/modules/backlight/Makefile.am @@ -0,0 +1,28 @@ +MAINTAINERCLEANFILES = Makefile.in +MODULE = backlight + +# data files for the module +filesdir = $(libdir)/enlightenment/modules/$(MODULE) +files_DATA = \ +e-module-$(MODULE).edj module.desktop + +EXTRA_DIST = $(files_DATA) + +# the module .so file +INCLUDES = -I. \ + -I$(top_srcdir) \ + -I$(top_srcdir)/src/modules/$(MODULE) \ + -I$(top_srcdir)/src/bin \ + -I$(top_builddir)/src/bin \ + -I$(top_srcdir)/src/modules \ + @e_cflags@ +pkgdir = $(libdir)/enlightenment/modules/$(MODULE)/$(MODULE_ARCH) +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 + +uninstall: + rm -rf $(DESTDIR)$(libdir)/enlightenment/modules/$(MODULE) diff --git a/src/modules/backlight/e-module-backlight.edj b/src/modules/backlight/e-module-backlight.edj new file mode 100644 index 0000000000000000000000000000000000000000..c16263fee744f48a1f1b8ae52a11a42777648b4b GIT binary patch literal 8910 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 L4MO+>A4LBTrFc(! literal 0 HcmV?d00001 diff --git a/src/modules/backlight/e_mod_main.c b/src/modules/backlight/e_mod_main.c new file mode 100644 index 000000000..0a82265af --- /dev/null +++ b/src/modules/backlight/e_mod_main.c @@ -0,0 +1,283 @@ +#include "e.h" +#include "e_mod_main.h" + +/* gadcon requirements */ +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, E_Gadcon_Orient orient); +static char *_gc_label(E_Gadcon_Client_Class *client_class); +static Evas_Object *_gc_icon(E_Gadcon_Client_Class *client_class, Evas *evas); +static const char *_gc_id_new(E_Gadcon_Client_Class *client_class); + +/* and actually define the gadcon class that this module provides (just 1) */ +static const E_Gadcon_Client_Class _gadcon_class = +{ + GADCON_CLIENT_CLASS_VERSION, + "backlight", + { + _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL, NULL + }, + E_GADCON_CLIENT_STYLE_PLAIN +}; + +/* actual module specifics */ +typedef struct _Instance Instance; + +struct _Instance +{ + E_Gadcon_Client *gcc; + Evas_Object *o_backlight, *o_table, *o_slider; + E_Gadcon_Popup *popup; + E_Menu *menu; + double val; +}; + +static Eina_List *backlight_instances = NULL; +static E_Module *backlight_module = NULL; + +static void +_backlight_settings_cb(void *d1, void *d2 __UNUSED__) +{ + Instance *inst = d1; + e_configure_registry_call("screen/power_management", + inst->gcc->gadcon->zone->container, NULL); + e_object_del(E_OBJECT(inst->popup)); + inst->popup = NULL; +} + +static void +_slider_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Instance *inst = data; + e_backlight_mode_set(inst->gcc->gadcon->zone, E_BACKLIGHT_MODE_NORMAL); + e_backlight_level_set(inst->gcc->gadcon->zone, inst->val, 0.0); +} + +static void +_backlight_popup_new(Instance *inst) +{ + Evas *evas; + Evas_Object *o; + + if (inst->popup) return; + + e_backlight_update(); + e_backlight_mode_set(inst->gcc->gadcon->zone, E_BACKLIGHT_MODE_NORMAL); + inst->val = e_backlight_level_get(inst->gcc->gadcon->zone); + + inst->popup = e_gadcon_popup_new(inst->gcc); + evas = inst->popup->win->evas; + + inst->o_table = e_widget_table_add(evas, 0); + + o = e_widget_slider_add(evas, 0, 0, NULL, 0.0, 1.0, 0.0, 0, &(inst->val), NULL, 200); + evas_object_smart_callback_add(o, "changed", _slider_cb, inst); + inst->o_slider = o; + e_widget_table_object_align_append(inst->o_table, o, + 0, 0, 1, 1, 0, 0, 0, 0, 0.5, 0.5); + + o = e_widget_button_add(evas, NULL, "preferences-system", + _backlight_settings_cb, inst, NULL); + e_widget_table_object_align_append(inst->o_table, o, + 0, 1, 1, 1, 0, 0, 0, 0, 0.5, 1.0); + + e_gadcon_popup_content_set(inst->popup, inst->o_table); + e_gadcon_popup_show(inst->popup); +} + +static void +_backlight_popup_free(Instance *inst) +{ + if (!inst->popup) return; + if (inst->popup) e_object_del(E_OBJECT(inst->popup)); + inst->popup = NULL; +} + +static void +_backlight_menu_cb_post(void *data, E_Menu *menu __UNUSED__) +{ + Instance *inst = data; + if ((!inst) || (!inst->menu)) + return; + if (inst->menu) + { + e_object_del(E_OBJECT(inst->menu)); + inst->menu = NULL; + } +} + +static void +_backlight_menu_cb_cfg(void *data, E_Menu *menu __UNUSED__, E_Menu_Item *mi __UNUSED__) +{ + Instance *inst = data; + E_Container *con; + + if (inst->popup) + { + e_object_del(E_OBJECT(inst->popup)); + inst->popup = NULL; + } + con = e_container_current_get(e_manager_current_get()); +// e_int_config_backlight_module(con, NULL); +} + +static void +_backlight_cb_mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event) +{ + Instance *inst = data; + Evas_Event_Mouse_Down *ev = event; + + if (ev->button == 1) + { + if (inst->popup) _backlight_popup_free(inst); + else _backlight_popup_new(inst); + } + else if ((ev->button == 3) && (!inst->menu)) + { + E_Zone *zone; + E_Menu *m; + E_Menu_Item *mi; + int x, y; + + zone = e_util_zone_current_get(e_manager_current_get()); + + m = e_menu_new(); + + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, _("Settings")); + e_util_menu_item_theme_icon_set(mi, "configure"); + e_menu_item_callback_set(mi, _backlight_menu_cb_cfg, inst); + + m = e_gadcon_client_util_menu_items_append(inst->gcc, m, 0); + e_menu_post_deactivate_callback_set(m, _backlight_menu_cb_post, inst); + inst->menu = m; + + e_gadcon_canvas_zone_geometry_get(inst->gcc->gadcon, &x, &y, NULL, NULL); + e_menu_activate_mouse(m, zone, x + ev->output.x, y + ev->output.y, + 1, 1, E_MENU_POP_DIRECTION_AUTO, ev->timestamp); + evas_event_feed_mouse_up(inst->gcc->gadcon->evas, ev->button, + EVAS_BUTTON_NONE, ev->timestamp, NULL); + } +} + +static E_Gadcon_Client * +_gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style) +{ + Evas_Object *o; + E_Gadcon_Client *gcc; + Instance *inst; + + inst = E_NEW(Instance, 1); + + o = edje_object_add(gc->evas); + e_theme_edje_object_set(o, "base/theme/modules/backlight", + "e/modules/backlight/main"); + evas_object_show(o); + + gcc = e_gadcon_client_new(gc, name, id, style, o); + gcc->data = inst; + + inst->gcc = gcc; + inst->o_backlight = o; + + e_backlight_update(); + inst->val = e_backlight_level_get(inst->gcc->gadcon->zone); + + evas_object_event_callback_add(inst->o_backlight, + EVAS_CALLBACK_MOUSE_DOWN, + _backlight_cb_mouse_down, + inst); + + e_gadcon_client_util_menu_attach(gcc); + + backlight_instances = eina_list_append(backlight_instances, inst); + return gcc; +} + +static void +_gc_shutdown(E_Gadcon_Client *gcc) +{ + Instance *inst; + + inst = gcc->data; + if (inst->menu) + { + e_object_del(E_OBJECT(inst->menu)); + inst->menu = NULL; + } + backlight_instances = eina_list_remove(backlight_instances, inst); + evas_object_del(inst->o_backlight); + _backlight_popup_free(inst); + free(inst); +} + +static void +_gc_orient(E_Gadcon_Client *gcc, E_Gadcon_Orient orient __UNUSED__) +{ + Instance *inst; + Evas_Coord mw, mh; + + inst = gcc->data; + mw = 0, mh = 0; + edje_object_size_min_get(inst->o_backlight, &mw, &mh); + if ((mw < 1) || (mh < 1)) + edje_object_size_min_calc(inst->o_backlight, &mw, &mh); + if (mw < 4) mw = 4; + if (mh < 4) mh = 4; + e_gadcon_client_aspect_set(gcc, mw, mh); + e_gadcon_client_min_size_set(gcc, mw, mh); +} + +static char * +_gc_label(E_Gadcon_Client_Class *client_class __UNUSED__) +{ + return _("Backlight"); +} + +static Evas_Object * +_gc_icon(E_Gadcon_Client_Class *client_class __UNUSED__, Evas *evas) +{ + Evas_Object *o; + char buf[4096]; + + o = edje_object_add(evas); + snprintf(buf, sizeof(buf), "%s/e-module-backlight.edj", + e_module_dir_get(backlight_module)); + edje_object_file_set(o, buf, "icon"); + return o; +} + +static const char * +_gc_id_new(E_Gadcon_Client_Class *client_class __UNUSED__) +{ + return _gadcon_class.name; +} + +/* module setup */ +EAPI E_Module_Api e_modapi = +{ + E_MODULE_API_VERSION, + "Backlight" +}; + +EAPI void * +e_modapi_init(E_Module *m) +{ + backlight_module = m; + e_gadcon_provider_register(&_gadcon_class); + return m; +} + +EAPI int +e_modapi_shutdown(E_Module *m __UNUSED__) +{ + backlight_module = NULL; + e_gadcon_provider_unregister(&_gadcon_class); + return 1; +} + +EAPI int +e_modapi_save(E_Module *m __UNUSED__) +{ + return 1; +} diff --git a/src/modules/backlight/e_mod_main.h b/src/modules/backlight/e_mod_main.h new file mode 100644 index 000000000..4adf2f1fb --- /dev/null +++ b/src/modules/backlight/e_mod_main.h @@ -0,0 +1,10 @@ +#ifndef E_MOD_MAIN_H +#define E_MOD_MAIN_H + +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); + +#endif diff --git a/src/modules/backlight/module.desktop.in b/src/modules/backlight/module.desktop.in new file mode 100644 index 000000000..8eb04ef30 --- /dev/null +++ b/src/modules/backlight/module.desktop.in @@ -0,0 +1,6 @@ +[Desktop Entry] +Type=Link +Name=Backlight +Icon=e-module-backlight +X-Enlightenment-ModuleType=utils +Comment=Backlight control slider gadget diff --git a/src/modules/conf_display/e_int_config_dpms.c b/src/modules/conf_display/e_int_config_dpms.c index bebf01767..4d9995c8d 100644 --- a/src/modules/conf_display/e_int_config_dpms.c +++ b/src/modules/conf_display/e_int_config_dpms.c @@ -36,20 +36,30 @@ struct _E_Config_Dialog_Data double suspend_timeout; double off_timeout; Eina_List *dpms_list; + + double backlight_normal; + double backlight_dim; + double backlight_transition; }; static E_Dialog *dpms_dialog = NULL; +/* always allow as dmps now has backlight too static void _cb_dpms_dialog_ok(void *data __UNUSED__, E_Dialog *dia __UNUSED__) { e_object_del(E_OBJECT(dpms_dialog)); dpms_dialog = NULL; } +*/ static int _e_int_config_dpms_capable(void) { + return 1; +/* always allow as dmps now has backlight too + * this all needs to merge with screensaver too into a simple screen blank+ + * dim+brightness etc. config if (ecore_x_dpms_capable_get()) return 1; if (dpms_dialog) e_object_del(E_OBJECT(dpms_dialog)); @@ -65,12 +75,15 @@ _e_int_config_dpms_capable(void) e_dialog_button_focus_num(dpms_dialog, 1); e_win_centered_set(dpms_dialog->win, 1); e_dialog_show(dpms_dialog); + */ return 0; } static int _e_int_config_dpms_available(void) { + return 1; +/* always allow as dmps now has backlight too if (ecore_x_dpms_query()) return 1; if (dpms_dialog) e_object_del(E_OBJECT(dpms_dialog)); @@ -87,6 +100,7 @@ _e_int_config_dpms_available(void) e_win_centered_set(dpms_dialog->win, 1); e_dialog_show(dpms_dialog); return 0; + */ } E_Config_Dialog * @@ -125,6 +139,9 @@ _fill_data(E_Config_Dialog_Data *cfdata) cfdata->suspend_timeout = e_config->dpms_suspend_timeout / 60; cfdata->enable_off = e_config->dpms_off_enable; cfdata->off_timeout = e_config->dpms_off_timeout / 60; + cfdata->backlight_normal = e_config->backlight.normal * 100.0; + cfdata->backlight_dim = e_config->backlight.dim * 100.0; + cfdata->backlight_transition = e_config->backlight.transition; } static void @@ -156,8 +173,8 @@ _create_data(E_Config_Dialog *cfd) static void _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) { - eina_list_free(cfdata->dpms_list); - E_FREE(cfdata); + eina_list_free(cfdata->dpms_list); + E_FREE(cfdata); } static int @@ -171,7 +188,14 @@ _apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) e_config->dpms_standby_timeout = cfdata->standby_timeout * 60; e_config->dpms_suspend_timeout = cfdata->suspend_timeout * 60; e_config->dpms_off_timeout = cfdata->off_timeout * 60; + + e_config->backlight.normal = cfdata->backlight_normal / 100.0; + e_config->backlight.dim = cfdata->backlight_dim / 100.0; + e_config->backlight.transition = cfdata->backlight_transition; + e_backlight_mode_set(NULL, E_BACKLIGHT_MODE_NORMAL); + e_backlight_level_set(NULL, e_config->backlight.normal, -1.0); + e_config_save_queue(); e_dpms_update(); return 1; @@ -187,7 +211,10 @@ _advanced_check_changed(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *c (e_config->dpms_off_enable != cfdata->enable_off) || (e_config->dpms_standby_timeout / 60 != cfdata->standby_timeout) || (e_config->dpms_suspend_timeout / 60 != cfdata->suspend_timeout) || - (e_config->dpms_off_timeout / 60 != cfdata->off_timeout); + (e_config->dpms_off_timeout / 60 != cfdata->off_timeout) || + (e_config->backlight.normal * 100.0 != cfdata->backlight_normal) || + (e_config->backlight.dim * 100.0 != cfdata->backlight_dim) || + (e_config->backlight.transition != cfdata->backlight_transition); } static int @@ -200,9 +227,12 @@ _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) static Evas_Object * _advanced_create_widgets(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata) { - Evas_Object *o, *of, *ob; + Evas_Object *o, *of, *ob, *otb; Evas_Object *dpms_check; + otb = e_widget_toolbook_add(evas, (24 * e_scale), (24 * e_scale)); + + /* dpms */ o = e_widget_list_add(evas, 0, 0); dpms_check = e_widget_check_add(evas, _("Enable Display Power Management"), @@ -253,7 +283,36 @@ _advanced_create_widgets(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_D _list_disabled_state_apply(cfdata->dpms_list, !cfdata->enable_dpms); e_widget_list_object_append(o, of, 1, 1, 0.5); - return o; + + e_widget_toolbook_page_append(otb, NULL, _("DPMS"), o, + 1, 0, 1, 0, 0.5, 0.0); + + o = e_widget_list_add(evas, 0, 0); + + ob = e_widget_label_add(evas, _("Normal Backlight")); + e_widget_list_object_append(o, ob, 1, 1, 0.5); + ob = e_widget_slider_add(evas, 1, 0, _("%3.0f"), 0.0, 100.0, 1.0, 0, + &(cfdata->backlight_normal), NULL, 100); + e_widget_list_object_append(o, ob, 1, 1, 0.5); + + ob = e_widget_label_add(evas, _("Dim Backlight")); + e_widget_list_object_append(o, ob, 1, 1, 0.5); + ob = e_widget_slider_add(evas, 1, 0, _("%3.0f"), 0.0, 100.0, 1.0, 0, + &(cfdata->backlight_dim), NULL, 100); + e_widget_list_object_append(o, ob, 1, 1, 0.5); + + ob = e_widget_label_add(evas, _("Fade Time")); + e_widget_list_object_append(o, ob, 1, 1, 0.5); + ob = e_widget_slider_add(evas, 1, 0, _("%1.1f sec"), 0.0, 5.0, 0.1, 0, + &(cfdata->backlight_transition), NULL, 100); + e_widget_list_object_append(o, ob, 1, 1, 0.5); + + e_widget_toolbook_page_append(otb, NULL, _("Backlight"), o, + 1, 0, 1, 0, 0.5, 0.0); + + e_widget_toolbook_page_show(otb, 0); + + return otb; } /* general functionality/callbacks */