92cba9672b3960b9e4257ffc6a99bb8744691fb2
[xscreensaver] / driver / xscreensaver.h
1 /* xscreensaver, Copyright (c) 1993-1998 Jamie Zawinski <jwz@netscape.com>
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 extern char *progname;
24 extern char *progclass;
25
26 typedef struct saver_preferences saver_preferences;
27 typedef struct saver_info saver_info;
28 typedef struct saver_screen_info saver_screen_info;
29
30
31 #undef countof
32 #define countof(x) (sizeof((x))/sizeof((*x)))
33
34
35
36 /* This structure holds all the user-specified parameters, read from the
37    command line, the resource database, or entered through a dialog box.
38  */
39 struct saver_preferences {
40   Bool verbose_p;
41   Bool lock_p;                  /* whether to lock as well as save */
42
43   Bool debug_p;
44   Bool fade_p;                  /* whether to fade to black */
45   Bool unfade_p;                /* whether to fade from black */
46   int fade_seconds;             /* how long that should take */
47   int fade_ticks;               /* how many ticks should be used */
48
49   Bool install_cmap_p;          /* whether we should use our own colormap
50                                    when using the screen's default visual. */
51
52   char **screenhacks;           /* the programs to run */
53   int screenhacks_count;
54
55   int nice_inferior;            /* nice value for subprocs */
56
57   int initial_delay;            /* how long to sleep after launch */
58   Time timeout;                 /* how much idle time before activation */
59   Time lock_timeout;            /* how long after activation locking starts */
60   Time cycle;                   /* how long each hack should run */
61 #ifndef NO_LOCKING
62   Time passwd_timeout;          /* how much time before pw dialog goes down */
63 #endif
64   Time pointer_timeout;         /* how often to check mouse position */
65   Time notice_events_timeout;   /* how long after window creation to select */
66   Time watchdog_timeout;        /* how often to re-raise and re-blank screen */
67
68   Bool use_xidle_extension;     /* which extension to use, if possible */
69   Bool use_mit_saver_extension;
70   Bool use_sgi_saver_extension;
71
72   char *shell;                  /* where to find /bin/sh */
73
74 };
75
76
77 /* This structure holds all the data that applies to the program as a whole,
78    or to the non-screen-specific parts of the display connection.
79  */
80 struct saver_info {
81   char *version;
82   saver_preferences prefs;
83
84   int nscreens;
85   saver_screen_info *screens;
86   saver_screen_info *default_screen;    /* ...on which dialogs will appear. */
87
88   /* =======================================================================
89      global connection info
90      ======================================================================= */
91
92   XtAppContext app;
93   Display *dpy;
94   XrmDatabase db;
95
96   /* =======================================================================
97      server extension info
98      ======================================================================= */
99
100 # ifdef HAVE_MIT_SAVER_EXTENSION
101   int mit_saver_ext_event_number;
102   int mit_saver_ext_error_number;
103 # endif
104 # ifdef HAVE_SGI_SAVER_EXTENSION
105   int sgi_saver_ext_event_number;
106   int sgi_saver_ext_error_number;
107 # endif
108
109
110   /* =======================================================================
111      blanking
112      ======================================================================= */
113
114   Bool screen_blanked_p;        /* Whether the saver is currently active. */
115   Window mouse_grab_window;     /* Window holding our mouse grab */
116   Window keyboard_grab_window;  /* Window holding our keyboard grab */
117
118
119   /* =======================================================================
120      locking
121      ======================================================================= */
122
123   Bool locking_disabled_p;      /* Sometimes locking is impossible. */
124   char *nolock_reason;          /* This is why. */
125   Bool locked_p;                /* Whether the screen is currently locked. */
126   Bool dbox_up_p;               /* Whether the demo-mode or passwd dialogs
127                                    are currently visible */
128
129   /* =======================================================================
130      demoing
131      ======================================================================= */
132
133   Bool demo_mode_p;             /* Whether demo-mode is active */
134   char *demo_hack;              /* The hack that has been selected from the
135                                    dialog box, which should be run next. */
136
137
138   /* =======================================================================
139      asking questions
140      ======================================================================= */
141
142   Bool question_up_p;           /* Whether the question dialog is currently
143                                    visible. */
144   Widget question_dialog;       /* The question dialog, if any. */
145
146
147   /* =======================================================================
148      timers
149      ======================================================================= */
150
151   XtIntervalId lock_id;         /* Timer to implement `prefs.lock_timeout' */
152   XtIntervalId cycle_id;        /* Timer to implement `prefs.cycle' */
153   XtIntervalId timer_id;        /* Timer to implement `prefs.timeout' */
154   XtIntervalId watchdog_id;     /* Timer to implement `prefs.watchdog */
155   XtIntervalId check_pointer_timer_id;  /* `prefs.pointer_timeout' */
156
157   time_t last_activity_time;               /* Used only when no server exts. */
158   saver_screen_info *last_activity_screen;
159
160
161   /* =======================================================================
162      remote control
163      ======================================================================= */
164
165   int next_mode_p;              /* Set to 1 if the NEXT ClientMessage has just
166                                    been received; set to 2 if PREV has just
167                                    been received.  (#### This is nasty.) */
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 we should use our own colormap.
199                                    This can be overridden on a per-hack basis.
200                                  */
201   Visual *current_visual;       /* The visual of the window. */
202   Visual *default_visual;       /* visual to use when none other specified */
203   int current_depth;            /* How deep the visual (and the window) are. */
204
205   Window real_vroot;            /* The original virtual-root window. */
206   Window real_vroot_value;      /* What was in the __SWM_VROOT property. */
207
208   Cursor cursor;                /* A blank cursor that goes with the
209                                    real root window. */
210   unsigned long black_pixel;    /* Black, allocated from `cmap'. */
211
212 # ifdef HAVE_MIT_SAVER_EXTENSION
213   Window server_mit_saver_window;
214 # endif
215
216
217   /* =======================================================================
218      demoing
219      ======================================================================= */
220
221   Colormap demo_cmap;           /* The colormap that goes with the dialogs:
222                                    this might be the same as `cmap' so care
223                                    must be taken not to free it while it's
224                                    still in use. */
225
226   /* =======================================================================
227      timers
228      ======================================================================= */
229
230   int poll_mouse_last_root_x;           /* Used only when no server exts. */
231   int poll_mouse_last_root_y;
232   Window poll_mouse_last_child;
233   unsigned int poll_mouse_last_mask;
234
235
236   /* =======================================================================
237      subprocs
238      ======================================================================= */
239
240   int current_hack;             /* Index into `prefs.screenhacks' */
241   pid_t pid;
242
243   int stderr_text_x;
244   int stderr_text_y;
245   int stderr_line_height;
246   XFontStruct *stderr_font;
247   GC stderr_gc;
248   Window stderr_overlay_window;    /* Used if the server has overlay planes */
249   Colormap stderr_cmap;
250 };
251
252
253 \f
254
255 /* =======================================================================
256    server extensions and virtual roots
257    ======================================================================= */
258
259 extern void restore_real_vroot (saver_info *si);
260 extern void disable_builtin_screensaver (saver_info *si, Bool turn_off_p);
261 extern Bool ensure_no_screensaver_running (Display *, Screen *);
262
263 #ifdef HAVE_MIT_SAVER_EXTENSION
264 extern Bool query_mit_saver_extension (saver_info *);
265 #endif
266 #ifdef HAVE_SGI_SAVER_EXTENSION
267 extern Bool query_sgi_saver_extension (saver_info *);
268 #endif
269
270 /* Display Power Management System (DPMS) interface. */
271 extern Bool monitor_powered_on_p (saver_info *si);
272 extern void monitor_power_on (saver_info *si);
273
274
275 /* =======================================================================
276    blanking
277    ======================================================================= */
278
279 extern void initialize_screensaver_window (saver_info *si);
280 extern void raise_window (saver_info *si,
281                             Bool inhibit_fade, Bool between_hacks_p,
282                             Bool dont_clear);
283 extern void blank_screen (saver_info *si);
284 extern void unblank_screen (saver_info *si);
285 extern void grab_keyboard_and_mouse (saver_info *si, Window, Cursor);
286 extern void ungrab_keyboard_and_mouse (saver_info *si);
287
288 /* =======================================================================
289    locking
290    ======================================================================= */
291
292 #ifndef NO_LOCKING
293 extern Bool unlock_p (saver_info *si);
294 extern create_passwd_dialog (Widget, Visual *, Colormap);
295 extern Bool lock_init (int argc, char **argv);
296 extern Bool passwd_valid_p (const char *typed_passwd);
297 #endif
298
299 /* =======================================================================
300    demoing
301    ======================================================================= */
302
303 #ifndef NO_DEMO_MODE
304 extern void demo_mode (saver_info *si);
305 extern void demo_mode_restart_process (saver_info *si);
306 extern create_demo_dialog (Widget, Visual *, Colormap);
307 extern create_resources_dialog (Widget, Visual *, Colormap);
308 #endif
309
310 #if !defined(NO_LOCKING) || !defined(NO_DEMO_MODE)
311 extern void pop_up_dialog_box (Widget dialog, Widget form, int where);
312 extern void format_into_label (Widget label, const char *arg);
313 extern void steal_focus_and_colormap (Widget dialog);
314 #endif
315
316 #ifdef HAVE_MOTIF
317 extern void disable_motif_drag_and_drop(Widget w);
318 #endif
319
320
321 /* =======================================================================
322    timers
323    ======================================================================= */
324
325 extern void start_notice_events_timer (saver_info *, Window);
326 extern void cycle_timer (XtPointer si, XtIntervalId *id);
327 extern void activate_lock_timer (XtPointer si, XtIntervalId *id);
328 extern void reset_watchdog_timer (saver_info *si, Bool on_p);
329 extern void idle_timer (XtPointer si, XtIntervalId *id);
330 extern void sleep_until_idle (saver_info *si, Bool until_idle_p);
331
332 /* =======================================================================
333    remote control
334    ======================================================================= */
335
336 extern Bool handle_clientmessage (saver_info *, XEvent *, Bool);
337
338 /* =======================================================================
339    subprocs
340    ======================================================================= */
341
342 extern void hack_environment (saver_info *si);
343 extern void init_sigchld (void);
344 extern void spawn_screenhack (saver_info *si, Bool first_time_p);
345 extern void kill_screenhack (saver_info *si);
346 extern void suspend_screenhack (saver_info *si, Bool suspend_p);
347 extern Bool screenhack_running_p (saver_info *si);
348 extern void emergency_kill_subproc (saver_info *si);
349 extern Bool select_visual (saver_screen_info *ssi, const char *visual_name);
350 extern const char *signal_name (int signal);
351
352 /* =======================================================================
353    subprocs security
354    ======================================================================= */
355
356 #ifdef NO_SETUID
357 # define hack_uid()
358 # define hack_uid_warn()
359 #else /* !NO_SETUID */
360  extern void hack_uid (saver_info *si);
361  extern void hack_uid_warn (saver_info *si);
362 #endif /* NO_SETUID */
363
364 /* =======================================================================
365    subprocs diagnostics
366    ======================================================================= */
367
368 extern FILE *real_stderr;
369 extern FILE *real_stdout;
370 extern void initialize_stderr (saver_info *si);
371 extern void reset_stderr (saver_screen_info *ssi);
372 extern void clear_stderr (saver_screen_info *ssi);
373
374 /* =======================================================================
375    misc
376    ======================================================================= */
377
378 extern void save_argv (int argc, char **argv);
379 extern void saver_exit (saver_info *si, int status);
380 extern void restart_process (saver_info *si);
381
382 extern int saver_ehandler (Display *dpy, XErrorEvent *error);
383 extern int BadWindow_ehandler (Display *dpy, XErrorEvent *error);
384 extern Bool window_exists_p (Display *dpy, Window window);
385 extern char *timestring (void);
386
387 extern Atom XA_VROOT, XA_XSETROOT_ID;
388 extern Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_ID;
389 extern Atom XA_SCREENSAVER_TIME;
390
391 #endif /* __XSCREENSAVER_H__ */