home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / lib / python2.6 / dist-packages / DistUpgrade / DistUpgradeViewGtk.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-10-12  |  27.1 KB  |  663 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import pygtk
  5. pygtk.require('2.0')
  6. import gtk
  7. import gtk.gdk as gtk
  8. import gtk.glade as gtk
  9. import vte
  10. import gobject
  11. import pango
  12. import sys
  13. import logging
  14. import time
  15. import subprocess
  16. import apt
  17. import apt_pkg
  18. import os
  19. from DistUpgradeApport import *
  20. from DistUpgradeView import DistUpgradeView, FuzzyTimeToStr, InstallProgress, FetchProgress
  21. from SimpleGladeApp import SimpleGladeApp, bindtextdomain
  22. import gettext
  23. from DistUpgradeGettext import gettext as _
  24.  
  25. def utf8(str):
  26.     return unicode(str, 'latin1').encode('utf-8')
  27.  
  28.  
  29. class GtkCdromProgressAdapter(apt.progress.CdromProgress):
  30.     ''' Report the cdrom add progress
  31.         Subclass this class to implement cdrom add progress reporting
  32.     '''
  33.     
  34.     def __init__(self, parent):
  35.         self.status = parent.label_status
  36.         self.progress = parent.progressbar_cache
  37.         self.parent = parent
  38.  
  39.     
  40.     def update(self, text, step):
  41.         ''' update is called regularly so that the gui can be redrawn '''
  42.         if text:
  43.             self.status.set_text(text)
  44.         
  45.         self.progress.set_fraction(step / float(self.totalSteps))
  46.         while gtk.events_pending():
  47.             gtk.main_iteration()
  48.  
  49.     
  50.     def askCdromName(self):
  51.         return (False, '')
  52.  
  53.     
  54.     def changeCdrom(self):
  55.         return False
  56.  
  57.  
  58.  
  59. class GtkOpProgress(apt.progress.OpProgress):
  60.     
  61.     def __init__(self, progressbar):
  62.         self.progressbar = progressbar
  63.  
  64.     
  65.     def update(self, percent):
  66.         self.progressbar.set_fraction(percent / 100)
  67.         while gtk.events_pending():
  68.             gtk.main_iteration()
  69.  
  70.     
  71.     def done(self):
  72.         self.progressbar.set_text(' ')
  73.  
  74.  
  75.  
  76. class GtkFetchProgressAdapter(FetchProgress):
  77.     
  78.     def __init__(self, parent):
  79.         FetchProgress.__init__(self)
  80.         self.status = parent.label_status
  81.         self.progress = parent.progressbar_cache
  82.         self.parent = parent
  83.         self.canceled = False
  84.         self.button_cancel = parent.button_fetch_cancel
  85.         self.button_cancel.connect('clicked', self.cancelClicked)
  86.  
  87.     
  88.     def cancelClicked(self, widget):
  89.         logging.debug('cancelClicked')
  90.         self.canceled = True
  91.  
  92.     
  93.     def mediaChange(self, medium, drive):
  94.         msg = _("Please insert '%s' into the drive '%s'") % (medium, drive)
  95.         dialog = gtk.MessageDialog(parent = self.parent.window_main, flags = gtk.DIALOG_MODAL, type = gtk.MESSAGE_QUESTION, buttons = gtk.BUTTONS_OK_CANCEL)
  96.         dialog.set_markup(msg)
  97.         res = dialog.run()
  98.         dialog.destroy()
  99.         if res == gtk.RESPONSE_OK:
  100.             return True
  101.         return False
  102.  
  103.     
  104.     def start(self):
  105.         self.progress.set_fraction(0)
  106.         self.status.show()
  107.         self.button_cancel.show()
  108.  
  109.     
  110.     def stop(self):
  111.         self.progress.set_text(' ')
  112.         self.status.set_text(_('Fetching is complete'))
  113.         self.button_cancel.hide()
  114.  
  115.     
  116.     def pulse(self):
  117.         FetchProgress.pulse(self)
  118.         self.progress.set_fraction(self.percent / 100)
  119.         currentItem = self.currentItems + 1
  120.         if currentItem > self.totalItems:
  121.             currentItem = self.totalItems
  122.         
  123.         if self.currentCPS > 0:
  124.             self.status.set_text(_('Fetching file %li of %li at %sB/s') % (currentItem, self.totalItems, apt_pkg.SizeToStr(self.currentCPS)))
  125.             self.progress.set_text(_('About %s remaining') % FuzzyTimeToStr(self.eta))
  126.         else:
  127.             self.status.set_text(_('Fetching file %li of %li') % (currentItem, self.totalItems))
  128.             self.progress.set_text('  ')
  129.         while gtk.events_pending():
  130.             gtk.main_iteration()
  131.         return not (self.canceled)
  132.  
  133.  
  134.  
  135. class GtkInstallProgressAdapter(InstallProgress):
  136.     TIMEOUT_TERMINAL_ACTIVITY = 240
  137.     
  138.     def __init__(self, parent):
  139.         InstallProgress.__init__(self)
  140.         self._cache = None
  141.         self.label_status = parent.label_status
  142.         self.progress = parent.progressbar_cache
  143.         self.expander = parent.expander_terminal
  144.         self.term = parent._term
  145.         self.parent = parent
  146.         reaper = vte.reaper_get()
  147.         reaper.connect('child-exited', self.child_exited)
  148.         apt_pkg.Config.Set('DPkg::StopOnError', 'False')
  149.  
  150.     
  151.     def startUpdate(self):
  152.         InstallProgress.startUpdate(self)
  153.         self.finished = False
  154.         self.label_status.set_text(_('Applying changes'))
  155.         self.progress.set_fraction(0)
  156.         self.progress.set_text(' ')
  157.         self.expander.set_sensitive(True)
  158.         self.term.show()
  159.         if not os.environ.get('DEBIAN_FRONTEND'):
  160.             pass
  161.         frontend = 'gnome'
  162.         if frontend == 'gnome' and self._cache:
  163.             if not self._cache.has_key('libgnome2-perl') or not (self._cache['libgnome2-perl'].isInstalled):
  164.                 frontend = 'dialog'
  165.                 self.expander.set_expanded(True)
  166.             
  167.         
  168.         self.env = [
  169.             'VTE_PTY_KEEP_FD=%s' % self.writefd,
  170.             'APT_LISTCHANGES_FRONTEND=none']
  171.         if not os.environ.has_key('DEBIAN_FRONTEND'):
  172.             self.env.append('DEBIAN_FRONTEND=%s' % frontend)
  173.         
  174.         self.start_time = 0
  175.         self.time_ui = 0
  176.         self.last_activity = 0
  177.  
  178.     
  179.     def error(self, pkg, errormsg):
  180.         InstallProgress.error(self, pkg, errormsg)
  181.         logging.error("got an error from dpkg for pkg: '%s': '%s'" % (pkg, errormsg))
  182.         if gettext.dgettext('dpkg', 'dependency problems - leaving unconfigured') in errormsg:
  183.             return False
  184.         self.parent.dialog_error.set_transient_for(self.parent.window_main)
  185.         summary = _("Could not install '%s'") % pkg
  186.         msg = _("The upgrade will continue but the '%s' package may be in a not working state. Please consider submitting a bug report about it.") % pkg
  187.         markup = '<big><b>%s</b></big>\n\n%s' % (summary, msg)
  188.         self.parent.dialog_error.realize()
  189.         self.parent.dialog_error.window.set_functions(gtk.gdk.FUNC_MOVE)
  190.         self.parent.label_error.set_markup(markup)
  191.         self.parent.textview_error.get_buffer().set_text(utf8(errormsg))
  192.         self.parent.scroll_error.show()
  193.         self.parent.dialog_error.run()
  194.         self.parent.dialog_error.hide()
  195.  
  196.     
  197.     def conffile(self, current, new):
  198.         logging.debug("got a conffile-prompt from dpkg for file: '%s'" % current)
  199.         start = time.time()
  200.         prim = _("Replace the customized configuration file\n'%s'?") % current
  201.         sec = _('You will lose any changes you have made to this configuration file if you choose to replace it with a newer version.')
  202.         markup = '<span weight="bold" size="larger">%s </span> \n\n%s' % (prim, sec)
  203.         self.parent.label_conffile.set_markup(markup)
  204.         self.parent.dialog_conffile.set_transient_for(self.parent.window_main)
  205.         if os.path.exists('/usr/bin/diff'):
  206.             cmd = [
  207.                 '/usr/bin/diff',
  208.                 '-u',
  209.                 current,
  210.                 new]
  211.             diff = utf8(subprocess.Popen(cmd, stdout = subprocess.PIPE).communicate()[0])
  212.             self.parent.textview_conffile.get_buffer().set_text(diff)
  213.         else:
  214.             self.parent.textview_conffile.get_buffer().set_text(_("The 'diff' command was not found"))
  215.         res = self.parent.dialog_conffile.run()
  216.         self.parent.dialog_conffile.hide()
  217.         self.time_ui += time.time() - start
  218.         if res == gtk.RESPONSE_YES:
  219.             self.term.feed_child('y\n')
  220.         else:
  221.             self.term.feed_child('n\n')
  222.  
  223.     
  224.     def fork(self):
  225.         pid = self.term.forkpty(envv = self.env)
  226.         if pid == 0:
  227.             for env in self.env:
  228.                 (key, value) = env.split('=')
  229.                 os.environ[key] = value
  230.             
  231.             
  232.             sys.exitfunc = lambda : True
  233.         
  234.         return pid
  235.  
  236.     
  237.     def statusChange(self, pkg, percent, status):
  238.         if self.start_time == 0:
  239.             self.start_time = time.time()
  240.         
  241.         self.progress.set_fraction(float(percent) / 100)
  242.         self.label_status.set_text(status.strip())
  243.         if percent > 1:
  244.             self.last_activity = time.time()
  245.             self.activity_timeout_reported = False
  246.             delta = self.last_activity - self.start_time
  247.             delta -= self.time_ui
  248.             time_per_percent = float(delta) / percent
  249.             eta = (100 - percent) * time_per_percent
  250.             if eta > 61 and eta < 172800:
  251.                 self.progress.set_text(_('About %s remaining') % FuzzyTimeToStr(eta))
  252.             else:
  253.                 self.progress.set_text(' ')
  254.         
  255.  
  256.     
  257.     def child_exited(self, term, pid, status):
  258.         self.apt_status = os.WEXITSTATUS(status)
  259.         self.finished = True
  260.  
  261.     
  262.     def waitChild(self):
  263.         while not self.finished:
  264.             self.updateInterface()
  265.         return self.apt_status
  266.  
  267.     
  268.     def finishUpdate(self):
  269.         self.label_status.set_text('')
  270.  
  271.     
  272.     def updateInterface(self):
  273.         
  274.         try:
  275.             InstallProgress.updateInterface(self)
  276.         except ValueError:
  277.             e = None
  278.             logging.error("got ValueError from InstallProgress.updateInterface. Line was '%s' (%s)" % (self.read, e))
  279.             self.read = ''
  280.  
  281.         if self.start_time == 0:
  282.             self.progress.pulse()
  283.             time.sleep(0.2)
  284.         
  285.         if self.last_activity > 0 and self.last_activity + self.TIMEOUT_TERMINAL_ACTIVITY < time.time():
  286.             if not self.activity_timeout_reported:
  287.                 logging.warning('no activity on terminal for %s seconds (%s)' % (self.TIMEOUT_TERMINAL_ACTIVITY, self.label_status.get_text()))
  288.                 self.activity_timeout_reported = True
  289.             
  290.             self.parent.expander_terminal.set_expanded(True)
  291.         
  292.         while gtk.events_pending():
  293.             gtk.main_iteration()
  294.         time.sleep(0.005)
  295.  
  296.  
  297.  
  298. class DistUpgradeVteTerminal(object):
  299.     
  300.     def __init__(self, parent, term):
  301.         self.term = term
  302.         self.parent = parent
  303.  
  304.     
  305.     def call(self, cmd, hidden = False):
  306.         
  307.         def wait_for_child(widget):
  308.             self.finished = True
  309.  
  310.         self.term.show()
  311.         self.term.connect('child-exited', wait_for_child)
  312.         self.parent.expander_terminal.set_sensitive(True)
  313.         if hidden == False:
  314.             self.parent.expander_terminal.set_expanded(True)
  315.         
  316.         self.finished = False
  317.         pid = self.term.fork_command(command = cmd[0], argv = cmd)
  318.         if pid < 0:
  319.             return None
  320.         while not self.finished:
  321.             while gtk.events_pending():
  322.                 gtk.main_iteration()
  323.                 continue
  324.                 pid < 0
  325.             time.sleep(0.1)
  326.         del self.finished
  327.  
  328.  
  329.  
  330. class DistUpgradeViewGtk(DistUpgradeView, SimpleGladeApp):
  331.     ''' gtk frontend of the distUpgrade tool '''
  332.     
  333.     def __init__(self, datadir = None, logdir = None):
  334.         self.logdir = logdir
  335.         if not datadir:
  336.             localedir = os.path.join(os.getcwd(), 'mo')
  337.             gladedir = os.getcwd()
  338.         else:
  339.             localedir = '/usr/share/locale/update-manager'
  340.             gladedir = os.path.join(datadir, 'glade')
  341.         
  342.         try:
  343.             bindtextdomain('update-manager', localedir)
  344.             gettext.textdomain('update-manager')
  345.         except Exception:
  346.             e = None
  347.             logging.warning('Error setting locales (%s)' % e)
  348.  
  349.         icons = gtk.icon_theme_get_default()
  350.         
  351.         try:
  352.             gtk.window_set_default_icon(icons.load_icon('update-manager', 32, 0))
  353.         except gobject.GError:
  354.             e = None
  355.             logging.debug('error setting default icon, ignoring (%s)' % e)
  356.  
  357.         SimpleGladeApp.__init__(self, gladedir + '/DistUpgrade.glade', None, domain = 'update-manager')
  358.         self.prev_step = 0
  359.         self.icontheme = gtk.icon_theme_get_default()
  360.         self.pngloader = gtk.gdk.PixbufLoader('png')
  361.         
  362.         try:
  363.             self.svgloader = gtk.gdk.PixbufLoader('svg')
  364.             self.svgloader.close()
  365.         except gobject.GError:
  366.             e = None
  367.             logging.debug('svg pixbuf loader failed (%s)' % e)
  368.  
  369.         self.window_main.realize()
  370.         self.window_main.window.set_functions(gtk.gdk.FUNC_MOVE)
  371.         self._opCacheProgress = GtkOpProgress(self.progressbar_cache)
  372.         self._fetchProgress = GtkFetchProgressAdapter(self)
  373.         self._cdromProgress = GtkCdromProgressAdapter(self)
  374.         self._installProgress = GtkInstallProgressAdapter(self)
  375.         self.details_list = gtk.ListStore(gobject.TYPE_STRING)
  376.         column = gtk.TreeViewColumn('')
  377.         render = gtk.CellRendererText()
  378.         column.pack_start(render, True)
  379.         column.add_attribute(render, 'markup', 0)
  380.         self.treeview_details.append_column(column)
  381.         self.treeview_details.set_model(self.details_list)
  382.         self.vscrollbar_terminal.set_adjustment(self._term.get_adjustment())
  383.         self._term.realize()
  384.         attrlist = pango.AttrList()
  385.         attr = pango.AttrScale(pango.SCALE_SMALL, 0, -1)
  386.         attrlist.insert(attr)
  387.         self.label_status.set_property('attributes', attrlist)
  388.         sys.excepthook = self._handleException
  389.  
  390.     
  391.     def _handleException(self, type, value, tb):
  392.         import traceback
  393.         lines = traceback.format_exception(type, value, tb)
  394.         logging.error('not handled expection:\n%s' % '\n'.join(lines))
  395.         apport_crash(type, value, tb)
  396.         if not run_apport():
  397.             self.error(_('A fatal error occurred'), _("Please report this as a bug (if you haven't already) and include the files /var/log/dist-upgrade/main.log and /var/log/dist-upgrade/apt.log in your report. The upgrade is now aborted.\nYour original sources.list was saved in /etc/apt/sources.list.distUpgrade."), '\n'.join(lines))
  398.         
  399.         sys.exit(1)
  400.  
  401.     
  402.     def getTerminal(self):
  403.         return DistUpgradeVteTerminal(self, self._term)
  404.  
  405.     
  406.     def _key_press_handler(self, widget, keyev):
  407.         if len(keyev.string) == 1 and ord(keyev.string) == 3:
  408.             summary = _('Ctrl-c pressed')
  409.             msg = _('This will abort the operation and may leave the system in a broken state. Are you sure you want to do that?')
  410.             res = self.askYesNoQuestion(summary, msg)
  411.             logging.warning('ctrl-c press detected, user decided to pass it on: %s', res)
  412.             return not res
  413.         return False
  414.  
  415.     
  416.     def create_terminal(self, arg1, arg2, arg3, arg4):
  417.         ''' helper to create a vte terminal '''
  418.         self._term = vte.Terminal()
  419.         self._term.connect('key-press-event', self._key_press_handler)
  420.         self._term.set_font_from_string('monospace 10')
  421.         self._term.connect('contents-changed', self._term_content_changed)
  422.         self._terminal_lines = []
  423.         
  424.         try:
  425.             self._terminal_log = open(os.path.join(self.logdir, 'term.log'), 'w')
  426.         except Exception:
  427.             e = None
  428.             self._terminal_log = sys.stdout
  429.  
  430.         return self._term
  431.  
  432.     
  433.     def _term_content_changed(self, term):
  434.         ''' called when the *visible* part of the terminal changes '''
  435.         current_text = self._term.get_text((lambda a, b, c, d: True))
  436.         new_lines = []
  437.         for line in current_text.split('\n'):
  438.             new_lines.append(line)
  439.             if line not in self._terminal_lines:
  440.                 self._terminal_log.write(line + '\n')
  441.                 self._terminal_log.flush()
  442.                 continue
  443.         
  444.         self._terminal_lines = new_lines
  445.  
  446.     
  447.     def getFetchProgress(self):
  448.         return self._fetchProgress
  449.  
  450.     
  451.     def getInstallProgress(self, cache):
  452.         self._installProgress._cache = cache
  453.         return self._installProgress
  454.  
  455.     
  456.     def getOpCacheProgress(self):
  457.         return self._opCacheProgress
  458.  
  459.     
  460.     def getCdromProgress(self):
  461.         return self._cdromProgress
  462.  
  463.     
  464.     def updateStatus(self, msg):
  465.         self.label_status.set_text('%s' % msg)
  466.  
  467.     
  468.     def hideStep(self, step):
  469.         image = getattr(self, 'image_step%i' % step)
  470.         label = getattr(self, 'label_step%i' % step)
  471.         arrow = getattr(self, 'arrow_step%i' % step)
  472.         image.hide()
  473.         label.hide()
  474.  
  475.     
  476.     def showStep(self, step):
  477.         image = getattr(self, 'image_step%i' % step)
  478.         label = getattr(self, 'label_step%i' % step)
  479.         image.show()
  480.         label.show()
  481.  
  482.     
  483.     def abort(self):
  484.         size = gtk.ICON_SIZE_MENU
  485.         step = self.prev_step
  486.         if step > 0:
  487.             image = getattr(self, 'image_step%i' % step)
  488.             arrow = getattr(self, 'arrow_step%i' % step)
  489.             image.set_from_stock(gtk.STOCK_CANCEL, size)
  490.             image.show()
  491.             arrow.hide()
  492.         
  493.  
  494.     
  495.     def setStep(self, step):
  496.         if self.icontheme.rescan_if_needed():
  497.             logging.debug('icon theme changed, re-reading')
  498.         
  499.         size = gtk.ICON_SIZE_MENU
  500.         attrlist = pango.AttrList()
  501.         if self.prev_step:
  502.             image = getattr(self, 'image_step%i' % self.prev_step)
  503.             label = getattr(self, 'label_step%i' % self.prev_step)
  504.             arrow = getattr(self, 'arrow_step%i' % self.prev_step)
  505.             label.set_property('attributes', attrlist)
  506.             image.set_from_stock(gtk.STOCK_APPLY, size)
  507.             image.show()
  508.             arrow.hide()
  509.         
  510.         self.prev_step = step
  511.         image = getattr(self, 'image_step%i' % step)
  512.         label = getattr(self, 'label_step%i' % step)
  513.         arrow = getattr(self, 'arrow_step%i' % step)
  514.         if not label.get_property('visible'):
  515.             return None
  516.         arrow.show()
  517.         image.hide()
  518.         attr = pango.AttrWeight(pango.WEIGHT_BOLD, 0, -1)
  519.         attrlist.insert(attr)
  520.         label.set_property('attributes', attrlist)
  521.  
  522.     
  523.     def information(self, summary, msg, extended_msg = None):
  524.         self.dialog_information.set_transient_for(self.window_main)
  525.         msg = '<big><b>%s</b></big>\n\n%s' % (summary, msg)
  526.         self.label_information.set_markup(msg)
  527.         if extended_msg != None:
  528.             buffer = self.textview_information.get_buffer()
  529.             buffer.set_text(extended_msg)
  530.             self.scroll_information.show()
  531.         else:
  532.             self.scroll_information.hide()
  533.         self.dialog_information.realize()
  534.         self.dialog_information.window.set_functions(gtk.gdk.FUNC_MOVE)
  535.         self.dialog_information.run()
  536.         self.dialog_information.hide()
  537.         while gtk.events_pending():
  538.             gtk.main_iteration()
  539.  
  540.     
  541.     def error(self, summary, msg, extended_msg = None):
  542.         self.dialog_error.set_transient_for(self.window_main)
  543.         msg = '<big><b>%s</b></big>\n\n%s' % (summary, msg)
  544.         self.label_error.set_markup(msg)
  545.         if extended_msg != None:
  546.             buffer = self.textview_error.get_buffer()
  547.             buffer.set_text(extended_msg)
  548.             self.scroll_error.show()
  549.         else:
  550.             self.scroll_error.hide()
  551.         self.dialog_error.realize()
  552.         self.dialog_error.window.set_functions(gtk.gdk.FUNC_MOVE)
  553.         self.dialog_error.run()
  554.         self.dialog_error.hide()
  555.         return False
  556.  
  557.     
  558.     def confirmChanges(self, summary, changes, downloadSize, actions = None, removal_bold = True):
  559.         if not DistUpgradeView.confirmChanges(self, summary, changes, downloadSize):
  560.             return False
  561.         self.confirmChangesMessage += '\n\n<b>%s</b>' % _('To prevent data loss close all open applications and documents.')
  562.         self.label_summary.set_markup('<big><b>%s</b></big>' % summary)
  563.         self.label_changes.set_markup(self.confirmChangesMessage)
  564.         self.details_list.clear()
  565.         for dg in self.toDowngrade:
  566.             self.details_list.append([
  567.                 _('<b>Downgrade %s</b>') % dg])
  568.         
  569.         for rm in self.toRemove:
  570.             s = _('Remove %s') % rm
  571.             if removal_bold:
  572.                 s = '<b>%s</b>' % s
  573.             
  574.             self.details_list.append([
  575.                 s])
  576.         
  577.         for inst in self.toInstall:
  578.             self.details_list.append([
  579.                 _('Install %s') % inst])
  580.         
  581.         for up in self.toUpgrade:
  582.             self.details_list.append([
  583.                 _('Upgrade %s') % up])
  584.         
  585.         self.dialog_changes.set_transient_for(self.window_main)
  586.         self.dialog_changes.realize()
  587.         self.treeview_details.realize()
  588.         self.treeview_details.set_cursor((0,))
  589.         self.treeview_details.scroll_to_point(0, 0)
  590.         self.dialog_changes.window.set_functions(gtk.gdk.FUNC_MOVE)
  591.         res = self.dialog_changes.run()
  592.         self.dialog_changes.hide()
  593.         if res == gtk.RESPONSE_YES:
  594.             return True
  595.         return False
  596.  
  597.     
  598.     def askYesNoQuestion(self, summary, msg, default = 'No'):
  599.         msg = '<big><b>%s</b></big>\n\n%s' % (summary, msg)
  600.         dialog = gtk.MessageDialog(parent = self.window_main, flags = gtk.DIALOG_MODAL, type = gtk.MESSAGE_QUESTION, buttons = gtk.BUTTONS_YES_NO)
  601.         if default == 'No':
  602.             dialog.set_default_response(gtk.RESPONSE_NO)
  603.         else:
  604.             dialog.set_default_response(gtk.RESPONSE_YES)
  605.         dialog.set_markup(msg)
  606.         res = dialog.run()
  607.         dialog.destroy()
  608.         if res == gtk.RESPONSE_YES:
  609.             return True
  610.         return False
  611.  
  612.     
  613.     def confirmRestart(self):
  614.         self.dialog_restart.set_transient_for(self.window_main)
  615.         self.dialog_restart.realize()
  616.         self.dialog_restart.window.set_functions(gtk.gdk.FUNC_MOVE)
  617.         res = self.dialog_restart.run()
  618.         self.dialog_restart.hide()
  619.         if res == gtk.RESPONSE_YES:
  620.             return True
  621.         return False
  622.  
  623.     
  624.     def processEvents(self):
  625.         while gtk.events_pending():
  626.             gtk.main_iteration()
  627.  
  628.     
  629.     def on_window_main_delete_event(self, widget, event):
  630.         self.dialog_cancel.set_transient_for(self.window_main)
  631.         self.dialog_cancel.realize()
  632.         self.dialog_cancel.window.set_functions(gtk.gdk.FUNC_MOVE)
  633.         res = self.dialog_cancel.run()
  634.         self.dialog_cancel.hide()
  635.         if res == gtk.RESPONSE_CANCEL:
  636.             sys.exit(1)
  637.         
  638.         return True
  639.  
  640.  
  641. if __name__ == '__main__':
  642.     view = DistUpgradeViewGtk()
  643.     fp = GtkFetchProgressAdapter(view)
  644.     ip = GtkInstallProgressAdapter(view)
  645.     cache = apt.Cache()
  646.     for pkg in sys.argv[1:]:
  647.         if cache[pkg].isInstalled:
  648.             cache[pkg].markDelete()
  649.         else:
  650.             cache[pkg].markInstall()
  651.     
  652.     cache.commit(fp, ip)
  653.     gtk.main()
  654.     sys.exit(0)
  655.     ip.conffile('TODO', 'TODO~')
  656.     view.getTerminal().call([
  657.         'dpkg',
  658.         '--configure',
  659.         '-a'])
  660.     view.error('short', 'long', 'asfds afsdj af asdf asdf asf dsa fadsf asdf as fasf sextended\nasfds afsdj af asdf asdf asf dsa fadsf asdf as fasf sextended\nasfds afsdj af asdf asdf asf dsa fadsf asdf as fasf sextended\nasfds afsdj af asdf asdf asf dsa fadsf asdf as fasf sextended\nasfds afsdj af asdf asdf asf dsa fadsf asdf as fasf sextended\nasfds afsdj af asdf asdf asf dsa fadsf asdf as fasf sextended\nasfds afsdj af asdf asdf asf dsa fadsf asdf as fasf sextended\n')
  661.     view.confirmChanges('xx', [], 100)
  662.  
  663.