From 91969500deedeef3dbf782fc7684e976f3257892 Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Wed, 4 Feb 2015 21:02:17 +0900 Subject: [PATCH] e - randr2 - handle lid close/open as screen unplug/plug when your laptop lid opens/closes even if we dont get a randr event with a disconnect, the screen as logically been unplugged (you can't see it anymore) so we should treat it as if the screen is not connected. this fixes that. --- src/bin/e_randr2.c | 48 +++++++++++++++------------------------------- 1 file changed, 15 insertions(+), 33 deletions(-) diff --git a/src/bin/e_randr2.c b/src/bin/e_randr2.c index 40696523f..db568d179 100644 --- a/src/bin/e_randr2.c +++ b/src/bin/e_randr2.c @@ -3,6 +3,7 @@ #define E_RANDR_CONFIG_VERSION 1 ///////////////////////////////////////////////////////////////////////// +static Eina_Bool _screen_closed(E_Randr2_Screen *s); static void _animated_apply_abort(void); static Eina_Bool _cb_delay_timer(void *data); static Eina_Bool _cb_fade_animator(void *data); @@ -115,7 +116,6 @@ e_randr2_init(void) if ((e_randr2_cfg->restore) && (_config_screen_match_count(e_randr2, e_randr2_cfg) > 0)) { -// _config_update(e_randr2, e_randr2_cfg); _do_apply(); } else @@ -183,6 +183,14 @@ static int _target_from = 0; static int _target_to = 0; static Evas_Object *_fade_obj = NULL; +static Eina_Bool +_screen_closed(E_Randr2_Screen *s) +{ + if (!_lid_is_closed) return EINA_FALSE; + if (s->info.is_lid) return EINA_TRUE; + return EINA_FALSE; +} + static void _animated_apply_abort(void) { @@ -357,7 +365,7 @@ _config_update(E_Randr2 *r, E_Config_Randr2 *cfg) 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)) continue; + if ((!s->id) || (!s->info.connected) || (_screen_closed(s))) continue; cs = _config_screen_find(s, cfg); if (!cs) { @@ -397,7 +405,8 @@ _config_apply(E_Randr2 *r, E_Config_Randr2 *cfg) { printf("RRR: apply '%s'...\n", s->info.name); cs = NULL; - if (s->info.connected) cs = _config_screen_find(s, cfg); + if ((!_screen_closed(s)) && (s->info.connected)) + cs = _config_screen_find(s, cfg); printf("RRR: connected = %i\n", s->info.connected); if ((cs) && (cs->enabled)) { @@ -467,7 +476,8 @@ _config_screen_match_count(E_Randr2 *r, E_Config_Randr2 *cfg) if (!cs->id) continue; EINA_LIST_FOREACH(r->screens, ll, s) { - if ((!s->id) || (!s->info.connected)) continue; + if ((!s->id) || (!s->info.connected) || + (_screen_closed(s))) continue; if (!strcmp(cs->id, s->id)) count++; } } @@ -1367,35 +1377,7 @@ _mode_screen_find(Ecore_X_Window root, E_Randr2_Screen *s, Ecore_X_Randr_Output double refresh; modes = ecore_x_randr_output_modes_get(root, out, &modes_num, &modes_pref); - if (!modes) - { - printf("RRR: modes for '%s' FETCH FAILED!!!\n", s->info.name); -/* - for (i = 0; i < 500; i++) - { - printf("RRR: try %i\n", i); -// if (ecore_x_randr_output_connection_status_get(root, out) != -// ECORE_X_RANDR_CONNECTION_STATUS_CONNECTED) break; - ecore_x_sync(); - int n; - Ecore_X_Randr_Crtc *crtcs = ecore_x_randr_output_possible_crtcs_get(root, out, &n); - free(crtcs); - char *name = ecore_x_randr_output_name_get(root, out, &n); - free(name); - printf("RRR: conn: %i\n", ecore_x_randr_output_connection_status_get(root, out)); - int mw, mh; - ecore_x_randr_output_size_mm_get(root, out, &mw, &mh); - printf("RRR: bl: %1.2f\n", ecore_x_randr_output_backlight_level_get(root, out)); - ecore_x_randr_config_timestamp_get(root); - ecore_x_sync(); - ecore_x_randr_screen_current_size_get(root, NULL, NULL, NULL, NULL); - ecore_x_sync(); - modes = ecore_x_randr_output_modes_get(root, out, &modes_num, &modes_pref); - if (modes) break; - usleep(1000); - } - */ - } + if (!modes) printf("RRR: modes for '%s' FETCH FAILED!!!\n", s->info.name); printf("RRR: modes for '%s' are %p [%i]\n", s->info.name, modes, modes_num); if (modes) {