summaryrefslogtreecommitdiffstats
path: root/pyanaconda/ui/gui/spokes/keyboard.py
diff options
context:
space:
mode:
authorMartin Sivak <msivak@redhat.com>2012-10-16 12:58:48 +0200
committerMartin Sivak <msivak@redhat.com>2012-10-16 15:37:37 +0200
commit4738bb9da3f3488ff12ecb702d3b63315e6ade37 (patch)
tree6a5261dc324e6a6c96b2f19d16f833db22930ea3 /pyanaconda/ui/gui/spokes/keyboard.py
parent8d65f4e89fc4f036be3b283c1b5a2041153593b5 (diff)
downloadanaconda-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.py15
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