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