On 06/17/2011 03:55 PM, Mathieu Taillefumier wrote: > Hi, > > I finished to write the code implementing the automatic backlight > reduction after a given time of inactivity (that can be set in the > backlight menu). The patch is relatively straightforward but reviewing > is always welcome so fire up. To have the automatic backlight just set > the Dimming time to a non zero value. The automatic dimming is disabled > when the dimming time is 0. > > > Mathieu > Just one observation wrt this patch. The formatting for 'if' statements is not correct. It should be something like this:
if (_bl_log_dom < 0) with a space after the 'if'. dh > backlight.patch > > > author : Mathieu Taillefumier (mathieu.taillefum...@free.fr) > > Add automatic backlight dimming. > - two parameters are added : > - sleep backlight is the backlight minimum during extensive inactivity > time (6 min) > - dimming timeout : Time of inactivity after what the backlight is > reduced to the idle backlight intensity > > bin/e_backlight.c | 181 > +++++++++++++++++++++++++++---- > bin/e_config.c | 4 > bin/e_config.h | 3 > modules/conf_display/e_int_config_dpms.c | 39 ++++++ > 4 files changed, 204 insertions(+), 23 deletions(-) > Index: src/bin/e_config.c > =================================================================== > --- src/bin/e_config.c (revision 60455) > +++ src/bin/e_config.c (working copy) > @@ -909,7 +909,9 @@ > 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_VAL(D, T, backlight.sleep, DOUBLE); > + E_CONFIG_VAL(D, T, backlight.dimming_timer, DOUBLE); > + E_CONFIG_VAL(D, T, backlight.dimming_enable, INT); > e_config_load(); > > e_config_save_queue(); > Index: src/bin/e_config.h > =================================================================== > --- src/bin/e_config.h (revision 60455) > +++ src/bin/e_config.h (working copy) > @@ -347,7 +347,10 @@ > struct { > double normal; > double dim; > + double sleep; > double transition; > + double dimming_timer; > + Eina_Bool dimming_enable; > } backlight; > }; > > Index: src/bin/e_backlight.c > =================================================================== > --- src/bin/e_backlight.c (revision 60455) > +++ src/bin/e_backlight.c (working copy) > @@ -6,6 +6,7 @@ > > #define MODE_RANDR 0 > #define MODE_SYS 1 > +#define MODE_NONE 2 > > static double bl_val = 1.0; > static double bl_animval = 1.0; > @@ -16,6 +17,9 @@ > static Ecore_Event_Handler *bl_sys_exit_handler = NULL; > static Ecore_Exe *bl_sys_set_exe = NULL; > static Eina_Bool bl_sys_pending_set = EINA_FALSE; > +static Ecore_Poller *_bl_dimming_poll_activity_check = NULL; > +static Eina_Bool _backlight_reduced_level_set = EINA_FALSE; > +static int _bl_log_dom = -1; > > static void _e_backlight_update(E_Zone *zone); > static void _e_backlight_set(E_Zone *zone, double val); > @@ -26,10 +30,42 @@ > static void _bl_sys_level_get(void); > static Eina_Bool _e_bl_cb_exit(void *data __UNUSED__, int type __UNUSED__, > void *event); > static void _bl_sys_level_set(double val); > +static Eina_Bool _bl_poll_activity_check(void *data __UNUSED__); > > +#ifdef ERR > +# undef ERR > +#endif /* ifdef ERR */ > +#define ERR(...) EINA_LOG_DOM_ERR(_bl_log_dom, __VA_ARGS__) > +#ifdef DBG > +# undef DBG > +#endif /* ifdef DBG */ > +#define DBG(...) EINA_LOG_DOM_DBG(_bl_log_dom, __VA_ARGS__) > +#ifdef INF > +# undef INF > +#endif /* ifdef INF */ > +#define INF(...) EINA_LOG_DOM_INFO(_bl_log_dom, __VA_ARGS__) > +#ifdef WRN > +# undef WRN > +#endif /* ifdef WRN */ > +#define WRN(...) EINA_LOG_DOM_WARN(_bl_log_dom, __VA_ARGS__) > +#ifdef CRIT > +# undef CRIT > +#endif /* ifdef CRIT */ > +#define CRIT(...) EINA_LOG_DOM_CRIT(_bl_log_dom, __VA_ARGS__) > + > EINTERN int > e_backlight_init(void) > { > + if(_bl_log_dom< 0) > + { > + _bl_log_dom = eina_log_domain_register("E17 Backlight", > EINA_COLOR_BLUE); > + if(_bl_log_dom< 0) > + { > + EINA_LOG_ERR("Enable to create a log domain for the backlight > extension"); > + return 0; > + } > + } > + > e_backlight_update(); > e_backlight_level_set(NULL, 0.0, 0.0); > e_backlight_level_set(NULL, e_config->backlight.normal, 1.0); > @@ -47,6 +83,13 @@ > bl_sys_exit_handler = NULL; > bl_sys_set_exe = NULL; > bl_sys_pending_set = EINA_FALSE; > + > + if(_bl_dimming_poll_activity_check) > + ecore_poller_del(_bl_dimming_poll_activity_check); > + _bl_dimming_poll_activity_check = NULL; > + > + eina_log_domain_unregister(_bl_log_dom); > + _bl_log_dom = -1; > return 1; > } > > @@ -68,7 +111,27 @@ > } > } > } > + > + /* > + * check if we want to have automatic decrease of the backlight > + * after some amount of time. > + */ > + if(e_config->backlight.dimming_enable) > + { > + if(!_bl_dimming_poll_activity_check) > + { > + _bl_dimming_poll_activity_check = > ecore_poller_add(ECORE_POLLER_CORE , 4, _bl_poll_activity_check, NULL); > } > + } > + else > + { > + if(_bl_dimming_poll_activity_check) > + { > + ecore_poller_del(_bl_dimming_poll_activity_check); > + _bl_dimming_poll_activity_check = NULL; > + } > + } > +} > > EAPI void > e_backlight_level_set(E_Zone *zone, double val, double tim) > @@ -114,17 +177,27 @@ > // zone == NULL == everything > if (bl_mode == mode) return; > bl_mode = mode; > - if (bl_mode == E_BACKLIGHT_MODE_NORMAL) > + switch(bl_mode) > + { > + case E_BACKLIGHT_MODE_NORMAL: > e_backlight_level_set(zone, bl_val, -1.0); > - else if (bl_mode == E_BACKLIGHT_MODE_OFF) > + break; > + case 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) > + break; > + case E_BACKLIGHT_MODE_MIN: > + e_backlight_level_set(zone, e_config->backlight.sleep, -1.0); > + break; > + case E_BACKLIGHT_MODE_DIM: > e_backlight_level_set(zone, e_config->backlight.dim, -1.0); > - else if (bl_mode == E_BACKLIGHT_MODE_MAX) > + break; > + case E_BACKLIGHT_MODE_MAX: > e_backlight_level_set(zone, 1.0, -1.0); > + break; > + default: > + break; > } > +} > > EAPI E_Backlight_Mode > e_backlight_mode_get(E_Zone *zone __UNUSED__) > @@ -145,7 +218,7 @@ > > root = zone->container->manager->root; > // try randr > - out = ecore_x_randr_window_outputs_get(root,&num); > + out = ecore_x_randr_outputs_get(root,&num); > if ((out)&& (num> 0)) > x_bl = ecore_x_randr_output_backlight_level_get(root, out[0]); > if (out) free(out); > @@ -168,26 +241,23 @@ > 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; > > + switch(sysmode) > + { > + case MODE_RANDR: > 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_SYS) > - { > + ecore_x_randr_screen_backlight_level_set(root, val); > + break; > + case MODE_SYS: > if (bl_sysval) > { > _bl_sys_level_set(val); > } > + break; > + default: > + WRN("No backlight properties for this screen"); > + break; > } > } > > @@ -348,3 +418,74 @@ > e_prefix_lib_get(), (int)(val * 1000.0)); > bl_sys_set_exe = ecore_exe_run(buf, NULL); > } > + > +static Eina_Bool _bl_poll_activity_check(void *data) > +{ > + Eina_List *list; > + Eina_List *iter; > + Eina_List *m, *c, *z; > + E_Manager *man; > + E_Container *con; > + E_Zone *zone; > + double timer = 0.0; > + E_Backlight_Mode tmp_mode = bl_mode; > + double val = 1.0; > + > + if((e_config->mode.presentation)&&(bl_mode != E_BACKLIGHT_MODE_NORMAL)) > + { > + tmp_mode = E_BACKLIGHT_MODE_NORMAL; > + /* loop over the outputs */ > + EINA_LIST_FOREACH(e_manager_list(), m, man) > + { > + EINA_LIST_FOREACH(man->containers, c, con) > + { > + EINA_LIST_FOREACH(con->zones, z, zone) > + { > + _e_backlight_set(zone, e_config->backlight.normal); > + } > + } > + } > + bl_mode = E_BACKLIGHT_MODE_NORMAL; > + return EINA_TRUE; > + } > + > + /* read inactivity time */ > + timer = ecore_x_screensaver_idle_time_get(); > + > + if((timer> e_config->backlight.dimming_timer)&&(bl_mode == > E_BACKLIGHT_MODE_NORMAL)) > + { > + tmp_mode = E_BACKLIGHT_MODE_DIM; > + val = e_config->backlight.dim; > + } > + > + if(timer> 300) > + { > + tmp_mode = E_BACKLIGHT_MODE_MIN; > + val = e_config->backlight.sleep; > + } > + > + if((timer< e_config->backlight.dimming_timer)&&(bl_mode != > E_BACKLIGHT_MODE_NORMAL)) > + { > + tmp_mode = E_BACKLIGHT_MODE_NORMAL; > + val = e_config->backlight.normal; > + } > + > + if(tmp_mode != bl_mode) > + { > + /* loop over the outputs */ > + EINA_LIST_FOREACH(e_manager_list(), m, man) > + { > + EINA_LIST_FOREACH(man->containers, c, con) > + { > + EINA_LIST_FOREACH(con->zones, z, zone) > + { > + _e_backlight_set(zone, val); > + } > + } > + } > + } > + > + bl_mode = tmp_mode; > + > + return EINA_TRUE; > +} > Index: src/modules/conf_display/e_int_config_dpms.c > =================================================================== > --- src/modules/conf_display/e_int_config_dpms.c (revision 60455) > +++ src/modules/conf_display/e_int_config_dpms.c (working copy) > @@ -39,7 +39,10 @@ > > double backlight_normal; > double backlight_dim; > + double backlight_sleep; > double backlight_transition; > + double backlight_dimming_timer; > + Eina_Bool backlight_dimming_enable; > }; > > static E_Dialog *dpms_dialog = NULL; > @@ -65,6 +68,7 @@ > if (dpms_dialog) e_object_del(E_OBJECT(dpms_dialog)); > dpms_dialog = > e_dialog_new(e_container_current_get(e_manager_current_get()), > "E", "_dpms_capable_dialog"); > + > if (!dpms_dialog) return 0; > > e_dialog_title_set(dpms_dialog, _("Display Power Management Signaling")); > @@ -141,7 +145,10 @@ > 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_sleep = e_config->backlight.sleep * 100.0; > cfdata->backlight_transition = e_config->backlight.transition; > + cfdata->backlight_dimming_timer = e_config->backlight.dimming_timer; > + cfdata->backlight_dimming_enable = e_config->backlight.dimming_enable; > } > > static void > @@ -191,11 +198,24 @@ > > e_config->backlight.normal = cfdata->backlight_normal / 100.0; > e_config->backlight.dim = cfdata->backlight_dim / 100.0; > + e_config->backlight.sleep = cfdata->backlight_sleep / 100.0; > + if(e_config->backlight.dim< e_config->backlight.sleep) > + { > + double tmp = e_config->backlight.dim; > + e_config->backlight.dim = e_config->backlight.sleep; > + e_config->backlight.sleep = tmp; > + } > + > e_config->backlight.transition = cfdata->backlight_transition; > + e_config->backlight.dimming_timer = cfdata->backlight_dimming_timer; > + if(e_config->backlight.dimming_timer> 0.1) > + e_config->backlight.dimming_enable = EINA_TRUE; > + else > + e_config->backlight.dimming_enable = EINA_FALSE; > > e_backlight_mode_set(NULL, E_BACKLIGHT_MODE_NORMAL); > e_backlight_level_set(NULL, e_config->backlight.normal, -1.0); > - > + e_backlight_update(); > e_config_save_queue(); > e_dpms_update(); > return 1; > @@ -214,7 +234,10 @@ > (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); > + (e_config->backlight.transition != cfdata->backlight_transition) || > + (e_config->backlight.sleep != cfdata->backlight_sleep) || > + (e_config->backlight.dimming_timer != > cfdata->backlight_dimming_timer) || > + (e_config->backlight.dimming_enable != > cfdata->backlight_dimming_enable); > } > > static int > @@ -301,12 +324,24 @@ > &(cfdata->backlight_dim), NULL, 100); > e_widget_list_object_append(o, ob, 1, 1, 0.5); > > + ob = e_widget_label_add(evas, _("Sleep 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_sleep), 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); > > + ob = e_widget_label_add(evas, _("Dimming 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, 120.0, 0.1, 0, > +&(cfdata->backlight_dimming_timer), 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); > > > ------------------------------------------------------------------------------ EditLive Enterprise is the world's most technically advanced content authoring tool. Experience the power of Track Changes, Inline Image Editing and ensure content is compliant with Accessibility Checking. http://p.sf.net/sfu/ephox-dev2dev _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel