1 /* Copyright (c) 1994 David Hogan, 2000 Benjamin Drieu, see README for licence details */
2 #include <stdio.h>
3 #include <X11/X.h>
4 #include <X11/Xlib.h>
5 #include <X11/Xutil.h>
6 #include "dat.h"
7 #include "fns.h"
8 
9 Cursor  target;
10 Cursor  sweep0;
11 Cursor  boxcurs;
12 Cursor  arrow;
13 Pixmap  root_pixmap;
14 
15 typedef struct {
16     int             width;
17     int             hot[2];
18     unsigned char   mask[64];
19     unsigned char   fore[64];
20 } Cursordata;
21 
22 Cursordata sweep0data = {
23     16,
24     {7, 7},
25     {0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03,
26      0xC0, 0x03, 0xC0, 0x03, 0xFF, 0xFF, 0xFF, 0xFF,
27      0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x03, 0xC0, 0x03,
28      0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03},
29     {0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
30      0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xFE, 0x7F,
31      0xFE, 0x7F, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
32      0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00}
33 };
34 
35 Cursordata boxcursdata = {
36     16,
37     {7, 7},
38     {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
39      0xFF, 0xFF, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8,
40      0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0xFF, 0xFF,
41      0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
42     {0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0xFE, 0x7F,
43      0x0E, 0x70, 0x0E, 0x70, 0x0E, 0x70, 0x0E, 0x70,
44      0x0E, 0x70, 0x0E, 0x70, 0x0E, 0x70, 0x0E, 0x70,
45      0xFE, 0x7F, 0xFE, 0x7F, 0xFE, 0x7F, 0x00, 0x00}
46 };
47 
48 Cursordata sightdata = {
49     16,
50     {7, 7},
51     {0xF8, 0x1F, 0xFC, 0x3F, 0xFE, 0x7F, 0xDF, 0xFB,
52      0xCF, 0xF3, 0xC7, 0xE3, 0xFF, 0xFF, 0xFF, 0xFF,
53      0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xE3, 0xCF, 0xF3,
54      0xDF, 0x7B, 0xFE, 0x7F, 0xFC, 0x3F, 0xF8, 0x1F,},
55     {0x00, 0x00, 0xF0, 0x0F, 0x8C, 0x31, 0x84, 0x21,
56      0x82, 0x41, 0x82, 0x41, 0x82, 0x41, 0xFE, 0x7F,
57      0xFE, 0x7F, 0x82, 0x41, 0x82, 0x41, 0x82, 0x41,
58      0x84, 0x21, 0x8C, 0x31, 0xF0, 0x0F, 0x00, 0x00,}
59 };
60 
61 Cursordata arrowdata = {
62     16,
63     {1, 1},
64     {0xFF, 0x07, 0xFF, 0x07, 0xFF, 0x03, 0xFF, 0x00,
65      0xFF, 0x00, 0xFF, 0x01, 0xFF, 0x03, 0xFF, 0x07,
66      0xE7, 0x0F, 0xC7, 0x1F, 0x83, 0x3F, 0x00, 0x7F,
67      0x00, 0xFE, 0x00, 0x7C, 0x00, 0x38, 0x00, 0x10,},
68     {0x00, 0x00, 0xFE, 0x03, 0xFE, 0x00, 0x3E, 0x00,
69      0x7E, 0x00, 0xFE, 0x00, 0xF6, 0x01, 0xE6, 0x03,
70      0xC2, 0x07, 0x82, 0x0F, 0x00, 0x1F, 0x00, 0x3E,
71      0x00, 0x7C, 0x00, 0x38, 0x00, 0x10, 0x00, 0x00,}
72 };
73 
74 Cursordata whitearrow = {
75     16,
76     {0, 0},
77     {0xFF, 0x07, 0xFF, 0x07, 0xFF, 0x03, 0xFF, 0x00,
78      0xFF, 0x00, 0xFF, 0x01, 0xFF, 0x03, 0xFF, 0x07,
79      0xE7, 0x0F, 0xC7, 0x1F, 0x83, 0x3F, 0x00, 0x7F,
80      0x00, 0xFE, 0x00, 0x7C, 0x00, 0x38, 0x00, 0x10,},
81     {0xFF, 0x07, 0xFF, 0x07, 0x83, 0x03, 0xC3, 0x00,
82      0xC3, 0x00, 0x83, 0x01, 0x1B, 0x03, 0x3F, 0x06,
83      0x67, 0x0C, 0xC7, 0x18, 0x83, 0x31, 0x00, 0x63,
84      0x00, 0xC6, 0x00, 0x6C, 0x00, 0x38, 0x00, 0x10,}
85 };
86 
87 Cursordata blittarget = {
88     18,
89     {8, 8},
90     {0xe0, 0x1f, 0x00, 0xf0, 0x3f, 0x00, 0xf8, 0x7f, 0x00,
91      0xfc, 0xff, 0x00, 0xfe, 0xff, 0x01, 0xff, 0xff, 0x03,
92      0xff, 0xff, 0x03, 0xff, 0xff, 0x03, 0xff, 0xff, 0x03,
93      0xff, 0xff, 0x03, 0xff, 0xff, 0x03, 0xff, 0xff, 0x03,
94      0xff, 0xff, 0x03, 0xfe, 0xff, 0x01, 0xfc, 0xff, 0x00,
95      0xf8, 0x7f, 0x00, 0xf0, 0x3f, 0x00, 0xe0, 0x1f, 0x00},
96     {0x00, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0xf0, 0x3f, 0x00,
97      0x38, 0x73, 0x00, 0x8c, 0xc7, 0x00, 0xec, 0xdf, 0x00,
98      0x66, 0x9b, 0x01, 0x36, 0xb3, 0x01, 0xfe, 0xff, 0x01,
99      0xfe, 0xff, 0x01, 0x36, 0xb3, 0x01, 0x66, 0x9b, 0x01,
100      0xec, 0xdf, 0x00, 0x8c, 0xc7, 0x00, 0x38, 0x73, 0x00,
101      0xf0, 0x3f, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x00}
102 };
103 
104 Cursordata blitarrow = {
105     18,
106     {1, 1},
107     {0xff, 0x0f, 0x00, 0xff, 0x07, 0x00, 0xff, 0x03, 0x00,
108      0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x01, 0x00,
109      0xff, 0x03, 0x00, 0xff, 0x07, 0x00, 0xe7, 0x0f, 0x00,
110      0xc7, 0x1f, 0x00, 0x87, 0x3f, 0x00, 0x03, 0x7f, 0x00,
111      0x01, 0xfe, 0x00, 0x00, 0xfc, 0x01, 0x00, 0xf8, 0x03,
112      0x00, 0xf0, 0x01, 0x00, 0xe0, 0x00, 0x00, 0x40, 0x00},
113     {0x00, 0x00, 0x00, 0xfe, 0x03, 0x00, 0xfe, 0x00, 0x00,
114      0x3e, 0x00, 0x00, 0x7e, 0x00, 0x00, 0xfe, 0x00, 0x00,
115      0xf6, 0x01, 0x00, 0xe6, 0x03, 0x00, 0xc2, 0x07, 0x00,
116      0x82, 0x0f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x3e, 0x00,
117      0x00, 0x7c, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xf0, 0x01,
118      0x00, 0xe0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00}
119 };
120 
121 Cursordata blitsweep = {
122     18,
123     {8, 8},
124     {0xc4, 0xff, 0x03, 0xce, 0xff, 0x03, 0xdf, 0xff, 0x03,
125      0x3e, 0x80, 0x03, 0x7c, 0x83, 0x03, 0xf8, 0x83, 0x03,
126      0xf7, 0x83, 0x03, 0xe7, 0x83, 0x03, 0xf7, 0x83, 0x03,
127      0xf7, 0x83, 0x03, 0x07, 0x80, 0x03, 0x07, 0x80, 0x03,
128      0x07, 0x80, 0x03, 0x07, 0x80, 0x03, 0x07, 0x80, 0x03,
129      0xff, 0xff, 0x03, 0xff, 0xff, 0x03, 0xff, 0xff, 0x03},
130     {0x00, 0x00, 0x00, 0x84, 0xff, 0x01, 0x0e, 0x00, 0x01,
131      0x1c, 0x00, 0x01, 0x38, 0x00, 0x01, 0x70, 0x01, 0x01,
132      0xe0, 0x01, 0x01, 0xc2, 0x01, 0x01, 0xe2, 0x01, 0x01,
133      0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01,
134      0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01,
135      0x02, 0x00, 0x01, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00}
136 };
137 
138 /*
139  *  Grey tile pattern for root background
140  */
141 
142 #define grey_width 4
143 #define grey_height 2
144 static char grey_bits[] = {
145    0x01, 0x04};
146 
147 Cursor
getcursor(c)148 getcursor(c)
149 Cursordata *c;
150 {
151     Pixmap f, m;
152     XColor bl, wh, d;
153 
154     f = XCreatePixmapFromBitmapData(dpy, root, (char *)c->fore,
155         c->width, c->width, 1, 0, 1);
156     m = XCreatePixmapFromBitmapData(dpy, root, (char *)c->mask,
157         c->width, c->width, 1, 0, 1);
158     XAllocNamedColor(dpy, DefaultColormap(dpy, screen), "black", &bl, &d);
159     XAllocNamedColor(dpy, DefaultColormap(dpy, screen), "white", &wh, &d);
160     return XCreatePixmapCursor(dpy, f, m, &bl, &wh,
161                     c->hot[0], c->hot[1]);
162 }
163 
164 void
initcurs()165 initcurs()
166 {
167     if (nostalgia) {
168         arrow = getcursor(&blitarrow);
169         target = getcursor(&blittarget);
170         sweep0 = getcursor(&blitsweep);
171         boxcurs = getcursor(&blitsweep);
172     }
173     else {
174         arrow = getcursor(&arrowdata);
175         target = getcursor(&sightdata);
176         sweep0 = getcursor(&sweep0data);
177         boxcurs = getcursor(&boxcursdata);
178     }
179 
180     root_pixmap = XCreatePixmapFromBitmapData(dpy, root,
181         grey_bits, grey_width, grey_height,
182         black, white, DefaultDepth(dpy, screen));
183 }
184