2003-11-14 15:54:54 +00:00
|
|
|
/*
|
|
|
|
|
|
|
|
|
|
Copyright 1993 by Davor Matic
|
|
|
|
|
|
|
|
|
|
Permission to use, copy, modify, distribute, and sell this software
|
|
|
|
|
and its documentation for any purpose is hereby granted without fee,
|
|
|
|
|
provided that the above copyright notice appear in all copies and that
|
|
|
|
|
both that copyright notice and this permission notice appear in
|
|
|
|
|
supporting documentation. Davor Matic makes no representations about
|
|
|
|
|
the suitability of this software for any purpose. It is provided "as
|
|
|
|
|
is" without express or implied warranty.
|
|
|
|
|
|
|
|
|
|
*/
|
2024-07-30 13:09:49 +02:00
|
|
|
#include <dix-config.h>
|
2005-07-14 03:36:44 +00:00
|
|
|
|
2011-10-10 12:09:39 -07:00
|
|
|
#include <string.h>
|
|
|
|
|
#include <errno.h>
|
|
|
|
|
|
2003-11-14 16:49:22 +00:00
|
|
|
#include <X11/X.h>
|
|
|
|
|
#include <X11/Xproto.h>
|
2024-02-23 17:26:57 +01:00
|
|
|
|
2025-02-14 14:56:21 +01:00
|
|
|
#include "os/client_priv.h"
|
2024-02-23 17:26:57 +01:00
|
|
|
|
2003-11-14 15:54:54 +00:00
|
|
|
#include "screenint.h"
|
|
|
|
|
#include "input.h"
|
2005-07-03 08:53:54 +00:00
|
|
|
#include "misc.h"
|
2003-11-14 15:54:54 +00:00
|
|
|
#include "scrnintstr.h"
|
|
|
|
|
#include "servermd.h"
|
|
|
|
|
|
|
|
|
|
#include "Xnest.h"
|
|
|
|
|
|
|
|
|
|
#include "Display.h"
|
|
|
|
|
#include "Init.h"
|
|
|
|
|
#include "Args.h"
|
|
|
|
|
|
|
|
|
|
#include "icon"
|
|
|
|
|
#include "screensaver"
|
|
|
|
|
|
|
|
|
|
Display *xnestDisplay = NULL;
|
|
|
|
|
XVisualInfo *xnestVisuals;
|
|
|
|
|
int xnestNumVisuals;
|
|
|
|
|
int xnestDefaultVisualIndex;
|
|
|
|
|
Colormap *xnestDefaultColormaps;
|
xnest: Display: fix xallocarray() compiler warning
Compiler warning:
[7/29] Compiling C object hw/xnest/Xnest.p/Display.c.o
In file included from ../include/misc.h:119,
from ../include/screenint.h:50,
from ../hw/xnest/Display.c:24:
../hw/xnest/Display.c: In function ‘xnestOpenDisplay’:
../include/os.h:81:32: warning: argument 2 range [2147483648, 4294967295] exceeds maximum object size 2147483647 [-Walloc-size-larger-than=]
81 | #define xallocarray(num, size) reallocarray(NULL, (num), (size))
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../hw/xnest/Display.c:124:29: note: in expansion of macro ‘xallocarray’
124 | xnestDefaultColormaps = xallocarray(xnestNumDefaultColormaps,
| ^~~~~~~~~~~
In file included from ../include/os.h:54:
/usr/include/stdlib.h:582:14: note: in a call to allocation function ‘reallocarray’ declared here
582 | extern void *reallocarray (void *__ptr, size_t __nmemb, size_t __size)
| ^~~~~~~~~~~~
Since we really don't need more than 2^16 colormaps, using uint16_t here
to silence this warning.
Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1392>
2024-02-09 15:51:04 +01:00
|
|
|
static uint16_t xnestNumDefaultColormaps;
|
2003-11-14 15:54:54 +00:00
|
|
|
int *xnestDepths;
|
|
|
|
|
int xnestNumDepths;
|
|
|
|
|
XPixmapFormatValues *xnestPixmapFormats;
|
|
|
|
|
int xnestNumPixmapFormats;
|
|
|
|
|
Pixel xnestBlackPixel;
|
|
|
|
|
Pixel xnestWhitePixel;
|
|
|
|
|
Drawable xnestDefaultDrawables[MAXDEPTH + 1];
|
|
|
|
|
Pixmap xnestIconBitmap;
|
|
|
|
|
Pixmap xnestScreenSaverPixmap;
|
|
|
|
|
XlibGC xnestBitmapGC;
|
|
|
|
|
unsigned long xnestEventMask;
|
|
|
|
|
|
2011-10-10 12:09:39 -07:00
|
|
|
static int _X_NORETURN
|
|
|
|
|
x_io_error_handler(Display * dpy)
|
|
|
|
|
{
|
|
|
|
|
ErrorF("Lost connection to X server: %s\n", strerror(errno));
|
|
|
|
|
CloseWellKnownConnections();
|
|
|
|
|
OsCleanup(1);
|
|
|
|
|
exit(1);
|
|
|
|
|
}
|
|
|
|
|
|
2003-11-25 19:29:01 +00:00
|
|
|
void
|
|
|
|
|
xnestOpenDisplay(int argc, char *argv[])
|
2003-11-14 15:54:54 +00:00
|
|
|
{
|
|
|
|
|
XVisualInfo vi;
|
|
|
|
|
long mask;
|
|
|
|
|
int i, j;
|
2012-03-21 12:55:09 -07:00
|
|
|
|
2003-11-14 15:54:54 +00:00
|
|
|
if (!xnestDoFullGeneration)
|
|
|
|
|
return;
|
2012-03-21 12:55:09 -07:00
|
|
|
|
2011-10-10 12:09:39 -07:00
|
|
|
XSetIOErrorHandler(x_io_error_handler);
|
2012-03-21 12:55:09 -07:00
|
|
|
|
2003-11-14 15:54:54 +00:00
|
|
|
xnestCloseDisplay();
|
2012-03-21 12:55:09 -07:00
|
|
|
|
2003-11-14 15:54:54 +00:00
|
|
|
xnestDisplay = XOpenDisplay(xnestDisplayName);
|
|
|
|
|
if (xnestDisplay == NULL)
|
|
|
|
|
FatalError("Unable to open display \"%s\".\n",
|
|
|
|
|
XDisplayName(xnestDisplayName));
|
2012-03-21 12:55:09 -07:00
|
|
|
|
2003-11-14 15:54:54 +00:00
|
|
|
if (xnestSynchronize)
|
2024-08-21 16:53:50 +02:00
|
|
|
XSynchronize(xnestDisplay, TRUE);
|
2012-03-21 12:55:09 -07:00
|
|
|
|
2003-11-14 15:54:54 +00:00
|
|
|
mask = VisualScreenMask;
|
|
|
|
|
vi.screen = DefaultScreen(xnestDisplay);
|
|
|
|
|
xnestVisuals = XGetVisualInfo(xnestDisplay, mask, &vi, &xnestNumVisuals);
|
|
|
|
|
if (xnestNumVisuals == 0 || xnestVisuals == NULL)
|
|
|
|
|
FatalError("Unable to find any visuals.\n");
|
2012-03-21 12:55:09 -07:00
|
|
|
|
2003-11-14 15:54:54 +00:00
|
|
|
if (xnestUserDefaultClass || xnestUserDefaultDepth) {
|
|
|
|
|
xnestDefaultVisualIndex = UNDEFINED;
|
|
|
|
|
for (i = 0; i < xnestNumVisuals; i++)
|
|
|
|
|
if ((!xnestUserDefaultClass ||
|
|
|
|
|
xnestVisuals[i].class == xnestDefaultClass)
|
|
|
|
|
&&
|
|
|
|
|
(!xnestUserDefaultDepth ||
|
|
|
|
|
xnestVisuals[i].depth == xnestDefaultDepth)) {
|
|
|
|
|
xnestDefaultVisualIndex = i;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (xnestDefaultVisualIndex == UNDEFINED)
|
2003-11-14 16:49:22 +00:00
|
|
|
FatalError("Unable to find desired default visual.\n");
|
2003-11-14 15:54:54 +00:00
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
vi.visualid = XVisualIDFromVisual(DefaultVisual(xnestDisplay,
|
|
|
|
|
DefaultScreen
|
|
|
|
|
(xnestDisplay)));
|
|
|
|
|
xnestDefaultVisualIndex = 0;
|
|
|
|
|
for (i = 0; i < xnestNumVisuals; i++)
|
|
|
|
|
if (vi.visualid == xnestVisuals[i].visualid)
|
|
|
|
|
xnestDefaultVisualIndex = i;
|
|
|
|
|
}
|
2012-03-21 12:55:09 -07:00
|
|
|
|
2003-11-14 15:54:54 +00:00
|
|
|
xnestNumDefaultColormaps = xnestNumVisuals;
|
2015-03-21 17:23:33 -07:00
|
|
|
xnestDefaultColormaps = xallocarray(xnestNumDefaultColormaps,
|
|
|
|
|
sizeof(Colormap));
|
2003-11-14 15:54:54 +00:00
|
|
|
for (i = 0; i < xnestNumDefaultColormaps; i++)
|
|
|
|
|
xnestDefaultColormaps[i] = XCreateColormap(xnestDisplay,
|
|
|
|
|
DefaultRootWindow
|
|
|
|
|
(xnestDisplay),
|
|
|
|
|
xnestVisuals[i].visual,
|
|
|
|
|
AllocNone);
|
2012-03-21 12:55:09 -07:00
|
|
|
|
2003-11-14 15:54:54 +00:00
|
|
|
xnestDepths = XListDepths(xnestDisplay, DefaultScreen(xnestDisplay),
|
|
|
|
|
&xnestNumDepths);
|
2012-03-21 12:55:09 -07:00
|
|
|
|
2003-11-14 15:54:54 +00:00
|
|
|
xnestPixmapFormats = XListPixmapFormats(xnestDisplay,
|
|
|
|
|
&xnestNumPixmapFormats);
|
2012-03-21 12:55:09 -07:00
|
|
|
|
2003-11-14 15:54:54 +00:00
|
|
|
xnestBlackPixel = BlackPixel(xnestDisplay, DefaultScreen(xnestDisplay));
|
|
|
|
|
xnestWhitePixel = WhitePixel(xnestDisplay, DefaultScreen(xnestDisplay));
|
2012-03-21 12:55:09 -07:00
|
|
|
|
2003-11-14 15:54:54 +00:00
|
|
|
if (xnestParentWindow != (Window) 0)
|
|
|
|
|
xnestEventMask = StructureNotifyMask;
|
|
|
|
|
else
|
|
|
|
|
xnestEventMask = 0L;
|
2012-03-21 12:55:09 -07:00
|
|
|
|
2003-11-14 15:54:54 +00:00
|
|
|
for (i = 0; i <= MAXDEPTH; i++)
|
|
|
|
|
xnestDefaultDrawables[i] = None;
|
2012-03-21 12:55:09 -07:00
|
|
|
|
2003-11-14 15:54:54 +00:00
|
|
|
for (i = 0; i < xnestNumPixmapFormats; i++)
|
|
|
|
|
for (j = 0; j < xnestNumDepths; j++)
|
|
|
|
|
if (xnestPixmapFormats[i].depth == 1 ||
|
|
|
|
|
xnestPixmapFormats[i].depth == xnestDepths[j]) {
|
|
|
|
|
xnestDefaultDrawables[xnestPixmapFormats[i].depth] =
|
|
|
|
|
XCreatePixmap(xnestDisplay, DefaultRootWindow(xnestDisplay),
|
|
|
|
|
1, 1, xnestPixmapFormats[i].depth);
|
|
|
|
|
}
|
2012-03-21 12:55:09 -07:00
|
|
|
|
2003-11-14 15:54:54 +00:00
|
|
|
xnestBitmapGC = XCreateGC(xnestDisplay, xnestDefaultDrawables[1], 0L, NULL);
|
2012-03-21 12:55:09 -07:00
|
|
|
|
2003-11-14 15:54:54 +00:00
|
|
|
if (!(xnestUserGeometry & XValue))
|
|
|
|
|
xnestX = 0;
|
2012-03-21 12:55:09 -07:00
|
|
|
|
2003-11-14 15:54:54 +00:00
|
|
|
if (!(xnestUserGeometry & YValue))
|
|
|
|
|
xnestY = 0;
|
2012-03-21 12:55:09 -07:00
|
|
|
|
2003-11-14 15:54:54 +00:00
|
|
|
if (xnestParentWindow == 0) {
|
|
|
|
|
if (!(xnestUserGeometry & WidthValue))
|
|
|
|
|
xnestWidth = 3 * DisplayWidth(xnestDisplay,
|
|
|
|
|
DefaultScreen(xnestDisplay)) / 4;
|
2012-03-21 12:55:09 -07:00
|
|
|
|
2003-11-14 15:54:54 +00:00
|
|
|
if (!(xnestUserGeometry & HeightValue))
|
|
|
|
|
xnestHeight = 3 * DisplayHeight(xnestDisplay,
|
|
|
|
|
DefaultScreen(xnestDisplay)) / 4;
|
|
|
|
|
}
|
2012-03-21 12:55:09 -07:00
|
|
|
|
2003-11-14 15:54:54 +00:00
|
|
|
if (!xnestUserBorderWidth)
|
|
|
|
|
xnestBorderWidth = 1;
|
2012-03-21 12:55:09 -07:00
|
|
|
|
2003-11-14 15:54:54 +00:00
|
|
|
xnestIconBitmap =
|
|
|
|
|
XCreateBitmapFromData(xnestDisplay,
|
|
|
|
|
DefaultRootWindow(xnestDisplay),
|
|
|
|
|
(char *) icon_bits, icon_width, icon_height);
|
2012-03-21 12:55:09 -07:00
|
|
|
|
2003-11-14 15:54:54 +00:00
|
|
|
xnestScreenSaverPixmap =
|
|
|
|
|
XCreatePixmapFromBitmapData(xnestDisplay,
|
|
|
|
|
DefaultRootWindow(xnestDisplay),
|
|
|
|
|
(char *) screensaver_bits,
|
|
|
|
|
screensaver_width,
|
|
|
|
|
screensaver_height,
|
|
|
|
|
xnestWhitePixel,
|
|
|
|
|
xnestBlackPixel,
|
|
|
|
|
DefaultDepth(xnestDisplay,
|
|
|
|
|
DefaultScreen(xnestDisplay)));
|
|
|
|
|
}
|
|
|
|
|
|
2003-11-25 19:29:01 +00:00
|
|
|
void
|
2007-04-09 14:33:15 -07:00
|
|
|
xnestCloseDisplay(void)
|
2003-11-14 15:54:54 +00:00
|
|
|
{
|
|
|
|
|
if (!xnestDoFullGeneration || !xnestDisplay)
|
|
|
|
|
return;
|
2012-03-21 12:55:09 -07:00
|
|
|
|
2003-11-14 15:54:54 +00:00
|
|
|
/*
|
|
|
|
|
If xnestDoFullGeneration all x resources will be destroyed upon closing
|
|
|
|
|
the display connection. There is no need to generate extra protocol.
|
|
|
|
|
*/
|
2012-03-21 12:55:09 -07:00
|
|
|
|
2010-05-06 01:44:06 +07:00
|
|
|
free(xnestDefaultColormaps);
|
2003-11-14 15:54:54 +00:00
|
|
|
XFree(xnestVisuals);
|
|
|
|
|
XFree(xnestDepths);
|
|
|
|
|
XFree(xnestPixmapFormats);
|
|
|
|
|
XCloseDisplay(xnestDisplay);
|
|
|
|
|
}
|