1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3
* Copyright (C) 2004-2009 Shaun McCance <shaunm@gnome.org>
5
* This program is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU General Public License as
7
* published by the Free Software Foundation; either version 2 of the
8
* License, or (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
* General Public License for more details.
15
* You should have received a copy of the GNU General Public
16
* License along with this program; if not, write to the
17
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18
* Boston, MA 02111-1307, USA.
20
* Author: Shaun McCance <shaunm@gnome.org>
30
#include <glib/gi18n.h>
32
#include "yelp-settings.h"
34
struct _YelpSettingsPriv {
37
gchar colors[YELP_SETTINGS_NUM_COLORS][8];
38
gchar *setfonts[YELP_SETTINGS_NUM_FONTS];
39
gchar *fonts[YELP_SETTINGS_NUM_FONTS];
40
gchar *icons[YELP_SETTINGS_NUM_ICONS];
43
GtkSettings *gtk_settings;
44
GtkIconTheme *gtk_icon_theme;
48
gulong gtk_theme_changed;
49
gulong gtk_font_changed;
50
gulong icon_theme_changed;
52
gboolean show_text_cursor;
65
static guint settings_signals[LAST_SIGNAL] = {0,};
72
PROP_SHOW_TEXT_CURSOR,
76
gchar *icon_names[YELP_SETTINGS_NUM_ICONS];
78
G_DEFINE_TYPE (YelpSettings, yelp_settings, G_TYPE_OBJECT);
79
#define GET_PRIV(object) (G_TYPE_INSTANCE_GET_PRIVATE ((object), YELP_TYPE_SETTINGS, YelpSettingsPriv))
81
static void yelp_settings_class_init (YelpSettingsClass *klass);
82
static void yelp_settings_init (YelpSettings *settings);
83
static void yelp_settings_constructed (GObject *object);
84
static void yelp_settings_dispose (GObject *object);
85
static void yelp_settings_finalize (GObject *object);
86
static void yelp_settings_get_property (GObject *object,
90
static void yelp_settings_set_property (GObject *object,
95
static void gtk_theme_changed (GtkSettings *gtk_settings,
97
YelpSettings *settings);
98
static void gtk_font_changed (GtkSettings *gtk_settings,
100
YelpSettings *settings);
101
static void icon_theme_changed (GtkIconTheme *theme,
102
YelpSettings *settings);
104
static void rgb_to_hsv (gdouble r,
110
static void hsv_to_hex (gdouble h,
115
/******************************************************************************/
118
yelp_settings_class_init (YelpSettingsClass *klass)
120
GObjectClass *object_class = G_OBJECT_CLASS (klass);
123
object_class->constructed = yelp_settings_constructed;
124
object_class->dispose = yelp_settings_dispose;
125
object_class->finalize = yelp_settings_finalize;
126
object_class->get_property = yelp_settings_get_property;
127
object_class->set_property = yelp_settings_set_property;
129
for (i = 0; i < YELP_SETTINGS_NUM_ICONS; i++) {
131
case YELP_SETTINGS_ICON_BUG:
132
icon_names[i] = "yelp-note-bug";
134
case YELP_SETTINGS_ICON_IMPORTANT:
135
icon_names[i] = "yelp-note-important";
137
case YELP_SETTINGS_ICON_NOTE:
138
icon_names[i] = "yelp-note";
140
case YELP_SETTINGS_ICON_TIP:
141
icon_names[i] = "yelp-note-tip";
143
case YELP_SETTINGS_ICON_WARNING:
144
icon_names[i] = "yelp-note-warning";
147
g_assert_not_reached ();
151
g_object_class_install_property (object_class,
153
g_param_spec_object ("gtk-settings",
155
_("A GtkSettings object to get settings from"),
157
G_PARAM_READWRITE | G_PARAM_STATIC_NAME |
158
G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
160
g_object_class_install_property (object_class,
162
g_param_spec_object ("gtk-icon-theme",
164
_("A GtkIconTheme object to get icons from"),
166
G_PARAM_READWRITE | G_PARAM_STATIC_NAME |
167
G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
169
g_object_class_install_property (object_class,
170
PROP_FONT_ADJUSTMENT,
171
g_param_spec_int ("font-adjustment",
172
_("Font Adjustment"),
173
_("A size adjustment to add to font sizes"),
175
G_PARAM_READWRITE | G_PARAM_STATIC_NAME |
176
G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
178
g_object_class_install_property (object_class,
179
PROP_SHOW_TEXT_CURSOR,
180
g_param_spec_boolean ("show-text-cursor",
181
_("Show Text Cursor"),
182
_("Show the text cursor or caret for accessible navigation"),
184
G_PARAM_READWRITE | G_PARAM_STATIC_NAME |
185
G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
187
g_object_class_install_property (object_class,
189
g_param_spec_boolean ("editor-mode",
191
_("Enable features useful to editors"),
193
G_PARAM_READWRITE | G_PARAM_STATIC_NAME |
194
G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
196
settings_signals[COLORS_CHANGED] =
197
g_signal_new ("colors-changed",
198
G_OBJECT_CLASS_TYPE (klass),
201
g_cclosure_marshal_VOID__VOID,
204
settings_signals[FONTS_CHANGED] =
205
g_signal_new ("fonts-changed",
206
G_OBJECT_CLASS_TYPE (klass),
209
g_cclosure_marshal_VOID__VOID,
212
settings_signals[ICONS_CHANGED] =
213
g_signal_new ("icons-changed",
214
G_OBJECT_CLASS_TYPE (klass),
217
g_cclosure_marshal_VOID__VOID,
220
g_type_class_add_private (klass, sizeof (YelpSettingsPriv));
224
yelp_settings_init (YelpSettings *settings)
228
settings->priv = GET_PRIV (settings);
229
settings->priv->mutex = g_mutex_new ();
230
settings->priv->icon_size = 24;
232
for (i = 0; i < YELP_SETTINGS_NUM_ICONS; i++)
233
settings->priv->icons[i] = NULL;
234
for (i = 0; i < YELP_SETTINGS_NUM_FONTS; i++) {
235
settings->priv->setfonts[i] = NULL;
236
settings->priv->fonts[i] = NULL;
239
settings->priv->env = g_hash_table_new_full (g_str_hash, g_str_equal,
244
yelp_settings_constructed (GObject *object)
246
YelpSettings *settings = YELP_SETTINGS (object);
247
GDBusConnection *connection;
248
GVariant *ret, *names;
251
GError *error = NULL;
253
connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL);
254
if (connection == NULL) {
255
g_warning ("Unable to connect to dbus: %s", error->message);
256
g_error_free (error);
260
ret = g_dbus_connection_call_sync (connection,
261
"org.freedesktop.DBus",
262
"/org/freedesktop/DBus",
263
"org.freedesktop.DBus",
266
G_VARIANT_TYPE ("(as)"),
267
G_DBUS_CALL_FLAGS_NONE,
270
g_warning ("Unable to query dbus: %s", error->message);
271
g_error_free (error);
274
names = g_variant_get_child_value (ret, 0);
275
g_variant_iter_init (&iter, names);
276
while (g_variant_iter_loop (&iter, "&s", &name)) {
277
if (g_str_equal (name, "org.gnome.Panel"))
278
yelp_settings_set_env (settings, "gnome-panel");
279
else if (g_str_equal (name, "org.gnome.Shell"))
280
yelp_settings_set_env (settings, "gnome-shell");
281
else if (g_str_equal (name, "com.canonical.Unity"))
282
yelp_settings_set_env (settings, "unity");
283
else if (g_str_equal (name, "org.xfce.Panel"))
284
yelp_settings_set_env (settings, "xfce");
286
g_variant_unref (names);
287
g_variant_unref (ret);
291
yelp_settings_dispose (GObject *object)
293
YelpSettings *settings = YELP_SETTINGS (object);
295
G_OBJECT_CLASS (yelp_settings_parent_class)->dispose (object);
299
yelp_settings_finalize (GObject *object)
301
YelpSettings *settings = YELP_SETTINGS (object);
303
g_mutex_free (settings->priv->mutex);
305
g_hash_table_destroy (settings->priv->env);
307
G_OBJECT_CLASS (yelp_settings_parent_class)->finalize (object);
311
yelp_settings_get_property (GObject *object,
316
YelpSettings *settings = YELP_SETTINGS (object);
319
case PROP_GTK_SETTINGS:
320
g_value_set_object (value, settings->priv->gtk_settings);
322
case PROP_GTK_ICON_THEME:
323
g_value_set_object (value, settings->priv->gtk_icon_theme);
325
case PROP_FONT_ADJUSTMENT:
326
g_value_set_int (value, settings->priv->font_adjustment);
328
case PROP_SHOW_TEXT_CURSOR:
329
g_value_set_boolean (value, settings->priv->show_text_cursor);
331
case PROP_EDITOR_MODE:
332
g_value_set_boolean (value, settings->priv->editor_mode);
335
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
341
yelp_settings_set_property (GObject *object,
346
YelpSettings *settings = YELP_SETTINGS (object);
349
case PROP_GTK_SETTINGS:
350
if (settings->priv->gtk_settings) {
351
g_signal_handler_disconnect (settings->priv->gtk_settings,
352
settings->priv->gtk_theme_changed);
353
g_signal_handler_disconnect (settings->priv->gtk_settings,
354
settings->priv->gtk_font_changed);
355
g_object_unref (settings->priv->gtk_settings);
357
settings->priv->gtk_settings = g_value_get_object (value);
358
if (settings->priv->gtk_settings != NULL) {
359
g_object_ref (settings->priv->gtk_settings);
360
settings->priv->gtk_theme_changed =
361
g_signal_connect (settings->priv->gtk_settings,
362
"notify::gtk-theme-name",
363
(GCallback) gtk_theme_changed,
365
settings->priv->gtk_font_changed =
366
g_signal_connect (settings->priv->gtk_settings,
367
"notify::gtk-font-name",
368
(GCallback) gtk_font_changed,
370
gtk_theme_changed (settings->priv->gtk_settings, NULL, settings);
371
gtk_font_changed (settings->priv->gtk_settings, NULL, settings);
374
settings->priv->gtk_theme_changed = 0;
375
settings->priv->gtk_font_changed = 0;
378
case PROP_GTK_ICON_THEME:
379
if (settings->priv->gtk_icon_theme) {
380
g_signal_handler_disconnect (settings->priv->gtk_icon_theme,
381
settings->priv->icon_theme_changed);
382
g_object_unref (settings->priv->gtk_icon_theme);
384
settings->priv->gtk_icon_theme = g_value_get_object (value);
385
if (settings->priv->gtk_icon_theme != NULL) {
387
gint search_path_len, i;
388
gboolean append_search_path = TRUE;
389
gtk_icon_theme_get_search_path (settings->priv->gtk_icon_theme,
390
&search_path, &search_path_len);
391
for (i = search_path_len - 1; i >= 0; i--)
392
if (g_str_equal (search_path[i], YELP_ICON_PATH)) {
393
append_search_path = FALSE;
396
if (append_search_path)
397
gtk_icon_theme_append_search_path (settings->priv->gtk_icon_theme,
399
append_search_path = TRUE;
400
for (i = search_path_len - 1; i >= 0; i--)
401
if (g_str_equal (search_path[i], DATADIR"/yelp/icons")) {
402
append_search_path = FALSE;
405
if (append_search_path)
406
gtk_icon_theme_append_search_path (settings->priv->gtk_icon_theme,
407
DATADIR"/yelp/icons");
408
g_strfreev (search_path);
409
g_object_ref (settings->priv->gtk_icon_theme);
410
settings->priv->icon_theme_changed =
411
g_signal_connect (settings->priv->gtk_icon_theme,
413
(GCallback) icon_theme_changed,
415
icon_theme_changed (settings->priv->gtk_icon_theme, settings);
418
settings->priv->icon_theme_changed = 0;
421
case PROP_FONT_ADJUSTMENT:
422
settings->priv->font_adjustment = g_value_get_int (value);
423
gtk_font_changed (settings->priv->gtk_settings, NULL, settings);
425
case PROP_SHOW_TEXT_CURSOR:
426
settings->priv->show_text_cursor = g_value_get_boolean (value);
428
case PROP_EDITOR_MODE:
429
settings->priv->editor_mode = g_value_get_boolean (value);
432
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
437
/******************************************************************************/
440
yelp_settings_get_default (void)
442
static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
443
static YelpSettings *settings = NULL;
444
g_static_mutex_lock (&mutex);
445
if (settings == NULL)
446
settings = g_object_new (YELP_TYPE_SETTINGS,
447
"gtk-settings", gtk_settings_get_default (),
448
"gtk-icon-theme", gtk_icon_theme_get_default (),
450
g_static_mutex_unlock (&mutex);
454
/******************************************************************************/
457
yelp_settings_get_color (YelpSettings *settings,
458
YelpSettingsColor color)
461
g_return_val_if_fail (color < YELP_SETTINGS_NUM_COLORS, NULL);
463
g_mutex_lock (settings->priv->mutex);
464
colorstr = g_strdup (settings->priv->colors[color]);
465
g_mutex_unlock (settings->priv->mutex);
471
yelp_settings_get_colors (YelpSettings *settings)
473
gchar **colors = g_new0 (gchar *, YELP_SETTINGS_NUM_COLORS + 1);
475
for (i = 0; i < YELP_SETTINGS_NUM_COLORS; i++)
476
colors[i] = yelp_settings_get_color (settings, i);
481
yelp_settings_set_colors (YelpSettings *settings,
482
YelpSettingsColor first_color,
485
YelpSettingsColor color;
488
g_mutex_lock (settings->priv->mutex);
489
va_start (args, first_color);
492
while ((gint) color >= 0) {
493
gchar *colorstr = va_arg (args, gchar *);
495
for (i = 0; i < 7; i++) {
496
settings->priv->colors[color][i] = colorstr[i];
497
if (colorstr[i] == '\0')
500
settings->priv->colors[color][7] = '\0';
501
color = va_arg (args, YelpSettingsColor);
505
g_mutex_unlock (settings->priv->mutex);
507
g_signal_emit (settings, settings_signals[COLORS_CHANGED], 0);
511
yelp_settings_get_color_param (YelpSettingsColor color)
513
static const gchar *params[YELP_SETTINGS_NUM_COLORS] = {
519
"color.gray_background",
520
"color.dark_background",
522
"color.blue_background",
524
"color.red_background",
526
"color.yellow_background",
527
"color.yellow_border"
529
g_return_val_if_fail (color < YELP_SETTINGS_NUM_COLORS, NULL);
530
return params[color];
533
/******************************************************************************/
536
yelp_settings_get_font (YelpSettings *settings,
537
YelpSettingsFont font)
540
g_return_val_if_fail (font < YELP_SETTINGS_NUM_FONTS, NULL);
542
g_mutex_lock (settings->priv->mutex);
543
if (settings->priv->setfonts[font])
544
ret = g_strdup (settings->priv->setfonts[font]);
546
ret = g_strdup (settings->priv->fonts[font]);
547
g_mutex_unlock (settings->priv->mutex);
553
yelp_settings_get_font_family (YelpSettings *settings,
554
YelpSettingsFont font)
556
const gchar *def = (font == YELP_SETTINGS_FONT_VARIABLE) ? "Sans" : "Monospace";
557
gchar *desc, *ret, *c; /* do not free */
558
g_return_val_if_fail (font < YELP_SETTINGS_NUM_FONTS, NULL);
560
g_mutex_lock (settings->priv->mutex);
562
if (settings->priv->setfonts[font])
563
desc = g_strdup (settings->priv->setfonts[font]);
565
desc = g_strdup (settings->priv->fonts[font]);
568
ret = g_strdup (def);
572
c = strrchr (desc, ' ');
574
g_warning ("Cannot parse font: %s", desc);
575
ret = g_strdup (def);
579
ret = g_strndup (desc, c - desc);
582
g_mutex_unlock (settings->priv->mutex);
587
yelp_settings_get_font_size (YelpSettings *settings,
588
YelpSettingsFont font)
590
gchar *desc, *c; /* do not free */
592
g_return_val_if_fail (font < YELP_SETTINGS_NUM_FONTS, 0);
594
g_mutex_lock (settings->priv->mutex);
596
if (settings->priv->setfonts[font])
597
desc = g_strdup (settings->priv->setfonts[font]);
599
desc = g_strdup (settings->priv->fonts[font]);
606
c = strrchr (desc, ' ');
608
g_warning ("Cannot parse font %s", desc);
613
ret = g_ascii_strtod (c, NULL);
616
g_mutex_unlock (settings->priv->mutex);
617
ret += settings->priv->font_adjustment;
618
ret = (ret < 5) ? 5 : ret;
623
yelp_settings_set_fonts (YelpSettings *settings,
624
YelpSettingsFont first_font,
627
YelpSettingsFont font;
630
g_mutex_lock (settings->priv->mutex);
631
va_start (args, first_font);
634
while ((gint) font >= 0) {
635
gchar *fontname = va_arg (args, gchar *);
636
if (settings->priv->setfonts[font] != NULL)
637
g_free (settings->priv->setfonts[font]);
638
settings->priv->setfonts[font] = g_strdup (fontname);
639
font = va_arg (args, YelpSettingsFont);
643
g_mutex_unlock (settings->priv->mutex);
645
g_signal_emit (settings, settings_signals[FONTS_CHANGED], 0);
649
yelp_settings_get_font_adjustment (YelpSettings *settings)
651
return settings->priv->font_adjustment;
655
yelp_settings_set_font_adjustment (YelpSettings *settings,
658
g_object_set (settings, "font-adjustment", adjustment, NULL);
661
/******************************************************************************/
664
yelp_settings_get_icon_size (YelpSettings *settings)
666
return settings->priv->icon_size;
670
yelp_settings_set_icon_size (YelpSettings *settings,
673
settings->priv->icon_size = size;
674
if (settings->priv->gtk_icon_theme != NULL)
675
icon_theme_changed (settings->priv->gtk_icon_theme, settings);
679
yelp_settings_get_icon (YelpSettings *settings,
680
YelpSettingsIcon icon)
683
g_return_val_if_fail (icon < YELP_SETTINGS_NUM_ICONS, NULL);
685
g_mutex_lock (settings->priv->mutex);
686
ret = g_strdup (settings->priv->icons[icon]);
687
g_mutex_unlock (settings->priv->mutex);
693
yelp_settings_set_icons (YelpSettings *settings,
694
YelpSettingsIcon first_icon,
697
YelpSettingsIcon icon;
700
g_mutex_lock (settings->priv->mutex);
701
va_start (args, first_icon);
704
while ((gint) icon >= 0) {
705
gchar *filename = va_arg (args, gchar *);
706
if (settings->priv->icons[icon] != NULL)
707
g_free (settings->priv->icons[icon]);
708
settings->priv->icons[icon] = g_filename_to_uri (filename, NULL, NULL);
709
icon = va_arg (args, YelpSettingsIcon);
713
g_mutex_unlock (settings->priv->mutex);
715
g_signal_emit (settings, settings_signals[ICONS_CHANGED], 0);
719
yelp_settings_get_icon_param (YelpSettingsIcon icon)
721
static const gchar *params[YELP_SETTINGS_NUM_ICONS] = {
723
"icons.note.important",
728
g_return_val_if_fail (icon < YELP_SETTINGS_NUM_ICONS, NULL);
732
/******************************************************************************/
735
yelp_settings_get_show_text_cursor (YelpSettings *settings)
737
return settings->priv->show_text_cursor;
741
yelp_settings_set_show_text_cursor (YelpSettings *settings,
744
g_object_set (settings, "show-text-cursor", show, NULL);
748
yelp_settings_get_editor_mode (YelpSettings *settings)
750
return settings->priv->editor_mode;
754
yelp_settings_set_editor_mode (YelpSettings *settings,
755
gboolean editor_mode)
757
g_object_set (settings, "editor-mode", editor_mode, NULL);
760
/******************************************************************************/
763
yelp_settings_set_env (YelpSettings *settings,
766
if (g_hash_table_lookup (settings->priv->env, env) == NULL) {
767
gchar *ins = g_strdup (env);
768
g_hash_table_insert (settings->priv->env, ins, ins);
773
yelp_settings_unset_env (YelpSettings *settings,
776
g_hash_table_remove (settings->priv->env, env);
780
yelp_settings_check_env (YelpSettings *settings,
783
return (g_hash_table_lookup (settings->priv->env, env) != NULL);
786
/******************************************************************************/
789
yelp_settings_get_all_params (YelpSettings *settings,
798
params = g_new0 (gchar *,
799
(2*YELP_SETTINGS_NUM_COLORS) + (2*YELP_SETTINGS_NUM_ICONS) + extra + 7);
801
for (i = 0; i < YELP_SETTINGS_NUM_COLORS; i++) {
804
params[ix] = g_strdup (yelp_settings_get_color_param (i));
805
val = yelp_settings_get_color (settings, i);
806
params[ix + 1] = g_strdup_printf ("\"%s\"", val);
809
for (i = 0; i < YELP_SETTINGS_NUM_ICONS; i++) {
811
ix = 2 * (YELP_SETTINGS_NUM_COLORS + i);
812
params[ix] = g_strdup (yelp_settings_get_icon_param (i));
813
val = yelp_settings_get_icon (settings, i);
814
params[ix + 1] = g_strdup_printf ("\"%s\"", val);
817
ix = 2 * (YELP_SETTINGS_NUM_COLORS + YELP_SETTINGS_NUM_ICONS);
818
params[ix++] = g_strdup ("icons.size.note");
819
params[ix++] = g_strdup_printf ("%i", yelp_settings_get_icon_size (settings));
820
params[ix++] = g_strdup ("yelp.editor_mode");
821
if (settings->priv->editor_mode)
822
params[ix++] = g_strdup ("true()");
824
params[ix++] = g_strdup ("false()");
826
envstr = g_string_new ("'html");
827
envs = g_hash_table_get_keys (settings->priv->env);
828
for (envi = envs; envi != NULL; envi = envi->next) {
829
g_string_append_c (envstr, ' ');
830
g_string_append (envstr, (gchar *) envi->data);
832
g_string_append_c (envstr, '\'');
834
params[ix++] = g_strdup ("mal.if.env");
835
params[ix++] = g_string_free (envstr, FALSE);
844
/******************************************************************************/
847
gtk_theme_changed (GtkSettings *gtk_settings,
849
YelpSettings *settings)
854
GdkColor blue = { 0, 0x1E1E, 0x3E3E, 0xE7E7 };
855
gdouble base_h, base_s, base_v;
856
gdouble text_h, text_s, text_v;
859
g_mutex_lock (settings->priv->mutex);
861
style = gtk_rc_get_style_by_paths (gtk_settings,
862
"GtkTextView", "GtkTextView",
865
g_object_ref (G_OBJECT (style));
867
style = gtk_style_new ();
870
rgb_to_hsv (style->text[GTK_STATE_NORMAL].red / 65535.0,
871
style->text[GTK_STATE_NORMAL].green / 65535.0,
872
style->text[GTK_STATE_NORMAL].blue / 65535.0,
873
&text_h, &text_s, &text_v);
874
rgb_to_hsv (style->base[GTK_STATE_NORMAL].red / 65535.0,
875
style->base[GTK_STATE_NORMAL].green / 65535.0,
876
style->base[GTK_STATE_NORMAL].blue / 65535.0,
877
&base_h, &base_s, &base_v);
879
/* YELP_SETTINGS_COLOR_BASE */
880
g_snprintf (settings->priv->colors[YELP_SETTINGS_COLOR_BASE], 8,
882
style->base[GTK_STATE_NORMAL].red >> 8,
883
style->base[GTK_STATE_NORMAL].green >> 8,
884
style->base[GTK_STATE_NORMAL].blue >> 8);
886
/* YELP_SETTINGS_COLOR_TEXT */
887
g_snprintf (settings->priv->colors[YELP_SETTINGS_COLOR_TEXT], 8,
889
style->text[GTK_STATE_NORMAL].red >> 8,
890
style->text[GTK_STATE_NORMAL].green >> 8,
891
style->text[GTK_STATE_NORMAL].blue >> 8);
893
/* YELP_SETTINGS_COLOR_LINK */
894
widget = gtk_link_button_new ("http://www.gnome.org");
895
gtk_widget_style_get (widget, "link-color", &color, NULL);
898
g_snprintf (settings->priv->colors[YELP_SETTINGS_COLOR_LINK], 8,
904
gdk_color_free (color);
906
/* YELP_SETTINGS_COLOR_LINK_VISITED */
908
gtk_widget_style_get (widget, "visited-link-color", &color, NULL);
910
g_snprintf (settings->priv->colors[YELP_SETTINGS_COLOR_LINK_VISITED], 8,
915
gdk_color_free (color);
918
g_object_ref_sink (widget);
919
g_object_unref (widget);
921
/* YELP_SETTINGS_COLOR_TEXT_LIGHT */
924
text_v - ((text_v - base_v) * 0.25),
925
settings->priv->colors[YELP_SETTINGS_COLOR_TEXT_LIGHT]);
927
/* YELP_SETTINGS_COLOR_GRAY */
930
base_v - ((base_v - text_v) * 0.05),
931
settings->priv->colors[YELP_SETTINGS_COLOR_GRAY_BASE]);
934
base_v - ((base_v - text_v) * 0.1),
935
settings->priv->colors[YELP_SETTINGS_COLOR_DARK_BASE]);
938
base_v - ((base_v - text_v) * 0.26),
939
settings->priv->colors[YELP_SETTINGS_COLOR_GRAY_BORDER]);
941
/* YELP_SETTINGS_COLOR_BLUE */
944
base_v - ((base_v - text_v) * 0.01),
945
settings->priv->colors[YELP_SETTINGS_COLOR_BLUE_BASE]);
948
base_v - ((base_v - text_v) * 0.19),
949
settings->priv->colors[YELP_SETTINGS_COLOR_BLUE_BORDER]);
951
/* YELP_SETTINGS_COLOR_RED */
954
base_v - ((base_v - text_v) * 0.01),
955
settings->priv->colors[YELP_SETTINGS_COLOR_RED_BASE]);
958
base_v - ((base_v - text_v) * 0.06),
959
settings->priv->colors[YELP_SETTINGS_COLOR_RED_BORDER]);
961
/* YELP_SETTINGS_COLOR_YELLOW */
964
base_v - ((base_v - text_v) * 0.01),
965
settings->priv->colors[YELP_SETTINGS_COLOR_YELLOW_BASE]);
968
base_v - ((base_v - text_v) * 0.07),
969
settings->priv->colors[YELP_SETTINGS_COLOR_YELLOW_BORDER]);
971
g_object_unref (G_OBJECT (style));
973
g_mutex_unlock (settings->priv->mutex);
975
g_signal_emit (settings, settings_signals[COLORS_CHANGED], 0);
979
gtk_font_changed (GtkSettings *gtk_settings,
981
YelpSettings *settings)
985
/* This happens when font_adjustment is set during init */
986
if (gtk_settings == NULL)
989
g_free (settings->priv->fonts[YELP_SETTINGS_FONT_VARIABLE]);
990
g_object_get (gtk_settings, "gtk-font-name", &font, NULL);
991
settings->priv->fonts[YELP_SETTINGS_FONT_VARIABLE] = font;
993
c = strrchr (font, ' ');
995
g_warning ("Cannot parse font: %s", font);
996
font = g_strdup ("Monospace 10");
999
font = g_strconcat ("Monospace", c, NULL);
1002
g_free (settings->priv->fonts[YELP_SETTINGS_FONT_FIXED]);
1003
settings->priv->fonts[YELP_SETTINGS_FONT_FIXED] = font;
1005
g_signal_emit (settings, settings_signals[FONTS_CHANGED], 0);
1009
icon_theme_changed (GtkIconTheme *theme,
1010
YelpSettings *settings)
1015
g_mutex_lock (settings->priv->mutex);
1017
for (i = 0; i < YELP_SETTINGS_NUM_ICONS; i++) {
1018
if (settings->priv->icons[i] != NULL)
1019
g_free (settings->priv->icons[i]);
1020
info = gtk_icon_theme_lookup_icon (theme,
1022
settings->priv->icon_size,
1023
GTK_ICON_LOOKUP_NO_SVG);
1025
settings->priv->icons[i] = g_filename_to_uri (gtk_icon_info_get_filename (info),
1027
gtk_icon_info_free (info);
1030
settings->priv->icons[i] = NULL;
1034
g_mutex_unlock (settings->priv->mutex);
1036
g_signal_emit (settings, settings_signals[ICONS_CHANGED], 0);
1040
yelp_settings_cmp_icons (const gchar *icon1,
1043
static const gchar *icons[] = {
1044
"yelp-page-search-symbolic",
1045
"yelp-page-video-symbolic",
1046
"yelp-page-task-symbolic",
1047
"yelp-page-tip-symbolic",
1048
"yelp-page-problem-symbolic",
1049
"yelp-page-ui-symbolic",
1050
"yelp-page-symbolic",
1054
for (i = 0; icons[i] != NULL; i++) {
1055
gboolean eq1 = icon1 ? g_str_has_prefix (icon1, icons[i]) : FALSE;
1056
gboolean eq2 = icon2 ? g_str_has_prefix (icon2, icons[i]) : FALSE;
1064
if (icon1 == NULL && icon2 == NULL)
1066
else if (icon2 == NULL)
1068
else if (icon1 == NULL)
1071
return strcmp (icon1, icon2);
1074
/******************************************************************************/
1077
rgb_to_hsv (gdouble r, gdouble g, gdouble b, gdouble *h, gdouble *s, gdouble *v)
1079
gdouble min, max, delta;
1081
max = (r > g) ? r : g;
1082
max = (max > b) ? max : b;
1083
min = (r < g) ? r : g;
1084
min = (min < b) ? min : b;
1096
*h = (g - b) / delta;
1098
*h = 2 + (b - r) / delta;
1100
*h = 4 + (r - g) / delta;
1109
hsv_to_hex (gdouble h, gdouble s, gdouble v, gchar *str)
1115
guint8 red, green, blue;
1121
m2 = v * (1 - s * (h - hue));
1122
m3 = v * (1 - s * (-h + hue + 1));
1127
b = m1; g = m3; break;
1129
b = m1; r = m2; break;
1131
r = m1; b = m3; break;
1133
r = m1; g = m2; break;
1135
g = m1; r = m3; break;
1137
g = m1; b = m2; break;
1143
g_snprintf (str, 8, "#%02X%02X%02X", red, green, blue);