/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
theme.h for ObConf, the configuration tool for Openbox
Copyright (c) 2003-2007 Dana Jansens
Copyright (c) 2003 Tim Riley
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
See the COPYING file for a copy of the GNU General Public License.
*/
#include "main.h"
#include "tree.h"
#include "preview_update.h"
#include "gettext.h"
#include "archive.h"
#include "theme.h"
#include "preview.h"
static gboolean mapping = FALSE;
static GList *themes;
static GtkListStore *theme_store;
static void add_theme_dir(const gchar *dirname);
static void on_theme_names_selection_changed(GtkTreeSelection *sel,
gpointer data);
void theme_setup_tab()
{
GtkCellRenderer *render;
GtkTreeViewColumn *column;
GtkTreeSelection *select;
GtkWidget *w;
mapping = TRUE;
w = get_widget("theme_names");
/* widget setup */
theme_store = gtk_list_store_new(3,
/* the theme name */
G_TYPE_STRING,
/* the theme preview */
GDK_TYPE_PIXBUF,
/* alignment of the preview */
G_TYPE_FLOAT);
gtk_tree_view_set_model(GTK_TREE_VIEW(w), GTK_TREE_MODEL(theme_store));
preview_update_set_tree_view(GTK_TREE_VIEW(w), theme_store);
g_object_unref (theme_store);
gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(w)),
GTK_SELECTION_SINGLE);
/* text column for the names */
render = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes
("Name", render, "text", 0, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(w), column);
/* pixbuf column, for theme previews */
render = gtk_cell_renderer_pixbuf_new();
column = gtk_tree_view_column_new_with_attributes
("Preview", render, "pixbuf", 1, "xalign", 2, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(w), column);
/* setup the selection handler */
select = gtk_tree_view_get_selection(GTK_TREE_VIEW (w));
gtk_tree_selection_set_mode(select, GTK_SELECTION_SINGLE);
g_signal_connect (G_OBJECT(select), "changed",
G_CALLBACK(on_theme_names_selection_changed),
NULL);
mapping = FALSE;
}
static void on_theme_names_selection_changed(GtkTreeSelection *sel,
gpointer data)
{
GtkTreeIter iter;
GtkTreeModel *model;
const gchar *name;
if (mapping) return;
if(gtk_tree_selection_get_selected(sel, &model, &iter)) {
gtk_tree_model_get(model, &iter, 0, &name, -1);
}
if(name)
tree_set_string("theme/name", name);
}
void on_install_theme_clicked(GtkButton *w, gpointer data)
{
GtkWidget *d;
gint r;
gchar *path = NULL;
GtkFileFilter *filter;
d = gtk_file_chooser_dialog_new(_("Choose an Openbox theme"),
GTK_WINDOW(mainwin),
GTK_FILE_CHOOSER_ACTION_OPEN,
GTK_STOCK_OK, GTK_RESPONSE_OK,
GTK_STOCK_CANCEL, GTK_RESPONSE_NONE,
NULL);
gtk_file_chooser_set_show_hidden(GTK_FILE_CHOOSER(d), FALSE);
filter = gtk_file_filter_new();
gtk_file_filter_set_name(filter, _("Openbox theme archives"));
gtk_file_filter_add_pattern(filter, "*.obt");
//gtk_file_filter_add_pattern(filter, "*.tgz");
//gtk_file_filter_add_pattern(filter, "*.tar.gz");
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(d), filter);
r = gtk_dialog_run(GTK_DIALOG(d));
if (r == GTK_RESPONSE_OK)
path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(d));
gtk_widget_destroy(d);
if (path != NULL) {
theme_install(path);
g_free(path);
}
}
void on_theme_archive_clicked(GtkButton *w, gpointer data)
{
GtkWidget *d;
gint r;
gchar *path = NULL;
d = gtk_file_chooser_dialog_new(_("Choose an Openbox theme"),
GTK_WINDOW(mainwin),
GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
GTK_STOCK_OK, GTK_RESPONSE_OK,
GTK_STOCK_CANCEL, GTK_RESPONSE_NONE,
NULL);
gtk_file_chooser_set_show_hidden(GTK_FILE_CHOOSER(d), TRUE);
r = gtk_dialog_run(GTK_DIALOG(d));
if (r == GTK_RESPONSE_OK)
path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(d));
gtk_widget_destroy(d);
if (path != NULL) {
archive_create(path);
g_free(path);
}
}
void theme_install(const gchar *path)
{
gchar *name;
if ((name = archive_install(path)))
tree_set_string("theme/name", name);
g_free(name);
theme_load_all();
}
void theme_load_all()
{
gchar *name;
gchar *p;
GList *it, *next;
gint i;
GtkWidget *w;
GtkTreePath *path = NULL;
RrFont *active, *inactive, *menu_t, *menu_i, *osd;
mapping = TRUE;
w = get_widget("theme_names");
name = tree_get_string("theme/name", "TheBear");
for (it = themes; it; it = g_list_next(it))
g_free(it->data);
g_list_free(themes);
themes = NULL;
p = g_build_filename(g_get_home_dir(), ".themes", NULL);
add_theme_dir(p);
g_free(p);
{
GSList *it;
for (it = parse_xdg_data_dir_paths(); it; it = g_slist_next(it)) {
p = g_build_filename(it->data, "themes", NULL);
add_theme_dir(p);
g_free(p);
}
}
add_theme_dir(THEMEDIR);
themes = g_list_sort(themes, (GCompareFunc) strcasecmp);
gtk_list_store_clear(theme_store);
/* return to regular scheduled programming */
i = 0;
for (it = themes; it; it = next) {
GtkTreeIter iter;
next = g_list_next(it);
/* remove duplicates */
if (next && !strcmp(it->data, next->data)) {
g_free(it->data);
themes = g_list_delete_link(themes, it);
continue;
}
gtk_list_store_append(theme_store, &iter);
gtk_list_store_set(theme_store, &iter,
0, it->data, /* the theme's name */
1, NULL, /* the preview is set later */
2, 1.0, /* all previews are right-aligned */
-1);
if(!strcmp(name, it->data))
path = gtk_tree_path_new_from_indices(i, -1);
++i;
}
preview_update_all();
/* do this after starting the preview update */
if (path) {
gtk_tree_view_set_cursor(GTK_TREE_VIEW(w), path, NULL, FALSE);
gtk_tree_path_free(path);
}
g_free(name);
mapping = FALSE;
}
static void add_theme_dir(const gchar *dirname)
{
GDir *dir;
const gchar *n;
if ((dir = g_dir_open(dirname, 0, NULL))) {
while ((n = g_dir_read_name(dir))) {
{
gchar *full;
full = g_build_filename(dirname, n, "openbox-3",
"themerc", NULL);
if (!g_file_test(full,
G_FILE_TEST_IS_REGULAR |
G_FILE_TEST_IS_SYMLINK))
n = NULL;
g_free(full);
}
if (n) {
themes = g_list_append(themes, g_strdup(n));
}
}
g_dir_close(dir);
}
}
syntax highlighted by Code2HTML, v. 0.9.1