xserver

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

Cursor.c (5002B)


      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 <X11/X.h>
     20 #include <X11/Xproto.h>
     21 #include "screenint.h"
     22 #include "input.h"
     23 #include "misc.h"
     24 #include "cursor.h"
     25 #include "cursorstr.h"
     26 #include "scrnintstr.h"
     27 #include "servermd.h"
     28 #include "mipointrst.h"
     29 
     30 #include "Xnest.h"
     31 
     32 #include "Display.h"
     33 #include "Screen.h"
     34 #include "XNCursor.h"
     35 #include "Visual.h"
     36 #include "Keyboard.h"
     37 #include "Args.h"
     38 
     39 xnestCursorFuncRec xnestCursorFuncs = { NULL };
     40 
     41 Bool
     42 xnestRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
     43 {
     44     XImage *ximage;
     45     Pixmap source, mask;
     46     XColor fg_color, bg_color;
     47     unsigned long valuemask;
     48     XGCValues values;
     49 
     50     valuemask = GCFunction |
     51         GCPlaneMask | GCForeground | GCBackground | GCClipMask;
     52 
     53     values.function = GXcopy;
     54     values.plane_mask = AllPlanes;
     55     values.foreground = 1L;
     56     values.background = 0L;
     57     values.clip_mask = None;
     58 
     59     XChangeGC(xnestDisplay, xnestBitmapGC, valuemask, &values);
     60 
     61     source = XCreatePixmap(xnestDisplay,
     62                            xnestDefaultWindows[pScreen->myNum],
     63                            pCursor->bits->width, pCursor->bits->height, 1);
     64 
     65     mask = XCreatePixmap(xnestDisplay,
     66                          xnestDefaultWindows[pScreen->myNum],
     67                          pCursor->bits->width, pCursor->bits->height, 1);
     68 
     69     ximage = XCreateImage(xnestDisplay,
     70                           xnestDefaultVisual(pScreen),
     71                           1, XYBitmap, 0,
     72                           (char *) pCursor->bits->source,
     73                           pCursor->bits->width,
     74                           pCursor->bits->height, BitmapPad(xnestDisplay), 0);
     75 
     76     XPutImage(xnestDisplay, source, xnestBitmapGC, ximage,
     77               0, 0, 0, 0, pCursor->bits->width, pCursor->bits->height);
     78 
     79     XFree(ximage);
     80 
     81     ximage = XCreateImage(xnestDisplay,
     82                           xnestDefaultVisual(pScreen),
     83                           1, XYBitmap, 0,
     84                           (char *) pCursor->bits->mask,
     85                           pCursor->bits->width,
     86                           pCursor->bits->height, BitmapPad(xnestDisplay), 0);
     87 
     88     XPutImage(xnestDisplay, mask, xnestBitmapGC, ximage,
     89               0, 0, 0, 0, pCursor->bits->width, pCursor->bits->height);
     90 
     91     XFree(ximage);
     92 
     93     fg_color.red = pCursor->foreRed;
     94     fg_color.green = pCursor->foreGreen;
     95     fg_color.blue = pCursor->foreBlue;
     96 
     97     bg_color.red = pCursor->backRed;
     98     bg_color.green = pCursor->backGreen;
     99     bg_color.blue = pCursor->backBlue;
    100 
    101     xnestSetCursorPriv(pCursor, pScreen, malloc(sizeof(xnestPrivCursor)));
    102     xnestCursor(pCursor, pScreen) =
    103         XCreatePixmapCursor(xnestDisplay, source, mask, &fg_color, &bg_color,
    104                             pCursor->bits->xhot, pCursor->bits->yhot);
    105 
    106     XFreePixmap(xnestDisplay, source);
    107     XFreePixmap(xnestDisplay, mask);
    108 
    109     return True;
    110 }
    111 
    112 Bool
    113 xnestUnrealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
    114 {
    115     XFreeCursor(xnestDisplay, xnestCursor(pCursor, pScreen));
    116     free(xnestGetCursorPriv(pCursor, pScreen));
    117     return True;
    118 }
    119 
    120 void
    121 xnestRecolorCursor(ScreenPtr pScreen, CursorPtr pCursor, Bool displayed)
    122 {
    123     XColor fg_color, bg_color;
    124 
    125     fg_color.red = pCursor->foreRed;
    126     fg_color.green = pCursor->foreGreen;
    127     fg_color.blue = pCursor->foreBlue;
    128 
    129     bg_color.red = pCursor->backRed;
    130     bg_color.green = pCursor->backGreen;
    131     bg_color.blue = pCursor->backBlue;
    132 
    133     XRecolorCursor(xnestDisplay,
    134                    xnestCursor(pCursor, pScreen), &fg_color, &bg_color);
    135 }
    136 
    137 void
    138 xnestSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor, int x,
    139                int y)
    140 {
    141     if (pCursor) {
    142         XDefineCursor(xnestDisplay,
    143                       xnestDefaultWindows[pScreen->myNum],
    144                       xnestCursor(pCursor, pScreen));
    145     }
    146 }
    147 
    148 void
    149 xnestMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
    150 {
    151 }
    152 
    153 Bool
    154 xnestDeviceCursorInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
    155 {
    156     xnestCursorFuncPtr pScreenPriv;
    157 
    158     pScreenPriv = (xnestCursorFuncPtr)
    159         dixLookupPrivate(&pScreen->devPrivates, xnestCursorScreenKey);
    160 
    161     return pScreenPriv->spriteFuncs->DeviceCursorInitialize(pDev, pScreen);
    162 }
    163 
    164 void
    165 xnestDeviceCursorCleanup(DeviceIntPtr pDev, ScreenPtr pScreen)
    166 {
    167     xnestCursorFuncPtr pScreenPriv;
    168 
    169     pScreenPriv = (xnestCursorFuncPtr)
    170         dixLookupPrivate(&pScreen->devPrivates, xnestCursorScreenKey);
    171 
    172     pScreenPriv->spriteFuncs->DeviceCursorCleanup(pDev, pScreen);
    173 }