| /* | 
 |    Copyright (C) 2002-2010 Karl J. Runge <[email protected]>  | 
 |    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; | 
 |  | 
 |  |