aboutsummaryrefslogtreecommitdiffstats
path: root/xs_view.c
diff options
context:
space:
mode:
authorkraxel <kraxel>2005-12-08 11:17:50 +0000
committerkraxel <kraxel>2005-12-08 11:17:50 +0000
commite22cc1e84130dfe1086088c0452efc6596e5b855 (patch)
tree95045ace03f576aa357b079a780853f66044c0ad /xs_view.c
downloadxenwatch-e22cc1e84130dfe1086088c0452efc6596e5b855.tar.gz
Initial revision
Diffstat (limited to 'xs_view.c')
-rw-r--r--xs_view.c187
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;
+}