1
0
mirror of https://git.yoctoproject.org/poky synced 2026-05-31 12:49:46 +00:00

bitbake: depexp.py: port to gtk+3

The code is still a bit icky (and should be refactored to not use
Gdk.threads_enter/leave) but it should work about as reliably as
it did with Gtk+2.

Based on earlier patches by Maxin and Joshua.

(Bitbake rev: 8eee64a64144e27b5b8c2aca88e138882c3deab7)

Signed-off-by: Jussi Kukkonen <jussi.kukkonen@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Jussi Kukkonen
2016-06-20 15:20:03 +03:00
committed by Richard Purdie
parent 8d56c54107
commit 90d7b09af2
+80 -79
View File
@@ -18,14 +18,15 @@
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
import sys import sys
import gobject import gi
import gtk gi.require_version('Gtk', '3.0')
import Queue from gi.repository import Gtk, Gdk, GObject
from multiprocessing import Queue
import threading import threading
import xmlrpclib from xmlrpc import client
import time
import bb import bb
import bb.event import bb.event
from bb.ui.crumbs.progressbar import HobProgressBar
# Package Model # Package Model
(COL_PKG_NAME) = (0) (COL_PKG_NAME) = (0)
@@ -35,19 +36,19 @@ from bb.ui.crumbs.progressbar import HobProgressBar
(COL_DEP_TYPE, COL_DEP_PARENT, COL_DEP_PACKAGE) = (0, 1, 2) (COL_DEP_TYPE, COL_DEP_PARENT, COL_DEP_PACKAGE) = (0, 1, 2)
class PackageDepView(gtk.TreeView): class PackageDepView(Gtk.TreeView):
def __init__(self, model, dep_type, label): def __init__(self, model, dep_type, label):
gtk.TreeView.__init__(self) Gtk.TreeView.__init__(self)
self.current = None self.current = None
self.dep_type = dep_type self.dep_type = dep_type
self.filter_model = model.filter_new() self.filter_model = model.filter_new()
self.filter_model.set_visible_func(self._filter) self.filter_model.set_visible_func(self._filter, data=None)
self.set_model(self.filter_model) self.set_model(self.filter_model)
#self.connect("row-activated", self.on_package_activated, COL_DEP_PACKAGE) self.append_column(Gtk.TreeViewColumn(label, Gtk.CellRendererText(), text=COL_DEP_PACKAGE))
self.append_column(gtk.TreeViewColumn(label, gtk.CellRendererText(), text=COL_DEP_PACKAGE))
def _filter(self, model, iter): def _filter(self, model, iter, data):
(this_type, package) = model.get(iter, COL_DEP_TYPE, COL_DEP_PARENT) this_type = model[iter][COL_DEP_TYPE]
package = model[iter][COL_DEP_PARENT]
if this_type != self.dep_type: return False if this_type != self.dep_type: return False
return package == self.current return package == self.current
@@ -56,17 +57,17 @@ class PackageDepView(gtk.TreeView):
self.filter_model.refilter() self.filter_model.refilter()
class PackageReverseDepView(gtk.TreeView): class PackageReverseDepView(Gtk.TreeView):
def __init__(self, model, label): def __init__(self, model, label):
gtk.TreeView.__init__(self) Gtk.TreeView.__init__(self)
self.current = None self.current = None
self.filter_model = model.filter_new() self.filter_model = model.filter_new()
self.filter_model.set_visible_func(self._filter) self.filter_model.set_visible_func(self._filter)
self.set_model(self.filter_model) self.set_model(self.filter_model)
self.append_column(gtk.TreeViewColumn(label, gtk.CellRendererText(), text=COL_DEP_PARENT)) self.append_column(Gtk.TreeViewColumn(label, Gtk.CellRendererText(), text=COL_DEP_PARENT))
def _filter(self, model, iter): def _filter(self, model, iter, data):
package = model.get_value(iter, COL_DEP_PACKAGE) package = model[iter][COL_DEP_PACKAGE]
return package == self.current return package == self.current
def set_current_package(self, package): def set_current_package(self, package):
@@ -74,50 +75,50 @@ class PackageReverseDepView(gtk.TreeView):
self.filter_model.refilter() self.filter_model.refilter()
class DepExplorer(gtk.Window): class DepExplorer(Gtk.Window):
def __init__(self): def __init__(self):
gtk.Window.__init__(self) Gtk.Window.__init__(self)
self.set_title("Dependency Explorer") self.set_title("Dependency Explorer")
self.set_default_size(500, 500) self.set_default_size(500, 500)
self.connect("delete-event", gtk.main_quit) self.connect("delete-event", Gtk.main_quit)
# Create the data models # Create the data models
self.pkg_model = gtk.ListStore(gobject.TYPE_STRING) self.pkg_model = Gtk.ListStore(GObject.TYPE_STRING)
self.pkg_model.set_sort_column_id(COL_PKG_NAME, gtk.SORT_ASCENDING) self.pkg_model.set_sort_column_id(COL_PKG_NAME, Gtk.SortType.ASCENDING)
self.depends_model = gtk.ListStore(gobject.TYPE_INT, gobject.TYPE_STRING, gobject.TYPE_STRING) self.depends_model = Gtk.ListStore(GObject.TYPE_INT, GObject.TYPE_STRING, GObject.TYPE_STRING)
self.depends_model.set_sort_column_id(COL_DEP_PACKAGE, gtk.SORT_ASCENDING) self.depends_model.set_sort_column_id(COL_DEP_PACKAGE, Gtk.SortType.ASCENDING)
pane = gtk.HPaned() pane = Gtk.HPaned()
pane.set_position(250) pane.set_position(250)
self.add(pane) self.add(pane)
# The master list of packages # The master list of packages
scrolled = gtk.ScrolledWindow() scrolled = Gtk.ScrolledWindow()
scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
scrolled.set_shadow_type(gtk.SHADOW_IN) scrolled.set_shadow_type(Gtk.ShadowType.IN)
self.pkg_treeview = gtk.TreeView(self.pkg_model) self.pkg_treeview = Gtk.TreeView(self.pkg_model)
self.pkg_treeview.get_selection().connect("changed", self.on_cursor_changed) self.pkg_treeview.get_selection().connect("changed", self.on_cursor_changed)
column = gtk.TreeViewColumn("Package", gtk.CellRendererText(), text=COL_PKG_NAME) column = Gtk.TreeViewColumn("Package", Gtk.CellRendererText(), text=COL_PKG_NAME)
self.pkg_treeview.append_column(column) self.pkg_treeview.append_column(column)
pane.add1(scrolled) pane.add1(scrolled)
scrolled.add(self.pkg_treeview) scrolled.add(self.pkg_treeview)
box = gtk.VBox(homogeneous=True, spacing=4) box = Gtk.VBox(homogeneous=True, spacing=4)
# Runtime Depends # Runtime Depends
scrolled = gtk.ScrolledWindow() scrolled = Gtk.ScrolledWindow()
scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
scrolled.set_shadow_type(gtk.SHADOW_IN) scrolled.set_shadow_type(Gtk.ShadowType.IN)
self.rdep_treeview = PackageDepView(self.depends_model, TYPE_RDEP, "Runtime Depends") self.rdep_treeview = PackageDepView(self.depends_model, TYPE_RDEP, "Runtime Depends")
self.rdep_treeview.connect("row-activated", self.on_package_activated, COL_DEP_PACKAGE) self.rdep_treeview.connect("row-activated", self.on_package_activated, COL_DEP_PACKAGE)
scrolled.add(self.rdep_treeview) scrolled.add(self.rdep_treeview)
box.add(scrolled) box.add(scrolled)
# Build Depends # Build Depends
scrolled = gtk.ScrolledWindow() scrolled = Gtk.ScrolledWindow()
scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
scrolled.set_shadow_type(gtk.SHADOW_IN) scrolled.set_shadow_type(Gtk.ShadowType.IN)
self.dep_treeview = PackageDepView(self.depends_model, TYPE_DEP, "Build Depends") self.dep_treeview = PackageDepView(self.depends_model, TYPE_DEP, "Build Depends")
self.dep_treeview.connect("row-activated", self.on_package_activated, COL_DEP_PACKAGE) self.dep_treeview.connect("row-activated", self.on_package_activated, COL_DEP_PACKAGE)
scrolled.add(self.dep_treeview) scrolled.add(self.dep_treeview)
@@ -125,9 +126,9 @@ class DepExplorer(gtk.Window):
pane.add2(box) pane.add2(box)
# Reverse Depends # Reverse Depends
scrolled = gtk.ScrolledWindow() scrolled = Gtk.ScrolledWindow()
scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
scrolled.set_shadow_type(gtk.SHADOW_IN) scrolled.set_shadow_type(Gtk.ShadowType.IN)
self.revdep_treeview = PackageReverseDepView(self.depends_model, "Reverse Depends") self.revdep_treeview = PackageReverseDepView(self.depends_model, "Reverse Depends")
self.revdep_treeview.connect("row-activated", self.on_package_activated, COL_DEP_PARENT) self.revdep_treeview.connect("row-activated", self.on_package_activated, COL_DEP_PARENT)
scrolled.add(self.revdep_treeview) scrolled.add(self.revdep_treeview)
@@ -183,15 +184,23 @@ class gtkthread(threading.Thread):
threading.Thread.__init__(self) threading.Thread.__init__(self)
self.setDaemon(True) self.setDaemon(True)
self.shutdown = shutdown self.shutdown = shutdown
if not Gtk.init_check()[0]:
sys.stderr.write("Gtk+ init failed. Make sure DISPLAY variable is set.\n")
gtkthread.quit.set()
def run(self): def run(self):
gobject.threads_init() GObject.threads_init()
gtk.gdk.threads_init() Gdk.threads_init()
gtk.main() Gtk.main()
gtkthread.quit.set() gtkthread.quit.set()
def main(server, eventHandler, params): def main(server, eventHandler, params):
shutdown = 0
gtkgui = gtkthread(shutdown)
gtkgui.start()
try: try:
params.updateFromServer(server) params.updateFromServer(server)
cmdline = params.parseActions() cmdline = params.parseActions()
@@ -212,31 +221,24 @@ def main(server, eventHandler, params):
elif ret != True: elif ret != True:
print("Error running command '%s': returned %s" % (cmdline, ret)) print("Error running command '%s': returned %s" % (cmdline, ret))
return 1 return 1
except xmlrpclib.Fault as x: except client.Fault as x:
print("XMLRPC Fault getting commandline:\n %s" % x) print("XMLRPC Fault getting commandline:\n %s" % x)
return return
try: if gtkthread.quit.isSet():
gtk.init_check()
except RuntimeError:
sys.stderr.write("Please set DISPLAY variable before running this command \n")
return return
shutdown = 0 Gdk.threads_enter()
gtkgui = gtkthread(shutdown)
gtkgui.start()
gtk.gdk.threads_enter()
dep = DepExplorer() dep = DepExplorer()
bardialog = gtk.Dialog(parent=dep, bardialog = Gtk.Dialog(parent=dep,
flags=gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT) flags=Gtk.DialogFlags.MODAL|Gtk.DialogFlags.DESTROY_WITH_PARENT)
bardialog.set_default_size(400, 50) bardialog.set_default_size(400, 50)
pbar = HobProgressBar() box = bardialog.get_content_area()
bardialog.vbox.pack_start(pbar) pbar = Gtk.ProgressBar()
box.pack_start(pbar, True, True, 0)
bardialog.show_all() bardialog.show_all()
bardialog.connect("delete-event", gtk.main_quit) bardialog.connect("delete-event", Gtk.main_quit)
gtk.gdk.threads_leave() Gdk.threads_leave()
progress_total = 0 progress_total = 0
while True: while True:
@@ -253,49 +255,48 @@ def main(server, eventHandler, params):
if isinstance(event, bb.event.CacheLoadStarted): if isinstance(event, bb.event.CacheLoadStarted):
progress_total = event.total progress_total = event.total
gtk.gdk.threads_enter() Gdk.threads_enter()
bardialog.set_title("Loading Cache") bardialog.set_title("Loading Cache")
pbar.update(0) pbar.set_fraction(0.0)
gtk.gdk.threads_leave() Gdk.threads_leave()
if isinstance(event, bb.event.CacheLoadProgress): if isinstance(event, bb.event.CacheLoadProgress):
x = event.current x = event.current
gtk.gdk.threads_enter() Gdk.threads_enter()
pbar.update(x * 1.0 / progress_total) pbar.set_fraction(x * 1.0 / progress_total)
pbar.set_title('') Gdk.threads_leave()
gtk.gdk.threads_leave()
continue continue
if isinstance(event, bb.event.CacheLoadCompleted): if isinstance(event, bb.event.CacheLoadCompleted):
bardialog.hide()
continue continue
if isinstance(event, bb.event.ParseStarted): if isinstance(event, bb.event.ParseStarted):
progress_total = event.total progress_total = event.total
if progress_total == 0: if progress_total == 0:
continue continue
gtk.gdk.threads_enter() Gdk.threads_enter()
pbar.update(0) pbar.set_fraction(0.0)
bardialog.set_title("Processing recipes") bardialog.set_title("Processing recipes")
Gdk.threads_leave()
gtk.gdk.threads_leave()
if isinstance(event, bb.event.ParseProgress): if isinstance(event, bb.event.ParseProgress):
x = event.current x = event.current
gtk.gdk.threads_enter() Gdk.threads_enter()
pbar.update(x * 1.0 / progress_total) pbar.set_fraction(x * 1.0 / progress_total)
pbar.set_title('') Gdk.threads_leave()
gtk.gdk.threads_leave()
continue continue
if isinstance(event, bb.event.ParseCompleted): if isinstance(event, bb.event.ParseCompleted):
bardialog.hide() Gdk.threads_enter()
bardialog.set_title("Generating dependency tree")
Gdk.threads_leave()
continue continue
if isinstance(event, bb.event.DepTreeGenerated): if isinstance(event, bb.event.DepTreeGenerated):
gtk.gdk.threads_enter() Gdk.threads_enter()
bardialog.hide()
dep.parse(event._depgraph) dep.parse(event._depgraph)
gtk.gdk.threads_leave() Gdk.threads_leave()
if isinstance(event, bb.command.CommandCompleted): if isinstance(event, bb.command.CommandCompleted):
continue continue