summaryrefslogtreecommitdiffstats
path: root/x11vnc/tkx11vnc
diff options
context:
space:
mode:
Diffstat (limited to 'x11vnc/tkx11vnc')
-rwxr-xr-xx11vnc/tkx11vnc7335
1 files changed, 0 insertions, 7335 deletions
diff --git a/x11vnc/tkx11vnc b/x11vnc/tkx11vnc
deleted file mode 100755
index c87d753..0000000
--- a/x11vnc/tkx11vnc
+++ /dev/null
@@ -1,7335 +0,0 @@
-#!/bin/sh
-# the next line restarts using wish. \
-exec wish "$0" "$@"
-catch {rename send {}}
-#
-# Copyright (C) 2004-2009 Karl J. Runge <runge@karlrunge.com>
-# All rights reserved.
-#
-# This is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-# USA.
-
-#
-# tkx11vnc v0.2
-# This is a simple frontend to x11vnc. It uses the remote control
-# and query features (-remote/-query aka -R/-Q) to interact with it.
-# It is just a quick-n-dirty hack (it parses -help output, etc), but
-# it could be of use playing with or learning about the (way too) many
-# parameters x11vnc has.
-#
-# It can be used to interact with a running x11vnc (see the x11vnc
-# -gui option), or to set the parameters and then start up x11vnc.
-#
-
-#
-# Below is a simple picture of how the gui should be laid out and how
-# the menus should be organized. Most menu items correspond to remote
-# control commands. A trailing ":" after the item name means it is a string
-# to be set rather than a boolean that can be toggled (e.g. the entry
-# box must be used).
-#
-# Some tweak options may be set in the prefix "=" string.
-# A means it is an "Action" (not a true variable)
-# R means it is an action only valid in remote mode.
-# S means it is an action only valid in startup mode.
-# Q means it is an action worth querying after running.
-# P means the string can be +/- appended/deleted (string may not
-# be the same after the remote command)
-# G means gui internal item
-# F means can be set via file browse
-# D means for simple gui
-# -C:val1,... means it will be a checkbox (radio button)
-# the "-" means no other options follow
-# 0 means to skip the item.
-# -- means add a separator
-#
-# The =GAL ... =GAL LOFF stuff is to provide submenus.
-#
-
-global env started time_count
-set started ""
-proc dtime {{msg ""}} {
- global started time_count
- if {$started == ""} {
- return
- }
- set diff [expr "[exec gtod.bin] - $started"]
- set diff [format "%.2f" $diff]
- incr time_count
- if {$msg == ""} {
- set msg $time_count
- }
- puts -nonewline stderr "$msg $diff "
- puts stderr [clock format [clock seconds]]
-}
-
-if [info exists env(X11VNC_GUI_TIME)] {
- global started time_count
- set started [exec gtod.bin]
- set time_count 0
- dtime "S"
-}
-
-proc set_template {} {
- global template
- set template "
-Row: Actions Clients Permissions Keyboard Pointer Help
-Row: Displays Screen Tuning Debugging Misc
-
-Actions
- =SA start
- =RA stop
- --
- =DSA attach
- =DRA detach
- --
- =RA ping
- =RA update-all
- =GAL Settings::
- =GA save-settings
- =SFA load-settings:
- =SA defaults-all
- =0SA clear-all
- --
- =F rc:
- norc
- =GAL LOFF
- -- D
- =DRA stop+quit
- =DGA Quit
-
-Help
- =DGA gui
- =DGA all
-
-Clients
- =DRQA current:
- =DF connect:
- =DRQA disconnect:
- --
- accept:
- afteraccept:
- gone:
- vncconnect
- zeroconf
- -- D
- tightfilexfer
- ultrafilexfer
- proxy:
- =GAL Chat::
- chatwindow
- =DRA chaton
- =DRA chatoff
- =GAL LOFF
- =GAL Java-applet::
- =D http
- httpdir:
- httpport:
- https:
- httpsredir:
- enablehttpproxy
- =GAL LOFF
-
-Displays
- =D display:
- =F auth:
- =S reflect:
- =D desktop:
- =D rfbport:
- =S autoport:
- =0 gui:
-
-Screen
- =DRA refresh
- =RA reset
- =RA blacken
- -- D
- =D scale:
- scale_cursor:
- --
- =D solid
- solid_color:
- --
- =GAL OverlayVisuals::
- overlay
- overlay_nocursor
- 8to24
- 8to24_opts:
- =GAL LOFF
- =GAL 8-Bit-Color::
- flashcmap
- shiftcmap:
- notruecolor
- =GAL LOFF
- =GAL SubWindow::
- id:
- sid:
- =RA id_cmd:
- =GAL LOFF
- =GAL ResizeRotate::
- = xrandr
- =-C:resize,newfbsize,exit xrandr_mode:
- rotate:
- padgeom:
- =GAL LOFF
- =GAL Clipping::
- =P blackout:
- xinerama
- clip:
- =GAL LOFF
- =GAL Misc-Screen::
- fixscreen:
- visual:
- rawfb:
- pipeinput:
- uinput_accel:
- uinput_reset:
- uinput_always:
- 24to32
- =GAL LOFF
-
-Keyboard
- =D norepeat
- =D add_keysyms
- modtweak
- xkb
- --
- capslock
- skip_lockkeys
- --
- skip_keycodes:
- skip_dups
- sloppy_keys
- --
- =FP remap:
- clear_mods
- clear_keys
- clear_all
- =RA clear_locks
-
-Pointer
- =D-C:none,arrow,X,some,most cursor:
- =-C:1,2,3,4,5,6 arrow:
- --
- cursorpos
- =D nocursorshape
- --
- noxfixes
- cursor_drag
- =GAL AlphaBlending::
- noalphablend
- alphacut:
- alphafrac:
- alpharemove
- =GAL LOFF
- --
- buttonmap:
- --
- xwarppointer
- always_inject
-
-Misc
- =GD-C:full,icon,tray WindowView:
- =GD simple-gui
- -- D
- =GA all-settings
- =RA remote-cmd:
- =GAL Selection::
- =D nosel
- noprimary
- nosetprimary
- noclipboard
- nosetclipboard
- seldir:
- =GAL LOFF
- =GAL X-ext::
- xtrap
- noxrecord
- =RQA reset_record
- =GAL LOFF
- =GAL MacOSX::
- macnosaver
- macnowait
- macwheel:
- macnoswap
- macnoresize
- maciconanim:
- macmenu
- =GAL LOFF
- --
- 6
- noipv6
- noipv4
- --
- nofb
- =D nobell
- nolookup
- rfbversion:
- bg
- =S loop
- =S loopbg
- =S sleepin:
- =-C:ignore,exit sigpipe:
- =0 inetd
-
-Debugging
- debug_pointer
- debug_keyboard
- =F logfile:
- =GA show-logfile
- =GA tail-logfile
- quiet
- --
- =GA show-start-cmd
- =DG debug_gui
- =GAL Misc-Debug::
- debug_xevents
- debug_xdamage
- =-C:0,1,2,3 debug_wireframe:
- debug_scroll
- debug_tiles
- debug_grabs
- debug_sel
- debug_ncache
- dbg
- =GAL LOFF
-
-Permissions
- =DRQA lock
- =DRQA unlock
- =D shared
- =D forever
- --
- =DFP allow:
- =D localhost
- =RA allowonce:
- listen:
- -- D
- =D viewonly
- input:
- --
- =GAL Passwords::
- passwd:
- viewpasswd:
- =F passwdfile:
- =F rfbauth:
- usepw
- --
- unixpw
- unixpw_list:
- unixpw_nis
- unixpw_nis_list:
- =0 storepasswd
- =GAL LOFF
- =GAL SSL::
- ssl
- =F ssl_pem:
- stunnel
- =F stunnel_pem:
- =F ssldir:
- =F sslverify:
- ssltimeout:
- --
- enc:
- =GAL LOFF
- =GAL Misc-Perms::
- safer
- unsafe
- =RA noremote
- =0S alwaysshared
- =0S nevershared
- =0S dontdisconnect
- =SQA deny_all
- timeout:
- grabkbd
- grabptr
- grabalways
- grablocal:
- forcedpms
- clientdpms
- noserverdpms
- noultraext
- =GAL LOFF
-
-Tuning
- =D-C:0,1,2,3,4 pointer_mode:
- input_skip:
- allinput
- =D nodragging
- -- D
- speeds:
- =D wait:
- defer:
- =D nap
- screen_blank:
- --
- =GAL WireFrame::
- wireframe
- wireframe_mode:
- =-C:never,top,always wirecopyrect:
- =GAL LOFF
- =GAL ScrollCopyRect::
- =-C:never,keys,mouse,always scrollcopyrect:
- scr_area:
- scr_skip:
- scr_inc:
- scr_keys:
- scr_term:
- scr_keyrepeat:
- scr_parms:
- =GAL LOFF
- =GAL XDAMAGE::
- xdamage
- xd_area:
- xd_mem:
- =GAL LOFF
- =GAL Ncache::
- ncache
- ncache_size:
- ncache_cr
- ncache_no_moveraise
- ncache_no_dtchange
- ncache_old_wm
- ncache_no_rootpixmap
- ncache_keep_anims
- ncache_pad:
- =RA ncache_reset_rootpixmap
- =GAL LOFF
- --
- =GAL SharedMemory::
- noshm
- flipbyteorder
- onetile
- =GAL LOFF
- =GAL Misc-Tuning::
- progressive:
- fs:
- gaps:
- grow:
- fuzz:
- extra_fbur:
- wait_ui:
- setdefer:
- nowait_bog
- slow_fb:
- xrefresh:
- readtimeout:
- snapfb
- threads
- wmdt:
- rfbwait:
- nodpms
- nofbpm
- =GAL LOFF
-"
-}
-
-proc set_internal_help {} {
- global helptext helpall
-
- # set some internal item help here:
- set helptext(start) "
-Launch x11vnc with the settings you have prescribed in the gui.
-The x11vnc process is started in an xterm window so you can see the
-output, kill it, etc.
-
-By viewing this help item, the command built so far will be displayed
-in the gui text area. Have a look. If you Press start it will be shown
-as well and you will be asked to confirm running it.
-
-If you want to use a saved profile \"rc file\" you can do \"Misc -> rc\" and
-select the file and simply start x11vnc using the rc file. Alternatively,
-you could first use the \"Actions -> load-settings\" action to load in
-an \"rc file\" and then press \"Actions -> start\" to start up x11vnc
-based on those values.
-"
- set helptext(stop) "
-The \"Actions -> stop\" action sends a signal to the running x11vnc
-server indicating it should shutdown all connections and exit.
-
-The GUI stays running in case you want to start a new x11vnc or attach
-to another one. Use \"Actions -> Quit\" if you then want to have the
-gui exit. Use \"Actions -> stop+quit\" to have both exit at once.
-"
-
- set helptext(show-start-cmd) "
-Displays in the text area what the x11vnc start command (i.e. the command
-run by \"Actions -> start\") looks like for the current values of the
-settings. This can be done even in the attached state. Intended for
-debugging the gui. The help item for \"Actions -> start\" gives the
-same info.
-
-If you want to load in a saved profile \"rc file\" use \"Misc -> rc\"
-and select the file. \"Actions -> load-settings\" does a similar thing
-with an rc-file, but reading the file and setting the gui variables to
-its values.
-"
-
- set helptext(debug_gui) "
-Set debug_gui to get more output printed in the text area.
-"
-
- set helptext(detach) "
-No longer be associated with the x11vnc server. Switch to the
-non-connected state. The x11vnc server keeps running: it does not exit.
-
-You can either later reattach to it \"Actions -> attach\", or start
-up a new x11vnc \"Actions -> start\", or exit \"Actions -> Quit\".
-"
-
- set helptext(attach) "
-Attach to a running x11vnc server, if possible. Switches to connected
-state if successful. Usually the channel used to attach is via the X
-display (VNC_CONNECT rootwin property) being polled by the x11vnc server.
-To change or set the X display to use do \"Displays -> display\".
-
-Sometimes the \"-connect /path/to/filename\" is used as the communcation
-channel. The running x11vnc has to know that \"/path/to/filename\"
-is the communication channel (i.e. it is using the same -connect option).
-"
-
- set helptext(ping) "
-Check if x11vnc still responds to \"ping\" remote command.
-"
-
- set helptext(update-all) "
-Query the x11vnc server for the current values of all variables.
-Populate the values into the gui's database.
-
-Normally the gui will refresh this info every time it interacts with
-the x11vnc server (including after a few minutes of inactivity), so one
-doesn't need to use this action very often (unless something else is
-changing the state of the x11vnc server, or new clients have connected,
-etc).
-"
-
- set helptext(clear-all) "
-Forget any variable settings either entered in by you or set at the
-default. Basically sets everything to 0 or the string (unset).
-
-This action is only available in \"startup\" mode, not when connected
-to a running x11vnc server (in that case the variable settings reflect
-the state of the running x11vnc). To detach from a running x11vnc
-server use \"Actions -> detach\"; to completely stop the x11vnc server
-use \"Actions -> stop\".
-"
-
- set helptext(defaults-all) "
-Reset all variable settings to the default values. Basically sets
-everything to the default queries \"x11vnc -QD var\" retrieved at startup.
-
-This action is only available in \"startup\" mode, not when connected
-to a running x11vnc server (in that case the variable settings reflect
-the state of the running x11vnc). To detach from a running x11vnc
-server use \"Actions -> detach\"; to completely stop the x11vnc server
-use \"Actions -> stop\".
-"
-
- set helptext(load-settings) "
-Read in the \"rc file\" you prescribe in the dialog and then set the
-variables to those in the rc-file. Any variables not mentioned in the
-rc-file are set to their default value.
-
-You could then do \"Actions -> start\" to start x11vnc with these
-parameters. Or you could make some further changes to variables
-using the gui before starting x11vnc.
-
-This action is only available in \"startup\" mode, not when connected
-to a running x11vnc server (in that case the variable settings reflect
-the state of the running x11vnc). To detach from a running x11vnc
-server use \"Actions -> detach\"; to completely stop the x11vnc server
-use \"Actions -> stop\".
-"
-
- set helptext(save-settings) "
-Construct a ~/.x11vncrc file based on the current settings and
-offer to save it in a file (default ~/.x11vncrc). If saved in a
-file other than the default, you can access the profile by using
-the \"-rc <filename>\" option when starting x11vnc.
-
-If an rc file entry begins with \"#d\" that means the current
-setting is at the Default value and so you probably want to leave
-it commented out with the \"#\" character.
-
-If an rc file entry begins with \"#?\" that means we think
-you probably do not really want to force the value to this setting.
-
-In either case, feel free to uncomment the line and/or change any
-of the parameter values in the file.
-"
-
- set helptext(all-settings) "
-Displays the gui's database of all of the x11vnc server's current
-settings. Use \"Actions -> update-all\" or \"Control+R\" to
-refresh this list if it ever gets out of sync.
-"
-
- set helptext(remote-cmd) "
-Run a remote command (-R) or query (-Q) directly. Only a few
-remote commands are not on a menu, but for those few you can
-run the command directly this way. Just enter the command into
-the Entry box when prompted. Use the prefix \"Q:\" to indicate
-a -Q query. Examples: \"zero:20,20,100,100\", \"Q:ext_xfixes\"
-"
-
- set helptext(stop+quit) "
-Send the stop command to the x11vnc server, then terminate the tkx11vnc gui.
-"
-
- set helptext(show-logfile) "
-View the current contents of the logfile (if it exists and is accessible
-by the gui process).
-"
-
- set helptext(tail-logfile) "
-Run the tail(1) command with -f option on the logfile in an xterm.
-(if it exists and is accessible by the gui process).
-"
-
- set helptext(Quit) "
-Terminate the tkx11vnc gui. Any x11vnc server will be left running.
-"
-
- set helptext(current) "
-Shows a menu of currently connected VNC clients on the x11vnc server.
-
-Allows you to find more information about them, change their input
-permissions, or disconnect them.
-
-Note that the File transfer permission only applies to UltraVNC
-file transfer, not TightVNC file transfer.
-
-You will be prompted to confirm any disconnections.
-"
-
- set helptext(client) "
-After selecting a VNC client from the \"Clients -> current\" menu,
-you will be presented with a dialog that shows the information
-about the VNC client.
-
-You can choose to disconnect the client by clicking on the
-\"Disconnect\" checkbox and pressing \"OK\". There will be a
-confirmation dialog to doublecheck.
-
-Alternatively, you can fine tune the VNC client's input permissions
-by selecting any of the Keystrokes, Mouse-Motion, Button-Click,
-Clipboard-Input, or Files checkboxes and pressing \"OK\". This is like
-the \"-input\" option but on a per-client basis.
-
-To not change any aspects of the VNC client press \"Cancel\".
-"
-
- set helptext(solid_color) "
-Set the -solid color value.
-"
-
- set helptext(xrandr_mode) "
-Set the -xrandr mode value.
-"
-
- set helptext(unixpw_list) "
-Set the -unixpw usernames list value.
-"
-
- set helptext(unixpw_nis_list) "
-Set the -unixpw_nis usernames list value.
-"
-
- set helptext(stunnel_pem) "
-Set the -stunnel pem filename value.
-"
-
- set helptext(ssl_pem) "
-Set the -ssl pem filename value.
-"
-
- set helptext(wireframe_mode) "
-Set the -wireframe mode string value.
-"
-
- set helptext(simple-gui) "
-Toggle between menu items corresponding the most basic ones
-and all possible settings. I.e. toggle between a simple gui
-and one for power users.
-"
-
- set helptext(Tray) "
-The tray/icon mode (started with \"x11vnc -gui tray ...\", etc.) presents
-a small icon that indicates the status of the running x11vnc server.
-
-Depending on your environment, this icon may be embedded in a system
-tray or applet dock, or simply be a standalone window. \"-gui tray\"
-will attempt to embed the icon in the system tray, while \"-gui icon\"
-is for a standalone window. Use \"-gui tray=setpass\" (or icon=setpass)
-to be prompted to set the session password at startup.
-
-When the icon has a light background, that means no VNC viewers are
-currently connected to the VNC display.
-
-When the icon has a dark background (i.e. reverse-video), that means at
-least one VNC viewer is connected to the VNC display.
-
-Moving the mouse pointer over the icon will popup a \"status balloon\"
-indicating the VNC display name and the names and info of any connected VNC
-viewers. Press the middle mouse button if the balloon does not appear.
-
-Clicking the left or right mouse button on the icon displays a menu
-of actions:
-
- Properties - Brings up the Properties dialog to set some basic
- parameters. The full tkx11vnc GUI may be accessed
- via the \"Advanced ...\" button. Press \"Help\"
- in the Properties dialog for more info.
-
- Help - Displays this help text.
-
- New Client - Presents an entry box where you type in the name
- of a computer that is running a VNC viewer in
- \"listen\" mode (e.g. vncviewer -listen). For a
- non-standard listening port use \"host:port\".
-
- Pressing \"OK\" will initiate the reverse
- connection. Use a blank hostname to skip it.
-
- Disconnect - Shows a popup menu of connected clients. Click on
- one to disconnect it, or click on \"All Clients\"
- disconnect all clients.
-
- Window View - Switch between the \"full\" gui (also known as
- \"Advanced\"), \"icon\" mode (small icon window with
- popups), or \"tray\" mode (small icon embedded in the
- system tray). This is a shortcut for the action:
- \"Properties -> Advanced -> Misc -> WindowView\".
-
- Stop x11vnc - Directs the x11vnc server to disconnect all vncviewers
- and then exit. The tray/icon GUI then exits as well.
-
- Logfile - Show the logfile if x11vnc is being run with one.
-
- Custom - If you have a \$HOME/.x11vnc.gui file each uncommented
- line in it becomes an additional menu item for this
- menu. The remote control command is run directly
- via \"x11vnc -R <command>\", or if prefixed with
- \"action:\" runs a gui internal action, or if \"sep\"
- adds a separator. Set X11VNC_CUSTOM_GUI to use
- a different filename. Example file contents:
-
- scale:3/4
- scale:1
- scale_cursor:1
- sep
- action:all-settings
- #debug_keyboard
- sep
- action:Quit
-
-Termination:
-
-If the x11vnc server stops for any reason, the tray/icon gui will exit.
-
-If you delete the tray/icon (e.g. X out button), that is the same
-as the \"Stop x11vnc\" action in the menu. (This will disconnect any
-VNC viewer you are currently using to access the display since the
-x11vnc server is terminated).
-
-To terminate the tray/icon gui window but not the x11vnc server press
-Control-C on the tray/icon window. You can also do this (and much
-more) via Properties -> Advanced -> Actions -> Quit
-"
-
- set helptext(NewClient) "
- New Client - Presents an entry box where you type in the name
- of a computer that is running a VNC viewer in
- \"listen\" mode (e.g. vncviewer -listen). For a
- non-standard listening port use \"host:port\".
-
- Pressing \"OK\" will initiate the reverse
- connection. Use a blank hostname to skip it, or
- delete (\"X-out\") the window.
-
-"
-
- set helptext(Properties) "
-The Properties dialog allows you to set some basic parameters of a
-running x11vnc server. After modifying them press \"OK\" or \"Apply\"
-to apply the changes, or press \"Cancel\" to skip applying them.
-
- Accept Connections:
-
- Toggles whether VNC viewers are allowed to connect or not. It corresponds
- to the \"-R unlock\" and \"-R lock\" remote-control commands.
-
- Ask for Confirmation:
-
- Toggles whether a popup menu will be presented at the X display when
- a new VNC viewer attempts to connect. The person sitting at the X
- display can choose to accept or reject the connection or accept the
- connection in ViewOnly mode. It corresponds to the \"-R accept:popup\"
- and \"-R accept:\" remote-control commands.
-
- All Clients ViewOnly:
-
- Toggles whether the entire VNC desktop is view only. All clients
- will only be able to watch when this is set (regardless of how they
- logged in). It corresponds to the \"-R viewonly\" and \"-R noviewonly\"
- remote-control commands.
-
- Shared:
-
- Toggles whether multiple simultaneous viewer connections are allowed
- or not. It corresponds to the \"-R shared\" and \"-R noshared\"
- remote-control commands.
-
- Advertise Service (Zeroconf):
-
- Toggles whether this VNC server should advertize itself via Zeroconf
- (also called Bonjour, mDNS, and avahi). Then VNC viewers can then find
- this service on the local network. It corresponds to the \"-R zeroconf\"
- and \"-R nozeroconf\" remote-control commands.
-
- Serve Java Viewer Applet:
-
- Toggles whether this VNC server should serve up a Java VNC Viewer
- applet via HTTP on http://hostname:5800/ (or port 5800+n for VNC
- port 5900+n). A java enabled Web Browser can then connect to the
- desktopby VNC. If SSL is active then the HTTPS URL https://hostname:5900/
- (etc.) will work as well. This requires the x11vnc java viewer jar file
- (shared/x11vnc/classes) to be installed. It corresponds to the
- \"-R http\" and \"-R nohttp\" remote commands.
-
- Solid Background Color:
-
- To improve VNC performance, if this option is set, then x11vnc will try
- to make the desktop background a solid color (which compresses extremely
- well compared to photo images, etc.) It corresponds to the \"-R solid\"
- and \"-R nosolid\" remote commands.
-
- Password:
-
- Lets you set the session password viewers may use to gain full access
- to the display. This will only work if x11vnc was started with the
- -gui icon or -gui tray mode.
-
- ViewOnly Password:
-
- Lets you set the session password viewers may use to gain view only
- access to the display. This will only work if x11vnc was started with
- the -gui icon or -gui tray mode.
-
-
- NOTE: These \"session\" passwords only last for the current x11vnc
- session (they are not remembered, see the -storepasswd, -passwdfile,
- and -rfbauth x11vnc options for using stored passwords).
-
- If you set \"Password\" to the empty string that makes the \"ViewOnly
- Password\" empty as well and removes the need for any password to log in.
-
- If you set \"ViewOnly Password\" to the empty string that just removes
- the ViewOnly log in aspect: \"Password\" is still required to log in.
-
- - The \"Help\" button shows this help text.
-
- - The \"Advanced ...\" button replaces the Properties dialog with the full
- tkx11vnc GUI. All dynamic settings can be modified in the full GUI.
-
-
-==========================================================================
-
-Don't Lock Yourself Out:
-
- If you are sitting at the physical X display you cannot get into too
- much trouble setting the Properties dialog values.
-
- However IF you are using a VNC Viewer to REMOTELY access the X display
- some items in the Properties dialog can lock you out of further access:
-
- \"Accept Connections\" if you disable this remotely, and
- accidentally disconnect your VNC viewer then you will not be
- able to reconnect.
-
- \"Ask for Confirmation\" if you enable this only someone
- sitting at the X display can confirm any new VNC connections.
- Furthermore, any current VNC viewers will be blocked while
- waiting for the confirmation (times out in 120 sec by default).
-
- \"All Clients ViewOnly\" if you enable this remotely, well
- you can no longer provide input to disable it.
-
- If you do lock yourself out you could log in remotely and start up
- a second x11vnc and connect to that one to try to fix things in the
- first one.
-
- Note that if there are two or more x11vnc's on the same display the
- use of the GUI may be ill-behaved. Terminate the second x11vnc as
- soon as you have fixed the setting in the first one. Use of a remote
- control command, e.g. \"x11vnc -R noviewonly\" or \"x11vnc -R unlock\"
- is a good way to avoid this problem.
-"
-
- set helptext(all) $helpall
-
- set helptext(Misc-Tuning:) "
-x11vnc has what seems like hundreds of tuning parameters! In this
-sub-menu we place some lesser used ones. Most likely you'll want to
-leave them at their default values, but you can try them out quickly
-with the gui to see if they improve things.
-"
-
- set helptext(Passwords:) "
-The items in this sub-menu pertain to setting passwords. Note that x11vnc
-has two types of password files: RealVNC-style ones (you can create them
-with x11vnc -storepasswd or other VNC utility program) you use these
-via -rfbauth; and plain-text file passwords you use via -passwdfile.
-
-Normally passwords cannot be changed by remote-control (e.g. the gui),
-but for the case of the \"Icon\" and \"Tray\" modes this constraint has
-been relaxed.
-
-In neither the RealVNC-style nor the plain-text file cases should the
-password files be readable by users you do not want to access the VNC
-server. Contrary to popular belief, the RealVNC-style passwords are
-not encrypted, merely obscured.
-
-x11vnc has the even less secure -passwd and -viewpasswd supplied on
-the command line. Be careful with these since they could be read by
-users with something like the ps(1) command. On some operating systems
-x11vnc tries to quickly overwrite them on the command line but it doesn't
-work everywhere.
-
-Regarding ViewOnly passwords (where a VNC client using that password
-can only watch the screen, not interact with it), this is not available
-with -rfbauth, but only with -passwdfile, -passwd, and -viewpasswd.
-"
-
- set helptext(SSL:) "
-In this sub-menu we provide the options related to SSL encrpytion
-and authentication.
-
-There is a built-in mode (-ssl) using the OpenSSL library, and a 2nd
-using the external stunnel program (-stunnel, that needs to be installed
-on the system). Either may require or benefit from having PEM certificate
-files specified.
-
-"
-
- set helptext(Misc-Perms:) "
-In this sub-menu we provide some lesser used permission options.
-
-Regarding -alwaysshared, -nevershared, and -dontdisconnect, you probably
-should never use them and just use x11vnc's -shared and -forever options
-instead (these give basically the same functionality and if you mixed
-them too much unexpected things may happen).
-"
-#'
-
- set helptext(AlphaBlending:) "
-In this sub-menu we provide some tweak parameters for cursors (little
-icon at the mouse pointer) that have transparency (i.e. an Alpha channel
-in addition to Red, Green, and Blue RGB channels). For these cursors,
-some of the graphics underneath the cursor is allowed to be blended in:
-e.g. a drop-shadow (a terrible effect IMNSHO).
-
-AlphaBlending for x11vnc is only available when the XFIXES X extension is
-present (since otherwise it cannot see the cursors at all and so applies
-heuristics to show some fake cursors). AlphaBlending is only a problem
-with x11vnc when the cursors are not opaque.
-
-Opaque cursors (e.g. bitmap or simply colored cursor) are rendered
-correctly by x11vnc. Only when there is transparency does x11vnc have
-to make some approximation to transform the cursor to be opaque (the
-VNC protocol does not provide for an alpha channel in cursors, only RGB).
-
-The items in this sub-menu let you tweak x11vnc's approximation scheme
-for cursors with transparency. Hopefully you won't have to use them.
-Certain cursor \"themes\" may require adjustment however.
-"
-#'
- set helptext(OverlayVisuals:) "
-In this sub-menu are some options that involve fixing color problems
-for \"Overlay\" or \"Multi-Depth\" visuals. This problem is rare
-since overlay and multi-depth visual video hardware is rare.
-Some Sun, SGI, and HP machines are known to have them.
-
-The short answer is if you have a multi-depth visual display (e.g. 8 and
-24 bits), and you see messed up colors in x11vnc try the \"-overlay\"
-option on Solaris or IRIX.
-
-A brief Background on pixels, color, and visuals:
-
- Pixels (picture elements) are kept in video memory as a certain number
- of bits-per-pixel (bpp). Most common are 8bpp, 16bpp, and 32bpp.
- Less common are 24bpp, 4bpp, and 1bpp (monochrome).
-
- How pixel values (i.e. values of the bits) are rendered into colors on
- the screen can be done via different \"Recipes\". These different
- recipes are referred to as \"visuals\". E.g. for 8bpp there is
- a PseudoColor visual that maintains a mapping (that can be changed
- dynamically) of the pixel values (256 possible ones) into RGB values.
- Other 8bpp visuals, e.g. StaticGrey and TrueColor have fixed, regular
- mappings and so provide less variation in kinds of colors.
-
- A visual's \"depth\" is how many of the pixels are used in the
- actual recipe. This may sound wasteful (i.e. not using some of the
- bits), but for 32bpp (4 billion colors) that is too much and nearly
- always only 24 for them are used. The most common Visual seems to
- be depth 24 TrueColor at 32bpp. This provides 16 million colors
- which is more than the number of pixels on most screens (1280x1024 =
- 1.3 million pixels). Another sometimes used visual that ignores some
- bits is depth 15 TrueColor at 16bpp.
-
-OK, now, finally, to the Overlay Visuals. Some hardware (or software
-emulations) allow different depth visuals to be used on the display
-at the same time. The pixels of windows using different depth visuals
-may overlap.
-
-The most common seems to be both 8 and 24 depth visuals on a 32bpp setup.
-24 of the pixels can be used for one visual and the remaining 8 for the
-other. This is sometimes referred to as \"8+24\" mode. Furthermore,
-a speedup is achieved because writing graphics data to, say, the 8bit
-visual does not destroy the image data in the 24bit visual. Evidently
-popup menus can be done very quickly this way: they use the 8bit visual
-and when the popup goes away the graphics data in the 24bit visual is
-immediately reexposed without having the application redraw it.
-
-Also, some legacy applications can only use 8bpp visuals. But in these
-days of high color graphics and web browsers one would like the rest
-of the desktop to use depth 24 visuals. They often work on the multi
-depth visuals.
-
-How does this effect x11vnc? x11vnc nearly always polls the root window
-(container of all other windows). The root window will be one depth,
-e.g. 8 or 24. Any windows using the *other* depth will appear to have
-messed up colors (or just be black or some other solid color) when viewed
-via x11vnc.
-
-How to fix? Solaris and IRIX provide an API to extract the full snapshot
-of the display with all the colors correct. It comes to x11vnc as depth
-24 TrueColor. To enable this use the \"-overlay\" option. Performance
-may be slower, but if the colors are correct that is a big improvement.
-"
-
- set helptext(8-Bit-Color:) "
-Some older displays (e.g. with limited Video RAM) use 8 bits-per-pixel
-color. This allows for only 256 different colors on the screen at the
-same time. This sometimes leads to problems with viewing these 8bpp
-displays via x11vnc. This sub-menu has some options that correspond to
-workarounds for this case. If you can configure the machine to use 16bpp
-it may be worth it to avoid the color problems (e.g. color flashing
-as the 8bit colormap is switched).
-"
- set helptext(SubWindow:) "
-This sub-menu has a couple options regarding having x11vnc poll a
-single window, not the entire display. This way just the window
-is shared.
-
-Note if the application pops up multiple windows they are not tracked
-and shared. So this is not application sharing. The application has to
-be very simple (e.g. a simple terminal or the image window on a webcam)
-for this mode to be usable.
-"
- set helptext(ResizeRotate:) "
-This sub-menu has some options regarding screens that support the X
-Resize, Reflection, and Rotation Extension (RANDR), and one expects screen
-resizing, reflection, or rotation to take place during the x11vnc session.
-This is pretty rare, but x11vnc seems to handle it reasonably well using
-this X extension.
-
-This mode is on by default in -id mode to try to track the changing
-size of the SubWindow. It is not on by default for full-screen mode
-because of the extra overhead, etc.
-"
-
- set helptext(WireFrame:) "
-This sub-menu has some options for the x11vnc wireframing speedup scheme.
-
-For x11vnc, Wireframing means to watch for toplevel windows being Opaquely
-Moved or Resized. When x11vnc detects this, it stops polling the screen
-and simply shows a \"wireframe\" outline of the window as it is being
-moved or resized. This avoids \"screen polling thrashing\" when the
-screen is changing so rapidly during this period. For various reasons
-this is usually much faster then letting the window manager do its
-own wireframing (you are encouraged to do Opaque moves and resizes
-when using x11vnc!)
-
-Also, once a moved window is released in its new position, x11vnc uses
-the VNC CopyRect encoding to very efficiently update the VNC viewers
-(each just copies the image data locally).
-
-This sort of scheme was used much in the 1990's on local displays because
-video hardware was slow at the time. x11vnc tries to use this same trick
-as a speedup for its activities (the network is much slower than video
-hardware writes, and the video hardware reads that x11vnc uses to poll
-the screen are still slow today).
-"
-#'"
-
- set helptext(Safe:) "
-In this sub-menu are some options for making x11vnc operations
-more, or less, safe. E.g. disable the running of external commands, etc.
-
-You can also turn off the Remote control channel (NOTE that doing that
-will disable the GUI from being able to communicate with x11vnc).
-"
-
- set helptext(X-ext:) "
-In this sub-menu are a few rarely used options regarding some X extensions
-used by x11vnc.
-"
- set helptext(Clipping:) "
-In this sub-menu are some options regarding clipping or blacking out
-portions of the Screen. E.g. under XINERAMA when the multiple monitors
-are not the same size.
-
-"
- set helptext(Misc-Screen:) "
-In this sub-menu are some little used options modifying aspects of
-the screen source.
-"
-
- set helptext(Settings:) "
-In this sub-menu are some options for saving and loading option settings.
-The default file to store settings in is ~/.x11vncrc, but you can save
-different \"profiles\" in other files for later use.
-
-"
- set helptext(Java-applet:) "
-In this sub-menu are some options for running the built-in HTTP server
-that delivers the TightVNC Java VNC Viewer applet (VncViewer.jar) to
-clients. The viewer runs in their Web browser.
-
-The default port listened on is 5800, so the URL is typically:
-
- http://hostname:5800/
-
-but this can be altered by -httpport, etc.
-"
-
- set helptext(Chat:) "
-In this sub-menu are some options for enabling a local chat window
-and starting or stopping the current chat. This is the UltraVNC
-Text Chat support in x11vnc.
-"
-
- set helptext(ScrollCopyRect:) "
-This sub-menu has some options for the x11vnc Scroll detection and
-CopyRect speedup scheme.
-
-For this mode, x11vnc \"spies\" on communication between the X server and
-applications using the RECORD extension. It looks for various patterns
-to detect a scrolled window. This only works for some applications,
-fortunately some important ones.
-
-Once the scroll is detected it uses the VNC CopyRect encoding for a
-big speedup. Screen polling is also sped up for this scheme.
-
-There are many tweakable parameters for this mode and they are described
-in the sub-menu items.
-"
-
- set helptext(XDAMAGE:) "
-The DAMAGE X extension allows the X server to send signals to x11vnc
-telling it which regions of the screen have been changed. This improves
-x11vnc's performance markedly. The DAMAGE extension must be available
-on the display for this to work.
-
-Unfortunately DAMAGE cannot be trusted completely for the changed regions,
-because often the reported changed region is much larger than the actual
-changed regions. Nevertheless, x11vnc uses the DAMAGE information very
-effectively as hints to improve its performance.
-
-The items in the sub-menu allow tweaking x11vnc's DAMAGE algorithm.
-"
-
- set helptext(Ncache:) "
-A simple client-side (viewer) caching scheme is enabled with the
-\"-ncache n\" option. It simply uses \"n\" framebuffer sized areas
-below the actual display for caching window pixel data.
-
-Drawbacks are it uses a lot of RAM (roughly n times more), and the
-pixels cache area is visible in the viewers.
-
-The items in the sub-menu allow tweaking x11vnc's -ncache algorithm.
-"
-
- set helptext(SharedMemory:) "
-This sub-menu provides some options regarding SYSV shared memory usage
-(shm) by x11vnc. Usually you want shm turned on because the x11vnc
-process is nearly always running on the same machine the X server process
-is running on. SharedMemory gives a performance speedup. However, if you
-need to modify this scenario for special usage these options allow you to.
-"
-
- set helptext(Misc-Debug:) "
-This sub-menu contains a lot of debugging parameters usually used
-for debugging x11vnc itself. This is unlike the -debug_pointer and
--debug_keyboard options that are useful in learning information, quirks,
-etc. about your local display and environment.
-"
-
- set helptext(Selection:) "
-This sub-menu contains some options centering around the Selection
-(also referred to as the Clipboard, Cutbuffers, etc). x11vnc will try
-to exchange the selections between the VNC viewers and the X server.
-You can adjust that behavior with these options.
-"
-
- set helptext(WindowView) "
-Set the Window View Mode for the gui. There are three modes:
-
- - full: Presents the full gui (Actions, Clients, etc, buttons,
- and the Text area and Set/Entry box).
-
- - icon: Presents a small icon instead of the full gui. Moving
- the mouse over it shows the VNC display name and any
- connected clients. Clicking on the icon pops up a menu
- of actions to perform. Among them is \"Properties\" that
- allows setting more parameters. Clicking on \"Advanced\"
- in \"Properties\" brings up the full gui.
-
- - tray: Attempt to embed the small icon in the system tray. If
- this fails it will resort to icon mode where the small icon
- is a standalone window.
-
-Note that in \"full\" mode if you delete the full gui window the gui
-terminates (but the x11vnc server keeps running). However under \"icon\"
-or \"tray\" mode if you bring up the full gui window via \"Properties ->
-Advanced\" and then delete it the gui does NOT terminate.
-
-Also note that by default in \"icon\" mode if you delete the icon
-window both the gui *and* the x11vnc server terminate.
-"
-
- set helptext(gui) "
-tkx11vnc is a simple frontend to x11vnc. Nothing fancy, it merely
-provides an interface to each of the many x11vnc command line options and
-remote control commands. See \"Help -> all\" for much info about x11vnc.
-
-For a simplier gui, run x11vnc in \"tray\" or \"icon\" mode such as
-\"-gui tray\", \"-gui icon\", or \"-gui tray=setpass\". In that
-mode the full gui is only available under \"Advanced ...\".
-
-Also, \"-gui ez\" will show fewer menu items (toggle via Misc -> simple_gui)
-
-All menu items have a (?) button one can click on to get more information
-about the option or command.
-
-There are two states tkx11vnc can be in:
-
- 1) Available to control a running x11vnc process.
-
- 2) Getting ready to start a x11vnc process.
-
-Most people will just use state 1).
-
-In state 1) the Menu items available in the menus are those that
-correspond to the x11vnc \"remote control\" commands. See the -remote
-entry under \"Help -> all\" for a complete list. Also available is
-the \"Actions -> stop\" item to shut down the running x11vnc server,
-thereby changing to state 2). There are other actions available too.
-
-In state 2) the Menu items available in the menus (\"Actions\", \"Clients\",
-etc.) are those that correspond to command line options used in starting
-an x11vnc process, and the \"Actions -> start\" item executes
-x11vnc thereby changing to state 1). To see what x11vnc startup command
-you have built so far, look at the (?) help for \"Actions -> start\"
-and it will show you what the command looks like.
-
-There is much overlap between the menu items available in state 1)
-and state 2), but it is worth keeping in mind it is not 100%.
-For example, you cannot set passwords or password files in state 1).
-(update: simple password setting is now allowed in \"tray\" or \"icon\" mode).
-
-
-Also note that there may be *two* separate X displays involved, not just
-one: 1) the X display x11vnc will be polling (and making available to
-VNC viewers), and 2) the X display this GUI is intended to display on.
-
-For example, one might use ssh to access the remote machine where the
-GUI would display on :11 and x11vnc would poll display :0. By default
-the gui will display on the value in the DISPLAY env. variable followed
-by the value from the -display option. To override this, use something
-like: \"-gui otherhost:0\", etc.
-
-
-GUI components:
---- ----------
-
-1) At the top of the gui is a info text label where information will
- be posted, e.g. when traversing menu items text indicating how to get
- help on the item and its current value will be displayed.
-
-2) Below the info label is the area where the menu buttons, \"Actions\",
- \"Clients\", etc., are presented. If a menu item has a checkbox,
- it corresponds to a boolean on/off variable. Otherwise it is
- either a string variable, or an action not associated with a
- variable (for the most part).
-
-3) Below the menu button area is a label indicating the current x11vnc
- X display being polled and the corresponding VNC display name. Both
- will be \"(*none*)\" when there is no connection established.
-
-4) Below the x11 and vnc displays label is a text area there scrolling
- information about actions being taken and commands being run is displayed.
- To scroll click in the area and use PageUp/PageDown or the arrow keys.
-
-5) At the bottom is an entry area. When one selects a menu item that
- requires supplying a string value, the label will be set to the
- parameter name and one types in the new value. Then one presses the
- \"OK\" button or presses \"Enter\" to set the value. Or you can press
- \"Cancel\" or \"Escape\" to avoid changing the variable.
-
- Many variables are boolean toggles (for example, \"Permissions ->
- viewonly\") or Radio button selections. Selecting these menu items
- will NOT activate the entry area but rather toggle the variable
- immediately.
-
-
-CASCADES BUG: There is a bug not yet worked around for the cascade menus
-where the (?) help button gets in the way. To get the mouse over to
-the cascade menu click and release mouse to activate the cascade, then
-you can click on its items. Dragging with a mouse button held down will
-not work (sorry!).
-
-
-Key Bindings:
-
- In the Text Area: Control-/ selects all of the text.
- Anywhere: Control-d invokes \"Actions -> detach\"
- Anywhere: Control-a invokes \"Actions -> attach\"
- Anywhere: Control-p invokes \"Actions -> ping\"
- Anywhere: Control-u and Control-r invoke \"Actions -> update-all\"
-"
-
-set under_wally "
-Misc:
-
-Since x11vnc has so many settings and to avoid further confusion,
-the libvncserver options:
-
- -alwaysshared
- -nevershared
- -dontdisconnect
-
-are not available for changing in a running x11vnc (even though it
-is feasible). These options overlap with the x11vnc options -shared
-and -forever which are hopefully enough for most usage. They may be
-specified for x11vnc startup if desired.
-
-"
-
-global beginner_mode
-if {$beginner_mode} {
- set helptext(gui) "
-tkx11vnc is a simple frontend to x11vnc. It is currently running in
-\"ez\" or \"simple\" mode. For many more options run it in normal
-mode by toggling \"Misc -> simple_gui\".
-
-All menu items have a (?) button one can click on to get more information
-about the option or command.
-
-GUI components:
---- ----------
-
-1) At the top of the gui is a info text label where information will
- be posted, e.g. when traversing menu items text indicating how to get
- help on the item and its current value will be displayed.
-
-2) Below the info label is the area where the menu buttons, \"Actions\",
- \"Clients\", etc., are presented. If a menu item has a checkbox,
- it corresponds to a boolean on/off variable. Otherwise it is
- either a string variable, or an action not associated with a
- variable (for the most part).
-
-3) Below the menu button area is a label indicating the current x11vnc
- X display being polled and the corresponding VNC display name. Both
- will be \"(*none*)\" when there is no connection established.
-
-4) Below the x11 and vnc displays label is a text area there scrolling
- information about actions being taken and commands being run is displayed.
- To scroll click in the area and use PageUp/PageDown or the arrow keys.
-
-5) At the bottom is an entry area. When one selects a menu item that
- requires supplying a string value, the label will be set to the
- parameter name and one types in the new value. Then one presses the
- \"OK\" button or presses \"Enter\" to set the value. Or you can press
- \"Cancel\" or \"Escape\" to avoid changing the variable.
-
- Many variables are boolean toggles (for example, \"Permissions ->
- viewonly\") or Radio button selections. Selecting these menu items
- will NOT activate the entry area but rather toggle the variable
- immediately.
-
-CASCADES BUG: There is a bug not yet worked around for the cascade menus
-where the (?) help button gets in the way. To get the mouse over to
-the cascade menu click and release mouse to activate the cascade, then
-you can click on its items. Dragging with a mouse button held down will
-not work (sorry!).
-
-"
-}
-
-}
-
-proc center_win {w} {
- wm withdraw $w
- set x [expr [winfo screenwidth $w]/2 - [winfo reqwidth $w]/2];
- set y [expr [winfo screenheight $w]/2 - [winfo reqheight $w]/2];
- wm geometry $w +$x+$y
- wm deiconify $w
- update
-}
-
-proc textwidth {text} {
- set min 0;
- foreach line [split $text "\n"] {
- set n [string length $line]
- if {$n > $min} {
- set min $n
- }
- }
- return $min
-}
-
-proc textheight {text} {
- set count 0;
- foreach line [split $text "\n"] {
- incr count
- }
- return $count
-}
-
-proc set_name {name} {
- global full_win icon_mode
- global saved_set_name
-
- if {![info exists saved_set_name]} {
- set saved_set_name "tkx11vnc"
- }
- if {$name == "RESTORE"} {
- set name $saved_set_name
- } else {
- set saved_set_name $name
- }
- if {![info exists full_win]} {
- return
- }
- set w "."
- if {$icon_mode} {
- wm title $w "$name"
- wm iconname $w "$name"
- set w $full_win
- }
- wm title $w "$name"
- wm iconname $w "$name"
-}
-
-proc make_toplevel {w {title ""}} {
- catch {destroy $w}
- toplevel $w;
- bind $w <Escape> "destroy $w"
- if {$title != ""} {
- wm title $w $title
- wm iconname $w $title
- }
-}
-
-proc textwin {name title text {entry ""}} {
- global max_text_height max_text_width
- global bfont ffont
-
- set width [textwidth $text]
- incr width
- if {$width > $max_text_width} {
- set width $max_text_width
- }
- set height [textheight $text]
- if {$height > $max_text_height} {
- set height $max_text_height
- }
-
- set w ".text_$name"
- make_toplevel $w $title
-
- frame $w.f -bd 0;
- pack $w.f -fill both -expand 1
- text $w.f.t -width $width -height $height -setgrid 1 -bd 2 \
- -yscrollcommand "$w.f.y set" -relief ridge \
- -font $ffont;
- scrollbar $w.f.y -orient v -relief sunken -command "$w.f.t yview";
- button $w.f.b -text "Dismiss" -command "destroy $w" -font $bfont \
- -pady 2
-
- $w.f.t insert 1.0 $text;
-
- bind $w <Enter> "focus $w.f.t"
-
- if {$entry != ""} {
- # varname+Label Name
- set list [split $entry "+"]
- set varname [lindex $list 0]
- set labname [lindex $list 1]
- frame $w.f.ef -bd 1 -relief groove
- label $w.f.ef.l -text "$labname" -anchor w -font $bfont
- entry $w.f.ef.e -relief sunken -font $ffont \
- -textvariable $varname
- button $w.f.ef.b -text "OK" -font $bfont \
- -command "set ${varname}_ok 1; destroy $w"
- bind $w.f.ef.e <KeyPress-Return> "set ${varname}_ok 1; destroy $w"
-
- pack $w.f.ef.l -side left
- pack $w.f.ef.e -side left -fill x -expand 1
- pack $w.f.ef.b -side right
- }
-
- wm withdraw $w
- pack $w.f.b -side bottom -fill x
- if {$entry != ""} {
- pack $w.f.ef -side bottom -fill x
- bind $w <Enter> "focus $w.f.ef.e"
- $w.f.ef.e icursor end
- } else {
- bind $w <Enter> "focus $w.f.t"
- }
- pack $w.f.y -side right -fill y;
- pack $w.f.t -side top -fill both -expand 1;
- update
-
- center_win $w
-
- return $w
-}
-
-proc active_when_connected {item} {
- global helpremote helptext
- global icon_mode
-
- if {$icon_mode} {
- if {$item == "passwd"} {
- return 1
- }
- if {$item == "viewpasswd"} {
- return 1
- }
- }
-
- if {[opt_match G $item]} {
- return 1
- } elseif {[opt_match R $item]} {
- return 1
- } elseif {[opt_match S $item]} {
- return 0
- } elseif {[is_action $item]} {
- if {[opt_match R $item]} {
- return 1
- } else {
- return 0
- }
- } elseif {[info exists helpremote($item)]} {
- return 1
- } else {
- return 0
- }
-}
-
-proc active_when_starting {item} {
- global helpremote helptext beginner_mode
-
- if {$beginner_mode} {
- if {[opt_match G $item]} {
- return 1
- }
- if {$item == "display"} {
- return 1
- }
- if {$item == "attach"} {
- return 1
- }
- if {$item == "debug_gui"} {
- return 1
- }
- return 0
- }
-
- if {[opt_match G $item]} {
- return 1
- } elseif {[opt_match S $item]} {
- return 1
- } elseif {[opt_match R $item]} {
- return 0
- } elseif {[is_action $item]} {
- if {[opt_match S $item]} {
- return 1
- } else {
- return 0
- }
- } elseif {[info exists helptext($item)]} {
- return 1
- } else {
- return 0
- }
-}
-
-proc help_win {item} {
- global helptext helpremote menu_var
- global query_ans query_aro
- global beginner_mode
-
- set ok 0
- set text "Help on $item:\n\n"
-
- if {$item == "NewClient"} {
- ;
- } elseif {[is_gui_internal $item]} {
- if {$item != "gui" && $item != "all" && $item != "Misc-Tuning:" \
- && $item != "Properties" && $item != "Tray"} {
- append text " + Is a gui internal Action (cannot be set).\n";
- }
- } elseif {[is_action $item]} {
- append text " + Is a remote control Action (cannot be set).\n";
- } elseif {[active_when_connected $item]} {
- append text " + Can be changed in a running x11vnc.\n";
- } else {
- append text " - Cannot be changed in a running x11vnc.\n";
- }
- if {$item == "NewClient"} {
- ;
- } elseif {[is_gui_internal $item]} {
- ;
- } elseif {[active_when_starting $item]} {
- append text " + Can be set at x11vnc startup.\n";
- } else {
- if {! $beginner_mode} {
- append text " - Cannot be set at x11vnc startup.\n";
- }
- }
- append text "\n"
-
- if {[info exists helptext($item)]} {
- append text "\n"
- if {[is_gui_internal $item]} {
- append text "==== x11vnc help: ====\n";
- } else {
- append text "==== x11vnc startup option help: ====\n";
- }
- append text "\n"
- append text $helptext($item)
- append text "\n"
- set ok 1
- }
-
- if {[info exists helpremote($item)]} {
- append text "\n"
- append text "==== x11vnc remote control help: ====\n";
- append text "\n"
- append text $helpremote($item)
- set ok 1
- }
-
- if {![is_action $item] && [info exists menu_var($item)]} {
- global unset_str
- append text "\n\n"
- append text "==== current $item value: ====\n";
- append text "\n"
-
- if {$item == "passwd" || $item == "viewpasswd"} {
- ;
- } elseif {$menu_var($item) == ""} {
- append text "$unset_str\n"
- } else {
- append text "$menu_var($item)\n"
- }
- if {$item == "http" || $item == "httpdir" || $item == "httpport"} {
- global vnc_url;
- append text "\nURL: $vnc_url\n"
- }
- }
-
- if {$item == "start"} {
- set str [get_start_x11vnc_txt]
- append_text "$str\n"
-# append text "\nPossible \$HOME/.x11vncrc settings for this command:\n\n"
-# set rctxt [get_start_x11vnc_cmd 1]
-# append text "$rctxt\n"
- }
-
- regsub -all { } $item " " name
-
- if {$ok} {
- textwin $name "x11vnc help: $item" "$text";
- }
- return $ok
-}
-
-proc parse_help {} {
- global env x11vnc_prog;
- global helpall helptext;
-
- set helppipe [open "| $x11vnc_prog -help" "r"];
- if {$helppipe == ""} {
- puts stderr "failed to run $x11vnc_prog -help";
- exit 1;
- }
-
- set sawopts 0;
- set curropt "";
- while {[gets $helppipe line] > -1} {
- append helpall "$line\n"
-
- # XXX
- if {[regexp {^Options:} $line]} {
- set sawopts 1;
- continue;
- }
- # XXX
- if {[regexp {^These options} $line]} {
- continue;
- }
- # tweak aliases:
- regsub {^-zeroconf} $line "-zero_conf" line
- regsub {^-avahi } $line "-zeroconf" line
-
- if {! $sawopts} {
- continue;
- }
- if {[regexp {^-([0-9A-z_][0-9A-z_]*)} $line match name]} {
- set allnames($name) 1;
- if {"$curropt" != "no$name" && "no$curropt" != "$name"} {
- set curropt $name;
- set helptext($curropt) "$line\n";
- } else {
- append helptext($curropt) "$line\n";
- }
- } elseif {$curropt != ""} {
- append helptext($curropt) "$line\n";
- }
- }
- foreach name [array names allnames] {
- if {[regexp {^no} $name]} {
- regsub {^no} $name "" pair
- } else {
- set pair "no$name"
- }
- if {[info exists helptext($name)]} {
- if ![info exists helptext($pair)] {
- set helptext($pair) $helptext($name);
- }
- } elseif {[info exists helptext($pair)]} {
- if ![info exists helptext($name)] {
- set helptext($name) $helptext($pair);
- }
- }
- }
-
- set_internal_help
-}
-
-proc tweak_both {new old} {
- tweak_help $new $old
- tweak_remote_help $new $old
-}
-
-proc tweak_remote_help {new old} {
- global helpremote
- if ![info exists helpremote($new)] {
- if {[info exists helpremote($old)]} {
- set helpremote($new) $helpremote($old)
- }
- }
-}
-
-proc tweak_help {new old} {
- global helptext
- if ![info exists helptext($new)] {
- if {[info exists helptext($old)]} {
- set helptext($new) $helptext($old)
- }
- }
-}
-
-proc parse_remote_help {} {
- global helpremote helptext help_indent remote_name;
-
- set sawopts 0;
- set curropt "";
- set possopts "";
- set offset [expr $help_indent - 1];
- foreach line [split $helptext(remote) "\n"] {
-
- set line [string range $line $offset end];
-
- # XXX
- if {[regexp {^The following -remote/-R commands} $line]} {
- set sawopts 1;
- continue;
- }
- # XXX
- if {[regexp {^The vncconnect.*command} $line]} {
- set sawopts 0;
- }
-
- if {! $sawopts} {
- continue;
- }
- if {[regexp {^([0-9A-z_][0-9A-z_:]*)} $line match name]} {
- regsub {:.*$} $name "" popt
- lappend possopts $popt
- if {"$curropt" != "no$name" && "no$curropt" != "$name"} {
- set curropt $name;
- regsub {:.*$} $curropt "" curropt
- set remote_name($curropt) $name
- set helpremote($curropt) "$line\n";
- } else {
- append helpremote($curropt) "$line\n";
- }
- } elseif {$curropt != ""} {
- append helpremote($curropt) "$line\n";
- }
- }
-
- foreach popt $possopts {
- if {[info exists helpremote($popt)]} {
- continue
- }
- if {[regexp {^no} $popt]} {
- regsub {^no} $popt "" try
- } else {
- set try "no$popt"
- }
- if {[info exists helpremote($try)]} {
- set helpremote($popt) $helpremote($try)
- }
- }
-}
-
-proc parse_query_help {} {
- global query_ans query_aro query_ans_list query_aro_list helptext;
-
- set sawans 0;
- set sawaro 0;
- set ans_str ""
- set aro_str ""
-
- foreach line [split $helptext(query) "\n"] {
-
- if {! $sawans && [regexp {^ *ans=} $line]} {
- set sawans 1
- }
- if {! $sawans} {
- continue
- }
-
- if {[regexp {^ *aro=} $line]} {
- set sawaro 1
- }
- if {$sawaro && [regexp {^[ ]*$} $line]} {
- set sawans 0
- break
- }
-
- regsub {ans=} $line "" line
- regsub {aro=} $line "" line
- set line [string trim $line]
-
- if {$sawaro} {
- set aro_str "$aro_str $line"
- } else {
- set ans_str "$ans_str $line"
- }
- }
-
- regsub -all { *} $ans_str " " ans_str
- regsub -all { *} $aro_str " " aro_str
-
- set ans_str [string trim $ans_str]
- set aro_str [string trim $aro_str]
- set query_ans_list [split $ans_str]
- set query_aro_list [split $aro_str]
-
- foreach item $query_ans_list {
- if {[regexp {^[ ]*$} $item]} {
- continue
- }
- set query_ans($item) 1
- }
- foreach item $query_aro_list {
- if {[regexp {^[ ]*$} $item]} {
- continue
- }
- set query_aro($item) 1
- }
-}
-
-proc in_debug_mode {} {
- global menu_var
- if {![info exists menu_var(debug_gui)]} {
- return 0
- }
- return $menu_var(debug_gui)
-}
-
-# Menubar utilities:
-proc menus_state {state} {
- global menu_b
-
- foreach case [array names menu_b] {
- set menu_button $menu_b($case)
- if {![winfo exists $menu_button]} {
- continue
- }
- $menu_button configure -state $state
- }
-}
-
-proc menus_enable {} {
- global menus_disabled
-
- menus_state "normal"
- set menus_disabled 0
-}
-
-proc menus_disable {} {
- global menus_disabled
-
- set menus_disabled 1
- menus_state "disabled"
-}
-
-# Entry box utilities:
-proc entry_state {x state} {
- global entry_box entry_label entry_ok entry_help entry_skip entry_browse
- global old_labels
- if {$x == "all"} {
- if {!$old_labels} {
- $entry_label configure -state $state
- }
- $entry_box configure -state $state
- $entry_ok configure -state $state
- $entry_skip configure -state $state
- $entry_help configure -state $state
- $entry_browse configure -state $state
- } elseif {$x == "label"} {
- if {!$old_labels} {
- $entry_label configure -state $state
- }
- } elseif {$x == "box"} {
- $entry_box configure -state $state
- } elseif {$x == "ok"} {
- $entry_ok configure -state $state
- } elseif {$x == "skip"} {
- $entry_skip configure -state $state
- } elseif {$x == "help"} {
- $entry_help configure -state $state
- } elseif {$x == "browse"} {
- $entry_browse configure -state $state
- }
-}
-
-proc entry_enable {{x "all"}} {
- entry_state $x normal
-}
-
-proc entry_disable {{x "all"}} {
- entry_state $x disabled
-}
-
-proc entry_browse_button {{show 1}} {
- global entry_browse
- if {$show} {
- pack $entry_browse -side left
- } else {
- pack forget $entry_browse
- }
-}
-proc entry_focus {} {
- global entry_box
- focus $entry_box
-}
-proc entry_select {} {
- global entry_box
- $entry_box selection range 0 end
-}
-proc entry_get {} {
- global entry_box
- return [$entry_box get]
-}
-proc entry_insert {str} {
- global entry_box
- entry_delete
- $entry_box insert end $str
- $entry_box icursor end
-}
-proc entry_delete {} {
- global entry_box
- $entry_box delete 0 end
-}
-
-
-# Utilities for remote control and updating vars.
-
-proc push_new_value {item name new {query 1}} {
- global menu_var always_update remote_output query_output
- global query_result_list
-
- set debug [in_debug_mode]
-
- set getout 0
- set print_getout 0;
-
- set do_query_all 0
-
- set newnew ""
- if {$item == "disconnect"} {
- set newnew "N/A"
- set do_query_all 1
- } elseif {$always_update} {
- set do_query_all 1
- }
-
- if {$item == "remote-cmd"} {
- # kludge for arbitrary remote command:
- if {[regexp {^Q:} $new]} {
- # extra kludge for Q:var to mean -Q var
- regsub {^Q:} $new "" new
- set qonly 1
- } else {
- set qonly 0
- }
- # need to extract item from new:
- set qtmp $new
- regsub {:.*$} $qtmp "" qtmp
- if {$qonly} {
- set rargs [list "-Q" "$qtmp"]
- set print_getout 1
- set qargs ""
- } else {
- set rargs [list "-R" "$new"]
- set qargs ""
- }
- set getout 1
-
- } elseif {[value_is_string $item]} {
- # string var:
- set rargs [list "-R" "$name:$new"]
- set qargs [list "-Q" "$name"]
- } else {
- # boolean var:
- set rargs [list "-R" "$name"]
- set qargs [list "-Q" "$name"]
- }
-
- if {! $query && ! $always_update} {
- set getout 1
- } elseif {$item == "noremote"} {
- set getout 1
- } elseif {[is_action $item] && ![opt_match Q $item] && $rargs != ""} {
- set getout 1
- } elseif {[regexp {^(sid|id)$} $item] && ![regexp {^0x} $new]} {
- set getout 1
- }
-
- set remote_output ""
- set query_output ""
-
- if {!$debug} {
- if [regexp {passwd} $rargs] {
- append_text "x11vnc ..."
- } else {
- append_text "x11vnc $rargs ..."
- }
- }
-
- if {$getout} {
- set remote_output [run_remote_cmd $rargs]
- if {$print_getout} {
- append_text "\t$remote_output"
- }
- append_text "\n"
- return
- }
-
- if {$do_query_all} {
- set all [all_query_vars]
- set qargs [list "-Q" $all]
-
- global last_query_all_time
- set last_query_all_time [clock seconds]
- }
-
- set rqargs [concat $rargs $qargs]
-
- set query [run_remote_cmd $rqargs]
- set query_output $query
-
- set query_result_list ""
-
- if {$newnew != ""} {
- set new $newnew
- }
-
- if {![see_if_ok $query $item "$name:$new"]} {
- # failed
- if {[regexp {^a..=} $query]} {
- # but some result came back
- # synchronize everything with a 2nd call.
- set query_output [query_all 1]
- } else {
- # server may be dead
- if {$item != "ping" && $item != "attach"} {
- try_connect
- }
- }
- } else {
- # succeeded
- # synchronize this variable (or variables)
- # for a speedup used the list parsed by see_if_ok.
- update_menu_vars "USE_LIST"
-
- if {$do_query_all} {
- global all_settings
- set all_settings $query
- }
- }
-}
-
-proc set_kmbc_str {} {
- global vl_bk vl_bm vl_bb vl_bc vl_bf vr_bk vr_bm vr_bb vr_bc vr_bf
-
- set str ""
- if {$vl_bk} {
- append str "K"
- }
- if {$vl_bm} {
- append str "M"
- }
- if {$vl_bb} {
- append str "B"
- }
- if {$vl_bc} {
- append str "C"
- }
- if {$vl_bf} {
- append str "F"
- }
- if {$vr_bk || $vr_bm || $vr_bb || $vr_bc || $vr_bf} {
- append str ","
- }
- if {$vr_bk} {
- append str "K"
- }
- if {$vr_bm} {
- append str "M"
- }
- if {$vr_bb} {
- append str "B"
- }
- if {$vr_bc} {
- append str "C"
- }
- if {$vr_bf} {
- append str "F"
- }
- entry_insert $str
-}
-
-proc insert_input_window {} {
- global text_area cleanup_window
- global ffont menu_var
- global vl_bk vl_bm vl_bb vl_bc vl_bf vr_bk vr_bm vr_bb vr_bc vr_bf
-
- append_text "\nUse these checkboxes to set the input permissions, "
- append_text "or type in the \"KMBCF...\"\n"
- append_text "-input string manually. Then press \"OK\" or \"Cancel\".\n"
- append_text "(note: an empty setting means use the default behavior, "
- append_text "see viewonly)\n\n"
- set w "$text_area.wk_f"
- catch {destroy $w}
- frame $w -bd 1 -relief ridge -cursor {top_left_arrow}
- set fl $w.fl
- frame $fl
- set fr $w.fr
- frame $fr
- label $fl.l -font $ffont -text "Normal clients: "
- checkbutton $fl.bk -pady 1 -font $ffont -anchor w -variable vl_bk \
- -pady 1 -command set_kmbc_str -text "Keystrokes"
- checkbutton $fl.bm -font $ffont -anchor w -variable vl_bm \
- -pady 1 -command set_kmbc_str -text "Mouse-Motion"
- checkbutton $fl.bb -font $ffont -anchor w -variable vl_bb \
- -pady 1 -command set_kmbc_str -text "Button-Click"
- checkbutton $fl.bc -font $ffont -anchor w -variable vl_bc \
- -pady 1 -command set_kmbc_str -text "Clipboard-Input"
- checkbutton $fl.bf -font $ffont -anchor w -variable vl_bf \
- -pady 1 -command set_kmbc_str -text "Files"
- label $fr.l -pady 1 -font $ffont -text "View-Only clients:"
- checkbutton $fr.bk -font $ffont -anchor w -variable vr_bk \
- -pady 1 -command set_kmbc_str -text "Keystrokes"
- checkbutton $fr.bm -font $ffont -anchor w -variable vr_bm \
- -pady 1 -command set_kmbc_str -text "Mouse-Motion"
- checkbutton $fr.bb -font $ffont -anchor w -variable vr_bb \
- -pady 1 -command set_kmbc_str -text "Button-Click"
- checkbutton $fr.bc -font $ffont -anchor w -variable vr_bc \
- -pady 1 -command set_kmbc_str -text "Clipboard-Input"
- checkbutton $fr.bf -font $ffont -anchor w -variable vr_bf \
- -pady 1 -command set_kmbc_str -text "Files"
-
- if {[info exists menu_var(input)]} {
- set input_str $menu_var(input)
- } else {
- set input_str ""
- }
-
- if {[regexp {(.*),(.*)} $input_str match normal viewonly]} {
- ;
- } else {
- set normal $input_str
- set viewonly ""
- }
- set vl_bk 0
- set vl_bm 0
- set vl_bb 0
- set vl_bc 0
- set vl_bf 0
-
- set vr_bk 0
- set vr_bm 0
- set vr_bb 0
- set vr_bc 0
- set vr_bf 0
-
- if {[regexp -nocase {K} $normal]} {
- set vl_bk 1
- }
- if {[regexp -nocase {M} $normal]} {
- set vl_bm 1
- }
- if {[regexp -nocase {B} $normal]} {
- set vl_bb 1
- }
- if {[regexp -nocase {C} $normal]} {
- set vl_bc 1
- }
- if {[regexp -nocase {F} $normal]} {
- set vl_bf 1
- }
- if {[regexp -nocase {K} $viewonly]} {
- set vr_bk 1
- }
- if {[regexp -nocase {M} $viewonly]} {
- set vr_bm 1
- }
- if {[regexp -nocase {B} $viewonly]} {
- set vr_bb 1
- }
- if {[regexp -nocase {C} $viewonly]} {
- set vr_bc 1
- }
- if {[regexp -nocase {F} $viewonly]} {
- set vr_bf 1
- }
-
- pack $fl.l $fl.bk $fl.bm $fl.bb $fl.bc $fl.bf -side top -fill x
- pack $fr.l $fr.bk $fr.bm $fr.bb $fr.bc $fr.bf -side top -fill x
- pack $fl $fr -side left
- update
- update idletasks
- $text_area window create end -window $w
- $text_area see end
- $text_area insert end "\n"
-# $text_area insert end "\n\n\n\n\n\n\n\n\n"
-
- set cleanup_window $w
-}
-
-proc set_ca_str {w} {
- global ca_bk ca_bm ca_bb ca_bc ca_bf ca_di
-
- if {$ca_di} {
- entry_insert "disconnect"
- $w.bk configure -state disabled
- $w.bm configure -state disabled
- $w.bb configure -state disabled
- $w.bc configure -state disabled
- $w.bf configure -state disabled
- return
- }
-
- $w.bk configure -state normal
- $w.bm configure -state normal
- $w.bb configure -state normal
- $w.bc configure -state normal
- $w.bf configure -state normal
-
- set str ""
- if {$ca_bk} {
- append str "K"
- }
- if {$ca_bm} {
- append str "M"
- }
- if {$ca_bb} {
- append str "B"
- }
- if {$ca_bc} {
- append str "C"
- }
- if {$ca_bf} {
- append str "F"
- }
- entry_insert $str
-}
-
-proc insert_client_action_window {input} {
- global text_area cleanup_window
- global ffont menu_var
- global ca_bk ca_bm ca_bb ca_bc ca_bf ca_di
-
- append_text "\nUse these checkboxes to set the input permissions "
- append_text "for this client\n-OR- whether to disconnect it instead. "
- append_text "Then press \"OK\" or \"Cancel\".\n\n"
- set w "$text_area.ca_f"
- catch {destroy $w}
- frame $w -bd 1 -relief ridge -cursor {top_left_arrow}
- checkbutton $w.di -pady 1 -font $ffont -anchor w -variable ca_di \
- -pady 1 -command "set_ca_str $w" -text "Disconnect "
- checkbutton $w.bk -font $ffont -anchor w -variable ca_bk \
- -pady 1 -command "set_ca_str $w" -text "Keystrokes"
- checkbutton $w.bm -font $ffont -anchor w -variable ca_bm \
- -pady 1 -command "set_ca_str $w" -text "Mouse-Motion"
- checkbutton $w.bb -font $ffont -anchor w -variable ca_bb \
- -pady 1 -command "set_ca_str $w" -text "Button-Click"
- checkbutton $w.bc -font $ffont -anchor w -variable ca_bc \
- -pady 1 -command "set_ca_str $w" -text "Clipboard"
- checkbutton $w.bf -font $ffont -anchor w -variable ca_bf \
- -pady 1 -command "set_ca_str $w" -text "Files"
-
- set ca_di 0
- set ca_bk 0
- set ca_bm 0
- set ca_bb 0
- set ca_bf 0
- set ca_bc 0
-
- if {[regexp -nocase {K} $input]} {
- set ca_bk 1
- }
- if {[regexp -nocase {M} $input]} {
- set ca_bm 1
- }
- if {[regexp -nocase {B} $input]} {
- set ca_bb 1
- }
- if {[regexp -nocase {C} $input]} {
- set ca_bc 1
- }
- if {[regexp -nocase {F} $input]} {
- set ca_bf 1
- }
-
- pack $w.di $w.bk $w.bm $w.bb $w.bc $w.bf -side left
- update
- update idletasks
- $text_area window create end -window $w
- $text_area see end
- $text_area insert end "\n"
-
- set cleanup_window $w
-}
-
-proc cleanup_text_window {} {
- global cleanup_window
- if {[info exists cleanup_window]} {
- catch {destroy $cleanup_window}
- }
-}
-
-# For updating a string variable. Also used for simple OK/Cancel dialogs
-# with entry = 0.
-proc entry_dialog {item {entry 1}} {
- global menu_var entry_str entry_set entry_dialog_item
- global unset_str connected_to_x11vnc entry_box
-
- set entry_str "Set $item"
- set entry_set 0
- set entry_dialog_item $item
-
- entry_enable
- menus_disable
-
- if {$item == "passwd" || $item == "viewpasswd"} {
- $entry_box configure -show "*"
- }
-
- if {$entry} {
- entry_insert ""
- if {[info exists menu_var($item)] &&
- $menu_var($item) != $unset_str} {
- entry_insert $menu_var($item)
- entry_select
- }
-
- if {[is_browse $item]} {
- entry_browse_button
- }
- set_info "Set parameter in entry box, "
- entry_focus
- } else {
- entry_disable box
- }
-
- set clean_text_window 0;
-
- if {$item == "input"} {
- insert_input_window
- set clean_text_window 1
- }
-
- update
-
- # wait for user reply:
- vwait entry_set
-
- set rc $entry_set
- set entry_set 0
-
- set value [entry_get]
- update
-
- entry_browse_button 0
- set entry_str "Set... :"
-
- entry_delete
- entry_disable
- menus_enable
-
- if {$clean_text_window} {
- cleanup_text_window;
- }
-
- update
-
- if {! $entry} {
- ;
- } elseif {$rc} {
- set menu_var($item) $value
- } else {
- if {[in_debug_mode]} {
- append_text "skipped setting $item\n"
- }
- }
-
- $entry_box configure -show ""
-
- return $rc
-}
-
-proc warning_dialog {msg {item "gui"} } {
- append_text $msg
- # just reuse the entry widgets for a yes/no dialog
- return [entry_dialog $item 0]
-}
-
-# For updating a boolean toggle:
-proc check_var {item} {
- global menu_var
-
- set inval $menu_var($item);
-
- if {$item == "debug_gui"} {
- return "";
- }
-
- set rname $item
- if {! $inval} {
- if {[regexp {^no} $item]} {
- regsub {^no} $rname "" rname
- } else {
- set rname "no$rname"
- }
- }
- return $rname
-}
-
-proc see_if_ok {query item expected} {
- global query_result_list
-
- set ok 0
- set found ""
-
- set query_result_list [split_query $query]
-
- foreach q $query_result_list {
- # XXX following will crash if $item is not a good regexp
- # need to protect it \Q$item\E style...
-# if {[regexp "^$item:" $q]} {
-# set found $q
-# }
- if {[string first "$item:" $q] == 0} {
- set found $q
- }
- if {$q == $expected} {
- set ok 1
- if {$found != ""} {
- break;
- }
- }
- }
- if {$found == ""} {
- set msg $query
- regsub {^a..=} $msg {} msg
- if {[string length $msg] > 60} {
- set msg [string range $msg 0 60]
- }
- } else {
- set msg $found
- }
- if {!$ok && $found != ""} {
- # check for floating point match:
- set v1 ""
- set v2 ""
- regexp {:([0-9.][0-9.]*)$} $found m0 v1
- regexp {:([0-9.][0-9.]*)$} $expected m0 v2
- if {$v1 != "" && $v2 != ""} {
- set diff ""
- catch {set diff [expr "$v1 - $v2"]}
- if {$diff != ""} {
- if {$diff < 0} {
- set diff [expr "0.0 - $diff"]
- }
- if {$diff < 0.00001} {
- set ok 1
- }
- }
- }
- }
- if {$ok} {
- append_text "\tSet OK ($msg)\n"
- return 1
-
- } elseif {[opt_match P $item] && [regexp {:(-|\+)} $expected]} {
- # e.g. blackout:+30x30+20+20
- append_text "\t($msg)\n"
- return 1
- } elseif {[regexp {:[0-9]\.[0-9]} $expected]} {
- append_text "\t($msg)\n"
- return 1
- } elseif {$item == "connect" || $item == "disconnect"
- || $item == "client" || $item == "client_input"} {
- append_text "\t($msg)\n"
- return 1
- } elseif {$item == "passwd" || $item == "viewpasswd"} {
- append_text "\t($msg)\n"
- return 1
- } else {
- append_text "\t*FAILED* $msg\n"
- return 0
- }
-}
-
-proc get_default_vars {} {
- global default_var env
-
- set qry [all_query_vars]
-
- append qry ",vncconnect"
-
- set q ""
- set i 0
- set all ""
- foreach s [split $qry ","] {
- if {$q != ""} {
- append q ","
- }
- append q $s
- incr i
- if {$i > 50} {
- set qargs [list "-QD" $q]
- set a [run_remote_cmd $qargs]
- if [info exists env(TKX11VNC_PRINT_ALL_QD)] {
- puts $q
- puts $a
- puts "---------------"
- }
- if {$all != ""} {
- append all ","
- }
- append all $a
- set q ""
- set i 0
- }
- }
- if {$q != ""} {
- set qargs [list "-QD" $q]
- set a [run_remote_cmd $qargs]
- if [info exists env(TKX11VNC_PRINT_ALL_QD)] {
- puts $q
- puts $a
- puts "---------------"
- }
- if {$all != ""} {
- append all ","
- }
- append all $a
- }
-
-# old way, qry too long...
-# set qargs [list "-QD" $qry]
-# set all [run_remote_cmd $qargs]
-
- if {[regexp {ans=} $all]} {
- #append_text "Retrieved all default settings.\n"
- } else {
- #append_text "Failed to retrieve default settings.\n"
- }
-
- set query_result_list [split_query $all]
-
- set default_var(gui) ""
-
- foreach piece $query_result_list {
- if {[regexp {^([^:][^:]*):(.*)$} $piece m0 item val]} {
- if {$val == "N/A"} {
- if {$item == "vncconnect"} {
- set val 1
- } else {
- set val ""
- }
- }
- if {$item == "display"} {
- set val ""
- } elseif {$item == "desktop"} {
- set val ""
- } elseif {$item == "auth"} {
- set val ""
- } elseif {$item == "gui"} {
- continue
- }
- # some hacks we do here for now..
- if {$item == "cursor" && $val == ""} {
- set val "most"
- } elseif {$item == "scrollcopyrect" && $val == ""} {
- set val "always"
- } elseif {$item == "wirecopyrect" && $val == ""} {
- set val "always"
-# } elseif {$item == "overlay_nocursor" && $val == 0} {
-# set val 1
- }
-
- set default_var($item) $val
-#puts "default: $item -> $val"
- }
- }
-}
-
-proc tilde_expand {file} {
- global env
- if {[file exists $file]} {
- return $file
- }
-
- set user ""
- if {[info exists env(USER)]} {
- set user $env(USER)
- }
- if {$user == "" && [info exists env(LOGNAME)]} {
- set user $env(LOGNAME)
- }
-
- set home ""
- if {[info exists env(HOME)]} {
- set home $env(HOME)
- } elseif {$user != ""} {
- set home "/home/$user"
- }
-
- if {[regexp {^~} $file]} {
- if {[regexp {^~/} $file]} {
- if {$home != ""} {
- regsub {^~} $file $home file
- }
- } else {
- regsub {^~} $file "/home/" file
- }
- }
- return $file
-}
-
-proc insert_cmdline_vars {} {
- global env cmd_var menu_var default_var x11vnc_cmdline
- if {![info exists x11vnc_cmdline]} {
- return
- }
- if {$x11vnc_cmdline == ""} {
- return
- }
- set cmd_var(novar) 1
- set str [string trim $x11vnc_cmdline]
-
- while {[regexp -- {^-} $str]} {
- if {[regexp -- {^--*([^ \t][^ \t]*)(.*)$} $str m var rest]} {
- set rest [string trim $rest]
- set var [string trim $var]
- if {[regexp {^\{\{([^\}]*)\}\}(.*)} $rest m val rest]} {
- set str [string trim $rest]
- set cmd_var($var) $val
- } else {
- set str $rest
- set cmd_var($var) "boolean"
- }
- } else {
- break
- }
- }
-
- if {[info exists cmd_var(rc)]} {
- load_settings $cmd_var(rc)
- } elseif {[info exists cmd_var(norc)]} {
- ;
- } else {
- set filex [tilde_expand "~/.x11vncrc"]
- if {[file exists $filex]} {
- load_settings $filex
- }
- }
-
- foreach var [array names cmd_var] {
- if {$var == "novar"} {
- continue
- }
- if {[regexp {^[ \t]*$} $var]} {
- continue
- }
- if {[info exists menu_var($var)]} {
- if {$cmd_var($var) == "boolean"} {
- set menu_var($var) 1
- } else {
- set menu_var($var) $cmd_var($var)
- }
- }
- }
-}
-
-proc copy_default_vars {} {
- global menu_var default_var
- foreach item [array names default_var] {
- if {[info exists menu_var($item)]} {
- if {[info exists default_var($item)]} {
- set menu_var($item) $default_var($item)
- }
- }
- }
- foreach item [array names menu_var] {
- if {[info exists default_var($item)]} {
- set menu_var($item) $default_var($item)
- }
- }
-}
-
-proc update_menu_vars {{query ""}} {
- global all_settings menu_var query_result_list
- global x11vnc_icon_mode
-
- set debug [in_debug_mode]
-
- if {$query == "USE_LIST"} {
- ;
- } elseif {$query == ""} {
- set query_result_list [split_query $all_settings]
- } else {
- set query_result_list [split_query $query]
- }
-
- foreach piece $query_result_list {
-#puts stderr "UMV: $piece"
- if [regexp {icon_mode:0} $piece] {
- set x11vnc_icon_mode 0
- #puts stderr "x11vnc_icon_mode: $x11vnc_icon_mode"
- }
- if [regexp {icon_mode:1} $piece] {
- set x11vnc_icon_mode 1
- #puts stderr "x11vnc_icon_mode: $x11vnc_icon_mode"
- }
- # XXX ipv6
- if {[regexp {^([^:][^:]*):(.*)$} $piece m0 item val]} {
- if {[info exists menu_var($item)]} {
- set old $menu_var($item)
-#puts stderr " $old"
- if {$val == "N/A"} {
- continue
- }
- set menu_var($item) $val
- }
- if {$item == "clients"} {
- update_clients_menu $val
- } elseif {$item == "display"} {
- set_x11_display $val
- } elseif {$item == "vncdisplay"} {
- set_vnc_display $val
- } elseif {$item == "http_url"} {
- set_vnc_url $val
- }
- }
- }
-}
-
-proc load_settings {{file ""}} {
- global menu_var default_var env
-
- if {$file == ""} {
- if {![info exists menu_var(load-settings)]} {
- return
- }
- set file $menu_var(load-settings)
- }
- if {$file == ""} {
- return
- }
-
- set fh ""
- set filex [tilde_expand $file]
- catch {set fh [open $filex "r"]}
-
- if {$fh == ""} {
- append_text "load_settings: *** failed to open $filex ***\n"
- return
- }
- copy_default_vars
-
- set str ""
- while {[gets $fh line] > -1} {
- regsub -all {\\#} $line {__QUOTED_HASH__} line
- if {[regexp {^[ \t]*#} $line]} {
- continue
- }
- for {set i 0} {$i < 5} {incr i} {
- regsub {#.*$} $line "" line
- }
- if {[regexp {^[ \t]*$} $line]} {
- continue
- }
- regsub -all {__QUOTED_HASH__} $line {#} line
- if {[regexp {\\$} $line]} {
- regsub {\\$} $line " " line
- append str "$line"
- } else {
- append str "$line\n"
- }
- }
- close $fh
-
- set count 0
- set parms ""
-
- foreach line [split $str "\n"] {
- set line [string trim $line]
- regsub {^--*} $line "" line
- regsub -all {[ \t][ \t]*} $line " " line
- set list [split $line]
- set item [lindex $list 0]
- set value [lindex $list 1]
- if {[regexp {^[ \t]*$} $item]} {
- continue
- }
- if {$item == "gui"} {
- continue
- }
- if {[info exists menu_var($item)]} {
- if {[value_is_bool $item]} {
- set menu_var($item) 1
- incr count
- append parms " -$item\n"
- } elseif {[value_is_string $item]} {
- if {$value != ""} {
- set menu_var($item) $value
- set nitem [get_nitem $item]
- append parms " -$nitem $value\n"
- incr count
- }
- }
- }
- }
- append_text "loaded $count parameter settings from $filex"
- if {$count > 0} {
- append_text ":\n"
- append_text $parms
- } else {
- append_text ".\n"
- }
-}
-
-proc save_settings {} {
- set rc_text [get_settings_rcfile]
-
- set top "#
-# This file is based on the current x11vnc settings and can be used as
-# as a ~/.x11vncrc defaults file. If saved to another filename, these
-# settings can be passed to x11vnc at startup via \"-rc <filename>\".
-#
-# The rc file comment character is \"#\". Use \"\\#\" for the literal char.
-# You can continue lines using \"\\\" as the last character of a line.
-#
-# Lines beginning with \"#d\" indicate the parameter value is at its default
-# setting and you probably want to leave it commented out.
-#
-# Lines beginning with \"#?\" indicate parameters you probably do not
-# want to hardwire to the current setting (uncomment if you want that).
-#
-# Some parameters are boolean, e.g. -forever, and take no value; while
-# the others, e.g. -wait 50, take a string or numerical value.
-#
-# For booleans, the line will end with comment \"default: on\" or
-# \"default: off\" indicating the default setting. (Note: often
-# \"-nofoobar\" corresponds to option \"-foobar\" and the former is
-# \"the default\", e.g. -norepeat).
-#
-# For string or numerical options, the value \"\" in a line below
-# means the default is unset and you will need to supply some non-empty
-# value to use the parameter. For reference, if the default differs
-# from your value it placed at the end of the line as a comment.
-#
-# Feel free to uncomment or comment any of the lines or to change any
-# of the values of the parameters. Don't be surprised that most if not
-# all of the lines below are commented out (x11vnc has so many parameters,
-# most of them will be at their default values).
-#-------------------------------------------------------------------------
-
-"
-
- set rc_text "$top$rc_text"
-
- global env save_settings_var save_settings_var_ok
- if {[info exists env(HOME)]} {
- set save_settings_var "$env(HOME)/.x11vncrc"
- } else {
- set save_settings_var ".x11vncrc"
- }
- set save_settings_var_ok 0
-
- set w [textwin "save_settings" "Save Settings..." $rc_text \
- "save_settings_var+Save as:"]
-
- tkwait window $w
-
- if {$save_settings_var_ok == 1} {
- set file $save_settings_var
- if {$file == ""} {
- return
- }
- set file [tilde_expand $file]
- append_text "\nSaving current settings to $file ...\n"
- if {[file exists $file]} {
- set backup "${file}~"
- append_text "Backing up $file -> $backup ...\n"
- catch {file delete -force $backup}
- set emsg "*** Backup to $backup failed. ***\n"
- if {![file exists $backup]} {
- catch {file copy -force $file $backup}
- if {![file exists $backup]} {
- append_text $emsg
- bell
- }
- } else {
- append_text $emsg
- bell
- }
- }
- set fh ""
- catch {set fh [open $file "w"]}
- if {$fh != ""} {
- puts $fh $rc_text
- close $fh
- if {![file exists $file]} {
- append_text "*** Saving to $file failed. ***\n"
- bell
- } else {
- append_text "Done.\n"
- }
- } else {
- append_text "*** Open of $file failed. ***\n"
- bell
- }
- }
-}
-
-proc clear_all {} {
- global menu_var unset_str
-
- set debug [in_debug_mode]
-
- foreach item [array names menu_var] {
- if {$item == "debug_gui"} {
- continue
- }
- if {[info exists menu_var($item)]} {
- if {[is_action $item]} {
- set menu_var($item) ""
- } elseif {[value_is_bool $item]} {
- set menu_var($item) 0
- } elseif {[value_is_string $item]} {
- set menu_var($item) $unset_str
- }
- }
- }
- append_text "Cleared all settings.\n"
-}
-
-proc defaults_all {} {
- copy_default_vars
- append_text "Reset all variables to default values.\n"
-}
-
-proc all_query_vars {} {
- global query_ans_list query_aro_list all_settings
- global cache_all_query_vars
-
- if {$cache_all_query_vars != ""} {
- return $cache_all_query_vars
- }
-
- set qry ""
- foreach item $query_ans_list {
- if {$qry == ""} {
- set qry $item
- } else {
- append qry ",$item"
- }
- }
- foreach item $query_aro_list {
- if {$qry == ""} {
- set qry $item
- } else {
- append qry ",$item"
- }
- }
- set cache_all_query_vars $qry
-
- global env
- if [info exists env(TKX11VNC_PRINT_ALL_VARS)] {
- puts "--------------- BEGIN ALL VARS ---------------"
- puts $qry
- puts "--------------- END ALL VARS ---------------"
- }
-
- return $qry
-}
-
-proc query_all {{quiet 0}} {
- global query_ans_list query_aro_list all_settings
- global last_query_all_time
-
- dtime 1
- set qry [all_query_vars]
-
- set qargs [list "-Q" $qry]
- set all [run_remote_cmd $qargs]
-
- if {[regexp {ans=} $all]} {
- if {! $quiet} {
- append_text "Retrieved all current settings.\n"
- }
- set all_settings $all
- update_menu_vars $all
- } else {
- if {! $quiet} {
- append_text "Failed to retrieve current settings.\n"
- }
- }
- set last_query_all_time [clock seconds]
- dtime 2
- return $all
-}
-
-proc set_info {str} {
- global info_str info_label
-#set w1 [$info_label cget -width]
-#set w2 [winfo width $info_label]
-#puts "set_info: w=$w1 winfo=$w2"
-#append_text "$str\n"
- set info_str "$str"
- update
-}
-
-proc append_text {str} {
- global text_area text_area_str
-
- if {![info exists text_area_str]} {
- set text_area_str ""
- }
- append text_area_str $str
-
- if {![info exists text_area]} {
- puts stderr $str
- return
- }
- if {$text_area == ""} {
- puts stderr $str
- return
- }
- if {![winfo exists $text_area]} {
- puts stderr $str
- return
- }
-
- $text_area insert end $str
- $text_area see end
-}
-
-proc show_all_settings {} {
- global all_settings
- global client_sock client_tail
- global x11vnc_client_file
-
- set txt "\nRead-Write settings:\n\n"
- foreach item [split_query $all_settings] {
- regsub {:} $item {: } item
- append txt " $item\n"
- if {[regexp {noremote} $item]} {
- append txt "\nRead-Only settings:\n\n"
- }
- }
- append txt "\nInternal settings:\n\n"
- append txt "x11vnc_client_file: $x11vnc_client_file\n"
- if {[info exists client_tail]} {
- append txt "client_tail: $client_tail\n"
- } else {
- append txt "client_tail: unset\n"
- }
- if {[info exists client_sock]} {
- append txt "client_sock: $client_sock\n"
- } else {
- append txt "client_sock: unset\n"
- }
- set estr ""
- catch {set estr [exec env | grep -i X11VNC]}
- append txt "$estr\n"
- textwin "Settings" "All Current Settings" $txt
-}
-
-proc show_logfile {} {
- global menu_var unset_str
-
- set logfile [tilde_expand $menu_var(logfile)]
-
- if {$logfile == "" || $logfile == $unset_str} {
- set txt "\nNo logfile was specified at x11vnc startup.\n\n"
- } elseif {![file exists $logfile]} {
- set txt "\nLogfile \"$logfile\" does not exist.\n\n"
- } else {
- set fh "-3"
- set err ""
- catch {set fh [open $logfile "r"]} err
- if {$fh == "-3"} {
- set txt "\nError opening \"$logfile\" $err.\n\n"
- } else {
- set txt "\nLogfile \"$logfile\" current contents:\n"
- while {[gets $fh line] > -1} {
- append txt "$line\n"
- }
- close $fh
- }
- }
- textwin "Logfile" "Logfile" $txt
-}
-
-proc tail_logfile {} {
- global menu_var unset_str ffont
- set logfile $menu_var(logfile)
-
- set txt ""
- if {$logfile == "" || $logfile == $unset_str} {
- set txt "\nNo logfile was specified at x11vnc startup.\n\n"
- } elseif {![file exists $logfile]} {
- set txt "\nLogfile \"$logfile\" does not exist.\n\n"
- } else {
- set cmd ""
- set xterm_cmd "xterm -sb -fn $ffont -geometry 80x45 -title x11vnc-logfile -e"
- set cmd [split $xterm_cmd]
- lappend cmd "tail"
- lappend cmd "-3000f"
- lappend cmd $logfile
- lappend cmd "&"
- catch {[eval exec $cmd]}
- }
- if {$txt != ""} {
- textwin "Logfile" "Logfile" $txt
- }
-}
-
-proc set_connected {yesno} {
- global connected_to_x11vnc
- set orig $connected_to_x11vnc
-
- if {$yesno == "yes"} {
- set connected_to_x11vnc 1
- } else {
- set connected_to_x11vnc 0
- no_x11_display
- no_vnc_display
- }
- if {$orig != $connected_to_x11vnc} {
- set_widgets
- }
-}
-
-proc detach_from_display {} {
- global connected_to_x11vnc reply_xdisplay x11vnc_xdisplay
- set str "Detaching from X display."
- if {$reply_xdisplay != ""} {
- set str "Detaching from $reply_xdisplay."
- } elseif {$x11vnc_xdisplay != ""} {
- set str "Detaching from $x11vnc_xdisplay."
- }
- if {$connected_to_x11vnc} {
- append_text "$str\n"
- }
- set_connected no
-}
-
-proc do_stop_quit {} {
- push_new_value "stop" "stop" 1 0
- set_connected no
- update
- after 250
- destroy .
-}
-
-# Menu item is an action:
-proc do_action {item} {
- global menu_var connected_to_x11vnc beginner_mode
-
- if {[in_debug_mode]} {
- append_text "action: \"$item\"\n"
- }
-#puts "action: \"$item\"\n"
-
- if {$item == "ping"} {
- if {$beginner_mode} {
- try_connect_and_query_all
- } else {
- try_connect
- }
- return
- } elseif {$item == "start"} {
- start_x11vnc
- return
- } elseif {$item == "detach"} {
- detach_from_display
- return
- } elseif {$item == "attach"} {
- try_connect_and_query_all
- return
- } elseif {$item == "update-all"} {
- query_all
- return
- } elseif {$item == "clear-all"} {
- clear_all
- return
- } elseif {$item == "defaults-all"} {
- defaults_all
- return
- } elseif {$item == "save-settings"} {
- save_settings
- return
- } elseif {$item == "show-start-cmd"} {
- show_start_cmd
- return
- } elseif {$item == "all-settings"} {
- show_all_settings
- return
- } elseif {$item == "show-logfile"} {
- show_logfile
- return
- } elseif {$item == "tail-logfile"} {
- tail_logfile
- return
- } elseif {$item == "Misc-Tuning:"} {
- menu_help "$item"
- return
- } elseif {$item == "WindowView"} {
- change_view_state
- return
- } elseif {$item == "quit" || $item == "Quit"} {
- destroy .
- exit 0
- } elseif {$item == "stop+quit"} {
- do_stop_quit
- }
-
- if {[value_is_string $item]} {
- if {! [entry_dialog $item]} {
- return
- }
- set new $menu_var($item)
- set name $item
- } else {
- set new 1
- set name $item
- }
-
- if {$item == "load-settings"} {
- load_settings
- return
- }
-
- if {! $connected_to_x11vnc} {
- ;
- } elseif {[regexp {^(stop|quit|exit|shutdown)$} $item]} {
- # just do -R
- append_text "stopping remote x11vnc server...\n"
- push_new_value $item $name $new 0
- set_connected no
-
- } elseif {[opt_match Q $item]} {
- push_new_value $item $name $new 1
- } else {
- push_new_value $item $name $new 0
- }
-}
-
-proc ptime {time} {
- set usec [lindex [split $time] 0]
- set sec [format "%.3f" [expr "$usec / 1000000.0"]]
- puts "time: $sec secs."
-}
-
-proc do_var {item} {
- global connected_to_x11vnc item_cascade menu_var
-
- set debug [in_debug_mode]
-
- set string 0
- if {[is_action $item] || $item == "WindowView"} {
- # Menu item is action:
- if {$debug} {
- ptime [time {do_action $item}]
- } else {
- do_action $item
- }
- return
- }
-
- if {[value_is_string $item]} {
- # Menu item is a string:
- if {$item_cascade($item) != ""} {
- # Cascade sets variable automatically
- } else {
- # Otherwise Entry box
- if {![entry_dialog $item]} {
- return
- }
- }
- set new $menu_var($item)
- set name $item
- } else {
- # Menu item is a boolean:
- set name [check_var $item]
- if {$name == ""} {
- return
- }
- set new 1
- }
- if {$connected_to_x11vnc} {
- if {$debug} {
- ptime [time {push_new_value $item $name $new 1}]
- } else {
- push_new_value $item $name $new 1
- }
-
- if {$item == "http"} {
- global vnc_url
- append_text " URL: $vnc_url\n"
- }
- }
-}
-
-proc menu_help {item} {
- if ![help_win $item] {
- textwin "nohelp" "No help available" \
- "Sorry, no help avaiable for \"$item\""
- }
-}
-
-proc opt_match {c item} {
- global item_opts
- if {[info exists item_opts($item)]} {
- if {[regexp "^\[A-z\]*$c" $item_opts($item)]} {
- return 1
- }
- }
- return 0
-}
-
-proc is_action {item} {
- return [opt_match A $item]
-}
-
-proc is_gui_internal {item} {
- if {$item == "Properties"} {
- return 1
- }
- if {$item == "Tray"} {
- return 1
- }
- return [opt_match G $item]
-}
-
-proc is_browse {item} {
- return [opt_match F $item]
-}
-
-proc value_is_string {item} {
- global item_bool
- if {![info exists item_bool($item)]} {
- return 0
- }
- if {! $item_bool($item)} {
- return 1
- } else {
- return 0
- }
-}
-
-proc value_is_bool {item} {
- global item_bool
- if {![info exists item_bool($item)]} {
- return 0
- }
- if {$item_bool($item)} {
- return 1
- } else {
- return 0
- }
-}
-
-proc split_query0 {query} {
- # original slower way with regexp/regsub
- regsub -all {aro=} $query {ans=} query
- set items {}
- while {1} {
- if {! [regexp {^ans=(.*)$} $query m0 m1]} {
- break
- }
- set item $m1
- set m2 ""
- regexp {,ans=.*$} $item m2
- regsub {,ans=.*$} $item "" item
- if {$item != ""} {
- lappend items $item
- }
- set query $m2
- regsub {^,} $query "" query
- }
- return $items
-}
-
-proc split_query {query} {
- regsub -all {aro=} $query {ans=} query
- set items {}
- while {1} {
- set n [string first "ans=" $query]
- if {$n < 0} {
- break
- }
- set from [expr $n+4]
-
- set m [string first ",ans=" $query]
- if {$m < 0} {
- set more 0
- set item [string range $query $from end]
- } else {
- set more 1
- set to [expr $m-1]
- set item [string range $query $from $to]
- }
- if {$item != ""} {
- lappend items $item
- }
- if {$more} {
- incr m
- set query [string range $query $m end]
- } else {
- set query ""
- }
- }
- return $items
-}
-
-proc set_x11_display {name} {
- global x11_display
- set x11_display "x11vnc X display: $name"
- set_name "tkx11vnc - $name"
-}
-proc set_vnc_display {name} {
- global vnc_display icon_mode
- set vnc_display "VNC display: $name"
-
- if {$icon_mode} {
- set_icon_label
- }
-}
-proc set_vnc_url {name} {
- global vnc_url
- set vnc_url $name
-}
-proc no_x11_display {} {
- set_x11_display "(*none*)"
- set_name "tkx11vnc"
-}
-proc no_vnc_display {} {
- set_vnc_display "(*none*)"
-}
-proc no_vnc_url {} {
- set_vnc_url "(*none*)"
-}
-
-proc get_vnc_display_number {} {
- global vnc_display
- if ![info exists vnc_display] {
- return "none"
- }
- if {$vnc_display == ""} {
- return "none"
- }
- set str $vnc_display
- regsub {VNC display: *} $str "" str
- if [regexp {:([0-9][0-9]*)} $str m0 n] {
- return $n
- }
- return "none"
-}
-
-proc fetch_displays {} {
-
- set qargs [list "-Q" "display,vncdisplay"]
- set result [run_remote_cmd $qargs]
-
- set got_x11 0
- set got_vnc 0
- set got_url 0
-
- foreach item [split_query $result] {
- if {[regexp {^display:(.*)$} $item m0 m1]} {
- set_x11_display $m1
- set got_x11 1
- } elseif {[regexp {^vncdisplay:(.*)$} $item m0 m1]} {
- set_vnc_display $m1
- set got_vnc 1
- } elseif {[regexp {^http_url:(.*)$} $item m0 m1]} {
- set_vnc_url $m1
- set got_url 1
- }
- }
- if {! $got_x11} {
- no_x11_display
- }
- if {! $got_vnc} {
- no_vnc_display
- }
- if {! $got_url} {
- no_vnc_url
- }
-}
-
-proc client_dialog {client} {
- set cid ""
- set host ""
- set ip ""
- global menu_var text_area cleanup_window item_bool
-
- #<id>:<ip>:<port>:<user>:<unix>:<hostname>:<input>:<loginview>:<time>
- append_text "\nClient info string:\n - $client\n\n"
- if {[regexp {^(.*):(.*):(.*):(.*):(.*):(.*):(.*):(.*):(.*)$} \
- $client m0 m1 m2 m3 m4 m5 m6 m7 m8 m9]} {
- set cid $m1
- set ip $m2
- set port $m3
- set user $m4
- set unix $m5
- set host $m6
- regsub {\..*$} $host "" host
- set input $m7
- set logvo $m8
- set ltime $m9
- append_text "Host: $host, Port: $port, User: $user"
- if {$unix != "" && $unix != "none"} {
- append_text ", Unix: $unix"
- }
- append_text ", IP: $ip, Id: $cid\n"
- append_text " - originally logged in as: "
- if {$logvo == "1" } {
- append_text "View-Only Client"
- } else {
- append_text "Normal Client"
- }
- if {$ltime != ""} {
- set tim [clock format $ltime]
- append_text ", $tim"
- }
- append_text "\n"
- append_text " - currently allowed input: "
- set sk 0
- set sm 0
- set sb 0
- set sc 0
- set sf 0
- if {[regexp -nocase {K} $input]} {
- append_text "Keystrokes"
- set sk 1
- }
- if {[regexp -nocase {M} $input]} {
- if {$sk} {
- append_text ", "
- }
- append_text "Mouse-Motion"
- set sm 1
- }
- if {[regexp -nocase {B} $input]} {
- if {$sk || $sm} {
- append_text ", "
- }
- append_text "Button-Click"
- set sb 1
- }
- if {[regexp -nocase {C} $input]} {
- if {$sk || $sm || $sb} {
- append_text ", "
- }
- append_text "Clipboard"
- set sm 1
- }
- if {[regexp -nocase {F} $input]} {
- if {$sk || $sm || $sb || $sf} {
- append_text ", "
- }
- append_text "Files"
- set sf 1
- }
- if {! $sk && ! $sm && ! $sb && ! $sm && ! $sf} {
- append_text "None"
- }
- append_text "\n"
- }
- if {$cid == ""} {
- append_text "Invalid client info string: $client\n"
- return
- }
-
- regsub -all {_} $input "" input
- set menu_var(client) "$input"
- set item_bool(client) 0
-
- insert_client_action_window $input
- set rc [entry_dialog client 1]
-
- cleanup_text_window
-
- set val $menu_var(client)
- #puts "rc: $rc val: $val"
-
- if {! $rc} {
- return;
- } elseif {[regexp -nocase {(disconnect|close)} $val]} {
- disconnect_dialog $client
- } else {
- regsub -all -nocase {[^KMBCF]} $val "" val
- set item_bool(client_input) 0
- push_new_value "client_input" "client_input" "$cid:$val" 0
- }
-}
-
-proc disconnect_dialog {client} {
- set cid ""
- set host ""
- set msg "\n"
- append msg "*** Client info string:\n $client\n"
- if {[regexp {^(.*):(.*):(.*):(.*):(.*):(.*):(.*):(.*):(.*)$} \
- $client m0 m1 m2 m3 m4 m5 m6 m7 m8 m9]} {
- set cid $m1
- set ip $m2
- set port $m3
- set user $m4
- set unix $m5
- set host $m6
- regsub {\..*$} $host "" host
- set input $m7
- set logvo $m8
- set ltime $m9
- append_text "Host: $host, Port: $port, IP: $ip, User: $user"
- if {$unix != "" && $unix != "none"} {
- append_text ", Unix: $unix"
- }
- append_text ", Id: $cid\n"
- }
- if {$cid == ""} {
- append_text "Invalid client info string: $client\n"
- return
- }
- append msg "*** To *DISCONNECT* this client press \"OK\" again, otherwise press \"Cancel\"\n"
- bell
- if {[warning_dialog $msg "current"]} {
- push_new_value "disconnect" "disconnect" $cid 1
- } else {
- append_text "disconnect cancelled.\n"
- }
-}
-
-proc update_clients_and_repost {} {
- global item_cascade menu_m menu_b
-
- append_text "Refreshing connected clients list... "
- query_all 1
- update
-
- set saw 0
- set casc $item_cascade(current)
- set last [$casc index end]
- for {set i 0} {$i <= $last} {incr i} {
- if {[$casc type $i] == "separator"} {
- continue
- }
- set name [$casc entrycget $i -label]
- if {[regexp {^num-clients} $name]} {
- continue
- }
- if {[regexp {^refresh-list} $name]} {
- continue
- }
- if {! $saw} {
- append_text "\n"
- }
- set saw 1
- append_text "client: $name\n"
- }
- if {! $saw} {
- append_text "done.\n"
- }
-}
-
-proc update_clients_menu {list} {
- global item_cascade ffont
- global saved_clients_str
-
- if {![info exists saved_clients_str]} {
- set saved_clients_str ""
- }
- if {$list == "INIT"} {
- set list $saved_clients_str
- } else {
- set saved_clients_str $list
- }
-
- set subm $item_cascade(current);
- catch {destroy $subm}
- menu $subm -tearoff 0 -font $ffont
- $subm add command
- $subm add command -label "refresh-list" \
- -command "update_clients_and_repost"
- $subm add separator
- set count 0
- foreach client [split $list ","] {
- if {![regexp {^[a-z0-9]*[a-z0-9]:} $client]} {
- #append_text "Skipping client line: "
- #append_text $client
- #append_text "\n"
- continue
- }
- regsub -all {[{}()~!$&*|;'"`{}<>\[\]]} $client "" client
- #'
- if {[regexp {^(.*):(.*):(.*):(.*):(.*):(.*):(.*):(.*):(.*)$} \
- $client m0 m1 m2 m3 m4 m5 m6 m7 m8 m9]} {
- set id $m1
- set user $m4
- set unix $m5
- set host $m6
- regsub {\..*$} $host "" host
- set clabel "$host $id"
- if {$unix != "" && $unix != "none"} {
- set clabel "$unix@$clabel"
- } elseif {$user != "unknown-user"} {
- set clabel "$user@$clabel"
- }
- } else {
- regsub {:.*$} $client "" clabel
- }
- $subm add command -label "$clabel" \
- -command "client_dialog \{$client\}"
- incr count
- }
- $subm entryconfigure 0 -label "num-clients: $count"
-}
-
-proc set_widgets {} {
- global connected_to_x11vnc item_case item_menu item_entry menu_m
-
- foreach item [array names item_case] {
- if ![info exists item_case($item)] { continue; }
- set case $item_case($item)
- if ![info exists item_menu($item)] { continue; }
- set menu $item_menu($item)
- if ![info exists item_entry($item)] { continue; }
- set entry $item_entry($item)
- if {$entry < 0} {
- # skip case under beginner_mode
- continue
- }
- set type [$menu type $entry]
- if {$type == "separator" || $type == "tearoff"} {
- continue
- }
- if {![winfo exists $menu]} {
- continue
- }
- if {$connected_to_x11vnc} {
- if {[active_when_connected $item]} {
- $menu entryconfigure $entry -state normal
- } else {
- $menu entryconfigure $entry -state disabled
- }
- } else {
- if {[active_when_starting $item]} {
- $menu entryconfigure $entry -state normal
- } else {
- $menu entryconfigure $entry -state disabled
- }
- }
- }
-}
-
-proc toggle_simple_gui {} {
- global beginner_mode simple_gui_created
- global connected_to_x11vnc make_gui_count
-
- if {$beginner_mode} {
- append_text "\nSwitching to simple-gui mode.\n"
- } else {
- append_text "\nSwitching to power-user gui mode.\n"
- }
-
- if {$make_gui_count == 1} {
- incr make_gui_count
- }
- set simple_gui_created 1
- make_menu_items
- set_widgets
- set_internal_help
- append_text "\n"
-}
-
-proc little_qs {m} {
- global bfont ffont beginner_mode
- global helpremote helptext helplabel
- global tk_version osname
-
- if {$tk_version < 8.0} {
- return
- }
- if {$osname == "Darwin"} {
- return
- }
-
- set n [$m index end]
-
- for {set i 0} {$i <= $n} {incr i} {
- set type [$m type $i]
-#puts "$m - $i - $type"
- if {$type == "separator"} {
- $m add separator
- } elseif {$type == "tearoff"} {
- continue;
- } else {
- set label [$m entrycget $i -label]
- set str ""
- if {[info exists helpremote($label)]} {
- set str "(?)"
- } elseif {[info exists helptext($label)]} {
- set str "(?)"
- }
- $m add command -label $str \
- -font $ffont \
- -command "menu_help $label";
-
- if {$str == ""} {
- $m entryconfigure end -state disabled
- }
- set arg "$m,$i"
-#puts "helplabel: $arg -> $label"
- set helplabel($arg) $label
- set j [$m index end]
- set arg "$m,$j"
- set helplabel($arg) $label
- }
- if {$i == 0} {
- $m entryconfigure end -columnbreak 1
- }
- }
-
- menu_bindings $m
-}
-
-proc make_menu_items {} {
- global template
- global menu_b menu_m menu_count
- global item_opts item_bool item_case item_menu item_entry menu_var unset_str
- global item_cascade
- global bfont ffont beginner_mode simple_gui_created
- global helptext helpremote helplabel
-
- # some tweaks...
- if {![info exists menu_var(deny)]} {
- set menu_var(deny) 0
- }
-
- set case "";
- set L_casc ""
- set L_casc_count 0
- set L_menus [list]
-
- # Extract the menu items:
- foreach line [split $template "\n"] {
- if {[regexp {^Row:} $line]} {
- continue
- }
- if {[regexp {^[A-z]} $line]} {
- set case [string trim $line]
-
- if {$simple_gui_created} {
- set i0 0
- #if {$case == "Misc"} { # kludge for simple_gui
- # set i0 1
- #}
- catch {$menu_m($case) delete $i0 end}
- }
- set menu_count($case) 0
- continue;
- }
-
- set item [string trim $line]
- regsub -all { *} $item " " item
- if {$item == ""} {
- continue;
- }
- set opts ""
- if {[regexp {^=} $item]} {
- set opts [lindex [split $item] 0]
- regsub {^=} $opts "" opts
- set item [lindex [split $item] 1]
- }
- if {[regexp {^0} $opts]} {
- continue;
- }
- if {[regexp {:$} $item]} {
- set bool 0
- } else {
- set bool 1
- }
- regsub {:$} $item {} item
-
- if {$item == "LOFF"} {
- set L_casc ""
- continue
- }
-
- if {$item == "-- D"} {
- set beginner_sep 1
- set item "--"
- } else {
- set beginner_sep 0
- }
-
- set item_opts($item) $opts
- set item_case($item) $case
- set item_bool($item) $bool
- set item_cascade($item) ""
-
- if {$L_casc == ""} {
- set item_entry($item) $menu_count($case)
- set m $menu_m($case)
- } else {
- # hack for cascades for crowded menus. See =GAL opts.
- set item_entry($item) $L_casc_count
- set m $L_casc
- }
-
- set mvar 0
-
- if {$beginner_mode && ! $beginner_sep && ![opt_match D $item]} {
- set item_entry($item) "-1"
- continue;
- }
-
- set item_menu($item) $m
-
- if {0} { puts "ITEM: $item\t- $opts\t- $case\t- \
- $bool\t- $menu_count($case)" }
-
- # Create the menu items, its variables, etc., etc.
-
- if {$item == "--"} {
- $m add separator
-
- } elseif {$item == "Quit"} {
- # Quit item must shut us down:
- $m add command -label "$item" -underline 0 \
- -font $ffont \
- -command {destroy .; exit 0}
-
- } elseif {$case == "Help"} {
- # Help is simple help:
- $m add command -label "$item" \
- -font $ffont \
- -command "menu_help $item"
-
- } elseif {[opt_match L $item]} {
- # Special sub-menu cascade (=GAL ends with LOFF)
- set subm $m.casc_L$menu_count($case)
- catch {destroy $subm}
- menu $subm -tearoff 0 -font $ffont
- set item_cascade($item) $subm
- $m add cascade -label "$item" \
- -font $ffont \
- -menu $subm
- set L_casc $subm
- set L_casc_count -1
- lappend L_menus $L_casc
-
- } elseif {$item == "current"} {
- # Current clients cascade
- set subm $m.current_cascade
- catch {destroy $subm}
- set item_cascade($item) $subm
- update_clients_menu "INIT"
- $m add cascade -label "$item" \
- -font $ffont \
- -menu $subm
-
- } elseif {[is_action $item]} {
- # Action
- $m add command -label "$item" \
- -font $ffont \
- -command "do_var $item"
- if {![info exists menu_var($item)]} {
- set menu_var($item) ""; # for convenience
- }
-
- } elseif {! $item_bool($item)} {
- # String
- if {[regexp -- {-C:(.*)} $item_opts($item) m0 m1]} {
- # Radiobutton select
- set subm $m.radio_cascade$menu_count($case)
- catch {destroy $subm}
- menu $subm -tearoff 0 -font $ffont
- foreach val [split $m1 ","] {
- $subm add radiobutton -label "$val" \
- -command "do_var $item" \
- -value "$val" \
- -font $ffont \
- -variable menu_var($item)
- }
- $m add cascade -label "$item" \
- -font $ffont \
- -menu $subm
- set item_cascade($item) $subm
- } else {
- # Arbitrary_string
- $m add command -label "$item" \
- -font $ffont \
- -command "do_var $item"
- }
- set mvar 1
-
- } elseif {$item == "simple-gui"} {
- $m add checkbutton -label "$item" \
- -command "toggle_simple_gui" \
- -font $ffont \
- -variable beginner_mode
- } else {
- # Boolean
- $m add checkbutton -label "$item" \
- -command "do_var $item" \
- -font $ffont \
- -variable menu_var($item)
- if {![info exists menu_var($item)]} {
- set menu_var($item) 0
- }
- }
-
- if {$L_casc_count == -1} {
- incr menu_count($case)
- incr L_casc_count
- } elseif {$L_casc != ""} {
- incr L_casc_count
- } else {
- incr menu_count($case)
- }
-
- if {$mvar} {
- if {![info exists menu_var($item)]} {
- set menu_var($item) $unset_str
- }
- }
- }
-
- # Now make the little "(?)" help buttons
- global osname
- foreach case [array names menu_m] {
- if {$case == "Help"} {
- continue;
- }
- little_qs $menu_m($case);
- }
- foreach m $L_menus {
- little_qs $m
- }
-}
-
-proc check_update_vars {} {
- global last_query_all_time query_all_freq icon_mode
- global connected_to_x11vnc client_tail client_sock
-
- set now [clock seconds]
-
- set delay $query_all_freq
- if {$client_tail != "" && $client_sock == ""} {
- set delay [expr 2 * $query_all_freq]
- }
-
- if {$connected_to_x11vnc} {
- set quiet 0
- set refresh [expr "$last_query_all_time + $delay"]
-
- # puts "menu_posted $now $last_query_all_time"
- # puts "menu_posted $refresh"
-
- if {$now > $refresh} {
- append_text "Refreshing current settings... "
- query_all $quiet
- if {$quiet} {
- append_text "done\n"
- }
- }
- }
-}
-
-proc menu_posted {} {
- check_update_vars
-}
-
-proc props_widgets {state} {
- global props_buttons
- foreach w $props_buttons {
- $w configure -state $state
- }
- update
-}
-
-proc props_apply {} {
- global props_accept props_confirm props_viewonly props_shared
- global props_zeroconf props_javaview props_solid
- global props_passwd props_viewpasswd
- global prop0_accept prop0_confirm prop0_viewonly prop0_shared
- global prop0_zeroconf prop0_javaview prop0_solid
- global prop0_passwd prop0_viewpasswd
- global menu_var
- global client_sock
-
- props_widgets disabled
-
- set aft 500
- if {[info exists client_sock]} {
- if {$client_sock != ""} {
- set aft 150
- }
- }
- set did 0
-
- set fail 0
-
- if {$props_confirm != $prop0_confirm} {
- if {$did > 0} {after $aft}; incr did
- if {$props_confirm} {
- push_new_value "accept" "accept" "popup" 1
- } else {
- push_new_value "accept" "accept" "" 1
- }
- if {$menu_var(accept) == "popup"} {
- set props_confirm 1
- } elseif {$menu_var(accept) == ""} {
- set props_confirm 0
- }
- if {$props_confirm == $prop0_confirm} {incr fail}
- set prop0_confirm $props_confirm
- }
-
- if {$props_viewonly != $prop0_viewonly} {
- if {$did > 0} {after $aft}; incr did
- if {$props_viewonly} {
- push_new_value "viewonly" "viewonly" 1 1
- } else {
- push_new_value "viewonly" "noviewonly" 1 1
- }
- if {$menu_var(viewonly)} {
- set props_viewonly 1
- } else {
- set props_viewonly 0
- }
- if {$props_viewonly == $prop0_viewonly} {incr fail}
- set prop0_viewonly $props_viewonly
- }
-
- if {$props_shared != $prop0_shared} {
- if {$did > 0} {after $aft}; incr did
- if {$props_shared} {
- push_new_value "shared" "shared" 1 1
- } else {
- push_new_value "shared" "noshared" 1 1
- }
- if {$menu_var(shared)} {
- set props_shared 1
- } else {
- set props_shared 0
- }
- if {$props_shared == $prop0_shared} {incr fail}
- set prop0_shared $props_shared
- }
-
- if {$props_zeroconf != $prop0_zeroconf} {
- if {$did > 0} {after $aft}; incr did
- if {$props_zeroconf} {
- push_new_value "zeroconf" "zeroconf" 1 1
- } else {
- push_new_value "zeroconf" "nozeroconf" 1 1
- }
- if {$menu_var(zeroconf)} {
- set props_zeroconf 1
- } else {
- set props_zeroconf 0
- }
- if {$props_zeroconf == $prop0_zeroconf} {incr fail}
- set prop0_zeroconf $props_zeroconf
- }
-
- if {$props_javaview != $prop0_javaview} {
- if {$did > 0} {after $aft}; incr did
- if {$props_javaview} {
- push_new_value "http" "http" 1 1
- } else {
- push_new_value "http" "nohttp" 1 1
- }
- if {$menu_var(http)} {
- set props_javaview 1
- } else {
- set props_javaview 0
- }
- if {$props_javaview == $prop0_javaview} {incr fail}
- set prop0_javaview $props_javaview
- }
-
- if {$props_solid != $prop0_solid} {
- if {$did > 0} {after $aft}; incr did
- if {$props_solid} {
- push_new_value "solid" "solid" 1 1
- } else {
- push_new_value "solid" "nosolid" 1 1
- }
- if {$menu_var(solid)} {
- set props_solid 1
- } else {
- set props_solid 0
- }
- if {$props_solid == $prop0_solid} {incr fail}
- set prop0_solid $props_solid
- }
-
- set fpw 0
- if {$props_passwd != $prop0_passwd} {
- set fpw 1
- }
- set vpw 0
- if {$props_viewpasswd != $prop0_viewpasswd} {
- set vpw 1
- }
-
- set pw_ord [list]
- if {!$fpw && !$vpw } {
- # neither change
- ;
- } elseif {$fpw && !$vpw} {
- # full password change
- if {$props_passwd == ""} {
- if {$prop0_viewpasswd != ""} {
- # set view to "" as well and first
- set props_viewpasswd ""
- set pw_ord [list vpw fpw]
- } else {
- set pw_ord [list fpw]
- }
- } else {
- # assume view state OK
- set pw_ord [list fpw]
- }
-
- } elseif {!$fpw && $vpw} {
- # view password change
- if {$props_viewpasswd == ""} {
- # assume full state OK
- set pw_ord [list vpw]
- } else {
- if {$prop0_passwd == ""} {
- # could be trouble, x11vnc makes random
- # full passwd...
- set pw_ord [list vpw]
- } else {
- # OK, full non-null.
- set pw_ord [list vpw]
- }
- }
- } elseif {$fpw && $vpw} {
- # both full and view password change
- if {$props_passwd == "" && $props_viewpasswd == ""} {
- # OK, do view first
- set pw_ord [list vpw fpw]
- } elseif {$props_passwd == "" && $props_viewpasswd != ""} {
- # Not good, do view first anyway x11vnc will fix.
- set pw_ord [list vpw fpw]
- } elseif {$props_passwd != "" && $props_viewpasswd == ""} {
- # OK, view first
- set pw_ord [list vpw fpw]
- } elseif {$props_passwd != "" && $props_viewpasswd != ""} {
- # OK, full first
- set pw_ord [list fpw vpw]
- }
- }
-
- foreach case $pw_ord {
- if {$case == "fpw"} {
- if {$did > 0} {after $aft}; incr did
- push_new_value "passwd" "passwd" "$props_passwd" 1
- if {$props_passwd == $prop0_passwd} {incr fail}
- set prop0_passwd $props_passwd
- }
- if {$case == "vpw"} {
- if {$did > 0} {after $aft}; incr did
- push_new_value "viewpasswd" "viewpasswd" "$props_viewpasswd" 1
- if {$props_viewpasswd == $prop0_viewpasswd} {incr fail}
- set prop0_viewpasswd $props_viewpasswd
- }
- }
-
- if {$props_accept != $prop0_accept} {
- if {$did > 0} {after $aft}; incr did
- if {$props_accept} {
- push_new_value "unlock" "unlock" 1 0
- } else {
- push_new_value "lock" "lock" 1 0
- }
- if {$props_accept == $prop0_accept} {incr fail}
- set prop0_accept $props_accept
- }
-
- props_widgets normal
- if {$fail > 0} {
- return 0
- } else {
- return 1
- }
-}
-
-proc props_advanced {} {
- global icon_mode props_win full_win
- global props_advanced_first
-
- if ![info exists props_advanced_first] {
- center_win $full_win
- set props_advanced_first 1
- set first 1
- } else {
- set first 0
- }
- update
- wm deiconify $full_win
- update
-
- if {$first} {
- set w $full_win
- wm minsize $w [winfo width $w] [winfo height $w]
- }
- push_new_value "remote-cmd" "remote-cmd" "Q:clients" 1
-}
-
-proc do_props {} {
- global props_accept props_confirm props_viewonly props_shared
- global props_zeroconf props_javaview props_solid
- global props_passwd props_viewpasswd
- global prop0_accept prop0_confirm prop0_viewonly prop0_shared
- global prop0_zeroconf prop0_javaview prop0_solid
- global prop0_passwd prop0_viewpasswd
- global menu_var unset_str
- global have_labelframes ffont bfont
- global props_buttons icon_noadvanced
- global icon_mode icon_mode_at_startup
- global screen_height screen_width
- global do_props_msg
-
- set msg ""
- if {[info exists do_props_msg]} {
- set msg $do_props_msg
- }
-
- check_update_vars
-
- set pady 0.5m
- set pady 0.3m
- if {$screen_height <= 360} {
- set pady 0m
- }
-
- if [info exists menu_var(deny)] {
- if {$menu_var(deny) == $unset_str || $menu_var(deny) == 0} {
- set props_accept 1
- } else {
- set props_accept 0
- }
- } else {
- set menu_var(deny) 0
- set props_accept 1
- }
- set prop0_accept $props_accept
-
- if [info exists menu_var(accept)] {
- if {$menu_var(accept) == $unset_str || $menu_var(accept) == ""} {
- set props_confirm 0
- } else {
- set props_confirm 1
- }
- } else {
- set menu_var(accept) ""
- set props_confirm 0
- }
- set prop0_confirm $props_confirm
-
- if [info exists menu_var(viewonly)] {
- if {$menu_var(viewonly) == $unset_str || $menu_var(viewonly) == ""} {
- set props_viewonly 0
- } elseif ($menu_var(viewonly)) {
- set props_viewonly 1
- } else {
- set props_viewonly 0
- }
- } else {
- set menu_var(viewonly) 0
- set props_viewonly 0
- }
- set prop0_viewonly $props_viewonly
-
- if [info exists menu_var(shared)] {
- if {$menu_var(shared) == $unset_str || $menu_var(shared) == ""} {
- set props_shared 0
- } elseif ($menu_var(shared)) {
- set props_shared 1
- } else {
- set props_shared 0
- }
- } else {
- set menu_var(shared) 0
- set props_shared 0
- }
- set prop0_shared $props_shared
-
- if [info exists menu_var(zeroconf)] {
- if {$menu_var(zeroconf) == $unset_str || $menu_var(zeroconf) == ""} {
- set props_zeroconf 0
- } elseif ($menu_var(zeroconf)) {
- set props_zeroconf 1
- } else {
- set props_zeroconf 0
- }
- } else {
- set menu_var(zeroconf) 0
- set props_zeroconf 0
- }
- set prop0_zeroconf $props_zeroconf
-
- if [info exists menu_var(http)] {
- if {$menu_var(http) == $unset_str || $menu_var(http) == ""} {
- set props_javaview 0
- } elseif ($menu_var(http)) {
- set props_javaview 1
- } else {
- set props_javaview 0
- }
- } else {
- set menu_var(http) 0
- set props_javaview 0
- }
- set prop0_javaview $props_javaview
-
- if [info exists menu_var(solid)] {
- if {$menu_var(solid) == $unset_str || $menu_var(solid) == ""} {
- set props_solid 0
- } elseif ($menu_var(solid)) {
- set props_solid 1
- } else {
- set props_solid 0
- }
- } else {
- set menu_var(solid) 0
- set props_solid 0
- }
- set prop0_solid $props_solid
-
- if ![info exists props_passwd] {
- set props_passwd ""
- }
- set prop0_passwd $props_passwd
-
- if ![info exists props_viewpasswd] {
- set props_viewpasswd ""
- }
- set prop0_viewpasswd $props_viewpasswd
-
- if [info exists props_buttons] {
- catch {unset props_buttons}
- }
- set props_buttons [list]
-
- set wp .props
- set w $wp
- catch {destroy $wp}
- toplevel $wp
- wm title $wp "x11vnc Properties"
- frame $w.lf
- set w $w.lf
- set b1 "$w.buttons1"
- frame $b1
- button $b1.ok -text OK -command "if {\[props_apply\]} {destroy $wp}" -font $bfont
- button $b1.cancel -text Cancel -command "destroy $wp" -font $bfont
- button $b1.apply -text Apply -command "props_apply" -font $bfont
-
- bind $w <KeyPress-Escape> "destroy $wp"
-
- pack $b1.ok $b1.cancel $b1.apply -side left -expand 0
- lappend props_buttons $b1.apply $b1.cancel $b1.ok
-
- set b2 "$w.buttons2"
- frame $b2
-
- button $b2.advanced -text " Advanced ... " \
- -command "destroy $wp; props_advanced" -font $bfont
- if {! $icon_noadvanced} {
- lappend props_buttons $b2.advanced
- pack $b2.advanced -side left -expand 0
- }
-
- button $b2.help -text " Help " -command "menu_help Properties" -font $bfont
- lappend props_buttons $b2.help
- pack $b2.help -side left -expand 0
-
- set pw "$w.passwd"
- if {$have_labelframes} {
- labelframe $pw -text "Password" -font $bfont
- } else {
- frame $pw
- set l $pw.l
- label $l -text "Password:" -justify left -anchor w -font $bfont
- pack $pw.l -fill x -expand 1 -padx 1m -pady 0m -side top
- }
- entry $pw.e -show "*" -textvariable props_passwd -font $bfont
- pack $pw.e -fill x -expand 1 -padx 1m -pady $pady -side top
-
- global x11vnc_icon_mode
- if {! $x11vnc_icon_mode} {
- catch { $pw.e configure -state disabled}
- if {! $have_labelframes} {
- catch { $pw.l configure -state disabled}
- }
- } else {
- lappend props_buttons $pw.e
- }
-
-
- set vp "$w.viewpw"
- if {$have_labelframes} {
- labelframe $vp -text "ViewOnly Password" -font $bfont
- } else {
- frame $vp
- set l $vp.l
- label $l -text "ViewOnly Password:" -justify left -anchor w -font $bfont
- pack $vp.l -fill x -expand 1 -padx 1m -pady 0m -side top
- }
- entry $vp.e -show "*" -textvariable props_viewpasswd -font $bfont
- pack $vp.e -fill x -expand 1 -padx 1m -pady $pady -side top
-
- if {! $x11vnc_icon_mode} {
- catch { $vp.e configure -state disabled}
- if {! $have_labelframes} {
- catch { $vp.l configure -state disabled}
- }
- } else {
- lappend props_buttons $vp.e
- }
-
- if {! $icon_mode_at_startup} {
- $vp.e configure -state disabled
- catch {$vp.l configure -state disabled}
- catch {$vp configure -state disabled}
- catch {$vp configure -foreground grey60}
- $pw.e configure -state disabled
- catch {$pw.l configure -state disabled}
- catch {$pw configure -state disabled}
- catch {$pw configure -foreground grey60}
- }
-
- set sb "$w.solid"
- frame $sb
- checkbutton $sb.button -text "Solid Background Color" \
- -variable props_solid -anchor w -font $bfont
- pack $sb.button -fill x -expand 1 -padx 1m -pady $pady
-
- set jv "$w.javaview"
- frame $jv
- checkbutton $jv.button -text "Serve Java Viewer Applet" \
- -variable props_javaview -anchor w -font $bfont
- pack $jv.button -fill x -expand 1 -padx 1m -pady $pady
-
- set zc "$w.zeroconf"
- frame $zc
- checkbutton $zc.button -text "Advertise Service (Zeroconf)" \
- -variable props_zeroconf -anchor w -font $bfont
- pack $zc.button -fill x -expand 1 -padx 1m -pady $pady
-
- set sh "$w.shared"
- frame $sh
- checkbutton $sh.button -text "Shared" \
- -variable props_shared -anchor w -font $bfont
- pack $sh.button -fill x -expand 1 -padx 1m -pady $pady
-
- set vo "$w.viewonly"
- frame $vo
- checkbutton $vo.button -text "All Clients ViewOnly" \
- -variable props_viewonly -anchor w -font $bfont
- pack $vo.button -fill x -expand 1 -padx 1m -pady $pady
-
- set cf "$w.confirm"
- frame $cf
- checkbutton $cf.button -text "Ask for Confirmation" \
- -variable props_confirm -anchor w -font $bfont
- pack $cf.button -fill x -expand 1 -padx 1m -pady $pady
-
- set ac "$w.accept"
- frame $ac
- checkbutton $ac.button -text "Accept Connections" \
- -variable props_accept -anchor w -font $bfont
- pack $ac.button -fill x -expand 1 -padx 1m -pady $pady
-
- set px "6m"
- pack $b1 -side bottom -fill x -pady $pady -padx $px
- pack $b2 -side bottom -fill x -pady $pady -padx $px
- pack $vp -side bottom -fill x -pady $pady -padx $px
- pack $pw -side bottom -fill x -pady $pady -padx $px
- pack $sb -side bottom -fill x -pady 0m -padx $px
- pack $jv -side bottom -fill x -pady 0m -padx $px
- pack $zc -side bottom -fill x -pady 0m -padx $px
- pack $sh -side bottom -fill x -pady 0m -padx $px
- pack $vo -side bottom -fill x -pady 0m -padx $px
- pack $cf -side bottom -fill x -pady 0m -padx $px
- pack $ac -side bottom -fill x -pady 0m -padx $px
-
- global show_props_instructions
- if {![info exists show_props_instructions]} {
- set show_props_instructions 1
- }
-
- wm withdraw .props
-
- set wl $w
-
- pack $wl -side left
-
- if {$msg != ""} {
- set tw [textwidth $msg]
- set th [textheight $msg]
- set th [expr $th - 1]
- set ms ".props.msg"
- text $ms -font $ffont -relief ridge -width $tw -height $th
- $ms insert 1.0 $msg
-
- set si "$wl.instructions"
- frame $si
- checkbutton $si.button -text "Show Instructions" \
- -variable show_props_instructions -anchor w -font $bfont \
- -command "toggle_instructions $ms $pady $px"
-
- pack $si.button -fill x -expand 1 -padx 1m -pady $pady
- pack $si -side bottom -fill x -pady 0m -padx $px
-
- if {$show_props_instructions} {
- pack $ms -side left -fill both
- }
-
- update
- }
-
-
- lappend props_buttons $ac.button $cf.button $vo.button $sh.button $zc.button $jv.button $sb.button
-
-
- set w .props
- update
- wm resizable $w 1 0
- center_win $w
- update
-
- #wm minsize $w [winfo width $w] [winfo height $w]
-
- tkwait window $w
- set show_props_instructions 0
-}
-
-proc toggle_instructions {ms pady px} {
- global show_props_instructions
- if {$show_props_instructions} {
- pack $ms -side left -fill both
- } else {
- pack forget $ms
- }
- catch {pack .props}
- update
-}
-
-proc do_new_client {} {
- global newclient ffont bfont
-
- set w .newclient
- catch {destroy $w}
- toplevel $w
- label $w.l -text "Hostname: " -font $bfont
- set newclient ""
- entry $w.e -width 16 -textvariable newclient -font $bfont
- button $w.b -text OK -command "destroy $w" -font $bfont
- button $w.h -text Help -command "menu_help NewClient" -font $bfont
- bind $w.e <Return> "update; after 100; destroy $w"
-
- wm title $w "New Client"
-
- pack $w.l $w.e $w.h $w.b -side left -pady 1m -padx 0.5m
- focus $w.e
- center_win $w
- update
-
- tkwait window $w
-
- regsub -all {[{}()~!$&*|;'"`{}<>\[\]]} $newclient "" newclient
- #'
- if {$newclient != ""} {
- push_new_value "connect" "connect" "$newclient" 1
- }
-}
-
-proc do_disconnect_all {} {
- push_new_value "disconnect" "disconnect" "all" 1
-}
-
-proc do_disconnect_client {id} {
- push_new_value "disconnect" "disconnect" "$id" 1
-}
-
-proc popup_post {m} {
- global popup_cascade_posted client_balloon
- global client_id_list
-
- set popup_cascade_posted 0
-
- set wd "$m.disconnect"
-
- if {![winfo exists $wd]} {
- return
- }
-
- catch {$wd delete 0 end}
-
- $wd add command -label "Disconnect client:"
- $wd add separator
- $wd add command -label "All Clients" -command do_disconnect_all
-
- if {![info exists client_id_list]} {
- return
- }
-
- foreach client $client_id_list {
- if {$client == ""} {
- continue
- }
- if {[regexp {^([^:]*):(.*)$} $client mat id lab]} {
- set nid [expr "$id + 0"]
- $wd add command -label "$nid $lab" \
- -command "do_disconnect_client $id"
- }
- }
-}
-
-proc pmenu {m x y} {
- if {![winfo exists $m]} {
- return
- }
- set x [expr $x-10]
- set y [expr $y-10]
- $m post $x $y
- # XXX more care needed
- grab set -global $m
-}
-
-proc set_client_balloon {str} {
- global client_balloon vnc_display
- global client_id_list
-
- set client_id_list [list]
-
- set client_balloon "$vnc_display"
- set count 0
- regsub -all {^.*aro=clients:} $str "" str
- regsub -all {aro=.*$} $str "" str
- regsub -all {ans=.*$} $str "" str
- foreach client [split $str ","] {
- #puts "client: $client"
- if [regexp {^[ ]*$} $client] {
- continue
- }
- if {[regexp {^(.*):(.*):(.*):(.*):(.*):(.*):(.*):(.*):(.*)$} \
- $client m0 m1 m2 m3 m4 m5 m6 m7 m8 m9]} {
- set id $m1
- set nid [expr "$m1 + 0"]
- set ip $m2
- set port $m3
- set user $m4
- set unix $m5
- if {[string length $user] >= 24} {
- # weird identd hash...
- set user [string range $user 0 8]
- set user "${user}..."
- }
- if {$unix != "" && $unix != "none"} {
- set user $unix
- }
- set host $m6
- set input $m7
- set vo $m8
- set ltime $m9
- if [regexp {^[ ]*$} $host] {
- set host $ip
- }
- set client_balloon "${client_balloon}\n$nid $user\@$host"
- if {$vo == "1"} {
- set client_balloon "${client_balloon} - view"
- lappend client_id_list "$id:$user\@$host - view"
- } else {
- set client_balloon "${client_balloon} - full"
- lappend client_id_list "$id:$user\@$host - full"
- }
- } else {
- set i [expr $count+1]
- if {$i == 1} {
- set client_balloon "${client_balloon}\nunknown-host$i"
- }
- }
- incr count
- }
- if {$count == 0} {
- set client_balloon "${client_balloon}\nNo connections."
- }
- icon_win_cfg $count
-}
-
-proc read_client_info {channel} {
- global x11vnc_client_file client_str client_info_read
- global read_client_info_lock
- global read_clients
- set db 0
-
- set read_clients 0
-
- if {![info exists read_client_info_lock]} {
- set read_client_info_lock 0
- }
-
- if {$channel != ""} {
-
- if {$read_client_info_lock} {
- return
- }
- set read_client_info_lock 1
- after 100
- set str ""
- set count [gets $channel str]
- if {$db} {puts stderr "read_client_info-$channel: $str"}
-
- if {$count == -1 || [eof $channel]} {
- close $channel
- catch {file delete $x11vnc_client_file}
- set read_client_info_lock 0
- clean_icon_exit
- }
- if {$count > 0 && ![regexp {^[ ]*$} $str]} {
- set client_info_read 1
- if {$str == "quit"} {
- catch {file delete $x11vnc_client_file}
- set read_client_info_lock 0
- clean_icon_exit
- } elseif {$str == "skip"} {
- ;
- } elseif [regexp {^clients:} $str] {
- regsub {^clients:} $str "" str
- set read_clients 1
- if {$str == "none"} {
- set str ""
- }
- update_clients_menu $str
- set client_str $str
- set_client_balloon $str
- }
- }
- set read_client_info_lock 0
- }
-}
-
-proc check_set_vnc_display {} {
-
- global read_clients check_set_vnc_display_done
-
- if {[info exists check_set_vnc_display_done]} {
- return
- }
- if {[info exists read_clients]} {
- if {$read_clients} {
- after 250
- query_all
- global client_str
- set_client_balloon $client_str
- set check_set_vnc_display_done 1
- }
- }
-}
-
-proc read_client_tail {} {
- global client_tail
-
- if {$client_tail != ""} {
- read_client_info $client_tail
- check_set_vnc_display
- }
-}
-
-proc read_client_sock {} {
- global client_sock
-
- if {$client_sock != ""} {
- read_client_info $client_sock
- check_set_vnc_display
- }
-}
-
-proc show_client_balloon {} {
- global icon_mode icon_win props_win full_win
- global client_balloon ffont connected_to_x11vnc
-
- set noinfo "tkx11vnc: no client information"
- set noinfo "$noinfo\navailable from x11vnc ..."
- if ![info exists client_balloon] {
- set client_balloon $noinfo
- }
- if {$client_balloon == ""} {
- set client_balloon $noinfo
- }
- if {! [info exists icon_win]} {
- return
- } elseif {$icon_win == ""} {
- return
- } elseif {! [winfo exists $icon_win]} {
- return
- }
-
- set x [expr [winfo rootx $icon_win] + ([winfo width $icon_win]/2)]
- set y [expr [winfo rooty $icon_win] + [winfo height $icon_win] + 4]
-
- set infotext $client_balloon
- if {!$connected_to_x11vnc} {
- set infotext "Not currently attached to x11vnc\nLast available info:\n$infotext"
- }
-
- set w .client_balloon
- catch {destroy $w}
- toplevel $w -bg black -screen [winfo screen $icon_win]
- wm overrideredirect $w 1
- label $w.l -text "$infotext" -relief flat -bg "#ffffaa" -fg black \
- -padx 2 -pady 0 -anchor w -justify left -font $ffont
- pack $w.l -side left -padx 1 -pady 1
-
- set w2 [winfo reqwidth $w.l]
- set h2 [winfo reqheight $w.l]
-
- set W [winfo screenwidth $w]
- set H [winfo screenheight $w]
-
- if {[expr $x+$w2] > $W} {
- set w3 [winfo width $icon_win]
- set x [expr "$W - $w2 - $w3 - 4"]
- }
- if {[expr $y+$h2] > $H} {
- set h3 [winfo height $icon_win]
- set y [expr "$H - $h2 - $h3 - 4"]
- }
-
- wm geometry $w +${x}+${y}
-}
-
-proc kill_client_balloon {} {
- global client_balloon_id client_balloon_win
- if [info exists client_balloon_id] {
- catch {after cancel $client_balloon_id}
- }
- if [winfo exists .client_balloon] {
- destroy .client_balloon
- }
-}
-
-proc icon_win_cfg {clients} {
- global icon_win client_tail client_sock client_info_read
-
- if {! [info exists icon_win]} {
- return
- } elseif {$icon_win == ""} {
- return
- } elseif {! [winfo exists $icon_win]} {
- return
- }
- if {$clients > 0} {
- $icon_win configure -bg black -fg white
- } else {
- $icon_win configure -bg white -fg black
- }
-
- if {$client_tail == "" || !$client_info_read} {
- if {$client_sock == ""} {
- $icon_win configure -fg red
- }
- }
-}
-
-proc server_accept {sock addr port} {
- global socket_cookie server socket_got_callback
- global client_tail client_sock
- set db 0
-
- if {$db} {puts stderr "sock=$sock addr=$addr port=$port"}
-
- update; update idletasks
- after 50
- update; update idletasks
- set count [gets $sock str]
-
- if {$count >= 0} {
- set str [string trim $str]
- if {$db} {puts stderr "server_accept: \"$str\""}
- if {$str == "COOKIE:$socket_cookie"} {
- set client_sock $sock
- if {$db} {puts stderr "cookie matched. $client_sock"}
- } else {
- if {$db} {puts stderr "cookie NO matched."}
- }
- }
- catch {close $server}
- set socket_got_callback 1
- if {$db} {puts stderr "socket_got_callback $socket_got_callback"}
-}
-
-proc try_client_info_sock {} {
- global socket_cookie server socket_got_callback
- global x11vnc_started x11vnc_xdisplay hostname client_sock
- global x11vnc_xdisplay0 menu_var
-
- set db 0
-#dtime t1
- set start 13037
- set tries 100
- set socket_got_callback 0
-
- set xd $x11vnc_xdisplay
- if {$xd == "" && $x11vnc_xdisplay0 != ""} {
- set xd $x11vnc_xdisplay0
- }
- if {$xd == "" && [info exists menu_var(display)]} {
- set xd $menu_var(display)
- }
-
- set myaddr ""
- regsub {\..*$} $hostname "" shost
- if {$x11vnc_started} {
- set myaddr "127.0.0.1"
- } elseif {$xd != ""} {
- if {[regexp {^:} $xd]} {
- set myaddr "127.0.0.1"
- } elseif {[regexp -nocase "^$shost" $xd]} {
- set myaddr "127.0.0.1"
- } elseif {[regexp -nocase "^localhost" $xd]} {
- set myaddr "127.0.0.1"
- } else {
- set myaddr $hostname
- }
- } else {
- set myaddr $hostname
- }
-
- for {set i 0} {$i <= $tries} {incr i} {
- set port [expr $start + $i]
- set server [socket -server server_accept -myaddr $myaddr $port]
- if {$server == ""} {
- continue
- }
- if {[eof $server]} {
- continue
- }
- set err ""
- catch {set err [fconfigure $server -error]}
- #puts "err: $server: $err"
- if {$err == ""} {
- break
- }
- }
- if {$server == ""} {
- append_text "try_client_info_sock: server socket failed.\n"
- return
- }
- if {! $x11vnc_started} {
- run_remote_cmd [list "-nosync" "-R" "noop"]
- if {$db} {dtime A}
- after 250
- if {$db} {dtime A}
- }
-
- # set the cookie to some obscured randomness
- set socket_cookie [clock clicks]
- set r [expr rand()]
- if {$r != ""} {
- append socket_cookie $r
- }
- set r ""
- catch {set r [winfo id .]}
- if {$r != ""} {
- append socket_cookie $r
- }
- if {[regexp {([0-9])([0-9])$} [clock clicks] m m1 m2]} {
- regsub -all {\.} $socket_cookie $m1 socket_cookie
- regsub -all {x} $socket_cookie $m2 socket_cookie
- }
- run_remote_cmd [list "-nosync" "-R" \
- "client_info_sock:$myaddr:$port:$socket_cookie"]
-#dtime t2
- if {$db} {puts "client_info_sock:$myaddr:$port:$socket_cookie"}
- for {set i 0} {$i < 10} {incr i} {
- after 50
- update; update idletasks
-#dtime aa
- if {$socket_got_callback != 0} {
-#puts "break-"
- break
- }
- }
-#dtime t3
-
- set aftid ""
- if {$socket_got_callback == 0} {
- set aftid [after 10000 {set socket_got_callback 2}]
- tkwait variable socket_got_callback
- }
-
- if {$aftid != ""} {
- catch {after cancel $aftid}
- }
-
- if {$socket_got_callback != 1} {
- puts stderr "try_client_info_sock failed: no callback\n"
- catch {close $server}
- } else {
- setup_client_sock 1
- }
-#dtime t4
-}
-
-proc set_icon_label {} {
- global icon_win
-
- set lab [get_icon_label]
-
- if {! [info exists icon_win]} {
- return
- } elseif {$icon_win == ""} {
- return
- } elseif {! [winfo exists $icon_win]} {
- return
- }
-
- if {[info exists icon_win]} {
- $icon_win configure -text $lab
- }
-}
-
-proc get_icon_label {{set 0}} {
- global icon_minimal
-
- set lab0 "x11\nvnc"
-
- if {$icon_minimal} {
- set lab [get_vnc_display_number]
- if {$lab != "none"} {
- #set lab " :$lab"
- set lab ":$lab"
- } else {
- set lab "-"
- }
- } else {
- set lab $lab0
- }
- return $lab
-}
-
-# currently unused
-proc lmenu {menu} {
- global popup_cascade_posted
- global left_iconwin_menu
- set left_iconwin_menu 1
- after 100
- update
- if {!$popup_cascade_posted && $left_iconwin_menu} {
- for {set i 0} {$i < 3} {incr i} {
- after 100
- update
- }
- if {!$popup_cascade_posted && $left_iconwin_menu} {
- $menu unpost
- return
- }
- }
- # kludge for WindowView
- if {$popup_cascade_posted} {
- focus $menu
- }
-}
-
-proc old_balloon {} {
- global client_str saved_clients_str
- set str ""
- if {[info exists client_str]} {
- if {$client_str != ""} {
- set str $client_str
- }
- }
- if {$str == ""} {
- if {[info exists saved_clients_str]} {
- set str $saved_clients_str
- }
- }
- if {$str != ""} {
- set_client_balloon $str
- }
-}
-
-proc get_custom_menu_items {} {
- global env custom_last_read
-
- if {![info exists custom_last_read]} {
- set custom_last_read 0
- }
- if {[info exists env(X11VNC_CUSTOM_GUI)]} {
- set custom "$env(X11VNC_CUSTOM_GUI)"
- } elseif {![info exists env(HOME)]} {
- return [list "none"]
- } else {
- set custom "$env(HOME)/.x11vnc.gui"
- }
- if {![file exists $custom]} {
- return [list "none"]
- }
-
-# if {[file mtime $custom] <= $custom_last_read} {
-# return [list "nochange"]
-# }
-
- set in ""
- catch {set in [open $custom "r"]}
- if {$in == ""} {
- return [list "none"]
- }
-
- set custom_last_read [clock seconds]
-
- set count 0
- while {[gets $in line] > -1} {
- if {[regexp {^[ \t]*#} $line]} {
- continue
- }
- set line [string trim $line]
- if {$line != ""} {
- lappend items $line
- incr count
- }
- }
- close $in
-
- if {$count > 0} {
- return $items
- } else {
- return [list "none"]
- }
-}
-
-proc make_custom_menu {menu font} {
- set items [get_custom_menu_items]
- set i0 [lindex $items 0]
- catch {$menu delete 0 end}
- if {$i0 != "none"} {
- $menu add command -font $font -label "Custom items:"
- $menu add separator
- foreach item $items {
- if {$item == "sep" || $item == "separator"} {
- $menu add separator
- continue
- }
- if {[regexp {^action:(.*)$} $item m action]} {
- $menu add command -font $font -label "$action" \
- -command "do_var $action"
- continue
- }
- $menu add command -font $font -label "$item" \
- -command "run_remote_cmd \[list \"-R\" \"$item\"\]"
- }
- }
-}
-
-proc make_icon {} {
- global icon_mode icon_embed_id icon_win props_win full_win
- global tray_embed tray_running env
- global x11vnc_client_file client_tail client_sock client_str saved_clients_str
- global client_balloon_id
- global bfont sfont snfont ffont
- global icon_minimal gui_start_mode
- global popup_cascade_posted menu_var x11vnc_gui_geom
- set min_x 24
- set min_y 24
-
- set font $bfont
- set mfont $font
-
- if {$tray_embed} {
- set font $sfont
- set mfont $snfont
- }
- if {[info exists env(X11VNC_ICON_FONT)]} {
- set font $env(X11VNC_ICON_FONT)
- }
- if {[regexp {([0-9][0-9]*)x([0-9][0-9]*)} $x11vnc_gui_geom m mx my]} {
- if {$mx < $min_x} {
- set min_x $mx
- }
- if {$my < $min_y} {
- set min_y $my
- }
- }
- wm minsize . $min_x $min_y
-
- if {$tray_embed && $tray_running} {
- wm withdraw .
- }
-
- set l .icon
- set icon_win $l
- catch destroy {$icon_win}
- if {$icon_minimal} {
- set bw 1
- } else {
- set bw 5
- }
- set lab [get_icon_label]
- label $l -text $lab -borderwidth $bw -font $font
- icon_win_cfg 0
-
-
- set popup_cascade_posted 0
- pack $l -fill both -expand 1
- set menu "$l.menu"
- menu $menu -tearoff 0 -postcommand "popup_post $menu"
- $menu add command -font $mfont -label "Properties" -command do_props
- $menu add command -font $mfont -label "Help" -command "menu_help Tray"
- $menu add command -font $mfont -label "Logfile" -command show_logfile
- $menu add separator
- $menu add command -font $mfont -label "New Client" -command do_new_client
-
- set wd "$menu.disconnect"
- catch {destroy $wd}
- menu $wd -tearoff 0 -font $ffont \
- -postcommand {set popup_cascade_posted 1}
- $wd add command -label "Disconnect client:"
- $wd add separator
- $wd add command -label "All Clients" -command do_disconnect_all
- $menu add cascade -font $mfont -label "Disconnect:" -menu $wd
-
- $menu add separator
-
- set wv "$menu.windowview"
- catch {destroy $wv}
- menu $wv -tearoff 0 -font $ffont \
- -postcommand {set popup_cascade_posted 1}
- foreach val {full icon tray} {
- $wv add radiobutton -label "$val" \
- -value "$val" -font $ffont \
- -command "do_var WindowView" \
- -variable menu_var(WindowView)
- }
- $menu add cascade -font $mfont -label "Window View:" -menu $wv
-
- $menu add command -font $mfont -label "Dismiss" -command "$menu unpost"
- $menu add command -font $mfont -label "Stop x11vnc" -command clean_icon_exit
-
- set items [get_custom_menu_items]
- set i0 [lindex $items 0]
- if {$i0 != "none" && $i0 != "nochange"} {
- $menu add separator
- set cm "$menu.custom"
- catch {destroy $cm}
- menu $cm -tearoff 0 -font $ffont \
- -postcommand "set popup_cascade_posted 1; make_custom_menu $cm $ffont"
- $menu add cascade -font $mfont -label "Custom:" -menu $cm
- }
-
- bind $icon_win <ButtonRelease-1> "pmenu $menu %X %Y"
- bind $icon_win <ButtonRelease-3> "pmenu $menu %X %Y"
- bind $icon_win <Enter> {set client_balloon_id [after 500 show_client_balloon]}
- bind $icon_win <Button> {kill_client_balloon}
- bind $icon_win <Leave> {kill_client_balloon}
- bind $icon_win <Shift-ButtonRelease-1> {kill_client_balloon; show_client_balloon}
- bind $icon_win <ButtonRelease-2> {kill_client_balloon; show_client_balloon}
-# bind $menu <Leave> "lmenu $menu"
-# bind $menu <Enter> "set left_iconwin_menu 0"
-# bind $menu <KeyPress-Escape> "$menu unpost"
-
- bind . <Control-KeyPress-c> {destroy .; exit 0}
-
- if {!$tray_embed || !$tray_running} {
- global x11vnc_gui_geom
- if {$x11vnc_gui_geom != ""} {
- set doit 1
- if {[regexp {x} $x11vnc_gui_geom]} {
- if {$gui_start_mode == "full"} {
- set doit 0
- }
- }
- if {$doit} {
- wm geometry . $x11vnc_gui_geom
- }
- }
- }
- wm iconname . "tkx11vnc"
- wm title . "tkx11vnc"
- update
- if {$tray_embed && $tray_running} {
- #wm deiconify .; # why did we have this???
- #after 10000 {wm deiconify .; puts "reqheight [winfo reqheight .]"; puts "reqwidth [winfo reqwidth .]"; puts "height [winfo height .]"; puts "width [winfo width .]"}
- } else {
- wm deiconify .
- }
- update
-
-#puts "reqheight [winfo reqheight .]"
-#puts "reqwidth [winfo reqwidth .]"
-#puts "height [winfo height .]"
-#puts "width [winfo width .]"
-#puts "AAA"
-
- old_balloon
-}
-
-proc setup_client_channel {} {
- global client_sock client_tail
-
-# XXX/setup_client_channel
- if {$client_sock == "" } {
- stop_watch on
- try_client_info_sock
- if {$client_sock == "" } {
- after 500
- try_client_info_sock
- }
- stop_watch off
- }
- if {$client_tail == "" && $client_sock == ""} {
- set m "\n"
- set m "${m}tkx11vnc:\n"
- set m "${m}\n"
- set m "${m} Warning -- running in icon/tray mode but the\n"
- set m "${m} connected client info channel from x11vnc is\n"
- set m "${m} not working. The viewer client list and icon\n"
- set m "${m} color indicator will not be accurate.\n"
- set m "${m}\n"
- set m "${m} You may need to restart \"x11vnc -gui tray ...\"\n"
- set m "${m} for this to work properly.\n"
- set m "${m}\n"
- textwin "Warning" "Warning" $m
- update
- }
- dtime C
-}
-
-proc clean_client_tail {} {
- global client_tail client_info_read
- if [info exists client_tail] {
- if {$client_tail != ""} {
- set p ""
- catch {set p [pid $client_tail]}
- if {$p != ""} {
- catch {exec kill -TERM $p >/dev/null 2>/dev/null}
- }
- catch {close $client_tail}
- set client_tail ""
- }
- }
- set client_info_read 0
-}
-
-proc clean_icon_exit {} {
- clean_client_tail
- push_new_value "stop" "stop" 1 0
- set_connected no
- update
- destroy .
- exit
-}
-
-proc make_gui {mode} {
- global icon_mode tray_embed tray_running full_win icon_win
- global top_widget_names x11vnc_gui_geom
- global gui_current_state make_gui_count
- global x11vnc_connect connected_to_x11vnc
- global x11_display
- global gui_start_mode
-
- incr make_gui_count
-
- if {$gui_start_mode == ""} {
- set gui_start_mode $mode
- }
-
- wm withdraw .
-
- set full_geom ""
- if {[winfo exists .full]} {
- catch {set full_geom [wm geometry .full]}
- }
-
- set fw .full
- set full_win $fw
- catch {pack forget $full_win}
- catch {pack forget $icon_win}
- catch {destroy $full_win}
- catch {destroy $icon_win}
-
- wm minsize . 1 1
-
- set gui_current_state ""
-
- if {$mode == "full"} {
- frame $fw
- set icon_mode 0
-
- wm protocol . WM_DELETE_WINDOW "destroy .; exit"
- make_widgets $fw
-
- set w "."
- wm geometry $w ""
- if {$x11vnc_gui_geom != ""} {
- set doit 1
- if {[regexp {x} $x11vnc_gui_geom]} {
- if {$gui_start_mode != $mode} {
- set doit 0
- }
- }
- if {$doit} {
- wm geometry $w $x11vnc_gui_geom
- }
- }
- pack $fw -fill both -expand 1
-
- } elseif {$mode == "icon" || $mode == "tray"} {
-
- toplevel $fw
- wm withdraw $fw
-
- wm protocol $fw WM_DELETE_WINDOW "wm withdraw .full"
- wm protocol . WM_DELETE_WINDOW "clean_icon_exit"
-
- if {$mode == "icon"} {
- set tray_embed 0
- } elseif {$mode == "tray"} {
- set tray_embed 1
- }
- set icon_mode 1
- make_widgets $fw
- set w $fw
- make_icon
- wm geometry $fw ""
- wm geometry . ""
- } else {
- return
- }
- set_view_variable $mode
- set gui_current_state $mode
-
-
- update
- if {!$tray_embed || !$tray_running} {
- wm deiconify .
- }
- update idletasks
- wm minsize $w [winfo width $w] [winfo height $w]
- if {$mode == "full" && $make_gui_count > 1} {
- center_win .
- }
-
-
- if {$make_gui_count == 1} {
- copy_default_vars
- if {$x11vnc_connect} {
- try_connect_and_query_all
- } else {
- insert_cmdline_vars
- }
- } else {
- set_name "RESTORE"
- }
-
- setup_client_tail
-
- set_widgets
-
- if {$mode == "tray"} {
- setup_tray_embed
- }
-}
-
-proc make_widgets {top} {
- global template make_gui_count
- global menu_b menu_m menu_count
- global item_opts item_bool item_case item_menu item_entry menu_var unset_str
- global item_cascade
- global info_label info_str x11_display vnc_display
- global text_area text_area_str
- global entry_box entry_str entry_set entry_label entry_ok entry_browse
- global entry_help entry_skip
- global bfont ffont beginner_mode
- global helptext helpremote helplabel
- global icon_mode icon_win props_win full_win
- global top_widget_names
- global screen_height screen_width
-
-
- # Make the top label
- set label_width 84
- if {$screen_width <= 400} {
- set label_width 64
- }
- set info_label "$top.info"
- label $info_label -textvariable info_str -bd 2 -relief groove \
- -anchor w -width $label_width -font $ffont
- pack $info_label -side top -fill x -expand 0
-
- set top_widget_names(info) $info_label
-
- # Extract the Rows:
- set row 0;
- set colmax 0;
- foreach line [split $template "\n"] {
- if {[regexp {^Row: (.*)} $line rest]} {
- set col 0
- foreach case [split $rest] {
- if {$case == "" || $case == "Row:"} {
- continue
- }
- set menu_row($case) $row
- set menu_col($case) $col
-
- lappend cases($col) $case;
- set len [string length $case]
- if {[info exists max_len($col)]} {
- if {$len > $max_len($col)} {
- set max_len($col) $len
- }
- } else {
- set max_len($col) $len
- }
- incr col
- if {$col > $colmax} {
- set colmax $col
- }
- }
- incr row;
- }
- }
-
- # Make frames for the rows and make the menu buttons.
- set f "$top.menuframe"
- frame $f
- for {set c 0} {$c < $colmax} {incr c} {
- set colf "$f.menuframe$c"
- frame $colf
- pack $colf -side left -fill y
- set fbg [$colf cget -background]
- foreach case $cases($c) {
- set menub "$colf.menu$case";
- set menu "$colf.menu$case.menu";
- set menu_b($case) $menub
- set menu_m($case) $menu
- set ul 0
- foreach char [split $case ""] {
- set char [string tolower $char]
- if {![info exists underlined($char)]} {
- set underlined($char) 1
- break
- }
- incr ul
- }
- global osname
- set tstr "$case"
- if {$osname == "Darwin"} {
- #set tstr " $case "
- }
- menubutton $menub -text "$tstr" -underline $ul \
- -anchor w -menu $menu -background $fbg \
- -font $bfont
- pack $menub -side top -fill x
- menu $menu -tearoff 0 -postcommand menu_posted
- }
- }
- pack $f -side top -fill x
- set top_widget_names(menuframe) $f
-
- make_menu_items
-
- # Make the x11 and vnc display label bar:
- set df "$top.displayframe"
- frame $df -bd 1 -relief groove
- set top_widget_names(displayframe) $df
-
- set df_x11 "$df.xdisplay"
-
- if {$make_gui_count == 1} {
- no_x11_display
- }
- set lw [expr {$label_width / 2}]
- label $df_x11 -textvariable x11_display -width $lw -anchor w \
- -font $ffont
-
- set df_vnc "$df.vdisplay"
-
- if {$make_gui_count == 1} {
- no_vnc_display
- }
- label $df_vnc -textvariable vnc_display -width $lw -anchor w \
- -font $ffont
-
- pack $df_x11 $df_vnc -side left
- pack $df -side top -fill x
-
- # text area
- global text_height
- set text_area "$top.text"
- if {$screen_width <= 400} {
- text $text_area -height $text_height -width $label_width \
- -relief ridge -font $ffont
- } else {
- text $text_area -height $text_height -relief ridge -font $ffont
- }
- pack $text_area -side top -fill both -expand 1
- set top_widget_names(text) $text_area
-
-
- if {$text_area_str == ""} {
- set str "Click Help -> gui for overview."
- append_text "\n$str\n\n"
- } else {
- append_text $text_area_str
- }
-
- # Make entry box stuff
- set ef "$top.entryframe"
- frame $ef -bd 1 -relief groove
- set top_widget_names(entryframe) $ef
-
- # Entry Label
- set ef_label "$ef.label"
- label $ef_label -textvariable entry_str -anchor w -font $bfont
-
- set entry_str "Set... : "
- set ef_entry "$ef.entry"
- entry $ef_entry -relief sunken -font $ffont
- bind $ef_entry <KeyPress-Return> {set entry_set 1}
- bind $ef_entry <KeyPress-Escape> {set entry_set 0}
-
- set ok_s "OK"
- set cancel_s "Cancel"
- set help_s "Help"
- set browse_s "Browse..."
- global osname
- if {$osname == "Darwin"} {
- set ok_s " OK "
- set cancel_s " Cancel "
- set help_s " Help "
- set browse_s " Browse... "
- }
-
- # Entry OK button
- set bpx "1m"
- set bpy "1"
- set hlt "0"
- set ef_ok "$ef.ok"
- button $ef_ok -text $ok_s -pady $bpy -padx $bpx -command {set entry_set 1} \
- -highlightthickness $hlt \
- -font $bfont
-
- # Entry Skip button
- set ef_skip "$ef.skip"
- button $ef_skip -text $cancel_s -pady $bpy -padx $bpx -command {set entry_set 0} \
- -highlightthickness $hlt \
- -font $bfont
-
- # Entry Help button
- set ef_help "$ef.help"
- button $ef_help -text $help_s -pady $bpy -padx $bpx -command \
- {menu_help $entry_dialog_item} -font $bfont \
- -highlightthickness $hlt
-
- # Entry Browse button
- set ef_browse "$ef.browse"
- button $ef_browse -text $browse_s -pady $bpy -padx $bpx -font $bfont \
- -highlightthickness $hlt \
- -command {entry_insert [tk_getOpenFile]}
-
- pack $ef_label -side left
- pack $ef_entry -side left -fill x -expand 1
- pack $ef_ok -side right
- pack $ef_skip -side right
- pack $ef_help -side right
- pack $ef -side bottom -fill x
-
- set entry_ok $ef_ok
- set entry_skip $ef_skip
- set entry_help $ef_help
- set entry_box $ef_entry
- set entry_browse $ef_browse
- set entry_label $ef_label
- entry_disable
-
-}
-
-proc menu_bindings {m} {
- set db 0
- if {$db} {puts "menu_bindings $m"}
-
- bind $m <<MenuSelect>> {
-#syntax hilite bug \
-MenuSelect>>
- set n [%W index active]
- set db 0
- if {$db} {puts stderr "menu_bindings %W $n"}
- set label " "
- if {$n != "none"} {
- set str %W,$n
- set which ""
-
- if {$db} {puts "menu_bindings $str"}
- if {[info exists helplabel($str)]} {
- set vname [format %%-16s $helplabel($str)]
- set label "Click (?) for help on: $vname"
- set which $helplabel($str)
- }
- if {$which == ""} {
- ;
- } elseif {$which == "passwd" || $which == "viewpasswd"} {
- ;
- } elseif {[is_action $which]} {
- if {[info exists menu_var($which)]
- && $menu_var($which) != ""} {
- set label "$label value: $menu_var($which)"
- } else {
- set label "$label (is action)"
- }
- } elseif {[info exists menu_var($which)]} {
- set label "$label value: $menu_var($which)"
- if {$which == "http"} {
- global vnc_url
- set label "$label URL: $vnc_url"
- }
- }
- }
- set_info $label
- }
-}
-
-proc key_bindings {} {
- global env menus_disabled
- if {[info exists env(USER)] && $env(USER) == "runge"} {
- # quick restart
- bind . <Control-KeyPress-k> {exec $argv0 $argv &; destroy .}
- }
- bind . <Control-KeyPress-p> { \
- global menus_disabled; \
- if {!$menus_disabled} {try_connect_and_query_all} \
- }
- bind . <Control-KeyPress-u> { \
- global menus_disabled; \
- if {!$menus_disabled} {query_all 0} \
- }
- bind . <Control-KeyPress-r> { \
- global menus_disabled; \
- if {!$menus_disabled} {query_all 0} \
- }
- bind . <Control-KeyPress-d> { \
- global menus_disabled; \
- if {!$menus_disabled} {detach_from_display} \
- }
- bind . <Control-KeyPress-a> { \
- global menus_disabled; \
- if {!$menus_disabled} {try_connect_and_query_all} \
- }
-}
-
-proc stop_watch {onoff} {
- global orig_cursor text_area entry_box
-
- set widgets [list .]
- if [info exists text_area] {
- if {$text_area != ""} {
- lappend widgets $text_area
- }
- }
- if [info exists entry_box] {
- if {$entry_box != ""} {
- lappend widgets $entry_box
- }
- }
-
- if {$onoff == "on"} {
- foreach item $widgets {
- if {![winfo exists $item]} {
- continue
- }
- $item config -cursor {watch}
- }
- } else {
- foreach item $widgets {
- if {![winfo exists $item]} {
- continue
- }
- $item config -cursor {}
- }
- }
- update
-}
-
-proc double_check_noremote {} {
- set msg "\n\n"
- append msg "*** WARNING: setting \"noremote\" will disable ALL remote control commands (i.e.\n"
- append msg "*** WARNING: *this* gui will be locked out). Do you really want to do this?\n"
- append msg "*** WARNING: If so, press \"OK\", otherwise press \"Cancel\"\n"
- append msg "\n"
- bell
- return [warning_dialog $msg "noremote"]
-}
-
-proc get_settings_rcfile {} {
- global menu_var default_var unset_str
- global x11vnc_gui_params
-
- set rc_txt ""
-
- set menu_var(gui) $x11vnc_gui_params
-
- foreach item [lsort [array names menu_var]] {
- if {$item == "gui"} {
- ;
- } elseif {![active_when_starting $item]} {
- continue
- } elseif {[is_action $item]} {
- continue
- }
- if {$item == "debug_gui"} {
- continue
- } elseif {$item == "WindowView"} {
- continue
- } elseif {$item == "rc" || $item == "norc"} {
- continue
- } elseif {$item == "loop"} {
- continue
- } elseif {$item == "loopbg"} {
- continue
- }
-
- set def ""
- if {[info exists default_var($item)]} {
- set def $default_var($item)
- }
-
-
- set qst ""
- set hmm "#? "
- if {$item == "display"} {
- set qst $hmm
- } elseif {$item == "desktop"} {
- set qst $hmm
- } elseif {$item == "dontdisconnect"} {
- set qst $hmm
- } elseif {$item == "alwaysshared"} {
- set qst $hmm
- } elseif {$item == "nevershared"} {
- set qst $hmm
- } elseif {$item == "gui"} {
- set qst $hmm
- }
-
- if {![info exists menu_var($item)]} {
- set mv $def
- } else {
- set mv $menu_var($item)
- }
-#puts "item=$item def=$def mv=$mv"
- if {$mv == $unset_str} {
- set mv ""
- }
- set ntab 3
-
- if {$item == "gui" || [value_is_string $item]} {
- set nitem [get_nitem $item]
-
- if {$mv == "" && $def != ""} {
- set qst $hmm
- }
- set n 0
- if {$qst != ""} {
- append rc_txt $qst
- incr n [string length $qst]
- } elseif {$mv == $def} {
- append rc_txt "#d "
- incr n [string length "#d "]
- }
- set mt $mv
- regsub -all {#} $mt {\#} mt
- if {$mt == ""} {
- set mt {""}
- }
- append rc_txt "-$nitem $mt"
-
- if {$mv != $def} {
- set m [string length "-$nitem $mt"]
- incr n $m
- set n [expr $n / 8]
- set c 0
- for {set i $n} {$i <= $ntab} {incr i} {
- append rc_txt "\t"
- incr c
- }
- if {$c == 0} {
- append rc_txt "\t"
- }
- regsub -all {#} $def {\#} def
- if {$def == ""} {
- set def {""}
- }
- append rc_txt "# default: $def"
- }
- append rc_txt "\n"
-
- } elseif {[value_is_bool $item]} {
- set n 0
- if {$qst != ""} {
- append rc_txt $qst
- incr n [string length $qst]
- } elseif {$mv == $def} {
- append rc_txt "#d "
- incr n [string length "#d "]
- }
- if {$def == 1} {
- set dv "on"
- } else {
- set dv "off"
- }
- append rc_txt "-$item"
- set m [string length "-$item"]
- incr n $m
- set n [expr $n / 8]
- for {set i $n} {$i <= $ntab} {incr i} {
- append rc_txt "\t"
- }
- append rc_txt "# default: $dv"
- append rc_txt "\n"
-
- }
- }
- return $rc_txt
-}
-
-proc double_check_start_x11vnc {} {
- global hostname
- set msg [get_start_x11vnc_txt]
- bell
- append msg "\n"
- append msg "*** To run the above command on machine \"$hostname\" (thereby\n"
- append msg "*** starting x11vnc) press \"OK\", otherwise press \"Cancel\".\n"
- return [warning_dialog $msg "start"]
-}
-
-proc get_start_x11vnc_txt {} {
- set cmd [get_start_x11vnc_cmd]
- set str [join $cmd]
- set msg ""
- append msg "\n"
- append msg "==== The command built so far is: ====\n";
- append msg "\n"
- append msg "$str\n"
- return $msg
-}
-
-proc show_start_cmd {} {
- set msg [get_start_x11vnc_txt]
- append_text "$msg\n"
-}
-
-proc get_nitem {item} {
- set nitem $item
- if {$nitem == "screen_blank"} {
- set nitem "sb"
- } elseif {$nitem == "xrandr_mode"} {
- set nitem "xrandr"
- } elseif {$nitem == "unixpw_list"} {
- set nitem "unixpw"
- } elseif {$nitem == "unixpw_nis_list"} {
- set nitem "unixpw_nis"
- } elseif {$nitem == "stunnel_pem"} {
- set nitem "stunnel"
- } elseif {$nitem == "ssl_pem"} {
- set nitem "ssl"
- } elseif {$nitem == "wireframe_mode"} {
- set nitem "wireframe"
- } elseif {$nitem == "solid_color"} {
- set nitem "solid"
- }
- return $nitem
-}
-
-proc get_start_x11vnc_cmd {{show_rc 0}} {
- global cmd_var menu_var default_var unset_str x11vnc_prog
-
- set xterm_cmd "xterm -iconic -geometry 80x35 -title x11vnc-console -e"
-
- set cmd [split $xterm_cmd]
-
- lappend cmd $x11vnc_prog
-
- lappend cmd "-gui"
- lappend cmd "none"
-
- set rc_txt ""
-
- set saw_id 0
-
- foreach item [lsort [array names menu_var]] {
- if {$item == "gui"} {
- continue
- } elseif {![active_when_starting $item]} {
- continue
- } elseif {[is_action $item]} {
- continue
- } elseif {$item == "debug_gui"} {
- continue
- } elseif {$item == "WindowView"} {
- continue
- }
-
- if {$item == "id" || $item == "sid"} {
- set val $menu_var($item);
- if {$val == "0x0" || $val == "root"} {
- continue
- }
- }
- if {$item == "sid" && $saw_id} {
- continue
- }
- if {$item == "id"} {
- set saw_id 1
- } elseif {$item == "httpport" && $menu_var($item) == "0"} {
- continue
- } elseif {$item == "progressive" && $menu_var($item) == "0"} {
- continue
- } elseif {$item == "dontdisconnect" && $menu_var($item) == "-1"} {
- continue
- } elseif {$item == "alwaysshared" && $menu_var($item) == "-1"} {
- continue
- }
-
- if {[value_is_bool $item]} {
- if {[info exists menu_var($item)]} {
- set add 1
- if {[info exists default_var($item)]} {
- if {$menu_var($item) == $default_var($item)} {
- set add 0;
- }
- } elseif {! $menu_var($item)} {
- set add 0
- }
- if {$add} {
- lappend cmd "-$item"
- append rc_txt "-$item\n"
- }
- }
- } elseif {[value_is_string $item]} {
- if {![info exists menu_var($item)]} {
- continue
- }
- if {$menu_var($item) != "" && $menu_var($item) != $unset_str} {
- set add 1
- set nitem [get_nitem $item]
-
- if {[info exists default_var($item)]} {
- if {$menu_var($item) == $default_var($item)} {
- set add 0;
- }
- }
- if {$add} {
- lappend cmd "-$nitem"
- set mv $menu_var($item)
-
- if {[regexp {^~} $mv]} {
- if {$item == "auth" ||
- $item == "rc" ||
- $item == "accept" ||
- $item == "connect" ||
- $item == "allow" ||
- $item == "passwdfile" ||
- $item == "o" ||
- $item == "logfile" ||
- $item == "remap" ||
- $item == "httpdir"} {
- set mv [tilde_expand $mv]
- }
- }
-
- lappend cmd $mv
- set mt $mv
- regsub -all {#} $mt {\#} mt
- append rc_txt "-$nitem $mt\n"
- }
- }
- }
- }
- lappend cmd "2>"
- lappend cmd "/dev/null"
- lappend cmd "&"
-
- if {$show_rc} {
- return $rc_txt
- } else {
- return $cmd
- }
-}
-
-proc start_x11vnc {} {
- global menu_var unset_str
- global x11vnc_prog x11vnc_xdisplay
- global connected_to_x11vnc
-
- if {$connected_to_x11vnc} {
- append_text "\n"
- append_text "WARNING: Still connected to an x11vnc server.\n"
- append_text "WARNING: Use \"stop\" or \"detach\" first.\n"
- return 0
- }
-
- if {![double_check_start_x11vnc]} {
- return
- }
-
- set x11vnc_xdisplay ""
- if {[info exists menu_var(display)]} {
- if {$menu_var(display) != "" && $menu_var(display) != $unset_str} {
- set x11vnc_xdisplay $menu_var(display)
- }
- }
-
- set cmd [get_start_x11vnc_cmd]
-
- set str [join $cmd]
- regsub { -e} $str " -e \\\n " str
-
- if {0} {
- puts "running: $str"
- foreach word $cmd {
- puts " word: $word"
- }
- }
-
- append_text "Starting x11vnc in an iconified xterm with command:\n"
- append_text " $str\n\n"
- catch {[eval exec $cmd]}
- after 500
- try_connect_and_query_all 3
- if {!$connected_to_x11vnc} {
- append_text "\nStarting x11vnc seems to have failed.\n"
- if {[regexp -- {-o } $str] || [regexp -- {-logfile} $str]} {
- append_text "Examine the logfile (Debugging -> show-logfile) for error messages.\n"
- } else {
- append_text "Rerun with a logfile (if needed) and examine the logfile\n"
- append_text "(Debugging -> show-logfile) for error messages.\n"
- }
- }
-}
-
-proc run_remote_cmd_via_sock {opts} {
- global client_sock
-
- set db 0
- if {[file channels $client_sock] == ""} {
- set client_sock ""
- return "fail"
- }
- if {[eof $client_sock]} {
- catch {close $client_sock}
- set client_sock ""
- return "fail"
- }
- set result ""
-
- setup_client_sock 0
-
- set docmd ""
- foreach opt $opts {
- if {$opt == "-R"} {
- set docmd "-R"
- continue
- } elseif {$opt == "-Q"} {
- set docmd "-Q"
- continue
- }
-
- if {$docmd == ""} {
- continue
- } elseif {$docmd == "-R"} {
- set str "cmd=$opt"
- } elseif {$docmd == "-Q"} {
- set str "qry=$opt"
- } else {
- set docmd ""
- continue
- }
-
- if {$db} {puts stderr "run_remote_cmd_via_sock: $docmd \"$str\""}
- catch {puts $client_sock $str}
- if {$db} {puts stderr "run_remote_cmd_via_sock: flush"}
- catch {flush $client_sock}
- if {$db} {puts stderr "run_remote_cmd_via_sock: gets"}
- catch {gets $client_sock res}
- if {$db} {puts stderr "run_remote_cmd_via_sock: \"$res\""}
- set res [string trim $res]
-
- if [regexp {=clients:} $res] {
- regsub {^.*=clients:} $res "" cres
- regsub {,aro=.*$} $cres "" cres
- regsub {,ans=.*$} $cres "" cres
- if {$cres == "none"} {
- set cres ""
- }
- update_clients_menu $cres
- set client_str $cres
- set_client_balloon $cres
- }
-
- if [regexp {^clients:} $res] {
- regsub {^clients:} $res "" tmp
- if {$tmp == "none"} {
- set tmp ""
- }
- update_clients_menu $tmp
- set client_str $tmp
- set_client_balloon $tmp
-
- if ![regexp {^clients} $opt] {
- # we could block here...
- if {$db} {puts stderr "run_remote_cmd_via_sock: gets"}
- gets $client_sock res
- if {$db} {puts stderr "run_remote_cmd_via_sock: \"$res\""}
- set res [string trim $res]
- }
- }
-
- set docmd ""
-
- if {$res != ""} {
- append result "$res\n"
- }
- }
-
- setup_client_sock 1
-
- set result [string trim $result]
-
- return $result
-}
-
-proc run_remote_cmd {opts} {
- global menu_var x11vnc_prog x11vnc_cmdline x11vnc_xdisplay
- global x11vnc_auth_file x11vnc_connect_file
- global client_sock
-
- set debug [in_debug_mode]
-
- if {[lindex $opts 0] == "-R" && [lindex $opts 1] == "noremote"} {
- set str [join $opts]
- if ![double_check_noremote] {
- append_text "skipping: x11vnc $str"
- return ""
- } else {
- append_text "running: x11vnc $str (please do \"Actions -> detach\" to clean things up)\n"
- append_text "subsequent -R/-Q commands should fail..."
- }
- }
-
- if {$client_sock != ""} {
- menus_disable
- stop_watch on
- set result [run_remote_cmd_via_sock $opts]
- stop_watch off
- menus_enable
- if {$result != "fail"} {
- return $result
- }
- }
-
- set cmd ""
-
- lappend cmd $x11vnc_prog;
-
- if {$x11vnc_connect_file != ""} {
- lappend cmd "-connect"
- lappend cmd $x11vnc_connect_file
- } else {
- if {$x11vnc_xdisplay != ""} {
- lappend cmd "-display"
- lappend cmd $x11vnc_xdisplay
- }
- if {$x11vnc_auth_file != ""} {
- lappend cmd "-auth"
- lappend cmd $x11vnc_auth_file
- }
- }
- lappend cmd "-sync"
- foreach word $opts {
- lappend cmd $word
- }
- lappend cmd "2>"
- lappend cmd "/dev/null"
-
- if {0 || $debug} {
- set str [join $cmd]
- puts "running: $str"
- foreach word $cmd {
- puts " word: $word"
- }
- }
-
- set output ""
- menus_disable
-
- stop_watch on
- catch {set output [eval exec $cmd]}
- stop_watch off
-
- menus_enable
- if {$debug} {
- if {[string length $output] > 100} {
- set str [string range $output 0 100]
- append_text "output: $str ...\n"
- } else {
- append_text "output: $output\n"
- }
- }
- return $output
-}
-
-proc try_connect_and_query_all {{n 2}} {
- for {set i 0} {$i < $n} {incr i} {
- if {$i > 0} {
- after 500
- append_text "trying again ...\n"
- }
- if {[try_connect]} {
- query_all
- break
- }
- }
-}
-
-proc try_connect {} {
- global x11vnc_xdisplay connected_to_x11vnc reply_xdisplay
- global menu_var unset_str
-
- set db 0
-#dtime c1
-
- if {! $connected_to_x11vnc} {
- if {[info exists menu_var(display)]} {
- set d $menu_var(display)
- if {$d != "" && $d != $unset_str && $d != $x11vnc_xdisplay} {
- set x11vnc_xdisplay $menu_var(display)
- append_text "Setting X display to: $x11vnc_xdisplay\n"
- }
- }
- }
-
- set_info "Pinging $x11vnc_xdisplay ..."
- set rargs [list "-Q" "ping"]
- set result [run_remote_cmd $rargs]
-#dtime c2a
-
- if {$db} {puts "try_connect: \"$result\""}
-
- if {[regexp {^ans=ping:} $result]} {
- regsub {^ans=ping:} $result {} reply_xdisplay
- set msg "Connected to $reply_xdisplay"
- set_info $msg
- append_text "$msg\n"
- set_connected yes
-
- setup_client_channel
-#dtime c2b
- setup_client_sock 1
- setup_client_tail
-
- fetch_displays
-#dtime c3a
- return 1
- } else {
- set str "x11vnc server."
- if {$x11vnc_xdisplay != ""} {
- set str $x11vnc_xdisplay
- }
- set msg "No reply from $str"
- set_info $msg
- append_text "$msg\n"
- set_connected no
- return 0
- }
-}
-
-proc set_view_variable {val} {
- global menu_var
- set menu_var(WindowView) $val
-}
-proc get_view_variable {} {
- global menu_var
- if {![info exists menu_var(WindowView)]} {
- set menu_var(WindowView) "none"
- }
- return $menu_var(WindowView)
-}
-
-proc dono {a b c} {
- exit 1;
-}
-
-proc do_port_prompt {} {
- global bfont ffont
- global port_reply port_set
-
- set guess 5900
- for {set i 0} {$i < 50} {incr i} {
- set fh ""
- set try [expr $guess + $i]
- catch {set fh [socket -server dono $try]}
- if {$fh != ""} {
- catch {close $fh}
- set guess $try
- break;
- }
- }
- set hn ""
- catch {set hn [exec uname -n]}
- if {$hn == ""} {
- set hn "hostname"
- }
-
- set text " Set the x11vnc Listening Port:
-
- VNC Display :0 corresponds to TCP port 5900
- VNC Display :1 corresponds to TCP port 5901
- etc.
-
- In the Entry below, indicate a Port for x11vnc to listen on.
-
- Note that to connect to x11vnc, a VNC Viewer will need to
- know your selection, for example:
-
- vncviewer $hn:0
- vncviewer $hn:1
- etc.
-
- Your firewall may block incoming connections to TCP ports;
- if it does you may need to reconfigure it.
-
- You can also set some additional parameters:
-
- - Enable SSL encryption.
- (requires an SSL enabled vncviewer, such as SSVNC)
- - Listen only on localhost. (e.g. for an SSH tunnel)
- - Enable UltraVNC or TightVNC File transfer.
-"
- set port_set $guess
- set port_reply ""
-
- toplevel .pp
- wm title .pp "Select x11vnc port"
-
- wm protocol . WM_DELETE_WINDOW "destroy .; exit"
- wm protocol .pp WM_DELETE_WINDOW "destroy .pp; exit"
-
- label .pp.m -text "$text" -relief ridge -justify left -font $ffont
-
- global tk_version
- set tkold 0
- if [info exists tk_version] {
- if [regexp {^8\.[0-3]$} $tk_version] {
- set tkold 1
- }
- if [regexp {^[3-7]\.} $tk_version] {
- set tkold 1
- }
- }
-
- if {$tkold} {
- frame .pp.f -bd 1 -relief ridge
- } else {
- frame .pp.f -bd 1 -relief ridge -pady 2
- }
- label .pp.f.l -text "Port: " -font $bfont
- entry .pp.f.e -width 8 -textvariable port_set -font $ffont
- global enable_ssl; set enable_ssl 0
- if [info exists env(X11VNC_SSL_ENABLED)] {
- set enable_ssl 1
- }
- checkbutton .pp.f.ssl -relief raised -pady 3 -padx 3 -text "Enable SSL" -variable enable_ssl -font $bfont
- global localhost; set localhost 0
- if [info exists env(X11VNC_LOCALHOST_ENABLED)] {
- set localhost 1
- }
- checkbutton .pp.f.loc -relief raised -pady 3 -padx 3 -text "Listen on localhost" -variable localhost -font $bfont
- pack .pp.f.l .pp.f.e -side left
- pack .pp.f.loc .pp.f.ssl -side right
-
- if {$tkold} {
- frame .pp.t -bd 1 -relief ridge
- } else {
- frame .pp.t -bd 1 -relief ridge -pady 2
- }
- global file_transfer; set file_transfer "none"
- if [info exists env(X11VNC_FILETRANSFER_ENABLED)] {
- set file_transfer $env(X11VNC_FILETRANSFER_ENABLED)
- }
- label .pp.t.l -text "File Transfer: " -font $bfont
- radiobutton .pp.t.none -text "None" -variable file_transfer -value "none" -font $bfont
- radiobutton .pp.t.ultra -text "UltraVNC" -variable file_transfer -value "ultra" -font $bfont
- radiobutton .pp.t.tight -text "TightVNC" -variable file_transfer -value "tight" -font $bfont
- pack .pp.t.l .pp.t.none .pp.t.ultra .pp.t.tight -side left
-
- frame .pp.o -bd 1 -relief ridge
- button .pp.o.ok -text "OK" -command "set port_reply 1; destroy .pp" -font $bfont
- button .pp.o.cancel -text "Cancel" -command "set port_reply 0; destroy .pp" -font $bfont
- pack .pp.o.ok .pp.o.cancel -side left -fill x -expand 1
- pack .pp.m -side top -fill x -expand 1
- pack .pp.f .pp.t .pp.o -side top -fill x
-
- focus .pp.f.e
- .pp.f.e icursor end
-
- wm withdraw .pp
- update
- center_win .pp
-
- wm minsize .pp [winfo width .pp] [winfo height .pp]
-
- bind .pp.f.e <KeyPress-Return> "set port_reply 1; destroy .pp"
-
- vwait port_reply
-
- if {$port_reply} {
- regsub -all {^:} $port_set "" port_set
- regsub -all {[ \t]} $port_set "" port_set
- if {[regexp {^[0-9][0-9]*$} $port_set]} {
- if {$port_set < 0} {
- set port_set [expr 0 - $port_set]
- } elseif {$port_set < 200} {
- set port_set [expr $port_set + 5900]
- }
- puts "$port_set:ssl${enable_ssl}:localhost$localhost:ft_$file_transfer"
- }
- }
-}
-
-proc change_view_state {} {
- global menu_var gui_current_state
-
- set new [get_view_variable]
-
- if {![info exists gui_current_state]} {
- set gui_current_state ""
- }
- set old $gui_current_state
- #puts "$old -> $new"
-
- if {$old == $new} {
- return
- }
-
- if {$old == "full" || $old == "icon" || $old == "tray"} {
- ;
- } else {
- set old "none"
- }
-
- if {$new == "full" || $new == "icon" || $new == "tray"} {
- if {$old == "tray"} {
- # sigh XReparentWindow would be too easy...
- # undo_tray_embed
- restart_everything $new
- destroy .
- exit
- }
- make_gui $new
- if {$new == "tray"} {
- wm withdraw .
- }
- } else {
- set_view_variable $old
- }
-}
-
-proc setup_client_tail {} {
- global client_tail
- if {$client_tail != ""} {
- fileevent $client_tail readable read_client_tail
- }
-}
-
-proc setup_client_sock {{enable 1}} {
- global client_sock
- if {$client_sock != ""} {
- if {$enable} {
- fileevent $client_sock readable read_client_sock
- } else {
- fileevent $client_sock readable ""
- }
- }
-}
-
-proc setup_tray_embed {} {
- update
- set w [winfo width .]
- set h [winfo height .]
- if {$w < 24} {
- set w 24
- }
- if {$h < 24} {
- set h 24
- }
- wm minsize . $w $h
- set wid [winfo id .]
- push_new_value "remote-cmd" "remote-cmd" "trayembed:$wid" 0
-}
-
-proc restart_everything {gui_mode} {
- global env gui_argv0 x11vnc_prog full_win
- global icon_mode_at_startup
- global tray_embed tray_running
- if {$gui_mode == "full"} {
- set env(X11VNC_ICON_MODE) 0
- } elseif {$gui_mode == "icon"} {
- set env(X11VNC_ICON_MODE) 1
- } elseif {$gui_mode == "tray"} {
- if {$tray_running} {
- set env(X11VNC_ICON_MODE) "RUNNING"
- } else {
- set env(X11VNC_ICON_MODE) "TRAY"
- }
- }
- puts stderr ""
- puts stderr "tkx11vnc: restarting gui to leave tray mode."
- puts stderr " new gui will be running in the background."
- puts stderr " use kill(1) rather than Ctrl-C to kill it."
- puts stderr ""
- if {[info exists env(X11VNC_RESTART_DEPTH)]} {
- set n $env(X11VNC_RESTART_DEPTH)
- incr n
- set env(X11VNC_RESTART_DEPTH) $n
- } else {
- set env(X11VNC_RESTART_DEPTH) 0
- }
- set env(X11VNC_ICON_SETPASS) ""
-
- if {![info exists env(X11VNC_WISHCMD)]} {
- puts stderr "failure in restart_everything."
- exit 1;
- }
-
- set code [exec $x11vnc_prog -printgui]
- if {[string length $code] < 20000} {
- puts stderr "failure in restart_everything."
- exit 1;
- }
- set tmp "/tmp/x11vnc[pid]"
- append tmp [clock clicks]
- set tmp2 ""
- catch {set tmp2 [exec mktemp $tmp.XXXXXX 2>/dev/null]}
- if {$tmp2 != "" && [file exists $tmp2]} {
- set tmp $tmp2
- } else {
- file delete -force $tmp
- if {[file exists $tmp]} {
- puts stderr "failure in restart_everything."
- exit 1;
- }
- }
- set fh [open $tmp "a"]
- if {![file owned $tmp]} {
- puts stderr "failure in restart_everything."
- exit 1;
- }
- file attributes $tmp -permissions "0400"
- puts $fh $code
- close $fh
-
- #puts stderr [exec ls -l $tmp]
-
- wm withdraw .
- catch {wm withdraw $full_win}
- update
-
- exec $env(X11VNC_WISHCMD) $tmp &
- after 2000
- file delete -force $tmp
-
- destroy .
- exit
-}
-
-proc undo_tray_embed {} {
- set wid [winfo id .]
- push_new_value "remote-cmd" "remote-cmd" "trayunembed:$wid" 0
-}
-
-############################################################################
-# main:
-
-if [info exists env(X11VNC_GUI_TIME)] {
- dtime M
-}
-
-wm withdraw .
-
-global env x11vnc_prog x11vnc_cmdline x11vnc_xdisplay x11vnc_connect;
-global x11vnc_xdisplay0
-global x11vnc_client_file x11vnc_gui_geom x11vnc_started vnc_url
-global x11vnc_gui_params
-global x11vnc_auth_file x11vnc_connect_file beginner_mode simple_gui_created
-global helpall helptext helpremote helplabel hostname osname
-global all_settings reply_xdisplay always_update
-global max_text_height max_text_width
-global text_height
-global menu_var unset_str menus_disabled
-global bfont ffont sfont snfont old_labels have_labelframes
-global connected_to_x11vnc
-global cache_all_query_vars
-global last_query_all_time query_all_freq client_tail client_sock client_info_read
-global icon_mode icon_mode_at_startup x11vnc_icon_mode
-global tray_embed tray_running icon_setpasswd icon_embed_id
-global icon_noadvanced icon_minimal
-global make_gui_count text_area_str
-global gui_argv0 gui_start_mode
-global screen_height screen_width
-
-set unset_str "(unset)"
-set vnc_url $unset_str
-set connected_to_x11vnc 0
-set menus_disabled 0
-set max_text_height 40
-set max_text_width 90
-set text_height 14
-set bfont "-adobe-helvetica-bold-r-*-*-*-120-*-*-*-*-*-*"
-set sfont "-adobe-helvetica-bold-r-*-*-*-100-*-*-*-*-*-*"
-set snfont "-adobe-helvetica-medium-r-*-*-*-100-*-*-*-*-*-*"
-set ffont "fixed"
-
-set got_helv 0
-catch {
- foreach fam [font families] {
- if {$fam == "helvetica"} {
- set got_helv 1
- }
- if {$fam == "Helvetica"} {
- set got_helv 1
- }
- }
-}
-
-if {$got_helv} {
- set bfont "Helvetica -12 bold"
- set sfont "Helvetica -10 bold"
- set snfont "Helvetica -10"
-}
-
-set ls ""
-catch {set ls [font metrics $bfont -linespace]}
-if {$ls != "" && $ls > 14} {
- # some recent setups have BIG rendering for the above fonts.
- # on recent (8/08) debian these are really ragged:
- set bfont "-adobe-helvetica-bold-r-*-*-*-90-*-*-*-*-*-*"
- set sfont "-adobe-helvetica-bold-r-*-*-*-75-*-*-*-*-*-*"
- set snfont "-adobe-helvetica-medium-r-*-*-*-75-*-*-*-*-*-*"
-
- set ls ""
- catch {set ls [font metrics $bfont -linespace]}
- if {$ls != "" && $ls < 14} {
- # these are bigger but look better... but for how long?
- set bfont "-adobe-helvetica-bold-r-*-*-*-100-*-*-*-*-*-*"
- set sfont "-adobe-helvetica-bold-r-*-*-*-80-*-*-*-*-*-*"
- set snfont "-adobe-helvetica-medium-r-*-*-*-80-*-*-*-*-*-*"
-
- # maybe consider... {-font font Font {Helvetica -12 bold} {Helvetica -12 bold}}
- # or stick with system font like ssvnc.
- }
-}
-
-# need to check if "fixed" font under XFT on tk8.5 is actually fixed width!!
-set ls ""
-catch {set ls [font metrics $ffont -linespace]}
-set fs ""
-catch {set fs [font metrics $ffont -fixed]}
-set redo 0
-if {$fs != "" && $fs != "1"} {
- set redo 1
-}
-if {$ls != "" && $ls > 14} {
- set redo 1
-}
-if {$redo} {
- foreach fn [font names] {
- if {$fn == "TkFixedFont"} {
- set ffont $fn
- break
- }
- }
-}
-
-set help_indent 24;
-set reply_xdisplay ""
-set all_settings "None so far."
-set always_update 1
-set cache_all_query_vars ""
-set query_all_freq 120
-set last_query_all_time [clock seconds]
-set client_tail ""
-set client_sock ""
-set client_info_read 0
-set make_gui_count 0
-set text_area_str ""
-set gui_argv0 $argv0
-set gui_start_mode ""
-
-if {$tk_version < 8.0} {
- puts stderr ""
- puts stderr "*** tkx11vnc: tk version is old $tk_version, please use 8.0 or higher."
- puts stderr "*** will try to continue with reduced functionality..."
- puts stderr ""
-}
-if {[regexp {^[34]} $tk_version] || $tk_version == "8.0"} {
- set old_labels 1
-} else {
- set old_labels 0
-}
-set have_labelframes 1
-if {$tk_version < 8.4} {
- set have_labelframes 0
-}
-
-set screen_height [winfo screenheight .]
-set screen_width [winfo screenwidth .]
-if {$screen_height < 700} {
- # short screen, netbook?
- set max_text_height 30
- if {$screen_height < 500} {
- # short screen, PDA?
- set max_text_height 22
- set text_height 13
- if {$screen_height <= 360} {
- # very short.
- set max_text_height 16
- set max_text_width 60
- set text_height 11
- }
- }
-}
-if {[info exists env(X11VNC_GUI_TEXT_HEIGHT)]} {
- set max_text_height $env(X11VNC_GUI_TEXT_HEIGHT)
-}
-if {[info exists env(X11VNC_GUI_TEXT_WIDTH)]} {
- set max_text_width $env(X11VNC_GUI_TEXT_WIDTH)
-}
-
-if {"$argv" == "-spit"} {
- set fh [open $argv0 r]
- puts "#ifndef _TKX11VNC_H"
- puts "#define _TKX11VNC_H"
- puts "#ifdef NOGUI"
- puts "char gui_code\[\] = \"\";"
- puts "#else"
- puts "/*"
- puts " * tkx11vnc.h: generated by 'tkx11vnc -spit'"
- puts " * Abandon all hope, ye who enter here..."
- puts " * ...edit tkx11vnc instead."
- puts " */"
- puts " char gui_code\[\] ="
- while {[gets $fh line] > -1} {
- regsub -all {\\} $line {\\\\} line
- regsub -all {"} $line {\\"} line
- puts "\"$line\\n\""
- }
- puts "#endif"
- puts "/* ifdef NOGUI */"
- puts "#endif"
- puts "/* ifndef _TKX11VNC_H */"
- close $fh
- puts ";"
- exit 0
-}
-
-set_view_variable "full"
-
-#puts [exec env | grep X11VNC]
-
-# Read environment for clues:
-
-set x11vnc_client_file "";
-if {[info exists env(X11VNC_CLIENT_FILE)]} {
- set x11vnc_client_file $env(X11VNC_CLIENT_FILE);
- set file $x11vnc_client_file
-
- set client_tail ""
- if {[file exists $file] && [file isfile $file]} {
- if {[file readable $file] && [file owned $file]} {
- set client_tail [open "|tail -f $x11vnc_client_file" "r"]
- }
- }
- if {$client_tail != ""} {
- gets $client_tail tmp
- if [eof $client_tail] {
-#puts "eof $client_tail"
- clean_client_tail
- set client_tail ""
- }
- }
- catch {file delete -force $x11vnc_client_file}
-}
-
-if {[info exists env(X11VNC_PROG)]} {
- set x11vnc_prog $env(X11VNC_PROG);
-} else {
- set x11vnc_prog "x11vnc";
-}
-
-if {[info exists env(X11VNC_CMDLINE)]} {
- set x11vnc_cmdline $env(X11VNC_CMDLINE);
-} else {
- set x11vnc_cmdline "";
-}
-
-if {[info exists env(X11VNC_CONNECT)]} {
- set x11vnc_connect 1
-} else {
- set x11vnc_connect 0;
-}
-
-if {[info exists env(X11VNC_GUI_GEOM)]} {
- set x11vnc_gui_geom $env(X11VNC_GUI_GEOM);
-} else {
- set x11vnc_gui_geom ""
-}
-if {[info exists env(X11VNC_GUI_PARAMS)]} {
- set x11vnc_gui_params $env(X11VNC_GUI_PARAMS);
-} else {
- set x11vnc_gui_params ""
-}
-
-if {[info exists env(X11VNC_FONT_BOLD)]} {
- set bfont $env(X11VNC_FONT_BOLD)
-}
-if {[info exists env(X11VNC_FONT_BOLD_SMALL)]} {
- set sfont $env(X11VNC_FONT_BOLD_SMALL)
-}
-if {[info exists env(X11VNC_FONT_REG_SMALL)]} {
- set snfont $env(X11VNC_FONT_REG_SMALL)
-}
-if {[info exists env(X11VNC_FONT_FIXED)]} {
- set ffont $env(X11VNC_FONT_FIXED)
-}
-
-if {[info exists env(X11VNC_CONNECT_FILE)]} {
- set x11vnc_connect_file $env(X11VNC_CONNECT_FILE);
-} else {
- set x11vnc_connect_file "";
-}
-
-set x11vnc_started 0
-if {[info exists env(X11VNC_STARTED)]} {
- set x11vnc_started 1
-}
-
-set x11vnc_xdisplay ""
-if {[info exists env(X11VNC_XDISPLAY)]} {
- set x11vnc_xdisplay $env(X11VNC_XDISPLAY);
- set x11vnc_connect 1
-
-} elseif {$argv != "" && [regexp {:[0-9]} $argv]} {
- set env(X11VNC_XDISPLAY) "$argv"
- set x11vnc_xdisplay "$argv"
- set x11vnc_connect 1
-
-} elseif {[info exists env(DISPLAY)]} {
- set x11vnc_xdisplay $env(DISPLAY);
-} else {
- set x11vnc_xdisplay ":0";
-}
-set x11vnc_xdisplay0 $x11vnc_xdisplay
-
-if {[info exists env(X11VNC_AUTH_FILE)]} {
- set x11vnc_auth_file $env(X11VNC_AUTH_FILE)
-} else {
- set x11vnc_auth_file ""
-}
-
-set simple_gui_created 0
-if {[info exists env(X11VNC_SIMPLE_GUI)]} {
- set beginner_mode 1
-} else {
- set beginner_mode 0
-}
-
-set icon_mode 0
-set x11vnc_icon_mode 0
-set tray_embed 0
-set tray_running 0
-
-if {![info exists env(X11VNC_ICON_MODE_AT_STARTUP)]} {
- if {[info exists env(X11VNC_ICON_MODE)]} {
- if {$env(X11VNC_ICON_MODE) != 0} {
- set env(X11VNC_ICON_MODE_AT_STARTUP) 1
- } else {
- set env(X11VNC_ICON_MODE_AT_STARTUP) 0
- }
- } else {
- set env(X11VNC_ICON_MODE_AT_STARTUP) 0
- }
-}
-set icon_mode_at_startup $env(X11VNC_ICON_MODE_AT_STARTUP)
-
-if {![info exists env(X11VNC_ICON_MODE)]} {
- set icon_mode 0
-} elseif {$env(X11VNC_ICON_MODE) == "" || $env(X11VNC_ICON_MODE) == "0"} {
- set icon_mode 0
-} else {
- set icon_mode 1
- set_view_variable "icon"
- if [regexp -nocase {TRAY} $env(X11VNC_ICON_MODE)] {
- set tray_embed 1
- }
- if [regexp -nocase {RUNNING} $env(X11VNC_ICON_MODE)] {
- set tray_running 1
- }
-}
-
-set icon_setpasswd 0
-if {[info exists env(X11VNC_ICON_SETPASS)]} {
- if {$env(X11VNC_ICON_SETPASS) != ""} {
- set icon_setpasswd 1
- }
-}
-
-set icon_noadvanced 0
-if {[info exists env(X11VNC_ICON_NOADVANCED)]} {
- set icon_noadvanced 1
-}
-
-set icon_minimal 0
-if {[info exists env(X11VNC_ICON_MINIMAL)]} {
- set icon_minimal 1
-}
-
-if {[info exists env(X11VNC_ICON_EMBED_ID)]} {
- set icon_embed_id $env(X11VNC_ICON_EMBED_ID)
-} else {
- set icon_embed_id ""
-}
-
-
-set hostname [exec uname -n]
-set osname [exec uname]
-
-if {[regexp -nocase {IRIX} $osname]} {
- # IRIX "fixed" font is huge and doublespaced...
- set ffont $snfont
-}
-if {[regexp -nocase {Darwin} $osname]} {
- set ffont {Monaco 10}
- set bfont {system}
-}
-
-if {"$argv" == "-portprompt"} {
- do_port_prompt
- exit 0
-}
-
-#puts [exec env]
-#puts "x11vnc_xdisplay: $x11vnc_xdisplay"
-
-set env(X11VNC_STD_HELP) 1
-
-# scrape the help output for the text and remote control vars:
-parse_help;
-parse_remote_help;
-parse_query_help;
-
-# tweaks to duplicate help text:
-tweak_remote_help lock deny
-tweak_remote_help unlock deny
-
-tweak_both quiet q
-tweak_help logfile o
-tweak_both xwarppointer xwarp
-tweak_both screen_blank sb
-
-set_template
-
-set_name "tkx11vnc"
-
-key_bindings;
-
-get_default_vars
-
-dtime D
-
-proc check_setpasswd {} {
- global env icon_setpasswd
- global do_props_msg
- set do_props_msg ""
- if {$icon_setpasswd} {
- set m "\n"
- set m "${m} Note the x11vnc icon in the system tray.\n"
- set m "${m} This panel is its 'Properties' dialog.\n"
- set m "${m}\n"
- set m "${m} To specify a Session Password and to\n"
- set m "${m} allow VNC viewers to connect, follow\n"
- set m "${m} these steps:\n"
- set m "${m}\n"
- set m "${m} Enter a passwd in the Password field\n"
- set m "${m} (it can be left blank.) You can also\n"
- set m "${m} supply a ViewOnly passwd if desired.\n"
- set m "${m}\n"
- set m "${m} Set 'Accept Connections' and then Press \n"
- set m "${m} 'Apply' to allow incoming connections.\n"
- set m "${m}\n"
- set m "${m} No Viewer can connect until you do this.\n"
- set m "${m}\n"
- set m "${m} The passwords are only for this x11vnc\n"
- set m "${m} session and are not saved. Run x11vnc\n"
- set m "${m} manually for more control (e.g. -rfbauth \n"
- set m "${m} for a saved password.)\n"
- set m "${m}\n"
- set m "${m} See 'Help' for details on each option.\n"
-
- global x11vnc_cmdline
-
- set dossl 0
- if {[info exists x11vnc_cmdline]} {
- if [regexp -- {-ssl} $x11vnc_cmdline] {
- set dossl 1
- }
- }
- if {$dossl || [info exists env(X11VNC_GOT_SSL)]} {
- set m "${m}\n"
- set m "${m} SSL encryption mode active. You can\n"
- set m "${m} find your Public Cert in the Logfile\n"
- set m "${m} and also the ~/.vnc/certs directory.\n"
- }
-
- if {[info exists env(X11VNC_SETPASS_FAIL)]} {
- set pp 5900
- if {[info exists env(X11VNC_GOT_RFBPORT_VAL)]} {
- if {$env(X11VNC_GOT_RFBPORT_VAL) > 0} {
- set pp $env(X11VNC_GOT_RFBPORT_VAL)
- }
- }
-
- set m " The x11vnc program failed to start! \n"
- set m "${m}\n"
- set m "${m} Maybe there is another VNC server\n"
- set m "${m} already listening on port $pp?\n"
- set m "${m}\n"
- set m "${m} You will need to start over after\n"
- set m "${m} you make sure x11vnc can start.\n"
- }
-
- set do_props_msg $m
- do_props
- }
-}
-
-if {0} {
- if {[info exists env(X11VNC_ICON_SETPASS)]} {
- if {$env(X11VNC_ICON_SETPASS) == "2"} {
- global icon_mode_at_startup icon_mode
- set icon_mode_at_startup 1
- set icon_mode 2
- }
- }
-}
-
-if {$icon_mode} {
- if {$icon_mode == 2} {
- make_gui "full"
- } elseif {$tray_embed} {
- make_gui "tray"
- } else {
- make_gui "icon"
- }
- dtime G
- old_balloon
- check_setpasswd
- push_new_value "remote-cmd" "remote-cmd" "Q:clients" 1
-} else {
- make_gui "full"
- dtime G
- check_setpasswd
-}
-
-
-# main loop.