Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
L
libvncserver
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
rasky
libvncserver
Commits
dfe5981c
Commit
dfe5981c
authored
Mar 29, 2005
by
runge
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
x11vnc: fix event leaks, build-time customizations, -nolookup
parent
1ce94186
Changes
7
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
1556 additions
and
1000 deletions
+1556
-1000
ChangeLog
ChangeLog
+3
-0
ChangeLog
x11vnc/ChangeLog
+8
-0
README
x11vnc/README
+935
-804
tkx11vnc
x11vnc/tkx11vnc
+1
-0
tkx11vnc.h
x11vnc/tkx11vnc.h
+1
-0
x11vnc.1
x11vnc/x11vnc.1
+49
-29
x11vnc.c
x11vnc/x11vnc.c
+559
-167
No files found.
ChangeLog
View file @
dfe5981c
2005-03-29 Karl Runge <runge@karlrunge.com>
* x11vnc: fix event leaks, build-time customizations, -nolookup
2005-03-19 Karl Runge <runge@karlrunge.com>
2005-03-19 Karl Runge <runge@karlrunge.com>
* x11vnc: scale cursors by default, -scale_cursor to tune,
* x11vnc: scale cursors by default, -scale_cursor to tune,
-arrow n, -norepeat n, speed up integer magnification.
-arrow n, -norepeat n, speed up integer magnification.
...
...
x11vnc/ChangeLog
View file @
dfe5981c
2005-03-29 Karl Runge <runge@karlrunge.com>
* build-time customizations X11VNC_SHARED, X11VNC_FOREVER,
REMOTE_CONTROL, SMALL_FOOTPRINT for CPPFLAGS
* fix event leaks for xkb BellNotify and ClientMessage and others,
esp. under -nofb. make nofb work with remote control.
* -nolookup for bad DNS setups.
* more playing with pointer_mode: check_user_input3()
2005-03-19 Karl Runge <runge@karlrunge.com>
2005-03-19 Karl Runge <runge@karlrunge.com>
* scale cursors along with display. Use -scale_cursor to change
* scale cursors along with display. Use -scale_cursor to change
or disable cursor scaling.
or disable cursor scaling.
...
...
x11vnc/README
View file @
dfe5981c
This source diff could not be displayed because it is too large. You can
view the blob
instead.
x11vnc/tkx11vnc
View file @
dfe5981c
...
@@ -167,6 +167,7 @@ Misc
...
@@ -167,6 +167,7 @@ Misc
=D nobell
=D nobell
=D nosel
=D nosel
noprimary
noprimary
nolookup
--
--
bg
bg
=-C:ignore,exit sigpipe:
=-C:ignore,exit sigpipe:
...
...
x11vnc/tkx11vnc.h
View file @
dfe5981c
...
@@ -173,6 +173,7 @@
...
@@ -173,6 +173,7 @@
" =D nobell
\n
"
" =D nobell
\n
"
" =D nosel
\n
"
" =D nosel
\n
"
" noprimary
\n
"
" noprimary
\n
"
" nolookup
\n
"
" --
\n
"
" --
\n
"
" bg
\n
"
" bg
\n
"
" =-C:ignore,exit sigpipe:
\n
"
" =-C:ignore,exit sigpipe:
\n
"
...
...
x11vnc/x11vnc.1
View file @
dfe5981c
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
.TH X11VNC "1" "March 2005" "x11vnc " "User Commands"
.TH X11VNC "1" "March 2005" "x11vnc " "User Commands"
.SH NAME
.SH NAME
x11vnc - allow VNC connections to real X11 displays
x11vnc - allow VNC connections to real X11 displays
version: 0.7.2pre, lastmod: 2005-03-
1
9
version: 0.7.2pre, lastmod: 2005-03-
2
9
.SH SYNOPSIS
.SH SYNOPSIS
.B x11vnc
.B x11vnc
[OPTION]...
[OPTION]...
...
@@ -168,7 +168,7 @@ image may not be sharp and response may be slower.
...
@@ -168,7 +168,7 @@ image may not be sharp and response may be slower.
If \fIfraction\fR contains a decimal point "." it
If \fIfraction\fR contains a decimal point "." it
is taken as a floating point number, alternatively
is taken as a floating point number, alternatively
the notation "m/n" may be used to denote fractions
the notation "m/n" may be used to denote fractions
exactly, e.g. \fB-scale\fR 2/3
.
exactly, e.g. \fB-scale\fR 2/3
.IP
.IP
Scaling Options: can be added after \fIfraction\fR via
Scaling Options: can be added after \fIfraction\fR via
":", to supply multiple ":" options use commas.
":", to supply multiple ":" options use commas.
...
@@ -281,6 +281,13 @@ you may need to manually adjust the \fB-allow\fR list (and
...
@@ -281,6 +281,13 @@ you may need to manually adjust the \fB-allow\fR list (and
vice versa) to avoid situations where no connections
vice versa) to avoid situations where no connections
(or too many) are allowed.
(or too many) are allowed.
.PP
.PP
\fB-nolookup\fR
.IP
Do not use gethostbyname() or gethostbyaddr() to look up
host names or IP numbers. Use this if name resolution
is incorrectly set up and leads to long pauses as name
lookup times out, etc.
.PP
\fB-input\fR \fIstring\fR
\fB-input\fR \fIstring\fR
.IP
.IP
Fine tuning of allowed user input. If \fIstring\fR does
Fine tuning of allowed user input. If \fIstring\fR does
...
@@ -918,7 +925,7 @@ screen changes: everything will bog down when dragging
...
@@ -918,7 +925,7 @@ screen changes: everything will bog down when dragging
or scrolling. So a scheme has to be used to "eat"
or scrolling. So a scheme has to be used to "eat"
much of that pointer input before re-polling the screen
much of that pointer input before re-polling the screen
and sending out framebuffer updates. The mode number
and sending out framebuffer updates. The mode number
\fIn\fR can be 0 to
4
and selects one of the schemes
\fIn\fR can be 0 to
5
and selects one of the schemes
desribed below.
desribed below.
.IP
.IP
n=0: does the same as \fB-nodragging.\fR (all screen polling
n=0: does the same as \fB-nodragging.\fR (all screen polling
...
@@ -931,19 +938,24 @@ events before repolling the screen.
...
@@ -931,19 +938,24 @@ events before repolling the screen.
n=2 is an improved scheme: by watching the current rate
n=2 is an improved scheme: by watching the current rate
of input events it tries to detect if it should try to
of input events it tries to detect if it should try to
"eat" additional pointer events before continuing.
"eat" additional pointer events before continuing.
This mode was the default until Apr 2005.
.IP
.IP
n=3 is basically a dynamic \fB-nodragging\fR mode: it detects
n=3 is basically the same as n=2 except with slightly
tweaked parameters. We made this a new one so one
could use \fB-pm\fR 2 for the old behavior.
.IP
n=4 is basically a dynamic \fB-nodragging\fR mode: it detects
when the mouse motion has paused and then refreshes
when the mouse motion has paused and then refreshes
the display.
the display.
.IP
.IP
n=
4:
attempts to measures network rates and latency,
n=
5
attempts to measures network rates and latency,
the video card read rate, and how many tiles have been
the video card read rate, and how many tiles have been
changed on the screen. From this, it aggressively tries
changed on the screen. From this, it aggressively tries
to push screen "frames" when it decides it has enough
to push screen "frames" when it decides it has enough
resources to do so. NOT FINISHED.
resources to do so. NOT FINISHED.
.IP
.IP
The default n is
2. Note that modes 2, 3, 4 will skip
The default n is
3. Note that modes 2, 3, 4, 5 will
\fB-input_skip\fR keyboard events (but it will not count
skip
\fB-input_skip\fR keyboard events (but it will not count
pointer events). Also note that these modes are not
pointer events). Also note that these modes are not
available in \fB-threads\fR mode which has its own pointer
available in \fB-threads\fR mode which has its own pointer
event handling mechanism.
event handling mechanism.
...
@@ -973,13 +985,15 @@ milliseconds, respectively. If a value is left blank,
...
@@ -973,13 +985,15 @@ milliseconds, respectively. If a value is left blank,
e.g. "\fB-speeds\fR \fI,100,15\fR", then the internal scheme is
e.g. "\fB-speeds\fR \fI,100,15\fR", then the internal scheme is
used to estimate the empty value(s).
used to estimate the empty value(s).
.IP
.IP
Note: use this option is currently NOT FINISHED.
.IP
Typical PC video cards have read rates of 5-10 MB/sec.
Typical PC video cards have read rates of 5-10 MB/sec.
If the framebuffer is in main memory instead of video
If the framebuffer is in main memory instead of video
h/w (e.g. SunRay, shadowfb, Xvfb), the read rate may
h/w (e.g. SunRay, shadowfb, Xvfb), the read rate may
be much faster. "x11perf \fB-getimage500"\fR can be used
be much faster. "x11perf \fB-getimage500"\fR can be used
to get a lower bound (remember to factor in the bytes
to get a lower bound (remember to factor in the bytes
per pixel). It is up to you to estimate the network
per pixel). It is up to you to estimate the network
bandwith
to clients. For the latency the
bandwith
and latency to clients. For the latency the
.IR ping (1)
.IR ping (1)
command can be used.
command can be used.
.IP
.IP
...
@@ -1272,8 +1286,8 @@ disconnect:host disconnect any clients from "host"
...
@@ -1272,8 +1286,8 @@ disconnect:host disconnect any clients from "host"
same as "close:host". Use host
same as "close:host". Use host
"all" to close all current clients.
"all" to close all current clients.
If you know the client internal hex ID,
If you know the client internal hex ID,
e.g. 0x3 (returned by
\fB-query\fR clients and
e.g. 0x3 (returned by
"\fB-query\fR \fIclients\fR"
RFB_CLIENT_ID),
you can use that too.
and RFB_CLIENT_ID)
you can use that too.
.IP
.IP
allowonce:host For the next connection only, allow
allowonce:host For the next connection only, allow
connection from "host".
connection from "host".
...
@@ -1290,6 +1304,10 @@ nolocalhost disable \fB-localhost\fR mode
...
@@ -1290,6 +1304,10 @@ nolocalhost disable \fB-localhost\fR mode
.IP
.IP
listen:str set \fB-listen\fR to str, empty to disable.
listen:str set \fB-listen\fR to str, empty to disable.
.IP
.IP
nolookup enable \fB-nolookup\fR mode.
.IP
lookup disable \fB-nolookup\fR mode.
.IP
input:str set \fB-input\fR to "str", empty to disable.
input:str set \fB-input\fR to "str", empty to disable.
.IP
.IP
client_input:str set the K, M, B \fB-input\fR on a per-client
client_input:str set the K, M, B \fB-input\fR on a per-client
...
@@ -1581,9 +1599,9 @@ overlay nooverlay overlay_cursor overlay_yescursor
...
@@ -1581,9 +1599,9 @@ overlay nooverlay overlay_cursor overlay_yescursor
nooverlay_nocursor nooverlay_cursor nooverlay_yescursor
nooverlay_nocursor nooverlay_cursor nooverlay_yescursor
overlay_nocursor visual scale scale_cursor viewonly
overlay_nocursor visual scale scale_cursor viewonly
noviewonly shared noshared forever noforever once
noviewonly shared noshared forever noforever once
timeout deny lock nodeny unlock connect allowonce
timeout deny lock nodeny unlock connect allowonce
allow
allow localhost nolocalhost listen accept gone
localhost nolocalhost listen lookup nolookup accept
shm noshm flipbyteorder noflipbyteorder onetile
gone
shm noshm flipbyteorder noflipbyteorder onetile
noonetile solid_color solid nosolid blackout xinerama
noonetile solid_color solid nosolid blackout xinerama
noxinerama xrandr noxrandr xrandr_mode padgeom quiet
noxinerama xrandr noxrandr xrandr_mode padgeom quiet
q noquiet modtweak nomodtweak xkb noxkb skip_keycodes
q noquiet modtweak nomodtweak xkb noxkb skip_keycodes
...
@@ -1621,10 +1639,10 @@ cdpy_x cdpy_y coff_x coff_y rfbauth passwd
...
@@ -1621,10 +1639,10 @@ cdpy_x cdpy_y coff_x coff_y rfbauth passwd
By default \fB-remote\fR commands are run asynchronously, that
By default \fB-remote\fR commands are run asynchronously, that
is, the request is posted and the program immediately
is, the request is posted and the program immediately
exits. Use \fB-sync\fR to have the program wait for an
exits. Use \fB-sync\fR to have the program wait for an
acknowledgement from the x11vnc server that command
acknowledgement from the x11vnc server that command
was
was processed. On the other hand \fB-query\fR requests are
processed (somehow). On the other hand \fB-query\fR requests
a
lways processed synchronously because they have wait
a
re always processed synchronously because they have
for the result.
to wait
for the result.
.IP
.IP
Also note that if both \fB-remote\fR and \fB-query\fR requests are
Also note that if both \fB-remote\fR and \fB-query\fR requests are
supplied on the command line, the \fB-remote\fR is processed
supplied on the command line, the \fB-remote\fR is processed
...
@@ -1642,19 +1660,21 @@ taken place.
...
@@ -1642,19 +1660,21 @@ taken place.
Do not process any remote control commands or queries.
Do not process any remote control commands or queries.
.IP
.IP
A note about security wrt remote control commands.
A note about security wrt remote control commands.
If someone can connect to the X display and change the
If someone can connect to the X display and change
property VNC_CONNECT, then they can remotely control
the property VNC_CONNECT, then they can remotely
x11vnc. Normally access to the X display is protected.
control x11vnc. Normally access to the X display is
Note that if they can modify VNC_CONNECT, they could
protected. Note that if they can modify VNC_CONNECT
also run their own x11vnc and have complete control
on the X server, they have enough permissions to also
run their own x11vnc and thus have complete control
of the desktop. If the "\fB-connect\fR \fI/path/to/file\fR"
of the desktop. If the "\fB-connect\fR \fI/path/to/file\fR"
channel is being used, obviously anyone who can
channel is being used, obviously anyone who can write
write to /path/to/file can remotely control x11vnc.
to /path/to/file can remotely control x11vnc. So be
So be sure to protect the X display and that file's
sure to protect the X display and that file's write
write permissions.
permissions.
.IP
.IP
To disable the VNC_CONNECT property channel completely
If you are paranoid and do not think \fB-noremote\fR is
use \fB-novncconnect.\fR
enough, to disable the VNC_CONNECT property channel
completely use \fB-novncconnect.\fR
.PP
.PP
\fB-unsafe\fR
\fB-unsafe\fR
.IP
.IP
...
...
x11vnc/x11vnc.c
View file @
dfe5981c
...
@@ -37,11 +37,11 @@
...
@@ -37,11 +37,11 @@
*
*
* Another goal is to improve performance and interactive response.
* Another goal is to improve performance and interactive response.
* The algorithm of x0rfbserver was used as a base. Additional heuristics
* The algorithm of x0rfbserver was used as a base. Additional heuristics
* are also applied
(currently there are a bit too many of these...)
* are also applied
.
*
*
* Another goal is to add many features that enable and incourage creative
* Another goal is to add many features that enable and incourage creative
*
Ausage and application of the tool.
pologies for the large number
*
usage and application of the tool. A
pologies for the large number
*
A
of options!
* of options!
*
*
* To build:
* To build:
*
*
...
@@ -60,18 +60,18 @@
...
@@ -60,18 +60,18 @@
* The screen updates are good, but of course not perfect since the X
* The screen updates are good, but of course not perfect since the X
* display must be continuously polled and read for changes and this is
* display must be continuously polled and read for changes and this is
* slow for most hardware. This can be contrasted with receiving a change
* slow for most hardware. This can be contrasted with receiving a change
* callback from the X server, if that were generally possible... (U
pdate
:
* callback from the X server, if that were generally possible... (U
PDATE
:
* this
seems to be handled now with the X DAMAGE extension, but
* this
is handled now with the X DAMAGE extension, but unfortunately
*
unfortunately that doesn't seem to address the slow read from the
*
that doesn't seem to address the slow read from the video h/w). So,
*
video h/w. So, e.g., opaque moves and similar window activity can
*
e.g., opaque moves and similar window activity can be very painful;
*
be very painful;
one has to modify one's behavior a bit.
* one has to modify one's behavior a bit.
*
*
* General audio at the remote display is lost unless one separately
* General audio at the remote display is lost unless one separately
* sets up some audio side-channel such as esd.
* sets up some audio side-channel such as esd.
*
*
* It does not appear possible to query the X server for the current
* It does not appear possible to query the X server for the current
* cursor shape. We can use XTest to compare cursor to current window's
* cursor shape. We can use XTest to compare cursor to current window's
* cursor, but we cannot extract what the cursor is... (U
pdate
: we now
* cursor, but we cannot extract what the cursor is... (U
PDATE
: we now
* use XFIXES extension for this. Also on Solaris and IRIX Overlay
* use XFIXES extension for this. Also on Solaris and IRIX Overlay
* extensions exists that allow drawing the mouse into the framebuffer)
* extensions exists that allow drawing the mouse into the framebuffer)
*
*
...
@@ -82,7 +82,7 @@
...
@@ -82,7 +82,7 @@
* currently "-cursor some" is a first hack at this)
* currently "-cursor some" is a first hack at this)
*
*
* Under XFIXES mode for showing the cursor shape, the cursor may be
* Under XFIXES mode for showing the cursor shape, the cursor may be
* poorly approximated if it has transparency.
* poorly approximated if it has transparency
(alpha channel)
.
*
*
* Windows using visuals other than the default X visual may have
* Windows using visuals other than the default X visual may have
* their colors messed up. When using 8bpp indexed color, the colormap
* their colors messed up. When using 8bpp indexed color, the colormap
...
@@ -93,9 +93,9 @@
...
@@ -93,9 +93,9 @@
* On Sun and Sgi hardware we can to work around this with -overlay.
* On Sun and Sgi hardware we can to work around this with -overlay.
*
*
* Feature -id <windowid> can be picky: it can crash for things like
* Feature -id <windowid> can be picky: it can crash for things like
* the window not sufficiently mapped into server memory, etc (U
pdate
:
* the window not sufficiently mapped into server memory, etc (U
PDATE
:
* we now use the -xrandr mechanisms to trap errors
for this mode).
* we now use the -xrandr mechanisms to trap errors
more robustly for
* SaveUnders menus, popups, etc will not be seen.
*
this mode).
SaveUnders menus, popups, etc will not be seen.
*
*
* Under some situations the keysym unmapping is not correct, especially
* Under some situations the keysym unmapping is not correct, especially
* if the two keyboards correspond to different languages. The -modtweak
* if the two keyboards correspond to different languages. The -modtweak
...
@@ -128,11 +128,15 @@
...
@@ -128,11 +128,15 @@
/* -- x11vnc.h -- */
/* -- x11vnc.h -- */
/*
/*
***************************************************************************
* if you are inserting this file, x11vnc.c into an old CVS tree you
* if you are inserting this file, x11vnc.c into an old CVS tree you
* may need to set OLD_TREE to 1. See below for LibVNCServer 0.7 tips.
* may need to set OLD_TREE to 1. Or use -DOLD_TREE=1 in CPPFLAGS.
* See below for LibVNCServer 0.7 tips.
*/
*/
#ifndef OLD_TREE
#define OLD_TREE 0
#define OLD_TREE 0
#endif
#if OLD_TREE
#if OLD_TREE
/*
/*
...
@@ -173,6 +177,10 @@
...
@@ -173,6 +177,10 @@
*/
*/
#endif
/* OLD_TREE */
#endif
/* OLD_TREE */
/****************************************************************************/
/* Standard includes and libvncserver */
#include <unistd.h>
#include <unistd.h>
#include <signal.h>
#include <signal.h>
...
@@ -191,6 +199,7 @@
...
@@ -191,6 +199,7 @@
#include <rfb/rfb.h>
#include <rfb/rfb.h>
#include <rfb/rfbregion.h>
#include <rfb/rfbregion.h>
/****************************************************************************/
#if OLD_TREE
#if OLD_TREE
/*
/*
* This is another transient for building in older libvncserver trees,
* This is another transient for building in older libvncserver trees,
...
@@ -210,9 +219,9 @@
...
@@ -210,9 +219,9 @@
#define rfbHttpInitSockets httpInitSockets
#define rfbHttpInitSockets httpInitSockets
#define RFBUNDRAWCURSOR(s) if (s) {rfbUndrawCursor(s);}
#define RFBUNDRAWCURSOR(s) if (s) {rfbUndrawCursor(s);}
#else
#else
/* OLD_TREE */
#define RFBUNDRAWCURSOR(s)
#define RFBUNDRAWCURSOR(s)
#endif
#endif
/* !OLD_TREE */
/*
/*
* To get a clean build in a LibVNCServer 0.7 source tree no need for
* To get a clean build in a LibVNCServer 0.7 source tree no need for
* OLD_TREE, you just need to either download the forgotten tkx11vnc.h
* OLD_TREE, you just need to either download the forgotten tkx11vnc.h
...
@@ -230,7 +239,60 @@
...
@@ -230,7 +239,60 @@
* that may break some usage):
* that may break some usage):
*
*
#define listenInterface maxRectsPerUpdate
#define listenInterface maxRectsPerUpdate
*
*/
/****************************************************************************/
/* Build-time customization via CPPFLAGS. */
/*
* -DX11VNC_SHARED to have the vnc display shared by default.
*/
/*
* -DX11VNC_FOREVER to have -forever on by default.
*/
/*
* This can be used to disable the remote control mechanism.
* E.g. -DREMOTE_CONTROL=0 in CPPFLAGS.
*/
#ifndef REMOTE_CONTROL
#define REMOTE_CONTROL 1
#endif
/*
* 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 500K to about 270K.
*/
*/
#ifndef SMALL_FOOTPRINT
#define SMALL_FOOTPRINT 0
#endif
#if (SMALL_FOOTPRINT > 1)
#define LIBVNCSERVER_HAVE_XKEYBOARD 0
#define LIBVNCSERVER_HAVE_LIBXINERAMA 0
#define LIBVNCSERVER_HAVE_LIBXRANDR 0
#define LIBVNCSERVER_HAVE_LIBXFIXES 0
#define LIBVNCSERVER_HAVE_LIBXDAMAGE 0
#endif
#if (SMALL_FOOTPRINT > 2)
#define LIBVNCSERVER_HAVE_UTMPX_H 0
#define LIBVNCSERVER_HAVE_PWD_H 0
#define REMOTE_CONTROL 0
#endif
/* Extensions and related includes: */
#if LIBVNCSERVER_HAVE_XSHM
#if LIBVNCSERVER_HAVE_XSHM
# if defined(__hpux) && defined(__ia64)
/* something weird on hp/itanic */
# if defined(__hpux) && defined(__ia64)
/* something weird on hp/itanic */
...
@@ -311,7 +373,7 @@ int overlay_present = 0;
...
@@ -311,7 +373,7 @@ int overlay_present = 0;
*/
*/
#if LIBVNCSERVER_HAVE_LIBXRANDR
#if LIBVNCSERVER_HAVE_LIBXRANDR
#include <X11/extensions/Xrandr.h>
#include <X11/extensions/Xrandr.h>
static
int
xrandr_base_event_type
;
static
int
xrandr_base_event_type
=
0
;
#endif
#endif
int
xfixes_present
=
0
;
int
xfixes_present
=
0
;
...
@@ -326,15 +388,14 @@ int alt_arrow = 1;
...
@@ -326,15 +388,14 @@ int alt_arrow = 1;
#if LIBVNCSERVER_HAVE_LIBXFIXES
#if LIBVNCSERVER_HAVE_LIBXFIXES
#include <X11/extensions/Xfixes.h>
#include <X11/extensions/Xfixes.h>
static
int
xfixes_base_event_type
;
static
int
xfixes_base_event_type
=
0
;
#endif
#endif
int
xdamage_present
=
0
;
int
xdamage_present
=
0
;
int
using_xdamage
=
0
;
int
use_xdamage
=
1
;
/* just use the xdamage rects. for scanline hints */
int
use_xdamage_hints
=
1
;
/* just use the xdamage rects. for scanline hints */
#if LIBVNCSERVER_HAVE_LIBXDAMAGE
#if LIBVNCSERVER_HAVE_LIBXDAMAGE
#include <X11/extensions/Xdamage.h>
#include <X11/extensions/Xdamage.h>
static
int
xdamage_base_event_type
;
static
int
xdamage_base_event_type
=
0
;
Damage
xdamage
=
0
;
Damage
xdamage
=
0
;
#endif
#endif
int
xdamage_max_area
=
20000
;
/* pixels */
int
xdamage_max_area
=
20000
;
/* pixels */
...
@@ -344,7 +405,7 @@ int xdamage_tile_count;
...
@@ -344,7 +405,7 @@ int xdamage_tile_count;
int
hack_val
=
0
;
int
hack_val
=
0
;
/* date +'lastmod: %Y-%m-%d' */
/* date +'lastmod: %Y-%m-%d' */
char
lastmod
[]
=
"0.7.2pre lastmod: 2005-03-
1
9"
;
char
lastmod
[]
=
"0.7.2pre lastmod: 2005-03-
2
9"
;
/* X display info */
/* X display info */
...
@@ -457,6 +518,7 @@ unsigned char *tile_has_xdamage_diff, *tile_row_has_xdamage_diff;
...
@@ -457,6 +518,7 @@ unsigned char *tile_has_xdamage_diff, *tile_row_has_xdamage_diff;
/* times of recent events */
/* times of recent events */
time_t
last_event
,
last_input
,
last_client
=
0
;
time_t
last_event
,
last_input
,
last_client
=
0
;
time_t
last_sendevent
=
0
;
/* last client to move pointer */
/* last client to move pointer */
rfbClientPtr
last_pointer_client
=
NULL
;
rfbClientPtr
last_pointer_client
=
NULL
;
...
@@ -569,6 +631,7 @@ void mark_hint(hint_t);
...
@@ -569,6 +631,7 @@ void mark_hint(hint_t);
void
mark_rect_as_modified
(
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
force
);
void
mark_rect_as_modified
(
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
force
);
enum
rfbNewClientAction
new_client
(
rfbClientPtr
client
);
enum
rfbNewClientAction
new_client
(
rfbClientPtr
client
);
void
set_nofb_params
(
void
);
void
nofb_hook
(
rfbClientPtr
client
);
void
nofb_hook
(
rfbClientPtr
client
);
void
pointer
(
int
mask
,
int
x
,
int
y
,
rfbClientPtr
client
);
void
pointer
(
int
mask
,
int
x
,
int
y
,
rfbClientPtr
client
);
void
cursor_position
(
int
,
int
);
void
cursor_position
(
int
,
int
);
...
@@ -661,11 +724,21 @@ char *rc_rcfile = NULL; /* -rc */
...
@@ -661,11 +724,21 @@ char *rc_rcfile = NULL; /* -rc */
int
rc_norc
=
0
;
int
rc_norc
=
0
;
int
opts_bg
=
0
;
int
opts_bg
=
0
;
#ifndef X11VNC_SHARED
int
shared
=
0
;
/* share vnc display. */
int
shared
=
0
;
/* share vnc display. */
#else
int
shared
=
1
;
#endif
#ifndef X11VNC_FOREVER
int
connect_once
=
1
;
/* disconnect after first connection session. */
#else
int
connect_once
=
0
;
#endif
int
deny_all
=
0
;
/* global locking of new clients */
int
deny_all
=
0
;
/* global locking of new clients */
int
accept_remote_cmds
=
1
;
/* -noremote */
int
accept_remote_cmds
=
1
;
/* -noremote */
int
safe_remote_only
=
0
;
/* -safer, -unsafe */
int
safe_remote_only
=
0
;
/* -safer, -unsafe */
int
started_as_root
=
0
;
int
started_as_root
=
0
;
int
host_lookup
=
1
;
char
*
users_list
=
NULL
;
/* -users */
char
*
users_list
=
NULL
;
/* -users */
char
*
allow_list
=
NULL
;
/* for -allow and -localhost */
char
*
allow_list
=
NULL
;
/* for -allow and -localhost */
char
*
listen_str
=
NULL
;
char
*
listen_str
=
NULL
;
...
@@ -678,7 +751,6 @@ char *allowed_input_normal = NULL;
...
@@ -678,7 +751,6 @@ char *allowed_input_normal = NULL;
char
*
allowed_input_str
=
NULL
;
char
*
allowed_input_str
=
NULL
;
char
*
viewonly_passwd
=
NULL
;
/* view only passwd. */
char
*
viewonly_passwd
=
NULL
;
/* view only passwd. */
int
inetd
=
0
;
/* spawned from inetd(1) */
int
inetd
=
0
;
/* spawned from inetd(1) */
int
connect_once
=
1
;
/* disconnect after first connection session. */
int
first_conn_timeout
=
0
;
/* -timeout */
int
first_conn_timeout
=
0
;
/* -timeout */
int
flash_cmap
=
0
;
/* follow installed colormaps */
int
flash_cmap
=
0
;
/* follow installed colormaps */
int
force_indexed_color
=
0
;
/* whether to force indexed color for 8bpp */
int
force_indexed_color
=
0
;
/* whether to force indexed color for 8bpp */
...
@@ -721,7 +793,6 @@ int no_repeat_countdown = 2;
...
@@ -721,7 +793,6 @@ int no_repeat_countdown = 2;
int
watch_bell
=
1
;
/* watch for the bell using XKEYBOARD */
int
watch_bell
=
1
;
/* watch for the bell using XKEYBOARD */
int
sound_bell
=
1
;
/* actually send it */
int
sound_bell
=
1
;
/* actually send it */
int
xkbcompat
=
0
;
/* ignore XKEYBOARD extension */
int
xkbcompat
=
0
;
/* ignore XKEYBOARD extension */
int
use_xkb
=
0
;
/* try to open Xkb connection (for bell or other) */
int
use_xkb_modtweak
=
0
;
/* -xkb */
int
use_xkb_modtweak
=
0
;
/* -xkb */
char
*
skip_keycodes
=
NULL
;
char
*
skip_keycodes
=
NULL
;
int
add_keysyms
=
0
;
/* automatically add keysyms to X server */
int
add_keysyms
=
0
;
/* automatically add keysyms to X server */
...
@@ -729,9 +800,12 @@ int add_keysyms = 0; /* automatically add keysyms to X server */
...
@@ -729,9 +800,12 @@ int add_keysyms = 0; /* automatically add keysyms to X server */
char
*
remap_file
=
NULL
;
/* -remap */
char
*
remap_file
=
NULL
;
/* -remap */
char
*
pointer_remap
=
NULL
;
char
*
pointer_remap
=
NULL
;
/* use the various ways of updating pointer */
/* use the various ways of updating pointer */
#define POINTER_MODE_DEFAULT 2
#ifndef POINTER_MODE_DEFAULT
#define POINTER_MODE_DEFAULT 3
#endif
#define POINTER_MODE_NOFB 2
int
pointer_mode
=
POINTER_MODE_DEFAULT
;
int
pointer_mode
=
POINTER_MODE_DEFAULT
;
int
pointer_mode_max
=
4
;
int
pointer_mode_max
=
5
;
int
single_copytile
=
0
;
/* use the old way copy_tiles() */
int
single_copytile
=
0
;
/* use the old way copy_tiles() */
int
single_copytile_orig
=
0
;
int
single_copytile_orig
=
0
;
int
single_copytile_count
=
0
;
int
single_copytile_count
=
0
;
...
@@ -801,6 +875,8 @@ int quiet = 0;
...
@@ -801,6 +875,8 @@ int quiet = 0;
int
got_rfbport
=
0
;
int
got_rfbport
=
0
;
int
got_alwaysshared
=
0
;
int
got_alwaysshared
=
0
;
int
got_nevershared
=
0
;
int
got_nevershared
=
0
;
int
got_cursorpos
=
0
;
int
got_pointer_mode
=
-
1
;
/* threaded vs. non-threaded (default) */
/* threaded vs. non-threaded (default) */
#if LIBVNCSERVER_X11VNC_THREADED && ! defined(X11VNC_THREADED)
#if LIBVNCSERVER_X11VNC_THREADED && ! defined(X11VNC_THREADED)
...
@@ -1112,7 +1188,7 @@ void switch_user_task_solid_bg(void) {
...
@@ -1112,7 +1188,7 @@ void switch_user_task_solid_bg(void) {
}
}
}
}
void
check_switched_user
(
void
)
{
void
check_switched_user
(
void
)
{
static
time_t
sched_switched_user
=
0
;
static
time_t
sched_switched_user
=
0
;
static
int
did_solid
=
0
;
static
int
did_solid
=
0
;
static
int
did_dummy
=
0
;
static
int
did_dummy
=
0
;
...
@@ -1785,6 +1861,10 @@ char *host2ip(char *host) {
...
@@ -1785,6 +1861,10 @@ char *host2ip(char *host) {
struct
sockaddr_in
addr
;
struct
sockaddr_in
addr
;
char
*
str
;
char
*
str
;
if
(
!
host_lookup
)
{
return
NULL
;
}
hp
=
gethostbyname
(
host
);
hp
=
gethostbyname
(
host
);
if
(
!
hp
)
{
if
(
!
hp
)
{
return
NULL
;
return
NULL
;
...
@@ -1802,6 +1882,10 @@ char *ip2host(char *ip) {
...
@@ -1802,6 +1882,10 @@ char *ip2host(char *ip) {
struct
hostent
*
hp
;
struct
hostent
*
hp
;
in_addr_t
iaddr
;
in_addr_t
iaddr
;
if
(
!
host_lookup
)
{
return
strdup
(
"unknown"
);
}
iaddr
=
inet_addr
(
ip
);
iaddr
=
inet_addr
(
ip
);
if
(
iaddr
==
htonl
(
INADDR_NONE
))
{
if
(
iaddr
==
htonl
(
INADDR_NONE
))
{
return
strdup
(
"unknown"
);
return
strdup
(
"unknown"
);
...
@@ -3391,6 +3475,7 @@ static char t2x2_bits[] = {
...
@@ -3391,6 +3475,7 @@ static char t2x2_bits[] = {
}
}
if
(
out
!=
-
1
)
{
if
(
out
!=
-
1
)
{
ret
=
out
;
ret
=
out
;
XSelectInput
(
dpy
,
awin
,
0
);
XUnmapWindow
(
dpy
,
awin
);
XUnmapWindow
(
dpy
,
awin
);
XFreeGC
(
dpy
,
gc
);
XFreeGC
(
dpy
,
gc
);
XDestroyWindow
(
dpy
,
awin
);
XDestroyWindow
(
dpy
,
awin
);
...
@@ -3518,7 +3603,6 @@ static int accept_client(rfbClientPtr client) {
...
@@ -3518,7 +3603,6 @@ static int accept_client(rfbClientPtr client) {
addr
=
"unknown-host"
;
addr
=
"unknown-host"
;
}
}
if
(
strstr
(
accept_cmd
,
"popup"
)
==
accept_cmd
)
{
if
(
strstr
(
accept_cmd
,
"popup"
)
==
accept_cmd
)
{
/* use our builtin popup button */
/* use our builtin popup button */
...
@@ -6230,7 +6314,7 @@ void pointer(int mask, int x, int y, rfbClientPtr client) {
...
@@ -6230,7 +6314,7 @@ void pointer(int mask, int x, int y, rfbClientPtr client) {
*/
*/
#if LIBVNCSERVER_HAVE_XKEYBOARD
#if LIBVNCSERVER_HAVE_XKEYBOARD
static
int
xkb_base_event_type
;
static
int
xkb_base_event_type
=
0
;
/*
/*
* check for XKEYBOARD, set up xkb_base_event_type
* check for XKEYBOARD, set up xkb_base_event_type
...
@@ -6239,36 +6323,46 @@ void initialize_xkb(void) {
...
@@ -6239,36 +6323,46 @@ void initialize_xkb(void) {
int
ir
,
reason
;
int
ir
,
reason
;
int
op
,
ev
,
er
,
maj
,
min
;
int
op
,
ev
,
er
,
maj
,
min
;
if
(
!
XkbQueryExtension
(
dpy
,
&
op
,
&
ev
,
&
er
,
&
maj
,
&
min
))
{
if
(
xkbcompat
)
{
if
(
!
quiet
&&
use_xkb
)
{
xkb_present
=
0
;
}
else
if
(
!
XkbQueryExtension
(
dpy
,
&
op
,
&
ev
,
&
er
,
&
maj
,
&
min
))
{
if
(
!
quiet
)
{
rfbLog
(
"warning: XKEYBOARD extension not present.
\n
"
);
rfbLog
(
"warning: XKEYBOARD extension not present.
\n
"
);
}
}
xkb_present
=
0
;
xkb_present
=
0
;
use_xkb
=
0
;
return
;
}
else
{
}
else
{
xkb_present
=
1
;
xkb_present
=
1
;
}
}
if
(
!
use_xkb
)
{
if
(
!
xkb_present
)
{
return
;
return
;
}
}
if
(
!
XkbOpenDisplay
(
DisplayString
(
dpy
),
&
xkb_base_event_type
,
&
ir
,
if
(
!
XkbOpenDisplay
(
DisplayString
(
dpy
),
&
xkb_base_event_type
,
&
ir
,
NULL
,
NULL
,
&
reason
)
)
{
NULL
,
NULL
,
&
reason
)
)
{
if
(
!
quiet
)
{
if
(
!
quiet
)
{
rfbLog
(
"warning: disabling XKEYBOARD. XkbOpenDisplay"
rfbLog
(
"warning: disabling XKEYBOARD. XkbOpenDisplay"
" failed.
\n
"
);
" failed.
\n
"
);
}
}
use_xkb
=
0
;
xkb_base_event_type
=
0
;
xkb_present
=
0
;
}
}
}
}
void
initialize_watch_bell
(
void
)
{
void
initialize_watch_bell
(
void
)
{
if
(
!
use_xkb
)
{
if
(
!
xkb_present
)
{
if
(
!
quiet
)
{
if
(
!
quiet
)
{
rfbLog
(
"warning: disabling bell. XKEYBOARD ext. "
rfbLog
(
"warning: disabling bell. XKEYBOARD ext. "
"not present.
\n
"
);
"not present.
\n
"
);
}
}
watch_bell
=
0
;
watch_bell
=
0
;
sound_bell
=
0
;
return
;
}
XkbSelectEvents
(
dpy
,
XkbUseCoreKbd
,
XkbBellNotifyMask
,
0
);
if
(
!
watch_bell
)
{
return
;
return
;
}
}
if
(
!
XkbSelectEvents
(
dpy
,
XkbUseCoreKbd
,
XkbBellNotifyMask
,
if
(
!
XkbSelectEvents
(
dpy
,
XkbUseCoreKbd
,
XkbBellNotifyMask
,
...
@@ -6278,6 +6372,7 @@ void initialize_watch_bell(void) {
...
@@ -6278,6 +6372,7 @@ void initialize_watch_bell(void) {
" failed.
\n
"
);
" failed.
\n
"
);
}
}
watch_bell
=
0
;
watch_bell
=
0
;
sound_bell
=
0
;
}
}
}
}
...
@@ -6290,33 +6385,40 @@ void check_bell_event(void) {
...
@@ -6290,33 +6385,40 @@ void check_bell_event(void) {
XkbAnyEvent
*
xkb_ev
;
XkbAnyEvent
*
xkb_ev
;
int
got_bell
=
0
;
int
got_bell
=
0
;
if
(
!
watch_bell
)
{
if
(
!
xkb_base_event_type
)
{
return
;
return
;
}
}
X_LOCK
;
/* caller does X_LOCK */
if
(
!
XCheckTypedEvent
(
dpy
,
xkb_base_event_type
,
&
xev
))
{
if
(
!
XCheckTypedEvent
(
dpy
,
xkb_base_event_type
,
&
xev
))
{
X_UNLOCK
;
return
;
return
;
}
}
if
(
!
watch_bell
)
{
/* we return here to avoid xkb events piling up */
return
;
}
xkb_ev
=
(
XkbAnyEvent
*
)
&
xev
;
xkb_ev
=
(
XkbAnyEvent
*
)
&
xev
;
if
(
xkb_ev
->
xkb_type
==
XkbBellNotify
)
{
if
(
xkb_ev
->
xkb_type
==
XkbBellNotify
)
{
got_bell
=
1
;
got_bell
=
1
;
}
}
X_UNLOCK
;
if
(
got_bell
&&
sound_bell
)
{
if
(
got_bell
&&
sound_bell
)
{
if
(
!
all_clients_initialized
())
{
if
(
!
all_clients_initialized
())
{
rfbLog
(
"check_bell_event: not sending bell: "
rfbLog
(
"check_bell_event: not sending bell: "
"uninitialized clients
\n
"
);
"uninitialized clients
\n
"
);
}
else
{
}
else
{
if
(
screen
)
{
if
(
screen
&&
client_count
)
{
rfbSendBell
(
screen
);
rfbSendBell
(
screen
);
}
}
}
}
}
}
}
}
#else
#else
void
initialize_watch_bell
(
void
)
{
watch_bell
=
0
;
sound_bell
=
0
;
}
void
check_bell_event
(
void
)
{}
void
check_bell_event
(
void
)
{}
#endif
#endif
...
@@ -6493,8 +6595,8 @@ int check_xrandr_event(char *msg) {
...
@@ -6493,8 +6595,8 @@ int check_xrandr_event(char *msg) {
if
(
!
xrandr
||
!
xrandr_present
)
{
if
(
!
xrandr
||
!
xrandr_present
)
{
return
0
;
return
0
;
}
}
if
(
XCheckTypedEvent
(
dpy
,
xrandr_base_event_type
+
if
(
xrandr_base_event_type
&&
XCheckTypedEvent
(
dpy
,
RRScreenChangeNotify
,
&
xev
))
{
xrandr_base_event_type
+
RRScreenChangeNotify
,
&
xev
))
{
int
do_change
;
int
do_change
;
XRRScreenChangeNotifyEvent
*
rev
;
XRRScreenChangeNotifyEvent
*
rev
;
...
@@ -6663,6 +6765,7 @@ static void selection_request(XEvent *ev) {
...
@@ -6663,6 +6765,7 @@ static void selection_request(XEvent *ev) {
if
(
!
trapped_xerror
)
{
if
(
!
trapped_xerror
)
{
XSendEvent
(
req_event
->
display
,
req_event
->
requestor
,
False
,
0
,
XSendEvent
(
req_event
->
display
,
req_event
->
requestor
,
False
,
0
,
(
XEvent
*
)
&
notify_event
);
(
XEvent
*
)
&
notify_event
);
last_sendevent
=
time
(
0
);
}
}
if
(
trapped_xerror
)
{
if
(
trapped_xerror
)
{
rfbLog
(
"selection_request: ignored XError while sending "
rfbLog
(
"selection_request: ignored XError while sending "
...
@@ -6836,23 +6939,25 @@ void initialize_xevents(void) {
...
@@ -6836,23 +6939,25 @@ void initialize_xevents(void) {
static
int
did_xdamage
=
0
;
static
int
did_xdamage
=
0
;
static
int
did_xrandr
=
0
;
static
int
did_xrandr
=
0
;
X_LOCK
;
if
((
watch_selection
||
vnc_connect
)
&&
!
did_xselect_input
)
{
if
((
watch_selection
||
vnc_connect
)
&&
!
did_xselect_input
)
{
/*
/*
* register desired event(s) for notification.
* register desired event(s) for notification.
* PropertyChangeMask is for CUT_BUFFER0 changes.
* PropertyChangeMask is for CUT_BUFFER0 changes.
* XXX: does this cause a flood of other stuff?
* XXX: does this cause a flood of other stuff?
*/
*/
X_LOCK
;
XSelectInput
(
dpy
,
rootwin
,
PropertyChangeMask
);
XSelectInput
(
dpy
,
rootwin
,
PropertyChangeMask
);
X_UNLOCK
;
did_xselect_input
=
1
;
did_xselect_input
=
1
;
}
}
if
(
watch_selection
&&
!
did_xcreate_simple_window
)
{
if
(
watch_selection
&&
!
did_xcreate_simple_window
)
{
/* create fake window for our selection ownership, etc */
/* create fake window for our selection ownership, etc */
X_LOCK
;
selwin
=
XCreateSimpleWindow
(
dpy
,
rootwin
,
0
,
0
,
1
,
1
,
0
,
0
,
0
);
selwin
=
XCreateSimpleWindow
(
dpy
,
rootwin
,
0
,
0
,
1
,
1
,
0
,
0
,
0
);
X_UNLOCK
;
did_xcreate_simple_window
=
1
;
did_xcreate_simple_window
=
1
;
}
}
X_UNLOCK
;
if
(
xrandr
&&
!
did_xrandr
)
{
if
(
xrandr
&&
!
did_xrandr
)
{
initialize_xrandr
();
initialize_xrandr
();
...
@@ -6878,16 +6983,19 @@ void initialize_xevents(void) {
...
@@ -6878,16 +6983,19 @@ void initialize_xevents(void) {
*/
*/
void
check_xevents
(
void
)
{
void
check_xevents
(
void
)
{
XEvent
xev
;
XEvent
xev
;
static
int
first
=
1
,
sent_some_sel
=
0
;
int
have_clients
=
0
;
static
int
sent_some_sel
=
0
;
static
time_t
last_request
=
0
;
static
time_t
last_request
=
0
;
static
time_t
last_call
=
0
;
static
time_t
last_bell
=
0
;
static
time_t
last_init_check
=
0
;
static
time_t
last_sync
=
0
;
time_t
now
=
time
(
0
);
time_t
now
=
time
(
0
);
int
have_clients
=
0
;
if
(
first
)
{
if
(
now
>
last_init_check
+
1
)
{
last_init_check
=
now
;
initialize_xevents
();
initialize_xevents
();
}
}
first
=
0
;
if
(
screen
&&
screen
->
clientHead
)
{
if
(
screen
&&
screen
->
clientHead
)
{
have_clients
=
1
;
have_clients
=
1
;
...
@@ -6898,7 +7006,7 @@ void check_xevents(void) {
...
@@ -6898,7 +7006,7 @@ void check_xevents(void) {
* the client... so instead of sending right away we wait a
* the client... so instead of sending right away we wait a
* the few seconds.
* the few seconds.
*/
*/
if
(
have_clients
&&
watch_selection
&&
!
sent_some_sel
if
(
have_clients
&&
watch_selection
&&
!
sent_some_sel
&&
now
>
last_client
+
sel_waittime
)
{
&&
now
>
last_client
+
sel_waittime
)
{
if
(
XGetSelectionOwner
(
dpy
,
XA_PRIMARY
)
==
None
)
{
if
(
XGetSelectionOwner
(
dpy
,
XA_PRIMARY
)
==
None
)
{
cutbuffer_send
();
cutbuffer_send
();
...
@@ -6917,7 +7025,7 @@ void check_xevents(void) {
...
@@ -6917,7 +7025,7 @@ void check_xevents(void) {
}
}
}
}
if
(
no_autorepeat
&&
client_count
&&
no_repeat_countdown
)
{
if
(
no_autorepeat
&&
have_clients
&&
no_repeat_countdown
)
{
static
time_t
last_check
=
0
;
static
time_t
last_check
=
0
;
if
(
now
>
last_check
+
1
)
{
if
(
now
>
last_check
+
1
)
{
last_check
=
now
;
last_check
=
now
;
...
@@ -6941,8 +7049,12 @@ void check_xevents(void) {
...
@@ -6941,8 +7049,12 @@ void check_xevents(void) {
}
}
}
}
if
(
XCheckTypedEvent
(
dpy
,
MappingNotify
,
&
xev
))
{
if
(
now
>
last_call
&&
XCheckTypedEvent
(
dpy
,
MappingNotify
,
&
xev
))
{
/* we only check this once a second or so. */
XRefreshKeyboardMapping
((
XMappingEvent
*
)
&
xev
);
while
(
XCheckTypedEvent
(
dpy
,
MappingNotify
,
&
xev
))
{
XRefreshKeyboardMapping
((
XMappingEvent
*
)
&
xev
);
XRefreshKeyboardMapping
((
XMappingEvent
*
)
&
xev
);
}
if
(
use_modifier_tweak
)
{
if
(
use_modifier_tweak
)
{
X_UNLOCK
;
X_UNLOCK
;
initialize_modtweak
();
initialize_modtweak
();
...
@@ -6950,6 +7062,17 @@ void check_xevents(void) {
...
@@ -6950,6 +7062,17 @@ void check_xevents(void) {
}
}
}
}
if
(
last_sendevent
&&
(
now
>
last_sendevent
+
1
||
now
%
10
==
0
))
{
/*
* we can get ClientMessage from our XSendEvent() call in
* selection_request().
*/
while
(
XCheckTypedEvent
(
dpy
,
ClientMessage
,
&
xev
))
{
;
}
last_sendevent
=
0
;
}
/* check for CUT_BUFFER0 and VNC_CONNECT changes: */
/* check for CUT_BUFFER0 and VNC_CONNECT changes: */
if
(
XCheckTypedEvent
(
dpy
,
PropertyNotify
,
&
xev
))
{
if
(
XCheckTypedEvent
(
dpy
,
PropertyNotify
,
&
xev
))
{
if
(
xev
.
type
==
PropertyNotify
)
{
if
(
xev
.
type
==
PropertyNotify
)
{
...
@@ -6983,10 +7106,12 @@ void check_xevents(void) {
...
@@ -6983,10 +7106,12 @@ void check_xevents(void) {
}
}
#endif
#endif
#if LIBVNCSERVER_HAVE_LIBXFIXES
#if LIBVNCSERVER_HAVE_LIBXFIXES
if
(
xfixes_present
&&
use_xfixes
&&
xfixes_base_event_type
)
{
if
(
XCheckTypedEvent
(
dpy
,
xfixes_base_event_type
+
if
(
XCheckTypedEvent
(
dpy
,
xfixes_base_event_type
+
XFixesCursorNotify
,
&
xev
))
{
XFixesCursorNotify
,
&
xev
))
{
got_xfixes_cursor_notify
++
;
got_xfixes_cursor_notify
++
;
}
}
}
#endif
#endif
/* check for our PRIMARY request notification: */
/* check for our PRIMARY request notification: */
...
@@ -7044,7 +7169,63 @@ void check_xevents(void) {
...
@@ -7044,7 +7169,63 @@ void check_xevents(void) {
}
}
}
}
}
}
if
(
watch_bell
||
now
>
last_bell
+
1
)
{
last_bell
=
now
;
check_bell_event
();
}
#ifndef DEBUG_XEVENTS
#define DEBUG_XEVENTS 0
#endif
#if DEBUG_XEVENTS
if
(
hack_val
)
{
static
time_t
last_check
=
0
;
if
(
now
>
last_check
+
1
)
{
XEvent
xevs
[
400
];
int
i
,
tot
=
XEventsQueued
(
dpy
,
QueuedAlready
);
last_check
=
now
;
if
(
tot
)
{
fprintf
(
stderr
,
"Total events queued: %d
\n
"
,
tot
);
}
for
(
i
=
1
;
i
<
300
;
i
++
)
{
int
k
,
n
=
0
;
while
(
XCheckTypedEvent
(
dpy
,
i
,
xevs
+
n
))
{
if
(
++
n
>=
400
)
{
break
;
}
}
if
(
n
)
{
fprintf
(
stderr
,
"%d events of type %d "
"queued
\n
"
,
n
,
i
);
}
for
(
k
=
n
-
1
;
k
>=
0
;
k
--
)
{
XPutBackEvent
(
dpy
,
xevs
+
k
);
}
}
}
}
#endif
if
(
now
>
last_sync
+
3600
)
{
/* kludge for any remaining event leaks */
int
bugout
=
use_xdamage
?
500
:
50
;
if
(
last_sync
!=
0
)
{
int
qlen
=
XEventsQueued
(
dpy
,
QueuedAlready
);
if
(
qlen
>=
bugout
)
{
rfbLog
(
"event leak: %d queued, "
" calling XSync(dpy, True)
\n
"
,
qlen
);
XSync
(
dpy
,
True
);
}
}
last_sync
=
now
;
}
X_UNLOCK
;
X_UNLOCK
;
last_call
=
now
;
}
}
/*
/*
...
@@ -7484,6 +7665,7 @@ void reset_rfbport(int old, int new) {
...
@@ -7484,6 +7665,7 @@ void reset_rfbport(int old, int new) {
* -remote/-R and -query/-Q.
* -remote/-R and -query/-Q.
*/
*/
char
*
process_remote_cmd
(
char
*
cmd
,
int
stringonly
)
{
char
*
process_remote_cmd
(
char
*
cmd
,
int
stringonly
)
{
#if REMOTE_CONTROL
char
*
p
=
cmd
;
char
*
p
=
cmd
;
char
*
co
=
""
;
char
*
co
=
""
;
char
buf
[
VNC_CONNECT_MAX
];
char
buf
[
VNC_CONNECT_MAX
];
...
@@ -7572,7 +7754,7 @@ char *process_remote_cmd(char *cmd, int stringonly) {
...
@@ -7572,7 +7754,7 @@ char *process_remote_cmd(char *cmd, int stringonly) {
}
}
/*
/*
*
Add: passwdfile logfile bg nofb rfbauth passwd noshm
...
*
Maybe add: passwdfile logfile bg rfbauth passwd
...
*/
*/
if
(
!
strcmp
(
p
,
"stop"
)
||
!
strcmp
(
p
,
"quit"
)
||
if
(
!
strcmp
(
p
,
"stop"
)
||
!
strcmp
(
p
,
"quit"
)
||
!
strcmp
(
p
,
"exit"
)
||
!
strcmp
(
p
,
"shutdown"
))
{
!
strcmp
(
p
,
"exit"
)
||
!
strcmp
(
p
,
"shutdown"
))
{
...
@@ -8163,7 +8345,9 @@ char *process_remote_cmd(char *cmd, int stringonly) {
...
@@ -8163,7 +8345,9 @@ char *process_remote_cmd(char *cmd, int stringonly) {
struct
hostent
*
hp
;
struct
hostent
*
hp
;
in_addr_t
iface
=
inet_addr
(
listen_str
);
in_addr_t
iface
=
inet_addr
(
listen_str
);
if
(
iface
==
htonl
(
INADDR_NONE
))
{
if
(
iface
==
htonl
(
INADDR_NONE
))
{
if
(
!
(
hp
=
gethostbyname
(
listen_str
)))
{
if
(
!
host_lookup
)
{
ok
=
0
;
}
else
if
(
!
(
hp
=
gethostbyname
(
listen_str
)))
{
ok
=
0
;
ok
=
0
;
}
else
{
}
else
{
iface
=
*
(
unsigned
long
*
)
hp
->
h_addr
;
iface
=
*
(
unsigned
long
*
)
hp
->
h_addr
;
...
@@ -8213,6 +8397,20 @@ char *process_remote_cmd(char *cmd, int stringonly) {
...
@@ -8213,6 +8397,20 @@ char *process_remote_cmd(char *cmd, int stringonly) {
free
(
listen_str
);
free
(
listen_str
);
listen_str
=
before
;
listen_str
=
before
;
}
}
}
else
if
(
!
strcmp
(
p
,
"lookup"
))
{
if
(
query
)
{
snprintf
(
buf
,
bufn
,
"ans=%s:%d"
,
p
,
host_lookup
);
goto
qry
;
}
rfbLog
(
"process_remote_cmd: enabling hostname lookup.
\n
"
);
host_lookup
=
1
;
}
else
if
(
!
strcmp
(
p
,
"nolookup"
))
{
if
(
query
)
{
snprintf
(
buf
,
bufn
,
"ans=%s:%d"
,
p
,
!
host_lookup
);
goto
qry
;
}
rfbLog
(
"process_remote_cmd: disabling hostname lookup.
\n
"
);
host_lookup
=
0
;
}
else
if
(
strstr
(
p
,
"accept"
)
==
p
)
{
}
else
if
(
strstr
(
p
,
"accept"
)
==
p
)
{
COLON_CHECK
(
"accept:"
)
COLON_CHECK
(
"accept:"
)
...
@@ -8745,6 +8943,10 @@ char *process_remote_cmd(char *cmd, int stringonly) {
...
@@ -8745,6 +8943,10 @@ char *process_remote_cmd(char *cmd, int stringonly) {
}
}
if
(
nofb
)
{
if
(
nofb
)
{
rfbLog
(
"process_remote_cmd: disabling nofb mode.
\n
"
);
rfbLog
(
"process_remote_cmd: disabling nofb mode.
\n
"
);
rfbLog
(
" you may need to these turn back on:
\n
"
);
rfbLog
(
" xfixes, xdamage, solid, flashcmap
\n
"
);
rfbLog
(
" overlay, shm, noonetile, nap, cursor
\n
"
);
rfbLog
(
" cursorpos, cursorshape, bell.
\n
"
);
nofb
=
0
;
nofb
=
0
;
do_new_fb
(
1
);
do_new_fb
(
1
);
}
}
...
@@ -8759,6 +8961,10 @@ char *process_remote_cmd(char *cmd, int stringonly) {
...
@@ -8759,6 +8961,10 @@ char *process_remote_cmd(char *cmd, int stringonly) {
push_black_screen
(
4
);
push_black_screen
(
4
);
}
}
nofb
=
1
;
nofb
=
1
;
sound_bell
=
0
;
initialize_watch_bell
();
set_nofb_params
();
do_new_fb
(
1
);
}
}
}
else
if
(
!
strcmp
(
p
,
"bell"
))
{
}
else
if
(
!
strcmp
(
p
,
"bell"
))
{
...
@@ -8767,6 +8973,7 @@ char *process_remote_cmd(char *cmd, int stringonly) {
...
@@ -8767,6 +8973,7 @@ char *process_remote_cmd(char *cmd, int stringonly) {
goto
qry
;
goto
qry
;
}
}
rfbLog
(
"process_remote_cmd: enabling bell (if supported).
\n
"
);
rfbLog
(
"process_remote_cmd: enabling bell (if supported).
\n
"
);
initialize_watch_bell
();
sound_bell
=
1
;
sound_bell
=
1
;
}
else
if
(
!
strcmp
(
p
,
"nobell"
))
{
}
else
if
(
!
strcmp
(
p
,
"nobell"
))
{
...
@@ -8775,6 +8982,7 @@ char *process_remote_cmd(char *cmd, int stringonly) {
...
@@ -8775,6 +8982,7 @@ char *process_remote_cmd(char *cmd, int stringonly) {
goto
qry
;
goto
qry
;
}
}
rfbLog
(
"process_remote_cmd: disabling bell.
\n
"
);
rfbLog
(
"process_remote_cmd: disabling bell.
\n
"
);
initialize_watch_bell
();
sound_bell
=
0
;
sound_bell
=
0
;
}
else
if
(
!
strcmp
(
p
,
"sel"
))
{
}
else
if
(
!
strcmp
(
p
,
"sel"
))
{
...
@@ -8782,16 +8990,20 @@ char *process_remote_cmd(char *cmd, int stringonly) {
...
@@ -8782,16 +8990,20 @@ char *process_remote_cmd(char *cmd, int stringonly) {
snprintf
(
buf
,
bufn
,
"ans=%s:%d"
,
p
,
watch_selection
);
snprintf
(
buf
,
bufn
,
"ans=%s:%d"
,
p
,
watch_selection
);
goto
qry
;
goto
qry
;
}
}
rfbLog
(
"process_remote_cmd: enabling watch_selection.
\n
"
);
rfbLog
(
"process_remote_cmd: enabling watch "
"selection+primary.
\n
"
);
watch_selection
=
1
;
watch_selection
=
1
;
watch_primary
=
1
;
}
else
if
(
!
strcmp
(
p
,
"nosel"
))
{
}
else
if
(
!
strcmp
(
p
,
"nosel"
))
{
if
(
query
)
{
if
(
query
)
{
snprintf
(
buf
,
bufn
,
"ans=%s:%d"
,
p
,
!
watch_selection
);
snprintf
(
buf
,
bufn
,
"ans=%s:%d"
,
p
,
!
watch_selection
);
goto
qry
;
goto
qry
;
}
}
rfbLog
(
"process_remote_cmd: disabling watch_selection.
\n
"
);
rfbLog
(
"process_remote_cmd: disabling watch "
"selection+primary.
\n
"
);
watch_selection
=
0
;
watch_selection
=
0
;
watch_primary
=
0
;
}
else
if
(
!
strcmp
(
p
,
"primary"
))
{
}
else
if
(
!
strcmp
(
p
,
"primary"
))
{
if
(
query
)
{
if
(
query
)
{
...
@@ -8963,9 +9175,9 @@ char *process_remote_cmd(char *cmd, int stringonly) {
...
@@ -8963,9 +9175,9 @@ char *process_remote_cmd(char *cmd, int stringonly) {
first_cursor
();
first_cursor
();
}
else
if
(
!
strcmp
(
p
,
"xdamage"
))
{
}
else
if
(
!
strcmp
(
p
,
"xdamage"
))
{
int
orig
=
use_xdamage
_hints
;
int
orig
=
use_xdamage
;
if
(
query
)
{
if
(
query
)
{
snprintf
(
buf
,
bufn
,
"ans=%s:%d"
,
p
,
use_xdamage
_hints
);
snprintf
(
buf
,
bufn
,
"ans=%s:%d"
,
p
,
use_xdamage
);
goto
qry
;
goto
qry
;
}
}
if
(
!
xdamage_present
)
{
if
(
!
xdamage_present
)
{
...
@@ -8975,15 +9187,15 @@ char *process_remote_cmd(char *cmd, int stringonly) {
...
@@ -8975,15 +9187,15 @@ char *process_remote_cmd(char *cmd, int stringonly) {
}
}
rfbLog
(
"process_remote_cmd: enabling xdamage hints"
rfbLog
(
"process_remote_cmd: enabling xdamage hints"
" (if supported).
\n
"
);
" (if supported).
\n
"
);
use_xdamage
_hints
=
1
;
use_xdamage
=
1
;
if
(
use_xdamage
_hints
!=
orig
)
{
if
(
use_xdamage
!=
orig
)
{
initialize_xdamage
();
initialize_xdamage
();
create_xdamage
();
create_xdamage
();
}
}
}
else
if
(
!
strcmp
(
p
,
"noxdamage"
))
{
}
else
if
(
!
strcmp
(
p
,
"noxdamage"
))
{
int
orig
=
use_xdamage
_hints
;
int
orig
=
use_xdamage
;
if
(
query
)
{
if
(
query
)
{
snprintf
(
buf
,
bufn
,
"ans=%s:%d"
,
p
,
!
use_xdamage
_hints
);
snprintf
(
buf
,
bufn
,
"ans=%s:%d"
,
p
,
!
use_xdamage
);
goto
qry
;
goto
qry
;
}
}
if
(
!
xdamage_present
)
{
if
(
!
xdamage_present
)
{
...
@@ -8992,8 +9204,8 @@ char *process_remote_cmd(char *cmd, int stringonly) {
...
@@ -8992,8 +9204,8 @@ char *process_remote_cmd(char *cmd, int stringonly) {
goto
done
;
goto
done
;
}
}
rfbLog
(
"process_remote_cmd: disabling xdamage hints.
\n
"
);
rfbLog
(
"process_remote_cmd: disabling xdamage hints.
\n
"
);
use_xdamage
_hints
=
0
;
use_xdamage
=
0
;
if
(
use_xdamage
_hints
!=
orig
)
{
if
(
use_xdamage
!=
orig
)
{
initialize_xdamage
();
initialize_xdamage
();
destroy_xdamage
();
destroy_xdamage
();
}
}
...
@@ -9825,6 +10037,7 @@ char *process_remote_cmd(char *cmd, int stringonly) {
...
@@ -9825,6 +10037,7 @@ char *process_remote_cmd(char *cmd, int stringonly) {
set_vnc_connect_prop
(
buf
);
set_vnc_connect_prop
(
buf
);
XFlush
(
dpy
);
XFlush
(
dpy
);
}
}
#endif
return
NULL
;
return
NULL
;
}
}
...
@@ -9877,7 +10090,6 @@ void record_desired_xdamage_rect(int x, int y, int w, int h) {
...
@@ -9877,7 +10090,6 @@ void record_desired_xdamage_rect(int x, int y, int w, int h) {
nt_y1
=
nfix
(
(
y
)
/
tile_y
,
ntiles_y
);
nt_y1
=
nfix
(
(
y
)
/
tile_y
,
ntiles_y
);
nt_y2
=
nfix
((
y
+
h
)
/
tile_y
,
ntiles_y
);
nt_y2
=
nfix
((
y
+
h
)
/
tile_y
,
ntiles_y
);
/* loop over the rectangle of tiles (1 tile for a small input rect */
/* loop over the rectangle of tiles (1 tile for a small input rect */
for
(
ix
=
nt_x1
;
ix
<=
nt_x2
;
ix
++
)
{
for
(
ix
=
nt_x1
;
ix
<=
nt_x2
;
ix
++
)
{
for
(
iy
=
nt_y1
;
iy
<=
nt_y2
;
iy
++
)
{
for
(
iy
=
nt_y1
;
iy
<=
nt_y2
;
iy
++
)
{
...
@@ -9896,9 +10108,6 @@ void record_desired_xdamage_rect(int x, int y, int w, int h) {
...
@@ -9896,9 +10108,6 @@ void record_desired_xdamage_rect(int x, int y, int w, int h) {
void
collect_xdamage
(
int
scancnt
)
{
void
collect_xdamage
(
int
scancnt
)
{
#if LIBVNCSERVER_HAVE_LIBXDAMAGE
#if LIBVNCSERVER_HAVE_LIBXDAMAGE
XDamageNotifyEvent
*
dev
;
XDamageNotifyEvent
*
dev
;
#if 0
XserverRegion xregion;
#endif
XEvent
ev
;
XEvent
ev
;
sraRegionPtr
tmpregion
;
sraRegionPtr
tmpregion
;
sraRegionPtr
reg
;
sraRegionPtr
reg
;
...
@@ -9911,12 +10120,15 @@ void collect_xdamage(int scancnt) {
...
@@ -9911,12 +10120,15 @@ void collect_xdamage(int scancnt) {
#define DUPSZ 16
#define DUPSZ 16
int
dup_x
[
DUPSZ
],
dup_y
[
DUPSZ
],
dup_w
[
DUPSZ
],
dup_h
[
DUPSZ
];
int
dup_x
[
DUPSZ
],
dup_y
[
DUPSZ
],
dup_w
[
DUPSZ
],
dup_h
[
DUPSZ
];
if
(
!
xdamage_present
||
!
us
ing
_xdamage
)
{
if
(
!
xdamage_present
||
!
us
e
_xdamage
)
{
return
;
return
;
}
}
if
(
!
xdamage
)
{
if
(
!
xdamage
)
{
return
;
return
;
}
}
if
(
!
xdamage_base_event_type
)
{
return
;
}
nreg
=
(
xdamage_memory
*
NSCAN
)
+
1
;
nreg
=
(
xdamage_memory
*
NSCAN
)
+
1
;
xdamage_ticker
=
(
xdamage_ticker
+
1
)
%
nreg
;
xdamage_ticker
=
(
xdamage_ticker
+
1
)
%
nreg
;
...
@@ -9974,8 +10186,8 @@ void collect_xdamage(int scancnt) {
...
@@ -9974,8 +10186,8 @@ void collect_xdamage(int scancnt) {
/* set coords relative to fb origin */
/* set coords relative to fb origin */
if
(
0
&&
rootshift
)
{
if
(
0
&&
rootshift
)
{
/*
/*
*
not needed because damage is relative
*
Note: not needed because damage is
* to subwin, not rootwin.
*
relative
to subwin, not rootwin.
*/
*/
x
=
x
-
off_x
;
x
=
x
-
off_x
;
y
=
y
-
off_y
;
y
=
y
-
off_y
;
...
@@ -10000,7 +10212,6 @@ void collect_xdamage(int scancnt) {
...
@@ -10000,7 +10212,6 @@ void collect_xdamage(int scancnt) {
}
}
}
}
record_desired_xdamage_rect
(
x
,
y
,
w
,
h
);
record_desired_xdamage_rect
(
x
,
y
,
w
,
h
);
tmpregion
=
sraRgnCreateRect
(
x
,
y
,
x
+
w
,
y
+
h
);
tmpregion
=
sraRgnCreateRect
(
x
,
y
,
x
+
w
,
y
+
h
);
...
@@ -10024,7 +10235,6 @@ void collect_xdamage(int scancnt) {
...
@@ -10024,7 +10235,6 @@ void collect_xdamage(int scancnt) {
rat
=
((
double
)
XD_skip
)
/
XD_tot
;
rat
=
((
double
)
XD_skip
)
/
XD_tot
;
}
}
if
(
0
)
fprintf
(
stderr
,
"skip/tot: %04d/%04d rat=%.3f rect_count: %d desired_rects: %d
\n
"
,
XD_skip
,
XD_tot
,
rat
,
rect_count
,
XD_des
);
XD_skip
=
0
;
XD_skip
=
0
;
XD_tot
=
0
;
XD_tot
=
0
;
XD_des
=
0
;
XD_des
=
0
;
...
@@ -10039,7 +10249,7 @@ int xdamage_hint_skip(int y) {
...
@@ -10039,7 +10249,7 @@ int xdamage_hint_skip(int y) {
sraRegionPtr
reg
,
tmpl
;
sraRegionPtr
reg
,
tmpl
;
int
ret
,
i
,
n
,
nreg
;
int
ret
,
i
,
n
,
nreg
;
if
(
!
xdamage_present
||
!
using_xdamage
||
!
use_xdamage_hints
)
{
if
(
!
xdamage_present
||
!
use_xdamage
)
{
return
0
;
/* cannot skip */
return
0
;
/* cannot skip */
}
}
if
(
!
xdamage_regions
)
{
if
(
!
xdamage_regions
)
{
...
@@ -10078,11 +10288,8 @@ void initialize_xdamage(void) {
...
@@ -10078,11 +10288,8 @@ void initialize_xdamage(void) {
sraRegionPtr
*
ptr
;
sraRegionPtr
*
ptr
;
int
i
,
nreg
;
int
i
,
nreg
;
using_xdamage
=
0
;
if
(
!
xdamage_present
)
{
if
(
xdamage_present
)
{
use_xdamage
=
0
;
if
(
use_xdamage_hints
)
{
using_xdamage
=
1
;
}
}
}
if
(
xdamage_regions
)
{
if
(
xdamage_regions
)
{
ptr
=
xdamage_regions
;
ptr
=
xdamage_regions
;
...
@@ -10093,7 +10300,7 @@ void initialize_xdamage(void) {
...
@@ -10093,7 +10300,7 @@ void initialize_xdamage(void) {
free
(
xdamage_regions
);
free
(
xdamage_regions
);
xdamage_regions
=
NULL
;
xdamage_regions
=
NULL
;
}
}
if
(
us
ing
_xdamage
)
{
if
(
us
e
_xdamage
)
{
nreg
=
(
xdamage_memory
*
NSCAN
)
+
2
;
nreg
=
(
xdamage_memory
*
NSCAN
)
+
2
;
xdamage_regions
=
(
sraRegionPtr
*
)
xdamage_regions
=
(
sraRegionPtr
*
)
malloc
(
nreg
*
sizeof
(
sraRegionPtr
));
malloc
(
nreg
*
sizeof
(
sraRegionPtr
));
...
@@ -10126,8 +10333,16 @@ void create_xdamage(void) {
...
@@ -10126,8 +10333,16 @@ void create_xdamage(void) {
void
destroy_xdamage
(
void
)
{
void
destroy_xdamage
(
void
)
{
#if LIBVNCSERVER_HAVE_LIBXDAMAGE
#if LIBVNCSERVER_HAVE_LIBXDAMAGE
if
(
xdamage
)
{
if
(
xdamage
)
{
XEvent
ev
;
X_LOCK
;
X_LOCK
;
XDamageDestroy
(
dpy
,
xdamage
);
XDamageDestroy
(
dpy
,
xdamage
);
XFlush
(
dpy
);
if
(
xdamage_base_event_type
)
{
while
(
XCheckTypedEvent
(
dpy
,
xdamage_base_event_type
+
XDamageNotify
,
&
ev
))
{
;
}
}
X_UNLOCK
;
X_UNLOCK
;
rfbLog
(
"destroyed xdamage object: 0x%lx
\n
"
,
xdamage
);
rfbLog
(
"destroyed xdamage object: 0x%lx
\n
"
,
xdamage
);
xdamage
=
0
;
xdamage
=
0
;
...
@@ -10136,7 +10351,7 @@ void destroy_xdamage(void) {
...
@@ -10136,7 +10351,7 @@ void destroy_xdamage(void) {
}
}
void
check_xdamage_state
(
void
)
{
void
check_xdamage_state
(
void
)
{
if
(
!
us
ing
_xdamage
||
!
xdamage_present
)
{
if
(
!
us
e
_xdamage
||
!
xdamage_present
)
{
return
;
return
;
}
}
/*
/*
...
@@ -11263,7 +11478,7 @@ int get_xfixes_cursor(int init) {
...
@@ -11263,7 +11478,7 @@ int get_xfixes_cursor(int init) {
time_t
oldtime
,
now
;
time_t
oldtime
,
now
;
XFixesCursorImage
*
xfc
;
XFixesCursorImage
*
xfc
;
if
(
!
got_xfixes_cursor_notify
)
{
if
(
!
got_xfixes_cursor_notify
&&
xfixes_base_event_type
)
{
/* try again for XFixesCursorNotify event */
/* try again for XFixesCursorNotify event */
XEvent
xev
;
XEvent
xev
;
X_LOCK
;
X_LOCK
;
...
@@ -12128,6 +12343,35 @@ void set_visual(char *str) {
...
@@ -12128,6 +12343,35 @@ void set_visual(char *str) {
visual_id
=
vinfo
.
visualid
;
visual_id
=
vinfo
.
visualid
;
}
}
void
set_nofb_params
(
void
)
{
use_xfixes
=
0
;
use_xdamage
=
0
;
use_solid_bg
=
0
;
overlay
=
0
;
overlay_cursor
=
0
;
using_shm
=
0
;
single_copytile
=
1
;
take_naps
=
0
;
measure_speeds
=
0
;
show_cursor
=
0
;
show_multiple_cursors
=
0
;
cursor_shape_updates
=
0
;
if
(
!
got_cursorpos
)
{
cursor_pos_updates
=
0
;
}
if
(
!
quiet
)
{
rfbLog
(
"disabling: xfixes, xdamage, solid, overlay, shm,
\n
"
);
rfbLog
(
" noonetile, nap, cursor, %scursorshape
\n
"
,
got_cursorpos
?
""
:
"cursorpos, "
);
rfbLog
(
" in -nofb mode.
\n
"
);
}
}
/*
/*
* Presumably under -nofb the clients will never request the framebuffer.
* Presumably under -nofb the clients will never request the framebuffer.
* However, we have gotten such a request... so let's just give them
* However, we have gotten such a request... so let's just give them
...
@@ -12136,18 +12380,13 @@ void set_visual(char *str) {
...
@@ -12136,18 +12380,13 @@ void set_visual(char *str) {
* nearly always happens.
* nearly always happens.
*/
*/
void
nofb_hook
(
rfbClientPtr
cl
)
{
void
nofb_hook
(
rfbClientPtr
cl
)
{
static
int
loaded_fb
=
0
;
XImage
*
fb
;
XImage
*
fb
;
if
(
loaded_fb
)
{
return
;
}
rfbLog
(
"framebuffer requested in -nofb mode by client %s
\n
"
,
cl
->
host
);
rfbLog
(
"framebuffer requested in -nofb mode by client %s
\n
"
,
cl
->
host
);
/* ignore xrandr */
/* ignore xrandr */
fb
=
XGetImage_wr
(
dpy
,
window
,
0
,
0
,
dpy_x
,
dpy_y
,
AllPlanes
,
ZPixmap
);
fb
=
XGetImage_wr
(
dpy
,
window
,
0
,
0
,
dpy_x
,
dpy_y
,
AllPlanes
,
ZPixmap
);
main_fb
=
fb
->
data
;
main_fb
=
fb
->
data
;
rfb_fb
=
main_fb
;
rfb_fb
=
main_fb
;
screen
->
frameBuffer
=
rfb_fb
;
screen
->
frameBuffer
=
rfb_fb
;
loaded_fb
=
1
;
screen
->
displayHook
=
NULL
;
screen
->
displayHook
=
NULL
;
}
}
...
@@ -12420,7 +12659,7 @@ XImage *initialize_xdisplay_fb(void) {
...
@@ -12420,7 +12659,7 @@ XImage *initialize_xdisplay_fb(void) {
}
}
if
(
!
quiet
)
{
if
(
!
quiet
)
{
fprintf
(
stderr
,
" initialize_xdisplay_fb()
\n
"
);
fprintf
(
stderr
,
" initialize_xdisplay_fb()
\n
"
);
fprintf
(
stderr
,
" Visual*:
0x
%p
\n
"
,
vinfo
->
visual
);
fprintf
(
stderr
,
" Visual*: %p
\n
"
,
vinfo
->
visual
);
fprintf
(
stderr
,
" visualid: 0x%x
\n
"
,
fprintf
(
stderr
,
" visualid: 0x%x
\n
"
,
(
int
)
vinfo
->
visualid
);
(
int
)
vinfo
->
visualid
);
fprintf
(
stderr
,
" screen: %d
\n
"
,
vinfo
->
screen
);
fprintf
(
stderr
,
" screen: %d
\n
"
,
vinfo
->
screen
);
...
@@ -12731,8 +12970,7 @@ void initialize_screen(int *argc, char **argv, XImage *fb) {
...
@@ -12731,8 +12970,7 @@ void initialize_screen(int *argc, char **argv, XImage *fb) {
/*
/*
* These are just hints wrt pixel format just to let
* These are just hints wrt pixel format just to let
* rfbGetScreen/rfbNewFramebuffer proceed with reasonable
* rfbGetScreen/rfbNewFramebuffer proceed with reasonable
* defaults. We manually set them in painful detail
* defaults. We manually set them in painful detail below.
* below.
*/
*/
bits_per_color
=
guess_bits_per_color
(
fb
->
bits_per_pixel
);
bits_per_color
=
guess_bits_per_color
(
fb
->
bits_per_pixel
);
...
@@ -12898,6 +13136,7 @@ void initialize_screen(int *argc, char **argv, XImage *fb) {
...
@@ -12898,6 +13136,7 @@ void initialize_screen(int *argc, char **argv, XImage *fb) {
main_blue_shift
=
screen
->
serverFormat
.
blueShift
;
main_blue_shift
=
screen
->
serverFormat
.
blueShift
;
}
}
#if !SMALL_FOOTPRINT
if
(
!
quiet
)
{
if
(
!
quiet
)
{
fprintf
(
stderr
,
"
\n
"
);
fprintf
(
stderr
,
"
\n
"
);
fprintf
(
stderr
,
"FrameBuffer Info:
\n
"
);
fprintf
(
stderr
,
"FrameBuffer Info:
\n
"
);
...
@@ -12954,7 +13193,6 @@ void initialize_screen(int *argc, char **argv, XImage *fb) {
...
@@ -12954,7 +13193,6 @@ void initialize_screen(int *argc, char **argv, XImage *fb) {
fprintf
(
stderr
,
" bitmap_bit_order: %d
\n
"
,
fprintf
(
stderr
,
" bitmap_bit_order: %d
\n
"
,
fb
->
bitmap_bit_order
);
break
;
fb
->
bitmap_bit_order
);
break
;
}
}
fprintf
(
stderr
,
"
\n
"
);
}
}
if
(
overlay
&&
!
quiet
)
{
if
(
overlay
&&
!
quiet
)
{
rfbLog
(
"
\n
"
);
rfbLog
(
"
\n
"
);
...
@@ -12965,6 +13203,7 @@ void initialize_screen(int *argc, char **argv, XImage *fb) {
...
@@ -12965,6 +13203,7 @@ void initialize_screen(int *argc, char **argv, XImage *fb) {
rfbLog
(
"Xsun -su ... see Xserver(1), xinit(1) for more info.
\n
"
);
rfbLog
(
"Xsun -su ... see Xserver(1), xinit(1) for more info.
\n
"
);
rfbLog
(
"
\n
"
);
rfbLog
(
"
\n
"
);
}
}
#endif
/* nofb is for pointer/keyboard only handling. */
/* nofb is for pointer/keyboard only handling. */
if
(
nofb
)
{
if
(
nofb
)
{
...
@@ -12981,6 +13220,11 @@ void initialize_screen(int *argc, char **argv, XImage *fb) {
...
@@ -12981,6 +13220,11 @@ void initialize_screen(int *argc, char **argv, XImage *fb) {
}
}
}
}
screen
->
frameBuffer
=
rfb_fb
;
screen
->
frameBuffer
=
rfb_fb
;
if
(
!
quiet
)
{
fprintf
(
stderr
,
" main_fb: %p
\n
"
,
main_fb
);
fprintf
(
stderr
,
" rfb_fb: %p
\n
"
,
rfb_fb
);
fprintf
(
stderr
,
"
\n
"
);
}
bpp
=
screen
->
serverFormat
.
bitsPerPixel
;
bpp
=
screen
->
serverFormat
.
bitsPerPixel
;
depth
=
screen
->
serverFormat
.
depth
;
depth
=
screen
->
serverFormat
.
depth
;
...
@@ -16006,7 +16250,7 @@ static void nap_set(int tile_cnt) {
...
@@ -16006,7 +16250,7 @@ static void nap_set(int tile_cnt) {
}
}
nap_diff_count
=
0
;
nap_diff_count
=
0
;
}
}
if
(
nap_ok
&&
!
nap_in
&&
us
ing
_xdamage
)
{
if
(
nap_ok
&&
!
nap_in
&&
us
e
_xdamage
)
{
if
(
XD_skip
>
0
.
8
*
XD_tot
)
{
if
(
XD_skip
>
0
.
8
*
XD_tot
)
{
/* X DAMAGE is keeping load low, so skip nap */
/* X DAMAGE is keeping load low, so skip nap */
nap_ok
=
0
;
nap_ok
=
0
;
...
@@ -16237,7 +16481,7 @@ static int scan_display(int ystart, int rescan) {
...
@@ -16237,7 +16481,7 @@ static int scan_display(int ystart, int rescan) {
while
(
y
<
dpy_y
)
{
while
(
y
<
dpy_y
)
{
if
(
us
ing
_xdamage
)
{
if
(
us
e
_xdamage
)
{
XD_tot
++
;
XD_tot
++
;
if
(
xdamage_hint_skip
(
y
))
{
if
(
xdamage_hint_skip
(
y
))
{
XD_skip
++
;
XD_skip
++
;
...
@@ -16364,7 +16608,7 @@ int scan_for_updates(int count_only) {
...
@@ -16364,7 +16608,7 @@ int scan_for_updates(int count_only) {
/* check for changed colormap */
/* check for changed colormap */
set_colormap
(
0
);
set_colormap
(
0
);
}
}
if
(
us
ing
_xdamage
)
{
if
(
us
e
_xdamage
)
{
collect_xdamage
(
scan_count
);
collect_xdamage
(
scan_count
);
}
}
}
}
...
@@ -16555,7 +16799,7 @@ int scan_for_updates(int count_only) {
...
@@ -16555,7 +16799,7 @@ int scan_for_updates(int count_only) {
}
}
/* -- gui.c -- */
/* -- gui.c -- */
#if OLD_TREE
#if OLD_TREE
|| SMALL_FOOTPRINT
char
gui_code
[]
=
""
;
char
gui_code
[]
=
""
;
#else
#else
#include "tkx11vnc.h"
#include "tkx11vnc.h"
...
@@ -16877,8 +17121,6 @@ static void check_user_input2(double dt) {
...
@@ -16877,8 +17121,6 @@ static void check_user_input2(double dt) {
double
quick_spin_fac
=
0
.
40
;
double
quick_spin_fac
=
0
.
40
;
double
grind_spin_time
=
0
.
175
;
double
grind_spin_time
=
0
.
175
;
dtime
(
&
tm
);
dtime
(
&
tm
);
g
=
g_in
=
got_pointer_input
;
g
=
g_in
=
got_pointer_input
;
if
(
!
got_pointer_input
)
{
if
(
!
got_pointer_input
)
{
...
@@ -16984,7 +17226,140 @@ static void check_user_input2(double dt) {
...
@@ -16984,7 +17226,140 @@ static void check_user_input2(double dt) {
}
}
}
}
static
void
check_user_input3
(
double
dt
,
double
dtr
,
int
tile_diffs
)
{
static
void
check_user_input3
(
double
dt
)
{
int
eaten
=
0
,
miss
=
0
,
max_eat
=
50
;
int
miss_max
=
2
;
int
g
,
g_in
;
double
spin
=
0
.
0
,
tm
=
0
.
0
;
double
quick_spin_fac
=
0
.
40
,
button_down_time
=
0
.
050
;
double
grind_spin_time
=
0
.
125
;
dtime
(
&
tm
);
g
=
g_in
=
got_pointer_input
;
if
(
!
got_pointer_input
)
{
return
;
}
/*
* Try for some "quick" pointer input processing.
*
* About as fast as we can, we try to process user input calling
* rfbProcessEvents or rfbCheckFds. We do this for a time on
* order of the last scan_for_updates() time, dt, but if we stop
* getting user input we break out. We will also break out if
* we have processed max_eat inputs.
*
* Note that rfbCheckFds() does not send any framebuffer updates,
* so is more what we want here, although it is likely they have
* all be sent already.
*/
while
(
1
)
{
double
spin_out
;
int
mcut
=
miss_max
;
if
(
show_multiple_cursors
)
{
rfbPE
(
screen
,
1000
);
}
else
{
rfbCFD
(
screen
,
1000
);
}
XFlush
(
dpy
);
spin
+=
dtime
(
&
tm
);
spin_out
=
quick_spin_fac
*
dt
;
if
(
button_mask
&&
button_down_time
>
spin_out
)
{
spin_out
=
button_down_time
;
}
if
(
spin
>
spin_out
)
{
/* get out if spin time comparable to last scan time */
break
;
}
if
(
got_pointer_input
>
g
)
{
g
=
got_pointer_input
;
if
(
button_mask
)
{
miss
=
0
;
}
if
(
eaten
++
<
max_eat
)
{
continue
;
}
}
else
{
miss
++
;
}
if
(
button_mask
)
{
mcut
=
4
;
}
if
(
miss
>=
mcut
)
{
if
(
!
button_mask
||
spin
>
button_down_time
)
{
break
;
}
}
}
/*
* Probably grinding with a lot of fb I/O if dt is this large.
* (need to do this more elegantly)
*
* Current idea is to spin our wheels here *not* processing any
* fb I/O, but still processing the user input. This user input
* goes to the X display and changes it, but we don't poll it
* while we "rest" here for a time on order of dt, the previous
* scan_for_updates() time. We also break out if we miss enough
* user input.
*/
if
(
dt
>
grind_spin_time
)
{
int
i
,
ms
,
split
=
30
;
double
shim
;
/*
* Break up our pause into 'split' steps. We get at
* most one input per step.
*/
shim
=
0
.
75
*
dt
/
split
;
ms
=
(
int
)
(
1000
*
shim
);
/* cutoff how long the pause can be */
if
(
split
*
ms
>
300
)
{
ms
=
300
/
split
;
}
spin
=
0
.
0
;
tm
=
0
.
0
;
dtime
(
&
tm
);
g
=
got_pointer_input
;
miss
=
0
;
for
(
i
=
0
;
i
<
split
;
i
++
)
{
usleep
(
ms
*
1000
);
if
(
show_multiple_cursors
)
{
rfbPE
(
screen
,
1000
);
}
else
{
rfbCFD
(
screen
,
1000
);
}
spin
+=
dtime
(
&
tm
);
if
(
got_pointer_input
>
g
)
{
XFlush
(
dpy
);
miss
=
0
;
}
else
{
miss
++
;
}
g
=
got_pointer_input
;
if
(
miss
>
2
)
{
break
;
}
if
(
1000
*
spin
>
ms
*
split
)
{
break
;
}
}
}
}
static
void
check_user_input4
(
double
dt
,
double
dtr
,
int
tile_diffs
)
{
int
allowed_misses
,
miss_tweak
,
i
,
g
,
g_in
;
int
allowed_misses
,
miss_tweak
,
i
,
g
,
g_in
;
int
last_was_miss
,
consecutive_misses
;
int
last_was_miss
,
consecutive_misses
;
...
@@ -16994,7 +17369,6 @@ static void check_user_input3(double dt, double dtr, int tile_diffs) {
...
@@ -16994,7 +17369,6 @@ static void check_user_input3(double dt, double dtr, int tile_diffs) {
int
gcnt
,
ginput
;
int
gcnt
,
ginput
;
static
int
first
=
1
;
static
int
first
=
1
;
if
(
first
)
{
if
(
first
)
{
char
*
p
=
getenv
(
"SPIN"
);
char
*
p
=
getenv
(
"SPIN"
);
if
(
p
)
{
if
(
p
)
{
...
@@ -17110,6 +17484,10 @@ int fb_update_sent(int *count) {
...
@@ -17110,6 +17484,10 @@ int fb_update_sent(int *count) {
rfbClientIteratorPtr
i
;
rfbClientIteratorPtr
i
;
rfbClientPtr
cl
;
rfbClientPtr
cl
;
if
(
nofb
)
{
return
0
;
}
i
=
rfbGetClientIterator
(
screen
);
i
=
rfbGetClientIterator
(
screen
);
while
(
(
cl
=
rfbClientIteratorNext
(
i
))
)
{
while
(
(
cl
=
rfbClientIteratorNext
(
i
))
)
{
sent
+=
cl
->
framebufferUpdateMessagesSent
;
sent
+=
cl
->
framebufferUpdateMessagesSent
;
...
@@ -17125,7 +17503,7 @@ int fb_update_sent(int *count) {
...
@@ -17125,7 +17503,7 @@ int fb_update_sent(int *count) {
return
rc
;
return
rc
;
}
}
static
void
check_user_input
4
(
double
dt
,
double
dtr
,
int
tile_diffs
)
{
static
void
check_user_input
5
(
double
dt
,
double
dtr
,
int
tile_diffs
)
{
int
g
,
g_in
,
i
,
ginput
,
gcnt
,
tmp
;
int
g
,
g_in
,
i
,
ginput
,
gcnt
,
tmp
;
int
last_was_miss
,
consecutive_misses
;
int
last_was_miss
,
consecutive_misses
;
...
@@ -17364,9 +17742,11 @@ static int check_user_input(double dt, double dtr, int tile_diffs, int *cnt) {
...
@@ -17364,9 +17742,11 @@ static int check_user_input(double dt, double dtr, int tile_diffs, int *cnt) {
if
(
pointer_mode
==
2
)
{
if
(
pointer_mode
==
2
)
{
check_user_input2
(
dt
);
check_user_input2
(
dt
);
}
else
if
(
pointer_mode
==
3
)
{
}
else
if
(
pointer_mode
==
3
)
{
check_user_input3
(
dt
,
dtr
,
tile_diffs
);
check_user_input3
(
dt
);
}
else
if
(
pointer_mode
==
4
)
{
}
else
if
(
pointer_mode
==
4
)
{
check_user_input4
(
dt
,
dtr
,
tile_diffs
);
check_user_input4
(
dt
,
dtr
,
tile_diffs
);
}
else
if
(
pointer_mode
==
5
)
{
check_user_input5
(
dt
,
dtr
,
tile_diffs
);
}
}
return
0
;
return
0
;
}
}
...
@@ -17749,15 +18129,10 @@ static void watch_loop(void) {
...
@@ -17749,15 +18129,10 @@ static void watch_loop(void) {
continue
;
continue
;
}
}
if
(
us
ing
_xdamage
)
{
if
(
us
e
_xdamage
)
{
check_xdamage_state
();
check_xdamage_state
();
}
}
if
(
watch_bell
)
{
/* n.b. assumes -nofb folks do not want bell... */
check_bell_event
();
}
if
(
button_mask
&&
(
!
show_dragging
||
pointer_mode
==
0
))
{
if
(
button_mask
&&
(
!
show_dragging
||
pointer_mode
==
0
))
{
/*
/*
* if any button is pressed do not update rfb
* if any button is pressed do not update rfb
...
@@ -17795,6 +18170,7 @@ static void watch_loop(void) {
...
@@ -17795,6 +18170,7 @@ static void watch_loop(void) {
* text printed out under -help option
* text printed out under -help option
*/
*/
static
void
print_help
(
int
mode
)
{
static
void
print_help
(
int
mode
)
{
#if !SMALL_FOOTPRINT
char
help
[]
=
char
help
[]
=
"
\n
"
"
\n
"
"x11vnc: allow VNC connections to real X11 displays. %s
\n
"
"x11vnc: allow VNC connections to real X11 displays. %s
\n
"
...
@@ -17882,6 +18258,7 @@ static void print_help(int mode) {
...
@@ -17882,6 +18258,7 @@ static void print_help(int mode) {
" also use
\"
TrueColor
\"
, etc. see <X11/X.h> for a list.
\n
"
" also use
\"
TrueColor
\"
, etc. see <X11/X.h> for a list.
\n
"
" If the string ends in
\"
:m
\"
then for better or for
\n
"
" If the string ends in
\"
:m
\"
then for better or for
\n
"
" worse the visual depth is forced to be m.
\n
"
" worse the visual depth is forced to be m.
\n
"
"
\n
"
"-overlay Handle multiple depth visuals on one screen, e.g. 8+24
\n
"
"-overlay Handle multiple depth visuals on one screen, e.g. 8+24
\n
"
" and 24+8 overlay visuals (the 32 bits per pixel are
\n
"
" and 24+8 overlay visuals (the 32 bits per pixel are
\n
"
" packed with 8 for PseudoColor and 24 for TrueColor).
\n
"
" packed with 8 for PseudoColor and 24 for TrueColor).
\n
"
...
@@ -17919,7 +18296,7 @@ static void print_help(int mode) {
...
@@ -17919,7 +18296,7 @@ static void print_help(int mode) {
" If
\"
fraction
\"
contains a decimal point
\"
.
\"
it
\n
"
" If
\"
fraction
\"
contains a decimal point
\"
.
\"
it
\n
"
" is taken as a floating point number, alternatively
\n
"
" is taken as a floating point number, alternatively
\n
"
" the notation
\"
m/n
\"
may be used to denote fractions
\n
"
" the notation
\"
m/n
\"
may be used to denote fractions
\n
"
" exactly, e.g. -scale 2/3
.
\n
"
" exactly, e.g. -scale 2/3
\n
"
"
\n
"
"
\n
"
" Scaling Options: can be added after
\"
fraction
\"
via
\n
"
" Scaling Options: can be added after
\"
fraction
\"
via
\n
"
"
\"
:
\"
, to supply multiple
\"
:
\"
options use commas.
\n
"
"
\"
:
\"
, to supply multiple
\"
:
\"
options use commas.
\n
"
...
@@ -17992,6 +18369,11 @@ static void print_help(int mode) {
...
@@ -17992,6 +18369,11 @@ static void print_help(int mode) {
" vice versa) to avoid situations where no connections
\n
"
" vice versa) to avoid situations where no connections
\n
"
" (or too many) are allowed.
\n
"
" (or too many) are allowed.
\n
"
"
\n
"
"
\n
"
"-nolookup Do not use gethostbyname() or gethostbyaddr() to look up
\n
"
" host names or IP numbers. Use this if name resolution
\n
"
" is incorrectly set up and leads to long pauses as name
\n
"
" lookup times out, etc.
\n
"
"
\n
"
"-input string Fine tuning of allowed user input. If
\"
string
\"
does
\n
"
"-input string Fine tuning of allowed user input. If
\"
string
\"
does
\n
"
" not contain a comma
\"
,
\"
the tuning applies only to
\n
"
" not contain a comma
\"
,
\"
the tuning applies only to
\n
"
" normal clients. Otherwise the part before
\"
,
\"
is
\n
"
" normal clients. Otherwise the part before
\"
,
\"
is
\n
"
...
@@ -18019,6 +18401,7 @@ static void print_help(int mode) {
...
@@ -18019,6 +18401,7 @@ static void print_help(int mode) {
"-storepasswd pass file Store password
\"
pass
\"
as the VNC password in the
\n
"
"-storepasswd pass file Store password
\"
pass
\"
as the VNC password in the
\n
"
" file
\"
file
\"
. Once the password is stored the
\n
"
" file
\"
file
\"
. Once the password is stored the
\n
"
" program exits. Use the password via
\"
-rfbauth file
\"\n
"
" program exits. Use the password via
\"
-rfbauth file
\"\n
"
"
\n
"
"-accept string Run a command (possibly to prompt the user at the
\n
"
"-accept string Run a command (possibly to prompt the user at the
\n
"
" X11 display) to decide whether an incoming client
\n
"
" X11 display) to decide whether an incoming client
\n
"
" should be allowed to connect or not.
\"
string
\"
is
\n
"
" should be allowed to connect or not.
\"
string
\"
is
\n
"
...
@@ -18232,6 +18615,7 @@ static void print_help(int mode) {
...
@@ -18232,6 +18615,7 @@ static void print_help(int mode) {
" to the terminal. Same as
\"
-logfile file
\"
. To append
\n
"
" to the terminal. Same as
\"
-logfile file
\"
. To append
\n
"
" to the file use
\"
-oa file
\"
or
\"
-logappend file
\"
.
\n
"
" to the file use
\"
-oa file
\"
or
\"
-logappend file
\"
.
\n
"
"-rc filename Use
\"
filename
\"
instead of $HOME/.x11vncrc for rc file.
\n
"
"-rc filename Use
\"
filename
\"
instead of $HOME/.x11vncrc for rc file.
\n
"
"
\n
"
"-norc Do not process any .x11vncrc file for options.
\n
"
"-norc Do not process any .x11vncrc file for options.
\n
"
"-h, -help Print this help text.
\n
"
"-h, -help Print this help text.
\n
"
"-?, -opts Only list the x11vnc options.
\n
"
"-?, -opts Only list the x11vnc options.
\n
"
...
@@ -18492,19 +18876,24 @@ static void print_help(int mode) {
...
@@ -18492,19 +18876,24 @@ static void print_help(int mode) {
" n=2 is an improved scheme: by watching the current rate
\n
"
" n=2 is an improved scheme: by watching the current rate
\n
"
" of input events it tries to detect if it should try to
\n
"
" of input events it tries to detect if it should try to
\n
"
"
\"
eat
\"
additional pointer events before continuing.
\n
"
"
\"
eat
\"
additional pointer events before continuing.
\n
"
" This mode was the default until Apr 2005.
\n
"
"
\n
"
" n=3 is basically the same as n=2 except with slightly
\n
"
" tweaked parameters. We made this a new one so one
\n
"
" could use -pm 2 for the old behavior.
\n
"
"
\n
"
"
\n
"
" n=
3
is basically a dynamic -nodragging mode: it detects
\n
"
" n=
4
is basically a dynamic -nodragging mode: it detects
\n
"
" when the mouse motion has paused and then refreshes
\n
"
" when the mouse motion has paused and then refreshes
\n
"
" the display.
\n
"
" the display.
\n
"
"
\n
"
"
\n
"
" n=
4:
attempts to measures network rates and latency,
\n
"
" n=
5
attempts to measures network rates and latency,
\n
"
" the video card read rate, and how many tiles have been
\n
"
" the video card read rate, and how many tiles have been
\n
"
" changed on the screen. From this, it aggressively tries
\n
"
" changed on the screen. From this, it aggressively tries
\n
"
" to push screen
\"
frames
\"
when it decides it has enough
\n
"
" to push screen
\"
frames
\"
when it decides it has enough
\n
"
" resources to do so. NOT FINISHED.
\n
"
" resources to do so. NOT FINISHED.
\n
"
"
\n
"
"
\n
"
" The default n is %d. Note that modes 2, 3, 4
will skip
\n
"
" The default n is %d. Note that modes 2, 3, 4
, 5 will
\n
"
" -input_skip keyboard events (but it will not count
\n
"
"
skip
-input_skip keyboard events (but it will not count
\n
"
" pointer events). Also note that these modes are not
\n
"
" pointer events). Also note that these modes are not
\n
"
" available in -threads mode which has its own pointer
\n
"
" available in -threads mode which has its own pointer
\n
"
" event handling mechanism.
\n
"
" event handling mechanism.
\n
"
...
@@ -18530,14 +18919,16 @@ static void print_help(int mode) {
...
@@ -18530,14 +18919,16 @@ static void print_help(int mode) {
" e.g.
\"
-speeds ,100,15
\"
, then the internal scheme is
\n
"
" e.g.
\"
-speeds ,100,15
\"
, then the internal scheme is
\n
"
" used to estimate the empty value(s).
\n
"
" used to estimate the empty value(s).
\n
"
"
\n
"
"
\n
"
" Note: use this option is currently NOT FINISHED.
\n
"
"
\n
"
" Typical PC video cards have read rates of 5-10 MB/sec.
\n
"
" Typical PC video cards have read rates of 5-10 MB/sec.
\n
"
" If the framebuffer is in main memory instead of video
\n
"
" If the framebuffer is in main memory instead of video
\n
"
" h/w (e.g. SunRay, shadowfb, Xvfb), the read rate may
\n
"
" h/w (e.g. SunRay, shadowfb, Xvfb), the read rate may
\n
"
" be much faster.
\"
x11perf -getimage500
\"
can be used
\n
"
" be much faster.
\"
x11perf -getimage500
\"
can be used
\n
"
" to get a lower bound (remember to factor in the bytes
\n
"
" to get a lower bound (remember to factor in the bytes
\n
"
" per pixel). It is up to you to estimate the network
\n
"
" per pixel). It is up to you to estimate the network
\n
"
" bandwith
to clients. For the latency the ping(1)
\n
"
" bandwith
and latency to clients. For the latency the
\n
"
" command can be used.
\n
"
"
ping(1)
command can be used.
\n
"
"
\n
"
"
\n
"
" For convenience there are some aliases provided,
\n
"
" For convenience there are some aliases provided,
\n
"
" e.g.
\"
-speeds modem
\"
. The aliases are:
\"
modem
\"
for
\n
"
" e.g.
\"
-speeds modem
\"
. The aliases are:
\"
modem
\"
for
\n
"
...
@@ -18749,8 +19140,8 @@ static void print_help(int mode) {
...
@@ -18749,8 +19140,8 @@ static void print_help(int mode) {
" same as
\"
close:host
\"
. Use host
\n
"
" same as
\"
close:host
\"
. Use host
\n
"
"
\"
all
\"
to close all current clients.
\n
"
"
\"
all
\"
to close all current clients.
\n
"
" If you know the client internal hex ID,
\n
"
" If you know the client internal hex ID,
\n
"
" e.g. 0x3 (returned by
-query clients and
\n
"
" e.g. 0x3 (returned by
\"
-query clients
\"
\n
"
"
RFB_CLIENT_ID),
you can use that too.
\n
"
"
and RFB_CLIENT_ID)
you can use that too.
\n
"
/* access */
/* access */
" allowonce:host For the next connection only, allow
\n
"
" allowonce:host For the next connection only, allow
\n
"
" connection from
\"
host
\"
.
\n
"
" connection from
\"
host
\"
.
\n
"
...
@@ -18763,6 +19154,8 @@ static void print_help(int mode) {
...
@@ -18763,6 +19154,8 @@ static void print_help(int mode) {
" localhost enable -localhost mode
\n
"
" localhost enable -localhost mode
\n
"
" nolocalhost disable -localhost mode
\n
"
" nolocalhost disable -localhost mode
\n
"
" listen:str set -listen to str, empty to disable.
\n
"
" listen:str set -listen to str, empty to disable.
\n
"
" nolookup enable -nolookup mode.
\n
"
" lookup disable -nolookup mode.
\n
"
" input:str set -input to
\"
str
\"
, empty to disable.
\n
"
" input:str set -input to
\"
str
\"
, empty to disable.
\n
"
" client_input:str set the K, M, B -input on a per-client
\n
"
" client_input:str set the K, M, B -input on a per-client
\n
"
" basis. select which client as for
\n
"
" basis. select which client as for
\n
"
...
@@ -18937,9 +19330,9 @@ static void print_help(int mode) {
...
@@ -18937,9 +19330,9 @@ static void print_help(int mode) {
" nooverlay_nocursor nooverlay_cursor nooverlay_yescursor
\n
"
" nooverlay_nocursor nooverlay_cursor nooverlay_yescursor
\n
"
" overlay_nocursor visual scale scale_cursor viewonly
\n
"
" overlay_nocursor visual scale scale_cursor viewonly
\n
"
" noviewonly shared noshared forever noforever once
\n
"
" noviewonly shared noshared forever noforever once
\n
"
" timeout deny lock nodeny unlock connect allowonce
\n
"
" timeout deny lock nodeny unlock connect allowonce
allow
\n
"
"
allow localhost nolocalhost listen accept gone
\n
"
"
localhost nolocalhost listen lookup nolookup accept
\n
"
" shm noshm flipbyteorder noflipbyteorder onetile
\n
"
"
gone
shm noshm flipbyteorder noflipbyteorder onetile
\n
"
" noonetile solid_color solid nosolid blackout xinerama
\n
"
" noonetile solid_color solid nosolid blackout xinerama
\n
"
" noxinerama xrandr noxrandr xrandr_mode padgeom quiet
\n
"
" noxinerama xrandr noxrandr xrandr_mode padgeom quiet
\n
"
" q noquiet modtweak nomodtweak xkb noxkb skip_keycodes
\n
"
" q noquiet modtweak nomodtweak xkb noxkb skip_keycodes
\n
"
...
@@ -18975,10 +19368,10 @@ static void print_help(int mode) {
...
@@ -18975,10 +19368,10 @@ static void print_help(int mode) {
"-sync By default -remote commands are run asynchronously, that
\n
"
"-sync By default -remote commands are run asynchronously, that
\n
"
" is, the request is posted and the program immediately
\n
"
" is, the request is posted and the program immediately
\n
"
" exits. Use -sync to have the program wait for an
\n
"
" exits. Use -sync to have the program wait for an
\n
"
" acknowledgement from the x11vnc server that command
\n
"
" acknowledgement from the x11vnc server that command
was
\n
"
"
was processed. On the other hand -query requests are
\n
"
"
processed (somehow). On the other hand -query requests
\n
"
" a
lways processed synchronously because they have wait
\n
"
" a
re always processed synchronously because they have
\n
"
" for the result.
\n
"
"
to wait
for the result.
\n
"
"
\n
"
"
\n
"
" Also note that if both -remote and -query requests are
\n
"
" Also note that if both -remote and -query requests are
\n
"
" supplied on the command line, the -remote is processed
\n
"
" supplied on the command line, the -remote is processed
\n
"
...
@@ -18994,19 +19387,21 @@ static void print_help(int mode) {
...
@@ -18994,19 +19387,21 @@ static void print_help(int mode) {
"-noremote Do not process any remote control commands or queries.
\n
"
"-noremote Do not process any remote control commands or queries.
\n
"
"
\n
"
"
\n
"
" A note about security wrt remote control commands.
\n
"
" A note about security wrt remote control commands.
\n
"
" If someone can connect to the X display and change the
\n
"
" If someone can connect to the X display and change
\n
"
" property VNC_CONNECT, then they can remotely control
\n
"
" the property VNC_CONNECT, then they can remotely
\n
"
" x11vnc. Normally access to the X display is protected.
\n
"
" control x11vnc. Normally access to the X display is
\n
"
" Note that if they can modify VNC_CONNECT, they could
\n
"
" protected. Note that if they can modify VNC_CONNECT
\n
"
" also run their own x11vnc and have complete control
\n
"
" on the X server, they have enough permissions to also
\n
"
" run their own x11vnc and thus have complete control
\n
"
" of the desktop. If the
\"
-connect /path/to/file
\"\n
"
" of the desktop. If the
\"
-connect /path/to/file
\"\n
"
" channel is being used, obviously anyone who can
\n
"
" channel is being used, obviously anyone who can
write
\n
"
"
write to /path/to/file can remotely control x11vnc.
\n
"
"
to /path/to/file can remotely control x11vnc. So be
\n
"
"
So be sure to protect the X display and that file's
\n
"
"
sure to protect the X display and that file's write
\n
"
"
write
permissions.
\n
"
" permissions.
\n
"
"
\n
"
"
\n
"
" To disable the VNC_CONNECT property channel completely
\n
"
" If you are paranoid and do not think -noremote is
\n
"
" use -novncconnect.
\n
"
" enough, to disable the VNC_CONNECT property channel
\n
"
" completely use -novncconnect.
\n
"
"
\n
"
"
\n
"
"-unsafe If x11vnc is running as root (e.g. inetd or Xsetup for
\n
"
"-unsafe If x11vnc is running as root (e.g. inetd or Xsetup for
\n
"
" a display manager) a few remote commands are disabled
\n
"
" a display manager) a few remote commands are disabled
\n
"
...
@@ -19080,6 +19475,7 @@ static void print_help(int mode) {
...
@@ -19080,6 +19475,7 @@ static void print_help(int mode) {
);
);
rfbUsage
();
rfbUsage
();
#endif
exit
(
1
);
exit
(
1
);
}
}
...
@@ -19436,7 +19832,6 @@ int main(int argc, char* argv[]) {
...
@@ -19436,7 +19832,6 @@ int main(int argc, char* argv[]) {
int
vpw_loc
=
-
1
;
int
vpw_loc
=
-
1
;
int
dt
=
0
,
bg
=
0
;
int
dt
=
0
,
bg
=
0
;
int
got_rfbwait
=
0
,
got_deferupdate
=
0
,
got_defer
=
0
;
int
got_rfbwait
=
0
,
got_deferupdate
=
0
,
got_defer
=
0
;
int
got_noxdamage
=
0
;
/* used to pass args we do not know about to rfbGetScreen(): */
/* used to pass args we do not know about to rfbGetScreen(): */
int
argc_vnc
=
1
;
char
*
argv_vnc
[
128
];
int
argc_vnc
=
1
;
char
*
argv_vnc
[
128
];
...
@@ -19578,6 +19973,8 @@ int main(int argc, char* argv[]) {
...
@@ -19578,6 +19973,8 @@ int main(int argc, char* argv[]) {
allow_list
=
strdup
(
argv
[
++
i
]);
allow_list
=
strdup
(
argv
[
++
i
]);
}
else
if
(
!
strcmp
(
arg
,
"-localhost"
))
{
}
else
if
(
!
strcmp
(
arg
,
"-localhost"
))
{
allow_list
=
strdup
(
"127.0.0.1"
);
allow_list
=
strdup
(
"127.0.0.1"
);
}
else
if
(
!
strcmp
(
arg
,
"-nolookup"
))
{
host_lookup
=
0
;
}
else
if
(
!
strcmp
(
arg
,
"-input"
))
{
}
else
if
(
!
strcmp
(
arg
,
"-input"
))
{
CHECK_ARGC
CHECK_ARGC
allowed_input_str
=
strdup
(
argv
[
++
i
]);
allowed_input_str
=
strdup
(
argv
[
++
i
]);
...
@@ -19707,8 +20104,10 @@ int main(int argc, char* argv[]) {
...
@@ -19707,8 +20104,10 @@ int main(int argc, char* argv[]) {
nofb
=
1
;
nofb
=
1
;
}
else
if
(
!
strcmp
(
arg
,
"-nobell"
))
{
}
else
if
(
!
strcmp
(
arg
,
"-nobell"
))
{
watch_bell
=
0
;
watch_bell
=
0
;
sound_bell
=
0
;
}
else
if
(
!
strcmp
(
arg
,
"-nosel"
))
{
}
else
if
(
!
strcmp
(
arg
,
"-nosel"
))
{
watch_selection
=
0
;
watch_selection
=
0
;
watch_primary
=
0
;
}
else
if
(
!
strcmp
(
arg
,
"-noprimary"
))
{
}
else
if
(
!
strcmp
(
arg
,
"-noprimary"
))
{
watch_primary
=
0
;
watch_primary
=
0
;
}
else
if
(
!
strcmp
(
arg
,
"-cursor"
))
{
}
else
if
(
!
strcmp
(
arg
,
"-cursor"
))
{
...
@@ -19745,6 +20144,7 @@ int main(int argc, char* argv[]) {
...
@@ -19745,6 +20144,7 @@ int main(int argc, char* argv[]) {
cursor_shape_updates
=
0
;
cursor_shape_updates
=
0
;
}
else
if
(
!
strcmp
(
arg
,
"-cursorpos"
))
{
}
else
if
(
!
strcmp
(
arg
,
"-cursorpos"
))
{
cursor_pos_updates
=
1
;
cursor_pos_updates
=
1
;
got_cursorpos
=
1
;
}
else
if
(
!
strcmp
(
arg
,
"-nocursorpos"
))
{
}
else
if
(
!
strcmp
(
arg
,
"-nocursorpos"
))
{
cursor_pos_updates
=
0
;
cursor_pos_updates
=
0
;
}
else
if
(
!
strcmp
(
arg
,
"-xwarppointer"
))
{
}
else
if
(
!
strcmp
(
arg
,
"-xwarppointer"
))
{
...
@@ -19769,6 +20169,7 @@ int main(int argc, char* argv[]) {
...
@@ -19769,6 +20169,7 @@ int main(int argc, char* argv[]) {
pointer_mode_max
,
atoi
(
s
));
pointer_mode_max
,
atoi
(
s
));
}
else
{
}
else
{
pointer_mode
=
atoi
(
s
);
pointer_mode
=
atoi
(
s
);
got_pointer_mode
=
pointer_mode
;
}
}
}
else
if
(
!
strcmp
(
arg
,
"-input_skip"
))
{
}
else
if
(
!
strcmp
(
arg
,
"-input_skip"
))
{
CHECK_ARGC
CHECK_ARGC
...
@@ -19798,9 +20199,7 @@ int main(int argc, char* argv[]) {
...
@@ -19798,9 +20199,7 @@ int main(int argc, char* argv[]) {
CHECK_ARGC
CHECK_ARGC
screen_blank
=
atoi
(
argv
[
++
i
]);
screen_blank
=
atoi
(
argv
[
++
i
]);
}
else
if
(
!
strcmp
(
arg
,
"-noxdamage"
))
{
}
else
if
(
!
strcmp
(
arg
,
"-noxdamage"
))
{
using_xdamage
=
0
;
use_xdamage
=
0
;
use_xdamage_hints
=
0
;
got_noxdamage
=
1
;
}
else
if
(
!
strcmp
(
arg
,
"-xd_area"
))
{
}
else
if
(
!
strcmp
(
arg
,
"-xd_area"
))
{
int
tn
;
int
tn
;
CHECK_ARGC
CHECK_ARGC
...
@@ -20112,21 +20511,15 @@ int main(int argc, char* argv[]) {
...
@@ -20112,21 +20511,15 @@ int main(int argc, char* argv[]) {
if
(
nofb
)
{
if
(
nofb
)
{
/* disable things that do not make sense with no fb */
/* disable things that do not make sense with no fb */
using_shm
=
0
;
set_nofb_params
();
flash_cmap
=
0
;
show_cursor
=
0
;
show_multiple_cursors
=
0
;
overlay
=
0
;
overlay_cursor
=
0
;
if
(
!
quiet
)
{
rfbLog
(
"disabling -cursor, fb, shm, etc. in "
"-nofb mode.
\n
"
);
}
if
(
!
got_deferupdate
&&
!
got_defer
)
{
if
(
!
got_deferupdate
&&
!
got_defer
)
{
/* reduce defer time under -nofb */
/* reduce defer time under -nofb */
defer_update
=
defer_update_nofb
;
defer_update
=
defer_update_nofb
;
}
}
if
(
got_pointer_mode
<
0
)
{
pointer_mode
=
POINTER_MODE_NOFB
;
}
}
}
if
(
!
got_deferupdate
)
{
if
(
!
got_deferupdate
)
{
...
@@ -20259,7 +20652,7 @@ int main(int argc, char* argv[]) {
...
@@ -20259,7 +20652,7 @@ int main(int argc, char* argv[]) {
fprintf
(
stderr
,
" waitms: %d
\n
"
,
waitms
);
fprintf
(
stderr
,
" waitms: %d
\n
"
,
waitms
);
fprintf
(
stderr
,
" take_naps: %d
\n
"
,
take_naps
);
fprintf
(
stderr
,
" take_naps: %d
\n
"
,
take_naps
);
fprintf
(
stderr
,
" sb: %d
\n
"
,
screen_blank
);
fprintf
(
stderr
,
" sb: %d
\n
"
,
screen_blank
);
fprintf
(
stderr
,
" xdamage: %d
\n
"
,
!
got_no
xdamage
);
fprintf
(
stderr
,
" xdamage: %d
\n
"
,
use_
xdamage
);
fprintf
(
stderr
,
" xd_area: %d
\n
"
,
xdamage_max_area
);
fprintf
(
stderr
,
" xd_area: %d
\n
"
,
xdamage_max_area
);
fprintf
(
stderr
,
" xd_mem: %.3f
\n
"
,
xdamage_memory
);
fprintf
(
stderr
,
" xd_mem: %.3f
\n
"
,
xdamage_memory
);
fprintf
(
stderr
,
" sigpipe: %s
\n
"
,
sigpipe
fprintf
(
stderr
,
" sigpipe: %s
\n
"
,
sigpipe
...
@@ -20287,13 +20680,6 @@ int main(int argc, char* argv[]) {
...
@@ -20287,13 +20680,6 @@ int main(int argc, char* argv[]) {
if
(
auth_file
)
{
if
(
auth_file
)
{
set_env
(
"XAUTHORITY"
,
auth_file
);
set_env
(
"XAUTHORITY"
,
auth_file
);
}
}
if
(
watch_bell
||
use_xkb_modtweak
)
{
/* we need XKEYBOARD for these: */
use_xkb
=
1
;
}
if
(
xkbcompat
)
{
use_xkb
=
0
;
}
#if LIBVNCSERVER_HAVE_XKEYBOARD
#if LIBVNCSERVER_HAVE_XKEYBOARD
/*
/*
* Disable XKEYBOARD before calling XOpenDisplay()
* Disable XKEYBOARD before calling XOpenDisplay()
...
@@ -20311,7 +20697,6 @@ int main(int argc, char* argv[]) {
...
@@ -20311,7 +20697,6 @@ int main(int argc, char* argv[]) {
}
}
}
}
#else
#else
use_xkb
=
0
;
watch_bell
=
0
;
watch_bell
=
0
;
use_xkb_modtweak
=
0
;
use_xkb_modtweak
=
0
;
#endif
#endif
...
@@ -20387,11 +20772,15 @@ int main(int argc, char* argv[]) {
...
@@ -20387,11 +20772,15 @@ int main(int argc, char* argv[]) {
rfbLog
(
"Disabling XFIXES mode: display does not "
rfbLog
(
"Disabling XFIXES mode: display does not "
"support it.
\n
"
);
"support it.
\n
"
);
}
}
xfixes_base_event_type
=
0
;
xfixes_present
=
0
;
xfixes_present
=
0
;
}
else
{
}
else
{
xfixes_present
=
1
;
xfixes_present
=
1
;
}
}
#endif
#endif
if
(
!
xfixes_present
)
{
use_xfixes
=
0
;
}
#if LIBVNCSERVER_HAVE_LIBXDAMAGE
#if LIBVNCSERVER_HAVE_LIBXDAMAGE
if
(
!
XDamageQueryExtension
(
dpy
,
&
xdamage_base_event_type
,
&
er
))
{
if
(
!
XDamageQueryExtension
(
dpy
,
&
xdamage_base_event_type
,
&
er
))
{
...
@@ -20399,12 +20788,16 @@ int main(int argc, char* argv[]) {
...
@@ -20399,12 +20788,16 @@ int main(int argc, char* argv[]) {
rfbLog
(
"Disabling X DAMAGE mode: display does not "
rfbLog
(
"Disabling X DAMAGE mode: display does not "
"support it.
\n
"
);
"support it.
\n
"
);
}
}
xdamage_base_event_type
=
0
;
xdamage_present
=
0
;
xdamage_present
=
0
;
}
else
{
}
else
{
xdamage_present
=
1
;
xdamage_present
=
1
;
}
}
#endif
#endif
if
(
!
quiet
&&
xdamage_present
&&
!
got_noxdamage
)
{
if
(
!
xdamage_present
)
{
use_xdamage
=
0
;
}
if
(
!
quiet
&&
xdamage_present
&&
use_xdamage
)
{
rfbLog
(
"X DAMAGE available on display, using it for"
rfbLog
(
"X DAMAGE available on display, using it for"
" polling hints
\n
"
);
" polling hints
\n
"
);
rfbLog
(
" to disable this behavior use: "
rfbLog
(
" to disable this behavior use: "
...
@@ -20536,7 +20929,7 @@ int main(int argc, char* argv[]) {
...
@@ -20536,7 +20929,7 @@ int main(int argc, char* argv[]) {
single_copytile_orig
=
single_copytile
;
single_copytile_orig
=
single_copytile
;
/* check for MIT-SHM */
/* check for MIT-SHM */
if
(
!
nofb
&&
!
XShmQueryExtension_wr
(
dpy
))
{
if
(
!
XShmQueryExtension_wr
(
dpy
))
{
xshm_present
=
0
;
xshm_present
=
0
;
if
(
!
using_shm
)
{
if
(
!
using_shm
)
{
if
(
!
quiet
)
{
if
(
!
quiet
)
{
...
@@ -20565,11 +20958,9 @@ int main(int argc, char* argv[]) {
...
@@ -20565,11 +20958,9 @@ int main(int argc, char* argv[]) {
#if LIBVNCSERVER_HAVE_XKEYBOARD
#if LIBVNCSERVER_HAVE_XKEYBOARD
/* check for XKEYBOARD */
/* check for XKEYBOARD */
if
(
use_xkb
)
{
initialize_xkb
();
initialize_xkb
();
}
initialize_watch_bell
();
initialize_watch_bell
();
if
(
!
use_xkb
&&
use_xkb_modtweak
)
{
if
(
!
xkb_present
&&
use_xkb_modtweak
)
{
if
(
!
quiet
)
{
if
(
!
quiet
)
{
rfbLog
(
"warning: disabling xkb modtweak."
rfbLog
(
"warning: disabling xkb modtweak."
" XKEYBOARD ext. not present.
\n
"
);
" XKEYBOARD ext. not present.
\n
"
);
...
@@ -20584,6 +20975,7 @@ int main(int argc, char* argv[]) {
...
@@ -20584,6 +20975,7 @@ int main(int argc, char* argv[]) {
rfbLog
(
"Disabling -xrandr mode: display does not"
rfbLog
(
"Disabling -xrandr mode: display does not"
" support X RANDR.
\n
"
);
" support X RANDR.
\n
"
);
}
}
xrandr_base_event_type
=
0
;
xrandr
=
0
;
xrandr
=
0
;
xrandr_present
=
0
;
xrandr_present
=
0
;
}
else
{
}
else
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment