1 /* xscreensaver, Copyright (c) 1993-2000 Jamie Zawinski <jwz@jwz.org>
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
12 #ifndef __XSCREENSAVER_H__
13 #define __XSCREENSAVER_H__
25 extern char *progname;
26 extern char *progclass;
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;
34 #define countof(x) (sizeof((x))/sizeof((*x)))
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.
41 The saver_preferences structure (prefs.h) holds all the user-specified
42 parameters, read from the command line, the resource database, or entered
47 saver_preferences prefs;
50 saver_screen_info *screens;
51 saver_screen_info *default_screen; /* ...on which dialogs will appear. */
54 /* =======================================================================
55 global connection info
56 ======================================================================= */
61 /* =======================================================================
63 ======================================================================= */
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;
70 # ifdef HAVE_MIT_SAVER_EXTENSION
71 int mit_saver_ext_event_number;
72 int mit_saver_ext_error_number;
74 # ifdef HAVE_SGI_SAVER_EXTENSION
75 int sgi_saver_ext_event_number;
76 int sgi_saver_ext_error_number;
80 /* =======================================================================
82 ======================================================================= */
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
95 /* =======================================================================
96 locking and runtime privileges
97 ======================================================================= */
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 */
103 Bool locking_disabled_p; /* Sometimes locking is impossible. */
104 char *nolock_reason; /* This is why. */
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
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-
115 Window passwd_dialog; /* The password dialog, if its up. */
116 passwd_dialog_data *pw_data; /* Other info necessary to draw it. */
118 int unlock_failures; /* Counts failed login attempts while the
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
128 /* =======================================================================
130 ======================================================================= */
132 Bool demoing_p; /* Whether we are demoing a single hack
135 Window splash_dialog; /* The splash dialog, if its up. */
136 splash_dialog_data *sp_data; /* Other info necessary to draw it. */
139 /* =======================================================================
141 ======================================================================= */
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' */
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;
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. */
159 /* =======================================================================
161 ======================================================================= */
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.)
169 /* =======================================================================
171 ======================================================================= */
173 XtIntervalId stderr_popup_timer;
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.
182 struct saver_screen_info {
186 Widget toplevel_shell;
188 /* =======================================================================
190 ======================================================================= */
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
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.)
203 Visual *current_visual; /* The visual of the window. */
204 int current_depth; /* How deep the visual (and the window) are. */
206 Visual *default_visual; /* visual to use when none other specified */
207 Visual *best_gl_visual; /* visual to use for GL hacks */
209 Window real_vroot; /* The original virtual-root window. */
210 Window real_vroot_value; /* What was in the __SWM_VROOT property. */
212 Cursor cursor; /* A blank cursor that goes with the
214 unsigned long black_pixel; /* Black, allocated from `cmap'. */
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... */
223 # ifdef HAVE_MIT_SAVER_EXTENSION
224 Window server_mit_saver_window;
228 /* =======================================================================
230 ======================================================================= */
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
237 /* =======================================================================
239 ======================================================================= */
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;
247 /* =======================================================================
249 ======================================================================= */
251 int current_hack; /* Index into `prefs.screenhacks' */
256 int stderr_line_height;
257 XFontStruct *stderr_font;
259 Window stderr_overlay_window; /* Used if the server has overlay planes */
260 Colormap stderr_cmap;
266 /* =======================================================================
267 server extensions and virtual roots
268 ======================================================================= */
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 *);
274 #ifdef HAVE_MIT_SAVER_EXTENSION
275 extern Bool query_mit_saver_extension (saver_info *);
277 #ifdef HAVE_SGI_SAVER_EXTENSION
278 extern Bool query_sgi_saver_extension (saver_info *);
280 #ifdef HAVE_XIDLE_EXTENSION
281 extern Bool query_xidle_extension (saver_info *);
283 #ifdef HAVE_PROC_INTERRUPTS
284 extern Bool query_proc_interrupts_available (saver_info *, const char **why);
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);
292 /* =======================================================================
294 ======================================================================= */
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,
300 extern Bool blank_screen (saver_info *si);
301 extern void unblank_screen (saver_info *si);
303 extern void get_screen_viewport (saver_screen_info *ssi,
304 int *x_ret, int *y_ret,
305 int *w_ret, int *h_ret,
309 /* =======================================================================
311 ======================================================================= */
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 */
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);
324 /* =======================================================================
326 ======================================================================= */
328 extern void hack_uid (saver_info *si);
329 extern void describe_uids (saver_info *si, FILE *out);
331 /* =======================================================================
333 ======================================================================= */
335 extern void draw_shaded_rectangle (Display *dpy, Window window,
337 int width, int height,
339 unsigned long top_color,
340 unsigned long bottom_color);
341 extern int string_width (XFontStruct *font, char *s);
343 extern void make_splash_dialog (saver_info *si);
344 extern void handle_splash_event (saver_info *si, XEvent *e);
345 extern void skull (Display *, Window, GC, GC, int, int, int, int);
348 /* =======================================================================
350 ======================================================================= */
352 extern void start_notice_events_timer (saver_info *, Window, Bool verbose_p);
353 extern void cycle_timer (XtPointer si, XtIntervalId *id);
354 extern void activate_lock_timer (XtPointer si, XtIntervalId *id);
355 extern void reset_watchdog_timer (saver_info *si, Bool on_p);
356 extern void idle_timer (XtPointer si, XtIntervalId *id);
357 extern void sleep_until_idle (saver_info *si, Bool until_idle_p);
359 /* =======================================================================
361 ======================================================================= */
363 extern Bool handle_clientmessage (saver_info *, XEvent *, Bool);
364 extern void maybe_reload_init_file (saver_info *);
366 /* =======================================================================
368 ======================================================================= */
370 extern void hack_environment (saver_info *si);
371 extern void hack_subproc_environment (saver_screen_info *ssi);
372 extern void init_sigchld (void);
373 extern void spawn_screenhack (saver_info *si, Bool first_time_p);
374 extern void kill_screenhack (saver_info *si);
375 extern void suspend_screenhack (saver_info *si, Bool suspend_p);
376 extern Bool screenhack_running_p (saver_info *si);
377 extern void emergency_kill_subproc (saver_info *si);
378 extern Bool select_visual (saver_screen_info *ssi, const char *visual_name);
379 extern void store_saver_status (saver_info *si);
380 extern const char *signal_name (int signal);
382 /* =======================================================================
384 ======================================================================= */
386 extern FILE *real_stderr;
387 extern FILE *real_stdout;
388 extern void initialize_stderr (saver_info *si);
389 extern void reset_stderr (saver_screen_info *ssi);
390 extern void clear_stderr (saver_screen_info *ssi);
391 extern void shutdown_stderr (saver_info *si);
394 /* =======================================================================
396 ======================================================================= */
398 extern const char *blurb (void);
399 extern void save_argv (int argc, char **argv);
400 extern void saver_exit (saver_info *si, int status, const char *core_reason);
401 extern void restart_process (saver_info *si);
403 extern int saver_ehandler (Display *dpy, XErrorEvent *error);
404 extern int BadWindow_ehandler (Display *dpy, XErrorEvent *error);
405 extern Bool window_exists_p (Display *dpy, Window window);
406 extern char *timestring (void);
407 extern Bool display_is_on_console_p (saver_info *si);
408 extern Visual *get_best_gl_visual (saver_screen_info *ssi);
410 extern Atom XA_VROOT, XA_XSETROOT_ID;
411 extern Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_ID;
412 extern Atom XA_SCREENSAVER_STATUS, XA_LOCK, XA_BLANK;
413 extern Atom XA_DEMO, XA_PREFS;
415 #endif /* __XSCREENSAVER_H__ */