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