OBS User unknown 2007-02-02 14:57:05 +00:00 committed by Git OBS Bridge
commit 6922b79381
9 changed files with 697 additions and 0 deletions

23
.gitattributes vendored Normal file
View File

@ -0,0 +1,23 @@
## Default LFS
*.7z filter=lfs diff=lfs merge=lfs -text
*.bsp filter=lfs diff=lfs merge=lfs -text
*.bz2 filter=lfs diff=lfs merge=lfs -text
*.gem filter=lfs diff=lfs merge=lfs -text
*.gz filter=lfs diff=lfs merge=lfs -text
*.jar filter=lfs diff=lfs merge=lfs -text
*.lz filter=lfs diff=lfs merge=lfs -text
*.lzma filter=lfs diff=lfs merge=lfs -text
*.obscpio filter=lfs diff=lfs merge=lfs -text
*.oxt filter=lfs diff=lfs merge=lfs -text
*.pdf filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.rpm filter=lfs diff=lfs merge=lfs -text
*.tbz filter=lfs diff=lfs merge=lfs -text
*.tbz2 filter=lfs diff=lfs merge=lfs -text
*.tgz filter=lfs diff=lfs merge=lfs -text
*.ttf filter=lfs diff=lfs merge=lfs -text
*.txz filter=lfs diff=lfs merge=lfs -text
*.whl filter=lfs diff=lfs merge=lfs -text
*.xz filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.zst filter=lfs diff=lfs merge=lfs -text

0
ready Normal file
View File

296
rhpl-exception.py Normal file
View File

@ -0,0 +1,296 @@
#
# exception.py - general exception formatting and saving
#
# Matt Wilson <msw@redhat.com>
# Erik Troan <ewt@redhat.com>
# Harald Hoyer <harald@redhat.com>
#
# Copyright 2001, 2002 Red Hat, Inc.
#
# This software may be freely redistributed under the terms of the GNU
# library public license.
#
# You should have received a copy of the GNU Library Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#
import os, sys
import signal
import traceback
import types
from string import joinfields
from cPickle import Pickler
dumpHash = {}
#from rhpl.translate import _
def _(x):
return x
#
# ExceptionWindow class
#
class ExceptionWindow:
def __init__ (self, text, component_name):
import gtk
win = gtk.Dialog(_("Exception Occured"), None, gtk.DIALOG_MODAL)
win.add_button(_("Debug"), 0)
win.add_button(_("Save to file"), 1)
win.add_button(gtk.STOCK_QUIT, 2)
buffer = gtk.TextBuffer(None)
buffer.set_text(text)
textbox = gtk.TextView()
textbox.set_buffer(buffer)
textbox.set_property("editable", gtk.FALSE)
textbox.set_property("cursor_visible", gtk.FALSE)
sw = gtk.ScrolledWindow ()
sw.add (textbox)
sw.set_policy (gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
hbox = gtk.HBox (gtk.FALSE)
hbox.set_border_width(5)
txt = _("An unhandled exception has occured. This "
"is most likely a bug. Please save the crash "
"dump and file a detailed bug "
"report against %s at "
"https://bugzilla.redhat.com/bugzilla") % \
component_name
info = gtk.Label(txt)
info.set_line_wrap(gtk.TRUE)
hbox.pack_start (sw, gtk.TRUE)
win.vbox.pack_start (info, gtk.FALSE)
win.vbox.pack_start (hbox, gtk.TRUE)
win.vbox.set_border_width(5)
win.set_size_request (500, 300)
win.set_position (gtk.WIN_POS_CENTER)
addFrame(win)
win.show_all ()
self.window = win
self.rc = self.window.run ()
self.window.destroy()
def quit (self, dialog, button):
self.rc = button
def getrc (self):
# I did it this way for future expantion
# 0 is debug
if self.rc == 0:
return 1
# 1 is save
if self.rc == 1:
return 2
# 2 is OK
elif self.rc == 2:
return 0
def addFrame(dialog):
import gtk
contents = dialog.get_children()[0]
dialog.remove(contents)
frame = gtk.Frame()
frame.set_shadow_type(gtk.SHADOW_OUT)
frame.add(contents)
dialog.add(frame)
# XXX do length limits on obj dumps.
def dumpClass(instance, fd, level=0):
# protect from loops
if not dumpHash.has_key(instance):
dumpHash[instance] = None
else:
fd.write("Already dumped\n")
return
if (instance.__class__.__dict__.has_key("__str__") or
instance.__class__.__dict__.has_key("__repr__")):
fd.write("%s\n" % (instance,))
return
fd.write("%s instance, containing members:\n" %
(instance.__class__.__name__))
pad = ' ' * ((level) * 2)
for key, value in instance.__dict__.items():
if type(value) == types.ListType:
fd.write("%s%s: [" % (pad, key))
first = 1
for item in value:
if not first:
fd.write(", ")
else:
first = 0
if type(item) == types.InstanceType:
dumpClass(item, fd, level + 1)
else:
fd.write("%s" % (item,))
fd.write("]\n")
elif type(value) == types.DictType:
fd.write("%s%s: {" % (pad, key))
first = 1
for k, v in value.items():
if not first:
fd.write(", ")
else:
first = 0
if type(k) == types.StringType:
fd.write("'%s': " % (k,))
else:
fd.write("%s: " % (k,))
if type(v) == types.InstanceType:
dumpClass(v, fd, level + 1)
else:
fd.write("%s" % (v,))
fd.write("}\n")
elif type(value) == types.InstanceType:
fd.write("%s%s: " % (pad, key))
dumpClass(value, fd, level + 1)
else:
fd.write("%s%s: %s\n" % (pad, key, value))
def dumpException(out, text, tb):
p = Pickler(out)
out.write(text)
trace = tb
while trace.tb_next:
trace = trace.tb_next
frame = trace.tb_frame
out.write ("\nLocal variables in innermost frame:\n")
try:
for (key, value) in frame.f_locals.items():
out.write ("%s: %s\n" % (key, value))
except:
pass
def exceptionWindow(title, text, name):
import gtk
#print text
win = ExceptionWindow (text, name)
return win.getrc ()
def generic_error_dialog (message, parent_dialog,
message_type=None,
widget=None, page=0, broken_widget=None):
import gtk
if message_type == None:
message_type = gtk.MESSAGE_ERROR
dialog = gtk.MessageDialog(parent_dialog,
gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT,
message_type, gtk.BUTTONS_OK,
message)
if widget != None:
if isinstance (widget, gtk.CList):
widget.select_row (page, 0)
elif isinstance (widget, gtk.Notebook):
widget.set_current_page (page)
if broken_widget != None:
broken_widget.grab_focus ()
if isinstance (broken_widget, gtk.Entry):
broken_widget.select_region (0, -1)
if parent_dialog:
dialog.set_position (gtk.WIN_POS_CENTER_ON_PARENT)
dialog.set_transient_for(parent_dialog)
else:
dialog.set_position (gtk.WIN_POS_CENTER)
ret = dialog.run ()
dialog.destroy()
return ret
#
# FileSelection class
#
class FileSelection:
def __init__(self, text):
import gtk
import gnome.ui
win = gtk.Dialog (_("Select a file:"))
#win.connect ("clicked", self.quit)
win.add_button (gtk.STOCK_OK, gtk.RESPONSE_OK)
win.add_button (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
hbox = gtk.HBox (FALSE)
info = gtk.Label(text)
self.entry = gnome.ui.FileEntry("", "")
self.entry.set_modal(TRUE)
win.vbox.pack_start (info, FALSE)
win.vbox.pack_start (self.entry, TRUE)
win.set_position (gtk.WIN_POS_CENTER)
win.show_all ()
self.window = win
self.rc = self.window.run ()
def quit (self, dialog, button):
self.rc = button
def getrc (self):
return self.rc
def get_filename(self):
return self.entry.get_full_path(FALSE)
#
# handleException function
#
def handleException((type, value, tb), progname, version):
import gtk
list = traceback.format_exception (type, value, tb)
tblast = traceback.extract_tb(tb, limit=None)
if len(tblast):
tblast = tblast[len(tblast)-1]
extxt = traceback.format_exception_only(type, value)
text = "Component: %s\n" % progname
text = text + "Version: %s\n" % version
text = text + "Summary: TB "
if tblast and len(tblast) > 3:
tblast = tblast[:3]
for t in tblast:
text = text + str(t) + ":"
text = text + extxt[0]
text = text + joinfields(list, "")
while 1:
rc = exceptionWindow (_("Exception Occurred"), text, progname)
if rc == 1 and tb:
print text
import pdb
pdb.post_mortem (tb)
os.kill(os.getpid(), signal.SIGKILL)
elif not rc:
sys.exit(10)
else:
fs = FileSelection(_("Please specify a file to save the dump"))
rc = fs.getrc()
if rc == gtk.RESPONSE_OK:
file = fs.get_filename()
print file
fs.window.destroy()
if not file or file=="":
file = "/tmp/dump"
try:
out = open(file, "w")
dumpException (out, text, tb)
out.close()
except IOError:
generic_error_dialog(_("Failed to write to file %s.") \
% (file), None)
else:
generic_error_dialog(
_("The application's state has been successfully\n"
"written to the file '%s'.") % (file), None,
message_type = "info")
sys.exit(10)
else:
continue
sys.exit(10)

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:028b8b65781114b71df0c209c6dfc82fd29b4ddd94cc498cd8e279127ef786b4
size 368785

42
virt-manager.changes Normal file
View File

@ -0,0 +1,42 @@
-------------------------------------------------------------------
Mon Jan 29 09:15:26 MST 2007 - ccoffing@novell.com
- Fix desktop file. (#239275)
- Update to 0.3.0 (updated translations; no code changes)
-------------------------------------------------------------------
Mon Jan 22 11:15:18 MST 2007 - ccoffing@novell.com
- Fix desktop file, so icon shows in YaST. (#237046)
- Clean up macros in spec file.
-------------------------------------------------------------------
Fri Jan 19 16:58:05 MST 2007 - ccoffing@novell.com
- Use temporary icon until real ones arrive.
- Update to changeset 371 to fix VNC issues.
-------------------------------------------------------------------
Wed Jan 17 15:19:12 MST 2007 - ccoffing@novell.com
- Fix BuildRequires and paths to work with both SLES10 and STABLE.
-------------------------------------------------------------------
Fri Jan 12 19:44:03 MST 2007 - ccoffing@novell.com
- Fix sysconfdir path.
- Add desktop file.
-------------------------------------------------------------------
Thu Jan 11 15:48:22 MST 2007 - ccoffing@novell.com
- Add to SLES 10 SP1 (fate #301181)
- Update to virt-manager 0.2.6.
- Fix type_register deprecation warnings.
-------------------------------------------------------------------
Tue Oct 24 11:09:43 MDT 2006 - ccoffing@novell.com
- Initial package.
- Replace virt-inst with xen-vm-install (part of xen-tools-install)

153
virt-manager.spec Normal file
View File

@ -0,0 +1,153 @@
#
# spec file for package virt-manager (Version 0.3.0)
#
# Copyright (c) 2007 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
# package are under the same license as the package itself.
#
# Please submit bugfixes or comments via http://bugs.opensuse.org/
#
# norootforbuild
Name: virt-manager
BuildRequires: autoconf automake gconf2 gettext gtk2-devel python-devel python-gtk update-desktop-files
%if %suse_version > 1010
BuildRequires: python-gobject2-devel python-gtk-devel
%define gsysconfdir /etc
%define gconftool /usr/bin/gconftool-2
%else
%define gsysconfdir /etc/opt/gnome
%define gconftool /opt/gnome/bin/gconftool-2
%endif
License: GNU General Public License (GPL)
Group: System/Monitoring
Autoreqprov: yes
Version: 0.3.0
Release: 1
Summary: Virtual Machine Manager
Source0: virt-manager-0.3.0.tar.bz2
Source1: rhpl-exception.py
BuildRoot: %{_tmppath}/%{name}-%{version}-build
Requires: python-gtk
Requires: python-gnome
# Absolutely require this version or newer
Requires: libvirt-python >= 0.1.4-3
# FIXME: Check dbus-1-python 0.60 vs. 0.61 API changes
Requires: dbus-1-python
# Minimum we've tested with
Requires: libxml2-python >= 2.6.23
Requires: vte
Requires: xen-tools >= 3.0.4_13100
ExclusiveArch: %ix86 x86_64
Patch0: virtman-desktop.diff
Patch1: virtman-install.diff
Patch2: virtman-type-register.diff
Requires: gconf2
%description
Virt Manager provides a graphical tool for administering virtual
machines.
Authors:
--------
Daniel Berrange <berrange@redhat.com>
Hugh O. Brock <hbrock@redhat.com>
Jeremy Katz <katzj@redhat.com>
%prep
%setup -q
%patch0 -p1
%patch1 -p1
%patch2 -p1
%build
#automake
#autoconf
autoreconf -i
%configure --sysconfdir=%{gsysconfdir}
make
%install
rm -rf $RPM_BUILD_ROOT
make install DESTDIR=$RPM_BUILD_ROOT
rm -f $RPM_BUILD_ROOT%{_libdir}/virt-manager/sparkline.a
rm -f $RPM_BUILD_ROOT%{_libdir}/virt-manager/sparkline.la
install -m755 %SOURCE1 $RPM_BUILD_ROOT%{_datadir}/virt-manager/exception.py
mkdir -p $RPM_BUILD_ROOT%{_sbindir}
# Unsupported languages:
rm -rf $RPM_BUILD_ROOT/usr/share/locale/as
rm -rf $RPM_BUILD_ROOT/usr/share/locale/or
%find_lang virt-manager
%suse_update_desktop_file virt-manager
%clean
rm -rf $RPM_BUILD_ROOT
%pre
if [ "$1" -gt 1 ]; then
export GCONF_CONFIG_SOURCE=`%{gconftool} --get-default-source`
%{gconftool} --makefile-uninstall-rule \
%{gsysconfdir}/gconf/schemas/virt-manager.schemas > /dev/null || :
fi
%post
export GCONF_CONFIG_SOURCE=`%{gconftool} --get-default-source`
%{gconftool} --makefile-install-rule \
%{gsysconfdir}/gconf/schemas/virt-manager.schemas > /dev/null || :
%preun
if [ "$1" -eq 0 ]; then
export GCONF_CONFIG_SOURCE=`%{gconftool} --get-default-source`
%{gconftool} --makefile-uninstall-rule \
%{gsysconfdir}/gconf/schemas/virt-manager.schemas > /dev/null || :
fi
%files -f virt-manager.lang
%defattr(-,root,root,-)
%doc COPYING AUTHORS ChangeLog
%{gsysconfdir}/gconf/schemas/virt-manager.schemas
%{_bindir}/virt-manager
%{_libexecdir}/virt-manager-launch
%{_libdir}/virt-manager/
%dir %{_datadir}/virt-manager
%{_datadir}/virt-manager/*.glade
%dir %{_datadir}/virt-manager/pixmaps
%{_datadir}/virt-manager/pixmaps/*.png
%{_datadir}/virt-manager/pixmaps/*.svg
%{_datadir}/virt-manager/*.py
%dir %{_datadir}/virt-manager/virtManager
%{_datadir}/virt-manager/virtManager/*.py
%dir %{_datadir}/virt-manager/vncViewer
%{_datadir}/virt-manager/vncViewer/*.py
%{_datadir}/applications/YaST2/virt-manager.desktop
%{_datadir}/dbus-1/services/virt-manager.service
# FIXME: autobuild complains that these are unowned (not true...)
%dir %{_datadir}/dbus-1
%dir %{_datadir}/dbus-1/services
%dir %{_datadir}/applications/YaST2
%changelog -n virt-manager
* Mon Jan 29 2007 - ccoffing@novell.com
- Fix desktop file. (#239275)
- Update to 0.3.0 (updated translations; no code changes)
* Mon Jan 22 2007 - ccoffing@novell.com
- Fix desktop file, so icon shows in YaST. (#237046)
- Clean up macros in spec file.
* Fri Jan 19 2007 - ccoffing@novell.com
- Use temporary icon until real ones arrive.
- Update to changeset 371 to fix VNC issues.
* Wed Jan 17 2007 - ccoffing@novell.com
- Fix BuildRequires and paths to work with both SLES10 and STABLE.
* Fri Jan 12 2007 - ccoffing@novell.com
- Fix sysconfdir path.
- Add desktop file.
* Thu Jan 11 2007 - ccoffing@novell.com
- Add to SLES 10 SP1 (fate #301181)
- Update to virt-manager 0.2.6.
- Fix type_register deprecation warnings.
* Tue Oct 24 2006 - ccoffing@novell.com
- Initial package.
- Replace virt-inst with xen-vm-install (part of xen-tools-install)

37
virtman-desktop.diff Normal file
View File

@ -0,0 +1,37 @@
Index: virt-manager-0.2.6/src/virt-manager.desktop.in
===================================================================
--- virt-manager-0.2.6.orig/src/virt-manager.desktop.in
+++ virt-manager-0.2.6/src/virt-manager.desktop.in
@@ -1,9 +1,16 @@
[Desktop Entry]
Name=Virtual Machine Manager
Comment=The virtual machine management tool
-Icon=::ICONDIR::/::PACKAGE::-icon.svg
-Exec=::PACKAGE::
+Exec=/usr/bin/virt-manager
Type=Application
Terminal=false
Encoding=UTF-8
-Categories=System;
+Categories=Qt;X-SuSE-YaST;
+X-SuSE-YaST-Call=/usr/bin/virt-manager
+X-SuSE-YaST-Group=Virtualization
+X-SuSE-YaST-Argument=
+X-SuSE-YaST-RootOnly=true
+X-SuSE-YaST-Geometry=
+X-SuSE-YaST-SortKey=
+Icon=yast-network
+X-SuSE-translate=true
Index: virt-manager-0.2.6/src/Makefile.am
===================================================================
--- virt-manager-0.2.6.orig/src/Makefile.am
+++ virt-manager-0.2.6/src/Makefile.am
@@ -14,7 +14,7 @@ libexec_SCRIPTS = $(PACKAGE)-launch
gladedir = $(pkgdatadir)
glade_DATA = $(PACKAGE).glade
-desktopdir = $(datadir)/applications
+desktopdir = $(datadir)/applications/YaST2/
desktop_SOURCES = $(PACKAGE).desktop.in
desktop_DATA = $(PACKAGE).desktop

60
virtman-install.diff Normal file
View File

@ -0,0 +1,60 @@
Index: virt-manager-0.2.6/src/virtManager/engine.py
===================================================================
--- virt-manager-0.2.6.orig/src/virtManager/engine.py
+++ virt-manager-0.2.6/src/virtManager/engine.py
@@ -30,7 +30,7 @@ from virtManager.manager import vmmManag
from virtManager.details import vmmDetails
from virtManager.console import vmmConsole
from virtManager.asyncjob import vmmAsyncJob
-from virtManager.create import vmmCreate
+from xen.install.gui import VMCreate as vmmCreate
from virtManager.serialcon import vmmSerialConsole
class vmmEngine:
@@ -38,7 +38,7 @@ class vmmEngine:
self.windowConnect = None
self.windowPreferences = None
self.windowAbout = None
- self.windowCreate = None
+ self.windowCreate = {}
self.connections = {}
self.timer = None
@@ -136,8 +136,7 @@ class vmmEngine:
ct += window.is_visible()
if conn["windowManager"]:
ct += conn["windowManager"].is_visible()
- if self.windowCreate:
- ct += self.windowCreate.is_visible()
+ ct += len(filter(lambda w: w.is_visible(), self.windowCreate.values()))
return ct
def change_timer_interval(self,ignore1,ignore2,ignore3,ignore4):
@@ -245,13 +244,21 @@ class vmmEngine:
self.connections[uri]["windowManager"] = manager
self.connections[uri]["windowManager"].show()
+ def _create_closing(self, src, key):
+ del self.windowCreate[key]
+
def show_create(self, uri):
- if self.windowCreate == None:
- self.windowCreate = vmmCreate(self.get_config(), self.get_connection(uri, False))
- self.windowCreate.connect("action-show-console", self._do_show_console)
- self.windowCreate.connect("action-show-terminal", self._do_show_terminal)
- self.windowCreate.reset_state()
- self.windowCreate.show()
+ key = 0
+ while True:
+ if not self.windowCreate.has_key(key):
+ break
+ key += 1
+ window = vmmCreate(virtman=True, key=key)
+ self.windowCreate[key] = window
+ window.connect("action-show-console", self._do_show_console)
+ window.connect("action-show-terminal", self._do_show_terminal)
+ window.connect("vmmcreate-closing", self._create_closing)
+ window.show()
def get_connection(self, uri, readOnly=True):
if not(self.connections.has_key(uri)):

View File

@ -0,0 +1,83 @@
Index: virt-manager-0.2.6/src/virtManager/connect.py
===================================================================
--- virt-manager-0.2.6.orig/src/virtManager/connect.py
+++ virt-manager-0.2.6/src/virtManager/connect.py
@@ -102,4 +102,3 @@ class vmmConnect(gobject.GObject):
self.close()
self.emit("completed", uri, readOnly)
-gobject.type_register(vmmConnect)
Index: virt-manager-0.2.6/src/virtManager/connection.py
===================================================================
--- virt-manager-0.2.6.orig/src/virtManager/connection.py
+++ virt-manager-0.2.6/src/virtManager/connection.py
@@ -242,5 +242,4 @@ class vmmConnection(gobject.GObject):
uuid.append('-')
return "".join(uuid)
-gobject.type_register(vmmConnection)
Index: virt-manager-0.2.6/src/virtManager/console.py
===================================================================
--- virt-manager-0.2.6.orig/src/virtManager/console.py
+++ virt-manager-0.2.6/src/virtManager/console.py
@@ -423,4 +423,3 @@ class vmmConsole(gobject.GObject):
self.ignorePause = False
self.ignorePause = False
-gobject.type_register(vmmConsole)
Index: virt-manager-0.2.6/src/virtManager/details.py
===================================================================
--- virt-manager-0.2.6.orig/src/virtManager/details.py
+++ virt-manager-0.2.6/src/virtManager/details.py
@@ -466,4 +466,3 @@ class vmmDetails(gobject.GObject):
for d in netList:
netsModel.append(None, d)
-gobject.type_register(vmmDetails)
Index: virt-manager-0.2.6/src/virtManager/domain.py
===================================================================
--- virt-manager-0.2.6.orig/src/virtManager/domain.py
+++ virt-manager-0.2.6/src/virtManager/domain.py
@@ -509,4 +509,3 @@ class vmmDomain(gobject.GObject):
memory = int(memory)
self.vm.setMaxMemory(memory)
-gobject.type_register(vmmDomain)
Index: virt-manager-0.2.6/src/virtManager/manager.py
===================================================================
--- virt-manager-0.2.6.orig/src/virtManager/manager.py
+++ virt-manager-0.2.6/src/virtManager/manager.py
@@ -597,4 +597,3 @@ class vmmManager(gobject.GObject):
data.reverse()
cell.set_property('data_array', data)
-gobject.type_register(vmmManager)
Index: virt-manager-0.2.6/src/vncViewer/vnc.py
===================================================================
--- virt-manager-0.2.6.orig/src/vncViewer/vnc.py
+++ virt-manager-0.2.6/src/vncViewer/vnc.py
@@ -113,7 +113,6 @@ class GRFBFrameBuffer(rfb.RFBFrameBuffer
def move_cursor(self, x, y):
logging.error("Unsupported move_cursor operation requested")
-gobject.type_register(GRFBFrameBuffer)
class GRFBNetworkClient(rfb.RFBNetworkClient, gobject.GObject):
@@ -166,7 +165,6 @@ class GRFBNetworkClient(rfb.RFBNetworkCl
def update_pointer(self, mask, x, y):
self.send(pack('>BBHH', 5, mask, x, y))
-gobject.type_register(GRFBNetworkClient)
class GRFBViewer(gtk.DrawingArea):
@@ -512,7 +510,6 @@ class GRFBViewer(gtk.DrawingArea):
gc = self.window.new_gc()
self.window.draw_drawable(gc, self.fb.get_pixmap(), event.area.x, event.area.y, event.area.x, event.area.y, event.area.width, event.area.height)
-gobject.type_register(GRFBViewer)
def main():