|
|
|
/*
|
|
|
|
Copyright (C) 2002-2010 Karl J. Runge <runge@karlrunge.com>
|
|
|
|
All rights reserved.
|
|
|
|
|
|
|
|
This file is part of x11vnc.
|
|
|
|
|
|
|
|
x11vnc is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 2 of the License, or (at
|
|
|
|
your option) any later version.
|
|
|
|
|
|
|
|
x11vnc is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with x11vnc; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA
|
|
|
|
or see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
In addition, as a special exception, Karl J. Runge
|
|
|
|
gives permission to link the code of its release of x11vnc with the
|
|
|
|
OpenSSL project's "OpenSSL" library (or with modified versions of it
|
|
|
|
that use the same license as the "OpenSSL" library), and distribute
|
|
|
|
the linked executables. You must obey the GNU General Public License
|
|
|
|
in all respects for all of the code used other than "OpenSSL". If you
|
|
|
|
modify this file, you may extend this exception to your version of the
|
|
|
|
file, but you are not obligated to do so. If you do not wish to do
|
|
|
|
so, delete this exception statement from your version.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* -- x11vnc_defs.c -- */
|
|
|
|
|
|
|
|
#include "x11vnc.h"
|
|
|
|
|
|
|
|
int overlay_present = 0;
|
|
|
|
|
|
|
|
int xrandr_base_event_type = 0;
|
|
|
|
|
|
|
|
int xfixes_base_event_type = 0;
|
|
|
|
int xtest_base_event_type = 0;
|
|
|
|
#if LIBVNCSERVER_HAVE_LIBXTRAP
|
|
|
|
XETC *trap_ctx = NULL;
|
|
|
|
#endif
|
|
|
|
int xtrap_base_event_type = 0;
|
|
|
|
int xdamage_base_event_type = 0;
|
|
|
|
|
|
|
|
/* date +'lastmod: %Y-%m-%d' */
|
|
|
|
char lastmod[] = "0.9.13 lastmod: 2010-12-27";
|
|
|
|
|
|
|
|
/* X display info */
|
|
|
|
|
|
|
|
Display *dpy = NULL; /* the single display screen we connect to */
|
|
|
|
int scr = 0;
|
|
|
|
char *xauth_raw_data = NULL;
|
|
|
|
int xauth_raw_len = 0;
|
|
|
|
Window window = None, rootwin = None; /* polled window, root window (usu. same) */
|
|
|
|
Visual *default_visual = NULL; /* the default visual (unless -visual) */
|
|
|
|
int bpp = 0, depth = 0;
|
|
|
|
int indexed_color = 0;
|
|
|
|
int dpy_x = 0, dpy_y = 0; /* size of display */
|
|
|
|
int fb_x = 0, fb_y = 0, fb_b = 0; /* fb size and bpp guesses at display */
|
|
|
|
int off_x, off_y; /* offsets for -sid */
|
|
|
|
int wdpy_x, wdpy_y; /* for actual sizes in case of -clip */
|
|
|
|
int cdpy_x, cdpy_y, coff_x, coff_y; /* the -clip params */
|
|
|
|
int button_mask = 0; /* button state and info */
|
|
|
|
int button_mask_prev = 0;
|
|
|
|
int num_buttons = -1;
|
|
|
|
|
|
|
|
long xselectinput_rootwin = 0;
|
|
|
|
|
|
|
|
unsigned int display_button_mask = 0;
|
|
|
|
unsigned int display_mod_mask = 0;
|
|
|
|
|
|
|
|
/* image structures */
|
|
|
|
XImage *scanline = NULL;
|
|
|
|
XImage *fullscreen = NULL;
|
|
|
|
XImage **tile_row = NULL; /* for all possible row runs */
|
|
|
|
XImage *snaprect = NULL; /* for XShmGetImage (fs_factor) */
|
|
|
|
XImage *snap = NULL; /* the full snap fb */
|
|
|
|
XImage *raw_fb_image = NULL; /* the raw fb */
|
|
|
|
|
|
|
|
/* corresponding shm structures */
|
|
|
|
XShmSegmentInfo scanline_shm;
|
|
|
|
XShmSegmentInfo fullscreen_shm;
|
|
|
|
XShmSegmentInfo *tile_row_shm; /* for all possible row runs */
|
|
|
|
XShmSegmentInfo snaprect_shm;
|
|
|
|
|
|
|
|
/* rfb screen info */
|
|
|
|
rfbScreenInfoPtr screen = NULL;
|
|
|
|
char *rfb_desktop_name = NULL;
|
|
|
|
char *http_dir = NULL;
|
|
|
|
char vnc_desktop_name[256];
|
|
|
|
char *main_fb = NULL; /* our copy of the X11 fb */
|
|
|
|
char *rfb_fb = NULL; /* same as main_fb unless transformation */
|
|
|
|
char *fake_fb = NULL; /* used under -padgeom */
|
|
|
|
char *snap_fb = NULL; /* used under -snapfb */
|
|
|
|
char *cmap8to24_fb = NULL; /* used under -8to24 */
|
|
|
|
char *rot_fb = NULL;
|
|
|
|
char *raw_fb = NULL; /* when used should be main_fb */
|
|
|
|
char *raw_fb_addr = NULL;
|
|
|
|
int raw_fb_offset = 0;
|
|
|
|
int raw_fb_shm = 0;
|
|
|
|
int raw_fb_mmap = 0;
|
|
|
|
int raw_fb_seek = 0;
|
|
|
|
int raw_fb_fd = -1;
|
|
|
|
int raw_fb_back_to_X = 0; /* kludge for testing rawfb -> X */
|
|
|
|
|
|
|
|
int raw_fb_native_bpp = 0;
|
|
|
|
int raw_fb_expand_bytes = 1;
|
|
|
|
unsigned long raw_fb_native_red_mask = 0, raw_fb_native_green_mask = 0, raw_fb_native_blue_mask = 0;
|
|
|
|
unsigned short raw_fb_native_red_max = 0, raw_fb_native_green_max = 0, raw_fb_native_blue_max = 0;
|
|
|
|
unsigned short raw_fb_native_red_shift = 0, raw_fb_native_green_shift = 0, raw_fb_native_blue_shift = 0;
|
|
|
|
|
|
|
|
int rfb_bytes_per_line = 0;
|
|
|
|
int main_bytes_per_line = 0;
|
|
|
|
int rot_bytes_per_line = 0;
|
|
|
|
unsigned long main_red_mask = 0, main_green_mask = 0, main_blue_mask = 0;
|
|
|
|
unsigned short main_red_max = 0, main_green_max = 0, main_blue_max = 0;
|
|
|
|
unsigned short main_red_shift = 0, main_green_shift = 0, main_blue_shift = 0;
|
|
|
|
|
|
|
|
int raw_fb_bytes_per_line = 0;
|
|
|
|
|
|
|
|
/* scaling parameters */
|
|
|
|
char *scale_str = NULL;
|
|
|
|
double scale_fac_x = 1.0;
|
|
|
|
double scale_fac_y = 1.0;
|
|
|
|
int scaling = 0;
|
|
|
|
int scaling_blend = 1; /* for no blending option (very course) */
|
|
|
|
int scaling_nomult4 = 0; /* do not require width = n * 4 */
|
|
|
|
int scaling_pad = 0; /* pad out scaled sizes to fit denominator */
|
|
|
|
int scaling_interpolate = 0; /* use interpolation scheme when shrinking */
|
|
|
|
int scaled_x = 0, scaled_y = 0; /* dimensions of scaled display */
|
|
|
|
int scale_numer = 0, scale_denom = 0; /* n/m */
|
|
|
|
char *rotating_str = NULL;
|
|
|
|
int rotating = 0;
|
|
|
|
int rotating_same = 0;
|
|
|
|
int rotating_cursors = 0;
|
|
|
|
|
|
|
|
/* scale cursor */
|
|
|
|
char *scale_cursor_str = NULL;
|
|
|
|
double scale_cursor_fac_x = 1.0;
|
|
|
|
double scale_cursor_fac_y = 1.0;
|
|
|
|
int scaling_cursor = 0;
|
|
|
|
int scaling_cursor_blend = 1;
|
|
|
|
int scaling_cursor_interpolate = 0;
|
|
|
|
int scale_cursor_numer = 0, scale_cursor_denom = 0;
|
|
|
|
|
|
|
|
/* size of the basic tile unit that is polled for changes: */
|
|
|
|
int tile_x = 32;
|
|
|
|
int tile_y = 32;
|
|
|
|
int ntiles, ntiles_x = 0, ntiles_y = 0;
|
|
|
|
|
|
|
|
/* arrays that indicate changed or checked tiles. */
|
|
|
|
unsigned char *tile_has_diff = NULL, *tile_tried = NULL, *tile_copied = NULL;
|
|
|
|
unsigned char *tile_has_xdamage_diff = NULL, *tile_row_has_xdamage_diff = NULL;
|
|
|
|
|
|
|
|
/* times of recent events */
|
|
|
|
time_t last_event = 0, last_input = 0, last_client = 0, last_open_xdisplay = 0;
|
|
|
|
time_t last_local_input = 0;
|
|
|
|
time_t last_keyboard_input = 0, last_pointer_input = 0;
|
|
|
|
time_t last_fb_bytes_sent = 0;
|
|
|
|
double last_keyboard_time = 0.0;
|
|
|
|
double last_pointer_time = 0.0;
|
|
|
|
double last_pointer_click_time = 0.0;
|
|
|
|
double last_pointer_motion_time = 0.0;
|
|
|
|
double last_key_to_button_remap_time = 0.0;
|
|
|
|
double last_copyrect = 0.0;
|
|
|
|
double last_copyrect_fix = 0.0;
|
|
|
|
double last_wireframe = 0.0;
|
|
|
|
double servertime_diff = 0.0;
|
|
|
|
double x11vnc_start = 0.0;
|
|
|
|
double x11vnc_current = 0.0;
|
|
|
|
double g_now = 0.0;
|
|
|
|
|
|
|
|
double last_get_wm_frame_time = 0.0;
|
|
|
|
Window last_get_wm_frame = None;
|
|
|
|
double last_bs_restore = 0.0;
|
|
|
|
double last_su_restore = 0.0;
|
|
|
|
double last_bs_save = 0.0;
|
|
|
|
double last_su_save = 0.0;
|
|
|
|
|
|
|
|
int hack_val = 0;
|
|
|
|
|
|
|
|
/* last client to move pointer */
|
|
|
|
rfbClientPtr last_pointer_client = NULL;
|
|
|
|
rfbClientPtr latest_client = NULL;
|
|
|
|
double last_client_gone = 0.0;
|
|
|
|
double last_new_client = 0.0;
|
|
|
|
|
|
|
|
int waited_for_client = 0;
|
|
|
|
int findcreatedisplay = 0;
|
|
|
|
char *terminal_services_daemon = NULL;
|
|
|
|
|
|
|
|
int client_count = 0;
|
|
|
|
int clients_served = 0;
|
|
|
|
int client_normal_count = 0;
|
|
|
|
|
|
|
|
/* more transient kludge variables: */
|
|
|
|
int cursor_x = 0, cursor_y = 0; /* x and y from the viewer(s) */
|
|
|
|
int button_change_x = 0, button_change_y = 0;
|
|
|
|
int got_user_input = 0;
|
|
|
|
int got_pointer_input = 0;
|
|
|
|
int got_local_pointer_input = 0;
|
|
|
|
int got_pointer_calls = 0;
|
|
|
|
int got_keyboard_input = 0;
|
|
|
|
int got_keyboard_calls = 0;
|
|
|
|
int urgent_update = 0;
|
|
|
|
int last_keyboard_keycode = 0;
|
|
|
|
rfbBool last_rfb_down = FALSE;
|
|
|
|
rfbBool last_rfb_key_accepted = FALSE;
|
|
|
|
rfbKeySym last_rfb_keysym = 0;
|
|
|
|
double last_rfb_keytime = 0.0;
|
|
|
|
double last_rfb_key_injected = 0.0;
|
|
|
|
double last_rfb_ptr_injected = 0.0;
|
|
|
|
int fb_copy_in_progress = 0;
|
|
|
|
int drag_in_progress = 0;
|
|
|
|
int shut_down = 0;
|
|
|
|
int do_copy_screen = 0;
|
|
|
|
time_t damage_time = 0;
|
|
|
|
int damage_delay = 0;
|
|
|
|
|
|
|
|
int program_pid = 0;
|
|
|
|
char *program_name = NULL;
|
|
|
|
char *program_cmdline = NULL;
|
|
|
|
|
|
|
|
struct utsname UT;
|
|
|
|
|
|
|
|
|