2 * This file is part of hildon-libs
4 * Copyright (C) 2005 Nokia Corporation.
6 * Contact: Luc Pionchon <luc.pionchon@nokia.com>
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public License
10 * as published by the Free Software Foundation; either version 2.1 of
11 * the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
26 * SECTION:hildon-defines
27 * @short_description: Not a widget, just a helper
32 #include "hildon-defines.h"
34 const HildonIconSizes *hildoniconsizes = NULL;
35 static HildonIconSizes iis; /* hildon internal icon sizes */
38 * hildon_icon_sizes_init:
40 * Initializes the icon sizes. This is automatically
41 * called when the icon sizes have not been initialized
42 * and one is requested.
44 void hildon_icon_sizes_init (void)
46 if (hildoniconsizes != NULL)
49 hildoniconsizes = &iis;
51 iis.icon_size_list = gtk_icon_size_register ("hildon_icon_size_list", 64, 64);
52 iis.icon_size_small = gtk_icon_size_register ("*icon_size_small", 26, 26);
53 iis.icon_size_toolbar = gtk_icon_size_register ("icon_size_toolbar", 26, 26);
54 iis.icon_size_widg = gtk_icon_size_register ("icon_size_widg", 26, 26);
55 iis.icon_size_widg_wizard = gtk_icon_size_register ("icon_size_widg_wizard", 50, 50);
56 iis.icon_size_grid = gtk_icon_size_register ("icon_size_grid", 64, 64);
57 iis.icon_size_big_note = gtk_icon_size_register ("icon_size_big_note", 50, 50);
58 iis.icon_size_note = gtk_icon_size_register ("icon_size_note", 26, 26);
59 iis.icon_size_statusbar = gtk_icon_size_register ("icon_size_statusbar", 40, 40);
60 iis.icon_size_indi_video_player_pre_roll = gtk_icon_size_register ("icon_size_indi_video_player_pre_roll", 64, 64);
61 iis.icon_size_indi_key_pad_lock = gtk_icon_size_register ("icon_size_indi_key_pad_lock", 50, 50);
62 iis.icon_size_indi_copy = gtk_icon_size_register ("icon_size_indi_copy", 64, 64);
63 iis.icon_size_indi_delete = gtk_icon_size_register ("icon_size_indi_delete", 64, 64);
64 iis.icon_size_indi_process = gtk_icon_size_register ("icon_size_indi_process", 64, 64);
65 iis.icon_size_indi_progressball = gtk_icon_size_register ("icon_size_indi_progressball", 64, 64);
66 iis.icon_size_indi_send = gtk_icon_size_register ("icon_size_indi_send", 64, 64);
67 iis.icon_size_indi_offmode_charging = gtk_icon_size_register ("icon_size_indi_offmode_charging", 50, 50);
68 iis.icon_size_indi_tap_and_hold = gtk_icon_size_register ("icon_size_indi_tap_and_hold", 34, 34);
69 iis.icon_size_indi_send_receive = gtk_icon_size_register ("icon_size_indi_send_receive", 64, 64);
70 iis.icon_size_indi_wlan_strength = gtk_icon_size_register ("icon_size_indi_wlan_strength", 64, 64);
72 iis.image_size_indi_nokia_logo = gtk_icon_size_register ("image_size_indi_nokia_logo", 64, 64);
73 iis.image_size_indi_startup_failed = gtk_icon_size_register ("image_size_indi_startup_failed", 64, 64);
74 iis.image_size_indi_startup_nokia_logo = gtk_icon_size_register ("image_size_indi_startup_nokia_logo", 64, 64);
75 iis.image_size_indi_nokia_hands = gtk_icon_size_register ("image_size_indi_nokia_hands", 64, 64);
78 typedef struct _HildonLogicalData HildonLogicalData;
80 struct _HildonLogicalData
84 gchar *logicalcolorstring;
85 gchar *logicalfontstring;
89 static void hildon_change_style_recursive_from_ld (GtkWidget *widget, GtkStyle *prev_style, HildonLogicalData *ld)
91 /* Change the style for child widgets */
92 if (GTK_IS_CONTAINER (widget))
93 gtk_container_forall (GTK_CONTAINER (widget), (GtkCallback) (hildon_change_style_recursive_from_ld), ld);
95 /* gtk_widget_modify_*() emit "style_set" signals, so if we got here from
96 "style_set" signal, we need to block this function from being called
97 again or we get into inifinite loop.
99 FIXME: Compiling with gcc > 3.3 and -pedantic won't allow
100 conversion between function and object pointers. GLib API however
101 requires an object pointer for a function, so we have to work
103 See http://bugzilla.gnome.org/show_bug.cgi?id=310175
106 g_signal_handlers_block_matched (G_OBJECT (widget), G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC,
107 g_signal_lookup ("style_set", G_TYPE_FROM_INSTANCE (widget)),
109 (gpointer) hildon_change_style_recursive_from_ld,
112 if (ld->logicalcolorstring != NULL)
114 /* Changing logical color */
116 if (gtk_style_lookup_logical_color (widget->style, ld->logicalcolorstring, &color) == TRUE)
120 gtk_widget_modify_fg (widget, ld->state, &color);
123 gtk_widget_modify_bg (widget, ld->state, &color);
126 gtk_widget_modify_text (widget, ld->state, &color);
129 gtk_widget_modify_base (widget, ld->state, &color);
134 if (ld->logicalfontstring != NULL)
136 /* Changing logical font */
137 GtkStyle *fontstyle = gtk_rc_get_style_by_paths (gtk_settings_get_default (), ld->logicalfontstring, NULL, G_TYPE_NONE);
138 if (fontstyle != NULL)
140 PangoFontDescription *fontdesc = fontstyle->font_desc;
142 if (fontdesc != NULL)
143 gtk_widget_modify_font (widget, fontdesc);
148 /* FIXME: Compilation workaround for gcc > 3.3 + -pedantic again */
150 g_signal_handlers_unblock_matched (G_OBJECT (widget), G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC,
151 g_signal_lookup ("style_set", G_TYPE_FROM_INSTANCE (widget)),
153 (gpointer) hildon_change_style_recursive_from_ld,
157 static void hildon_logical_data_free (HildonLogicalData *ld)
159 g_free(ld->logicalcolorstring);
160 g_free(ld->logicalfontstring);
165 * hildon_gtk_widget_set_logical_font:
166 * @widget : A @GtkWidget to assign this logical font for.
167 * @logicalfontname : A gchar* with the logical font name to assign to the widget with an "osso-" -prefix.
169 * This function assigns a defined logical font to the @widget and all its child widgets.
170 * It also connects to the "style_set" signal which will retrieve & assign the new font for the given logical name each time the theme is changed.
171 * The returned signal id can be used to disconnect the signal.
173 * Return value : The signal id that is triggered every time theme is changed. 0 if font set failed.
175 gulong hildon_gtk_widget_set_logical_font (GtkWidget *widget, const gchar *logicalfontname)
177 HildonLogicalData *ld;
180 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
181 g_return_val_if_fail (logicalfontname != NULL, 0);
183 ld = g_malloc (sizeof (HildonLogicalData));
187 ld->logicalcolorstring = NULL;
188 ld->logicalfontstring = g_strdup(logicalfontname);
190 /* Change the font now */
191 hildon_change_style_recursive_from_ld (widget, NULL, ld);
193 /* Connect to "style_set" so that the font gets changed whenever theme changes.
195 FIXME: if this function is called multiple times, the old signal
196 handler should be disconnected. However since signal ID is
197 returned, this probably can't be done without breaking backwards
199 signum = g_signal_connect_data (G_OBJECT (widget), "style_set",
200 G_CALLBACK (hildon_change_style_recursive_from_ld),
201 ld, (GClosureNotify) hildon_logical_data_free, 0);
207 * hildon_gtk_widget_set_logical_color:
208 * @widget : A @GtkWidget to assign this logical font for.
209 * @rcflags : @GtkRcFlags enumeration defining whether to assign to FG, BG, TEXT or BASE style.
210 * @state : @GtkStateType indicating to which state to assign the logical color
211 * @logicalcolorname : A gchar* with the logical font name to assign to the widget.
213 * This function assigns a defined logical color to the @widget and all it's child widgets.
214 * It also connects to the "style_set" signal which will retrieve & assign the new color for the given logical name each time the theme is changed.
215 * The returned signal id can be used to disconnect the signal.
217 * Example : If the style you want to modify is bg[NORMAL] then set rcflags to GTK_RC_BG and state to GTK_STATE_NORMAL.
219 * Return value : The signal id that is triggered every time theme is changed. 0 if color set failed.
221 gulong hildon_gtk_widget_set_logical_color (GtkWidget *widget, GtkRcFlags rcflags,
222 GtkStateType state, const gchar *logicalcolorname)
224 HildonLogicalData *ld;
227 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
228 g_return_val_if_fail (logicalcolorname != NULL, 0);
230 ld = g_malloc (sizeof (HildonLogicalData));
232 ld->rcflags = rcflags;
234 ld->logicalcolorstring = g_strdup(logicalcolorname);
235 ld->logicalfontstring = NULL;
237 /* Change the colors now */
238 hildon_change_style_recursive_from_ld (widget, NULL, ld);
240 /* Connect to "style_set" so that the colors gets changed whenever theme
241 changes. FIXME: same as above */
242 signum = g_signal_connect_data (G_OBJECT (widget), "style_set",
243 G_CALLBACK (hildon_change_style_recursive_from_ld),
244 ld, (GClosureNotify) hildon_logical_data_free, 0);