[PVFS2-CVS] commit by rbross in pvfs2/src/apps/karma: details.c fsview.c karma.c karma.h status.c

CVS commit program cvs at parl.clemson.edu
Thu Feb 12 13:32:29 EST 2004


Update of /projects/cvsroot/pvfs2/src/apps/karma
In directory parlweb:/tmp/cvs-serv9778/src/apps/karma

Modified Files:
	details.c fsview.c karma.c karma.h status.c 
Log Message:
Interim checkin; working on popping up a useful window when user clicks on bars in status view.
Right now a useless window pops up :).  I'm modifying the details functions so that I can use
them to create the view in the popup.  This will be more useful when a bar represents more than
one server, but will be nice anyway...


Index: details.c
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/apps/karma/details.c,v
diff -p -u -r1.10 -r1.11
--- details.c	11 Feb 2004 19:12:22 -0000	1.10
+++ details.c	12 Feb 2004 18:32:28 -0000	1.11
@@ -51,77 +51,98 @@ static gint gui_details_text_compare(Gtk
 
 GtkWidget *gui_details_setup(void)
 {
+    gui_details_view = gui_details_view_new(&gui_details_list,
+					    gui_details_col,
+#ifdef GUI_DETAILS_ENABLE_SORTING
+					    1
+#else
+                                            0
+#endif
+					    );
+
+    return gui_details_view;
+}
+
+
+/* gui_details_view_new()
+ *
+ * Parameters:
+ * - list_p is a pointer to location to store reference to list store
+ * - col is a pointer to array of tree view columns of size GUI_DETAILS_TYPE+1
+ * - sortable is a boolean indicating if we should enable sorting of cols
+ */
+GtkWidget *gui_details_view_new(GtkListStore **list_p,
+				GtkTreeViewColumn **col,
+				gint sortable)
+{
     int i;
+    GtkListStore *list;
+    GtkWidget *list_view;
 
-    gui_details_list = gtk_list_store_new(GUI_DETAILS_TYPE + 1,
-					  G_TYPE_STRING,  /* name */
-					  G_TYPE_STRING,  /* ram total */
-					  G_TYPE_STRING,  /* ram avail */
-					  G_TYPE_STRING,  /* uptime */
-					  G_TYPE_STRING,  /* handles total */
-					  G_TYPE_STRING,  /* handles avail */
-					  G_TYPE_STRING,  /* space total */
-					  G_TYPE_STRING,  /* space avail */
-					  G_TYPE_STRING); /* server type */
+    list = gtk_list_store_new(GUI_DETAILS_TYPE + 1,
+			      G_TYPE_STRING,  /* name */
+			      G_TYPE_STRING,  /* ram total */
+			      G_TYPE_STRING,  /* ram avail */
+			      G_TYPE_STRING,  /* uptime */
+			      G_TYPE_STRING,  /* handles total */
+			      G_TYPE_STRING,  /* handles avail */
+			      G_TYPE_STRING,  /* space total */
+			      G_TYPE_STRING,  /* space avail */
+			      G_TYPE_STRING); /* server type */
    
-
-    gui_details_view = gtk_tree_view_new();
+    list_view = gtk_tree_view_new();
 
     for (i=0; i < GUI_DETAILS_TYPE + 1; i++) {
 	GtkCellRenderer *renderer;
 	
-	gui_details_col[i] = gtk_tree_view_column_new();
-	gtk_tree_view_column_set_title(gui_details_col[i], column_name[i]);
-	gtk_tree_view_append_column(GTK_TREE_VIEW(gui_details_view),
-				    gui_details_col[i]);
+	col[i] = gtk_tree_view_column_new();
+	gtk_tree_view_column_set_title(col[i], column_name[i]);
+	gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), col[i]);
 
 	renderer = gtk_cell_renderer_text_new();
-	gtk_tree_view_column_pack_start(gui_details_col[i], renderer, TRUE);
-	gtk_tree_view_column_add_attribute(gui_details_col[i],
-					   renderer,
-					   "text",
-					   i);
+	gtk_tree_view_column_pack_start(col[i], renderer, TRUE);
+	gtk_tree_view_column_add_attribute(col[i], renderer, "text", i);
     }
 
-    gtk_tree_view_set_model(GTK_TREE_VIEW(gui_details_view),
-			    GTK_TREE_MODEL(gui_details_list));
+    gtk_tree_view_set_model(GTK_TREE_VIEW(list_view),
+			    GTK_TREE_MODEL(list));
 
-    /* NOTE: SORTING CAUSES BIG PROBLEMS; DISABLED UNTIL WE KNOW MORE */
-#ifdef GUI_DETAILS_ENABLE_SORTING
-    /* for all the numerical values, set up sorting */
-    for (i=1; i < GUI_DETAILS_TYPE; i++) {
-	gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(gui_details_list),
-					i,
-					gui_details_float_string_compare,
-					GINT_TO_POINTER(i),
+    if (sortable) {
+	/* for all the numerical values, set up sorting */
+	for (i=1; i < GUI_DETAILS_TYPE; i++) {
+	    gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(list),
+					    i,
+					    gui_details_float_string_compare,
+					    GINT_TO_POINTER(i),
+					    NULL);
+	    
+	    gtk_tree_view_column_set_sort_column_id(col[i], i);
+	}
+	
+	/* for the text values, set up sorting */
+	gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(list),
+					GUI_DETAILS_NAME,
+					gui_details_text_compare,
+					GINT_TO_POINTER(GUI_DETAILS_NAME),
 					NULL);
-
-	gtk_tree_view_column_set_sort_column_id(gui_details_col[i], i);
+	
+	gtk_tree_view_column_set_sort_column_id(col[GUI_DETAILS_NAME],
+						GUI_DETAILS_NAME);
+	
+	gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(list),
+					GUI_DETAILS_TYPE,
+					gui_details_text_compare,
+					GINT_TO_POINTER(GUI_DETAILS_TYPE),
+					NULL);
+	
+	gtk_tree_view_column_set_sort_column_id(col[GUI_DETAILS_TYPE],
+						GUI_DETAILS_TYPE);
     }
 
-    /* for the text values, set up sorting */
-    gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(gui_details_list),
-				    GUI_DETAILS_NAME,
-				    gui_details_text_compare,
-				    GINT_TO_POINTER(GUI_DETAILS_NAME),
-				    NULL);
-    
-    gtk_tree_view_column_set_sort_column_id(gui_details_col[GUI_DETAILS_NAME],
-					    GUI_DETAILS_NAME);
-
-    gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(gui_details_list),
-				    GUI_DETAILS_TYPE,
-				    gui_details_text_compare,
-				    GINT_TO_POINTER(GUI_DETAILS_TYPE),
-				    NULL);
-
-    gtk_tree_view_column_set_sort_column_id(gui_details_col[GUI_DETAILS_TYPE],
-					    GUI_DETAILS_TYPE);
-#endif
-
     gui_details_initialized = 1;
 
-    return gui_details_view;
+    *list_p = list;
+    return list_view;
 }
 
 void gui_details_update(struct PVFS_mgmt_server_stat *server_stat,

Index: fsview.c
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/apps/karma/fsview.c,v
diff -p -u -r1.3 -r1.4
--- fsview.c	29 Jan 2004 22:49:13 -0000	1.3
+++ fsview.c	12 Feb 2004 18:32:29 -0000	1.4
@@ -70,7 +70,7 @@ void gui_fsview_popup(void)
 
     /* drop the view in a container and go to town */
     dialog = gtk_dialog_new_with_buttons("Select File System",
-					 GTK_WINDOW_TOPLEVEL,
+					 GTK_WINDOW(main_window),
 					 GTK_DIALOG_DESTROY_WITH_PARENT,
 					 GTK_STOCK_OK,
 					 GTK_RESPONSE_OK,

Index: karma.c
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/apps/karma/karma.c,v
diff -p -u -r1.7 -r1.8
--- karma.c	11 Feb 2004 19:12:22 -0000	1.7
+++ karma.c	12 Feb 2004 18:32:29 -0000	1.8
@@ -10,7 +10,7 @@
 static gint status_timer_callback(gpointer data);
 static gint traffic_timer_callback(gpointer data);
 
-static GtkWidget *main_window;
+GtkWidget *main_window;
 
 static gint delete_event(GtkWidget *widget,
 			 GdkEvent  *event,

Index: karma.h
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/apps/karma/karma.h,v
diff -p -u -r1.8 -r1.9
--- karma.h	10 Feb 2004 18:15:43 -0000	1.8
+++ karma.h	12 Feb 2004 18:32:29 -0000	1.9
@@ -5,6 +5,9 @@
 #include "pint-sysint-utils.h"
 #include "server-config.h"
 
+/* reference to the main window, for popups etc. */
+extern GtkWidget *main_window;
+
 /* setting window title (from karma.c) */
 void gui_set_title(char *title);
 
@@ -90,6 +93,9 @@ extern GtkListStore *gui_comm_fslist;
 GtkWidget *gui_details_setup(void);
 void gui_details_update(struct PVFS_mgmt_server_stat *server_stat,
 			int server_stat_ct);
+GtkWidget *gui_details_view_new(GtkListStore **list_p,
+				GtkTreeViewColumn **col,
+				gint sortable);
 
 /* status page interface (status.c) */
 GtkWidget *gui_status_setup(void);

Index: status.c
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/apps/karma/status.c,v
diff -p -u -r1.2 -r1.3
--- status.c	10 Feb 2004 18:15:44 -0000	1.2
+++ status.c	12 Feb 2004 18:32:29 -0000	1.3
@@ -68,6 +68,12 @@ static gint gui_status_graph_expose_call
 static gint gui_status_graph_configure_callback(GtkWidget *drawing_area,
 						GdkEvent *event,
 						gpointer graph_state_ptr);
+static gint gui_status_graph_button_press_callback(GtkWidget *drawing_area,
+						   GdkEventButton *event,
+						   gpointer graph_state_ptr);
+
+static void gui_status_server_popup(struct PVFS_mgmt_server_stat *svr_stat,
+				    int svr_index);
 
 /* gui_status_setup()
  *
@@ -350,6 +356,7 @@ static GtkWidget *gui_status_graph_setup
 {
     int i;
     GtkWidget *hbox;
+    gint events;
 
     /* create frame and vbox */
     g_state->frame = gtk_frame_new("");
@@ -401,6 +408,15 @@ static GtkWidget *gui_status_graph_setup
 		     G_CALLBACK(gui_status_graph_expose_callback),
 		     (gpointer) g_state);
 
+    events = gtk_widget_get_events(GTK_WIDGET(g_state->drawing_area));
+    events |= GDK_BUTTON_PRESS_MASK;
+    gtk_widget_set_events(GTK_WIDGET(g_state->drawing_area), events);
+
+    g_signal_connect(G_OBJECT(g_state->drawing_area),
+		     "button_press_event",
+		     G_CALLBACK(gui_status_graph_button_press_callback),
+		     (gpointer) g_state);
+
     return g_state->frame;
 }
 
@@ -480,3 +496,112 @@ static gint gui_status_graph_expose_call
     return 0;
 }
 
+static gint gui_status_graph_button_press_callback(GtkWidget *drawing_area,
+						   GdkEventButton *event,
+						   gpointer graph_state_ptr)
+{
+    gint i, width, height, graphwidth, graphoffset, barspace, barheight;
+    gint topspace = 20;
+    struct gui_status_graph_state *g_state;
+    struct PVFS_mgmt_server_stat *svr_stat;
+    int svr_stat_ct;
+
+    g_state = (struct gui_status_graph_state *) graph_state_ptr;
+
+    assert(g_state != NULL);
+    assert(g_state->drawing_area == drawing_area);
+
+    /* ignore anything that isn't a double-click */
+    if (event->type != GDK_2BUTTON_PRESS) return 0;
+
+    /* calculate bar placement */
+    width  = drawing_area->allocation.width;
+    height = drawing_area->allocation.height;
+    graphwidth  = (int) (0.8 * (float) width);
+    graphoffset = (width - graphwidth) / 2;
+    barspace = (gint) (((float) ((height - topspace) / g_state->nr_bars)) *
+		       0.30);
+    barheight = ((height-topspace) - g_state->nr_bars*barspace) /
+	g_state->nr_bars;
+    assert(barheight > 0);
+
+    /* aesthetics: limit maximum bar height */
+    if (barheight > (height - topspace) / 8) {
+	barheight = (height - topspace) / 8;
+    }
+
+    i = (((gint) event->y) - topspace) / (barheight + barspace);
+    if (i >= g_state->nr_bars)
+    {
+	return 0; /* button press past bars */
+    }
+    else if (((gint) event->y) - topspace - (i * (barheight+barspace)) >
+	     barheight)
+    {
+	return 0; /* button press in space after a legitimate bar */
+    }
+
+    /* button was pressed on bar i */
+
+    /* currently we display bars in server order, so no mapping necessary */
+    gui_comm_stats_retrieve(&svr_stat, &svr_stat_ct);
+
+    /* if # of servers just changed, just ignore the click for now */
+    if (svr_stat_ct != g_state->nr_bars) return 0;
+
+    gui_status_server_popup(svr_stat, i);
+
+    return 0;
+}
+
+static void gui_status_server_popup(struct PVFS_mgmt_server_stat *svr_stat,
+				    int svr_index)
+{
+    GtkWidget *dialog, *label, *frame, *table;
+    char buf[64];
+
+    dialog = gtk_dialog_new_with_buttons("Server Details",
+					 GTK_WINDOW(main_window),
+					 GTK_DIALOG_DESTROY_WITH_PARENT,
+					 GTK_STOCK_OK,
+					 GTK_RESPONSE_NONE,
+					 NULL);
+    g_signal_connect_swapped(GTK_OBJECT(dialog), 
+			     "response", 
+			     G_CALLBACK(gtk_widget_destroy),
+			     GTK_OBJECT(dialog));
+
+    /* format data for presentation */
+    frame = gtk_frame_new(svr_stat[svr_index].bmi_address);
+    gtk_frame_set_label_align(GTK_FRAME(frame), 0.0, 0.0);
+    
+    table = gtk_table_new(2, 5, 1);
+    gtk_container_add(GTK_CONTAINER(frame), table);
+
+    label = gtk_label_new("Space Available/Total:");
+    gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_RIGHT);
+    gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1);
+   
+    label = gtk_label_new("Memory Available/Total:");
+    gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_RIGHT);
+    gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2);
+
+    label = gtk_label_new("Handles Available/Total:");
+    gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_RIGHT);
+    gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 2, 3);
+
+    label = gtk_label_new("Uptime:");
+    gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_RIGHT);
+    gtk_table_attach(GTK_TABLE(table), label, 0, 1, 3, 4,
+		     0, GTK_FILL|GTK_EXPAND, 0, 0);
+
+    label = gtk_label_new("Server Type:");
+    gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_RIGHT);
+    gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 4, 5);
+
+    gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox),
+		      frame);
+    gtk_widget_show_all(dialog);
+
+    return;
+}



More information about the PVFS2-CVS mailing list