Store desktop dimensions in screenInfo.

For Zaphod mode screen crossing handling we need to know the size of all
screens together (i.e. the whole desktop size). Store that in the screenInfo to
have it readily available in events.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Peter Hutterer 2011-09-07 14:04:10 +10:00
parent 9cbfa4739a
commit 8bebb4b489
8 changed files with 142 additions and 0 deletions

View File

@ -3898,6 +3898,8 @@ AddScreen(
return -1;
}
update_desktop_dimensions();
dixRegisterScreenPrivateKey(&cursorScreenDevPriv, pScreen, PRIVATE_CURSOR, 0);
return i;

View File

@ -628,6 +628,30 @@ point_on_screen(ScreenPtr pScreen, int x, int y)
}
/**
* Update desktop dimensions on the screenInfo struct.
*/
void
update_desktop_dimensions(void)
{
int i;
int x1 = INT_MAX, y1 = INT_MAX; /* top-left */
int x2 = INT_MIN, y2 = INT_MIN; /* bottom-right */
for (i = 0; i < screenInfo.numScreens; i++) {
ScreenPtr screen = screenInfo.screens[i];
x1 = min(x1, screen->x);
y1 = min(y1, screen->y);
x2 = max(x2, screen->x + screen->width);
y2 = max(y2, screen->y + screen->height);
}
screenInfo.x = x1;
screenInfo.y = y1;
screenInfo.width = x2 - x1;
screenInfo.height = y2 - y1;
}
/*
* Delete the element with the key from the list, freeing all memory
* associated with the element..
*/

View File

@ -838,6 +838,8 @@ xf86InitOrigins(void)
FillOutEdge(pLayout->down, pScreen->width);
}
}
update_desktop_dimensions();
}
void

View File

@ -313,6 +313,9 @@ xf86RandRSetConfig (ScreenPtr pScreen,
return FALSE;
}
update_desktop_dimensions();
/*
* Move the cursor back where it belongs; SwitchMode repositions it
* FIXME: duplicated code, see modes/xf86RandR12.c

View File

@ -736,6 +736,8 @@ xf86RandR12ScreenSetSize (ScreenPtr pScreen,
xf86SetViewport (pScreen, 0, 0);
finish:
update_desktop_dimensions();
if (pRoot && pScrn->vtSema)
(*pScrn->EnableDisableFBAccess) (pScreen->myNum, TRUE);
#if RANDR_12_INTERFACE

View File

@ -609,5 +609,6 @@ extern _X_EXPORT void input_option_set_key(InputOption *opt, const char* key);
extern _X_EXPORT void input_option_set_value(InputOption *opt, const char* value);
extern _X_HIDDEN Bool point_on_screen(ScreenPtr pScreen, int x, int y);
extern _X_HIDDEN void update_desktop_dimensions(void);
#endif /* INPUT_H */

View File

@ -561,6 +561,10 @@ typedef struct _ScreenInfo {
formats[MAXFORMATS];
int numScreens;
ScreenPtr screens[MAXSCREENS];
int x; /* origin */
int y; /* origin */
int width; /* total width of all screens together */
int height; /* total height of all screens together */
} ScreenInfo;
extern _X_EXPORT ScreenInfo screenInfo;

View File

@ -27,6 +27,9 @@
#include <stdint.h>
#include "misc.h"
#include "scrnintstr.h"
ScreenInfo screenInfo;
static void dix_version_compare(void)
{
@ -54,9 +57,110 @@ static void dix_version_compare(void)
assert(rc < 0);
}
static void dix_update_desktop_dimensions(void)
{
int i;
int x, y, w, h;
int w2, h2;
ScreenRec screens[MAXSCREENS];
for (i = 0; i < MAXSCREENS; i++)
screenInfo.screens[i] = &screens[i];
x = 0;
y = 0;
w = 10;
h = 5;
w2 = 35;
h2 = 25;
#define assert_dimensions(_x, _y, _w, _h) \
update_desktop_dimensions(); \
printf("%d %d %d %d\n", screenInfo.x, screenInfo.y, screenInfo.width, screenInfo.height); \
assert(screenInfo.x == _x); \
assert(screenInfo.y == _y); \
assert(screenInfo.width == _w); \
assert(screenInfo.height == _h);
#define set_screen(idx, _x, _y, _w, _h) \
screenInfo.screens[idx]->x = _x; \
screenInfo.screens[idx]->y = _y; \
screenInfo.screens[idx]->width = _w; \
screenInfo.screens[idx]->height = _h; \
printf("Testing\n");
/* single screen */
screenInfo.numScreens = 1;
set_screen(0, x, y, w, h);
assert_dimensions(x, y, w, h);
/* dualhead rightof */
screenInfo.numScreens = 2;
set_screen(1, w, 0, w2, h2);
assert_dimensions(x, y, w + w2, h2);
/* dualhead belowof */
screenInfo.numScreens = 2;
set_screen(1, 0, h, w2, h2);
assert_dimensions(x, y, w2, h + h2);
/* triplehead L shape */
screenInfo.numScreens = 3;
set_screen(1, 0, h, w2, h2);
set_screen(2, w2, h2, w, h);
assert_dimensions(x, y, w + w2, h + h2);
/* quadhead 2x2 */
screenInfo.numScreens = 4;
set_screen(1, 0, h, w, h);
set_screen(2, w, h, w, h2);
set_screen(3, w, 0, w2, h);
assert_dimensions(x, y, w + w2, h + h2);
/* quadhead horiz line */
screenInfo.numScreens = 4;
set_screen(1, w, 0, w, h);
set_screen(2, 2 * w, 0, w, h);
set_screen(3, 3 * w, 0, w, h);
assert_dimensions(x, y, 4 * w, h);
/* quadhead vert line */
screenInfo.numScreens = 4;
set_screen(1, 0, h, w, h);
set_screen(2, 0, 2 * h, w, h);
set_screen(3, 0, 3 * h, w, h);
assert_dimensions(x, y, w, 4 * h);
/* x overlap */
screenInfo.numScreens = 2;
set_screen(0, 0, 0, w2, h2);
set_screen(1, w, 0, w2, h2);
assert_dimensions(x, y, w2 + w, h2);
/* y overlap */
screenInfo.numScreens = 2;
set_screen(0, 0, 0, w2, h2);
set_screen(1, 0, h, w2, h2);
assert_dimensions(x, y, w2, h2 + h);
/* negative origin */
screenInfo.numScreens = 1;
set_screen(0, -w2, -h2, w, h);
assert_dimensions(-w2, -h2, w, h);
/* dualhead negative origin, overlap */
screenInfo.numScreens = 2;
set_screen(0, -w2, -h2, w2, h2);
set_screen(1, -w, -h, w, h);
assert_dimensions(-w2, -h2, w2, h2);
}
int main(int argc, char** argv)
{
dix_version_compare();
dix_update_desktop_dimensions();
return 0;
}