The unified diff between revisions [8d083408..] and [20675585..] is displayed below. It can also be downloaded as a raw diff.

#
#
# patch "dprobe.glade"
#  from [83de28fd5779882c66ece280b9a9ecf3e43ae18f]
#    to [a8e5058e714156a18577b7e00e14dd4926f6fa85]
#
# patch "dprobe.py"
#  from [6b75d21a92d5e37b6625bf7c3154cc5a6602660a]
#    to [9d2a100820cd8ed51ff6dade30999c6ff8f8b1f5]
#
============================================================
--- dprobe.glade	83de28fd5779882c66ece280b9a9ecf3e43ae18f
+++ dprobe.glade	a8e5058e714156a18577b7e00e14dd4926f6fa85
@@ -87,14 +87,14 @@
       </child>

       <child>
-	<widget class="GtkHBox" id="hbox1">
-	  <property name="border_width">6</property>
+	<widget class="GtkHBox" id="hbox2">
 	  <property name="visible">True</property>
 	  <property name="homogeneous">False</property>
-	  <property name="spacing">6</property>
+	  <property name="spacing">0</property>

 	  <child>
-	    <widget class="GtkScrolledWindow" id="scrolledwindow1">
+	    <widget class="GtkScrolledWindow" id="scrolledwindow3">
+	      <property name="border_width">6</property>
 	      <property name="visible">True</property>
 	      <property name="can_focus">True</property>
 	      <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
@@ -124,7 +124,8 @@
 	  </child>

 	  <child>
-	    <widget class="GtkVBox" id="vbox1">
+	    <widget class="GtkVBox" id="name_box">
+	      <property name="border_width">6</property>
 	      <property name="visible">True</property>
 	      <property name="homogeneous">False</property>
 	      <property name="spacing">6</property>
@@ -138,7 +139,7 @@
 		  <child>
 		    <widget class="GtkLabel" id="label1">
 		      <property name="visible">True</property>
-		      <property name="label" translatable="yes">Search:</property>
+		      <property name="label" translatable="yes">Object Path:</property>
 		      <property name="use_underline">False</property>
 		      <property name="use_markup">False</property>
 		      <property name="justify">GTK_JUSTIFY_LEFT</property>
@@ -161,7 +162,7 @@
 		  </child>

 		  <child>
-		    <widget class="GtkEntry" id="search_text">
+		    <widget class="GtkEntry" id="object_path">
 		      <property name="visible">True</property>
 		      <property name="can_focus">True</property>
 		      <property name="editable">True</property>
@@ -178,6 +179,22 @@
 		      <property name="fill">True</property>
 		    </packing>
 		  </child>
+
+		  <child>
+		    <widget class="GtkButton" id="introspect_button">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">Introspect</property>
+		      <property name="use_underline">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">3</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
 		</widget>
 		<packing>
 		  <property name="padding">0</property>
@@ -196,16 +213,48 @@
 		  <property name="window_placement">GTK_CORNER_TOP_LEFT</property>

 		  <child>
-		    <widget class="GtkTreeView" id="interface_tree">
+		    <widget class="GtkViewport" id="viewport1">
 		      <property name="visible">True</property>
-		      <property name="can_focus">True</property>
-		      <property name="headers_visible">True</property>
-		      <property name="rules_hint">False</property>
-		      <property name="reorderable">False</property>
-		      <property name="enable_search">True</property>
-		      <property name="fixed_height_mode">False</property>
-		      <property name="hover_selection">False</property>
-		      <property name="hover_expand">False</property>
+		      <property name="shadow_type">GTK_SHADOW_IN</property>
+
+		      <child>
+			<widget class="GtkNotebook" id="notebook1">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="show_tabs">True</property>
+			  <property name="show_border">True</property>
+			  <property name="tab_pos">GTK_POS_TOP</property>
+			  <property name="scrollable">False</property>
+			  <property name="enable_popup">False</property>
+
+			  <child>
+			    <placeholder/>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label2">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">label2</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0.5</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="type">tab</property>
+			    </packing>
+			  </child>
+			</widget>
+		      </child>
 		    </widget>
 		  </child>
 		</widget>
============================================================
--- dprobe.py	6b75d21a92d5e37b6625bf7c3154cc5a6602660a
+++ dprobe.py	9d2a100820cd8ed51ff6dade30999c6ff8f8b1f5
@@ -12,33 +12,31 @@ import gtk.glade
 import gtk
 import gtk.glade

-class DBusInfo:
-	def __init__(self):
-		self.bus = dbus.Bus.get_system()
-		self.dbus_object = self.bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus')
-	def get_bus_names(self):
-		iface = dbus.Interface(self.dbus_object, 'org.freedesktop.DBus')
-		return iface.ListNames()
-	def ping(self, named_service, object_path):
-		obj = self.bus.get_object(named_service, object_path)
-		iface = dbus.Interface(obj, 'org.freedesktop.DBus.Peer')
-		print iface.Ping()
-	def get_introspection_xml(self, named_service, object_path):
-		obj = self.bus.get_object(named_service, object_path)
-		iface = dbus.Interface(obj, 'org.freedesktop.DBus.Introspectable')
-		return iface.Introspect()
-
 class NameInfo:
 	def __init__(self, bus, store):
 		self.bus, self.store = bus, store
 		self.dbus_obj = bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus')
 		self.dbus_interface = dbus.Interface(self.dbus_obj, 'org.freedesktop.DBus')
-		self.refresh()
-	def refresh(self):
+		self.update()
+	def update(self):
 		self.store.clear()
+		rv = {}
 		for name in self.dbus_interface.ListNames():
-			self.store.append([name])
+			if name.startswith(':'):
+				rv.setdefault(name, [])
+			else:
+				connection_name = self.dbus_interface.GetNameOwner(name)
+				val = rv.setdefault(connection_name, [])
+				val.append(name)
+		for connection_name in rv:
+			parent = self.store.append(None, [connection_name])
+			for name in rv[connection_name]:
+				self.store.append(parent, [name])

+class InterfaceInfo:
+	def __init__(self, bus, name, store):
+		self.bus, self.name, self.store = bus, name, store
+
 class DProbe:
 	def __init__(self):
 		xml = open('dprobe.glade').read()
@@ -49,22 +47,12 @@ class DProbe:

 		# window and other stuff
 		self.window = self.glade.get_widget("main_window")
+		self.object_path = self.glade.get_widget("object_path")
+		self.object_path.connect("changed", self.object_path_changed)

-		# set up the tree of interfaces and methods
-		self.interface_tree = self.glade.get_widget("interface_tree")
-		self.interface_store = gtk.TreeStore(str)
-		self.interface_tree.set_model(self.interface_store)
-
-		# interface name column
-		name_column = gtk.TreeViewColumn("Interface")
-		self.interface_tree.append_column(name_column)
-		name_cell = gtk.CellRendererText()
-		name_column.pack_start(name_cell, True)
-		name_column.set_attributes(name_cell, text=0)
-
 		# set up the list of names on the bus
 		self.name_list = self.glade.get_widget("name_list")
-		self.name_list_store = gtk.ListStore(str)
+		self.name_list_store = gtk.TreeStore(str)
 		self.name_list.set_model(self.name_list_store)

 		# filename column
@@ -82,8 +70,11 @@ class DProbe:
 		self.name_info = NameInfo(self.bus, self.name_list_store)

 		# hook up signals
+		self.introspect_button = self.glade.get_widget("introspect_button")
+		self.introspect_button.connect("clicked", self.introspect_clicked)
 		sel = self.name_list.get_selection()
-		sel.connect("changed", self.name_list_select)
+		sel.connect("changed", self.name_list_selection_changed)
+		self.name_list_selection_changed(sel)

 		quit_menu = self.glade.get_widget("quit1")
 		quit_menu.connect("activate", self.window_destroy)
@@ -93,14 +84,30 @@ class DProbe:

 		# go...
 		self.window.show_all()
-	def name_list_select(self, sel):
+	def object_path_changed(self, widget):
+		print widget
+		print widget.get_property("sensitive")
+		if not widget.get_property("sensitive") or len(widget.get_text()) == 0:
+			self.introspect_button.set_sensitive(False)
+		else:
+			self.introspect_button.set_sensitive(True)
+	def name_list_selection_changed(self, sel):
 		(model, iter) = sel.get_selected()
+		# the selection has changed;
+		# this means clearing the notebook to the right (TODO)
 		if not iter:
 			# in which case, no interface to show
-			self.interface_tree.clear()
+			self.object_path.set_sensitive(False)
 		else:
+			self.object_path.set_sensitive(True)
 			name = self.name_list_store.get_value(iter, 0)
-			print name
+		self.object_path_changed(self.object_path)
+	def introspect_clicked(self, widget, data=None):
+		path = self.object_path.get_text()
+		print path
+		# ok, if we've already introspected this path then switch to that
+		# page in the notebook. Otherwise, create a new notebook page
+		# and introspect this sucker..
 	def window_destroy(self, widget, user=None):
 		gtk.main_quit()
 	def about(self, widget, user=None):
@@ -135,13 +142,4 @@ if __name__ == '__main__':
 	gnome.init('dprobe', '0.1')
 	dprobe = DProbe()
 	gtk.main()
-#	i = DBusInfo()
-#	for name in i.get_bus_names():
-#		if name.startswith(':'): continue
-#		print name
-#		print i.get_introspection_xml(name, '/org/freedesktop/DBus')

-
-
-
-