fix xinerama detection to handle bad xinerama info and ignore overlapping

"subset" regions and re-order xinerama screens to skip bad ones and order
them from biggest to smallest.


SVN revision: 32093
This commit is contained in:
Carsten Haitzler 2007-10-16 15:34:07 +00:00
parent d6d08445e2
commit d5942ea076
1 changed files with 31 additions and 8 deletions

View File

@ -5,6 +5,7 @@
static void _e_xinerama_clean(void);
static void _e_xinerama_update(void);
static int _e_xinerama_cb_screen_sort(void *data1, void *data2);
static Evas_List *all_screens = NULL;
static Evas_List *chosen_screens = NULL;
@ -85,6 +86,7 @@ _e_xinerama_update(void)
int n;
Ecore_X_Window *roots;
Evas_List *l;
int sorted;
roots = ecore_x_window_root_list(&n);
if (roots)
@ -170,11 +172,11 @@ _e_xinerama_update(void)
sz = scr->w * scr->h;
sz2 = scr2->w * scr2->h;
/* if the one we already have is bigger, DONT add the new */
if (sz2 >= sz)
add = 0;
if (sz > sz2)
removes = evas_list_append(removes, scr2);
/* add the old to a list to remove */
else
removes = evas_list_append(removes, scr);
add = 0;
}
}
/* if there are screens to remove - remove them */
@ -185,10 +187,31 @@ _e_xinerama_update(void)
}
/* if this screen is to be added, add it */
if (add)
{
printf("E17 INIT: XINERAMA CHOSEN: [%i], %ix%i+%i+%i\n",
scr->screen, scr->w, scr->h, scr->x, scr->y);
chosen_screens = evas_list_append(chosen_screens, scr);
}
chosen_screens = evas_list_append(chosen_screens, scr);
}
chosen_screens = evas_list_sort(chosen_screens,
evas_list_count(chosen_screens),
_e_xinerama_cb_screen_sort);
for (n = 0, l = chosen_screens; l; l = l->next, n++)
{
E_Screen *scr;
scr = l->data;
printf("E17 INIT: XINERAMA CHOSEN: [%i], %ix%i+%i+%i\n",
scr->screen, scr->w, scr->h, scr->x, scr->y);
scr->screen = n;
}
}
static int
_e_xinerama_cb_screen_sort(void *data1, void *data2)
{
E_Screen *scr, *scr2;
int dif;
scr = data1;
scr2 = data2;
dif = (scr2->w * scr2->h) - (scr->w * scr->h);
if (dif == 0) return scr->screen - scr2->screen;
return dif;
}