raster pushed a commit to branch master.

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

commit b55fa736ed02adfd47c3a255e93f9ab732c70385
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Mon Jun 15 22:27:34 2020 +0100

    randr - add option to ignore disconnects on specific screens...
    
    work around kvm's that like to disconenct screens... be able to force
    an ignore on disconnects on specific screens.
---
 src/bin/e_comp_x_randr.c                     |  1 +
 src/bin/e_randr2.c                           | 66 +++++++++++++++++++++++++---
 src/bin/e_randr2.h                           |  2 +
 src/modules/conf_randr/e_int_config_randr2.c | 42 ++++++++++++++----
 4 files changed, 96 insertions(+), 15 deletions(-)

diff --git a/src/bin/e_comp_x_randr.c b/src/bin/e_comp_x_randr.c
index da1b0759d..fd9f3f650 100644
--- a/src/bin/e_comp_x_randr.c
+++ b/src/bin/e_comp_x_randr.c
@@ -724,6 +724,7 @@ e_comp_x_randr_create(void)
         E_Randr2_Screen *s = calloc(1, sizeof(E_Randr2_Screen));
         if (!s) continue;
 
+        printf("RRR: NEW SCREEN ...\n");
         s->info.name = _output_name_get(root, outputs[i]);
         printf("RRR: .... out %s\n", s->info.name);
         if (!s->info.name)
diff --git a/src/bin/e_randr2.c b/src/bin/e_randr2.c
index 9b8f38357..643d399a1 100644
--- a/src/bin/e_randr2.c
+++ b/src/bin/e_randr2.c
@@ -72,6 +72,7 @@ e_randr2_init(void)
    E_CONFIG_VAL(D, T, priority, INT);
    E_CONFIG_VAL(D, T, rel_mode, UCHAR);
    E_CONFIG_VAL(D, T, enabled, UCHAR);
+   E_CONFIG_VAL(D, T, ignore_disconnect, UCHAR);
    E_CONFIG_VAL(D, T, profile, STR);
    E_CONFIG_VAL(D, T, scale_multiplier, DOUBLE);
 
@@ -154,12 +155,46 @@ e_randr2_config_apply(void)
    _animated_apply();
 }
 
+static E_Randr2_Screen *
+_randr_screen_find(E_Randr2 *r, E_Randr2_Screen *src)
+{
+   Eina_List *l;
+   E_Randr2_Screen *s;
+
+   EINA_LIST_FOREACH(r->screens, l, s)
+     {
+        if ((s->info.name) && (src->info.name) &&
+            (!strcmp(s->info.name, src->info.name)))
+          return s;
+     }
+   return NULL;
+}
+
+static void
+_randr_screen_props_copyover(E_Randr2 *rold, E_Randr2 *rnew)
+{
+   Eina_List *l;
+   E_Randr2_Screen *s, *s2;
+
+   // copy s->config.ignore_disconnect over from tr to e_randr2
+   EINA_LIST_FOREACH(rnew->screens, l, s)
+     {
+        s2 = _randr_screen_find(rold, s);
+        if (s2) s->config.ignore_disconnect = s2->config.ignore_disconnect;
+     }
+}
+
 E_API void
 e_randr2_screeninfo_update(void)
 {
+   E_Randr2 *tr = e_randr2;
    // re-fetch/update current screen info
-   _info_free(e_randr2);
    e_randr2 = e_comp->screen->create();
+   if ((tr) && (e_randr2))
+     {
+        _randr_screen_props_copyover(tr, e_randr2);
+        _info_free(tr);
+     }
    _screen_config_maxsize();
 }
 
@@ -265,10 +300,16 @@ _animated_apply(void)
 static void
 _do_apply(void)
 {
+   E_Randr2 *tr = e_randr2;
    // take current screen config and apply it to the driver
    printf("RRR: re-get info before applying..\n");
-   _info_free(e_randr2);
+   tr = e_randr2;
    e_randr2 = e_comp->screen->create();
+   if ((tr) && (e_randr2))
+     {
+        _randr_screen_props_copyover(tr, e_randr2);
+        _info_free(tr);
+     }
    _screen_config_maxsize();
    printf("RRR: apply config...\n");
    _config_apply(e_randr2, e_randr2_cfg);
@@ -381,8 +422,13 @@ _config_update(E_Randr2 *r, E_Config_Randr2 *cfg, 
Eina_Bool update_only)
    printf("--------------------------------------------------\n");
    EINA_LIST_FOREACH(r->screens, l, s)
      {
-        printf("RRR: out id=%s:  connected=%i\n", s->id, s->info.connected);
-        if ((!s->id) || (!s->info.connected) || (_screen_closed(s))) continue;
+        printf("RRR: out id=%s:  connected=%i enabled=%i configured=%i\n",
+               s->id, s->info.connected,
+               s->config.enabled, s->config.configured);
+        if (!s->id) continue;
+        if (!s->info.connected) continue;
+        if (_screen_closed(s)) continue;
+
         cs = e_randr2_config_screen_find(s, cfg);
         if (cs && update_only) continue;
         if (!cs)
@@ -469,6 +515,7 @@ _config_update(E_Randr2 *r, E_Config_Randr2 *cfg, Eina_Bool 
update_only)
                }
              printf("RRR: store scale mul %1.5f\n", cs->scale_multiplier);
              s->config.scale_multiplier = cs->scale_multiplier;
+             s->config.ignore_disconnect = cs->ignore_disconnect;
              ret = EINA_TRUE;
           }
      }
@@ -498,6 +545,8 @@ _config_really_apply(E_Randr2_Screen *s, 
E_Config_Randr2_Screen *cs)
         if (cs->profile) s->config.profile = strdup(cs->profile);
         else s->config.profile = NULL;
         s->config.scale_multiplier = cs->scale_multiplier;
+        s->config.ignore_disconnect = cs->ignore_disconnect;
+        printf("RRR: really apply '%s' ignore discon %i\n", s->info.name, 
s->config.ignore_disconnect);
      }
    else
      {
@@ -519,6 +568,7 @@ _config_really_apply(E_Randr2_Screen *s, 
E_Config_Randr2_Screen *cs)
         free(s->config.profile);
         s->config.profile = NULL;
         s->config.scale_multiplier = 0.0;
+        s->config.ignore_disconnect = EINA_FALSE;
      }
 }
 
@@ -546,7 +596,10 @@ _config_apply(E_Randr2 *r, E_Config_Randr2 *cfg)
         else
           {
              printf("RRR: ... disabled\n");
-             _config_really_apply(s, NULL);
+             if (!s->config.ignore_disconnect)
+               _config_really_apply(s, NULL);
+             else
+               printf("RRR: ... ignore disconnected\n");
           }
         s->config.configured = EINA_TRUE;
      }
@@ -734,6 +787,7 @@ _cb_screen_change_delay(void *data EINA_UNUSED)
         rtemp = e_comp->screen->create();
         if (rtemp)
           {
+             if (e_randr2) _randr_screen_props_copyover(e_randr2, rtemp);
              if (_screens_differ(e_randr2, rtemp)) change = EINA_TRUE;
              if (e_randr2_cfg->default_policy != E_RANDR2_POLICY_NONE)
                {
@@ -752,7 +806,7 @@ _cb_screen_change_delay(void *data EINA_UNUSED)
                     {
                        printf("RRR: is lid, lid++\n");
                        lid_screens++;
-                       if (s->info.lid_closed)
+                       if ((s->info.lid_closed) && 
(!s->config.ignore_disconnect))
                          {
                             printf("RRR: is lid, is closed, closed++\n");
                             close_lid_screens++;
diff --git a/src/bin/e_randr2.h b/src/bin/e_randr2.h
index 9d32e26c5..c693e631c 100644
--- a/src/bin/e_randr2.h
+++ b/src/bin/e_randr2.h
@@ -87,6 +87,7 @@ struct _E_Randr2_Screen
       int                   priority; // larger num == more important
       Eina_Bool             enabled E_BITFIELD; // should this monitor be 
enabled?
       Eina_Bool             configured E_BITFIELD; // has screen been 
configured by e?
+      Eina_Bool             ignore_disconnect E_BITFIELD; // ignore 
disconnects for this screen...
 
       char                 *profile; // profile name to use on this screen
       double                scale_multiplier; // if 0.0 - then dont multiply 
scale
@@ -115,6 +116,7 @@ struct _E_Config_Randr2_Screen
    int            priority;
    unsigned char  rel_mode;
    unsigned char  enabled;
+   unsigned char  ignore_disconnect;
 
    const char    *profile;
    double         scale_multiplier;
diff --git a/src/modules/conf_randr/e_int_config_randr2.c 
b/src/modules/conf_randr/e_int_config_randr2.c
index 1698e3b1e..85e569c7a 100644
--- a/src/modules/conf_randr/e_int_config_randr2.c
+++ b/src/modules/conf_randr/e_int_config_randr2.c
@@ -19,6 +19,7 @@ struct _E_Config_Dialog_Data
    Evas_Object *modes_obj;
    Evas_Object *rotations_obj;
    Evas_Object *enabled_obj;
+   Evas_Object *ignore_disconnect_obj;
    Evas_Object *priority_obj;
    Evas_Object *rel_mode_obj;
    Evas_Object *rel_to_obj;
@@ -442,6 +443,7 @@ _basic_screen_info_fill(E_Config_Dialog_Data *cfdata, 
E_Config_Randr2_Screen *cs
    elm_list_go(cfdata->rotations_obj);
 
    elm_check_state_set(cfdata->enabled_obj, cs->enabled);
+   elm_check_state_set(cfdata->ignore_disconnect_obj, cs->ignore_disconnect);
 
    elm_slider_value_set(cfdata->priority_obj, cs->priority);
 
@@ -745,6 +747,17 @@ _cb_enabled_changed(void *data, Evas_Object *obj, void 
*event EINA_UNUSED)
    e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE);
 }
 
+static void
+_cb_ignore_disconnect_changed(void *data, Evas_Object *obj, void *event 
EINA_UNUSED)
+{
+   E_Config_Dialog_Data *cfdata = data;
+   E_Config_Randr2_Screen *cs = _config_screen_find(cfdata);
+   if (!cs) return;
+   cs->ignore_disconnect = elm_check_state_get(obj);
+   printf("RR: ignore_disconnect = %i\n", cs->ignore_disconnect);
+   e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE);
+}
+
 static void
 _policy_text_update(E_Config_Dialog_Data *cfdata)
 {
@@ -861,6 +874,7 @@ _basic_create(E_Config_Dialog *cfd, Evas *evas EINA_UNUSED, 
E_Config_Dialog_Data
                   cs->priority = s->config.priority;
                   cs->rel_mode = s->config.relative.mode;
                   cs->enabled = s->config.enabled;
+                  cs->ignore_disconnect = s->config.ignore_disconnect;
                   if (s->config.profile)
                     cs->profile = eina_stringshare_add(s->config.profile);
                   cs->scale_multiplier = s->config.scale_multiplier;
@@ -965,6 +979,15 @@ _basic_create(E_Config_Dialog *cfd, Evas *evas 
EINA_UNUSED, E_Config_Dialog_Data
    evas_object_smart_callback_add(o, "changed", _cb_enabled_changed, cfdata);
    cfdata->enabled_obj = o;
 
+   o = elm_check_add(win);
+   evas_object_size_hint_weight_set(o, 0.0, 0.0);
+   evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
+   elm_object_text_set(o, _("Ignore Disconnect"));
+   elm_table_pack(tb, o, 2, 5, 1, 1);
+   evas_object_show(o);
+   evas_object_smart_callback_add(o, "changed", _cb_ignore_disconnect_changed, 
cfdata);
+   cfdata->ignore_disconnect_obj = o;
+
    o = elm_slider_add(win);
    evas_object_size_hint_weight_set(o, 0.0, 0.0);
    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
@@ -972,7 +995,7 @@ _basic_create(E_Config_Dialog *cfd, Evas *evas EINA_UNUSED, 
E_Config_Dialog_Data
    elm_slider_unit_format_set(o, "%3.0f");
    elm_slider_span_size_set(o, 100);
    elm_slider_min_max_set(o, 0, 100);
-   elm_table_pack(tb, o, 2, 5, 1, 1);
+   elm_table_pack(tb, o, 2, 6, 1, 1);
    evas_object_show(o);
    evas_object_smart_callback_add(o, "changed", _cb_priority_changed, cfdata);
    cfdata->priority_obj = o;
@@ -987,7 +1010,7 @@ _basic_create(E_Config_Dialog *cfd, Evas *evas 
EINA_UNUSED, E_Config_Dialog_Data
    elm_hoversel_item_add(o, _("Right of"), NULL, ELM_ICON_NONE, 
_cb_rel_mode_right_of, cfdata);
    elm_hoversel_item_add(o, _("Above"), NULL, ELM_ICON_NONE, 
_cb_rel_mode_above, cfdata);
    elm_hoversel_item_add(o, _("Below"), NULL, ELM_ICON_NONE, 
_cb_rel_mode_below, cfdata);
-   elm_table_pack(tb, o, 2, 6, 1, 1);
+   elm_table_pack(tb, o, 2, 7, 1, 1);
    evas_object_show(o);
    cfdata->rel_mode_obj = o;
 
@@ -1007,7 +1030,7 @@ _basic_create(E_Config_Dialog *cfd, Evas *evas 
EINA_UNUSED, E_Config_Dialog_Data
              cfdata->screen_items2 = eina_list_append(cfdata->screen_items2, 
it);
           }
      }
-   elm_table_pack(tb, o, 2, 7, 1, 1);
+   elm_table_pack(tb, o, 2, 8, 1, 1);
    evas_object_show(o);
    cfdata->rel_to_obj = o;
 
@@ -1018,7 +1041,7 @@ _basic_create(E_Config_Dialog *cfd, Evas *evas 
EINA_UNUSED, E_Config_Dialog_Data
    elm_slider_unit_format_set(o, "%1.1f");
    elm_slider_span_size_set(o, 100);
    elm_slider_min_max_set(o, 0.0, 1.0);
-   elm_table_pack(tb, o, 2, 8, 1, 1);
+   elm_table_pack(tb, o, 2, 9, 1, 1);
    evas_object_show(o);
    evas_object_smart_callback_add(o, "changed", _cb_rel_align_changed, cfdata);
    cfdata->rel_align_obj = o;
@@ -1028,14 +1051,14 @@ _basic_create(E_Config_Dialog *cfd, Evas *evas 
EINA_UNUSED, E_Config_Dialog_Data
    elm_separator_horizontal_set(o, EINA_TRUE);
    evas_object_size_hint_weight_set(o, 0.0, 0.0);
    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
-   elm_table_pack(tb, o, 2, 9, 1, 1);
+   elm_table_pack(tb, o, 2, 10, 1, 1);
    evas_object_show(o);
 
    o = elm_check_add(win);
    evas_object_size_hint_weight_set(o, 0.0, 0.0);
    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
    elm_object_text_set(o, _("Use Profile"));
-   elm_table_pack(tb, o, 2, 10, 1, 1);
+   elm_table_pack(tb, o, 2, 11, 1, 1);
    evas_object_show(o);
    cfdata->use_profile_obj = o;
    evas_object_smart_callback_add(o, "changed", _cb_profile_enabled_changed, 
cfdata);
@@ -1043,7 +1066,7 @@ _basic_create(E_Config_Dialog *cfd, Evas *evas 
EINA_UNUSED, E_Config_Dialog_Data
    o = elm_list_add(win);
    evas_object_size_hint_weight_set(o, 0.0, EVAS_HINT_EXPAND);
    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
-   elm_table_pack(tb, o, 2, 11, 1, 1);
+   elm_table_pack(tb, o, 2, 12, 1, 1);
    evas_object_show(o);
    cfdata->profile_list_obj = o;
 
@@ -1051,7 +1074,7 @@ _basic_create(E_Config_Dialog *cfd, Evas *evas 
EINA_UNUSED, E_Config_Dialog_Data
    evas_object_size_hint_weight_set(o, 0.0, 0.0);
    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
    elm_object_text_set(o, _("Custom Scale"));
-   elm_table_pack(tb, o, 2, 12, 1, 1);
+   elm_table_pack(tb, o, 2, 13, 1, 1);
    evas_object_show(o);
    cfdata->scale_custom_obj = o;
    evas_object_smart_callback_add(o, "changed", _cb_custom_scale_changed, 
cfdata);
@@ -1064,7 +1087,7 @@ _basic_create(E_Config_Dialog *cfd, Evas *evas 
EINA_UNUSED, E_Config_Dialog_Data
    elm_slider_span_size_set(o, 100);
    elm_slider_min_max_set(o, 0.5, 5.5);
    elm_slider_value_set(o, elm_config_scale_get());
-   elm_table_pack(tb, o, 2, 13, 1, 1);
+   elm_table_pack(tb, o, 2, 14, 1, 1);
    evas_object_show(o);
    cfdata->scale_value_obj = o;
    evas_object_smart_callback_add(o, "changed", _cb_scale_value_changed, 
cfdata);
@@ -1167,6 +1190,7 @@ _basic_apply(E_Config_Dialog *cfd EINA_UNUSED, 
E_Config_Dialog_Data *cfdata)
         cs->scale_multiplier = cs2->scale_multiplier;
         printf("APPLY %s .... rel mode %i\n", cs->id, cs->rel_mode);
         cs->enabled = cs2->enabled;
+        cs->ignore_disconnect = cs2->ignore_disconnect;
      }
    e_randr2_config_save();
    e_randr2_config_apply();

-- 


Reply via email to