diff options
author | kraxel <kraxel> | 2005-12-08 11:17:50 +0000 |
---|---|---|
committer | kraxel <kraxel> | 2005-12-08 11:17:50 +0000 |
commit | e22cc1e84130dfe1086088c0452efc6596e5b855 (patch) | |
tree | 95045ace03f576aa357b079a780853f66044c0ad /xs_view.c | |
download | xenwatch-e22cc1e84130dfe1086088c0452efc6596e5b855.tar.gz |
Initial revision
Diffstat (limited to 'xs_view.c')
-rw-r--r-- | xs_view.c | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/xs_view.c b/xs_view.c new file mode 100644 index 0000000..7e0e97a --- /dev/null +++ b/xs_view.c @@ -0,0 +1,187 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <errno.h> + +#include <gtk/gtk.h> +#include <xs.h> + +#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_about(void) +{ + /* TODO */ +} + +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_QUIT, + .label = "_Close", + .accelerator = "<control>Q", + .callback = menu_cb_close, + },{ + + .name = "ActionMenu", + .label = "_Action", + },{ + .name = "ExpandAll", + .label = "_Expand all", + .accelerator = "<control>E", + .callback = menu_cb_expand, + },{ + + .name = "HelpMenu", + .label = "_Help", + },{ + .name = "About", + .label = "_About ...", + .callback = menu_cb_about, + }, +}; + +static char ui_xml[] = +"<ui>" +" <menubar name='MainMenu'>" +" <menu action='FileMenu'>" +" <menuitem action='Close'/>" +" </menu>" +" <menu action='ActionMenu'>" +" <menuitem action='ExpandAll'/>" +" </menu>" +" <menu action='HelpMenu'>" +" <menuitem action='About'/>" +" </menu>" +" </menubar>" +" <toolbar action='ToolBar'>" +" <toolitem action='Close'/>" +" </toolbar>" +"</ui>"; + +/* ------------------------------------------------------------------ */ + +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), 400, 300); + 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; +} |