#include #include #include #include #define PATH "/home/herbert/bin/rat" enum { SESSION_COLUMN, N_COLUMNS }; static gboolean delete_event (GtkWidget*, GdkEvent*, gpointer); static gboolean key_press (GtkWidget*, GdkEventKey*, gpointer); static void selected (GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer data); int main (int argc, char *argv[]) { GtkWidget *window, *vbox, *label, *treeview; GtkListStore *store; GtkTreePath *path; GtkTreeIter iter; GtkTreeViewColumn *column; GtkCellRenderer *renderer; GtkTreeSelection *select; GDir *dp; gchar *file_name; // system ("ratpoison -c only"); gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "Rat Poison menu"); gtk_container_set_border_width (GTK_CONTAINER (window), 2); g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL); g_signal_connect (G_OBJECT (window), "key-press-event", G_CALLBACK (key_press), NULL); vbox = gtk_vbox_new (FALSE, 2); label = gtk_label_new ("Pick a session to start:"); gtk_misc_set_alignment (GTK_MISC (label), 0, .5); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 2); // Start filling the list store = gtk_list_store_new ( N_COLUMNS, G_TYPE_STRING); dp = g_dir_open (PATH , 0, NULL); while ( ( file_name = g_dir_read_name (dp) ) != NULL) { gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, SESSION_COLUMN, file_name, -1); } treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes ("Session",renderer, "text", SESSION_COLUMN,NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column); gtk_box_pack_start (GTK_BOX (vbox), treeview, TRUE, TRUE, 2); select = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)); gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE); g_signal_connect (G_OBJECT (treeview), "row-activated", G_CALLBACK (selected), NULL); //sort gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store), SESSION_COLUMN,GTK_SORT_ASCENDING); gtk_container_add (GTK_CONTAINER (window), vbox); gtk_widget_show_all (window); gtk_main (); return 0; } static gboolean key_press (GtkWidget *widget, GdkEventKey *key, gpointer data) { if ( key->keyval == 65307 ) gtk_main_quit (); return FALSE; } static void selected (GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer data) { GtkTreeIter iter; GtkTreeModel *model; gchar *filename; GtkTreeSelection *selection; gchar execute[128]; selection = gtk_tree_view_get_selection (tree_view); if (gtk_tree_selection_get_selected (selection, &model, &iter)) { gtk_tree_model_get (model, &iter, SESSION_COLUMN, &filename, -1); gtk_main_quit(); strcpy (execute, "\""); strncat (execute, PATH, 126); strcat (execute, "/"); strncat (execute, filename, 96); strcat (execute, "\""); system (execute); printf ("%s\n", execute); g_free (filename); } } static gboolean delete_event (GtkWidget *widget, GdkEvent *event, gpointer data) { gtk_main_quit(); }