On 06/17/2011 10:37 PM, Christopher Michael wrote:
On 06/17/2011 04:35 PM, Mathieu Taillefumier wrote:
On 06/17/2011 10:27 PM, Christopher Michael wrote:
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'.

And !!! Corrected but it does not improve it.

Mathieu


Hmm, I still see several 'if' statements that are not corrected ;) and
Yes, it will not change functionality of the patch, but does improve
readability if it matches the rest of the EFL ;)
Well thank anyway, I should follow the rules that's all ;-). Enclosed the last version of the patch that I hope contains all the "if" correctly formatted :-).



dh

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


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);



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

Reply via email to