3 #include "parser/parse.h"
7 #include <gdk-pixbuf/gdk-pixbuf.h>
9 #define OB_ICON "openbox-icon"
11 static GtkWidget *mainwin;
12 static GtkWidget *mainlist;
13 static GtkListStore *mainstore;
14 static GtkWidget *mainworkarea;
15 static GdkPixbuf *ob_icon;
22 gboolean on_mainwindow_delete_event(GtkWidget *w, GdkEvent *e, gpointer d);
23 void on_quit_activate(GtkMenuItem *item, gpointer d);
24 void on_applybutton_clicked(GtkButton *but, gpointer d);
25 void on_revertbutton_clicked(GtkButton *but, gpointer d);
26 void on_selection_changed(GtkTreeSelection *selection, gpointer data);
28 static void obconf_error(GError *e)
32 d = gtk_message_dialog_new(mainwin ? GTK_WINDOW(mainwin) : NULL,
33 GTK_DIALOG_DESTROY_WITH_PARENT,
37 g_signal_connect_swapped(GTK_OBJECT(d), "response",
38 G_CALLBACK(gtk_widget_destroy),
43 static void load_stock ()
45 GtkIconFactory *factory;
48 gtk_icon_factory_add_default (factory = gtk_icon_factory_new ());
50 ob_icon = gdk_pixbuf_new_from_file (PIXMAPDIR G_DIR_SEPARATOR_S
53 gchar *msg = g_strdup_printf
54 (_("Failed to load the Openbox icon, Openbox is probably not "
55 "installed correctly. The error given was '%s'."),
63 set = gtk_icon_set_new_from_pixbuf (ob_icon);
64 gtk_icon_factory_add (factory, OB_ICON, set);
65 gtk_icon_set_unref (set);
69 GtkWidget* build_menu(GtkAccelGroup *accel)
75 menu = gtk_menu_bar_new();
79 submenu = gtk_menu_new();
80 gtk_menu_set_accel_group(GTK_MENU(submenu), accel);
82 item = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, accel);
83 g_signal_connect(item, "activate", G_CALLBACK(on_quit_activate), NULL);
84 gtk_menu_append(GTK_MENU(submenu), item);
86 item = gtk_menu_item_new_with_mnemonic("_File");
87 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
88 gtk_menu_bar_append(GTK_MENU_BAR(menu), item);
92 submenu = gtk_menu_new();
93 gtk_menu_set_accel_group(GTK_MENU(submenu), accel);
95 item = gtk_menu_item_new_with_mnemonic("_About");
96 gtk_menu_append(GTK_MENU(submenu), item);
98 item = gtk_menu_item_new_with_mnemonic("_Help");
99 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
100 gtk_menu_bar_append(GTK_MENU_BAR(menu), item);
102 gtk_widget_show_all(menu);
107 GtkWidget* build_list(GtkListStore **model)
111 GtkCellRenderer *ren;
112 GtkTreeViewColumn *col;
113 GtkTreeSelection *sel;
115 store = gtk_list_store_new(N_COLUMNS,
118 list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
119 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list), FALSE);
121 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
122 gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
123 g_signal_connect(sel, "changed", G_CALLBACK(on_selection_changed), NULL);
125 ren = gtk_cell_renderer_text_new();
126 col = gtk_tree_view_column_new_with_attributes("Name",
131 gtk_tree_view_append_column(GTK_TREE_VIEW(list), col);
137 int main(int argc, char **argv)
142 GtkAccelGroup *accel;
149 gtk_init(&argc, &argv);
151 mainwin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
152 gtk_window_set_title(GTK_WINDOW(mainwin), "Obconf");
153 gtk_window_set_wmclass(GTK_WINDOW(mainwin), "obconf", "Obconf");
154 gtk_window_set_role(GTK_WINDOW(mainwin), "main window");
156 g_signal_connect(mainwin, "delete-event",
157 G_CALLBACK(on_mainwindow_delete_event), NULL);
159 accel = gtk_accel_group_new();
160 gtk_window_add_accel_group(GTK_WINDOW(mainwin), accel);
162 vbox = gtk_vbox_new(FALSE, 5);
163 gtk_container_add(GTK_CONTAINER(mainwin), vbox);
167 menu = build_menu(accel);
168 gtk_box_pack_start(GTK_BOX(vbox), menu, FALSE, FALSE, 0);
170 hpane = gtk_hpaned_new();
171 gtk_box_pack_start(GTK_BOX(vbox), hpane, TRUE, TRUE, 0);
175 mainlist = build_list(&mainstore);
176 gtk_container_add(GTK_CONTAINER(hpane), mainlist);
180 mainworkarea = gtk_layout_new(NULL, NULL);
181 gtk_container_add(GTK_CONTAINER(hpane), mainworkarea);
185 sep = gtk_hseparator_new();
186 gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 0);
190 bbox = gtk_hbutton_box_new();
191 gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);
192 gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 6);
193 gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
197 but = gtk_button_new_with_mnemonic("_Revert");
198 gtk_box_pack_start(GTK_BOX(bbox), but, FALSE, FALSE, 0);
202 but = gtk_button_new_with_mnemonic("_Apply");
203 gtk_box_pack_start(GTK_BOX(bbox), but, FALSE, FALSE, 0);
207 bar = gtk_statusbar_new();
208 gtk_box_pack_start(GTK_BOX(vbox), bar, FALSE, FALSE, 0);
210 gtk_widget_show_all(mainwin);
213 if (ob_icon) gtk_window_set_icon(GTK_WINDOW(mainwin), ob_icon);
219 gboolean on_mainwindow_delete_event(GtkWidget *w, GdkEvent *e, gpointer d)
225 void on_quit_activate(GtkMenuItem *item, gpointer d)
230 void on_applybutton_clicked(GtkButton *but, gpointer d)
235 void on_revertbutton_clicked(GtkButton *but, gpointer d)
240 void on_selection_changed(GtkTreeSelection *sel, gpointer data)
245 if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
246 g_message("activated");
248 g_message("none activated");