1 /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
3 appearance.c 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"
24 static gboolean mapping = FALSE;
26 static RrFont *read_font(GtkFontButton *w, const gchar *place);
27 static RrFont *write_font(GtkFontButton *w, const gchar *place);
29 void appearance_setup_tab()
37 w = get_widget("window_border");
38 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
39 tree_get_bool("theme/keepBorder", TRUE));
41 w = get_widget("animate_iconify");
42 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
43 tree_get_bool("theme/animateIconify", TRUE));
45 w = get_widget("title_layout");
46 layout = tree_get_string("theme/titleLayout", "NLIMC");
47 gtk_entry_set_text(GTK_ENTRY(w), layout);
48 preview_update_set_title_layout(layout);
51 w = get_widget("font_active");
52 f = read_font(GTK_FONT_BUTTON(w), "ActiveWindow");
53 preview_update_set_active_font(f);
55 w = get_widget("font_inactive");
56 f = read_font(GTK_FONT_BUTTON(w), "InactiveWindow");
57 preview_update_set_inactive_font(f);
59 w = get_widget("font_menu_header");
60 f = read_font(GTK_FONT_BUTTON(w), "MenuHeader");
61 preview_update_set_menu_header_font(f);
63 w = get_widget("font_menu_item");
64 f = read_font(GTK_FONT_BUTTON(w), "MenuItem");
65 preview_update_set_menu_item_font(f);
67 w = get_widget("font_display");
68 f = read_font(GTK_FONT_BUTTON(w), "OnScreenDisplay");
69 preview_update_set_osd_font(f);
74 void on_window_border_toggled(GtkToggleButton *w, gpointer data)
80 b = gtk_toggle_button_get_active(w);
81 tree_set_bool("theme/keepBorder", b);
84 void on_animate_iconify_toggled(GtkToggleButton *w, gpointer data)
90 b = gtk_toggle_button_get_active(w);
91 tree_set_bool("theme/animateIconify", b);
94 void on_title_layout_changed(GtkEntry *w, gpointer data)
98 gboolean n, d, s, l, i, m, c;
102 layout = g_strdup(gtk_entry_get_text(w));
104 n = d = s = l = i = m = c = FALSE;
106 for (it = layout; *it; ++it) {
144 /* drop the letter */
145 for (it2 = it; *it2; ++it2)
153 gtk_entry_set_text(w, layout);
154 tree_set_string("theme/titleLayout", layout);
155 preview_update_set_title_layout(layout);
160 void on_font_active_font_set(GtkFontButton *w, gpointer data)
164 preview_update_set_active_font(write_font(w, "ActiveWindow"));
167 void on_font_inactive_font_set(GtkFontButton *w, gpointer data)
171 preview_update_set_inactive_font(write_font(w, "InactiveWindow"));
174 void on_font_menu_header_font_set(GtkFontButton *w, gpointer data)
178 preview_update_set_menu_header_font(write_font(w, "MenuHeader"));
181 void on_font_menu_item_font_set(GtkFontButton *w, gpointer data)
185 preview_update_set_menu_item_font(write_font(w, "MenuItem"));
188 void on_font_display_font_set(GtkFontButton *w, gpointer data)
192 preview_update_set_osd_font(write_font(w, "OnScreenDisplay"));
195 static RrFont *read_font(GtkFontButton *w, const gchar *place)
198 gchar *fontstring, *node;
199 gchar *name, **names;
204 RrFontWeight rr_weight = RR_FONTWEIGHT_NORMAL;
205 RrFontSlant rr_slant = RR_FONTSLANT_NORMAL;
209 node = g_strdup_printf("theme/font:place=%s/name", place);
210 name = tree_get_string(node, "Sans");
213 node = g_strdup_printf("theme/font:place=%s/size", place);
214 size = tree_get_string(node, "8");
217 node = g_strdup_printf("theme/font:place=%s/weight", place);
218 weight = tree_get_string(node, "");
221 node = g_strdup_printf("theme/font:place=%s/slant", place);
222 slant = tree_get_string(node, "");
225 /* get only the first font in the string */
226 names = g_strsplit(name, ",", 0);
228 name = g_strdup(names[0]);
231 /* don't use "normal" in the gtk string */
232 if (!g_ascii_strcasecmp(weight, "normal")) {
233 g_free(weight); weight = g_strdup("");
235 if (!g_ascii_strcasecmp(slant, "normal")) {
236 g_free(slant); slant = g_strdup("");
239 fontstring = g_strdup_printf("%s %s %s %s", name, weight, slant, size);
240 gtk_font_button_set_font_name(w, fontstring);
242 if (!g_ascii_strcasecmp(weight, "Bold")) rr_weight = RR_FONTWEIGHT_BOLD;
243 if (!g_ascii_strcasecmp(slant, "Italic")) rr_slant = RR_FONTSLANT_ITALIC;
244 if (!g_ascii_strcasecmp(slant, "Oblique")) rr_slant = RR_FONTSLANT_OBLIQUE;
246 font = RrFontOpen(rrinst, name, atoi(size), rr_weight, rr_slant);
258 static RrFont *write_font(GtkFontButton *w, const gchar *place)
262 const gchar *size = NULL;
263 const gchar *bold = NULL;
264 const gchar *italic = NULL;
266 RrFontWeight weight = RR_FONTWEIGHT_NORMAL;
267 RrFontSlant slant = RR_FONTSLANT_NORMAL;
271 font = g_strdup(gtk_font_button_get_font_name(w));
272 while ((c = strrchr(font, ' '))) {
273 if (!bold && !italic && !size && atoi(c+1))
275 else if (!bold && !italic && !g_ascii_strcasecmp(c+1, "italic"))
277 else if (!bold && !g_ascii_strcasecmp(c+1, "bold"))
283 if (!bold) bold = "Normal";
284 if (!italic) italic = "Normal";
286 node = g_strdup_printf("theme/font:place=%s/name", place);
287 tree_set_string(node, font);
290 node = g_strdup_printf("theme/font:place=%s/size", place);
291 tree_set_string(node, size);
294 node = g_strdup_printf("theme/font:place=%s/weight", place);
295 tree_set_string(node, bold);
298 node = g_strdup_printf("theme/font:place=%s/slant", place);
299 tree_set_string(node, italic);
302 if (!g_ascii_strcasecmp(bold, "Bold")) weight = RR_FONTWEIGHT_BOLD;
303 if (!g_ascii_strcasecmp(italic, "Italic")) slant = RR_FONTSLANT_ITALIC;
304 if (!g_ascii_strcasecmp(italic, "Oblique")) slant = RR_FONTSLANT_OBLIQUE;
306 return RrFontOpen(rrinst, font, atoi(size), weight, slant);