diff options
Diffstat (limited to 'pyanaconda/ui/gui')
-rw-r--r-- | pyanaconda/ui/gui/__init__.py | 47 | ||||
-rw-r--r-- | pyanaconda/ui/gui/hubs/progress.py | 25 | ||||
-rw-r--r-- | pyanaconda/ui/gui/spokes/datetime_spoke.py | 16 | ||||
-rw-r--r-- | pyanaconda/ui/gui/spokes/keyboard.py | 15 | ||||
-rw-r--r-- | pyanaconda/ui/gui/spokes/software.py | 34 | ||||
-rw-r--r-- | pyanaconda/ui/gui/spokes/source.py | 51 | ||||
-rw-r--r-- | pyanaconda/ui/gui/spokes/storage.py | 27 |
7 files changed, 109 insertions, 106 deletions
diff --git a/pyanaconda/ui/gui/__init__.py b/pyanaconda/ui/gui/__init__.py index 638772bdb..fa80e6de7 100644 --- a/pyanaconda/ui/gui/__init__.py +++ b/pyanaconda/ui/gui/__init__.py @@ -24,7 +24,7 @@ import meh.ui.gui from gi.repository import Gdk from pyanaconda.ui import UserInterface, common -from pyanaconda.ui.gui.utils import enlightbox, gdk_threaded +from pyanaconda.ui.gui.utils import enlightbox, gtk_thread_wait import gettext _ = lambda x: gettext.ldgettext("anaconda", x) @@ -117,37 +117,36 @@ class GraphicalUserInterface(UserInterface): ### ### MESSAGE HANDLING METHODS ### + @gtk_thread_wait def showError(self, message): from gi.repository import AnacondaWidgets, Gtk - - with gdk_threaded(): - dlg = Gtk.MessageDialog(flags=Gtk.DialogFlags.MODAL, - message_type=Gtk.MessageType.ERROR, - buttons=Gtk.ButtonsType.NONE, - message_format=message) - dlg.add_button(_("_Exit Installer"), 0) - - with enlightbox(self._actions[0].window, dlg): - dlg.run() - dlg.destroy() - + dlg = Gtk.MessageDialog(flags=Gtk.DialogFlags.MODAL, + message_type=Gtk.MessageType.ERROR, + buttons=Gtk.ButtonsType.NONE, + message_format=message) + dlg.add_button(_("_Exit Installer"), 0) + + with enlightbox(self._actions[0].window, dlg): + dlg.run() + dlg.destroy() + + @gtk_thread_wait def showYesNoQuestion(self, message): from gi.repository import AnacondaWidgets, Gtk + dlg = Gtk.MessageDialog(flags=Gtk.DialogFlags.MODAL, + message_type=Gtk.MessageType.QUESTION, + buttons=Gtk.ButtonsType.NONE, + message_format=message) + dlg.add_buttons(_("_No"), 0, _("_Yes"), 1) + dlg.set_default_response(1) - with gdk_threaded(): - dlg = Gtk.MessageDialog(flags=Gtk.DialogFlags.MODAL, - message_type=Gtk.MessageType.QUESTION, - buttons=Gtk.ButtonsType.NONE, - message_format=message) - dlg.add_buttons(_("_No"), 0, _("_Yes"), 1) - dlg.set_default_response(1) - - with enlightbox(self._actions[0].window, dlg): - rc = dlg.run() - dlg.destroy() + with enlightbox(self._actions[0].window, dlg): + rc = dlg.run() + dlg.destroy() return bool(rc) + def mainExceptionWindow(self, text, exn_file, *args, **kwargs): from gi.repository import Gtk, AnacondaWidgets diff --git a/pyanaconda/ui/gui/hubs/progress.py b/pyanaconda/ui/gui/hubs/progress.py index 9cb95eb63..d3b6b4147 100644 --- a/pyanaconda/ui/gui/hubs/progress.py +++ b/pyanaconda/ui/gui/hubs/progress.py @@ -36,7 +36,7 @@ from pyanaconda.flags import flags from pykickstart.constants import KS_WAIT, KS_SHUTDOWN, KS_REBOOT from pyanaconda.ui.gui.hubs import Hub -from pyanaconda.ui.gui.utils import gdk_threaded +from pyanaconda.ui.gui.utils import gtk_thread_nowait, gtk_call_once __all__ = ["ProgressHub"] @@ -227,29 +227,26 @@ class ProgressHub(Hub): self._totalSteps = steps self._currentStep = 0 - with gdk_threaded(): - self._progressBar.set_fraction(0.0) + gtk_call_once(self._progressBar.set_fraction, 0.0) def _step_progress_bar(self): if not self._totalSteps: return - with gdk_threaded(): - self._currentStep += 1 - self._progressBar.set_fraction(self._currentStep/self._totalSteps) + self._currentStep += 1 + gtk_call_once(self._progressBar.set_fraction, self._currentStep/self._totalSteps) def _update_progress_message(self, message): if not self._totalSteps: return - with gdk_threaded(): - self._progressLabel.set_text(message) + gtk_call_once(self._progressLabel.set_text, message) + @gtk_thread_nowait def _progress_bar_complete(self): - with gdk_threaded(): - self._progressBar.set_fraction(1.0) - self._progressLabel.set_text(_("Complete!")) + self._progressBar.set_fraction(1.0) + self._progressLabel.set_text(_("Complete!")) - spinner = self.builder.get_object("progressSpinner") - spinner.stop() - spinner.hide() + spinner = self.builder.get_object("progressSpinner") + spinner.stop() + spinner.hide() diff --git a/pyanaconda/ui/gui/spokes/datetime_spoke.py b/pyanaconda/ui/gui/spokes/datetime_spoke.py index feabeec29..f3249bbcf 100644 --- a/pyanaconda/ui/gui/spokes/datetime_spoke.py +++ b/pyanaconda/ui/gui/spokes/datetime_spoke.py @@ -32,7 +32,7 @@ from gi.repository import AnacondaWidgets, GLib, Gtk from pyanaconda.ui.gui import GUIObject from pyanaconda.ui.gui.spokes import NormalSpoke from pyanaconda.ui.gui.categories.localization import LocalizationCategory -from pyanaconda.ui.gui.utils import enlightbox +from pyanaconda.ui.gui.utils import enlightbox, gtk_thread_nowait, gtk_call_once from pyanaconda import timezone from pyanaconda import iutil @@ -174,6 +174,7 @@ class NTPconfigDialog(GUIObject): """ + @gtk_thread_nowait def set_store_value(arg_tuple): """ We need a function for this, because this way it can be added to @@ -200,13 +201,14 @@ class NTPconfigDialog(GUIObject): if orig_hostname == actual_hostname: if server_working: - GLib.idle_add(set_store_value, (self._serversStore, - itr, 1, SERVER_OK)) + set_store_value((self._serversStore, + itr, 1, SERVER_OK)) else: - GLib.idle_add(set_store_value, (self._serversStore, - itr, 1, SERVER_NOK)) + set_store_value((self._serversStore, + itr, 1, SERVER_NOK)) self._epoch_lock.release() + @gtk_thread_nowait def _refresh_server_working(self, itr): """ Runs a new thread with _set_server_ok_nok(itr) as a taget. """ @@ -229,7 +231,7 @@ class NTPconfigDialog(GUIObject): self._poolsNote.set_text(POOL_SERVERS_NOTE) #do not block UI while starting thread (may take some time) - GLib.idle_add(self._refresh_server_working, itr) + self._refresh_server_working(itr) def on_entry_activated(self, entry, *args): self._add_server(entry.get_text()) @@ -410,7 +412,7 @@ class DatetimeSpoke(NormalSpoke): self._show_no_network_warning() else: self.window.clear_info() - GLib.idle_add(self._config_dialog.refresh_servers_state) + gtk_call_once(self._config_dialog.refresh_servers_state) if flags.can_touch_runtime_system("get NTP service state"): ntp_working = has_active_network and iutil.service_running("chronyd") diff --git a/pyanaconda/ui/gui/spokes/keyboard.py b/pyanaconda/ui/gui/spokes/keyboard.py index fd9e6abea..1a4ca6811 100644 --- a/pyanaconda/ui/gui/spokes/keyboard.py +++ b/pyanaconda/ui/gui/spokes/keyboard.py @@ -30,7 +30,7 @@ from gi.repository import GLib, Gkbd, Gtk, Gdk from pyanaconda.ui.gui import GUIObject from pyanaconda.ui.gui.spokes import NormalSpoke from pyanaconda.ui.gui.categories.localization import LocalizationCategory -from pyanaconda.ui.gui.utils import enlightbox, gdk_threaded +from pyanaconda.ui.gui.utils import enlightbox, gtk_call_once from pyanaconda import keyboard from pyanaconda import flags @@ -89,12 +89,12 @@ class AddLayoutDialog(GUIObject): return 1 def refresh(self): - self._entry = self.builder.get_object("addLayoutEntry") self._entry.grab_focus() def initialize(self): # We want to store layouts' names but show layouts as # 'language (description)'. + self._entry = self.builder.get_object("addLayoutEntry") layoutColumn = self.builder.get_object("newLayoutColumn") layoutRenderer = self.builder.get_object("newLayoutRenderer") layoutColumn.set_cell_data_func(layoutRenderer, _show_layout, @@ -261,8 +261,8 @@ class KeyboardSpoke(NormalSpoke): # Signal handlers. def on_add_clicked(self, button): dialog = AddLayoutDialog(self.data) - dialog.refresh() dialog.initialize() + dialog.refresh() with enlightbox(self.window, dialog.window): response = dialog.run() @@ -284,13 +284,6 @@ class KeyboardSpoke(NormalSpoke): self._removeLayout(self._store, itr) self._remove_last_attempt = False - def _run_add_from_removed(self, button): - # Only call gdk_threaded when necessary (when we need to run the add - # dialog from the on_remove_clicked path) or we'll introduce a different - # deadlock. - with gdk_threaded(): - self.on_add_clicked(button) - def on_remove_clicked(self, button): selection = self.builder.get_object("layoutSelection") if not selection.count_selected_rows(): @@ -311,7 +304,7 @@ class KeyboardSpoke(NormalSpoke): #redrawn self._remove_last_attempt = True add_button = self.builder.get_object("addLayoutButton") - GLib.idle_add(self._run_add_from_removed, add_button) + gtk_call_once(self.on_add_clicked, add_button) return #the selected item is not the first, select the previous one diff --git a/pyanaconda/ui/gui/spokes/software.py b/pyanaconda/ui/gui/spokes/software.py index 2083b5371..e99a1a2bc 100644 --- a/pyanaconda/ui/gui/spokes/software.py +++ b/pyanaconda/ui/gui/spokes/software.py @@ -28,9 +28,10 @@ from pyanaconda.flags import flags from pyanaconda.ui.gui import communication from pyanaconda.ui.gui.spokes import NormalSpoke from pyanaconda.ui.gui.spokes.lib.detailederror import DetailedErrorDialog -from pyanaconda.ui.gui.utils import enlightbox, gdk_threaded +from pyanaconda.ui.gui.utils import enlightbox, gtk_thread_wait from pyanaconda.ui.gui.categories.software import SoftwareCategory from .source import AdditionalReposDialog +from gi.repository import GLib from pyanaconda.kickstart import packagesSeen from pykickstart.parser import Group @@ -155,7 +156,6 @@ class SoftwareSelectionSpoke(NormalSpoke): threadMgr.add(AnacondaThread(name="AnaSoftwareWatcher", target=self._initialize)) def _initialize(self): - from pyanaconda.packaging import MetadataError from pyanaconda.threads import threadMgr communication.send_message(self.__class__.__name__, _("Downloading package metadata...")) @@ -175,18 +175,8 @@ class SoftwareSelectionSpoke(NormalSpoke): if mdGatherThread: mdGatherThread.join() else: - with gdk_threaded(): - # Grabbing the list of groups could potentially take a long time the - # first time (yum does a lot of magic property stuff, some of which - # involves side effects like network access) so go ahead and grab - # them once now. - try: - self.refresh() - except MetadataError: - communication.send_message(self.__class__.__name__, - _("No installation source available")) - return - + if not self._first_refresh(): + return self.payload.release() communication.send_ready(self.__class__.__name__) @@ -195,6 +185,22 @@ class SoftwareSelectionSpoke(NormalSpoke): # we should do dependency solving here. self.apply() + @gtk_thread_wait + def _first_refresh(self): + # Grabbing the list of groups could potentially take a long time the + # first time (yum does a lot of magic property stuff, some of which + # involves side effects like network access) so go ahead and grab + # them once now. + from pyanaconda.packaging import MetadataError + + try: + self.refresh() + return True + except MetadataError: + communication.send_message(self.__class__.__name__, + _("No installation source available")) + return False + def refresh(self): from pyanaconda.threads import threadMgr NormalSpoke.refresh(self) diff --git a/pyanaconda/ui/gui/spokes/source.py b/pyanaconda/ui/gui/spokes/source.py index 9d336cc02..61ce3ae4d 100644 --- a/pyanaconda/ui/gui/spokes/source.py +++ b/pyanaconda/ui/gui/spokes/source.py @@ -36,7 +36,7 @@ from pyanaconda.image import opticalInstallMedia, potentialHdisoSources from pyanaconda.ui.gui import GUIObject, communication from pyanaconda.ui.gui.spokes import NormalSpoke from pyanaconda.ui.gui.categories.software import SoftwareCategory -from pyanaconda.ui.gui.utils import enlightbox, gdk_threaded +from pyanaconda.ui.gui.utils import enlightbox, gtk_thread_wait from pyanaconda.iutil import ProxyString, ProxyStringError __all__ = ["SourceSpoke"] @@ -623,37 +623,40 @@ class SourceSpoke(NormalSpoke): cdrom = None chosen = False - with gdk_threaded(): - # If we've previously set up to use a CD/DVD method, the media has - # already been mounted by payload.setup. We can't try to mount it - # again. So just use what we already know to create the selector. - # Otherwise, check to see if there's anything available. - if self.data.method.method == "cdrom": - cdrom = self.payload.install_device - chosen = True - else: - cdrom = opticalInstallMedia(self.storage.devicetree, mountpoint=MOUNTPOINT) + # If we've previously set up to use a CD/DVD method, the media has + # already been mounted by payload.setup. We can't try to mount it + # again. So just use what we already know to create the selector. + # Otherwise, check to see if there's anything available. + if self.data.method.method == "cdrom": + cdrom = self.payload.install_device + chosen = True + else: + cdrom = opticalInstallMedia(self.storage.devicetree, mountpoint=MOUNTPOINT) - if cdrom: + if cdrom: + @gtk_thread_wait + def gtk_action_1(): selector = AnacondaWidgets.DiskOverview(cdrom.format.label or "", "drive-removable-media", "") selector.path = cdrom.path selector.set_chosen(chosen) self._autodetectMediaBox.pack_start(selector, False, False, 0) - added = True + + gtk_action_1() + added = True - if self.data.method.method == "harddrive": - self._currentIsoFile = self.payload.ISOImage + if self.data.method.method == "harddrive": + self._currentIsoFile = self.payload.ISOImage - # These UI elements default to not being showable. If optical install - # media were found, mark them to be shown. - if added: - self._autodetectBox.set_no_show_all(False) - self._autodetectButton.set_no_show_all(False) + # These UI elements default to not being showable. If optical install + # media were found, mark them to be shown. + if added: + gtk_call_once(self._autodetectBox.set_no_show_all, False) + gtk_call_once(self._autodetectButton.set_no_show_all, False) - # Add the mirror manager URL in as the default for HTTP and HTTPS. - # We'll override this later in the refresh() method, if they've already - # provided a URL. - # FIXME + # Add the mirror manager URL in as the default for HTTP and HTTPS. + # We'll override this later in the refresh() method, if they've already + # provided a URL. + # FIXME self._ready = True communication.send_ready(self.__class__.__name__) diff --git a/pyanaconda/ui/gui/spokes/storage.py b/pyanaconda/ui/gui/spokes/storage.py index bffe1d0ca..611f4abf7 100644 --- a/pyanaconda/ui/gui/spokes/storage.py +++ b/pyanaconda/ui/gui/spokes/storage.py @@ -40,7 +40,6 @@ from gi.repository import Gdk, GLib, Gtk from gi.repository import AnacondaWidgets - from pyanaconda.ui.gui import GUIObject, communication from pyanaconda.ui.gui.spokes import NormalSpoke from pyanaconda.ui.gui.spokes.lib.cart import SelectedDisksDialog @@ -48,7 +47,7 @@ from pyanaconda.ui.gui.spokes.lib.passphrase import PassphraseDialog from pyanaconda.ui.gui.spokes.lib.detailederror import DetailedErrorDialog from pyanaconda.ui.gui.spokes.lib.resize import ResizeDialog from pyanaconda.ui.gui.categories.storage import StorageCategory -from pyanaconda.ui.gui.utils import enlightbox, gdk_threaded +from pyanaconda.ui.gui.utils import enlightbox, gtk_thread_wait from pyanaconda.kickstart import doKickstartStorage from pyanaconda.storage.size import Size @@ -516,16 +515,18 @@ class StorageSpoke(NormalSpoke, StorageChecker): if len(self.disks) == 1 and not self.selected_disks: self.data.ignoredisk.onlyuse = [self.disks[0].name] - with gdk_threaded(): - # properties: kind, description, capacity, os, popup-info - for disk in self.disks: - if disk.removable: - kind = "drive-removable-media" - else: - kind = "drive-harddisk" + # properties: kind, description, capacity, os, popup-info + for disk in self.disks: + if disk.removable: + kind = "drive-removable-media" + else: + kind = "drive-harddisk" + + size = size_str(disk.size) + popup_info = "%s | %s" % (disk.name, disk.serial) - size = size_str(disk.size) - popup_info = "%s | %s" % (disk.name, disk.serial) + @gtk_thread_wait + def gtk_action(): overview = AnacondaWidgets.DiskOverview(disk.description, kind, size, @@ -541,8 +542,10 @@ class StorageSpoke(NormalSpoke, StorageChecker): overview.connect("key-release-event", self._on_disk_clicked) overview.show_all() - self._update_summary() + self._update_summary() + gtk_action() + self._ready = True communication.send_ready(self.__class__.__name__) |