Blame


1 038e9089 2004-03-21 devnull /* Copyright (c) 1994-1996 David Hogan, see README for licence details */
2 038e9089 2004-03-21 devnull #include <stdio.h>
3 038e9089 2004-03-21 devnull #include <signal.h>
4 038e9089 2004-03-21 devnull #include <errno.h>
5 e62ba5ec 2004-03-21 devnull #include <stdlib.h>
6 e62ba5ec 2004-03-21 devnull #include <unistd.h>
7 038e9089 2004-03-21 devnull #include <X11/X.h>
8 038e9089 2004-03-21 devnull #include <X11/Xos.h>
9 038e9089 2004-03-21 devnull #include <X11/Xlib.h>
10 038e9089 2004-03-21 devnull #include <X11/Xutil.h>
11 038e9089 2004-03-21 devnull #include <X11/Xatom.h>
12 8ad51794 2004-03-25 devnull #ifdef SHAPE
13 8ad51794 2004-03-25 devnull #include <X11/extensions/shape.h>
14 8ad51794 2004-03-25 devnull #endif
15 038e9089 2004-03-21 devnull #include "dat.h"
16 038e9089 2004-03-21 devnull #include "fns.h"
17 038e9089 2004-03-21 devnull #include "patchlevel.h"
18 038e9089 2004-03-21 devnull
19 038e9089 2004-03-21 devnull char *version[] =
20 038e9089 2004-03-21 devnull {
21 cbeb0b26 2006-04-01 devnull "rio version 1.0, Copyright (c) 1994-1996 David Hogan, (c) 2004 Russ Cox", 0
22 038e9089 2004-03-21 devnull };
23 038e9089 2004-03-21 devnull
24 038e9089 2004-03-21 devnull Display *dpy;
25 038e9089 2004-03-21 devnull ScreenInfo *screens;
26 038e9089 2004-03-21 devnull int initting;
27 038e9089 2004-03-21 devnull XFontStruct *font;
28 038e9089 2004-03-21 devnull int nostalgia;
29 038e9089 2004-03-21 devnull char **myargv;
30 038e9089 2004-03-21 devnull char *termprog;
31 038e9089 2004-03-21 devnull char *shell;
32 038e9089 2004-03-21 devnull Bool shape;
33 038e9089 2004-03-21 devnull int _border = 4;
34 1cb3fa80 2004-03-29 devnull int _corner = 25;
35 038e9089 2004-03-21 devnull int _inset = 1;
36 038e9089 2004-03-21 devnull int curtime;
37 038e9089 2004-03-21 devnull int debug;
38 038e9089 2004-03-21 devnull int signalled;
39 d2e350c0 2005-01-04 devnull int scrolling;
40 038e9089 2004-03-21 devnull int num_screens;
41 038e9089 2004-03-21 devnull int solidsweep = 0;
42 3ddda821 2004-12-28 devnull int numvirtuals = 0;
43 d52fb463 2005-08-11 devnull int ffm = 0;
44 038e9089 2004-03-21 devnull
45 aa808685 2004-04-19 devnull Atom exit_rio;
46 aa808685 2004-04-19 devnull Atom restart_rio;
47 038e9089 2004-03-21 devnull Atom wm_state;
48 038e9089 2004-03-21 devnull Atom wm_change_state;
49 038e9089 2004-03-21 devnull Atom wm_protocols;
50 038e9089 2004-03-21 devnull Atom wm_delete;
51 038e9089 2004-03-21 devnull Atom wm_take_focus;
52 c005568a 2004-03-30 devnull Atom wm_lose_focus;
53 038e9089 2004-03-21 devnull Atom wm_colormaps;
54 aa808685 2004-04-19 devnull Atom _rio_running;
55 aa808685 2004-04-19 devnull Atom _rio_hold_mode;
56 71f6d60f 2008-07-09 rsc Atom wm_state_fullscreen;
57 71f6d60f 2008-07-09 rsc Atom wm_state;
58 038e9089 2004-03-21 devnull
59 038e9089 2004-03-21 devnull char *fontlist[] = {
60 038e9089 2004-03-21 devnull "lucm.latin1.9",
61 038e9089 2004-03-21 devnull "blit",
62 e62ba5ec 2004-03-21 devnull "*-lucidatypewriter-bold-*-14-*-75-*",
63 e62ba5ec 2004-03-21 devnull "*-lucidatypewriter-medium-*-12-*-75-*",
64 038e9089 2004-03-21 devnull "9x15bold",
65 038e9089 2004-03-21 devnull "fixed",
66 038e9089 2004-03-21 devnull "*",
67 cbeb0b26 2006-04-01 devnull 0
68 038e9089 2004-03-21 devnull };
69 038e9089 2004-03-21 devnull
70 038e9089 2004-03-21 devnull void
71 038e9089 2004-03-21 devnull usage(void)
72 038e9089 2004-03-21 devnull {
73 d2e350c0 2005-01-04 devnull fprintf(stderr, "usage: rio [-grey] [-font fname] [-s] [-term prog] [-version] [-virtuals num] [exit|restart]\n");
74 038e9089 2004-03-21 devnull exit(1);
75 038e9089 2004-03-21 devnull }
76 038e9089 2004-03-21 devnull
77 038e9089 2004-03-21 devnull int
78 038e9089 2004-03-21 devnull main(int argc, char *argv[])
79 038e9089 2004-03-21 devnull {
80 038e9089 2004-03-21 devnull int i, background, do_exit, do_restart;
81 038e9089 2004-03-21 devnull char *fname;
82 e62ba5ec 2004-03-21 devnull int shape_event;
83 8ad51794 2004-03-25 devnull #ifdef SHAPE
84 8ad51794 2004-03-25 devnull int dummy;
85 8ad51794 2004-03-25 devnull #endif
86 038e9089 2004-03-21 devnull
87 e62ba5ec 2004-03-21 devnull shape_event = 0;
88 038e9089 2004-03-21 devnull myargv = argv; /* for restart */
89 038e9089 2004-03-21 devnull
90 038e9089 2004-03-21 devnull do_exit = do_restart = 0;
91 8ad51794 2004-03-25 devnull background = 0;
92 038e9089 2004-03-21 devnull font = 0;
93 038e9089 2004-03-21 devnull fname = 0;
94 ac33a34a 2005-07-13 devnull for(i = 1; i < argc; i++)
95 ac33a34a 2005-07-13 devnull if(strcmp(argv[i], "-nostalgia") == 0)
96 038e9089 2004-03-21 devnull nostalgia++;
97 ac33a34a 2005-07-13 devnull else if(strcmp(argv[i], "-grey") == 0)
98 038e9089 2004-03-21 devnull background = 1;
99 ac33a34a 2005-07-13 devnull else if(strcmp(argv[i], "-debug") == 0)
100 038e9089 2004-03-21 devnull debug++;
101 d52fb463 2005-08-11 devnull /*
102 d52fb463 2005-08-11 devnull else if(strcmp(argv[i], "-ffm") == 0)
103 d52fb463 2005-08-11 devnull ffm++;
104 d52fb463 2005-08-11 devnull */
105 ac33a34a 2005-07-13 devnull else if(strcmp(argv[i], "-font") == 0 && i+1<argc){
106 038e9089 2004-03-21 devnull i++;
107 038e9089 2004-03-21 devnull fname = argv[i];
108 038e9089 2004-03-21 devnull }
109 ac33a34a 2005-07-13 devnull else if(strcmp(argv[i], "-term") == 0 && i+1<argc)
110 038e9089 2004-03-21 devnull termprog = argv[++i];
111 ac33a34a 2005-07-13 devnull else if(strcmp(argv[i], "-virtuals") == 0 && i+1<argc){
112 3ddda821 2004-12-28 devnull numvirtuals = atoi(argv[++i]);
113 ac33a34a 2005-07-13 devnull if(numvirtuals < 0 || numvirtuals > 12){
114 3ddda821 2004-12-28 devnull fprintf(stderr, "rio: wrong number of virtual displays, defaulting to 4\n");
115 3ddda821 2004-12-28 devnull numvirtuals = 4;
116 3ddda821 2004-12-28 devnull }
117 ac33a34a 2005-07-13 devnull } else if(strcmp(argv[i], "-version") == 0){
118 038e9089 2004-03-21 devnull fprintf(stderr, "%s", version[0]);
119 ac33a34a 2005-07-13 devnull if(PATCHLEVEL > 0)
120 038e9089 2004-03-21 devnull fprintf(stderr, "; patch level %d", PATCHLEVEL);
121 038e9089 2004-03-21 devnull fprintf(stderr, "\n");
122 038e9089 2004-03-21 devnull exit(0);
123 038e9089 2004-03-21 devnull }
124 ac33a34a 2005-07-13 devnull else if(strcmp(argv[i], "-s") == 0){
125 d2e350c0 2005-01-04 devnull scrolling = 1;
126 d2e350c0 2005-01-04 devnull }
127 ac33a34a 2005-07-13 devnull else if(argv[i][0] == '-')
128 038e9089 2004-03-21 devnull usage();
129 038e9089 2004-03-21 devnull else
130 038e9089 2004-03-21 devnull break;
131 ac33a34a 2005-07-13 devnull for(; i < argc; i++)
132 ac33a34a 2005-07-13 devnull if(strcmp(argv[i], "exit") == 0)
133 038e9089 2004-03-21 devnull do_exit++;
134 ac33a34a 2005-07-13 devnull else if(strcmp(argv[i], "restart") == 0)
135 038e9089 2004-03-21 devnull do_restart++;
136 038e9089 2004-03-21 devnull else
137 038e9089 2004-03-21 devnull usage();
138 038e9089 2004-03-21 devnull
139 ac33a34a 2005-07-13 devnull if(do_exit && do_restart)
140 038e9089 2004-03-21 devnull usage();
141 038e9089 2004-03-21 devnull
142 038e9089 2004-03-21 devnull shell = (char *)getenv("SHELL");
143 ac33a34a 2005-07-13 devnull if(shell == NULL)
144 038e9089 2004-03-21 devnull shell = DEFSHELL;
145 038e9089 2004-03-21 devnull
146 038e9089 2004-03-21 devnull dpy = XOpenDisplay("");
147 ac33a34a 2005-07-13 devnull if(dpy == 0)
148 038e9089 2004-03-21 devnull fatal("can't open display");
149 038e9089 2004-03-21 devnull
150 038e9089 2004-03-21 devnull initting = 1;
151 038e9089 2004-03-21 devnull XSetErrorHandler(handler);
152 ac33a34a 2005-07-13 devnull if(signal(SIGTERM, sighandler) == SIG_IGN)
153 038e9089 2004-03-21 devnull signal(SIGTERM, SIG_IGN);
154 ac33a34a 2005-07-13 devnull if(signal(SIGINT, sighandler) == SIG_IGN)
155 038e9089 2004-03-21 devnull signal(SIGINT, SIG_IGN);
156 ac33a34a 2005-07-13 devnull if(signal(SIGHUP, sighandler) == SIG_IGN)
157 038e9089 2004-03-21 devnull signal(SIGHUP, SIG_IGN);
158 038e9089 2004-03-21 devnull
159 aa808685 2004-04-19 devnull exit_rio = XInternAtom(dpy, "9WM_EXIT", False);
160 aa808685 2004-04-19 devnull restart_rio = XInternAtom(dpy, "9WM_RESTART", False);
161 038e9089 2004-03-21 devnull
162 038e9089 2004-03-21 devnull curtime = -1; /* don't care */
163 ac33a34a 2005-07-13 devnull if(do_exit){
164 56afeac8 2004-08-06 devnull sendcmessage(DefaultRootWindow(dpy), exit_rio, 0L, 1, 1);
165 038e9089 2004-03-21 devnull XSync(dpy, False);
166 038e9089 2004-03-21 devnull exit(0);
167 038e9089 2004-03-21 devnull }
168 ac33a34a 2005-07-13 devnull if(do_restart){
169 56afeac8 2004-08-06 devnull sendcmessage(DefaultRootWindow(dpy), restart_rio, 0L, 1, 1);
170 038e9089 2004-03-21 devnull XSync(dpy, False);
171 038e9089 2004-03-21 devnull exit(0);
172 038e9089 2004-03-21 devnull }
173 038e9089 2004-03-21 devnull
174 ac33a34a 2005-07-13 devnull if(0) XSynchronize(dpy, True);
175 c005568a 2004-03-30 devnull
176 038e9089 2004-03-21 devnull wm_state = XInternAtom(dpy, "WM_STATE", False);
177 038e9089 2004-03-21 devnull wm_change_state = XInternAtom(dpy, "WM_CHANGE_STATE", False);
178 038e9089 2004-03-21 devnull wm_protocols = XInternAtom(dpy, "WM_PROTOCOLS", False);
179 038e9089 2004-03-21 devnull wm_delete = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
180 038e9089 2004-03-21 devnull wm_take_focus = XInternAtom(dpy, "WM_TAKE_FOCUS", False);
181 c005568a 2004-03-30 devnull wm_lose_focus = XInternAtom(dpy, "_9WM_LOSE_FOCUS", False);
182 038e9089 2004-03-21 devnull wm_colormaps = XInternAtom(dpy, "WM_COLORMAP_WINDOWS", False);
183 aa808685 2004-04-19 devnull _rio_running = XInternAtom(dpy, "_9WM_RUNNING", False);
184 aa808685 2004-04-19 devnull _rio_hold_mode = XInternAtom(dpy, "_9WM_HOLD_MODE", False);
185 71f6d60f 2008-07-09 rsc wm_state = XInternAtom(dpy, "_NET_WM_STATE", False);
186 71f6d60f 2008-07-09 rsc wm_state_fullscreen = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False);
187 038e9089 2004-03-21 devnull
188 ac33a34a 2005-07-13 devnull if(fname != 0)
189 ac33a34a 2005-07-13 devnull if((font = XLoadQueryFont(dpy, fname)) == 0)
190 aa808685 2004-04-19 devnull fprintf(stderr, "rio: warning: can't load font %s\n", fname);
191 038e9089 2004-03-21 devnull
192 ac33a34a 2005-07-13 devnull if(font == 0){
193 ac33a34a 2005-07-13 devnull i = 0;
194 ac33a34a 2005-07-13 devnull for(;;){
195 038e9089 2004-03-21 devnull fname = fontlist[i++];
196 ac33a34a 2005-07-13 devnull if(fname == 0){
197 aa808685 2004-04-19 devnull fprintf(stderr, "rio: warning: can't find a font\n");
198 038e9089 2004-03-21 devnull break;
199 038e9089 2004-03-21 devnull }
200 038e9089 2004-03-21 devnull font = XLoadQueryFont(dpy, fname);
201 ac33a34a 2005-07-13 devnull if(font != 0)
202 038e9089 2004-03-21 devnull break;
203 038e9089 2004-03-21 devnull }
204 038e9089 2004-03-21 devnull }
205 ac33a34a 2005-07-13 devnull if(nostalgia){
206 038e9089 2004-03-21 devnull _border--;
207 038e9089 2004-03-21 devnull _inset--;
208 038e9089 2004-03-21 devnull }
209 038e9089 2004-03-21 devnull
210 038e9089 2004-03-21 devnull #ifdef SHAPE
211 038e9089 2004-03-21 devnull shape = XShapeQueryExtension(dpy, &shape_event, &dummy);
212 038e9089 2004-03-21 devnull #endif
213 038e9089 2004-03-21 devnull
214 038e9089 2004-03-21 devnull num_screens = ScreenCount(dpy);
215 038e9089 2004-03-21 devnull screens = (ScreenInfo *)malloc(sizeof(ScreenInfo) * num_screens);
216 ffbdd1aa 2022-09-12 crossd if (!screens){
217 ffbdd1aa 2022-09-12 crossd fprintf(stderr, "rio: Failed to allocate memory\n");
218 ffbdd1aa 2022-09-12 crossd return 1;
219 ffbdd1aa 2022-09-12 crossd }
220 038e9089 2004-03-21 devnull
221 ac33a34a 2005-07-13 devnull for(i = 0; i < num_screens; i++)
222 038e9089 2004-03-21 devnull initscreen(&screens[i], i, background);
223 3ddda821 2004-12-28 devnull
224 3ddda821 2004-12-28 devnull initb2menu(numvirtuals);
225 038e9089 2004-03-21 devnull
226 038e9089 2004-03-21 devnull /* set selection so that 9term knows we're running */
227 038e9089 2004-03-21 devnull curtime = CurrentTime;
228 aa808685 2004-04-19 devnull XSetSelectionOwner(dpy, _rio_running, screens[0].menuwin, timestamp());
229 038e9089 2004-03-21 devnull
230 038e9089 2004-03-21 devnull XSync(dpy, False);
231 038e9089 2004-03-21 devnull initting = 0;
232 038e9089 2004-03-21 devnull
233 038e9089 2004-03-21 devnull nofocus();
234 038e9089 2004-03-21 devnull
235 ac33a34a 2005-07-13 devnull for(i = 0; i < num_screens; i++)
236 038e9089 2004-03-21 devnull scanwins(&screens[i]);
237 038e9089 2004-03-21 devnull
238 ac33a34a 2005-07-13 devnull keysetup();
239 038e9089 2004-03-21 devnull mainloop(shape_event);
240 e62ba5ec 2004-03-21 devnull return 0;
241 038e9089 2004-03-21 devnull }
242 038e9089 2004-03-21 devnull
243 038e9089 2004-03-21 devnull void
244 038e9089 2004-03-21 devnull initscreen(ScreenInfo *s, int i, int background)
245 038e9089 2004-03-21 devnull {
246 038e9089 2004-03-21 devnull char *ds, *colon, *dot1;
247 038e9089 2004-03-21 devnull unsigned long mask;
248 c005568a 2004-03-30 devnull unsigned long gmask;
249 038e9089 2004-03-21 devnull XGCValues gv;
250 038e9089 2004-03-21 devnull XSetWindowAttributes attr;
251 c005568a 2004-03-30 devnull XVisualInfo xvi;
252 c005568a 2004-03-30 devnull XSetWindowAttributes attrs;
253 038e9089 2004-03-21 devnull
254 038e9089 2004-03-21 devnull s->num = i;
255 038e9089 2004-03-21 devnull s->root = RootWindow(dpy, i);
256 038e9089 2004-03-21 devnull s->def_cmap = DefaultColormap(dpy, i);
257 038e9089 2004-03-21 devnull s->min_cmaps = MinCmapsOfScreen(ScreenOfDisplay(dpy, i));
258 038e9089 2004-03-21 devnull s->depth = DefaultDepth(dpy, i);
259 038e9089 2004-03-21 devnull
260 fa325e9b 2020-01-10 cross /*
261 c005568a 2004-03-30 devnull * Figure out underlying screen format.
262 c005568a 2004-03-30 devnull */
263 c005568a 2004-03-30 devnull if(XMatchVisualInfo(dpy, i, 16, TrueColor, &xvi)
264 c005568a 2004-03-30 devnull || XMatchVisualInfo(dpy, i, 16, DirectColor, &xvi)){
265 c005568a 2004-03-30 devnull s->vis = xvi.visual;
266 c005568a 2004-03-30 devnull s->depth = 16;
267 c005568a 2004-03-30 devnull }
268 c005568a 2004-03-30 devnull else
269 c005568a 2004-03-30 devnull if(XMatchVisualInfo(dpy, i, 15, TrueColor, &xvi)
270 c005568a 2004-03-30 devnull || XMatchVisualInfo(dpy, i, 15, DirectColor, &xvi)){
271 c005568a 2004-03-30 devnull s->vis = xvi.visual;
272 c005568a 2004-03-30 devnull s->depth = 15;
273 c005568a 2004-03-30 devnull }
274 c005568a 2004-03-30 devnull else
275 c005568a 2004-03-30 devnull if(XMatchVisualInfo(dpy, i, 24, TrueColor, &xvi)
276 c005568a 2004-03-30 devnull || XMatchVisualInfo(dpy, i, 24, DirectColor, &xvi)){
277 c005568a 2004-03-30 devnull s->vis = xvi.visual;
278 c005568a 2004-03-30 devnull s->depth = 24;
279 c005568a 2004-03-30 devnull }
280 c005568a 2004-03-30 devnull else
281 c005568a 2004-03-30 devnull if(XMatchVisualInfo(dpy, i, 8, PseudoColor, &xvi)
282 c005568a 2004-03-30 devnull || XMatchVisualInfo(dpy, i, 8, StaticColor, &xvi)){
283 c005568a 2004-03-30 devnull s->vis = xvi.visual;
284 c005568a 2004-03-30 devnull s->depth = 8;
285 c005568a 2004-03-30 devnull }
286 c005568a 2004-03-30 devnull else{
287 c005568a 2004-03-30 devnull s->depth = DefaultDepth(dpy, i);
288 c005568a 2004-03-30 devnull if(s->depth != 8){
289 c005568a 2004-03-30 devnull fprintf(stderr, "can't understand depth %d screen", s->depth);
290 c005568a 2004-03-30 devnull exit(1);
291 c005568a 2004-03-30 devnull }
292 c005568a 2004-03-30 devnull s->vis = DefaultVisual(dpy, i);
293 c005568a 2004-03-30 devnull }
294 ac33a34a 2005-07-13 devnull if(DefaultDepth(dpy, i) != s->depth){
295 fa325e9b 2020-01-10 cross s->def_cmap = XCreateColormap(dpy, s->root, s->vis, AllocNone);
296 c005568a 2004-03-30 devnull }
297 c005568a 2004-03-30 devnull
298 038e9089 2004-03-21 devnull ds = DisplayString(dpy);
299 038e9089 2004-03-21 devnull colon = rindex(ds, ':');
300 ac33a34a 2005-07-13 devnull if(colon && num_screens > 1){
301 038e9089 2004-03-21 devnull strcpy(s->display, "DISPLAY=");
302 038e9089 2004-03-21 devnull strcat(s->display, ds);
303 038e9089 2004-03-21 devnull colon = s->display + 8 + (colon - ds); /* use version in buf */
304 038e9089 2004-03-21 devnull dot1 = index(colon, '.'); /* first period after colon */
305 ac33a34a 2005-07-13 devnull if(!dot1)
306 038e9089 2004-03-21 devnull dot1 = colon + strlen(colon); /* if not there, append */
307 038e9089 2004-03-21 devnull sprintf(dot1, ".%d", i);
308 038e9089 2004-03-21 devnull }
309 038e9089 2004-03-21 devnull else
310 038e9089 2004-03-21 devnull s->display[0] = '\0';
311 038e9089 2004-03-21 devnull
312 038e9089 2004-03-21 devnull s->black = BlackPixel(dpy, i);
313 038e9089 2004-03-21 devnull s->white = WhitePixel(dpy, i);
314 7934b1c6 2004-04-05 devnull s->activeholdborder = colorpixel(dpy, s, s->depth, 0x000099, s->white);
315 7934b1c6 2004-04-05 devnull s->inactiveholdborder = colorpixel(dpy, s, s->depth, 0x005DBB, s->black);
316 7934b1c6 2004-04-05 devnull s->activeborder = colorpixel(dpy, s, s->depth, 0x55AAAA, s->black);
317 7934b1c6 2004-04-05 devnull s->inactiveborder = colorpixel(dpy, s, s->depth, 0x9EEEEE, s->white);
318 7934b1c6 2004-04-05 devnull s->red = colorpixel(dpy, s, s->depth, 0xDD0000, s->white);
319 038e9089 2004-03-21 devnull s->width = WidthOfScreen(ScreenOfDisplay(dpy, i));
320 038e9089 2004-03-21 devnull s->height = HeightOfScreen(ScreenOfDisplay(dpy, i));
321 038e9089 2004-03-21 devnull s->bkup[0] = XCreatePixmap(dpy, s->root, 2*s->width, BORDER, DefaultDepth(dpy, i));
322 038e9089 2004-03-21 devnull s->bkup[1] = XCreatePixmap(dpy, s->root, BORDER, 2*s->height, DefaultDepth(dpy, i));
323 038e9089 2004-03-21 devnull
324 038e9089 2004-03-21 devnull gv.foreground = s->black^s->white;
325 038e9089 2004-03-21 devnull gv.background = s->white;
326 038e9089 2004-03-21 devnull gv.function = GXxor;
327 038e9089 2004-03-21 devnull gv.line_width = 0;
328 038e9089 2004-03-21 devnull gv.subwindow_mode = IncludeInferiors;
329 c005568a 2004-03-30 devnull gmask = GCForeground | GCBackground | GCFunction | GCLineWidth
330 038e9089 2004-03-21 devnull | GCSubwindowMode;
331 ac33a34a 2005-07-13 devnull if(font != 0){
332 038e9089 2004-03-21 devnull gv.font = font->fid;
333 c005568a 2004-03-30 devnull gmask |= GCFont;
334 038e9089 2004-03-21 devnull }
335 c005568a 2004-03-30 devnull s->gc = XCreateGC(dpy, s->root, gmask, &gv);
336 038e9089 2004-03-21 devnull
337 038e9089 2004-03-21 devnull gv.function = GXcopy;
338 c005568a 2004-03-30 devnull s->gccopy = XCreateGC(dpy, s->root, gmask, &gv);
339 038e9089 2004-03-21 devnull
340 038e9089 2004-03-21 devnull gv.foreground = s->red;
341 c005568a 2004-03-30 devnull s->gcred = XCreateGC(dpy, s->root, gmask, &gv);
342 038e9089 2004-03-21 devnull
343 7934b1c6 2004-04-05 devnull gv.foreground = colorpixel(dpy, s, s->depth, 0xEEEEEE, s->black);
344 c005568a 2004-03-30 devnull s->gcsweep = XCreateGC(dpy, s->root, gmask, &gv);
345 038e9089 2004-03-21 devnull
346 038e9089 2004-03-21 devnull initcurs(s);
347 038e9089 2004-03-21 devnull
348 038e9089 2004-03-21 devnull attr.cursor = s->arrow;
349 038e9089 2004-03-21 devnull attr.event_mask = SubstructureRedirectMask
350 038e9089 2004-03-21 devnull | SubstructureNotifyMask | ColormapChangeMask
351 fa325e9b 2020-01-10 cross | ButtonPressMask | ButtonReleaseMask | PropertyChangeMask
352 d52fb463 2005-08-11 devnull | KeyPressMask | EnterWindowMask;
353 038e9089 2004-03-21 devnull mask = CWCursor|CWEventMask;
354 038e9089 2004-03-21 devnull XChangeWindowAttributes(dpy, s->root, mask, &attr);
355 038e9089 2004-03-21 devnull XSync(dpy, False);
356 038e9089 2004-03-21 devnull
357 ac33a34a 2005-07-13 devnull if(background){
358 038e9089 2004-03-21 devnull XSetWindowBackgroundPixmap(dpy, s->root, s->root_pixmap);
359 038e9089 2004-03-21 devnull XClearWindow(dpy, s->root);
360 8ad51794 2004-03-25 devnull } else
361 038e9089 2004-03-21 devnull system("xsetroot -solid grey30");
362 c005568a 2004-03-30 devnull
363 7934b1c6 2004-04-05 devnull attrs.border_pixel = colorpixel(dpy, s, s->depth, 0x88CC88, s->black);
364 7934b1c6 2004-04-05 devnull attrs.background_pixel = colorpixel(dpy, s, s->depth, 0xE9FFE9, s->white);
365 c005568a 2004-03-30 devnull attrs.colormap = s->def_cmap;
366 c005568a 2004-03-30 devnull
367 c005568a 2004-03-30 devnull s->menuwin = XCreateWindow(dpy, s->root, 0, 0, 1, 1, 2,
368 c005568a 2004-03-30 devnull s->depth,
369 c005568a 2004-03-30 devnull CopyFromParent,
370 c005568a 2004-03-30 devnull s->vis,
371 7934b1c6 2004-04-05 devnull CWBackPixel | CWBorderPixel | CWColormap,
372 c005568a 2004-03-30 devnull &attrs
373 c005568a 2004-03-30 devnull );
374 c005568a 2004-03-30 devnull
375 7934b1c6 2004-04-05 devnull
376 7934b1c6 2004-04-05 devnull gv.foreground = colorpixel(dpy, s, s->depth, 0xE9FFE9, s->white);
377 7934b1c6 2004-04-05 devnull s->gcmenubg = XCreateGC(dpy, s->menuwin, gmask, &gv);
378 7934b1c6 2004-04-05 devnull
379 7934b1c6 2004-04-05 devnull gv.foreground = colorpixel(dpy, s, s->depth, 0x448844, s->black);
380 7934b1c6 2004-04-05 devnull s->gcmenubgs = XCreateGC(dpy, s->menuwin, gmask, &gv);
381 7934b1c6 2004-04-05 devnull
382 7934b1c6 2004-04-05 devnull gv.foreground = s->black;
383 7934b1c6 2004-04-05 devnull gv.background = colorpixel(dpy, s, s->depth, 0xE9FFE9, s->white);
384 7934b1c6 2004-04-05 devnull s->gcmenufg = XCreateGC(dpy, s->menuwin, gmask, &gv);
385 7934b1c6 2004-04-05 devnull
386 7934b1c6 2004-04-05 devnull gv.foreground = colorpixel(dpy, s, s->depth, 0xE9FFE9, s->white);
387 7934b1c6 2004-04-05 devnull gv.background = colorpixel(dpy, s, s->depth, 0x448844, s->black);
388 7934b1c6 2004-04-05 devnull s->gcmenufgs = XCreateGC(dpy, s->menuwin, gmask, &gv);
389 7934b1c6 2004-04-05 devnull
390 c005568a 2004-03-30 devnull attrs.border_pixel = s->red;
391 7934b1c6 2004-04-05 devnull attrs.background_pixel = colorpixel(dpy, s, s->depth, 0xEEEEEE, s->black);
392 c005568a 2004-03-30 devnull attrs.colormap = s->def_cmap;
393 1cb3fa80 2004-03-29 devnull s->sweepwin = XCreateWindow(dpy, s->root, 0, 0, 1, 1, 4,
394 c005568a 2004-03-30 devnull s->depth,
395 1cb3fa80 2004-03-29 devnull CopyFromParent,
396 c005568a 2004-03-30 devnull s->vis,
397 7934b1c6 2004-04-05 devnull CWBackPixel | CWBorderPixel | CWColormap,
398 1cb3fa80 2004-03-29 devnull &attrs
399 1cb3fa80 2004-03-29 devnull );
400 038e9089 2004-03-21 devnull }
401 038e9089 2004-03-21 devnull
402 038e9089 2004-03-21 devnull ScreenInfo*
403 038e9089 2004-03-21 devnull getscreen(Window w)
404 038e9089 2004-03-21 devnull {
405 038e9089 2004-03-21 devnull int i;
406 038e9089 2004-03-21 devnull
407 ac33a34a 2005-07-13 devnull for(i = 0; i < num_screens; i++)
408 ac33a34a 2005-07-13 devnull if(screens[i].root == w)
409 038e9089 2004-03-21 devnull return &screens[i];
410 038e9089 2004-03-21 devnull
411 038e9089 2004-03-21 devnull return 0;
412 038e9089 2004-03-21 devnull }
413 038e9089 2004-03-21 devnull
414 038e9089 2004-03-21 devnull Time
415 038e9089 2004-03-21 devnull timestamp(void)
416 038e9089 2004-03-21 devnull {
417 038e9089 2004-03-21 devnull XEvent ev;
418 038e9089 2004-03-21 devnull
419 ac33a34a 2005-07-13 devnull if(curtime == CurrentTime){
420 aa808685 2004-04-19 devnull XChangeProperty(dpy, screens[0].root, _rio_running, _rio_running, 8,
421 038e9089 2004-03-21 devnull PropModeAppend, (unsigned char *)"", 0);
422 038e9089 2004-03-21 devnull XMaskEvent(dpy, PropertyChangeMask, &ev);
423 038e9089 2004-03-21 devnull curtime = ev.xproperty.time;
424 038e9089 2004-03-21 devnull }
425 038e9089 2004-03-21 devnull return curtime;
426 038e9089 2004-03-21 devnull }
427 038e9089 2004-03-21 devnull
428 038e9089 2004-03-21 devnull void
429 56afeac8 2004-08-06 devnull sendcmessage(Window w, Atom a, long x, int isroot, int usemask)
430 038e9089 2004-03-21 devnull {
431 038e9089 2004-03-21 devnull XEvent ev;
432 038e9089 2004-03-21 devnull int status;
433 038e9089 2004-03-21 devnull long mask;
434 038e9089 2004-03-21 devnull
435 038e9089 2004-03-21 devnull memset(&ev, 0, sizeof(ev));
436 038e9089 2004-03-21 devnull ev.xclient.type = ClientMessage;
437 038e9089 2004-03-21 devnull ev.xclient.window = w;
438 038e9089 2004-03-21 devnull ev.xclient.message_type = a;
439 038e9089 2004-03-21 devnull ev.xclient.format = 32;
440 038e9089 2004-03-21 devnull ev.xclient.data.l[0] = x;
441 038e9089 2004-03-21 devnull ev.xclient.data.l[1] = timestamp();
442 2c1b986e 2004-08-13 devnull mask = 0;
443 2c1b986e 2004-08-13 devnull if(usemask){
444 2c1b986e 2004-08-13 devnull mask |= KeyPressMask; /* seems to be necessary */
445 ac33a34a 2005-07-13 devnull if(isroot)
446 2c1b986e 2004-08-13 devnull mask |= SubstructureRedirectMask; /* magic! */
447 2c1b986e 2004-08-13 devnull else
448 2c1b986e 2004-08-13 devnull mask |= ExposureMask; /* not really correct but so be it */
449 2c1b986e 2004-08-13 devnull }
450 038e9089 2004-03-21 devnull status = XSendEvent(dpy, w, False, mask, &ev);
451 ac33a34a 2005-07-13 devnull if(status == 0)
452 aa808685 2004-04-19 devnull fprintf(stderr, "rio: sendcmessage failed\n");
453 038e9089 2004-03-21 devnull }
454 038e9089 2004-03-21 devnull
455 038e9089 2004-03-21 devnull void
456 038e9089 2004-03-21 devnull sendconfig(Client *c)
457 038e9089 2004-03-21 devnull {
458 038e9089 2004-03-21 devnull XConfigureEvent ce;
459 038e9089 2004-03-21 devnull
460 038e9089 2004-03-21 devnull ce.type = ConfigureNotify;
461 038e9089 2004-03-21 devnull ce.event = c->window;
462 038e9089 2004-03-21 devnull ce.window = c->window;
463 038e9089 2004-03-21 devnull ce.x = c->x;
464 038e9089 2004-03-21 devnull ce.y = c->y;
465 038e9089 2004-03-21 devnull ce.width = c->dx;
466 038e9089 2004-03-21 devnull ce.height = c->dy;
467 038e9089 2004-03-21 devnull ce.border_width = c->border;
468 038e9089 2004-03-21 devnull ce.above = None;
469 038e9089 2004-03-21 devnull ce.override_redirect = 0;
470 038e9089 2004-03-21 devnull XSendEvent(dpy, c->window, False, StructureNotifyMask, (XEvent*)&ce);
471 038e9089 2004-03-21 devnull }
472 038e9089 2004-03-21 devnull
473 038e9089 2004-03-21 devnull void
474 038e9089 2004-03-21 devnull sighandler(void)
475 038e9089 2004-03-21 devnull {
476 038e9089 2004-03-21 devnull signalled = 1;
477 038e9089 2004-03-21 devnull }
478 038e9089 2004-03-21 devnull
479 038e9089 2004-03-21 devnull void
480 038e9089 2004-03-21 devnull getevent(XEvent *e)
481 038e9089 2004-03-21 devnull {
482 038e9089 2004-03-21 devnull int fd;
483 038e9089 2004-03-21 devnull fd_set rfds;
484 038e9089 2004-03-21 devnull struct timeval t;
485 038e9089 2004-03-21 devnull
486 ac33a34a 2005-07-13 devnull if(!signalled){
487 ac33a34a 2005-07-13 devnull if(QLength(dpy) > 0){
488 038e9089 2004-03-21 devnull XNextEvent(dpy, e);
489 038e9089 2004-03-21 devnull return;
490 038e9089 2004-03-21 devnull }
491 038e9089 2004-03-21 devnull fd = ConnectionNumber(dpy);
492 038e9089 2004-03-21 devnull FD_ZERO(&rfds);
493 038e9089 2004-03-21 devnull FD_SET(fd, &rfds);
494 038e9089 2004-03-21 devnull t.tv_sec = t.tv_usec = 0;
495 ac33a34a 2005-07-13 devnull if(select(fd+1, &rfds, NULL, NULL, &t) == 1){
496 038e9089 2004-03-21 devnull XNextEvent(dpy, e);
497 038e9089 2004-03-21 devnull return;
498 038e9089 2004-03-21 devnull }
499 038e9089 2004-03-21 devnull XFlush(dpy);
500 038e9089 2004-03-21 devnull FD_SET(fd, &rfds);
501 ac33a34a 2005-07-13 devnull if(select(fd+1, &rfds, NULL, NULL, NULL) == 1){
502 038e9089 2004-03-21 devnull XNextEvent(dpy, e);
503 038e9089 2004-03-21 devnull return;
504 038e9089 2004-03-21 devnull }
505 ac33a34a 2005-07-13 devnull if(errno != EINTR || !signalled){
506 aa808685 2004-04-19 devnull perror("rio: select failed");
507 038e9089 2004-03-21 devnull exit(1);
508 038e9089 2004-03-21 devnull }
509 038e9089 2004-03-21 devnull }
510 aa808685 2004-04-19 devnull fprintf(stderr, "rio: exiting on signal\n");
511 038e9089 2004-03-21 devnull cleanup();
512 038e9089 2004-03-21 devnull exit(1);
513 038e9089 2004-03-21 devnull }
514 038e9089 2004-03-21 devnull
515 038e9089 2004-03-21 devnull void
516 038e9089 2004-03-21 devnull cleanup(void)
517 038e9089 2004-03-21 devnull {
518 038e9089 2004-03-21 devnull Client *c, *cc[2], *next;
519 038e9089 2004-03-21 devnull XWindowChanges wc;
520 038e9089 2004-03-21 devnull int i;
521 038e9089 2004-03-21 devnull
522 038e9089 2004-03-21 devnull /* order of un-reparenting determines final stacking order... */
523 038e9089 2004-03-21 devnull cc[0] = cc[1] = 0;
524 ac33a34a 2005-07-13 devnull for(c = clients; c; c = next){
525 038e9089 2004-03-21 devnull next = c->next;
526 038e9089 2004-03-21 devnull i = normal(c);
527 038e9089 2004-03-21 devnull c->next = cc[i];
528 038e9089 2004-03-21 devnull cc[i] = c;
529 038e9089 2004-03-21 devnull }
530 038e9089 2004-03-21 devnull
531 ac33a34a 2005-07-13 devnull for(i = 0; i < 2; i++){
532 ac33a34a 2005-07-13 devnull for(c = cc[i]; c; c = c->next){
533 ac33a34a 2005-07-13 devnull if(!withdrawn(c)){
534 038e9089 2004-03-21 devnull XReparentWindow(dpy, c->window, c->screen->root,
535 038e9089 2004-03-21 devnull c->x, c->y);
536 038e9089 2004-03-21 devnull }
537 038e9089 2004-03-21 devnull wc.border_width = c->border;
538 038e9089 2004-03-21 devnull XConfigureWindow(dpy, c->window, CWBorderWidth, &wc);
539 038e9089 2004-03-21 devnull }
540 038e9089 2004-03-21 devnull }
541 038e9089 2004-03-21 devnull
542 038e9089 2004-03-21 devnull XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, timestamp());
543 ac33a34a 2005-07-13 devnull for(i = 0; i < num_screens; i++)
544 038e9089 2004-03-21 devnull cmapnofocus(&screens[i]);
545 038e9089 2004-03-21 devnull XCloseDisplay(dpy);
546 038e9089 2004-03-21 devnull }