diff options
Diffstat (limited to 'x11vnc/screen.c')
-rw-r--r-- | x11vnc/screen.c | 413 |
1 files changed, 351 insertions, 62 deletions
diff --git a/x11vnc/screen.c b/x11vnc/screen.c index e85f2f1..5c2d7ee 100644 --- a/x11vnc/screen.c +++ b/x11vnc/screen.c @@ -19,7 +19,12 @@ #include "unixpw.h" #include "sslcmds.h" #include "sslhelper.h" +#include "v4l.h" +#include "linuxfb.h" +void set_greyscale_colormap(void); +void set_hi240_colormap(void); +void unset_colormap(void); void set_colormap(int reset); void set_nofb_params(int restore); void set_raw_fb_params(int restore); @@ -41,12 +46,14 @@ static void nofb_hook(rfbClientPtr cl); static void remove_fake_fb(void); static void install_fake_fb(int w, int h, int bpp); static void initialize_snap_fb(void); -static XImage *initialize_raw_fb(void); +XImage *initialize_raw_fb(int); static void initialize_clipshift(void); static int wait_until_mapped(Window win); static void announce(int lport, int ssl, char *iface); static void setup_scaling(int *width_in, int *height_in); +int rawfb_reset = -1; +int rawfb_dev_video = 0; /* * X11 and rfb display/screen related routines @@ -57,22 +64,96 @@ static void setup_scaling(int *width_in, int *height_in); * the clients and dynamically if -flashcmap is specified. */ #define NCOLOR 256 + +void set_greyscale_colormap(void) { + int i; + if (! screen) { + return; + } + if (screen->colourMap.data.shorts) { + free(screen->colourMap.data.shorts); + screen->colourMap.data.shorts = NULL; + } + +if (0) fprintf(stderr, "set_greyscale_colormap: %s\n", raw_fb_pixfmt); + screen->colourMap.count = NCOLOR; + screen->serverFormat.trueColour = FALSE; + screen->colourMap.is16 = TRUE; + screen->colourMap.data.shorts = (unsigned short *) + malloc(3*sizeof(unsigned short) * NCOLOR); + + for(i = 0; i < NCOLOR; i++) { + unsigned short lvl = i * 256; + + screen->colourMap.data.shorts[i*3+0] = lvl; + screen->colourMap.data.shorts[i*3+1] = lvl; + screen->colourMap.data.shorts[i*3+2] = lvl; + } + + rfbSetClientColourMaps(screen, 0, NCOLOR); +} + +/* this is specific to bttv rf tuner card */ +void set_hi240_colormap(void) { + int i; + if (! screen) { + return; + } +if (0) fprintf(stderr, "set_hi240_colormap: %s\n", raw_fb_pixfmt); + if (screen->colourMap.data.shorts) { + free(screen->colourMap.data.shorts); + screen->colourMap.data.shorts = NULL; + } + + screen->colourMap.count = 256; + screen->serverFormat.trueColour = FALSE; + screen->colourMap.is16 = TRUE; + screen->colourMap.data.shorts = (unsigned short *) + calloc(3*sizeof(unsigned short) * 256, 1); + + for(i = 0; i < 225; i++) { + int r, g, b; + + r = ( (i/5) % 5 ) * 255.0 / 4 + 0.5; + g = ( (i/25) ) * 255.0 / 8 + 0.5; + b = ( i % 5 ) * 255.0 / 4 + 0.5; + + screen->colourMap.data.shorts[(i+16)*3+0] = (unsigned short) (r * 256); + screen->colourMap.data.shorts[(i+16)*3+1] = (unsigned short) (g * 256); + screen->colourMap.data.shorts[(i+16)*3+2] = (unsigned short) (b * 256); + } + + rfbSetClientColourMaps(screen, 0, 256); +} +void unset_colormap(void) { + if (! screen) { + return; + } + if (screen->colourMap.data.shorts) { + free(screen->colourMap.data.shorts); + screen->colourMap.data.shorts = NULL; + } + screen->serverFormat.trueColour = TRUE; +if (0) fprintf(stderr, "unset_colormap: %s\n", raw_fb_pixfmt); +} + void set_colormap(int reset) { - static int first = 1; + static int init = 1; static XColor color[NCOLOR], prev[NCOLOR]; Colormap cmap; Visual *vis; int i, ncells, diffs = 0; if (reset) { - first = 1; + init = 1; if (screen->colourMap.data.shorts) { free(screen->colourMap.data.shorts); screen->colourMap.data.shorts = NULL; } } +if (0) fprintf(stderr, "unset_colormap: %d\n", reset); - if (first) { + if (init) { screen->colourMap.count = NCOLOR; screen->serverFormat.trueColour = FALSE; screen->colourMap.is16 = TRUE; @@ -86,6 +167,8 @@ void set_colormap(int reset) { prev[i].blue = color[i].blue; } + RAWFB_RET_VOID + X_LOCK; cmap = DefaultColormap(dpy, scr); @@ -103,7 +186,7 @@ void set_colormap(int reset) { } if (ncells != NCOLOR) { - if (first && ! quiet) { + if (init && ! quiet) { rfbLog("set_colormap: number of cells is %d " "instead of %d.\n", ncells, NCOLOR); } @@ -112,7 +195,7 @@ void set_colormap(int reset) { } } - if (flash_cmap && ! first) { + if (flash_cmap && ! init) { XWindowAttributes attr; Window c; int tries = 0; @@ -178,7 +261,7 @@ void set_colormap(int reset) { } } - if (diffs && ! first) { + if (diffs && ! init) { if (! all_clients_initialized()) { rfbLog("set_colormap: warning: sending cmap " "with uninitialized clients.\n"); @@ -190,7 +273,7 @@ void set_colormap(int reset) { } } - first = 0; + init = 0; } static void debug_colormap(XImage *fb) { @@ -248,10 +331,13 @@ static void debug_colormap(XImage *fb) { * visual_id and possibly visual_depth are set. */ static void set_visual(char *str) { - int vis, vdepth, defdepth = DefaultDepth(dpy, scr); + int vis, vdepth, defdepth; XVisualInfo vinfo; char *p, *vstring = strdup(str); + RAWFB_RET_VOID + + defdepth = DefaultDepth(dpy, scr); visual_id = (VisualID) 0; visual_depth = 0; @@ -410,7 +496,7 @@ static char *raw_fb_orig_dpy = NULL; void set_raw_fb_params(int restore) { static int first = 1; static int vo0, us0, sm0, ws0, wp0, wc0, wb0, na0, tn0; - static int xr0, sb0; + static int xr0, sb0, re0; static char *mc0; /* @@ -432,6 +518,7 @@ void set_raw_fb_params(int restore) { sm0 = using_shm; tn0 = take_naps; xr0 = xrandr; + re0 = noxrecord; mc0 = multiple_cursors_mode; first = 0; @@ -450,6 +537,7 @@ void set_raw_fb_params(int restore) { using_shm = sm0; take_naps = tn0; xrandr = xr0; + noxrecord = re0; multiple_cursors_mode = mc0; if (! dpy && raw_fb_orig_dpy) { @@ -484,56 +572,60 @@ void set_raw_fb_params(int restore) { } else { /* Normal case: */ if (! view_only) { - if (! quiet) rfbLog("rawfb: setting view_only\n"); + if (! quiet) rfbLog(" rawfb: setting view_only\n"); view_only = 1; } if (watch_selection) { - if (! quiet) rfbLog("rawfb: turning off " + if (! quiet) rfbLog(" rawfb: turning off " "watch_selection\n"); watch_selection = 0; } if (watch_primary) { - if (! quiet) rfbLog("rawfb: turning off " + if (! quiet) rfbLog(" rawfb: turning off " "watch_primary\n"); watch_primary = 0; } if (watch_clipboard) { - if (! quiet) rfbLog("rawfb: turning off " + if (! quiet) rfbLog(" rawfb: turning off " "watch_clipboard\n"); watch_clipboard = 0; } if (watch_bell) { - if (! quiet) rfbLog("rawfb: turning off watch_bell\n"); + if (! quiet) rfbLog(" rawfb: turning off watch_bell\n"); watch_bell = 0; } if (no_autorepeat) { - if (! quiet) rfbLog("rawfb: turning off " + if (! quiet) rfbLog(" rawfb: turning off " "no_autorepeat\n"); no_autorepeat = 0; } if (use_solid_bg) { - if (! quiet) rfbLog("rawfb: turning off " + if (! quiet) rfbLog(" rawfb: turning off " "use_solid_bg\n"); use_solid_bg = 0; } multiple_cursors_mode = strdup("arrow"); } - if (use_snapfb) { - if (! quiet) rfbLog("rawfb: turning off use_snapfb\n"); + if (0 && use_snapfb) { + if (! quiet) rfbLog(" rawfb: turning off use_snapfb\n"); use_snapfb = 0; } if (using_shm) { - if (! quiet) rfbLog("rawfb: turning off using_shm\n"); + if (! quiet) rfbLog(" rawfb: turning off using_shm\n"); using_shm = 0; } if (take_naps) { - if (! quiet) rfbLog("rawfb: turning off take_naps\n"); + if (! quiet) rfbLog(" rawfb: turning off take_naps\n"); take_naps = 0; } if (xrandr) { - if (! quiet) rfbLog("rawfb: turning off xrandr\n"); + if (! quiet) rfbLog(" rawfb: turning off xrandr\n"); xrandr = 0; } + if (! noxrecord) { + if (! quiet) rfbLog(" rawfb: turning off xrecord\n"); + noxrecord = 1; + } } /* @@ -545,8 +637,10 @@ void set_raw_fb_params(int restore) { */ static void nofb_hook(rfbClientPtr cl) { XImage *fb; + rfbLog("framebuffer requested in -nofb mode by client %s\n", cl->host); /* ignore xrandr */ + RAWFB_RET_VOID fb = XGetImage_wr(dpy, window, 0, 0, dpy_x, dpy_y, AllPlanes, ZPixmap); main_fb = fb->data; rfb_fb = main_fb; @@ -669,6 +763,7 @@ void install_padded_fb(char *geom) { } static void initialize_snap_fb(void) { + RAWFB_RET_VOID if (snap_fb) { free(snap_fb); } @@ -677,12 +772,63 @@ static void initialize_snap_fb(void) { snap_fb = snap->data; } -static XImage *initialize_raw_fb(void) { +#define RAWFB_MMAP 1 +#define RAWFB_FILE 2 +#define RAWFB_SHM 3 + +XImage *initialize_raw_fb(int reset) { char *str, *q; int w, h, b, shmid = 0; - unsigned long rm = 0, gm = 0, bm = 0; + unsigned long rm = 0, gm = 0, bm = 0, tm; static XImage ximage_struct; /* n.b.: not (XImage *) */ - int closedpy = 1, i, m; + static XImage ximage_struct_snap; + int closedpy = 1, i, m, db = 0; + + static char *last_file = NULL; + static int last_mode = 0; + + if (reset && last_mode) { + int fd; + if (last_mode != RAWFB_MMAP && last_mode != RAWFB_FILE) { + return NULL; + } + if (last_mode == RAWFB_MMAP) { + munmap(raw_fb_addr, raw_fb_mmap); + } + if (raw_fb_fd >= 0) { + close(raw_fb_fd); + } + raw_fb_fd = -1; +if (db) fprintf(stderr, "initialize_raw_fb reset\n"); + + fd = -1; + if (rawfb_dev_video) { + fd = open(last_file, O_RDWR); + } + if (fd < 0) { + fd = open(last_file, O_RDONLY); + } + if (fd < 0) { + rfbLogEnable(1); + rfbLog("failed to rawfb file: %s\n", last_file); + rfbLogPerror("open"); + clean_up_exit(1); + } + raw_fb_fd = fd; + if (last_mode == RAWFB_MMAP) { + raw_fb_addr = mmap(0, raw_fb_mmap, PROT_READ, + MAP_SHARED, fd, 0); + + if (raw_fb_addr == MAP_FAILED || raw_fb_addr == NULL) { + rfbLogEnable(1); + rfbLog("failed to mmap file: %s\n", last_file); + rfbLog(" raw_fb_addr: %p\n", raw_fb_addr); + rfbLogPerror("mmap"); + clean_up_exit(1); + } + } + return NULL; + } if (raw_fb_addr || raw_fb_seek) { if (raw_fb_shm) { @@ -693,13 +839,17 @@ static XImage *initialize_raw_fb(void) { if (raw_fb_fd >= 0) { close(raw_fb_fd); } + raw_fb_fd = -1; #endif } else if (raw_fb_seek) { if (raw_fb_fd >= 0) { close(raw_fb_fd); } + raw_fb_fd = -1; } raw_fb_addr = NULL; + raw_fb_mmap = 0; + raw_fb_seek = 0; } if (! raw_fb_str) { return NULL; @@ -750,22 +900,48 @@ static XImage *initialize_raw_fb(void) { } else { str = strdup(raw_fb_str); } - - /* - * uppercase means do not close the display (e.g. for remote control) - */ - if (strstr(str, "SHM:") == str) { - closedpy = 0; - str[0] = 's'; str[1] = 'h'; str[2] = 'm'; - } else if (strstr(str, "MAP:") == str) { - closedpy = 0; - str[0] = 'm'; str[1] = 'a'; str[2] = 'p'; - } else if (strstr(str, "MMAP:") == str) { - closedpy = 0; - str[0] = 'm'; str[1] = 'm'; str[2] = 'a'; str[3] = 'p'; - } else if (strstr(str, "FILE:") == str) { - str[0] = 'f'; str[1] = 'i'; str[2] = 'l'; str[3] = 'e'; + if (str[0] == '+') { + char *t = strdup(str+1); + free(str); + str = t; closedpy = 0; + if (! window) { + window = rootwin; + } + } + + raw_fb_shm = 0; + raw_fb_mmap = 0; + raw_fb_seek = 0; + raw_fb_fd = -1; + raw_fb_addr = NULL; + raw_fb_offset = 0; + + last_mode = 0; + if (last_file) { + free(last_file); + last_file = NULL; + } + + if (strstr(str, "video") == str || strstr(str, "/dev/video") == str) { + char *str2 = v4l_guess(str, &raw_fb_fd); + if (str2 == NULL) { + rfbLog("v4l_guess failed for: %s\n", str); + clean_up_exit(1); + } + str = str2; + rfbLog("v4l_guess returned: %s\n", str); + rawfb_dev_video = 1; + } else if (strstr(str, "dev/video")) { + rawfb_dev_video = 1; + } else if (strstr(str, "cons") == str || strstr(str, "/dev/fb") == str) { + char *str2 = console_guess(str, &raw_fb_fd); + if (str2 == NULL) { + rfbLog("console_guess failed for: %s\n", str); + clean_up_exit(1); + } + str = str2; + rfbLog("console_guess returned: %s\n", str); } if (closedpy && !view_only && got_noviewonly) { @@ -799,7 +975,6 @@ static XImage *initialize_raw_fb(void) { * -rawfb file:/path/to/file@640x480x32:ff/ff00/ff0000 */ - raw_fb_offset = 0; /* +O offset */ if ((q = strrchr(str, '+')) != NULL) { @@ -836,6 +1011,34 @@ static XImage *initialize_raw_fb(void) { } *q = '\0'; + dpy_x = wdpy_x = w; + dpy_y = wdpy_y = h; + off_x = 0; + off_y = 0; + + if (rawfb_dev_video) { + if (b == 24) { + rfbLog("enabling -24to32 for 24bpp video\n"); + xform24to32 = 1; + } else { + if (xform24to32) { + rfbLog("disabling -24to32 for 24bpp video\n"); + } + xform24to32 = 0; + } + } + + if (xform24to32) { + if (b != 24) { + rfbLog("warning: -24to32 mode and bpp=%d\n", b); + } + b = 32; + } + if (strstr(str, "snap:") == str) { + use_snapfb = 1; + str[0] = 'f'; str[1] = 'i'; str[2] = 'l'; str[3] = 'e'; + } + if (strstr(str, "shm:") != str && strstr(str, "mmap:") != str && strstr(str, "map:") != str && strstr(str, "file:") != str) { /* hmmm, not following directions, see if map: applies */ @@ -854,17 +1057,6 @@ static XImage *initialize_raw_fb(void) { } } - dpy_x = wdpy_x = w; - dpy_y = wdpy_y = h; - off_x = 0; - off_y = 0; - - raw_fb_shm = 0; - raw_fb_mmap = 0; - raw_fb_seek = 0; - raw_fb_fd = -1; - raw_fb_addr = NULL; - if (sscanf(str, "shm:%d", &shmid) == 1) { /* shm:N */ #if LIBVNCSERVER_HAVE_XSHM @@ -878,6 +1070,7 @@ static XImage *initialize_raw_fb(void) { raw_fb_shm = 1; rfbLog("rawfb: shm: %d W: %d H: %d B: %d addr: %p\n", shmid, w, h, b, raw_fb_addr); + last_mode = RAWFB_SHM; #else rfbLogEnable(1); rfbLog("x11vnc was compiled without shm support.\n"); @@ -896,7 +1089,15 @@ static XImage *initialize_raw_fb(void) { q = strchr(str, ':'); q++; - fd = open(q, O_RDONLY); + last_file = strdup(q); + + fd = raw_fb_fd; + if (fd < 0 && rawfb_dev_video) { + fd = open(q, O_RDWR); + } + if (fd < 0) { + fd = open(q, O_RDONLY); + } if (fd < 0) { rfbLogEnable(1); rfbLog("failed to open file: %s, %s\n", q, str); @@ -905,7 +1106,11 @@ static XImage *initialize_raw_fb(void) { } raw_fb_fd = fd; - size = w*h*b/8 + raw_fb_offset; + if (xform24to32) { + size = w*h*24/8 + raw_fb_offset; + } else { + size = w*h*b/8 + raw_fb_offset; + } if (fstat(fd, &sbuf) == 0) { if (S_ISREG(sbuf.st_mode)) { if (0) size = sbuf.st_size; @@ -931,13 +1136,16 @@ static XImage *initialize_raw_fb(void) { rfbLog("rawfb: mmap file: %s\n", q); rfbLog(" w: %d h: %d b: %d addr: %p sz: %d\n", w, h, b, raw_fb_addr, size); + last_mode = RAWFB_MMAP; #else rfbLog("mmap(2) not supported on system, using" " slower lseek(2)\n"); raw_fb_seek = size; + last_mode = RAWFB_FILE; #endif } else { raw_fb_seek = size; + last_mode = RAWFB_FILE; rfbLog("rawfb: seek file: %s\n", q); rfbLog(" W: %d H: %d B: %d sz: %d\n", w, h, b, size); @@ -962,6 +1170,24 @@ static XImage *initialize_raw_fb(void) { raw_fb_image->bits_per_pixel = b; raw_fb_image->bytes_per_line = dpy_x*b/8; + if (use_snapfb && (raw_fb_seek || raw_fb_mmap)) { + int b_use = b; + if (snap_fb) { + free(snap_fb); + } + if (b_use == 32 && xform24to32) { + b_use = 24; + } + snap_fb = (char *) malloc(dpy_x * dpy_y * b_use/8); + snap = &ximage_struct_snap; + snap->data = snap_fb; + snap->format = ZPixmap; + snap->width = dpy_x; + snap->height = dpy_y; + snap->bits_per_pixel = b_use; + snap->bytes_per_line = dpy_x*b_use/8; + } + if (rm == 0 && gm == 0 && bm == 0) { /* guess masks... */ if (b == 24 || b == 32) { @@ -978,6 +1204,26 @@ static XImage *initialize_raw_fb(void) { bm = 0xc0; } } + /* we can fake -flipbyteorder to some degree... */ + if (flip_byte_order) { + if (b == 24 || b == 32) { + tm = rm; + rm = bm; + bm = tm; + } else if (b == 16) { + unsigned short s1, s2; + s1 = (unsigned short) rm; + s2 = ((0xff & s1) << 8) | ((0xff00 & s1) >> 8); + rm = (unsigned long) s2; + s1 = (unsigned short) gm; + s2 = ((0xff & s1) << 8) | ((0xff00 & s1) >> 8); + gm = (unsigned long) s2; + s1 = (unsigned short) bm; + s2 = ((0xff & s1) << 8) | ((0xff00 & s1) >> 8); + bm = (unsigned long) s2; + } + } + raw_fb_image->red_mask = rm; raw_fb_image->green_mask = gm; @@ -1003,15 +1249,30 @@ static XImage *initialize_raw_fb(void) { depth = raw_fb_image->depth; + if (raw_fb_image->depth == 15) { + /* unresolved bug with RGB555... */ + depth++; + } + if (clipshift) { memset(raw_fb, 0xff, dpy_x * dpy_y * b/8); - } else if (raw_fb_addr) { + } else if (raw_fb_addr && ! xform24to32) { memcpy(raw_fb, raw_fb_addr + raw_fb_offset, dpy_x*dpy_y*b/8); } else { memset(raw_fb, 0xff, dpy_x * dpy_y * b/8); } - rfbLog("rawfb: raw_fb %p\n", raw_fb); + rfbLog("\n"); + rfbLog("rawfb: raw_fb %p\n", raw_fb); + rfbLog(" format %d\n", raw_fb_image->format); + rfbLog(" width %d\n", raw_fb_image->width); + rfbLog(" height %d\n", raw_fb_image->height); + rfbLog(" bpp %d\n", raw_fb_image->bits_per_pixel); + rfbLog(" depth %d\n", raw_fb_image->depth); + rfbLog(" bpl %d\n", raw_fb_image->bytes_per_line); + if (use_snapfb && snap_fb) { + rfbLog(" snap_fb %p\n", snap_fb); + } free(str); @@ -1073,7 +1334,7 @@ static int wait_until_mapped(Window win) { usleep(ms * 1000); continue; } - if (! XGetWindowAttributes(dpy, win, &attr)) { + if (dpy && ! XGetWindowAttributes(dpy, win, &attr)) { return 0; } if (attr.map_state == IsViewable) { @@ -1095,7 +1356,7 @@ XImage *initialize_xdisplay_fb(void) { int subwin_bs; if (raw_fb_str) { - return initialize_raw_fb(); + return initialize_raw_fb(0); } X_LOCK; @@ -1137,12 +1398,24 @@ XImage *initialize_xdisplay_fb(void) { vis_str = strdup(str); } + if (xform24to32) { + if (DefaultDepth(dpy, scr) == 24) { + vis_str = strdup("TrueColor:32"); + rfbLog("initialize_xdisplay_fb: vis_str set to: %s ", + vis_str); + visual_id = (VisualID) 0; + visual_depth = 0; + set_visual_str_to_something = 1; + } + } + if (vis_str != NULL) { set_visual(vis_str); if (vis_str != visual_str) { free(vis_str); } } +if (0) fprintf(stderr, "vis_str %s\n", vis_str ? vis_str : "notset"); /* set up parameters for subwin or non-subwin cases: */ @@ -1184,6 +1457,8 @@ XImage *initialize_xdisplay_fb(void) { /* initialize depth to reasonable value, visual_id may override */ depth = DefaultDepth(dpy, scr); +if (0) fprintf(stderr, "DefaultDepth: %d visial_id: %d\n", depth, (int) visual_id); + if (visual_id) { int n; XVisualInfo vinfo_tmpl, *vinfo; @@ -1272,7 +1547,7 @@ XImage *initialize_xdisplay_fb(void) { } XMapRaised(dpy, window); XRaiseWindow(dpy, window); - XFlush(dpy); + XFlush_wr(dpy); } try++; @@ -1533,6 +1808,9 @@ void initialize_screen(int *argc, char **argv, XImage *fb) { fb_Bpl = (int) fb->bytes_per_line; fb_depth = (int) fb->depth; + rfbLog("initialize_screen: fb_depth/fb_bpp/fb_Bpl %d/%d/%d\n", fb_depth, + fb_depth, fb_Bpl); + main_bytes_per_line = fb->bytes_per_line; if (cmap8to24) { @@ -1675,7 +1953,7 @@ void initialize_screen(int *argc, char **argv, XImage *fb) { have_masks = 2; /* need to fetch TrueColor visual */ X_LOCK; - if (XMatchVisualInfo(dpy, scr, 24, TrueColor, &vinfo)) { + if (dpy && XMatchVisualInfo(dpy, scr, 24, TrueColor, &vinfo)) { main_red_mask = vinfo.red_mask; main_green_mask = vinfo.green_mask; main_blue_mask = vinfo.blue_mask; @@ -1691,6 +1969,19 @@ void initialize_screen(int *argc, char **argv, XImage *fb) { X_UNLOCK; } + if (raw_fb_str && raw_fb_pixfmt) { + char *fmt = strdup(raw_fb_pixfmt); + uppercase(fmt); + if (strstr(fmt, "GREY")) { + set_greyscale_colormap(); + } else if (strstr(fmt, "HI240")) { + set_hi240_colormap(); + } else { + unset_colormap(); + } + free(fmt); + } + if (! have_masks && screen->serverFormat.bitsPerPixel == 8 && dpy && CellsOfScreen(ScreenOfDisplay(dpy, scr))) { /* indexed color */ @@ -1966,8 +2257,6 @@ void initialize_screen(int *argc, char **argv, XImage *fb) { screen->deferUpdateTime = defer_update; } - rfbSetServerVersionIdentity(screen, "x11vnc: %s", lastmod); - rfbInitServer(screen); if (use_openssl) { |