#!/usr/bin/python
import gtk
import gtkvnc
import sys
if len(sys.argv) != 2 and len(sys.argv) != 3:
print "syntax: gvncviewer.py host:display [password]"
sys.exit(1)
def set_title(vnc, window, grabbed):
name = vnc.get_name()
if grabbed:
subtitle = "(Press Ctrl+Alt to release pointer) "
else:
subtitle = ""
window.set_title("%s%s - GVncViewer" % (subtitle, name))
def vnc_screenshot(src, ev, vnc):
if ev.keyval == gtk.gdk.keyval_from_name("F11"):
pix = vnc.get_pixbuf()
pix.save("gvncviewer.png", "png", { "tEXt::Generator App": "gvncviewer.py" })
print "Screenshot saved to gvncviewer.png"
return False
def vnc_grab(src, window):
set_title(src, window, True)
def vnc_ungrab(src, window):
set_title(src, window, False)
def vnc_connected(src):
print "Connected to server"
def vnc_initialized(src, window):
print "Connection initialized"
set_title(src, window, False)
window.show_all()
def vnc_disconnected(src):
print "Disconnected from server"
gtk.main_quit()
def send_caf1(src, vnc):
print "Send Ctrl+Alt+F1"
vnc.send_keys(["Control_L", "Alt_L", "F1"])
def send_caf7(src, vnc):
print "Send Ctrl+Alt+F7"
vnc.send_keys(["Control_L", "Alt_L", "F7"])
def send_cad(src, vnc):
print "Send Ctrl+Alt+Del"
vnc.send_keys(["Control_L", "Alt_L", "Del"])
def send_cab(src, vnc):
print "Send Ctrl+Alt+BackSpace"
vnc.send_keys(["Control_L", "Alt_L", "BackSpace"])
def vnc_auth_cred(src, credList):
prompt = 0
data = []
for i in range(len(credList)):
data.append(None)
if credList[i] in (gtkvnc.CREDENTIAL_USERNAME, gtkvnc.CREDENTIAL_PASSWORD):
prompt = prompt + 1
elif credList[i] == gtkvnc.CREDENTIAL_CLIENTNAME:
data[i] = "gvncviewer"
if prompt:
dialog = gtk.Dialog("Authentication required", None, 0, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OK, gtk.RESPONSE_OK))
label = []
entry = []
box = gtk.Table(2, prompt)
row = 0
for i in range(len(credList)):
if credList[i] == gtkvnc.CREDENTIAL_USERNAME:
label.append(gtk.Label("Username:"))
elif credList[i] == gtkvnc.CREDENTIAL_PASSWORD:
label.append(gtk.Label("Password:"))
else:
continue
entry.append(gtk.Entry())
box.attach(label[row], 0, 1, row, row+1, 0, 0, 3, 3)
box.attach(entry[row], 1, 2, row, row+1, 0, 0, 3, 3)
row = row + 1
vbox = dialog.get_child()
vbox.add(box)
dialog.show_all()
res = dialog.run()
dialog.hide()
if res == gtk.RESPONSE_OK:
row = 0
for i in range(len(credList)):
if credList[i] in (gtkvnc.CREDENTIAL_USERNAME, gtkvnc.CREDENTIAL_PASSWORD):
data[i] = entry[row].get_text()
row = row + 1
dialog.destroy()
for i in range(len(credList)):
if i < len(data) and data[i] != None:
src.set_credential(credList[i], data[i])
else:
print "Unsupported credential type %d" % (credList[i])
src.close()
window = gtk.Window()
vnc = gtkvnc.Display()
layout = gtk.VBox()
window.add(layout)
menubar = gtk.MenuBar()
sendkeys = gtk.MenuItem("_Send keys")
menubar.append(sendkeys)
buttons = gtk.HBox()
caf1 = gtk.MenuItem("Ctrl+Alt+F_1")
caf7 = gtk.MenuItem("Ctrl+Alt+F_7")
cad = gtk.MenuItem("Ctrl+Alt+_Del")
cab = gtk.MenuItem("Ctrl+Alt+_Backspace")
submenu = gtk.Menu()
submenu.append(caf1)
submenu.append(caf7)
submenu.append(cad)
submenu.append(cab)
sendkeys.set_submenu(submenu)
caf1.connect("activate", send_caf1, vnc)
caf7.connect("activate", send_caf7, vnc)
cad.connect("activate", send_cad, vnc)
cab.connect("activate", send_cab, vnc)
layout.add(menubar)
layout.add(vnc)
vnc.realize()
vnc.set_pointer_grab(True)
vnc.set_keyboard_grab(True)
#v.set_pointer_local(True)
if len(sys.argv) == 3:
vnc.set_credential(gtkvnc.CREDENTIAL_PASSWORD, sys.argv[2])
disp = sys.argv[1].find(":")
if disp != -1:
host = sys.argv[1][:disp]
port = str(5900 + int(sys.argv[1][disp+1:]))
else:
host = sys.argv[1]
port = "5900"
print "Connecting to %s %s" % (host, port)
vnc.open_host(host, port)
vnc.connect("vnc-pointer-grab", vnc_grab, window)
vnc.connect("vnc-pointer-ungrab", vnc_ungrab, window)
vnc.connect("vnc-connected", vnc_connected)
vnc.connect("vnc-initialized", vnc_initialized, window)
vnc.connect("vnc-disconnected", vnc_disconnected)
vnc.connect("vnc-auth-credential", vnc_auth_cred)
window.connect("key-press-event", vnc_screenshot, vnc)
gtk.main()
syntax highlighted by Code2HTML, v. 0.9.1