e backlight - handle screens with no edid

this fixes backlight support on my pinephone...

@fix
This commit is contained in:
Carsten Haitzler 2020-06-10 10:46:41 +00:00
parent a91ba4e1a8
commit 80f92ee486
2 changed files with 24 additions and 11 deletions

View File

@ -45,7 +45,7 @@ _backlight_mismatch_retry(Backlight_Device *bd)
// and the delta between expected and val >= 0.05
(fabs(bd->expected_val - bd->val) >= 0.05) &&
// and we retried < 20 times
(bd->retries < 20))
(bd->retries < 10))
{ // try again
printf("RETRY backlight set as %1.2f != %1.2f (expected) try=%i\n",
bd->val, bd->expected_val, bd->retries);
@ -127,9 +127,10 @@ _backlight_devices_zone_device_find(E_Zone *zone)
Eina_List *l;
Backlight_Device *bd;
char *tmp, *sep;
const char *out, *edid;
const char *out, *edid, *id;
if (!zone->randr2_id) return NULL;
id = zone->randr2_id;
if (!id) id = "xxx/yyy";
tmp = strdup(zone->randr2_id);
if (!tmp) return NULL;
sep = strchr(tmp, '/');
@ -222,8 +223,8 @@ _backlight_devices_randr_output_get(Ecore_X_Window root, const char *output, con
static void
_backlight_devices_device_set(Backlight_Device *bd, double val)
{
if (fabs(bd->expected_val - val) > DBL_EPSILON) bd->retries = 0;
bd->val = bd->expected_val = val;
bd->retries = 0;
#ifndef HAVE_WAYLAND_ONLY
if (!strcmp(bd->dev, "randr"))
{
@ -344,12 +345,14 @@ _backlight_devices_screen_edid_get(const char *edid)
{
Eina_List *l;
E_Randr2_Screen *sc;
const char *id;
if (!e_randr2) return NULL;
EINA_LIST_FOREACH(e_randr2->screens, l, sc)
{
if (!sc->info.edid) continue;
if (!strncmp(sc->info.edid, edid, strlen(edid))) return sc;
id = sc->info.edid;
if (!id) id = "xxx";
if (!strncmp(id, edid, strlen(edid))) return sc;
}
return NULL;
}
@ -372,17 +375,20 @@ static void
_backlight_devices_lid_register(const char *dev, Eina_Bool force)
{
E_Randr2_Screen *sc = _backlight_devices_screen_lid_get();
Backlight_Device *bd;
Backlight_Device *bd = NULL;
const char *id;
if (!sc) return;
if (!sc->info.edid) return;
bd = _backlight_devices_edid_find(sc->info.edid);
id = sc->info.edid;
if (!id) id = "xxx";
bd = _backlight_devices_edid_find(id);
if (!bd)
{
E_Zone *zone;
bd = calloc(1, sizeof(Backlight_Device));
if (!bd) return;
bd->edid = eina_stringshare_add(sc->info.edid);
bd->edid = eina_stringshare_add(id);
bd->output = eina_stringshare_add(sc->info.name);
_devices = eina_list_append(_devices, bd);
zone = _backlight_devices_device_zone_get(bd);
@ -415,10 +421,13 @@ _backlight_devices_edid_register(const char *dev, const char *edid)
if (!bd)
{
E_Zone *zone;
const char *id;
bd = calloc(1, sizeof(Backlight_Device));
if (!bd) return;
bd->edid = eina_stringshare_add(sc->info.edid);
id = sc->info.edid;
if (!id) id = "xxx";
bd->edid = eina_stringshare_add(id);
bd->output = eina_stringshare_add(sc->info.name);
_devices = eina_list_append(_devices, bd);
zone = _backlight_devices_device_zone_get(bd);

View File

@ -174,6 +174,7 @@ _light_add(const char *dev)
static Eina_Bool
_light_device_include(const char *dev)
{ // filter out known undesirable devices
fprintf(stderr, "BL: found [%s]\n", dev);
if (strstr(dev, "::capslock")) return EINA_FALSE;
if (strstr(dev, "::numlock")) return EINA_FALSE;
if (strstr(dev, "::scrolllock")) return EINA_FALSE;
@ -198,12 +199,14 @@ _light_refresh_devices()
const char *s;
devs = eeze_udev_find_by_filter("backlight", NULL, NULL);
fprintf(stderr, "BL: backlight devices...\n");
EINA_LIST_FREE(devs, s)
{
if (_light_device_include(s)) _light_add(s);
eina_stringshare_del(s);
}
devs = eeze_udev_find_by_filter("leds", NULL, NULL);
fprintf(stderr, "BL: led devices...\n");
EINA_LIST_FREE(devs, s)
{
if (_light_device_include(s)) _light_add(s);
@ -301,6 +304,7 @@ _cb_bklight_set(void *data EINA_UNUSED, const char *params)
if (!params) return;
if (sscanf(params, "%1023s %i", dev, &val) != 2) return;
eina_lock_take(&_devices_lock);
fprintf(stderr, "BL: set [%s] -> %i\n", dev, val);
lig = _light_find(dev);
if (!lig) goto done;
lig->val_set = val;