add options to randr2 to ignore acpi and hotplug randr events.

This commit is contained in:
Carsten Haitzler 2015-04-09 15:44:07 +09:00
parent a73d2583c5
commit da4d1ecfe8
3 changed files with 77 additions and 10 deletions

View File

@ -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;
}

View File

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

View File

@ -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)
{