1 /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
3 theme.h for ObConf, the configuration tool for Openbox
4 Copyright (c) 2003-2007 Dana Jansens
5 Copyright (c) 2003 Tim Riley
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 See the COPYING file for a copy of the GNU General Public License.
22 #include "preview_update.h"
28 static gboolean mapping = FALSE;
31 static GtkListStore *theme_store;
33 static void add_theme_dir(const gchar *dirname);
34 static void reset_theme_names(GtkWidget *w);
35 static void on_theme_names_selection_changed(GtkTreeSelection *sel,
38 void theme_setup_tab()
40 GtkCellRenderer *render;
41 GtkTreeViewColumn *column;
42 GtkTreeSelection *select;
47 w = get_widget("theme_names");
50 theme_store = gtk_list_store_new(2, G_TYPE_STRING, GDK_TYPE_PIXBUF);
51 gtk_tree_view_set_model(GTK_TREE_VIEW(w), GTK_TREE_MODEL(theme_store));
52 preview_update_set_tree_view(GTK_TREE_VIEW(w), theme_store);
53 g_object_unref (theme_store);
55 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(w)),
56 GTK_SELECTION_SINGLE);
58 /* text column for the names */
59 render = gtk_cell_renderer_text_new();
60 column = gtk_tree_view_column_new_with_attributes
61 ("Name", render, "text", 0, NULL);
62 gtk_tree_view_append_column(GTK_TREE_VIEW(w), column);
64 /* pixbuf column, for theme previews */
65 render = gtk_cell_renderer_pixbuf_new();
66 g_object_set(render, "xalign", 1.0);
67 column = gtk_tree_view_column_new_with_attributes
68 ("Preview", render, "pixbuf", 1, NULL);
69 gtk_tree_view_append_column(GTK_TREE_VIEW(w), column);
71 /* setup the selection handler */
72 select = gtk_tree_view_get_selection(GTK_TREE_VIEW (w));
73 gtk_tree_selection_set_mode(select, GTK_SELECTION_SINGLE);
74 g_signal_connect (G_OBJECT(select), "changed",
75 G_CALLBACK(on_theme_names_selection_changed),
83 static void on_theme_names_selection_changed(GtkTreeSelection *sel,
92 if(gtk_tree_selection_get_selected(sel, &model, &iter)) {
93 gtk_tree_model_get(model, &iter, 0, &name, -1);
97 tree_set_string("theme/name", name);
100 void on_install_theme_clicked(GtkButton *w, gpointer data)
105 GtkFileFilter *filter;
107 d = gtk_file_chooser_dialog_new(_("Choose an Openbox theme"),
109 GTK_FILE_CHOOSER_ACTION_OPEN,
110 GTK_STOCK_OK, GTK_RESPONSE_OK,
111 GTK_STOCK_CANCEL, GTK_RESPONSE_NONE,
114 gtk_file_chooser_set_show_hidden(GTK_FILE_CHOOSER(d), FALSE);
115 filter = gtk_file_filter_new();
116 gtk_file_filter_set_name(filter, _("Openbox theme archives"));
117 gtk_file_filter_add_pattern(filter, "*.obt");
118 //gtk_file_filter_add_pattern(filter, "*.tgz");
119 //gtk_file_filter_add_pattern(filter, "*.tar.gz");
120 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(d), filter);
122 r = gtk_dialog_run(GTK_DIALOG(d));
123 if (r == GTK_RESPONSE_OK)
124 path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(d));
125 gtk_widget_destroy(d);
133 void on_theme_archive_clicked(GtkButton *w, gpointer data)
139 d = gtk_file_chooser_dialog_new(_("Choose an Openbox theme"),
141 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
142 GTK_STOCK_OK, GTK_RESPONSE_OK,
143 GTK_STOCK_CANCEL, GTK_RESPONSE_NONE,
146 gtk_file_chooser_set_show_hidden(GTK_FILE_CHOOSER(d), TRUE);
147 r = gtk_dialog_run(GTK_DIALOG(d));
148 if (r == GTK_RESPONSE_OK)
149 path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(d));
150 gtk_widget_destroy(d);
153 archive_create(path);
158 void theme_install(const gchar *path)
162 if ((name = archive_install(path))) {
167 w = glade_xml_get_widget(glade, "theme_names");
169 reset_theme_names(w);
172 /* go to the newly installed theme */
173 for (it = themes, i = 0; it; it = g_list_next(it), ++i)
174 if (!strcmp(it->data, name)) break;
178 path = gtk_tree_path_new_from_indices(i, -1);
179 gtk_tree_view_set_cursor(GTK_TREE_VIEW(w), path, NULL, FALSE);
180 gtk_tree_path_free(path);
192 static void reset_theme_names(GtkWidget *w)
198 GtkTreePath *path = NULL;
200 RrFont *active, *inactive, *menu_t, *menu_i, *osd;
202 name = tree_get_string("theme/name", "TheBear");
204 for (it = themes; it; it = g_list_next(it))
209 p = g_build_filename(g_get_home_dir(), ".themes", NULL);
215 for (it = parse_xdg_data_dir_paths(); it; it = g_slist_next(it)) {
216 p = g_build_filename(it->data, "themes", NULL);
222 add_theme_dir(THEMEDIR);
224 themes = g_list_sort(themes, (GCompareFunc) strcasecmp);
226 gtk_list_store_clear(theme_store);
228 /* return to regular scheduled programming */
230 for (it = themes; it; it = next) {
233 next = g_list_next(it);
235 /* remove duplicates */
236 if (next && !strcmp(it->data, next->data)) {
238 themes = g_list_delete_link(themes, it);
242 gtk_list_store_append(theme_store, &iter);
243 gtk_list_store_set(theme_store, &iter,
248 if(!strcmp(name, it->data))
249 path = gtk_tree_path_new_from_indices(i, -1);
254 preview_update_all();
256 /* do this after starting the preview update */
258 gtk_tree_view_set_cursor(GTK_TREE_VIEW(w), path, NULL, FALSE);
259 gtk_tree_path_free(path);
265 static void add_theme_dir(const gchar *dirname)
270 if ((dir = g_dir_open(dirname, 0, NULL))) {
271 while ((n = g_dir_read_name(dir))) {
274 full = g_build_filename(dirname, n, "openbox-3",
276 if (!g_file_test(full,
277 G_FILE_TEST_IS_REGULAR |
278 G_FILE_TEST_IS_SYMLINK))
284 themes = g_list_append(themes, g_strdup(n));