#include #include #include #include #include #include #include #include "xs_store.h" #include "xenviews.h" /* ------------------------------------------------------------------ */ GtkWidget *xs_toplevel; static GtkWidget *status; static XenStore *store; static GtkWidget *view; /* ------------------------------------------------------------------ */ static void menu_cb_close(void) { gtk_widget_destroy(xs_toplevel); } static void menu_cb_expand(void) { gtk_tree_view_expand_all(GTK_TREE_VIEW(view)); } static void destroy(GtkWidget *widget, gpointer data) { g_object_unref(store); xs_toplevel = NULL; } /* ------------------------------------------------------------------ */ static const GtkActionEntry entries[] = { { .name = "FileMenu", .label = "_File", },{ .name = "Close", .stock_id = GTK_STOCK_CLOSE, .label = "_Close", .accelerator = "Q", .callback = menu_cb_close, },{ .name = "ViewMenu", .label = "_View", },{ .name = "ExpandAll", .label = "_Expand all", .accelerator = "E", .callback = menu_cb_expand, }, }; static char ui_xml[] = "" " " " " " " " " " " " " " " " " " " " " " " ""; /* ------------------------------------------------------------------ */ static GtkWidget *xenstore_create_view(XenStore *store) { GtkCellRenderer *renderer; GtkWidget *view; view = gtk_tree_view_new(); gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store)); gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), GTK_SELECTION_SINGLE); renderer = gtk_cell_renderer_text_new(); g_object_set(renderer, "font", "monospace", NULL); gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW(view), -1, _("Name"), renderer, "text", XENSTORE_COL_NAME, NULL); renderer = gtk_cell_renderer_text_new(); g_object_set(renderer, "font", "monospace", NULL); gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW(view), -1, _("Value"), renderer, "text", XENSTORE_COL_VALUE, NULL); return view; } void xenstore_create_window(void) { GtkWidget *vbox, *menubar, *toolbar, *scroll; GtkAccelGroup *accel; GtkActionGroup *ag; GtkUIManager *ui; GError *err; xs_toplevel = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(xs_toplevel), _("xenstore")); gtk_widget_set_size_request(GTK_WIDGET(xs_toplevel), 480, 320); g_signal_connect(G_OBJECT(xs_toplevel), "destroy", G_CALLBACK(destroy), NULL); /* menu + toolbar */ ui = gtk_ui_manager_new(); ag = gtk_action_group_new("MenuActions"); gtk_action_group_add_actions(ag, entries, G_N_ELEMENTS(entries), xs_toplevel); gtk_ui_manager_insert_action_group(ui, ag, 0); accel = gtk_ui_manager_get_accel_group(ui); gtk_window_add_accel_group(GTK_WINDOW(xs_toplevel), accel); err = NULL; if (!gtk_ui_manager_add_ui_from_string(ui, ui_xml, -1, &err)) { g_message("building menus failed: %s", err->message); g_error_free(err); exit(1); } /* list */ store = xenstore_new(); view = xenstore_create_view(store); scroll = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); /* other widgets */ status = gtk_widget_new(GTK_TYPE_LABEL, "label", "status line", "xalign", 0.0, NULL); /* Make a vbox and put stuff in */ vbox = gtk_vbox_new(FALSE, 1); gtk_container_set_border_width(GTK_CONTAINER(vbox), 1); gtk_container_add(GTK_CONTAINER(xs_toplevel), vbox); menubar = gtk_ui_manager_get_widget(ui, "/MainMenu"); gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0); if (0) { toolbar = gtk_ui_manager_get_widget(ui, "/ToolBar"); gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0); } gtk_box_pack_start(GTK_BOX(vbox), scroll, TRUE, TRUE, 0); gtk_container_add(GTK_CONTAINER(scroll), view); gtk_box_pack_end(GTK_BOX(vbox), status, FALSE, TRUE, 0); return; }