diff options
author | Martin Sivak <msivak@redhat.com> | 2012-10-16 12:58:48 +0200 |
---|---|---|
committer | Martin Sivak <msivak@redhat.com> | 2012-10-16 15:37:37 +0200 |
commit | 4738bb9da3f3488ff12ecb702d3b63315e6ade37 (patch) | |
tree | 6a5261dc324e6a6c96b2f19d16f833db22930ea3 /pyanaconda/ui/gui/spokes/keyboard.py | |
parent | 8d65f4e89fc4f036be3b283c1b5a2041153593b5 (diff) | |
download | anaconda-threading.tar.gz anaconda-threading.tar.xz anaconda-threading.zip |
Make all Gtk calls from inside of it's main loop (and thread)threading
- Marks all methods containing mostly gtk calls as gtk_thread_wait
or gtk_thread_nowait
- Uses gtk_call_once instead of GLib.idle_add to make sure the
method is called only once (returns False)
- Removes some code from the threading locks, because it wasn´t
touching Gtk at all
This change was discussed in the mailinglist here:
https://www.redhat.com/archives/anaconda-devel-list/2012-October/msg00030.html
The main point was:
According to the Gtk team, the gdk_threads_enter/leave pair should
not be used at all (and they have apparently discouraged usage of
it since early releases of Gtk2). Moreover in the current Gdk docs
(http://developer.gnome.org/gdk3/stable/gdk3-Threads.html)
those functions are now marked as deprecated.
The preferred way (and now the only way) is to use g_idle_add
(GLib.idle_add) with a callback method to schedule GUI changes.
The callback method will then get called by the Gtk main loop so
no locking is needed (and GLib.idle_add performs none). But that
is also the reason why everything Gtk related must be done from
the mainloop thread either directly or via idle_add.
Diffstat (limited to 'pyanaconda/ui/gui/spokes/keyboard.py')
-rw-r--r-- | pyanaconda/ui/gui/spokes/keyboard.py | 15 |
1 files changed, 4 insertions, 11 deletions
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 |