xserver

xserver with xephyr scale patch
git clone https://git.neptards.moe/u3shit/xserver.git
Log | Files | Refs | README | LICENSE

Display.c (6902B)


      1 /*
      2 
      3 Copyright 1993 by Davor Matic
      4 
      5 Permission to use, copy, modify, distribute, and sell this software
      6 and its documentation for any purpose is hereby granted without fee,
      7 provided that the above copyright notice appear in all copies and that
      8 both that copyright notice and this permission notice appear in
      9 supporting documentation.  Davor Matic makes no representations about
     10 the suitability of this software for any purpose.  It is provided "as
     11 is" without express or implied warranty.
     12 
     13 */
     14 
     15 #ifdef HAVE_XNEST_CONFIG_H
     16 #include <xnest-config.h>
     17 #endif
     18 
     19 #include <string.h>
     20 #include <errno.h>
     21 
     22 #include <X11/X.h>
     23 #include <X11/Xproto.h>
     24 #include "screenint.h"
     25 #include "input.h"
     26 #include "misc.h"
     27 #include "scrnintstr.h"
     28 #include "servermd.h"
     29 
     30 #include "Xnest.h"
     31 
     32 #include "Display.h"
     33 #include "Init.h"
     34 #include "Args.h"
     35 
     36 #include "icon"
     37 #include "screensaver"
     38 
     39 Display *xnestDisplay = NULL;
     40 XVisualInfo *xnestVisuals;
     41 int xnestNumVisuals;
     42 int xnestDefaultVisualIndex;
     43 Colormap *xnestDefaultColormaps;
     44 static unsigned int xnestNumDefaultColormaps;
     45 int *xnestDepths;
     46 int xnestNumDepths;
     47 XPixmapFormatValues *xnestPixmapFormats;
     48 int xnestNumPixmapFormats;
     49 Pixel xnestBlackPixel;
     50 Pixel xnestWhitePixel;
     51 Drawable xnestDefaultDrawables[MAXDEPTH + 1];
     52 Pixmap xnestIconBitmap;
     53 Pixmap xnestScreenSaverPixmap;
     54 XlibGC xnestBitmapGC;
     55 unsigned long xnestEventMask;
     56 
     57 #ifdef __SUNPRO_C
     58 /* prevent "Function has no return statement" error for x_io_error_handler */
     59 #pragma does_not_return(exit)
     60 #endif
     61 
     62 static int _X_NORETURN
     63 x_io_error_handler(Display * dpy)
     64 {
     65     ErrorF("Lost connection to X server: %s\n", strerror(errno));
     66     CloseWellKnownConnections();
     67     OsCleanup(1);
     68     exit(1);
     69 }
     70 
     71 void
     72 xnestOpenDisplay(int argc, char *argv[])
     73 {
     74     XVisualInfo vi;
     75     long mask;
     76     int i, j;
     77 
     78     if (!xnestDoFullGeneration)
     79         return;
     80 
     81     XSetIOErrorHandler(x_io_error_handler);
     82 
     83     xnestCloseDisplay();
     84 
     85     xnestDisplay = XOpenDisplay(xnestDisplayName);
     86     if (xnestDisplay == NULL)
     87         FatalError("Unable to open display \"%s\".\n",
     88                    XDisplayName(xnestDisplayName));
     89 
     90     if (xnestSynchronize)
     91         XSynchronize(xnestDisplay, True);
     92 
     93     mask = VisualScreenMask;
     94     vi.screen = DefaultScreen(xnestDisplay);
     95     xnestVisuals = XGetVisualInfo(xnestDisplay, mask, &vi, &xnestNumVisuals);
     96     if (xnestNumVisuals == 0 || xnestVisuals == NULL)
     97         FatalError("Unable to find any visuals.\n");
     98 
     99     if (xnestUserDefaultClass || xnestUserDefaultDepth) {
    100         xnestDefaultVisualIndex = UNDEFINED;
    101         for (i = 0; i < xnestNumVisuals; i++)
    102             if ((!xnestUserDefaultClass ||
    103                  xnestVisuals[i].class == xnestDefaultClass)
    104                 &&
    105                 (!xnestUserDefaultDepth ||
    106                  xnestVisuals[i].depth == xnestDefaultDepth)) {
    107                 xnestDefaultVisualIndex = i;
    108                 break;
    109             }
    110         if (xnestDefaultVisualIndex == UNDEFINED)
    111             FatalError("Unable to find desired default visual.\n");
    112     }
    113     else {
    114         vi.visualid = XVisualIDFromVisual(DefaultVisual(xnestDisplay,
    115                                                         DefaultScreen
    116                                                         (xnestDisplay)));
    117         xnestDefaultVisualIndex = 0;
    118         for (i = 0; i < xnestNumVisuals; i++)
    119             if (vi.visualid == xnestVisuals[i].visualid)
    120                 xnestDefaultVisualIndex = i;
    121     }
    122 
    123     xnestNumDefaultColormaps = xnestNumVisuals;
    124     xnestDefaultColormaps = xallocarray(xnestNumDefaultColormaps,
    125                                         sizeof(Colormap));
    126     for (i = 0; i < xnestNumDefaultColormaps; i++)
    127         xnestDefaultColormaps[i] = XCreateColormap(xnestDisplay,
    128                                                    DefaultRootWindow
    129                                                    (xnestDisplay),
    130                                                    xnestVisuals[i].visual,
    131                                                    AllocNone);
    132 
    133     xnestDepths = XListDepths(xnestDisplay, DefaultScreen(xnestDisplay),
    134                               &xnestNumDepths);
    135 
    136     xnestPixmapFormats = XListPixmapFormats(xnestDisplay,
    137                                             &xnestNumPixmapFormats);
    138 
    139     xnestBlackPixel = BlackPixel(xnestDisplay, DefaultScreen(xnestDisplay));
    140     xnestWhitePixel = WhitePixel(xnestDisplay, DefaultScreen(xnestDisplay));
    141 
    142     if (xnestParentWindow != (Window) 0)
    143         xnestEventMask = StructureNotifyMask;
    144     else
    145         xnestEventMask = 0L;
    146 
    147     for (i = 0; i <= MAXDEPTH; i++)
    148         xnestDefaultDrawables[i] = None;
    149 
    150     for (i = 0; i < xnestNumPixmapFormats; i++)
    151         for (j = 0; j < xnestNumDepths; j++)
    152             if (xnestPixmapFormats[i].depth == 1 ||
    153                 xnestPixmapFormats[i].depth == xnestDepths[j]) {
    154                 xnestDefaultDrawables[xnestPixmapFormats[i].depth] =
    155                     XCreatePixmap(xnestDisplay, DefaultRootWindow(xnestDisplay),
    156                                   1, 1, xnestPixmapFormats[i].depth);
    157             }
    158 
    159     xnestBitmapGC = XCreateGC(xnestDisplay, xnestDefaultDrawables[1], 0L, NULL);
    160 
    161     if (!(xnestUserGeometry & XValue))
    162         xnestX = 0;
    163 
    164     if (!(xnestUserGeometry & YValue))
    165         xnestY = 0;
    166 
    167     if (xnestParentWindow == 0) {
    168         if (!(xnestUserGeometry & WidthValue))
    169             xnestWidth = 3 * DisplayWidth(xnestDisplay,
    170                                           DefaultScreen(xnestDisplay)) / 4;
    171 
    172         if (!(xnestUserGeometry & HeightValue))
    173             xnestHeight = 3 * DisplayHeight(xnestDisplay,
    174                                             DefaultScreen(xnestDisplay)) / 4;
    175     }
    176 
    177     if (!xnestUserBorderWidth)
    178         xnestBorderWidth = 1;
    179 
    180     xnestIconBitmap =
    181         XCreateBitmapFromData(xnestDisplay,
    182                               DefaultRootWindow(xnestDisplay),
    183                               (char *) icon_bits, icon_width, icon_height);
    184 
    185     xnestScreenSaverPixmap =
    186         XCreatePixmapFromBitmapData(xnestDisplay,
    187                                     DefaultRootWindow(xnestDisplay),
    188                                     (char *) screensaver_bits,
    189                                     screensaver_width,
    190                                     screensaver_height,
    191                                     xnestWhitePixel,
    192                                     xnestBlackPixel,
    193                                     DefaultDepth(xnestDisplay,
    194                                                  DefaultScreen(xnestDisplay)));
    195 }
    196 
    197 void
    198 xnestCloseDisplay(void)
    199 {
    200     if (!xnestDoFullGeneration || !xnestDisplay)
    201         return;
    202 
    203     /*
    204        If xnestDoFullGeneration all x resources will be destroyed upon closing
    205        the display connection.  There is no need to generate extra protocol.
    206      */
    207 
    208     free(xnestDefaultColormaps);
    209     XFree(xnestVisuals);
    210     XFree(xnestDepths);
    211     XFree(xnestPixmapFormats);
    212     XCloseDisplay(xnestDisplay);
    213 }