|
1 From 9bf12ae3168aa6f9234304a8a376d47962f0d589 Mon Sep 17 00:00:00 2001 |
|
2 From: Alan Coopersmith <[email protected]> |
|
3 Date: Sat, 2 Jan 2016 20:11:05 -0800 |
|
4 Subject: [PATCH] atoms |
|
5 |
|
6 Centralize atom handling and use XInternAtoms to get the atoms from |
|
7 the server in one round trip instead of a separate synchronous/blocking |
|
8 round trip for each XInternAtom individual call. |
|
9 |
|
10 Was offered upstream in 2011 - jwz responded with: |
|
11 I'd sure like to see some kind of performance metrics -- like, any -- before |
|
12 making a big change to something so central. When it comes to the xscreensaver |
|
13 driver I'm a firm believer in "don't fix what ain't broke"... |
|
14 |
|
15 Need to find some time to actually measure that someday (dtrace?). |
|
16 --- |
|
17 driver/Makefile.in | 14 +++--- |
|
18 driver/atoms.c | 113 ++++++++++++++++++++++++++++++++++++++++++ |
|
19 driver/atoms.h | 33 ++++++++++++ |
|
20 driver/demo-Gtk.c | 26 +++------- |
|
21 driver/demo-Xm.c | 25 +++------- |
|
22 driver/remote.c | 4 +- |
|
23 driver/windows.c | 3 +- |
|
24 driver/xscreensaver-command.c | 35 +++---------- |
|
25 driver/xscreensaver.c | 47 ++++++------------ |
|
26 driver/xscreensaver.h | 3 -- |
|
27 10 files changed, 189 insertions(+), 114 deletions(-) |
|
28 create mode 100644 driver/atoms.c |
|
29 create mode 100644 driver/atoms.h |
|
30 |
|
31 diff --git a/driver/Makefile.in b/driver/Makefile.in |
|
32 index a5b94bf..90ef1d2 100644 |
|
33 --- a/driver/Makefile.in |
|
34 +++ b/driver/Makefile.in |
|
35 @@ -188,18 +188,18 @@ SAVER_OBJS_1 = xscreensaver.o windows.o screens.o timers.o subprocs.o \ |
|
36 exec.o xset.o splash.o setuid.o stderr.o mlstring.o |
|
37 |
|
38 SAVER_SRCS = $(SAVER_SRCS_1) prefs.c dpms.c $(LOCK_SRCS) \ |
|
39 - $(SAVER_UTIL_SRCS) $(GL_SRCS) |
|
40 + $(SAVER_UTIL_SRCS) $(GL_SRCS) atoms.c |
|
41 SAVER_OBJS = $(SAVER_OBJS_1) prefs.o dpms.o $(LOCK_OBJS) \ |
|
42 - $(SAVER_UTIL_OBJS) $(GL_OBJS) |
|
43 + $(SAVER_UTIL_OBJS) $(GL_OBJS) atoms.o |
|
44 |
|
45 -CMD_SRCS = remote.c xscreensaver-command.c |
|
46 -CMD_OBJS = remote.o xscreensaver-command.o |
|
47 +CMD_SRCS = remote.c atoms.c xscreensaver-command.c |
|
48 +CMD_OBJS = remote.o atoms.o xscreensaver-command.o |
|
49 |
|
50 DEMO_SRCS_1 = prefs.c dpms.c |
|
51 DEMO_OBJS_1 = prefs.o dpms.o |
|
52 |
|
53 -DEMO_SRCS = $(DEMO_SRCS_1) remote.c exec.c $(DEMO_UTIL_SRCS) |
|
54 -DEMO_OBJS = $(DEMO_OBJS_1) remote.o exec.o $(DEMO_UTIL_OBJS) |
|
55 +DEMO_SRCS = $(DEMO_SRCS_1) remote.c atoms.c exec.c $(DEMO_UTIL_SRCS) |
|
56 +DEMO_OBJS = $(DEMO_OBJS_1) remote.o atoms.o exec.o $(DEMO_UTIL_OBJS) |
|
57 |
|
58 PDF2JPEG_SRCS = pdf2jpeg.m |
|
59 PDF2JPEG_OBJS = pdf2jpeg.o |
|
60 @@ -228,7 +228,7 @@ SCRIPTS = $(SCRIPTS_1) @SCRIPTS_OSX@ |
|
61 |
|
62 HDRS = XScreenSaver_ad.h XScreenSaver_Xm_ad.h \ |
|
63 xscreensaver.h prefs.h remote.h exec.h \ |
|
64 - demo-Gtk-conf.h auth.h mlstring.h types.h |
|
65 + demo-Gtk-conf.h auth.h mlstring.h types.h atoms.h |
|
66 MEN_1 = xscreensaver.man xscreensaver-demo.man \ |
|
67 xscreensaver-command.man \ |
|
68 xscreensaver-text.man \ |
|
69 diff --git a/driver/atoms.c b/driver/atoms.c |
|
70 new file mode 100644 |
|
71 index 0000000..d50bc57 |
|
72 --- /dev/null |
|
73 +++ b/driver/atoms.c |
|
74 @@ -0,0 +1,113 @@ |
|
75 +/* xscreensaver, Copyright (c) 1991-2010 Jamie Zawinski <[email protected]> |
|
76 + * |
|
77 + * Permission to use, copy, modify, distribute, and sell this software and its |
|
78 + * documentation for any purpose is hereby granted without fee, provided that |
|
79 + * the above copyright notice appear in all copies and that both that |
|
80 + * copyright notice and this permission notice appear in supporting |
|
81 + * documentation. No representations are made about the suitability of this |
|
82 + * software for any purpose. It is provided "as is" without express or |
|
83 + * implied warranty. |
|
84 + */ |
|
85 + |
|
86 +#ifdef HAVE_CONFIG_H |
|
87 +# include "config.h" |
|
88 +#endif |
|
89 + |
|
90 +#include <stdio.h> |
|
91 +#include <stdlib.h> |
|
92 +#include <sys/types.h> |
|
93 + |
|
94 +#include <X11/Xproto.h> /* for CARD32 */ |
|
95 +#include <X11/Xlib.h> |
|
96 +#include <X11/Xos.h> |
|
97 + |
|
98 +#include "atoms.h" |
|
99 + |
|
100 +/* Atoms to retrieve info from remote daemon */ |
|
101 +Atom XA_SCREENSAVER, XA_SCREENSAVER_ID, XA_SCREENSAVER_VERSION, |
|
102 + XA_SCREENSAVER_RESPONSE, XA_SCREENSAVER_STATUS; |
|
103 + |
|
104 +/* Atoms to send commands to remote daemon */ |
|
105 +Atom XA_ACTIVATE, XA_BLANK, XA_CYCLE, XA_DEACTIVATE, XA_DEMO, |
|
106 + XA_EXIT, XA_LOCK, XA_NEXT, XA_PREFS, XA_PREV, XA_RESTART, |
|
107 + XA_SELECT, XA_THROTTLE, XA_UNTHROTTLE; |
|
108 + |
|
109 +static const struct atom_request remote_control_atom_list[] = |
|
110 +{ |
|
111 + { &XA_SCREENSAVER, "SCREENSAVER" }, |
|
112 + { &XA_SCREENSAVER_ID, "_SCREENSAVER_ID" }, |
|
113 + { &XA_SCREENSAVER_VERSION, "_SCREENSAVER_VERSION" }, |
|
114 + { &XA_SCREENSAVER_RESPONSE, "_SCREENSAVER_RESPONSE" }, |
|
115 + { &XA_SCREENSAVER_STATUS, "_SCREENSAVER_STATUS" }, |
|
116 + { &XA_ACTIVATE, "ACTIVATE" }, |
|
117 + { &XA_BLANK, "BLANK" }, |
|
118 + { &XA_CYCLE, "CYCLE" }, |
|
119 + { &XA_DEACTIVATE, "DEACTIVATE" }, |
|
120 + { &XA_DEMO, "DEMO" }, |
|
121 + { &XA_EXIT, "EXIT" }, |
|
122 + { &XA_LOCK, "LOCK" }, |
|
123 + { &XA_NEXT, "NEXT" }, |
|
124 + { &XA_PREFS, "PREFS" }, |
|
125 + { &XA_PREV, "PREV" }, |
|
126 + { &XA_RESTART, "RESTART" }, |
|
127 + { &XA_SELECT, "SELECT" }, |
|
128 + { &XA_THROTTLE, "THROTTLE" }, |
|
129 + { &XA_UNTHROTTLE, "UNTHROTTLE" }, |
|
130 + { NULL, NULL } /* Must be last to terminate list */ |
|
131 +}; |
|
132 + |
|
133 +const struct atom_request *remote_control_atoms = remote_control_atom_list; |
|
134 + |
|
135 +/* Load a list of atoms in a single round trip to the X server instead of |
|
136 + waiting for a synchronous round trip for each and every atom */ |
|
137 +Status request_atoms ( Display *dpy, |
|
138 + const struct atom_request **request_lists ) |
|
139 +{ |
|
140 + int atom_count, n; |
|
141 + Status result; |
|
142 + const struct atom_request **l, *r; |
|
143 + Atom *atoms; |
|
144 + const char **names; |
|
145 + |
|
146 + /* Count the number of items across all the lists passed in */ |
|
147 + atom_count = 0; |
|
148 + for (l = request_lists; l != NULL && *l != NULL; l++) |
|
149 + { |
|
150 + for (r = *l; r != NULL && r->name != NULL; r++) |
|
151 + { |
|
152 + atom_count++; |
|
153 + } |
|
154 + } |
|
155 + |
|
156 + atoms = calloc(atom_count, sizeof(Atom)); |
|
157 + names = calloc(atom_count, sizeof(char *)); |
|
158 + if (!atoms || !names) |
|
159 + return -1; |
|
160 + |
|
161 + n = 0; |
|
162 + for (l = request_lists; l != NULL && *l != NULL; l++) |
|
163 + { |
|
164 + for (r = *l; r != NULL && r->name != NULL; r++) |
|
165 + { |
|
166 + names[n++] = r->name; |
|
167 + } |
|
168 + } |
|
169 + result = XInternAtoms( dpy, (char **) names, atom_count, False, atoms ); |
|
170 + |
|
171 + n = 0; |
|
172 + for (l = request_lists; l != NULL && *l != NULL; l++) |
|
173 + { |
|
174 + for (r = *l; r != NULL && r->name != NULL; r++) |
|
175 + { |
|
176 +#if DEBUG_ATOMS |
|
177 + fprintf (stderr, "atom: %s => %d\n", names[n], atoms[n]); |
|
178 +#endif |
|
179 + *(r->atomp) = atoms[n++]; |
|
180 + } |
|
181 + } |
|
182 + |
|
183 + free(atoms); |
|
184 + free(names); |
|
185 + |
|
186 + return result; |
|
187 +} |
|
188 diff --git a/driver/atoms.h b/driver/atoms.h |
|
189 new file mode 100644 |
|
190 index 0000000..09e78f3 |
|
191 --- /dev/null |
|
192 +++ b/driver/atoms.h |
|
193 @@ -0,0 +1,33 @@ |
|
194 +/* xscreensaver, Copyright (c) 1991-2010 Jamie Zawinski <[email protected]> |
|
195 + * |
|
196 + * Permission to use, copy, modify, distribute, and sell this software and its |
|
197 + * documentation for any purpose is hereby granted without fee, provided that |
|
198 + * the above copyright notice appear in all copies and that both that |
|
199 + * copyright notice and this permission notice appear in supporting |
|
200 + * documentation. No representations are made about the suitability of this |
|
201 + * software for any purpose. It is provided "as is" without express or |
|
202 + * implied warranty. |
|
203 + */ |
|
204 + |
|
205 +#ifndef _XSCREENSAVER_ATOMS_H_ |
|
206 +#define _XSCREENSAVER_ATOMS_H_ |
|
207 + |
|
208 +struct atom_request { |
|
209 + Atom *atomp; |
|
210 + const char *name; |
|
211 +}; |
|
212 + |
|
213 +extern const struct atom_request *remote_control_atoms; |
|
214 +extern Status request_atoms ( Display *dpy, |
|
215 + const struct atom_request **request_lists ); |
|
216 + |
|
217 +/* Atoms to retrieve info from remote daemon */ |
|
218 +extern Atom XA_SCREENSAVER, XA_SCREENSAVER_ID, XA_SCREENSAVER_VERSION, |
|
219 + XA_SCREENSAVER_RESPONSE, XA_SCREENSAVER_STATUS; |
|
220 + |
|
221 +/* Atoms to send commands to remote daemon */ |
|
222 +extern Atom XA_ACTIVATE, XA_BLANK, XA_CYCLE, XA_DEACTIVATE, XA_DEMO, |
|
223 + XA_EXIT, XA_LOCK, XA_NEXT, XA_PREFS, XA_PREV, XA_RESTART, |
|
224 + XA_SELECT, XA_THROTTLE, XA_UNTHROTTLE; |
|
225 + |
|
226 +#endif /* _XSCREENSAVER_ATOMS_H_ */ |
|
227 diff --git a/driver/demo-Gtk.c b/driver/demo-Gtk.c |
|
228 index 6c449f2..3fa27c3 100644 |
|
229 --- a/driver/demo-Gtk.c |
|
230 +++ b/driver/demo-Gtk.c |
|
231 @@ -118,6 +118,7 @@ |
|
232 #include "resources.h" /* for parse_time() */ |
|
233 #include "visual.h" /* for has_writable_cells() */ |
|
234 #include "remote.h" /* for xscreensaver_command() */ |
|
235 +#include "atoms.h" |
|
236 #include "usleep.h" |
|
237 |
|
238 #include "logo-50.xpm" |
|
239 @@ -247,12 +248,6 @@ typedef struct { |
|
240 a closure object of our own down into the various widget callbacks. */ |
|
241 static state *global_state_kludge; |
|
242 |
|
243 -Atom XA_VROOT; |
|
244 -Atom XA_SCREENSAVER, XA_SCREENSAVER_RESPONSE, XA_SCREENSAVER_VERSION; |
|
245 -Atom XA_SCREENSAVER_ID, XA_SCREENSAVER_STATUS, XA_SELECT, XA_DEMO; |
|
246 -Atom XA_ACTIVATE, XA_BLANK, XA_LOCK, XA_RESTART, XA_EXIT; |
|
247 - |
|
248 - |
|
249 static void populate_demo_window (state *, int list_elt); |
|
250 static void populate_prefs_page (state *); |
|
251 static void populate_popup_window (state *); |
|
252 @@ -5068,20 +5063,11 @@ main (int argc, char **argv) |
|
253 |
|
254 /* Intern the atoms that xscreensaver_command() needs. |
|
255 */ |
|
256 - XA_VROOT = XInternAtom (dpy, "__SWM_VROOT", False); |
|
257 - XA_SCREENSAVER = XInternAtom (dpy, "SCREENSAVER", False); |
|
258 - XA_SCREENSAVER_VERSION = XInternAtom (dpy, "_SCREENSAVER_VERSION",False); |
|
259 - XA_SCREENSAVER_STATUS = XInternAtom (dpy, "_SCREENSAVER_STATUS", False); |
|
260 - XA_SCREENSAVER_ID = XInternAtom (dpy, "_SCREENSAVER_ID", False); |
|
261 - XA_SCREENSAVER_RESPONSE = XInternAtom (dpy, "_SCREENSAVER_RESPONSE", False); |
|
262 - XA_SELECT = XInternAtom (dpy, "SELECT", False); |
|
263 - XA_DEMO = XInternAtom (dpy, "DEMO", False); |
|
264 - XA_ACTIVATE = XInternAtom (dpy, "ACTIVATE", False); |
|
265 - XA_BLANK = XInternAtom (dpy, "BLANK", False); |
|
266 - XA_LOCK = XInternAtom (dpy, "LOCK", False); |
|
267 - XA_EXIT = XInternAtom (dpy, "EXIT", False); |
|
268 - XA_RESTART = XInternAtom (dpy, "RESTART", False); |
|
269 - |
|
270 + { |
|
271 + const struct atom_request *atom_lists[2] = { NULL, NULL }; |
|
272 + atom_lists[0] = remote_control_atoms; |
|
273 + request_atoms (dpy, atom_lists); |
|
274 + } |
|
275 |
|
276 /* Create the window and all its widgets. |
|
277 */ |
|
278 diff --git a/driver/demo-Xm.c b/driver/demo-Xm.c |
|
279 index 56d1aac..a3e6567 100644 |
|
280 --- a/driver/demo-Xm.c |
|
281 +++ b/driver/demo-Xm.c |
|
282 @@ -82,6 +82,7 @@ |
|
283 #include "resources.h" /* for parse_time() */ |
|
284 #include "visual.h" /* for has_writable_cells() */ |
|
285 #include "remote.h" /* for xscreensaver_command() */ |
|
286 +#include "atoms.h" |
|
287 #include "usleep.h" |
|
288 |
|
289 #include <stdio.h> |
|
290 @@ -110,12 +111,6 @@ extern const char *visual_menu[]; |
|
291 |
|
292 static char *short_version = 0; |
|
293 |
|
294 -Atom XA_VROOT; |
|
295 -Atom XA_SCREENSAVER, XA_SCREENSAVER_RESPONSE, XA_SCREENSAVER_VERSION; |
|
296 -Atom XA_SCREENSAVER_ID, XA_SCREENSAVER_STATUS, XA_SELECT, XA_DEMO; |
|
297 -Atom XA_ACTIVATE, XA_BLANK, XA_LOCK, XA_RESTART, XA_EXIT; |
|
298 - |
|
299 - |
|
300 static void populate_demo_window (Widget toplevel, |
|
301 int which, prefs_pair *pair); |
|
302 static void populate_prefs_page (Widget top, prefs_pair *pair); |
|
303 @@ -1791,19 +1786,11 @@ main (int argc, char **argv) |
|
304 |
|
305 /* Intern the atoms that xscreensaver_command() needs. |
|
306 */ |
|
307 - XA_VROOT = XInternAtom (dpy, "__SWM_VROOT", False); |
|
308 - XA_SCREENSAVER = XInternAtom (dpy, "SCREENSAVER", False); |
|
309 - XA_SCREENSAVER_VERSION = XInternAtom (dpy, "_SCREENSAVER_VERSION",False); |
|
310 - XA_SCREENSAVER_STATUS = XInternAtom (dpy, "_SCREENSAVER_STATUS", False); |
|
311 - XA_SCREENSAVER_ID = XInternAtom (dpy, "_SCREENSAVER_ID", False); |
|
312 - XA_SCREENSAVER_RESPONSE = XInternAtom (dpy, "_SCREENSAVER_RESPONSE", False); |
|
313 - XA_SELECT = XInternAtom (dpy, "SELECT", False); |
|
314 - XA_DEMO = XInternAtom (dpy, "DEMO", False); |
|
315 - XA_ACTIVATE = XInternAtom (dpy, "ACTIVATE", False); |
|
316 - XA_BLANK = XInternAtom (dpy, "BLANK", False); |
|
317 - XA_LOCK = XInternAtom (dpy, "LOCK", False); |
|
318 - XA_EXIT = XInternAtom (dpy, "EXIT", False); |
|
319 - XA_RESTART = XInternAtom (dpy, "RESTART", False); |
|
320 + { |
|
321 + const struct atom_request *atom_lists[2] = { NULL, NULL }; |
|
322 + atom_lists[0] = remote_control_atoms; |
|
323 + request_atoms (dpy, atom_lists); |
|
324 + } |
|
325 |
|
326 /* Create the window and all its widgets. |
|
327 */ |
|
328 diff --git a/driver/remote.c b/driver/remote.c |
|
329 index 775036a..59e30c1 100644 |
|
330 --- a/driver/remote.c |
|
331 +++ b/driver/remote.c |
|
332 @@ -34,15 +34,13 @@ |
|
333 #include <X11/Xos.h> |
|
334 |
|
335 #include "remote.h" |
|
336 +#include "atoms.h" |
|
337 |
|
338 #ifdef _VROOT_H_ |
|
339 ERROR! you must not include vroot.h in this file |
|
340 #endif |
|
341 |
|
342 extern char *progname; |
|
343 -extern Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_RESPONSE; |
|
344 -extern Atom XA_SCREENSAVER_ID, XA_SCREENSAVER_STATUS, XA_EXIT; |
|
345 -extern Atom XA_VROOT, XA_SELECT, XA_DEMO, XA_BLANK, XA_LOCK; |
|
346 |
|
347 |
|
348 static XErrorHandler old_handler = 0; |
|
349 diff --git a/driver/windows.c b/driver/windows.c |
|
350 index d33f251..6acaddb 100644 |
|
351 --- a/driver/windows.c |
|
352 +++ b/driver/windows.c |
|
353 @@ -69,14 +69,13 @@ typedef long PROP32; |
|
354 #include "xscreensaver.h" |
|
355 #include "visual.h" |
|
356 #include "fade.h" |
|
357 +#include "atoms.h" |
|
358 |
|
359 |
|
360 extern int kill (pid_t, int); /* signal() is in sys/signal.h... */ |
|
361 |
|
362 Atom XA_VROOT, XA_XSETROOT_ID, XA_ESETROOT_PMAP_ID, XA_XROOTPMAP_ID; |
|
363 Atom XA_NET_WM_USER_TIME; |
|
364 -Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_ID; |
|
365 -Atom XA_SCREENSAVER_STATUS; |
|
366 |
|
367 extern saver_info *global_si_kludge; /* I hate C so much... */ |
|
368 |
|
369 diff --git a/driver/xscreensaver-command.c b/driver/xscreensaver-command.c |
|
370 index 0057438..80b2813 100644 |
|
371 --- a/driver/xscreensaver-command.c |
|
372 +++ b/driver/xscreensaver-command.c |
|
373 @@ -40,6 +40,7 @@ |
|
374 typedef long PROP32; |
|
375 |
|
376 #include "remote.h" |
|
377 +#include "atoms.h" |
|
378 #include "version.h" |
|
379 |
|
380 #ifdef _VROOT_H_ |
|
381 @@ -48,13 +49,6 @@ ERROR! you must not include vroot.h in this file |
|
382 |
|
383 char *progname; |
|
384 |
|
385 -Atom XA_VROOT; |
|
386 -Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_RESPONSE; |
|
387 -Atom XA_SCREENSAVER_ID, XA_SCREENSAVER_STATUS, XA_SELECT, XA_DEMO, XA_EXIT; |
|
388 -Atom XA_BLANK, XA_LOCK; |
|
389 -static Atom XA_ACTIVATE, XA_DEACTIVATE, XA_CYCLE, XA_NEXT, XA_PREV; |
|
390 -static Atom XA_RESTART, XA_PREFS, XA_THROTTLE, XA_UNTHROTTLE; |
|
391 - |
|
392 static char *screensaver_version; |
|
393 # ifdef __GNUC__ |
|
394 __extension__ /* don't warn about "string length is greater than the |
|
395 @@ -292,28 +286,11 @@ main (int argc, char **argv) |
|
396 exit (1); |
|
397 } |
|
398 |
|
399 - XA_VROOT = XInternAtom (dpy, "__SWM_VROOT", False); |
|
400 - XA_SCREENSAVER = XInternAtom (dpy, "SCREENSAVER", False); |
|
401 - XA_SCREENSAVER_ID = XInternAtom (dpy, "_SCREENSAVER_ID", False); |
|
402 - XA_SCREENSAVER_VERSION = XInternAtom (dpy, "_SCREENSAVER_VERSION",False); |
|
403 - XA_SCREENSAVER_STATUS = XInternAtom (dpy, "_SCREENSAVER_STATUS", False); |
|
404 - XA_SCREENSAVER_RESPONSE = XInternAtom (dpy, "_SCREENSAVER_RESPONSE", False); |
|
405 - XA_ACTIVATE = XInternAtom (dpy, "ACTIVATE", False); |
|
406 - XA_DEACTIVATE = XInternAtom (dpy, "DEACTIVATE", False); |
|
407 - XA_RESTART = XInternAtom (dpy, "RESTART", False); |
|
408 - XA_CYCLE = XInternAtom (dpy, "CYCLE", False); |
|
409 - XA_NEXT = XInternAtom (dpy, "NEXT", False); |
|
410 - XA_PREV = XInternAtom (dpy, "PREV", False); |
|
411 - XA_SELECT = XInternAtom (dpy, "SELECT", False); |
|
412 - XA_EXIT = XInternAtom (dpy, "EXIT", False); |
|
413 - XA_DEMO = XInternAtom (dpy, "DEMO", False); |
|
414 - XA_PREFS = XInternAtom (dpy, "PREFS", False); |
|
415 - XA_LOCK = XInternAtom (dpy, "LOCK", False); |
|
416 - XA_BLANK = XInternAtom (dpy, "BLANK", False); |
|
417 - XA_THROTTLE = XInternAtom (dpy, "THROTTLE", False); |
|
418 - XA_UNTHROTTLE = XInternAtom (dpy, "UNTHROTTLE", False); |
|
419 - |
|
420 - XSync (dpy, 0); |
|
421 + { |
|
422 + const struct atom_request *atom_lists[2] = { NULL, NULL }; |
|
423 + atom_lists[0] = remote_control_atoms; |
|
424 + request_atoms (dpy, atom_lists); |
|
425 + } |
|
426 |
|
427 if (cmd == &XA_WATCH) |
|
428 { |
|
429 diff --git a/driver/xscreensaver.c b/driver/xscreensaver.c |
|
430 index 45f0f0c..06f5c13 100644 |
|
431 --- a/driver/xscreensaver.c |
|
432 +++ b/driver/xscreensaver.c |
|
433 @@ -232,6 +232,7 @@ |
|
434 #include "visual.h" |
|
435 #include "usleep.h" |
|
436 #include "auth.h" |
|
437 +#include "atoms.h" |
|
438 |
|
439 saver_info *global_si_kludge = 0; /* I hate C so much... */ |
|
440 |
|
441 @@ -240,12 +241,6 @@ char *progclass = 0; |
|
442 XrmDatabase db = 0; |
|
443 |
|
444 |
|
445 -static Atom XA_SCREENSAVER_RESPONSE; |
|
446 -static Atom XA_ACTIVATE, XA_DEACTIVATE, XA_CYCLE, XA_NEXT, XA_PREV; |
|
447 -static Atom XA_RESTART, XA_SELECT; |
|
448 -static Atom XA_THROTTLE, XA_UNTHROTTLE; |
|
449 -Atom XA_DEMO, XA_PREFS, XA_EXIT, XA_LOCK, XA_BLANK; |
|
450 - |
|
451 |
|
452 static XrmOptionDescRec options [] = { |
|
453 |
|
454 @@ -667,31 +662,21 @@ connect_to_server (saver_info *si, int *argc, char **argv) |
|
455 |
|
456 db = si->prefs.db; /* resources.c needs this */ |
|
457 |
|
458 - XA_VROOT = XInternAtom (si->dpy, "__SWM_VROOT", False); |
|
459 - XA_SCREENSAVER = XInternAtom (si->dpy, "SCREENSAVER", False); |
|
460 - XA_SCREENSAVER_VERSION = XInternAtom (si->dpy, "_SCREENSAVER_VERSION",False); |
|
461 - XA_SCREENSAVER_ID = XInternAtom (si->dpy, "_SCREENSAVER_ID", False); |
|
462 - XA_SCREENSAVER_STATUS = XInternAtom (si->dpy, "_SCREENSAVER_STATUS", False); |
|
463 - XA_SCREENSAVER_RESPONSE = XInternAtom (si->dpy, "_SCREENSAVER_RESPONSE", |
|
464 - False); |
|
465 - XA_XSETROOT_ID = XInternAtom (si->dpy, "_XSETROOT_ID", False); |
|
466 - XA_ESETROOT_PMAP_ID = XInternAtom (si->dpy, "ESETROOT_PMAP_ID", False); |
|
467 - XA_XROOTPMAP_ID = XInternAtom (si->dpy, "_XROOTPMAP_ID", False); |
|
468 - XA_NET_WM_USER_TIME = XInternAtom (si->dpy, "_NET_WM_USER_TIME", False); |
|
469 - XA_ACTIVATE = XInternAtom (si->dpy, "ACTIVATE", False); |
|
470 - XA_DEACTIVATE = XInternAtom (si->dpy, "DEACTIVATE", False); |
|
471 - XA_RESTART = XInternAtom (si->dpy, "RESTART", False); |
|
472 - XA_CYCLE = XInternAtom (si->dpy, "CYCLE", False); |
|
473 - XA_NEXT = XInternAtom (si->dpy, "NEXT", False); |
|
474 - XA_PREV = XInternAtom (si->dpy, "PREV", False); |
|
475 - XA_SELECT = XInternAtom (si->dpy, "SELECT", False); |
|
476 - XA_EXIT = XInternAtom (si->dpy, "EXIT", False); |
|
477 - XA_DEMO = XInternAtom (si->dpy, "DEMO", False); |
|
478 - XA_PREFS = XInternAtom (si->dpy, "PREFS", False); |
|
479 - XA_LOCK = XInternAtom (si->dpy, "LOCK", False); |
|
480 - XA_BLANK = XInternAtom (si->dpy, "BLANK", False); |
|
481 - XA_THROTTLE = XInternAtom (si->dpy, "THROTTLE", False); |
|
482 - XA_UNTHROTTLE = XInternAtom (si->dpy, "UNTHROTTLE", False); |
|
483 + { |
|
484 + const struct atom_request root_atoms[] = |
|
485 + { |
|
486 + { &XA_VROOT, "__SWM_VROOT" }, |
|
487 + { &XA_XSETROOT_ID, "_XSETROOT_ID" }, |
|
488 + { &XA_ESETROOT_PMAP_ID, "ESETROOT_PMAP_ID" }, |
|
489 + { &XA_XROOTPMAP_ID, "_XROOTPMAP_ID" }, |
|
490 + { &XA_NET_WM_USER_TIME, "_NET_WM_USER_TIME" }, |
|
491 + { NULL, NULL } /* Must be last to terminate list */ |
|
492 + }; |
|
493 + const struct atom_request *atom_lists[3] = { NULL, NULL, NULL }; |
|
494 + atom_lists[0] = remote_control_atoms; |
|
495 + atom_lists[1] = root_atoms; |
|
496 + request_atoms (si->dpy, atom_lists); |
|
497 + } |
|
498 |
|
499 return toplevel_shell; |
|
500 } |
|
501 diff --git a/driver/xscreensaver.h b/driver/xscreensaver.h |
|
502 index d67966e..064e9c4 100644 |
|
503 --- a/driver/xscreensaver.h |
|
504 +++ b/driver/xscreensaver.h |
|
505 @@ -202,8 +202,5 @@ Bool safe_XF86VidModeGetViewPort (Display *, int, int *, int *); |
|
506 |
|
507 extern Atom XA_VROOT, XA_XSETROOT_ID, XA_ESETROOT_PMAP_ID, XA_XROOTPMAP_ID; |
|
508 extern Atom XA_NET_WM_USER_TIME; |
|
509 -extern Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_ID; |
|
510 -extern Atom XA_SCREENSAVER_STATUS, XA_LOCK, XA_BLANK; |
|
511 -extern Atom XA_DEMO, XA_PREFS; |
|
512 |
|
513 #endif /* __XSCREENSAVER_H__ */ |
|
514 -- |
|
515 2.6.1 |
|
516 |