diff options
Diffstat (limited to 'tools/dbus-viewer.c')
-rw-r--r-- | tools/dbus-viewer.c | 302 |
1 files changed, 186 insertions, 116 deletions
diff --git a/tools/dbus-viewer.c b/tools/dbus-viewer.c index 41660135..c3903097 100644 --- a/tools/dbus-viewer.c +++ b/tools/dbus-viewer.c @@ -33,88 +33,6 @@ #include <dbus/dbus-glib.h> #include <glib/gi18n.h> -typedef struct -{ - GtkWidget *window; - GtkWidget *treeview; - GtkWidget *name_menu; - - GtkTreeModel *names_model; - -} TreeWindow; - -static void -window_closed_callback (GtkWidget *window, - TreeWindow *w) -{ - g_assert (window == w->window); - w->window = NULL; - gtk_main_quit (); -} - -static TreeWindow* -tree_window_new (DBusGConnection *connection, - GtkTreeModel *names_model) -{ - TreeWindow *w; - GtkWidget *sw; - GtkWidget *vbox; - GtkWidget *hbox; - GtkWidget *combo; - - /* Should use glade, blah */ - - w = g_new0 (TreeWindow, 1); - w->window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - - gtk_window_set_title (GTK_WINDOW (w->window), "D-BUS Viewer"); - gtk_window_set_default_size (GTK_WINDOW (w->window), 400, 500); - - g_signal_connect (w->window, "destroy", G_CALLBACK (window_closed_callback), - w); - gtk_container_set_border_width (GTK_CONTAINER (w->window), 6); - - vbox = gtk_vbox_new (FALSE, 6); - gtk_container_add (GTK_CONTAINER (w->window), vbox); - - /* Create names option menu */ - if (connection) - { - GtkCellRenderer *cell; - w->names_model = names_model; - - combo = gtk_combo_box_new_with_model (w->names_model); - - cell = gtk_cell_renderer_text_new (); - gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), cell, TRUE); - gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo), cell, - "text", 0, - NULL); - - gtk_box_pack_start (GTK_BOX (vbox), combo, FALSE, FALSE, 0); - } - - /* Create tree view */ - hbox = gtk_hbox_new (FALSE, 6); - gtk_container_add (GTK_CONTAINER (vbox), hbox); - - sw = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - - gtk_box_pack_start (GTK_BOX (hbox), sw, TRUE, TRUE, 0); - - w->treeview = dbus_tree_view_new (); - - gtk_container_add (GTK_CONTAINER (sw), w->treeview); - - /* Show everything */ - gtk_widget_show_all (w->window); - - return w; -} - static void show_error_dialog (GtkWindow *transient_parent, GtkWidget **weak_ptr, @@ -340,6 +258,162 @@ load_from_service (DBusGConnection *connection, return node; } +typedef struct +{ + DBusGConnection *connection; + + GtkWidget *window; + GtkWidget *treeview; + GtkWidget *name_menu; + + GtkTreeModel *names_model; + + GtkWidget *error_dialog; + +} TreeWindow; + +static void +tree_window_set_node (TreeWindow *w, + NodeInfo *node) +{ + char **path; + const char *name; + + name = node_info_get_name (node); + if (name == NULL || + name[0] != '/') + { + g_printerr (_("Assuming root node is at path /, since no absolute path is specified")); + name = "/"; + } + + path = _dbus_gutils_split_path (name); + + dbus_tree_view_update (GTK_TREE_VIEW (w->treeview), + (const char**) path, + node); + + g_strfreev (path); +} + +static void +tree_window_set_service (TreeWindow *w, + const char *service_name) +{ + GError *error; + NodeInfo *node; + + error = NULL; + node = load_from_service (w->connection, service_name, &error); + if (node == NULL) + { + g_assert (error != NULL); + show_error_dialog (GTK_WINDOW (w->window), &w->error_dialog, + _("Unable to load \"%s\": %s\n"), + service_name, error->message); + g_error_free (error); + return; + } + + tree_window_set_node (w, node); + + node_info_unref (node); +} + +static void +name_combo_changed_callback (GtkComboBox *combo, + TreeWindow *w) +{ + char *text; + + text = gtk_combo_box_get_active_text (combo); + + if (text) + { + tree_window_set_service (w, text); + g_free (text); + } +} + +static void +window_closed_callback (GtkWidget *window, + TreeWindow *w) +{ + g_assert (window == w->window); + w->window = NULL; + gtk_main_quit (); +} + +static TreeWindow* +tree_window_new (DBusGConnection *connection, + GtkTreeModel *names_model) +{ + TreeWindow *w; + GtkWidget *sw; + GtkWidget *vbox; + GtkWidget *hbox; + GtkWidget *combo; + + /* Should use glade, blah */ + + w = g_new0 (TreeWindow, 1); + w->window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + + gtk_window_set_title (GTK_WINDOW (w->window), "D-BUS Viewer"); + gtk_window_set_default_size (GTK_WINDOW (w->window), 400, 500); + + g_signal_connect (w->window, "destroy", G_CALLBACK (window_closed_callback), + w); + gtk_container_set_border_width (GTK_CONTAINER (w->window), 6); + + vbox = gtk_vbox_new (FALSE, 6); + gtk_container_add (GTK_CONTAINER (w->window), vbox); + + /* Create names option menu */ + if (connection) + { + GtkCellRenderer *cell; + + w->connection = connection; + + w->names_model = names_model; + + combo = gtk_combo_box_new_with_model (w->names_model); + + cell = gtk_cell_renderer_text_new (); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), cell, TRUE); + gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo), cell, + "text", 0, + NULL); + + gtk_box_pack_start (GTK_BOX (vbox), combo, FALSE, FALSE, 0); + + g_signal_connect (combo, "changed", + G_CALLBACK (name_combo_changed_callback), + w); + } + + /* Create tree view */ + hbox = gtk_hbox_new (FALSE, 6); + gtk_container_add (GTK_CONTAINER (vbox), hbox); + + sw = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + + gtk_box_pack_start (GTK_BOX (hbox), sw, TRUE, TRUE, 0); + + w->treeview = dbus_tree_view_new (); + + gtk_container_add (GTK_CONTAINER (sw), w->treeview); + + /* Show everything */ + gtk_widget_show_all (w->window); + + return w; +} + static void usage (int ecode) { @@ -417,7 +491,7 @@ main (int argc, char **argv) ++i; } - if (services) + if (services || files == NULL) { error = NULL; connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error); @@ -438,55 +512,51 @@ main (int argc, char **argv) connection = NULL; names_model = NULL; } + + if (files == NULL) + { + TreeWindow *w; + + w = tree_window_new (connection, names_model); + } files = g_slist_reverse (files); tmp = files; while (tmp != NULL) { - NodeInfo *node; const char *filename; + TreeWindow *w; filename = tmp->data; - - error = NULL; - if (services) - node = load_from_service (connection, filename, &error); - else - node = description_load_from_file (filename, - &error); - if (node == NULL) + if (services) { - g_assert (error != NULL); - show_error_dialog (NULL, NULL, - _("Unable to load \"%s\": %s\n"), - filename, error->message); - g_error_free (error); + w = tree_window_new (connection, names_model); + tree_window_set_service (w, filename); } else { - TreeWindow *w; - char **path; - const char *name; - - name = node_info_get_name (node); - if (name == NULL || - name[0] != '/') + NodeInfo *node; + + error = NULL; + node = description_load_from_file (filename, + &error); + + if (node == NULL) { - g_printerr (_("Assuming root node of \"%s\" is at path /, since no absolute path is specified"), filename); - name = "/"; + g_assert (error != NULL); + show_error_dialog (NULL, NULL, + _("Unable to load \"%s\": %s\n"), + filename, error->message); + g_error_free (error); + } + else + { + w = tree_window_new (connection, names_model); + tree_window_set_node (w, node); + node_info_unref (node); } - - path = _dbus_gutils_split_path (name); - - w = tree_window_new (connection, names_model); - dbus_tree_view_update (GTK_TREE_VIEW (w->treeview), - (const char**) path, - node); - node_info_unref (node); - - g_strfreev (path); } tmp = tmp->next; |