mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2026-05-08 11:28:03 +02:00
Traditional xinerama extension support. Based on patch by Jurg Billeter.
This commit is contained in:
parent
526238a26d
commit
1978343ef4
1 changed files with 181 additions and 1 deletions
|
|
@ -44,6 +44,11 @@
|
||||||
#include "randrstr.h"
|
#include "randrstr.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef PANORAMIX
|
||||||
|
#include <X11/extensions/panoramiXproto.h>
|
||||||
|
#include "extnsionst.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
@ -507,6 +512,170 @@ xglxEnqueueEvents (void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef PANORAMIX
|
||||||
|
|
||||||
|
static int xglxXineramaGeneration = -1;
|
||||||
|
|
||||||
|
static void
|
||||||
|
xglxXineramaResetProc (ExtensionEntry *extEntry)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
xglxProcXineramaQueryVersion (ClientPtr client)
|
||||||
|
{
|
||||||
|
xPanoramiXQueryVersionReply rep;
|
||||||
|
register int n;
|
||||||
|
int majorVersion, minorVersion;
|
||||||
|
|
||||||
|
REQUEST_SIZE_MATCH (xPanoramiXQueryVersionReq);
|
||||||
|
|
||||||
|
XineramaQueryVersion (xdisplay, &majorVersion, &minorVersion);
|
||||||
|
|
||||||
|
rep.type = X_Reply;
|
||||||
|
rep.length = 0;
|
||||||
|
rep.sequenceNumber = client->sequence;
|
||||||
|
rep.majorVersion = majorVersion;
|
||||||
|
rep.minorVersion = minorVersion;
|
||||||
|
|
||||||
|
if (client->swapped)
|
||||||
|
{
|
||||||
|
swaps (&rep.sequenceNumber, n);
|
||||||
|
swapl (&rep.length, n);
|
||||||
|
swaps (&rep.majorVersion, n);
|
||||||
|
swaps (&rep.minorVersion, n);
|
||||||
|
}
|
||||||
|
|
||||||
|
WriteToClient (client, sizeof (xPanoramiXQueryVersionReply), (char *) &rep);
|
||||||
|
|
||||||
|
return client->noClientException;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
xglxProcXineramaIsActive (ClientPtr client)
|
||||||
|
{
|
||||||
|
xXineramaIsActiveReply rep;
|
||||||
|
|
||||||
|
REQUEST_SIZE_MATCH (xXineramaIsActiveReq);
|
||||||
|
|
||||||
|
rep.type = X_Reply;
|
||||||
|
rep.length = 0;
|
||||||
|
rep.sequenceNumber = client->sequence;
|
||||||
|
rep.state = XineramaIsActive (xdisplay);
|
||||||
|
|
||||||
|
if (client->swapped)
|
||||||
|
{
|
||||||
|
register int n;
|
||||||
|
|
||||||
|
swaps (&rep.sequenceNumber, n);
|
||||||
|
swapl (&rep.length, n);
|
||||||
|
swapl (&rep.state, n);
|
||||||
|
}
|
||||||
|
|
||||||
|
WriteToClient (client, sizeof (xXineramaIsActiveReply), (char *) &rep);
|
||||||
|
|
||||||
|
return client->noClientException;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
xglxProcXineramaQueryScreens (ClientPtr client)
|
||||||
|
{
|
||||||
|
xXineramaQueryScreensReply rep;
|
||||||
|
xXineramaScreenInfo scratch;
|
||||||
|
XineramaScreenInfo *info;
|
||||||
|
int n;
|
||||||
|
|
||||||
|
REQUEST_SIZE_MATCH (xXineramaQueryScreensReq);
|
||||||
|
|
||||||
|
info = XineramaQueryScreens (xdisplay, &n);
|
||||||
|
|
||||||
|
rep.type = X_Reply;
|
||||||
|
rep.sequenceNumber = client->sequence;
|
||||||
|
rep.number = n;
|
||||||
|
rep.length = n * sz_XineramaScreenInfo >> 2;
|
||||||
|
|
||||||
|
if (client->swapped)
|
||||||
|
{
|
||||||
|
register int n;
|
||||||
|
|
||||||
|
swaps (&rep.sequenceNumber, n);
|
||||||
|
swapl (&rep.length, n);
|
||||||
|
swapl (&rep.number, n);
|
||||||
|
}
|
||||||
|
|
||||||
|
WriteToClient (client, sizeof (xXineramaQueryScreensReply), (char *) &rep);
|
||||||
|
|
||||||
|
if (info)
|
||||||
|
{
|
||||||
|
xXineramaScreenInfo scratch;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < rep.number; i++)
|
||||||
|
{
|
||||||
|
scratch.x_org = info[i].x_org;
|
||||||
|
scratch.y_org = info[i].y_org;
|
||||||
|
scratch.width = info[i].width;
|
||||||
|
scratch.height = info[i].height;
|
||||||
|
|
||||||
|
if (client->swapped)
|
||||||
|
{
|
||||||
|
register int n;
|
||||||
|
|
||||||
|
swaps (&scratch.x_org, n);
|
||||||
|
swaps (&scratch.y_org, n);
|
||||||
|
swaps (&scratch.width, n);
|
||||||
|
swaps (&scratch.height, n);
|
||||||
|
}
|
||||||
|
|
||||||
|
WriteToClient (client, sz_XineramaScreenInfo, (char *) &scratch);
|
||||||
|
}
|
||||||
|
|
||||||
|
XFree (info);
|
||||||
|
}
|
||||||
|
|
||||||
|
return client->noClientException;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
xglxProcXineramaDispatch (ClientPtr client)
|
||||||
|
{
|
||||||
|
REQUEST (xReq);
|
||||||
|
|
||||||
|
switch (stuff->data) {
|
||||||
|
case X_PanoramiXQueryVersion:
|
||||||
|
return xglxProcXineramaQueryVersion (client);
|
||||||
|
case X_XineramaIsActive:
|
||||||
|
return xglxProcXineramaIsActive (client);
|
||||||
|
case X_XineramaQueryScreens:
|
||||||
|
return xglxProcXineramaQueryScreens (client);
|
||||||
|
}
|
||||||
|
|
||||||
|
return BadRequest;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Bool
|
||||||
|
xglxXineramaInit (void)
|
||||||
|
{
|
||||||
|
ExtensionEntry *extEntry;
|
||||||
|
|
||||||
|
if (xglxXineramaGeneration != serverGeneration)
|
||||||
|
{
|
||||||
|
extEntry = AddExtension (PANORAMIX_PROTOCOL_NAME, 0,0,
|
||||||
|
xglxProcXineramaDispatch,
|
||||||
|
xglxProcXineramaDispatch,
|
||||||
|
xglxXineramaResetProc,
|
||||||
|
StandardMinorOpcode);
|
||||||
|
if (!extEntry)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
xglxXineramaGeneration = serverGeneration;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
xglxConstrainCursor (ScreenPtr pScreen,
|
xglxConstrainCursor (ScreenPtr pScreen,
|
||||||
BoxPtr pBox)
|
BoxPtr pBox)
|
||||||
|
|
@ -1061,6 +1230,11 @@ xglxInitOutput (ScreenInfo *pScreenInfo,
|
||||||
|
|
||||||
xglxScreenFormat = format;
|
xglxScreenFormat = format;
|
||||||
|
|
||||||
|
#ifdef PANORAMIX
|
||||||
|
if (!noPanoramiXExtension)
|
||||||
|
xglxXineramaInit ();
|
||||||
|
#endif
|
||||||
|
|
||||||
for (i = 0; i < numScreen; i++)
|
for (i = 0; i < numScreen; i++)
|
||||||
AddScreen (xglxScreenInit, argc, argv);
|
AddScreen (xglxScreenInit, argc, argv);
|
||||||
}
|
}
|
||||||
|
|
@ -1618,7 +1792,13 @@ xglxOsVendorInit (void)
|
||||||
preferBlanking, allowExposures);
|
preferBlanking, allowExposures);
|
||||||
XResetScreenSaver (xdisplay);
|
XResetScreenSaver (xdisplay);
|
||||||
|
|
||||||
if (XineramaIsActive (xdisplay))
|
if (XineramaIsActive (xdisplay)
|
||||||
|
|
||||||
|
#ifdef PANORAMIX
|
||||||
|
&& noPanoramiXExtension
|
||||||
|
#endif
|
||||||
|
|
||||||
|
)
|
||||||
{
|
{
|
||||||
XineramaScreenInfo *info;
|
XineramaScreenInfo *info;
|
||||||
int nInfo = 0;
|
int nInfo = 0;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue