raster pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=c4e76ed59361578c682956238355caf753cf7142

commit c4e76ed59361578c682956238355caf753cf7142
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
Date:   Thu Nov 26 00:38:01 2020 +0000

    backlight + ddc - fix and improve several small things
    
    1. use max valu in the get and store it once a get has been done so it
    will get backlight level right on unsuaul monitors that do not use
    0->100
    2. detect as an error dinfing 2 screesn with the same edid and log it
    3. use ddca_enable_sleep_suppression() to try speed up things a bit to
    sleep less inside ddcutil
---
 src/bin/e_backlight.c         | 18 +++++++++++++++---
 src/bin/system/e_system_ddc.c | 16 ++++++++++++----
 2 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/src/bin/e_backlight.c b/src/bin/e_backlight.c
index e0d0bb4b3..d1e3c4ee8 100644
--- a/src/bin/e_backlight.c
+++ b/src/bin/e_backlight.c
@@ -9,6 +9,7 @@ typedef struct
    double from_val, to_val;
    Ecore_Animator *anim;
    Ecore_Timer *retry_timer;
+   int ddc_max;
    int retries;
 } Backlight_Device;
 
@@ -81,17 +82,18 @@ static void
 _backlight_system_ddc_get_cb(void *data, const char *params)
 {
    char edid[257];
-   int id = -1, val = -1;
+   int id = -1, val = -1, max = -1;
    double fval;
    Backlight_Device *bd = data;
 
    if (!params) return;
-   if (sscanf(params, "%256s %i %i", edid, &id, &val) != 3) return;
+   if (sscanf(params, "%256s %i %i %i", edid, &id, &val, &max) != 4) return;
    if (!bd->edid) return;
    if (!!strncmp(bd->edid, edid, strlen(edid))) return;
    e_system_handler_del("ddc-val-get", _backlight_system_ddc_get_cb, bd);
    if (val < 0) fval = -1.0;
    else fval = (double)val / 100.0;
+   bd->ddc_max = max;
    if ((fabs(fval - bd->val) >= DBL_EPSILON) || (val == -1))
      {
         bd->val = fval;
@@ -243,8 +245,12 @@ _backlight_devices_device_set(Backlight_Device *bd, double 
val)
 #endif
    if (!strncmp(bd->dev, "ddc:", 4))
      {
+        double fval;
+
         fprintf(stderr, "BL: ddc bklight %1.3f @ %1.3f\n", bd->val, 
ecore_time_get());
-        e_system_send("ddc-val-set", "%s %i %i", bd->dev + 4, 0x10, 
(int)(bd->val * 100.0)); // backlight val in e_system_ddc.c
+        if (bd->ddc_max) fval = bd->val * (double)bd->ddc_max;
+        else fval = bd->val * 100.0;
+        e_system_send("ddc-val-set", "%s %i %i", bd->dev + 4, 0x10, 
(int)(fval)); // backlight val in e_system_ddc.c
         ecore_event_add(E_EVENT_BACKLIGHT_CHANGE, NULL, NULL, NULL);
      }
    else
@@ -520,7 +526,9 @@ _backlight_system_ddc_list_cb(void *data EINA_UNUSED, const 
char *params)
 {
    const char *p = params;
    char dev[257], buf[343];
+   Eina_Hash *tmphash;
 
+   tmphash = eina_hash_string_superfast_new(NULL);
    e_system_handler_del("ddc-list", _backlight_system_ddc_list_cb, NULL);
    while ((p) && (*p))
      {
@@ -531,10 +539,14 @@ _backlight_system_ddc_list_cb(void *data EINA_UNUSED, 
const char *params)
              bl_devs = eina_list_append
                (bl_devs, eina_stringshare_add(buf));
              _backlight_devices_edid_register(buf, dev);
+             if (eina_hash_find(tmphash, dev))
+               printf("BL: DDC ERROR: You have multiple DDC screens with the 
same EDID [%s] - this will lead to weirdness.\n", dev);
+             eina_hash_add(tmphash, dev, dev);
              if (*p != ' ') break;
           }
         else break;
      }
+   eina_hash_free(tmphash);
    _backlight_devices_pending_done();
 }
 
diff --git a/src/bin/system/e_system_ddc.c b/src/bin/system/e_system_ddc.c
index 74d48dd56..c84d37d07 100644
--- a/src/bin/system/e_system_ddc.c
+++ b/src/bin/system/e_system_ddc.c
@@ -198,6 +198,8 @@ struct {
      (DDCA_Display_Handle ddca_dh);
    void (*ddca_set_global_sleep_multiplier)
      (double multiplier);
+   bool (*ddca_enable_sleep_suppression)
+     (bool newval);
 } ddc_func;
 
 static DDCA_Display_Info_List *ddc_dlist = NULL;
@@ -325,6 +327,7 @@ _ddc_init(void)
       ddc_func._x = dlsym(ddc_lib, #_x); \
    } while (0)
    SYM_OPT(ddca_set_global_sleep_multiplier);
+   SYM_OPT(ddca_enable_sleep_suppression);
 
    // brute force modprobe this as it likely is needed - probe will fail
    // if this doesn't work or find devices anyway
@@ -333,6 +336,10 @@ _ddc_init(void)
 
    if (!_ddc_probe()) return EINA_FALSE;
 
+   // try improve performance by limiting sleeps in ddcutil
+   if (ddc_func.ddca_enable_sleep_suppression)
+     ddc_func.ddca_enable_sleep_suppression(true);
+
    return EINA_TRUE;
 }
 
@@ -484,7 +491,7 @@ _do_val_get(Ecore_Thread *th, const char *edid, int id)
 {
    Dev *d;
    Req *r;
-   int screen, val;
+   int screen, val, max;
    char buf[512];
    DDCA_Non_Table_Vcp_Value valrec;
 
@@ -505,15 +512,16 @@ _do_val_get(Ecore_Thread *th, const char *edid, int id)
    if (ddc_func.ddca_get_non_table_vcp_value
        (ddc_dh[screen], id, &valrec) == 0)
      {
+        max = valrec.ml | valrec.mh << 8;
         val = valrec.sl | (valrec.sh << 8);
-        fprintf(stderr, "DDC: get ok %s 0x%02x = %i\n", edid, id, val);
-        snprintf(buf, sizeof(buf), "%s %i %i", edid, id, val);
+        fprintf(stderr, "DDC: get ok %s 0x%02x val=%i max=%i\n", edid, id, 
val, max);
+        snprintf(buf, sizeof(buf), "%s %i %i %i", edid, id, val, max);
      }
    else
      {
         fprintf(stderr, "DDC: get fail %s 0x%02x\n", edid, id);
 err:
-        snprintf(buf, sizeof(buf), "%s %i -1", edid, id);
+        snprintf(buf, sizeof(buf), "%s %i -1 -1", edid, id);
      }
    r = _req_alloc("ddc-val-get", buf);
    if (r) ecore_thread_feedback(th, r);

-- 


Reply via email to