From da4d1ecfe8626f4afd6af521366974f19862b2f0 Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Thu, 9 Apr 2015 15:44:07 +0900 Subject: [PATCH] add options to randr2 to ignore acpi and hotplug randr events. --- src/bin/e_randr2.c | 30 ++++++++--- src/bin/e_randr2.h | 2 + src/modules/conf_randr/e_int_config_randr2.c | 55 ++++++++++++++++++-- 3 files changed, 77 insertions(+), 10 deletions(-) diff --git a/src/bin/e_randr2.c b/src/bin/e_randr2.c index 698b8193c..3b1c77b63 100644 --- a/src/bin/e_randr2.c +++ b/src/bin/e_randr2.c @@ -97,6 +97,8 @@ e_randr2_init(void) E_CONFIG_VAL(D, T, version, INT); E_CONFIG_LIST(D, T, screens, _e_randr2_cfg_screen_edd); E_CONFIG_VAL(D, T, restore, UCHAR); + E_CONFIG_VAL(D, T, ignore_hotplug_events, UCHAR); + E_CONFIG_VAL(D, T, ignore_acpi_events, UCHAR); if (!E_EVENT_RANDR_CHANGE) E_EVENT_RANDR_CHANGE = ecore_event_type_new(); // delay setting up acpi handler, as acpi is init'ed after randr @@ -336,6 +338,8 @@ _config_load(void) cfg->version = E_RANDR_CONFIG_VERSION; cfg->screens = NULL; cfg->restore = 1; + cfg->ignore_hotplug_events = 0; + cfg->ignore_acpi_events = 0; printf("RRR: fresh config\n"); return cfg; } @@ -620,8 +624,11 @@ _cb_acpi(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) if (lid_closed == _lid_is_closed) return EINA_TRUE; printf("RRR: lid event for lid %i\n", lid_closed); _lid_is_closed = lid_closed; - event_screen = EINA_TRUE; - _screen_change_delay(); + if (!e_randr2_cfg->ignore_acpi_events) + { + event_screen = EINA_TRUE; + _screen_change_delay(); + } return EINA_TRUE; } @@ -1412,11 +1419,14 @@ _cb_screen_change(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) { Ecore_X_Event_Screen_Change *ev = event; printf("RRR: CB screen change...\n"); - event_screen = EINA_TRUE; ecore_x_randr_config_timestamp_get(ev->root); ecore_x_randr_screen_current_size_get(ev->root, NULL, NULL, NULL, NULL); ecore_x_sync(); - _screen_change_delay(); + if (!e_randr2_cfg->ignore_hotplug_events) + { + event_screen = EINA_TRUE; + _screen_change_delay(); + } return EINA_TRUE; } @@ -1428,7 +1438,10 @@ _cb_crtc_change(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) ecore_x_randr_config_timestamp_get(ev->win); ecore_x_randr_screen_current_size_get(ev->win, NULL, NULL, NULL, NULL); ecore_x_sync(); - _screen_change_delay(); + if (!e_randr2_cfg->ignore_hotplug_events) + { + _screen_change_delay(); + } return EINA_TRUE; } @@ -1437,11 +1450,14 @@ _cb_output_change(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) { Ecore_X_Event_Randr_Output_Change *ev = event; printf("RRR: CB output change...\n"); - event_screen = EINA_TRUE; ecore_x_randr_config_timestamp_get(ev->win); ecore_x_randr_screen_current_size_get(ev->win, NULL, NULL, NULL, NULL); ecore_x_sync(); - _screen_change_delay(); + if (!e_randr2_cfg->ignore_hotplug_events) + { + event_screen = EINA_TRUE; + _screen_change_delay(); + } return EINA_TRUE; } diff --git a/src/bin/e_randr2.h b/src/bin/e_randr2.h index ab7aa0b44..41480cc54 100644 --- a/src/bin/e_randr2.h +++ b/src/bin/e_randr2.h @@ -91,6 +91,8 @@ struct _E_Config_Randr2 int version; Eina_List *screens; unsigned char restore; + unsigned char ignore_hotplug_events; + unsigned char ignore_acpi_events; }; struct _E_Config_Randr2_Screen diff --git a/src/modules/conf_randr/e_int_config_randr2.c b/src/modules/conf_randr/e_int_config_randr2.c index f823fdb67..78a99d432 100644 --- a/src/modules/conf_randr/e_int_config_randr2.c +++ b/src/modules/conf_randr/e_int_config_randr2.c @@ -23,6 +23,8 @@ struct _E_Config_Dialog_Data Evas_Object *rel_to_obj; Evas_Object *rel_align_obj; int restore; + int hotplug; + int acpi; int screen; }; @@ -79,6 +81,8 @@ _create_data(E_Config_Dialog *cfd EINA_UNUSED) if (!(cfdata = E_NEW(E_Config_Dialog_Data, 1))) return NULL; cfdata->restore = e_randr2_cfg->restore; + cfdata->hotplug = !e_randr2_cfg->ignore_hotplug_events; + cfdata->acpi = !e_randr2_cfg->ignore_acpi_events; return cfdata; } @@ -108,6 +112,22 @@ _cb_restore_changed(void *data EINA_UNUSED, Evas_Object *obj, void *event EINA_U e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE); } +static void +_cb_hotplug_changed(void *data EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED) +{ + E_Config_Dialog_Data *cfdata = data; + cfdata->hotplug = elm_check_state_get(obj); + e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE); +} + +static void +_cb_acpi_changed(void *data EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED) +{ + E_Config_Dialog_Data *cfdata = data; + cfdata->acpi = elm_check_state_get(obj); + e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE); +} + static E_Config_Randr2_Screen * _config_screen_find(E_Config_Dialog_Data *cfdata) { @@ -493,7 +513,7 @@ static Evas_Object * _basic_create(E_Config_Dialog *cfd, Evas *evas EINA_UNUSED, E_Config_Dialog_Data *cfdata) { Evas_Object *win = cfd->dia->win; - Evas_Object *o, *bx, *tb; + Evas_Object *o, *bx, *tb, *bx2; Eina_List *l; E_Randr2_Screen *s, *first = NULL; E_Config_Randr2_Screen *first_cfg = NULL; @@ -687,15 +707,41 @@ _basic_create(E_Config_Dialog *cfd, Evas *evas EINA_UNUSED, E_Config_Dialog_Data _basic_screen_info_fill(cfdata, first_cfg, first); + o = elm_box_add(win); + elm_box_horizontal_set(o, EINA_TRUE); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(o, 0.0, EVAS_HINT_FILL); + elm_box_pack_end(bx, o); + evas_object_show(o); + bx2 = o; + o = elm_check_add(win); evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_object_text_set(o, "Restore setup on start"); - elm_check_state_set(o, e_randr2_cfg->restore); - elm_box_pack_end(bx, o); + elm_check_state_set(o, cfdata->restore); + elm_box_pack_end(bx2, o); evas_object_show(o); evas_object_smart_callback_add(o, "changed", _cb_restore_changed, cfdata); + o = elm_check_add(win); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(o, "Monitor hotplug"); + elm_check_state_set(o, cfdata->hotplug); + elm_box_pack_end(bx2, o); + evas_object_show(o); + evas_object_smart_callback_add(o, "changed", _cb_hotplug_changed, cfdata); + + o = elm_check_add(win); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(o, "Lid Events"); + elm_check_state_set(o, cfdata->acpi); + elm_box_pack_end(bx2, o); + evas_object_show(o); + evas_object_smart_callback_add(o, "changed", _cb_acpi_changed, cfdata); + evas_smart_objects_calculate(evas_object_evas_get(win)); e_util_win_auto_resize_fill(win); @@ -711,6 +757,9 @@ _basic_apply(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata) E_Config_Randr2_Screen *cs, *cs2; e_randr2_cfg->restore = cfdata->restore; + e_randr2_cfg->ignore_hotplug_events = !cfdata->hotplug; + e_randr2_cfg->ignore_acpi_events = !cfdata->acpi; + printf("APPLY....................\n"); EINA_LIST_FOREACH(cfdata->screens, l, cs2) {