Commit 8bebb4b4 authored by Peter Hutterer's avatar Peter Hutterer

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's avatarPeter Hutterer <peter.hutterer@who-t.net>
parent 9cbfa473
......@@ -3898,6 +3898,8 @@ AddScreen(
return -1;
}
update_desktop_dimensions();
dixRegisterScreenPrivateKey(&cursorScreenDevPriv, pScreen, PRIVATE_CURSOR, 0);
return i;
......
......@@ -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..
*/
......
......@@ -838,6 +838,8 @@ xf86InitOrigins(void)
FillOutEdge(pLayout->down, pScreen->width);
}
}
update_desktop_dimensions();
}
void
......
......@@ -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
......
......@@ -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
......
......@@ -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 */
......@@ -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;
......
......@@ -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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment