http://ftp.x.org/contrib/applications/xscreensaver-3.06.tar.gz
[xscreensaver] / driver / xscreensaver.h
1 /* xscreensaver, Copyright (c) 1993-1998 Jamie Zawinski <jwz@jwz.org>
2  *
3  * Permission to use, copy, modify, distribute, and sell this software and its
4  * documentation for any purpose is hereby granted without fee, provided that
5  * the above copyright notice appear in all copies and that both that
6  * copyright notice and this permission notice appear in supporting
7  * documentation.  No representations are made about the suitability of this
8  * software for any purpose.  It is provided "as is" without express or 
9  * implied warranty.
10  */
11
12 #ifndef __XSCREENSAVER_H__
13 #define __XSCREENSAVER_H__
14
15 #include <stdlib.h>
16 #ifdef HAVE_UNISTD_H
17 # include <unistd.h>
18 #endif
19
20 #include <string.h>
21 #include <stdio.h>
22
23 #include "prefs.h"
24
25 extern char *progname;
26 extern char *progclass;
27
28 typedef struct saver_info saver_info;
29 typedef struct saver_screen_info saver_screen_info;
30 typedef struct passwd_dialog_data passwd_dialog_data;
31 typedef struct splash_dialog_data splash_dialog_data;
32
33 #undef countof
34 #define countof(x) (sizeof((x))/sizeof((*x)))
35
36
37
38 /* This structure holds all the data that applies to the program as a whole,
39    or to the non-screen-specific parts of the display connection.
40
41    The saver_preferences structure (prefs.h) holds all the user-specified
42    parameters, read from the command line, the resource database, or entered
43    through a dialog box.
44  */
45 struct saver_info {
46   char *version;
47   saver_preferences prefs;
48
49   int nscreens;
50   saver_screen_info *screens;
51   saver_screen_info *default_screen;    /* ...on which dialogs will appear. */
52
53
54   /* =======================================================================
55      global connection info
56      ======================================================================= */
57
58   XtAppContext app;
59   Display *dpy;
60
61   /* =======================================================================
62      server extension info
63      ======================================================================= */
64
65   Bool using_xidle_extension;      /* which extension is being used.         */
66   Bool using_mit_saver_extension;  /* Note that `p->use_*' is the *request*, */
67   Bool using_sgi_saver_extension;  /* and `si->using_*' is the *reality*.    */
68
69 # ifdef HAVE_MIT_SAVER_EXTENSION
70   int mit_saver_ext_event_number;
71   int mit_saver_ext_error_number;
72 # endif
73 # ifdef HAVE_SGI_SAVER_EXTENSION
74   int sgi_saver_ext_event_number;
75   int sgi_saver_ext_error_number;
76 # endif
77
78
79   /* =======================================================================
80      blanking
81      ======================================================================= */
82
83   Bool screen_blanked_p;        /* Whether the saver is currently active. */
84   Window mouse_grab_window;     /* Window holding our mouse grab */
85   Window keyboard_grab_window;  /* Window holding our keyboard grab */
86
87
88   /* =======================================================================
89      locking and runtime privileges
90      ======================================================================= */
91
92   Bool locked_p;                /* Whether the screen is currently locked. */
93   Bool dbox_up_p;               /* Whether the demo-mode or passwd dialogs
94                                    are currently visible */
95
96   Bool locking_disabled_p;      /* Sometimes locking is impossible. */
97   char *nolock_reason;          /* This is why. */
98
99   char *orig_uid;               /* What uid/gid we had at startup, before
100                                    discarding privileges. */
101   char *uid_message;            /* Any diagnostics from our attempt to
102                                    discard privileges (printed only in
103                                    -verbose mode.) */
104   Bool dangerous_uid_p;         /* Set to true if we're running as a user id
105                                    which is known to not be a normal, non-
106                                    privileged user. */
107
108   Window passwd_dialog;         /* The password dialog, if its up. */
109   passwd_dialog_data *pw_data;  /* Other info necessary to draw it. */
110
111   int unlock_failures;          /* Counts failed login attempts while the
112                                    screen is locked. */
113
114
115   /* =======================================================================
116      demoing
117      ======================================================================= */
118
119   Bool demoing_p;               /* Whether we are demoing a single hack
120                                    (without UI.) */
121
122   Window splash_dialog;         /* The splash dialog, if its up. */
123   splash_dialog_data *sp_data;  /* Other info necessary to draw it. */
124
125
126   /* =======================================================================
127      timers
128      ======================================================================= */
129
130   XtIntervalId lock_id;         /* Timer to implement `prefs.lock_timeout' */
131   XtIntervalId cycle_id;        /* Timer to implement `prefs.cycle' */
132   XtIntervalId timer_id;        /* Timer to implement `prefs.timeout' */
133   XtIntervalId watchdog_id;     /* Timer to implement `prefs.watchdog */
134   XtIntervalId check_pointer_timer_id;  /* `prefs.pointer_timeout' */
135
136   time_t last_activity_time;               /* Used only when no server exts. */
137   saver_screen_info *last_activity_screen;
138
139
140   /* =======================================================================
141      remote control
142      ======================================================================= */
143
144   int selection_mode;           /* Set to -1 if the NEXT ClientMessage has just
145                                    been received; set to -2 if PREV has just
146                                    been received; set to N if SELECT or DEMO N
147                                    has been received.  (This is kind of nasty.)
148                                  */
149
150   /* =======================================================================
151      subprocs
152      ======================================================================= */
153
154   XtIntervalId stderr_popup_timer;
155
156 };
157
158
159 /* This structure holds all the data that applies to the screen-specific parts
160    of the display connection; if the display has multiple screens, there will
161    be one of these for each screen.
162  */
163 struct saver_screen_info {
164   saver_info *global;
165
166   Screen *screen;
167   Widget toplevel_shell;
168
169   /* =======================================================================
170      blanking
171      ======================================================================= */
172
173   Window screensaver_window;    /* The window that will impersonate the root,
174                                    when the screensaver activates.  Note that
175                                    the window stored here may change, as we
176                                    destroy and recreate it on different
177                                    visuals. */
178   Colormap cmap;                /* The colormap that goes with the window. */
179   Bool install_cmap_p;          /* Whether this screen should have its own
180                                    colormap installed, for whichever of several
181                                    reasons.  This is definitive (even a false
182                                    value here overrides prefs->install_cmap_p.)
183                                  */
184   Visual *current_visual;       /* The visual of the window. */
185   Visual *default_visual;       /* visual to use when none other specified */
186   int current_depth;            /* How deep the visual (and the window) are. */
187
188   Window real_vroot;            /* The original virtual-root window. */
189   Window real_vroot_value;      /* What was in the __SWM_VROOT property. */
190
191   Cursor cursor;                /* A blank cursor that goes with the
192                                    real root window. */
193   unsigned long black_pixel;    /* Black, allocated from `cmap'. */
194
195 # ifdef HAVE_MIT_SAVER_EXTENSION
196   Window server_mit_saver_window;
197 # endif
198
199
200   /* =======================================================================
201      demoing
202      ======================================================================= */
203
204   Colormap demo_cmap;           /* The colormap that goes with the dialogs:
205                                    this might be the same as `cmap' so care
206                                    must be taken not to free it while it's
207                                    still in use. */
208
209   /* =======================================================================
210      timers
211      ======================================================================= */
212
213   int poll_mouse_last_root_x;           /* Used only when no server exts. */
214   int poll_mouse_last_root_y;
215   Window poll_mouse_last_child;
216   unsigned int poll_mouse_last_mask;
217
218
219   /* =======================================================================
220      subprocs
221      ======================================================================= */
222
223   int current_hack;             /* Index into `prefs.screenhacks' */
224   pid_t pid;
225
226   int stderr_text_x;
227   int stderr_text_y;
228   int stderr_line_height;
229   XFontStruct *stderr_font;
230   GC stderr_gc;
231   Window stderr_overlay_window;    /* Used if the server has overlay planes */
232   Colormap stderr_cmap;
233 };
234
235
236 \f
237
238 /* =======================================================================
239    server extensions and virtual roots
240    ======================================================================= */
241
242 extern void restore_real_vroot (saver_info *si);
243 extern void disable_builtin_screensaver (saver_info *, Bool unblank_screen_p);
244 extern Bool ensure_no_screensaver_running (Display *, Screen *);
245
246 #ifdef HAVE_MIT_SAVER_EXTENSION
247 extern Bool query_mit_saver_extension (saver_info *);
248 #endif
249 #ifdef HAVE_SGI_SAVER_EXTENSION
250 extern Bool query_sgi_saver_extension (saver_info *);
251 #endif
252 #ifdef HAVE_XIDLE_EXTENSION
253 extern Bool query_xidle_extension (saver_info *);
254 #endif
255
256 /* Display Power Management System (DPMS) interface. */
257 extern Bool monitor_powered_on_p (saver_info *si);
258 extern void monitor_power_on (saver_info *si);
259
260
261 /* =======================================================================
262    blanking
263    ======================================================================= */
264
265 extern void initialize_screensaver_window (saver_info *si);
266 extern void raise_window (saver_info *si,
267                             Bool inhibit_fade, Bool between_hacks_p,
268                             Bool dont_clear);
269 extern void blank_screen (saver_info *si);
270 extern void unblank_screen (saver_info *si);
271 extern Bool grab_keyboard_and_mouse (saver_info *si, Window, Cursor);
272 extern void ungrab_keyboard_and_mouse (saver_info *si);
273
274 /* =======================================================================
275    locking
276    ======================================================================= */
277
278 #ifndef NO_LOCKING
279 extern Bool unlock_p (saver_info *si);
280 extern Bool lock_init (int argc, char **argv, Bool verbose_p);
281 extern Bool passwd_valid_p (const char *typed_passwd, Bool verbose_p);
282
283 extern void make_passwd_window (saver_info *si);
284 extern void draw_passwd_window (saver_info *si);
285 extern void update_passwd_window (saver_info *si, const char *printed_passwd,
286                                   float ratio);
287 extern void destroy_passwd_window (saver_info *si);
288
289 #endif /* NO_LOCKING */
290
291 /* =======================================================================
292    runtime privileges
293    ======================================================================= */
294
295 extern void hack_uid (saver_info *si);
296 extern void describe_uids (saver_info *si, FILE *out);
297
298 /* =======================================================================
299    demoing
300    ======================================================================= */
301
302 extern void draw_shaded_rectangle (Display *dpy, Window window,
303                                    int x, int y,
304                                    int width, int height,
305                                    int thickness,
306                                    unsigned long top_color,
307                                    unsigned long bottom_color);
308 extern int string_width (XFontStruct *font, char *s);
309
310 extern void make_splash_dialog (saver_info *si);
311 extern void handle_splash_event (saver_info *si, XEvent *e);
312 extern void skull (Display *, Window, GC, GC, int, int, int, int);
313
314
315 /* =======================================================================
316    timers
317    ======================================================================= */
318
319 extern void start_notice_events_timer (saver_info *, Window);
320 extern void cycle_timer (XtPointer si, XtIntervalId *id);
321 extern void activate_lock_timer (XtPointer si, XtIntervalId *id);
322 extern void reset_watchdog_timer (saver_info *si, Bool on_p);
323 extern void idle_timer (XtPointer si, XtIntervalId *id);
324 extern void sleep_until_idle (saver_info *si, Bool until_idle_p);
325
326 /* =======================================================================
327    remote control
328    ======================================================================= */
329
330 extern Bool handle_clientmessage (saver_info *, XEvent *, Bool);
331 extern void maybe_reload_init_file (saver_info *);
332
333 /* =======================================================================
334    subprocs
335    ======================================================================= */
336
337 extern void hack_environment (saver_info *si);
338 extern void hack_subproc_environment (saver_screen_info *ssi);
339 extern void init_sigchld (void);
340 extern void spawn_screenhack (saver_info *si, Bool first_time_p);
341 extern void kill_screenhack (saver_info *si);
342 extern void suspend_screenhack (saver_info *si, Bool suspend_p);
343 extern Bool screenhack_running_p (saver_info *si);
344 extern void emergency_kill_subproc (saver_info *si);
345 extern Bool select_visual (saver_screen_info *ssi, const char *visual_name);
346 extern const char *signal_name (int signal);
347
348 /* =======================================================================
349    subprocs diagnostics
350    ======================================================================= */
351
352 extern FILE *real_stderr;
353 extern FILE *real_stdout;
354 extern void initialize_stderr (saver_info *si);
355 extern void reset_stderr (saver_screen_info *ssi);
356 extern void clear_stderr (saver_screen_info *ssi);
357
358
359 /* =======================================================================
360    misc
361    ======================================================================= */
362
363 extern const char *blurb (void);
364 extern void save_argv (int argc, char **argv);
365 extern void saver_exit (saver_info *si, int status, const char *core_reason);
366 extern void restart_process (saver_info *si);
367
368 extern int saver_ehandler (Display *dpy, XErrorEvent *error);
369 extern int BadWindow_ehandler (Display *dpy, XErrorEvent *error);
370 extern Bool window_exists_p (Display *dpy, Window window);
371 extern char *timestring (void);
372
373 extern Atom XA_VROOT, XA_XSETROOT_ID;
374 extern Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_ID;
375 extern Atom XA_SCREENSAVER_TIME;
376 extern Atom XA_DEMO, XA_PREFS;
377
378 #endif /* __XSCREENSAVER_H__ */