You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
libtdevnc/x11vnc/x11vnc.h

532 lines
14 KiB

#ifndef _X11VNC_X11VNC_H
#define _X11VNC_X11VNC_H
/* -- x11vnc.h -- */
/*
* These ' -- filename.[ch] -- ' comments represent a partial cleanup:
* they are an odd way to indicate how this huge file would be split up
* someday into multiple files.
*
* The primary reason we have not broken up this file is for user
* convenience: those wanting to use the latest version download a single
* file, x11vnc.c, and off they go...
*/
/****************************************************************************/
/* Standard includes and libvncserver */
#include <unistd.h>
#include <signal.h>
#include <sys/utsname.h>
#ifdef __hpux
/* to avoid select() compiler warning */
#include <sys/time.h>
#endif
#include <time.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <ctype.h>
#include <rfb/rfb.h>
#include <rfb/rfbregion.h>
/* we can now build under --without-x: */
#if LIBVNCSERVER_HAVE_X11
#define NO_X11 0
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>
#include <X11/Xatom.h>
#else
#define NO_X11 1
#include "nox11.h"
#include <rfb/keysym.h>
#endif
/****************************************************************************/
/*
* Build-time customization via CPPFLAGS.
*
* Summary of options to include in CPPFLAGS for custom builds:
*
* -DVNCSHARED to have the vnc display shared by default.
* -DFOREVER to have -forever on by default.
* -DNOREPEAT=0 to have -repeat on by default.
* -DXINERAMA=0 to have -noxinerama on by default.
* -DADDKEYSYMS=0 to have -noadd_keysyms the default.
*
* -DREMOTE_DEFAULT=0 to disable remote-control on by default (-yesremote).
* -DREMOTE_CONTROL=0 to disable remote-control mechanism completely.
* -DEXTERNAL_COMMANDS=0 to disable the running of all external commands.
* -DFILEXFER=0 disable filexfer.
*
* -DHARDWIRE_PASSWD=... hardwired passwords, quoting necessary.
* -DHARDWIRE_VIEWPASSWD=...
* -DNOPW=1 make -nopw the default (skip warning)
* -DUSEPW=1 make -usepw the default
* -DPASSWD_REQUIRED=1 exit unless a password is supplied.
* -DPASSWD_UNLESS_NOPW=1 exit unless a password is supplied and no -nopw.
*
* -DCURSOR_DRAG=1 to have -cursor_drag as the default.
* -DWIREFRAME=0 to have -nowireframe as the default.
* -DWIREFRAME_COPYRECT=0 to have -nowirecopyrect as the default.
* -DWIREFRAME_PARMS=... set default -wirecopyrect parameters.
* -DSCROLL_COPYRECT=0 to have -noscrollcopyrect as the default.
* -DSCROLL_COPYRECT_PARMS=... set default -scrollcopyrect parameters.
* -DSCALING_COPYRECT=0
* -DXDAMAGE=0 to have -noxdamage as the default.
* -DSKIPDUPS=0 to have -noskip_dups as the default or vice versa.
*
* -DPOINTER_MODE_DEFAULT={0,1,2,3,4} set default -pointer_mode.
* -DBOLDLY_CLOSE_DISPLAY=0 to not close X DISPLAY under -rawfb.
* -DSMALL_FOOTPRINT=1 for smaller binary size (no help, no gui, etc)
* use 2 or 3 for even smaller footprint.
* -DNOGUI do not include the gui tkx11vnc.
* -DSKIP_HELP=1 smaller.
* -DSKIP_XKB=1 a little smaller.
* -DSKIP_8to24=1 a little smaller.
* -DPOLL_8TO24_DELAY=N
* -DDEBUG_XEVENTS=1 enable printout for X events.
*
* Set these in CPPFLAGS before running configure. E.g.:
*
* % env CPPFLAGS="-DFOREVER -DREMOTE_CONTROL=0" ./configure
* % make
*/
/*
* This can be used to disable the remote control mechanism.
*/
#ifndef REMOTE_CONTROL
#define REMOTE_CONTROL 1
#endif
#ifndef XINERAMA
#define XINERAMA 1
#endif
#ifndef NOPW
#define NOPW 0
#endif
#ifndef USEPW
#define USEPW 0
#endif
#ifndef PASSWD_REQUIRED
#define PASSWD_REQUIRED 0
#endif
#ifndef PASSWD_UNLESS_NOPW
#define PASSWD_UNLESS_NOPW 0
#endif
#define xxNO_SSL_OR_UNIXPW
/*
* Beginning of support for small binary footprint build for embedded
* systems, PDA's etc. It currently just cuts out the low-hanging
* fruit (large text passages). Set to 2, 3 to cut out some of the
* more esoteric extensions. More tedious is to modify LDFLAGS in the
* Makefile to not link against the extension libraries... but that
* should be done too (manually for now).
*
* If there is interest more of the bloat can be removed... Currently
* these shrink the binary from 1100K to about 600K.
*/
#ifndef SMALL_FOOTPRINT
#define SMALL_FOOTPRINT 0
#endif
#ifndef SKIP_XKB
#define SKIP_XKB 0
#endif
#ifndef SKIP_8TO24
#define SKIP_8TO24 0
#endif
#ifndef SKIP_HELP
#define SKIP_HELP 0
#endif
#if SMALL_FOOTPRINT
#undef NOGUI
#define NOGUI
#undef SKIP_HELP
#define SKIP_HELP 1
#endif
#if (SMALL_FOOTPRINT > 1)
#undef SKIP_XKB
#undef SKIP_8TO24
#undef LIBVNCSERVER_HAVE_LIBXINERAMA
#undef LIBVNCSERVER_HAVE_LIBXFIXES
#undef LIBVNCSERVER_HAVE_LIBXDAMAGE
#define SKIP_XKB 1
#define SKIP_8TO24 1
#define LIBVNCSERVER_HAVE_LIBXINERAMA 0
#define LIBVNCSERVER_HAVE_LIBXFIXES 0
#define LIBVNCSERVER_HAVE_LIBXDAMAGE 0
#endif
#if (SMALL_FOOTPRINT > 2)
#undef LIBVNCSERVER_HAVE_UTMPX_H
#undef LIBVNCSERVER_HAVE_PWD_H
#undef REMOTE_CONTROL
#define LIBVNCSERVER_HAVE_UTMPX_H 0
#define LIBVNCSERVER_HAVE_PWD_H 0
#define REMOTE_CONTROL 0
#endif
/*
* Not recommended unless you know what you are getting into, but if you
* define the HARDWIRE_PASSWD or HARDWIRE_VIEWPASSWD variables here or in
* CPPFLAGS you can set a default -passwd and -viewpasswd string values,
* perhaps this would be better than nothing on an embedded system, etc.
* These default values will be overridden by the command line.
* We don't even give an example ;-)
*/
/****************************************************************************/
/* Extensions and related includes: */
#if LIBVNCSERVER_HAVE_XSHM
# if defined(__hpux) && defined(__ia64) /* something weird on hp/itanic */
# undef _INCLUDE_HPUX_SOURCE
# endif
#include <sys/ipc.h>
#include <sys/shm.h>
#include <X11/extensions/XShm.h>
#endif
#include <dirent.h>
#if LIBVNCSERVER_HAVE_XTEST
#include <X11/extensions/XTest.h>
#endif
extern int xtest_base_event_type;
#if LIBVNCSERVER_HAVE_LIBXTRAP
#define NEED_EVENTS
#define NEED_REPLIES
#include <X11/extensions/xtraplib.h>
#include <X11/extensions/xtraplibp.h>
extern XETC *trap_ctx;
#endif
extern int xtrap_base_event_type;
#if LIBVNCSERVER_HAVE_RECORD
#include <X11/Xproto.h>
#include <X11/extensions/record.h>
#endif
#if LIBVNCSERVER_HAVE_XKEYBOARD
#include <X11/XKBlib.h>
#endif
#if LIBVNCSERVER_HAVE_LIBXINERAMA
#include <X11/extensions/Xinerama.h>
#endif
#if LIBVNCSERVER_HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
#include <netdb.h>
#ifndef _AIX
extern int h_errno;
#endif
#if LIBVNCSERVER_HAVE_NETINET_IN_H
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#endif
#if LIBVNCSERVER_HAVE_PWD_H
#include <pwd.h>
#endif
#if LIBVNCSERVER_HAVE_SYS_WAIT_H
#include <sys/wait.h>
#endif
#if LIBVNCSERVER_HAVE_UTMPX_H
#include <utmpx.h>
#endif
#if LIBVNCSERVER_HAVE_MMAP
#include <sys/mman.h>
#endif
/*
* overlay/multi-depth screen reading support
* undef SOLARIS_OVERLAY or IRIX_OVERLAY if there are problems building.
*/
/* solaris/sun */
#if defined (__SVR4) && defined (__sun)
# define SOLARIS
# ifdef LIBVNCSERVER_HAVE_SOLARIS_XREADSCREEN
# define SOLARIS_OVERLAY
# define OVERLAY_OS
# endif
#endif
#ifdef SOLARIS_OVERLAY
#include <X11/extensions/transovl.h>
#endif
/* irix/sgi */
#if defined(__sgi)
# define IRIX
# ifdef LIBVNCSERVER_HAVE_IRIX_XREADDISPLAY
# define IRIX_OVERLAY
# define OVERLAY_OS
# endif
#endif
/*
* For reference, the OS header defines:
__SVR4 && __sun is solaris
__sgi
__hpux
__osf__
__OpenBSD__
__FreeBSD__
__NetBSD__
__linux__
(defined(__MACH__) && defined(__APPLE__))
_AIX
*/
#ifdef IRIX_OVERLAY
#include <X11/extensions/readdisplay.h>
#endif
extern int overlay_present;
#if LIBVNCSERVER_HAVE_LIBXRANDR
#include <X11/extensions/Xrandr.h>
#endif
extern int xrandr_base_event_type;
#if LIBVNCSERVER_HAVE_LIBXFIXES
#include <X11/extensions/Xfixes.h>
#endif
extern int xfixes_base_event_type;
#if LIBVNCSERVER_HAVE_LIBXDAMAGE
#include <X11/extensions/Xdamage.h>
#endif
extern int xdamage_base_event_type;
#define RAWFB_RET(y) if (raw_fb && ! dpy) return y;
#define RAWFB_RET_VOID if (raw_fb && ! dpy) return;
extern char lastmod[];
/* X display info */
extern Display *dpy; /* the single display screen we connect to */
extern int scr;
extern char *xauth_raw_data;
extern int xauth_raw_len;
extern Window window, rootwin; /* polled window, root window (usu. same) */
extern Visual *default_visual; /* the default visual (unless -visual) */
extern int bpp, depth;
extern int indexed_color;
extern int dpy_x, dpy_y; /* size of display */
extern int fb_x, fb_y, fb_b; /* fb size and bpp guesses at display */
extern int off_x, off_y; /* offsets for -sid */
extern int wdpy_x, wdpy_y; /* for actual sizes in case of -clip */
extern int cdpy_x, cdpy_y, coff_x, coff_y; /* the -clip params */
extern int button_mask; /* button state and info */
extern int button_mask_prev;
extern int num_buttons;
/* image structures */
extern XImage *scanline;
extern XImage *fullscreen;
extern XImage **tile_row; /* for all possible row runs */
extern XImage *snaprect; /* for XShmGetImage (fs_factor) */
extern XImage *snap; /* the full snap fb */
extern XImage *raw_fb_image; /* the raw fb */
#if !LIBVNCSERVER_HAVE_XSHM
/*
* for simplicity, define this struct since we'll never use them
* under using_shm = 0.
*/
typedef struct {
int shmid; char *shmaddr; Bool readOnly;
} XShmSegmentInfo;
#endif
/* corresponding shm structures */
extern XShmSegmentInfo scanline_shm;
extern XShmSegmentInfo fullscreen_shm;
extern XShmSegmentInfo *tile_row_shm; /* for all possible row runs */
extern XShmSegmentInfo snaprect_shm;
/* rfb screen info */
extern rfbScreenInfoPtr screen;
extern char *rfb_desktop_name;
extern char *http_dir;
extern char vnc_desktop_name[];
extern char *main_fb; /* our copy of the X11 fb */
extern char *rfb_fb; /* same as main_fb unless transformation */
extern char *fake_fb; /* used under -padgeom */
extern char *snap_fb; /* used under -snapfb */
extern char *cmap8to24_fb; /* used under -8to24 */
extern char *rot_fb; /* used under -rotate */
extern char *raw_fb;
extern char *raw_fb_addr;
extern int raw_fb_offset;
extern int raw_fb_shm;
extern int raw_fb_mmap;
extern int raw_fb_seek;
extern int raw_fb_fd;
extern int raw_fb_back_to_X;
extern int rfb_bytes_per_line;
extern int main_bytes_per_line;
extern int rot_bytes_per_line;
extern unsigned long main_red_mask, main_green_mask, main_blue_mask;
extern unsigned short main_red_max, main_green_max, main_blue_max;
extern unsigned short main_red_shift, main_green_shift, main_blue_shift;
/* scaling parameters */
extern char *scale_str;
extern double scale_fac;
extern int scaling;
extern int scaling_blend; /* for no blending option (very course) */
extern int scaling_nomult4; /* do not require width = n * 4 */
extern int scaling_pad; /* pad out scaled sizes to fit denominator */
extern int scaling_interpolate; /* use interpolation scheme when shrinking */
extern int scaled_x, scaled_y; /* dimensions of scaled display */
extern int scale_numer, scale_denom; /* n/m */
extern char *rotating_str;
extern int rotating;
extern int rotating_same;
extern int rotating_cursors;
/* scale cursor */
extern char *scale_cursor_str;
extern double scale_cursor_fac;
extern int scaling_cursor;
extern int scaling_cursor_blend;
extern int scaling_cursor_interpolate;
extern int scale_cursor_numer, scale_cursor_denom;
/* size of the basic tile unit that is polled for changes: */
extern int tile_x;
extern int tile_y;
extern int ntiles, ntiles_x, ntiles_y;
/* arrays that indicate changed or checked tiles. */
extern unsigned char *tile_has_diff, *tile_tried, *tile_copied;
extern unsigned char *tile_has_xdamage_diff, *tile_row_has_xdamage_diff;
/* times of recent events */
extern time_t last_event, last_input, last_client;
extern time_t last_keyboard_input, last_pointer_input;
extern time_t last_fb_bytes_sent;
extern double last_keyboard_time;
extern double last_pointer_time;
extern double last_pointer_click_time;
extern double last_pointer_motion_time;
extern double last_key_to_button_remap_time;
extern double last_copyrect;
extern double last_copyrect_fix;
extern double servertime_diff;
extern double x11vnc_start;
extern int hack_val;
/* last client to move pointer */
extern rfbClientPtr last_pointer_client;
extern rfbClientPtr latest_client;
extern int client_count;
extern int clients_served;
/* more transient kludge variables: */
extern int cursor_x, cursor_y; /* x and y from the viewer(s) */
extern int button_change_x, button_change_y;
extern int got_user_input;
extern int got_pointer_input;
extern int got_pointer_calls;
extern int got_keyboard_input;
extern int got_keyboard_calls;
extern int urgent_update;
extern int last_keyboard_keycode;
extern rfbBool last_rfb_down;
extern rfbBool last_rfb_key_accepted;
extern rfbKeySym last_rfb_keysym;
extern double last_rfb_keytime;
extern int fb_copy_in_progress;
extern int drag_in_progress;
extern int shut_down;
extern int do_copy_screen;
extern time_t damage_time;
extern int damage_delay;
extern int program_pid;
extern char *program_name;
extern char *program_cmdline;
extern struct utsname UT;
typedef struct hint {
/* location x, y, height, and width of a change-rectangle */
/* (grows as adjacent horizontal tiles are glued together) */
int x, y, w, h;
} hint_t;
/* struct with client specific data: */
#define CILEN 10
typedef struct _ClientData {
int uid;
char *hostname;
char *username;
char *unixname;
int client_port;
int server_port;
char *server_ip;
char input[CILEN];
int login_viewonly;
time_t login_time;
pid_t ssl_helper_pid;
int had_cursor_shape_updates;
int had_cursor_pos_updates;
double timer;
double send_cmp_rate;
double send_raw_rate;
double latency;
int cmp_bytes_sent;
int raw_bytes_sent;
} ClientData;
extern void nox11_exit(int rc);
#include "params.h"
#include "enums.h"
#include "options.h"
#include "util.h"
#endif /* _X11VNC_X11VNC_H */