San Mehat | a430b2b | 2014-09-23 08:30:51 -0700 | [diff] [blame] | 1 | /* |
| 2 | Copyright (C) 2002-2010 Karl J. Runge <runge@karlrunge.com> |
| 3 | All rights reserved. |
| 4 | |
| 5 | This file is part of x11vnc. |
| 6 | |
| 7 | x11vnc is free software; you can redistribute it and/or modify |
| 8 | it under the terms of the GNU General Public License as published by |
| 9 | the Free Software Foundation; either version 2 of the License, or (at |
| 10 | your option) any later version. |
| 11 | |
| 12 | x11vnc is distributed in the hope that it will be useful, |
| 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 15 | GNU General Public License for more details. |
| 16 | |
| 17 | You should have received a copy of the GNU General Public License |
| 18 | along with x11vnc; if not, write to the Free Software |
| 19 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA |
| 20 | or see <http://www.gnu.org/licenses/>. |
| 21 | |
| 22 | In addition, as a special exception, Karl J. Runge |
| 23 | gives permission to link the code of its release of x11vnc with the |
| 24 | OpenSSL project's "OpenSSL" library (or with modified versions of it |
| 25 | that use the same license as the "OpenSSL" library), and distribute |
| 26 | the linked executables. You must obey the GNU General Public License |
| 27 | in all respects for all of the code used other than "OpenSSL". If you |
| 28 | modify this file, you may extend this exception to your version of the |
| 29 | file, but you are not obligated to do so. If you do not wish to do |
| 30 | so, delete this exception statement from your version. |
| 31 | */ |
| 32 | |
| 33 | /* -- x11vnc_defs.c -- */ |
| 34 | |
| 35 | #include "x11vnc.h" |
| 36 | |
| 37 | int overlay_present = 0; |
| 38 | |
| 39 | int xrandr_base_event_type = 0; |
| 40 | |
| 41 | int xfixes_base_event_type = 0; |
| 42 | int xtest_base_event_type = 0; |
| 43 | #if LIBVNCSERVER_HAVE_LIBXTRAP |
| 44 | XETC *trap_ctx = NULL; |
| 45 | #endif |
| 46 | int xtrap_base_event_type = 0; |
| 47 | int xdamage_base_event_type = 0; |
| 48 | |
| 49 | /* date +'lastmod: %Y-%m-%d' */ |
| 50 | char lastmod[] = "0.9.13 lastmod: 2010-12-27"; |
| 51 | |
| 52 | /* X display info */ |
| 53 | |
| 54 | Display *dpy = NULL; /* the single display screen we connect to */ |
| 55 | int scr = 0; |
| 56 | char *xauth_raw_data = NULL; |
| 57 | int xauth_raw_len = 0; |
| 58 | Window window = None, rootwin = None; /* polled window, root window (usu. same) */ |
| 59 | Visual *default_visual = NULL; /* the default visual (unless -visual) */ |
| 60 | int bpp = 0, depth = 0; |
| 61 | int indexed_color = 0; |
| 62 | int dpy_x = 0, dpy_y = 0; /* size of display */ |
| 63 | int fb_x = 0, fb_y = 0, fb_b = 0; /* fb size and bpp guesses at display */ |
| 64 | int off_x, off_y; /* offsets for -sid */ |
| 65 | int wdpy_x, wdpy_y; /* for actual sizes in case of -clip */ |
| 66 | int cdpy_x, cdpy_y, coff_x, coff_y; /* the -clip params */ |
| 67 | int button_mask = 0; /* button state and info */ |
| 68 | int button_mask_prev = 0; |
| 69 | int num_buttons = -1; |
| 70 | |
| 71 | long xselectinput_rootwin = 0; |
| 72 | |
| 73 | unsigned int display_button_mask = 0; |
| 74 | unsigned int display_mod_mask = 0; |
| 75 | |
| 76 | /* image structures */ |
| 77 | XImage *scanline = NULL; |
| 78 | XImage *fullscreen = NULL; |
| 79 | XImage **tile_row = NULL; /* for all possible row runs */ |
| 80 | XImage *snaprect = NULL; /* for XShmGetImage (fs_factor) */ |
| 81 | XImage *snap = NULL; /* the full snap fb */ |
| 82 | XImage *raw_fb_image = NULL; /* the raw fb */ |
| 83 | |
| 84 | /* corresponding shm structures */ |
| 85 | XShmSegmentInfo scanline_shm; |
| 86 | XShmSegmentInfo fullscreen_shm; |
| 87 | XShmSegmentInfo *tile_row_shm; /* for all possible row runs */ |
| 88 | XShmSegmentInfo snaprect_shm; |
| 89 | |
| 90 | /* rfb screen info */ |
| 91 | rfbScreenInfoPtr screen = NULL; |
| 92 | char *rfb_desktop_name = NULL; |
| 93 | char *http_dir = NULL; |
| 94 | char vnc_desktop_name[256]; |
| 95 | char *main_fb = NULL; /* our copy of the X11 fb */ |
| 96 | char *rfb_fb = NULL; /* same as main_fb unless transformation */ |
| 97 | char *fake_fb = NULL; /* used under -padgeom */ |
| 98 | char *snap_fb = NULL; /* used under -snapfb */ |
| 99 | char *cmap8to24_fb = NULL; /* used under -8to24 */ |
| 100 | char *rot_fb = NULL; |
| 101 | char *raw_fb = NULL; /* when used should be main_fb */ |
| 102 | char *raw_fb_addr = NULL; |
| 103 | int raw_fb_offset = 0; |
| 104 | int raw_fb_shm = 0; |
| 105 | int raw_fb_mmap = 0; |
| 106 | int raw_fb_seek = 0; |
| 107 | int raw_fb_fd = -1; |
| 108 | int raw_fb_back_to_X = 0; /* kludge for testing rawfb -> X */ |
| 109 | |
| 110 | int raw_fb_native_bpp = 0; |
| 111 | int raw_fb_expand_bytes = 1; |
| 112 | unsigned long raw_fb_native_red_mask = 0, raw_fb_native_green_mask = 0, raw_fb_native_blue_mask = 0; |
| 113 | unsigned short raw_fb_native_red_max = 0, raw_fb_native_green_max = 0, raw_fb_native_blue_max = 0; |
| 114 | unsigned short raw_fb_native_red_shift = 0, raw_fb_native_green_shift = 0, raw_fb_native_blue_shift = 0; |
| 115 | |
| 116 | int rfb_bytes_per_line = 0; |
| 117 | int main_bytes_per_line = 0; |
| 118 | int rot_bytes_per_line = 0; |
| 119 | unsigned long main_red_mask = 0, main_green_mask = 0, main_blue_mask = 0; |
| 120 | unsigned short main_red_max = 0, main_green_max = 0, main_blue_max = 0; |
| 121 | unsigned short main_red_shift = 0, main_green_shift = 0, main_blue_shift = 0; |
| 122 | |
| 123 | int raw_fb_bytes_per_line = 0; |
| 124 | |
| 125 | /* scaling parameters */ |
| 126 | char *scale_str = NULL; |
| 127 | double scale_fac_x = 1.0; |
| 128 | double scale_fac_y = 1.0; |
| 129 | int scaling = 0; |
| 130 | int scaling_blend = 1; /* for no blending option (very course) */ |
| 131 | int scaling_nomult4 = 0; /* do not require width = n * 4 */ |
| 132 | int scaling_pad = 0; /* pad out scaled sizes to fit denominator */ |
| 133 | int scaling_interpolate = 0; /* use interpolation scheme when shrinking */ |
| 134 | int scaled_x = 0, scaled_y = 0; /* dimensions of scaled display */ |
| 135 | int scale_numer = 0, scale_denom = 0; /* n/m */ |
| 136 | char *rotating_str = NULL; |
| 137 | int rotating = 0; |
| 138 | int rotating_same = 0; |
| 139 | int rotating_cursors = 0; |
| 140 | |
| 141 | /* scale cursor */ |
| 142 | char *scale_cursor_str = NULL; |
| 143 | double scale_cursor_fac_x = 1.0; |
| 144 | double scale_cursor_fac_y = 1.0; |
| 145 | int scaling_cursor = 0; |
| 146 | int scaling_cursor_blend = 1; |
| 147 | int scaling_cursor_interpolate = 0; |
| 148 | int scale_cursor_numer = 0, scale_cursor_denom = 0; |
| 149 | |
| 150 | /* size of the basic tile unit that is polled for changes: */ |
| 151 | int tile_x = 32; |
| 152 | int tile_y = 32; |
| 153 | int ntiles, ntiles_x = 0, ntiles_y = 0; |
| 154 | |
| 155 | /* arrays that indicate changed or checked tiles. */ |
| 156 | unsigned char *tile_has_diff = NULL, *tile_tried = NULL, *tile_copied = NULL; |
| 157 | unsigned char *tile_has_xdamage_diff = NULL, *tile_row_has_xdamage_diff = NULL; |
| 158 | |
| 159 | /* times of recent events */ |
| 160 | time_t last_event = 0, last_input = 0, last_client = 0, last_open_xdisplay = 0; |
| 161 | time_t last_local_input = 0; |
| 162 | time_t last_keyboard_input = 0, last_pointer_input = 0; |
| 163 | time_t last_fb_bytes_sent = 0; |
| 164 | double last_keyboard_time = 0.0; |
| 165 | double last_pointer_time = 0.0; |
| 166 | double last_pointer_click_time = 0.0; |
| 167 | double last_pointer_motion_time = 0.0; |
| 168 | double last_key_to_button_remap_time = 0.0; |
| 169 | double last_copyrect = 0.0; |
| 170 | double last_copyrect_fix = 0.0; |
| 171 | double last_wireframe = 0.0; |
| 172 | double servertime_diff = 0.0; |
| 173 | double x11vnc_start = 0.0; |
| 174 | double x11vnc_current = 0.0; |
| 175 | double g_now = 0.0; |
| 176 | |
| 177 | double last_get_wm_frame_time = 0.0; |
| 178 | Window last_get_wm_frame = None; |
| 179 | double last_bs_restore = 0.0; |
| 180 | double last_su_restore = 0.0; |
| 181 | double last_bs_save = 0.0; |
| 182 | double last_su_save = 0.0; |
| 183 | |
| 184 | int hack_val = 0; |
| 185 | |
| 186 | /* last client to move pointer */ |
| 187 | rfbClientPtr last_pointer_client = NULL; |
| 188 | rfbClientPtr latest_client = NULL; |
| 189 | double last_client_gone = 0.0; |
| 190 | double last_new_client = 0.0; |
| 191 | |
| 192 | int waited_for_client = 0; |
| 193 | int findcreatedisplay = 0; |
| 194 | char *terminal_services_daemon = NULL; |
| 195 | |
| 196 | int client_count = 0; |
| 197 | int clients_served = 0; |
| 198 | int client_normal_count = 0; |
| 199 | |
| 200 | /* more transient kludge variables: */ |
| 201 | int cursor_x = 0, cursor_y = 0; /* x and y from the viewer(s) */ |
| 202 | int button_change_x = 0, button_change_y = 0; |
| 203 | int got_user_input = 0; |
| 204 | int got_pointer_input = 0; |
| 205 | int got_local_pointer_input = 0; |
| 206 | int got_pointer_calls = 0; |
| 207 | int got_keyboard_input = 0; |
| 208 | int got_keyboard_calls = 0; |
| 209 | int urgent_update = 0; |
| 210 | int last_keyboard_keycode = 0; |
| 211 | rfbBool last_rfb_down = FALSE; |
| 212 | rfbBool last_rfb_key_accepted = FALSE; |
| 213 | rfbKeySym last_rfb_keysym = 0; |
| 214 | double last_rfb_keytime = 0.0; |
| 215 | double last_rfb_key_injected = 0.0; |
| 216 | double last_rfb_ptr_injected = 0.0; |
| 217 | int fb_copy_in_progress = 0; |
| 218 | int drag_in_progress = 0; |
| 219 | int shut_down = 0; |
| 220 | int do_copy_screen = 0; |
| 221 | time_t damage_time = 0; |
| 222 | int damage_delay = 0; |
| 223 | |
| 224 | int program_pid = 0; |
| 225 | char *program_name = NULL; |
| 226 | char *program_cmdline = NULL; |
| 227 | |
| 228 | struct utsname UT; |
| 229 | |
| 230 | |