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