1 /* xscreensaver, Copyright (c) 1993-2020 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_TYPES_H__
13 #define __XSCREENSAVER_TYPES_H__
14 
15 typedef struct saver_info saver_info;
16 
17 typedef enum {
18   ul_read,		/* reading input or ready to do so */
19   ul_success,		/* auth success, unlock */
20   ul_fail,		/* auth fail */
21   ul_cancel,		/* user cancelled auth (pw_cancel or pw_null) */
22   ul_time,		/* timed out */
23   ul_finished		/* user pressed enter */
24 } unlock_state;
25 
26 typedef struct screenhack screenhack;
27 struct screenhack {
28   Bool enabled_p;
29   char *visual;
30   char *name;
31   char *command;
32 };
33 
34 typedef enum {
35   RANDOM_HACKS, ONE_HACK, BLANK_ONLY, DONT_BLANK, RANDOM_HACKS_SAME
36 } saver_mode;
37 
38 typedef enum {
39   TEXT_DATE, TEXT_LITERAL, TEXT_FILE, TEXT_PROGRAM, TEXT_URL
40 } text_mode;
41 
42 struct auth_message;
43 struct auth_response;
44 
45 typedef int (*auth_conv_cb_t) (
46   int num_msg,
47   const struct auth_message *msg,
48   struct auth_response **resp,
49   saver_info *si);
50 
51 typedef struct saver_preferences saver_preferences;
52 typedef struct saver_screen_info saver_screen_info;
53 typedef struct passwd_dialog_data passwd_dialog_data;
54 typedef struct splash_dialog_data splash_dialog_data;
55 typedef struct _monitor monitor;
56 
57 typedef struct poll_mouse_data poll_mouse_data;
58 struct poll_mouse_data {
59   int root_x;
60   int root_y;
61   Window child;
62   unsigned int mask;
63   time_t time;
64 };
65 
66 #ifdef HAVE_XINPUT
67 /* XInputExtension device support */
68 #include <X11/extensions/XInput.h>
69 
70 typedef struct xinput_dev_info xinput_dev_info;
71 struct xinput_dev_info {
72   XDevice       *device;
73   XEventClass   press, release, valuator;
74   poll_mouse_data last_poll_mouse;
75 };
76 #endif
77 
78 /* This structure holds all the user-specified parameters, read from the
79    command line, the resource database, or entered through a dialog box.
80  */
81 struct saver_preferences {
82 
83   XrmDatabase db;		/* The resource database into which the
84 				   init file is merged, and out of which the
85 				   preferences are parsed. */
86 
87   time_t init_file_date;	/* The date (from stat()) of the .xscreensaver
88 				   file the last time this process read or
89 				   wrote it. */
90 
91   Bool verbose_p;		/* whether to print out lots of status info */
92   Bool timestamp_p;		/* whether to mark messages with a timestamp */
93   Bool capture_stderr_p;	/* whether to redirect stdout/stderr  */
94   Bool ignore_uninstalled_p;	/* whether to avoid displaying or complaining
95                                    about hacks that are not on $PATH */
96   Bool debug_p;			/* pay no mind to the man behind the curtain */
97   Bool xsync_p;			/* whether XSynchronize has been called */
98 
99   Bool lock_p;			/* whether to lock as well as save */
100 
101   Bool fade_p;			/* whether to fade to black, if possible */
102   Bool unfade_p;		/* whether to fade from black, if possible */
103   Time fade_seconds;		/* how long that should take */
104   int fade_ticks;		/* how many ticks should be used */
105   Bool splash_p;		/* whether to do a splash screen at startup */
106 
107   Bool install_cmap_p;		/* whether we should use our own colormap
108 				   when using the screen's default visual. */
109 
110 # ifdef QUAD_MODE
111   Bool quad_p;			/* whether to run four savers per monitor */
112 # endif
113 
114   screenhack **screenhacks;	/* the programs to run */
115   int screenhacks_count;
116 
117   saver_mode mode;		/* hack-selection mode */
118   int selected_hack;		/* in one_hack mode, this is the one */
119 
120   int nice_inferior;		/* nice value for subprocs */
121   int inferior_memory_limit;	/* setrlimit(LIMIT_AS) value for subprocs */
122 
123   Time initial_delay;		/* how long to sleep after launch */
124   Time splash_duration;		/* how long the splash screen stays up */
125   Time timeout;			/* how much idle time before activation */
126   Time lock_timeout;		/* how long after activation locking starts */
127   Time cycle;			/* how long each hack should run */
128   Time passwd_timeout;		/* how much time before pw dialog goes down */
129   Time pointer_timeout;		/* how often to check mouse position */
130   Time notice_events_timeout;	/* how long after window creation to select */
131   Time watchdog_timeout;	/* how often to re-raise and re-blank screen */
132   int pointer_hysteresis;	/* mouse motions less than N/sec are ignored */
133 
134   Bool dpms_enabled_p;		/* Whether to power down the monitor */
135   Bool dpms_quickoff_p;		/* Whether to power down monitor immediately
136 				   in "Blank Only" mode */
137   Time dpms_standby;		/* how long until monitor goes black */
138   Time dpms_suspend;		/* how long until monitor power-saves */
139   Time dpms_off;		/* how long until monitor powers down */
140 
141   Bool grab_desktop_p;		/* These are not used by "xscreensaver" */
142   Bool grab_video_p;		/*  itself: they are used by the external */
143   Bool random_image_p;		/*  "xscreensaver-getimage" program, and set */
144   char *image_directory;	/*  by the "xscreensaver-demo" configurator. */
145 
146   text_mode tmode;		/* How we generate text to display. */
147   char *text_literal;		/* used when tmode is TEXT_LITERAL. */
148   char *text_file;		/* used when tmode is TEXT_FILE.    */
149   char *text_program;		/* used when tmode is TEXT_PROGRAM. */
150   char *text_url;		/* used when tmode is TEXT_URL.     */
151 
152   Bool use_xidle_extension;	/* which extension to use, if possible */
153   Bool use_mit_saver_extension;
154   Bool use_sgi_saver_extension;
155   Bool use_proc_interrupts;
156   Bool use_xinput_extension;
157 
158   Bool getviewport_full_of_lies_p; /* XFree86 bug #421 */
159 
160   char *shell;			/* where to find /bin/sh */
161 
162   char *demo_command;		/* How to enter demo mode. */
163   char *prefs_command;		/* How to edit preferences. */
164   char *help_url;		/* Where the help document resides. */
165   char *load_url_command;	/* How one loads URLs. */
166   char *new_login_command;	/* Command for the "New Login" button. */
167 
168   int auth_warning_slack;	/* Don't warn about login failures if they
169                                    all happen within this many seconds of
170                                    a successful login. */
171 };
172 
173 /* This structure holds all the data that applies to the program as a whole,
174    or to the non-screen-specific parts of the display connection.
175 
176    The saver_preferences structure (prefs.h) holds all the user-specified
177    parameters, read from the command line, the resource database, or entered
178    through a dialog box.
179  */
180 struct saver_info {
181   char *version;
182   saver_preferences prefs;
183 
184   int nscreens;
185   int ssi_count;
186   saver_screen_info *screens;
187   saver_screen_info *default_screen;	/* ...on which dialogs will appear. */
188   monitor **monitor_layout;		/* private to screens.c */
189   Visual **best_gl_visuals;		/* visuals for GL hacks on screen N */
190 
191   /* =======================================================================
192      global connection info
193      ======================================================================= */
194 
195   XtAppContext app;
196   Display *dpy;
197 
198   /* =======================================================================
199      server extension info
200      ======================================================================= */
201 
202   Bool using_xidle_extension;	   /* which extension is being used.         */
203   Bool using_mit_saver_extension;  /* Note that `p->use_*' is the *request*, */
204   Bool using_sgi_saver_extension;  /* and `si->using_*' is the *reality*.    */
205   Bool using_proc_interrupts;
206 
207 # ifdef HAVE_MIT_SAVER_EXTENSION
208   int mit_saver_ext_event_number;
209   int mit_saver_ext_error_number;
210 # endif
211 # ifdef HAVE_SGI_SAVER_EXTENSION
212   int sgi_saver_ext_event_number;
213   int sgi_saver_ext_error_number;
214 # endif
215 # ifdef HAVE_RANDR
216   int randr_event_number;
217   int randr_error_number;
218   Bool using_randr_extension;
219 # endif
220 
221   Bool using_xinput_extension;     /* Note that `p->use_*' is the *request*, */
222                                    /* and `si->using_*' is the *reality*.    */
223 #ifdef HAVE_XINPUT
224   int xinput_ext_event_number;     /* may not be used */
225   int xinput_ext_error_number;
226   int xinput_DeviceButtonPress;    /* Extension device event codes.          */
227   int xinput_DeviceButtonRelease;  /* Assigned by server at runtime          */
228   int xinput_DeviceMotionNotify;
229   xinput_dev_info *xinput_devices;
230   int num_xinput_devices;
231 # endif
232 
233   /* =======================================================================
234      blanking
235      ======================================================================= */
236 
237   Bool screen_blanked_p;	/* Whether the saver is currently active. */
238   Window mouse_grab_window;	/* Window holding our mouse grab */
239   Window keyboard_grab_window;	/* Window holding our keyboard grab */
240   int mouse_grab_screen;	/* The screen number the mouse grab is on */
241   int keyboard_grab_screen;	/* The screen number the keyboard grab is on */
242   Bool fading_possible_p;	/* Whether fading to/from black is possible. */
243   Bool throttled_p;             /* Whether we should temporarily just blank
244                                    the screen, not run hacks. (Deprecated:
245                                    users should use "xset dpms force off"
246                                    instead.) */
247   time_t blank_time;		/* The time at which the screen was blanked
248                                    (if currently blanked) or unblanked (if
249                                    not blanked.) */
250 
251 
252   /* =======================================================================
253      locking and runtime privileges
254      ======================================================================= */
255 
256   Bool locked_p;		/* Whether the screen is currently locked. */
257   Bool dbox_up_p;		/* Whether the demo-mode or passwd dialogs
258 				   are currently visible */
259 
260   Bool locking_disabled_p;	/* Sometimes locking is impossible. */
261   char *nolock_reason;		/* This is why. */
262 
263   char *orig_uid;		/* What uid/gid we had at startup, before
264 				   discarding privileges. */
265   char *uid_message;		/* Any diagnostics from our attempt to
266 				   discard privileges (printed only in
267 				   -verbose mode.) */
268   Bool dangerous_uid_p;		/* Set to true if we're running as a user id
269 				   which is known to not be a normal, non-
270 				   privileged user. */
271 
272   Window passwd_dialog;		/* The password dialog, if it's up. */
273   passwd_dialog_data *pw_data;	/* Other info necessary to draw it. */
274 
275   int unlock_failures;		/* Counts failed login attempts while the
276 				   screen is locked. */
277   time_t unlock_failure_time;	/* Time of first failed login attempt. */
278   time_t unlock_dismiss_time;	/* Time lock dialog most recently dismissed. */
279 
280   char *unlock_typeahead;	/* If the screen is locked, and the user types
281                                    a character, we assume that it is the first
282                                    character of the password.  It's stored here
283                                    for the password dialog to use to populate
284                                    itself. */
285 
286   char *user;			/* The user whose session is locked. */
287   char *cached_passwd;		/* Cached password, used to avoid multiple
288 				   prompts for password-only auth mechanisms.*/
289   unlock_state unlock_state;
290 
291   auth_conv_cb_t unlock_cb;	/* The function used to prompt for creds. */
292   void (*auth_finished_cb) (saver_info *si);
293 				/* Called when authentication has finished,
294 				   regardless of success or failure.
295 				   May be NULL. */
296 
297 
298   /* =======================================================================
299      demoing
300      ======================================================================= */
301 
302   Bool demoing_p;		/* Whether we are demoing a single hack
303 				   (without UI.) */
304 
305   Window splash_dialog;		/* The splash dialog, if its up. */
306   splash_dialog_data *sp_data;	/* Other info necessary to draw it. */
307 
308 
309   /* =======================================================================
310      timers
311      ======================================================================= */
312 
313   XtIntervalId lock_id;		/* Timer to implement `prefs.lock_timeout' */
314   XtIntervalId cycle_id;	/* Timer to implement `prefs.cycle' */
315   XtIntervalId timer_id;	/* Timer to implement `prefs.timeout' */
316   XtIntervalId watchdog_id;	/* Timer to implement `prefs.watchdog */
317   XtIntervalId check_pointer_timer_id;	/* `prefs.pointer_timeout' */
318 
319   XtIntervalId de_race_id;	/* Timer to make sure screen un-blanks */
320   int de_race_ticks;
321 
322   time_t last_activity_time;		   /* Used only when no server exts. */
323   time_t last_wall_clock_time;             /* Used to detect laptop suspend. */
324   saver_screen_info *last_activity_screen;
325 
326   Bool emergency_lock_p;        /* Set when the wall clock has jumped
327                                    (presumably due to laptop suspend) and we
328                                    need to lock down right away instead of
329                                    waiting for the lock timer to go off. */
330 
331 
332   /* =======================================================================
333      remote control
334      ======================================================================= */
335 
336   int selection_mode;		/* Set to -1 if the NEXT ClientMessage has just
337 				   been received; set to -2 if PREV has just
338 				   been received; set to N if SELECT or DEMO N
339 				   has been received.  (This is kind of nasty.)
340 				 */
341 
342   /* =======================================================================
343      subprocs
344      ======================================================================= */
345 
346   XtIntervalId stderr_popup_timer;
347 
348 # ifdef HAVE_LIBSYSTEMD
349   pid_t systemd_pid;
350 # endif
351 };
352 
353 /* This structure holds all the data that applies to the screen-specific parts
354    of the display connection; if the display has multiple screens, there will
355    be one of these for each screen.
356  */
357 struct saver_screen_info {
358   saver_info *global;
359 
360   int number;			/* The internal ordinal of this screen,
361                                    counting Xinerama rectangles as separate
362                                    screens. */
363   int real_screen_number;	/* The number of the underlying X screen on
364                                    which this rectangle lies. */
365   Screen *screen;		/* The X screen in question. */
366 
367   int x, y, width, height;	/* The size and position of this rectangle
368                                    on its underlying X screen. */
369 
370   Bool real_screen_p;		/* This will be true of exactly one ssi per
371                                    X screen. */
372 
373   Widget toplevel_shell;
374 
375   /* =======================================================================
376      blanking
377      ======================================================================= */
378 
379   Window screensaver_window;	/* The window that will impersonate the root,
380 				   when the screensaver activates.  Note that
381 				   the window stored here may change, as we
382 				   destroy and recreate it on different
383 				   visuals. */
384   Colormap cmap;		/* The colormap that goes with the window. */
385   Bool install_cmap_p;		/* Whether this screen should have its own
386                                    colormap installed, for whichever of several
387                                    reasons.  This is definitive (even a false
388                                    value here overrides prefs->install_cmap_p.)
389                                  */
390   Visual *current_visual;	/* The visual of the window. */
391   int current_depth;		/* How deep the visual (and the window) are. */
392 
393   Visual *default_visual;	/* visual to use when none other specified */
394 
395   Window real_vroot;		/* The original virtual-root window. */
396   Window real_vroot_value;	/* What was in the __SWM_VROOT property. */
397 
398   Cursor cursor;		/* A blank cursor that goes with the
399 				   real root window. */
400   unsigned long black_pixel;	/* Black, allocated from `cmap'. */
401 
402   int blank_vp_x, blank_vp_y;   /* Where the virtual-scrolling viewport was
403                                    when the screen went blank.  We need to
404                                    prevent the X server from letting the mouse
405                                    bump the edges to scroll while the screen
406                                    is locked, so we reset to this when it has
407                                    moved, and the lock dialog is up... */
408 
409 # ifdef HAVE_MIT_SAVER_EXTENSION
410   Window server_mit_saver_window;
411 # endif
412 
413 
414   /* =======================================================================
415      demoing
416      ======================================================================= */
417 
418   Colormap demo_cmap;		/* The colormap that goes with the dialogs:
419 				   this might be the same as `cmap' so care
420 				   must be taken not to free it while it's
421 				   still in use. */
422 
423   /* =======================================================================
424      timers
425      ======================================================================= */
426 
427   poll_mouse_data last_poll_mouse;	/* Used only when no server exts. */
428 
429   /* =======================================================================
430      subprocs
431      ======================================================================= */
432 
433   int current_hack;		/* Index into `prefs.screenhacks' */
434   pid_t pid;
435 
436   int stderr_text_x;
437   int stderr_text_y;
438   int stderr_line_height;
439   XFontStruct *stderr_font;
440   GC stderr_gc;
441   Window stderr_overlay_window;    /* Used if the server has overlay planes */
442   Colormap stderr_cmap;
443 };
444 
445 
446 #endif /* __XSCREENSAVER_TYPES_H__ */
447