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