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("title_layout");
42 layout = tree_get_string("theme/titleLayout", "NLIMC");
43 gtk_entry_set_text(GTK_ENTRY(w), layout);
44 preview_update_set_title_layout(layout);
47 w = get_widget("font_active");
48 f = read_font(GTK_FONT_BUTTON(w), "ActiveWindow");
49 preview_update_set_active_font(f);
51 w = get_widget("font_inactive");
52 f = read_font(GTK_FONT_BUTTON(w), "InactiveWindow");
53 preview_update_set_inactive_font(f);
55 w = get_widget("font_menu_header");
56 f = read_font(GTK_FONT_BUTTON(w), "MenuHeader");
57 preview_update_set_menu_header_font(f);
59 w = get_widget("font_menu_item");
60 f = read_font(GTK_FONT_BUTTON(w), "MenuItem");
61 preview_update_set_menu_item_font(f);
63 w = get_widget("font_display");
64 f = read_font(GTK_FONT_BUTTON(w), "OnScreenDisplay");
65 preview_update_set_osd_font(f);
70 void on_window_border_toggled(GtkToggleButton *w, gpointer data)
76 b = gtk_toggle_button_get_active(w);
77 tree_set_bool("theme/keepBorder", b);
80 void on_title_layout_changed(GtkEntry *w, gpointer data)
84 gboolean n, d, s, l, i, m, c;
88 layout = g_strdup(gtk_entry_get_text(w));
90 n = d = s = l = i = m = c = FALSE;
92 for (it = layout; *it; ++it) {
130 /* drop the letter */
131 for (it2 = it; *it2; ++it2)
139 gtk_entry_set_text(w, layout);
140 tree_set_string("theme/titleLayout", layout);
141 preview_update_set_title_layout(layout);
146 void on_font_active_font_set(GtkFontButton *w, gpointer data)
150 preview_update_set_active_font(write_font(w, "ActiveWindow"));
153 void on_font_inactive_font_set(GtkFontButton *w, gpointer data)
157 preview_update_set_inactive_font(write_font(w, "InactiveWindow"));
160 void on_font_menu_header_font_set(GtkFontButton *w, gpointer data)
164 preview_update_set_menu_header_font(write_font(w, "MenuHeader"));
167 void on_font_menu_item_font_set(GtkFontButton *w, gpointer data)
171 preview_update_set_menu_item_font(write_font(w, "MenuItem"));
174 void on_font_display_font_set(GtkFontButton *w, gpointer data)
178 preview_update_set_osd_font(write_font(w, "OnScreenDisplay"));
181 static RrFont *read_font(GtkFontButton *w, const gchar *place)
184 gchar *fontstring, *node;
185 gchar *name, **names;
190 RrFontWeight rr_weight = RR_FONTWEIGHT_NORMAL;
191 RrFontSlant rr_slant = RR_FONTSLANT_NORMAL;
195 node = g_strdup_printf("theme/font:place=%s/name", place);
196 name = tree_get_string(node, "Sans");
199 node = g_strdup_printf("theme/font:place=%s/size", place);
200 size = tree_get_string(node, "8");
203 node = g_strdup_printf("theme/font:place=%s/weight", place);
204 weight = tree_get_string(node, "");
207 node = g_strdup_printf("theme/font:place=%s/slant", place);
208 slant = tree_get_string(node, "");
211 /* get only the first font in the string */
212 names = g_strsplit(name, ",", 0);
214 name = g_strdup(names[0]);
217 /* don't use "normal" in the gtk string */
218 if (!g_ascii_strcasecmp(weight, "normal")) {
219 g_free(weight); weight = g_strdup("");
221 if (!g_ascii_strcasecmp(slant, "normal")) {
222 g_free(slant); slant = g_strdup("");
225 fontstring = g_strdup_printf("%s %s %s %s", name, weight, slant, size);
226 gtk_font_button_set_font_name(w, fontstring);
228 if (!g_ascii_strcasecmp(weight, "Bold")) rr_weight = RR_FONTWEIGHT_BOLD;
229 if (!g_ascii_strcasecmp(slant, "Italic")) rr_slant = RR_FONTSLANT_ITALIC;
230 if (!g_ascii_strcasecmp(slant, "Oblique")) rr_slant = RR_FONTSLANT_OBLIQUE;
232 font = RrFontOpen(rrinst, name, atoi(size), rr_weight, rr_slant);
244 static RrFont *write_font(GtkFontButton *w, const gchar *place)
248 const gchar *size = NULL;
249 const gchar *bold = NULL;
250 const gchar *italic = NULL;
252 RrFontWeight weight = RR_FONTWEIGHT_NORMAL;
253 RrFontSlant slant = RR_FONTSLANT_NORMAL;
257 font = g_strdup(gtk_font_button_get_font_name(w));
258 while ((c = strrchr(font, ' '))) {
259 if (!bold && !italic && !size && atoi(c+1))
261 else if (!bold && !italic && !g_ascii_strcasecmp(c+1, "italic"))
263 else if (!bold && !g_ascii_strcasecmp(c+1, "bold"))
269 if (!bold) bold = "Normal";
270 if (!italic) italic = "Normal";
272 node = g_strdup_printf("theme/font:place=%s/name", place);
273 tree_set_string(node, font);
276 node = g_strdup_printf("theme/font:place=%s/size", place);
277 tree_set_string(node, size);
280 node = g_strdup_printf("theme/font:place=%s/weight", place);
281 tree_set_string(node, bold);
284 node = g_strdup_printf("theme/font:place=%s/slant", place);
285 tree_set_string(node, italic);
288 if (!g_ascii_strcasecmp(bold, "Bold")) weight = RR_FONTWEIGHT_BOLD;
289 if (!g_ascii_strcasecmp(italic, "Italic")) slant = RR_FONTSLANT_ITALIC;
290 if (!g_ascii_strcasecmp(italic, "Oblique")) slant = RR_FONTSLANT_OBLIQUE;
292 return RrFontOpen(rrinst, font, atoi(size), weight, slant);