text: /* xscreensaver, Copyright (c) 1993-2019 Jamie Zawinski <jwz@jwz.org>
   *
   * Permission to use, copy, modify, distribute, and sell this software and its
   * documentation for any purpose is hereby granted without fee, provided that
   * the above copyright notice appear in all copies and that both that
   * copyright notice and this permission notice appear in supporting
   * documentation.  No representations are made about the suitability of this
   * software for any purpose.  It is provided "as is" without express or 
   * implied warranty.
   */
  
  #ifndef __XSCREENSAVER_TYPES_H__
  #define __XSCREENSAVER_TYPES_H__
  
  typedef struct saver_info saver_info;
  
  typedef enum {
    ul_read,		/* reading input or ready to do so */
    ul_success,		/* auth success, unlock */
    ul_fail,		/* auth fail */
    ul_cancel,		/* user cancelled auth (pw_cancel or pw_null) */
    ul_time,		/* timed out */
    ul_finished		/* user pressed enter */
  } unlock_state;
  
  typedef struct screenhack screenhack;
  struct screenhack {
    Bool enabled_p;
    char *visual;
    char *name;
    char *command;
  };
  
  typedef enum {
    RANDOM_HACKS, ONE_HACK, BLANK_ONLY, DONT_BLANK, RANDOM_HACKS_SAME
  } saver_mode;
  
  typedef enum {
    TEXT_DATE, TEXT_LITERAL, TEXT_FILE, TEXT_PROGRAM, TEXT_URL
  } text_mode;
  
  struct auth_message;
  struct auth_response;
  
  typedef int (*auth_conv_cb_t) (
    int num_msg,
    const struct auth_message *msg,
    struct auth_response **resp,
    saver_info *si);
  
  typedef struct saver_preferences saver_preferences;
  typedef struct saver_screen_info saver_screen_info;
  typedef struct passwd_dialog_data passwd_dialog_data;
  typedef struct splash_dialog_data splash_dialog_data;
  typedef struct _monitor monitor;
  
  typedef struct poll_mouse_data poll_mouse_data;
  struct poll_mouse_data {
    int root_x;
    int root_y;
    Window child;
    unsigned int mask;
    time_t time;
  };
  
  #ifdef HAVE_XINPUT
  /* XInputExtension device support */
  #include <X11/extensions/XInput.h>
  
  typedef struct xinput_dev_info xinput_dev_info;
  struct xinput_dev_info {
    XDevice       *device;
    XEventClass   press, release, valuator;
    poll_mouse_data last_poll_mouse;
  };
  #endif
  
  /* This structure holds all the user-specified parameters, read from the
     command line, the resource database, or entered through a dialog box.
   */
  struct saver_preferences {
  
    XrmDatabase db;		/* The resource database into which the
  				   init file is merged, and out of which the
  				   preferences are parsed. */
  
    time_t init_file_date;	/* The date (from stat()) of the .xscreensaver
  				   file the last time this process read or
  				   wrote it. */
  
    Bool verbose_p;		/* whether to print out lots of status info */
    Bool timestamp_p;		/* whether to mark messages with a timestamp */
    Bool capture_stderr_p;	/* whether to redirect stdout/stderr  */
    Bool ignore_uninstalled_p;	/* whether to avoid displaying or complaining
                                     about hacks that are not on $PATH */
    Bool debug_p;			/* pay no mind to the man behind the curtain */
    Bool xsync_p;			/* whether XSynchronize has been called */
  
    Bool lock_p;			/* whether to lock as well as save */
  
    Bool fade_p;			/* whether to fade to black, if possible */
    Bool unfade_p;		/* whether to fade from black, if possible */
    Time fade_seconds;		/* how long that should take */
    int fade_ticks;		/* how many ticks should be used */
    Bool splash_p;		/* whether to do a splash screen at startup */
  
    Bool install_cmap_p;		/* whether we should use our own colormap
  				   when using the screen's default visual. */
  
  # ifdef QUAD_MODE
    Bool quad_p;			/* whether to run four savers per monitor */
  # endif
  
    screenhack **screenhacks;	/* the programs to run */
    int screenhacks_count;
  
    saver_mode mode;		/* hack-selection mode */
    int selected_hack;		/* in one_hack mode, this is the one */
  
    int nice_inferior;		/* nice value for subprocs */
    int inferior_memory_limit;	/* setrlimit(LIMIT_AS) value for subprocs */
  
    Time initial_delay;		/* how long to sleep after launch */
    Time splash_duration;		/* how long the splash screen stays up */
    Time timeout;			/* how much idle time before activation */
    Time lock_timeout;		/* how long after activation locking starts */
    Time cycle;			/* how long each hack should run */
    Time passwd_timeout;		/* how much time before pw dialog goes down */
    Time pointer_timeout;		/* how often to check mouse position */
    Time notice_events_timeout;	/* how long after window creation to select */
    Time watchdog_timeout;	/* how often to re-raise and re-blank screen */
    int pointer_hysteresis;	/* mouse motions less than N/sec are ignored */
  
    Bool dpms_enabled_p;		/* Whether to power down the monitor */
    Bool dpms_quickoff_p;		/* Whether to power down monitor immediately
  				   in "Blank Only" mode */
    Time dpms_standby;		/* how long until monitor goes black */
    Time dpms_suspend;		/* how long until monitor power-saves */
    Time dpms_off;		/* how long until monitor powers down */
  
    Bool grab_desktop_p;		/* These are not used by "xscreensaver" */
    Bool grab_video_p;		/*  itself: they are used by the external */
    Bool random_image_p;		/*  "xscreensaver-getimage" program, and set */
    char *image_directory;	/*  by the "xscreensaver-demo" configurator. */
  
    text_mode tmode;		/* How we generate text to display. */
    char *text_literal;		/* used when tmode is TEXT_LITERAL. */
    char *text_file;		/* used when tmode is TEXT_FILE.    */
    char *text_program;		/* used when tmode is TEXT_PROGRAM. */
    char *text_url;		/* used when tmode is TEXT_URL.     */
  
    Bool use_xidle_extension;	/* which extension to use, if possible */
    Bool use_mit_saver_extension;
    Bool use_sgi_saver_extension;
    Bool use_proc_interrupts;
    Bool use_xinput_extension;
  
    Bool getviewport_full_of_lies_p; /* XFree86 bug #421 */
  
    char *shell;			/* where to find /bin/sh */
  
    char *demo_command;		/* How to enter demo mode. */
    char *prefs_command;		/* How to edit preferences. */
    char *help_url;		/* Where the help document resides. */
    char *load_url_command;	/* How one loads URLs. */
    char *new_login_command;	/* Command for the "New Login" button. */
  
    int auth_warning_slack;	/* Don't warn about login failures if they
                                     all happen within this many seconds of
                                     a successful login. */
  };
  
  /* This structure holds all the data that applies to the program as a whole,
     or to the non-screen-specific parts of the display connection.
  
     The saver_preferences structure (prefs.h) holds all the user-specified
     parameters, read from the command line, the resource database, or entered
     through a dialog box.
   */
  struct saver_info {
    char *version;
    saver_preferences prefs;
  
    int nscreens;
    int ssi_count;
    saver_screen_info *screens;
    saver_screen_info *default_screen;	/* ...on which dialogs will appear. */
    monitor **monitor_layout;		/* private to screens.c */
    Visual **best_gl_visuals;		/* visuals for GL hacks on screen N */
  
    /* =======================================================================
       global connection info
       ======================================================================= */
  
    XtAppContext app;
    Display *dpy;
  
    /* =======================================================================
       server extension info
       ======================================================================= */
  
    Bool using_xidle_extension;	   /* which extension is being used.         */
    Bool using_mit_saver_extension;  /* Note that `p->use_*' is the *request*, */
    Bool using_sgi_saver_extension;  /* and `si->using_*' is the *reality*.    */
    Bool using_proc_interrupts;
  
  # ifdef HAVE_MIT_SAVER_EXTENSION
    int mit_saver_ext_event_number;
    int mit_saver_ext_error_number;
  # endif
  # ifdef HAVE_SGI_SAVER_EXTENSION
    int sgi_saver_ext_event_number;
    int sgi_saver_ext_error_number;
  # endif
  # ifdef HAVE_RANDR
    int randr_event_number;
    int randr_error_number;
    Bool using_randr_extension;
  # endif
  
    Bool using_xinput_extension;     /* Note that `p->use_*' is the *request*, */
                                     /* and `si->using_*' is the *reality*.    */
  #ifdef HAVE_XINPUT
    int xinput_ext_event_number;     /* may not be used */
    int xinput_ext_error_number;
    int xinput_DeviceButtonPress;    /* Extension device event codes.          */
    int xinput_DeviceButtonRelease;  /* Assigned by server at runtime          */
    int xinput_DeviceMotionNotify;
    xinput_dev_info *xinput_devices;
    int num_xinput_devices;
  # endif
  
    /* =======================================================================
       blanking
       ======================================================================= */
  
    Bool screen_blanked_p;	/* Whether the saver is currently active. */
    Window mouse_grab_window;	/* Window holding our mouse grab */
    Window keyboard_grab_window;	/* Window holding our keyboard grab */
    int mouse_grab_screen;	/* The screen number the mouse grab is on */
    int keyboard_grab_screen;	/* The screen number the keyboard grab is on */
    Bool fading_possible_p;	/* Whether fading to/from black is possible. */
    Bool throttled_p;             /* Whether we should temporarily just blank
                                     the screen, not run hacks. (Deprecated:
                                     users should use "xset dpms force off"
                                     instead.) */
    time_t blank_time;		/* The time at which the screen was blanked
                                     (if currently blanked) or unblanked (if
                                     not blanked.) */
  
  
    /* =======================================================================
       locking and runtime privileges
       ======================================================================= */
  
    Bool locked_p;		/* Whether the screen is currently locked. */
    Bool dbox_up_p;		/* Whether the demo-mode or passwd dialogs
  				   are currently visible */
  
    Bool locking_disabled_p;	/* Sometimes locking is impossible. */
    char *nolock_reason;		/* This is why. */
  
    char *orig_uid;		/* What uid/gid we had at startup, before
  				   discarding privileges. */
    char *uid_message;		/* Any diagnostics from our attempt to
  				   discard privileges (printed only in
  				   -verbose mode.) */
    Bool dangerous_uid_p;		/* Set to true if we're running as a user id
  				   which is known to not be a normal, non-
  				   privileged user. */
  
    Window passwd_dialog;		/* The password dialog, if it's up. */
    passwd_dialog_data *pw_data;	/* Other info necessary to draw it. */
  
    int unlock_failures;		/* Counts failed login attempts while the
  				   screen is locked. */
    time_t unlock_failure_time;	/* Time of first failed login attempt. */
  
    char *unlock_typeahead;	/* If the screen is locked, and the user types
                                     a character, we assume that it is the first
                                     character of the password.  It's stored here
                                     for the password dialog to use to populate
                                     itself. */
  
    char *user;			/* The user whose session is locked. */
    char *cached_passwd;		/* Cached password, used to avoid multiple
  				   prompts for password-only auth mechanisms.*/
    unlock_state unlock_state;
  
    auth_conv_cb_t unlock_cb;	/* The function used to prompt for creds. */
    void (*auth_finished_cb) (saver_info *si);
  				/* Called when authentication has finished,
  				   regardless of success or failure.
  				   May be NULL. */
  
  
    /* =======================================================================
       demoing
       ======================================================================= */
  
    Bool demoing_p;		/* Whether we are demoing a single hack
  				   (without UI.) */
  
    Window splash_dialog;		/* The splash dialog, if its up. */
    splash_dialog_data *sp_data;	/* Other info necessary to draw it. */
  
  
    /* =======================================================================
       timers
       ======================================================================= */
  
    XtIntervalId lock_id;		/* Timer to implement `prefs.lock_timeout' */
    XtIntervalId cycle_id;	/* Timer to implement `prefs.cycle' */
    XtIntervalId timer_id;	/* Timer to implement `prefs.timeout' */
    XtIntervalId watchdog_id;	/* Timer to implement `prefs.watchdog */
    XtIntervalId check_pointer_timer_id;	/* `prefs.pointer_timeout' */
  
    XtIntervalId de_race_id;	/* Timer to make sure screen un-blanks */
    int de_race_ticks;
  
    time_t last_activity_time;		   /* Used only when no server exts. */
    time_t last_wall_clock_time;             /* Used to detect laptop suspend. */
    saver_screen_info *last_activity_screen;
  
    Bool emergency_lock_p;        /* Set when the wall clock has jumped
                                     (presumably due to laptop suspend) and we
                                     need to lock down right away instead of
                                     waiting for the lock timer to go off. */
  
  
    /* =======================================================================
       remote control
       ======================================================================= */
  
    int selection_mode;		/* Set to -1 if the NEXT ClientMessage has just
  				   been received; set to -2 if PREV has just
  				   been received; set to N if SELECT or DEMO N
  				   has been received.  (This is kind of nasty.)
  				 */
  
    /* =======================================================================
       subprocs
       ======================================================================= */
  
    XtIntervalId stderr_popup_timer;
  
  # ifdef HAVE_LIBSYSTEMD
    pid_t systemd_pid;
  # endif
  };
  
  /* This structure holds all the data that applies to the screen-specific parts
     of the display connection; if the display has multiple screens, there will
     be one of these for each screen.
   */
  struct saver_screen_info {
    saver_info *global;
  
    int number;			/* The internal ordinal of this screen,
                                     counting Xinerama rectangles as separate
                                     screens. */
    int real_screen_number;	/* The number of the underlying X screen on
                                     which this rectangle lies. */
    Screen *screen;		/* The X screen in question. */
  
    int x, y, width, height;	/* The size and position of this rectangle
                                     on its underlying X screen. */
  
    Bool real_screen_p;		/* This will be true of exactly one ssi per
                                     X screen. */
  
    Widget toplevel_shell;
  
    /* =======================================================================
       blanking
       ======================================================================= */
  
    Window screensaver_window;	/* The window that will impersonate the root,
  				   when the screensaver activates.  Note that
  				   the window stored here may change, as we
  				   destroy and recreate it on different
  				   visuals. */
    Colormap cmap;		/* The colormap that goes with the window. */
    Bool install_cmap_p;		/* Whether this screen should have its own
                                     colormap installed, for whichever of several
                                     reasons.  This is definitive (even a false
                                     value here overrides prefs->install_cmap_p.)
                                   */
    Visual *current_visual;	/* The visual of the window. */
    int current_depth;		/* How deep the visual (and the window) are. */
  
    Visual *default_visual;	/* visual to use when none other specified */
  
    Window real_vroot;		/* The original virtual-root window. */
    Window real_vroot_value;	/* What was in the __SWM_VROOT property. */
  
    Cursor cursor;		/* A blank cursor that goes with the
  				   real root window. */
    unsigned long black_pixel;	/* Black, allocated from `cmap'. */
  
    int blank_vp_x, blank_vp_y;   /* Where the virtual-scrolling viewport was
                                     when the screen went blank.  We need to
                                     prevent the X server from letting the mouse
                                     bump the edges to scroll while the screen
                                     is locked, so we reset to this when it has
                                     moved, and the lock dialog is up... */
  
  # ifdef HAVE_MIT_SAVER_EXTENSION
    Window server_mit_saver_window;
  # endif
  
  
    /* =======================================================================
       demoing
       ======================================================================= */
  
    Colormap demo_cmap;		/* The colormap that goes with the dialogs:
  				   this might be the same as `cmap' so care
  				   must be taken not to free it while it's
  				   still in use. */
  
    /* =======================================================================
       timers
       ======================================================================= */
  
    poll_mouse_data last_poll_mouse;	/* Used only when no server exts. */
  
    /* =======================================================================
       subprocs
       ======================================================================= */
  
    int current_hack;		/* Index into `prefs.screenhacks' */
    pid_t pid;
  
    int stderr_text_x;
    int stderr_text_y;
    int stderr_line_height;
    XFontStruct *stderr_font;
    GC stderr_gc;
    Window stderr_overlay_window;    /* Used if the server has overlay planes */
    Colormap stderr_cmap;
  };
  
  
  #endif /* __XSCREENSAVER_TYPES_H__ */
  