Merge lp:~pitti/sessioninstaller/gtk3 into lp:sessioninstaller
- gtk3
- Merge into main
Proposed by
Martin Pitt
Status: | Merged |
---|---|
Merged at revision: | 122 |
Proposed branch: | lp:~pitti/sessioninstaller/gtk3 |
Merge into: | lp:sessioninstaller |
Diff against target: |
632 lines (+115/-114) 4 files modified
sessioninstaller/backends/aptd.py (+12/-12) sessioninstaller/backends/dummy.py (+2/-2) sessioninstaller/backends/synaptic.py (+4/-4) sessioninstaller/core.py (+97/-96) |
To merge this branch: | bzr merge lp:~pitti/sessioninstaller/gtk3 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Michael Vogt | Approve | ||
Review via email: mp+82142@code.launchpad.net |
Commit message
Description of the change
This ports sessioninstaller to PyGI and GTK3. Please note that with the current GTK you often get crashes when hovering over package names in the list. I fixed that in upstream GTK:
http://
To post a comment you must log in.
Revision history for this message
Martin Pitt (pitti) wrote : | # |
Revision history for this message
Michael Vogt (mvo) wrote : | # |
That looks fine. Thanks for doing the port!
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'sessioninstaller/backends/aptd.py' |
2 | --- sessioninstaller/backends/aptd.py 2011-01-14 21:30:29 +0000 |
3 | +++ sessioninstaller/backends/aptd.py 2011-11-14 13:39:25 +0000 |
4 | @@ -23,13 +23,13 @@ |
5 | |
6 | __author__ = "Sebastian Heinlein <devel@glatzor.de>" |
7 | |
8 | -import gtk |
9 | +from gi.repository import Gtk |
10 | |
11 | from aptdaemon import enums |
12 | import defer |
13 | import aptdaemon.client |
14 | import aptdaemon.errors |
15 | -import aptdaemon.gtkwidgets |
16 | +import aptdaemon.gtk3widgets |
17 | |
18 | import sessioninstaller.errors |
19 | |
20 | @@ -43,11 +43,11 @@ |
21 | |
22 | def _run_trans(self, trans, parent, interaction): |
23 | deferred = defer.Deferred() |
24 | - dia = aptdaemon.gtkwidgets.AptProgressDialog(trans) |
25 | + dia = aptdaemon.gtk3widgets.AptProgressDialog(trans) |
26 | dia.connect("finished", lambda x: deferred.callback()) |
27 | if parent: |
28 | dia.realize() |
29 | - dia.window.set_transient_for(parent) |
30 | + dia.set_transient_for(parent) |
31 | dia.run(close_on_finished=True, show_error=True, |
32 | reply_handler=lambda: True, |
33 | error_handler=deferred.errback) |
34 | @@ -62,19 +62,19 @@ |
35 | def _confirm_deps(self, trans, parent, interaction): |
36 | if not [pkgs for pkgs in trans.dependencies if pkgs]: |
37 | return trans |
38 | - dia = aptdaemon.gtkwidgets.AptConfirmDialog(trans) |
39 | + dia = aptdaemon.gtk3widgets.AptConfirmDialog(trans) |
40 | if parent: |
41 | dia.realize() |
42 | - dia.window.set_transient_for(parent) |
43 | + dia.set_transient_for(parent) |
44 | res = dia.run() |
45 | dia.hide() |
46 | - if res == gtk.RESPONSE_OK: |
47 | + if res == Gtk.ResponseType.OK: |
48 | return trans |
49 | raise sessioninstaller.errors.ModifyCancelled |
50 | |
51 | def install_packages(self, xid, package_names, interaction): |
52 | deferred = defer.Deferred() |
53 | - parent = gtk.gdk.window_foreign_new(xid) |
54 | + parent = None # should get from XID, but removed from Gdk 3 |
55 | self.ac.install_packages(package_names, reply_handler=deferred.callback, |
56 | error_handler=deferred.errback) |
57 | deferred.add_callback(self._simulate_trans, parent, interaction) |
58 | @@ -85,7 +85,7 @@ |
59 | |
60 | def install_package_files(self, xid, files, interaction): |
61 | deferred = defer.Deferred() |
62 | - parent = gtk.gdk.window_foreign_new(xid) |
63 | + parent = None # should get from XID, but removed from Gdk 3 |
64 | #FIXME: Add support for installing serveral files at the same time |
65 | self.ac.install_file(files[0], reply_handler=deferred.callback, |
66 | error_handler=deferred.errback) |
67 | @@ -97,7 +97,7 @@ |
68 | |
69 | def remove_packages(self, xid, package_names, interaction): |
70 | deferred = defer.Deferred() |
71 | - parent = gtk.gdk.window_foreign_new(xid) |
72 | + parent = None # should get from XID, but removed from Gdk 3 |
73 | self.ac.remove_packages(package_names, reply_handler=deferred.callback, |
74 | error_handler=deferred.errback) |
75 | deferred.add_callback(self._simulate_trans, parent, interaction) |
76 | @@ -120,10 +120,10 @@ |
77 | except Exception, error: |
78 | error = aptdaemon.errors.TransactionFailed(enums.ERROR_UNKNOWN, |
79 | str(error)) |
80 | - dia = aptdaemon.gtkwidgets.AptErrorDialog(error) |
81 | + dia = aptdaemon.gtk3widgets.AptErrorDialog(error) |
82 | if parent: |
83 | dia.realize() |
84 | - dia.window.set_transient_for(parent) |
85 | + dia.set_transient_for(parent) |
86 | dia.run() |
87 | dia.hide() |
88 | msg = "%s - %s\n%s" % (enums.get_error_string_from_enum(error.code), |
89 | |
90 | === modified file 'sessioninstaller/backends/dummy.py' |
91 | --- sessioninstaller/backends/dummy.py 2010-04-15 15:00:38 +0000 |
92 | +++ sessioninstaller/backends/dummy.py 2011-11-14 13:39:25 +0000 |
93 | @@ -23,14 +23,14 @@ |
94 | |
95 | from gettext import gettext as _ |
96 | |
97 | -import gtk |
98 | +from gi.repository import Gtk |
99 | |
100 | class DummyBackend(object): |
101 | |
102 | """Provide some dummy dialogs which simulate package operations.""" |
103 | |
104 | def _show_message(self, title, text): |
105 | - dia = gtk.MessageDialog(buttons=gtk.BUTTONS_CLOSE, message_format=title) |
106 | + dia = Gtk.MessageDialog(buttons=Gtk.ButtonsType.CLOSE, message_format=title) |
107 | dia.format_secondary_text(text) |
108 | dia.run() |
109 | dia.hide() |
110 | |
111 | === modified file 'sessioninstaller/backends/synaptic.py' |
112 | --- sessioninstaller/backends/synaptic.py 2011-01-14 21:30:29 +0000 |
113 | +++ sessioninstaller/backends/synaptic.py 2011-11-14 13:39:25 +0000 |
114 | @@ -26,7 +26,7 @@ |
115 | import tempfile |
116 | from gettext import gettext as _ |
117 | |
118 | -import gobject |
119 | +from gi.repository import GObject |
120 | |
121 | from defer import Deferred |
122 | |
123 | @@ -50,9 +50,9 @@ |
124 | "--", "/usr/sbin/synaptic", "--hide-main-window", |
125 | "--non-interactive"] |
126 | cmd.extend(opt) |
127 | - flags = gobject.SPAWN_DO_NOT_REAP_CHILD |
128 | - (pid, stdin, stdout, stderr) = gobject.spawn_async(cmd, flags=flags) |
129 | - gobject.child_watch_add(pid, self._on_synaptic_exit, (tempf, deferred)) |
130 | + flags = GObject.SPAWN_DO_NOT_REAP_CHILD |
131 | + (pid, stdin, stdout, stderr) = GObject.spawn_async(cmd, flags=flags) |
132 | + GObject.child_watch_add(pid, self._on_synaptic_exit, (tempf, deferred)) |
133 | return deferred |
134 | |
135 | def _on_synaptic_exit(self, pid, condition, (tempf, deferred)): |
136 | |
137 | === modified file 'sessioninstaller/core.py' |
138 | --- sessioninstaller/core.py 2011-05-30 17:45:29 +0000 |
139 | +++ sessioninstaller/core.py 2011-11-14 13:39:25 +0000 |
140 | @@ -41,11 +41,11 @@ |
141 | import dbus.mainloop.glib |
142 | from gettext import gettext as _ |
143 | import gettext |
144 | -import gio |
145 | -import gobject |
146 | +from gi.repository import Gio |
147 | +from gi.repository import GObject |
148 | +from gi.repository import Gtk |
149 | +from gi.repository import Pango |
150 | import gst |
151 | -import gtk |
152 | -import pango |
153 | from xdg.DesktopEntry import DesktopEntry |
154 | |
155 | import utils |
156 | @@ -165,128 +165,126 @@ |
157 | self.progress_dialog = progress |
158 | |
159 | def update(self, percent): |
160 | - while gtk.events_pending(): |
161 | - gtk.main_iteration() |
162 | + while Gtk.events_pending(): |
163 | + Gtk.main_iteration() |
164 | if self.progress_dialog: |
165 | self.progress_dialog.progress.pulse() |
166 | |
167 | |
168 | -class ErrorDialog(gtk.MessageDialog): |
169 | +class ErrorDialog(Gtk.MessageDialog): |
170 | |
171 | """Allows to show an error message to the user.""" |
172 | |
173 | def __init__(self, title, message, parent=None): |
174 | - gtk.MessageDialog.__init__(self, type=gtk.MESSAGE_ERROR, |
175 | - buttons=gtk.BUTTONS_CLOSE) |
176 | + GObject.GObject.__init__(self, message_type=Gtk.MessageType.ERROR, |
177 | + buttons=Gtk.ButtonsType.CLOSE) |
178 | if parent: |
179 | self.realize() |
180 | - self.window.set_transient_for(parent) |
181 | + self.set_transient_for(parent) |
182 | self.set_markup("<b><big>%s</big></b>\n\n%s" % (title, message)) |
183 | |
184 | |
185 | -class ProgressDialog(gtk.Dialog): |
186 | +class ProgressDialog(Gtk.Dialog): |
187 | |
188 | """Allows to show the progress of an ongoing action to the user.""" |
189 | |
190 | def __init__(self, title, message, parent=None): |
191 | - gtk.Dialog.__init__(self, buttons=(gtk.STOCK_CANCEL, |
192 | - gtk.RESPONSE_CANCEL)) |
193 | + Gtk.Dialog.__init__(self) |
194 | + self.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL) |
195 | if parent: |
196 | self.realize() |
197 | - self.window.set_transient_for(parent) |
198 | + self.set_transient_for(parent) |
199 | self.set_title(title) |
200 | self.set_resizable(False) |
201 | self.set_border_width(12) |
202 | self.vbox.set_spacing(24) |
203 | - self.label = gtk.Label() |
204 | + self.label = Gtk.Label() |
205 | self.label.set_markup("<b><big>%s</big></b>\n\n%s" % (title, message)) |
206 | self.label.set_line_wrap(True) |
207 | self.vbox.add(self.label) |
208 | - self.progress = gtk.ProgressBar() |
209 | + self.progress = Gtk.ProgressBar() |
210 | self.progress.set_pulse_step(0.01) |
211 | self.vbox.add(self.progress) |
212 | - self.set_has_separator(False) |
213 | self.cancelled = False |
214 | self.connect("response", self._on_response) |
215 | |
216 | def _on_response(self, dialog, response): |
217 | - if response == gtk.RESPONSE_CANCEL: |
218 | + if response == Gtk.ResponseType.CANCEL: |
219 | self.cancelled = True |
220 | |
221 | |
222 | -class ConfirmInstallDialog(gtk.Dialog): |
223 | +class ConfirmInstallDialog(Gtk.Dialog): |
224 | |
225 | """Allow to confirm an installation.""" |
226 | |
227 | def __init__(self, title, message, pkgs=[], parent=None, details=None, |
228 | package_type=None, selectable=False, action=None): |
229 | - gtk.Dialog.__init__(self, buttons=(gtk.STOCK_CANCEL, |
230 | - gtk.RESPONSE_CANCEL)) |
231 | + Gtk.Dialog.__init__(self) |
232 | + self.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL) |
233 | if parent: |
234 | self.realize() |
235 | - self.window.set_transient_for(parent) |
236 | + self.set_transient_for(parent) |
237 | self.set_title(title) |
238 | self.set_resizable(True) |
239 | self.set_border_width(12) |
240 | self.vbox.set_spacing(12) |
241 | - self.icon = gtk.image_new_from_stock(gtk.STOCK_DIALOG_QUESTION, |
242 | - gtk.ICON_SIZE_DIALOG) |
243 | + self.icon = Gtk.Image.new_from_stock(Gtk.STOCK_DIALOG_QUESTION, |
244 | + Gtk.IconSize.DIALOG) |
245 | self.icon.set_alignment(0 ,0) |
246 | - hbox_base = gtk.HBox() |
247 | + hbox_base = Gtk.HBox() |
248 | hbox_base.set_spacing(24) |
249 | - vbox_left = gtk.VBox() |
250 | + vbox_left = Gtk.VBox() |
251 | vbox_left.set_spacing(12) |
252 | - hbox_base.pack_start(self.icon, False, True) |
253 | - hbox_base.pack_start(vbox_left, True, True) |
254 | - self.label = gtk.Label() |
255 | + hbox_base.pack_start(self.icon, False, True, 0) |
256 | + hbox_base.pack_start(vbox_left, True, True, 0) |
257 | + self.label = Gtk.Label() |
258 | self.label.set_alignment(0, 0) |
259 | self.label.set_markup("<b><big>%s</big></b>\n\n%s" % (title, message)) |
260 | self.label.set_line_wrap(True) |
261 | - vbox_left.pack_start(self.label, False, True) |
262 | - self.set_has_separator(False) |
263 | + vbox_left.pack_start(self.label, False, True, 0) |
264 | self.cancelled = False |
265 | - self.vbox.pack_start(hbox_base, True, True) |
266 | + self.vbox.pack_start(hbox_base, True, True, 0) |
267 | if not action: |
268 | action = _("_Install") |
269 | - self.install_button = self.add_button(action, gtk.RESPONSE_OK) |
270 | - self.set_default_response(gtk.RESPONSE_OK) |
271 | + self.install_button = self.add_button(action, Gtk.ResponseType.OK) |
272 | + self.set_default_response(Gtk.ResponseType.OK) |
273 | # Show a list of the plugin packages |
274 | - self.pkg_store = gtk.ListStore(gobject.TYPE_STRING, |
275 | - gobject.TYPE_STRING, |
276 | - gobject.TYPE_BOOLEAN, |
277 | - gobject.TYPE_STRING, |
278 | - gobject.TYPE_STRING, |
279 | - gobject.TYPE_INT) |
280 | - self.pkg_store.set_sort_column_id(COLUMN_SCORE, gtk.SORT_DESCENDING) |
281 | - self.pkg_view = gtk.TreeView(self.pkg_store) |
282 | + self.pkg_store = Gtk.ListStore(GObject.TYPE_STRING, |
283 | + GObject.TYPE_STRING, |
284 | + GObject.TYPE_BOOLEAN, |
285 | + GObject.TYPE_STRING, |
286 | + GObject.TYPE_STRING, |
287 | + GObject.TYPE_INT) |
288 | + self.pkg_store.set_sort_column_id(COLUMN_SCORE, Gtk.SortType.DESCENDING) |
289 | + self.pkg_view = Gtk.TreeView(self.pkg_store) |
290 | self.pkg_view.set_rules_hint(True) |
291 | self.pkg_view.props.has_tooltip = True |
292 | self.pkg_view.connect("query-tooltip", self._on_query_tooltip) |
293 | if selectable: |
294 | - toggle_install = gtk.CellRendererToggle() |
295 | + toggle_install = Gtk.CellRendererToggle() |
296 | toggle_install.connect("toggled", self._on_toggled_install) |
297 | - column_install = gtk.TreeViewColumn(_("Install"), toggle_install, |
298 | + column_install = Gtk.TreeViewColumn(_("Install"), toggle_install, |
299 | active=COLUMN_INSTALL) |
300 | self.pkg_view.append_column(column_install) |
301 | if not package_type: |
302 | package_type = _("Package") |
303 | - column_desc = gtk.TreeViewColumn(package_type) |
304 | - renderer_warn = gtk.CellRendererPixbuf() |
305 | - renderer_warn.props.stock_size = gtk.ICON_SIZE_MENU |
306 | - column_desc.pack_start(renderer_warn, expand=False) |
307 | + column_desc = Gtk.TreeViewColumn(package_type) |
308 | + renderer_warn = Gtk.CellRendererPixbuf() |
309 | + renderer_warn.props.stock_size = Gtk.IconSize.MENU |
310 | + column_desc.pack_start(renderer_warn, False) |
311 | column_desc.set_cell_data_func(renderer_warn, self._render_warning) |
312 | - renderer_desc = gtk.CellRendererText() |
313 | - renderer_desc.props.ellipsize = pango.ELLIPSIZE_END |
314 | - column_desc.pack_start(renderer_desc, expand=True) |
315 | + renderer_desc = Gtk.CellRendererText() |
316 | + renderer_desc.props.ellipsize = Pango.EllipsizeMode.END |
317 | + column_desc.pack_start(renderer_desc, True) |
318 | column_desc.add_attribute(renderer_desc, "markup", COLUMN_DESC) |
319 | column_desc.props.expand = True |
320 | column_desc.props.resizable = True |
321 | column_desc.props.min_width = 50 |
322 | self.pkg_view.append_column(column_desc) |
323 | if details: |
324 | - renderer_details = gtk.CellRendererText() |
325 | - renderer_details.props.ellipsize = pango.ELLIPSIZE_END |
326 | - column_details = gtk.TreeViewColumn(details, |
327 | + renderer_details = Gtk.CellRendererText() |
328 | + renderer_details.props.ellipsize = Pango.EllipsizeMode.END |
329 | + column_details = Gtk.TreeViewColumn(details, |
330 | renderer_details) |
331 | column_details.add_attribute(renderer_details, "markup", |
332 | COLUMN_DETAILS) |
333 | @@ -295,11 +293,11 @@ |
334 | self.pkg_view.append_column(column_details) |
335 | if not (selectable or details): |
336 | self.pkg_view.props.headers_visible = False |
337 | - self.scrolled_window = gtk.ScrolledWindow() |
338 | - self.scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_NEVER) |
339 | - self.scrolled_window.set_shadow_type(gtk.SHADOW_IN) |
340 | + self.scrolled_window = Gtk.ScrolledWindow() |
341 | + self.scrolled_window.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.NEVER) |
342 | + self.scrolled_window.set_shadow_type(Gtk.ShadowType.IN) |
343 | self.scrolled_window.add(self.pkg_view) |
344 | - vbox_left.pack_start(self.scrolled_window, True, True) |
345 | + vbox_left.pack_start(self.scrolled_window, True, True, 0) |
346 | self.install_button.props.sensitive = False |
347 | for pkg in pkgs: |
348 | self.add_confirm_package(pkg) |
349 | @@ -330,7 +328,7 @@ |
350 | # Set the dialog default to cancel if a restricted packages is |
351 | # selected for installation |
352 | if active: |
353 | - self.set_default_response(gtk.RESPONSE_CANCEL) |
354 | + self.set_default_response(Gtk.ResponseType.CANCEL) |
355 | else: |
356 | tooltip = "" |
357 | desc = utils.get_package_desc(name, summary) |
358 | @@ -362,14 +360,17 @@ |
359 | def _on_query_tooltip(self, treeview, x, y, keyboard_tip, tooltip): |
360 | """Handle tooltips for restrcited packages.""" |
361 | try: |
362 | - model, path, iter = treeview.get_tooltip_context(x, y, keyboard_tip) |
363 | + result, out_x, out_y, model, path, iter = treeview.get_tooltip_context(x, y, keyboard_tip) |
364 | + if not result: |
365 | + return False |
366 | except TypeError: |
367 | return False |
368 | + |
369 | text = model[path][COLUMN_TOOLTIP] |
370 | if not text: |
371 | return False |
372 | - tooltip.set_icon_from_icon_name(gtk.STOCK_DIALOG_WARNING, |
373 | - gtk.ICON_SIZE_DIALOG) |
374 | + tooltip.set_icon_from_icon_name(Gtk.STOCK_DIALOG_WARNING, |
375 | + Gtk.IconSize.DIALOG) |
376 | tooltip.set_markup(text) |
377 | treeview.set_tooltip_row(tooltip, path) |
378 | return True |
379 | @@ -384,19 +385,19 @@ |
380 | return |
381 | self.install_button.props.sensitive = False |
382 | |
383 | - def _render_warning(self, cell, renderer, model, iter): |
384 | + def _render_warning(self, cell, renderer, model, iter, data): |
385 | """Show a warning icon for restricted packages.""" |
386 | if model.get_value(iter, COLUMN_TOOLTIP): |
387 | - renderer.props.stock_id = gtk.STOCK_DIALOG_WARNING |
388 | + renderer.props.stock_id = Gtk.STOCK_DIALOG_WARNING |
389 | |
390 | def run(self): |
391 | """Run the dialog.""" |
392 | if len(self.pkg_store) > 4: |
393 | - self.scrolled_window.set_policy(gtk.POLICY_NEVER, |
394 | - gtk.POLICY_AUTOMATIC) |
395 | + self.scrolled_window.set_policy(Gtk.PolicyType.NEVER, |
396 | + Gtk.PolicyType.AUTOMATIC) |
397 | self.pkg_view.set_size_request(-1, 240) |
398 | self.show_all() |
399 | - res = gtk.Dialog.run(self) |
400 | + res = Gtk.Dialog.run(self) |
401 | self.hide() |
402 | self.destroy() |
403 | return res |
404 | @@ -408,7 +409,7 @@ |
405 | |
406 | def __init__(self, bus=None): |
407 | log.info("Starting service") |
408 | - self.loop = gobject.MainLoop() |
409 | + self.loop = GObject.MainLoop() |
410 | if not bus: |
411 | bus = dbus.SessionBus() |
412 | self.bus = bus |
413 | @@ -416,7 +417,7 @@ |
414 | dbus.service.Object.__init__(self, bus_name, PACKAGEKIT_DBUS_PATH) |
415 | self._cache = None |
416 | self.backend = Backend() |
417 | - gobject.timeout_add_seconds(DAEMON_IDLE_CHECK_INTERVAL, |
418 | + GObject.timeout_add_seconds(DAEMON_IDLE_CHECK_INTERVAL, |
419 | self._check_for_inactivity) |
420 | self._tracks = 0 |
421 | self._last_timestamp = time.time() |
422 | @@ -426,7 +427,7 @@ |
423 | idle_time = time.time() - self._last_timestamp |
424 | log.debug("Checking for inactivity (%is)", idle_time) |
425 | if not self._tracks and \ |
426 | - not gobject.main_context_default().pending() and \ |
427 | + not GObject.main_context_default().pending() and \ |
428 | idle_time > DAEMON_IDLE_TIMEOUT: |
429 | self.loop.quit() |
430 | log.info("Shutting down because of inactivity") |
431 | @@ -466,7 +467,7 @@ |
432 | "/usr/bin/gst-install"]: |
433 | return_value(None) |
434 | # Return the application name in the case of an installed application |
435 | - for app in gio.app_info_get_all(): |
436 | + for app in Gio.app_info_get_all(): |
437 | if app.get_executable() == exe: |
438 | return_value(app.get_name()) |
439 | return_value(os.path.basename(exe)) |
440 | @@ -612,7 +613,7 @@ |
441 | @track_usage |
442 | @inline_callbacks |
443 | def _install_package_files(self, xid, files, interaction, sender): |
444 | - parent = gtk.gdk.window_foreign_new(xid) |
445 | + parent = None # should get from XID, but removed from Gdk 3 |
446 | header = "" |
447 | if len(files) != 1: |
448 | header = _("Failed to install multiple package files") |
449 | @@ -657,7 +658,7 @@ |
450 | "repositories as far as possible.") |
451 | confirm = ConfirmInstallDialog(title, message, parent=parent) |
452 | confirm.add_confirm(files[0], desc) |
453 | - if confirm.run() == gtk.RESPONSE_CANCEL: |
454 | + if confirm.run() == Gtk.ResponseType.CANCEL: |
455 | raise errors.ModifyCancelled |
456 | yield self.backend.install_package_files(xid, |
457 | confirm.get_selected_pkgs(), |
458 | @@ -733,7 +734,7 @@ |
459 | @track_usage |
460 | @inline_callbacks |
461 | def _install_catalogs(self, xid, files, interaction, sender): |
462 | - parent = gtk.gdk.window_foreign_new(xid) |
463 | + parent = None # should get from XID, but removed from Gdk 3 |
464 | self._init_cache() |
465 | arch = os.popen("/usr/bin/dpkg --print-architecture").read().strip() |
466 | distro, code, release = os.popen("/usr/bin/lsb_release " |
467 | @@ -807,7 +808,7 @@ |
468 | "available: %s", len(missing)) % pkgs |
469 | self._show_error(header, msg) |
470 | raise errors.ModifyNoPackagesFound(msg) |
471 | - parent = gtk.gdk.window_foreign_new(xid) |
472 | + parent = None # should get from XID, but removed from Gdk 3 |
473 | # Create nice messages |
474 | sender_name = yield self._get_sender_name(sender) |
475 | title = gettext.ngettext("Install the following software package?", |
476 | @@ -832,7 +833,7 @@ |
477 | len(files)) % " ".join("'%s'") |
478 | confirm = ConfirmInstallDialog(title, message, pkgs, parent) |
479 | res = confirm.run() |
480 | - if res == gtk.RESPONSE_OK: |
481 | + if res == Gtk.ResponseType.OK: |
482 | yield self.backend.install_packages(xid, |
483 | confirm.get_selected_pkgs(), |
484 | interaction) |
485 | @@ -859,7 +860,7 @@ |
486 | @track_usage |
487 | @inline_callbacks |
488 | def _install_package_names(self, xid, packages, interaction, sender): |
489 | - parent = gtk.gdk.window_foreign_new(xid) |
490 | + parent = None # should get from XID, but removed from Gdk 3 |
491 | title = gettext.ngettext("Install additional software package?", |
492 | "Install additional software packages?", |
493 | len(packages)) |
494 | @@ -884,7 +885,7 @@ |
495 | #FIXME: We should use the cache to provide additional information |
496 | for pkg in packages: |
497 | confirm.add_confirm(pkg, "") |
498 | - if confirm.run() == gtk.RESPONSE_CANCEL: |
499 | + if confirm.run() == Gtk.ResponseType.CANCEL: |
500 | raise errors.ModifyCancelled |
501 | yield self.backend.install_packages(xid, packages, interaction) |
502 | |
503 | @@ -908,7 +909,7 @@ |
504 | @track_usage |
505 | @inline_callbacks |
506 | def _install_mime_types(self, xid, mime_types_list, interaction, sender): |
507 | - parent = gtk.gdk.window_foreign_new(xid) |
508 | + parent = None # should get from XID, but removed from Gdk 3 |
509 | if not os.path.exists(utils.APP_INSTALL_DATA): |
510 | #FIXME: should provide some information about how to find apps |
511 | header = _("Installing mime type handlers isn't supported") |
512 | @@ -922,7 +923,7 @@ |
513 | sender_name = yield self._get_sender_name(sender) |
514 | title = _("Searching for suitable software to open files") |
515 | mime_types = set(mime_types_list) |
516 | - mime_names = [gio.content_type_get_description(mt) for mt in mime_types] |
517 | + mime_names = [Gio.content_type_get_description(mt) for mt in mime_types] |
518 | if sender_name: |
519 | #TRANSLATORS: %s is an application |
520 | message = gettext.ngettext("%s requires to install software to " |
521 | @@ -939,13 +940,13 @@ |
522 | "following file types is required " |
523 | "but is not installed:", |
524 | len(mime_types)) |
525 | - mime_types_desc = [gio.content_type_get_description(mime_type) \ |
526 | + mime_types_desc = [Gio.content_type_get_description(mime_type) \ |
527 | for mime_type in mime_types] |
528 | message += self._get_bullet_list(mime_types_desc) |
529 | progress = ProgressDialog(title, message, parent) |
530 | progress.show_all() |
531 | - while gtk.events_pending(): |
532 | - gtk.main_iteration() |
533 | + while Gtk.events_pending(): |
534 | + Gtk.main_iteration() |
535 | # Search the app-install-data desktop files for mime type handlers |
536 | pkgs = [] |
537 | partial_providers = False |
538 | @@ -957,8 +958,8 @@ |
539 | if path[0] == "." or not path.endswith(".desktop"): |
540 | continue |
541 | if not count % 20: |
542 | - while gtk.events_pending(): |
543 | - gtk.main_iteration() |
544 | + while Gtk.events_pending(): |
545 | + Gtk.main_iteration() |
546 | progress.progress.pulse() |
547 | if progress.cancelled: |
548 | progress.hide() |
549 | @@ -979,7 +980,7 @@ |
550 | package_map.setdefault(pkg_name, [[], set(), 0]) |
551 | #FIXME: Don't add desktop entries twice |
552 | package_map[pkg_name][0].append(desktop_entry) |
553 | - desc = gio.content_type_get_description(mime_type) |
554 | + desc = Gio.content_type_get_description(mime_type) |
555 | package_map[pkg_name][1].add(desc) |
556 | popcon = desktop_entry.get("X-AppInstall-Popcon", |
557 | type="integer") |
558 | @@ -997,7 +998,7 @@ |
559 | details = None |
560 | title = _("Install software to open files?") |
561 | if unsatisfied: |
562 | - unsatisfied_desc = [gio.content_type_get_description(mime_type) \ |
563 | + unsatisfied_desc = [Gio.content_type_get_description(mime_type) \ |
564 | for mime_type in unsatisfied] |
565 | unsatisfied_str = self._get_bullet_list(unsatisfied_desc) |
566 | message += "\n\n" |
567 | @@ -1019,7 +1020,7 @@ |
568 | confirm.add_confirm_package(self._cache[pkg], len(package_map) == 1, |
569 | details, score) |
570 | res = confirm.run() |
571 | - if res == gtk.RESPONSE_OK: |
572 | + if res == Gtk.ResponseType.OK: |
573 | yield self.backend.install_packages(xid, |
574 | confirm.get_selected_pkgs(), |
575 | interaction) |
576 | @@ -1137,7 +1138,7 @@ |
577 | structures = [parse_gstreamer_structure(res) for res in resources] |
578 | kinds = set([struct.kind for struct in structures]) |
579 | # Show a progress dialog |
580 | - parent = gtk.gdk.window_foreign_new(xid) |
581 | + parent = None # should get from XID, but removed from Gdk 3 |
582 | sender_name = yield self._get_sender_name(sender) |
583 | title = _("Searching for multimedia plugins") |
584 | # Get a nice dialog message |
585 | @@ -1217,16 +1218,16 @@ |
586 | for struct in structures]) |
587 | progress = ProgressDialog(title, message, parent) |
588 | progress.show_all() |
589 | - while gtk.events_pending(): |
590 | - gtk.main_iteration() |
591 | + while Gtk.events_pending(): |
592 | + Gtk.main_iteration() |
593 | # Search the package cache for packages providing the plugins |
594 | pkgs = [] |
595 | partial_providers = False |
596 | self._init_cache(progress) |
597 | for count, pkg in enumerate(self._cache): |
598 | if not count % 100: |
599 | - while gtk.events_pending(): |
600 | - gtk.main_iteration() |
601 | + while Gtk.events_pending(): |
602 | + Gtk.main_iteration() |
603 | progress.progress.pulse() |
604 | if progress.cancelled: |
605 | progress.hide() |
606 | @@ -1317,7 +1318,7 @@ |
607 | install = pkg.name in best_providers |
608 | confirm.add_confirm_package(pkg, install, details, score) |
609 | res = confirm.run() |
610 | - if res == gtk.RESPONSE_OK: |
611 | + if res == Gtk.ResponseType.OK: |
612 | yield self.backend.install_packages(xid, |
613 | confirm.get_selected_pkgs(), |
614 | interaction) |
615 | @@ -1344,7 +1345,7 @@ |
616 | @track_usage |
617 | @inline_callbacks |
618 | def _remove_package_by_files(self, xid, files, interaction, sender): |
619 | - parent = gtk.gdk.window_foreign_new(xid) |
620 | + parent = None # should get from XID, but removed from Gdk 3 |
621 | sender_name = yield self._get_sender_name(sender) |
622 | if [filename for filename in files if not filename.startswith("/")]: |
623 | raise errors.ModifyFailed("Only absolute file names") |
624 | @@ -1400,7 +1401,7 @@ |
625 | selectable=len(pkgs) > 1, pkgs=pkgs, |
626 | action=_("_Remove")) |
627 | res = confirm.run() |
628 | - if res == gtk.RESPONSE_OK: |
629 | + if res == Gtk.ResponseType.OK: |
630 | yield self.backend.remove_packages(xid, |
631 | confirm.get_selected_pkgs(), |
632 | interaction) |
I backported the GTK fix into our ubuntu GTK3 packaging branch, FYI.