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
,
94 static void yelp_settings_set_if_token (YelpSettings
*settings
,
97 static void gtk_theme_changed (GtkSettings
*gtk_settings
,
99 YelpSettings
*settings
);
100 static void gtk_font_changed (GtkSettings
*gtk_settings
,
102 YelpSettings
*settings
);
103 static void icon_theme_changed (GtkIconTheme
*theme
,
104 YelpSettings
*settings
);
106 static void rgb_to_hsv (gdouble r
,
112 static void hsv_to_hex (gdouble h
,
117 /******************************************************************************/
120 yelp_settings_class_init (YelpSettingsClass
*klass
)
122 GObjectClass
*object_class
= G_OBJECT_CLASS (klass
);
125 object_class
->constructed
= yelp_settings_constructed
;
126 object_class
->dispose
= yelp_settings_dispose
;
127 object_class
->finalize
= yelp_settings_finalize
;
128 object_class
->get_property
= yelp_settings_get_property
;
129 object_class
->set_property
= yelp_settings_set_property
;
131 for (i
= 0; i
< YELP_SETTINGS_NUM_ICONS
; i
++) {
133 case YELP_SETTINGS_ICON_BUG
:
134 icon_names
[i
] = "yelp-note-bug";
136 case YELP_SETTINGS_ICON_IMPORTANT
:
137 icon_names
[i
] = "yelp-note-important";
139 case YELP_SETTINGS_ICON_NOTE
:
140 icon_names
[i
] = "yelp-note";
142 case YELP_SETTINGS_ICON_TIP
:
143 icon_names
[i
] = "yelp-note-tip";
145 case YELP_SETTINGS_ICON_WARNING
:
146 icon_names
[i
] = "yelp-note-warning";
149 g_assert_not_reached ();
153 g_object_class_install_property (object_class
,
155 g_param_spec_object ("gtk-settings",
157 _("A GtkSettings object to get settings from"),
159 G_PARAM_READWRITE
| G_PARAM_STATIC_NAME
|
160 G_PARAM_STATIC_NICK
| G_PARAM_STATIC_BLURB
));
162 g_object_class_install_property (object_class
,
164 g_param_spec_object ("gtk-icon-theme",
166 _("A GtkIconTheme object to get icons from"),
168 G_PARAM_READWRITE
| G_PARAM_STATIC_NAME
|
169 G_PARAM_STATIC_NICK
| G_PARAM_STATIC_BLURB
));
171 g_object_class_install_property (object_class
,
172 PROP_FONT_ADJUSTMENT
,
173 g_param_spec_int ("font-adjustment",
174 _("Font Adjustment"),
175 _("A size adjustment to add to font sizes"),
177 G_PARAM_READWRITE
| G_PARAM_STATIC_NAME
|
178 G_PARAM_STATIC_NICK
| G_PARAM_STATIC_BLURB
));
180 g_object_class_install_property (object_class
,
181 PROP_SHOW_TEXT_CURSOR
,
182 g_param_spec_boolean ("show-text-cursor",
183 _("Show Text Cursor"),
184 _("Show the text cursor or caret for accessible navigation"),
186 G_PARAM_READWRITE
| G_PARAM_STATIC_NAME
|
187 G_PARAM_STATIC_NICK
| G_PARAM_STATIC_BLURB
));
189 g_object_class_install_property (object_class
,
191 g_param_spec_boolean ("editor-mode",
193 _("Enable features useful to editors"),
195 G_PARAM_READWRITE
| G_PARAM_STATIC_NAME
|
196 G_PARAM_STATIC_NICK
| G_PARAM_STATIC_BLURB
));
198 settings_signals
[COLORS_CHANGED
] =
199 g_signal_new ("colors-changed",
200 G_OBJECT_CLASS_TYPE (klass
),
203 g_cclosure_marshal_VOID__VOID
,
206 settings_signals
[FONTS_CHANGED
] =
207 g_signal_new ("fonts-changed",
208 G_OBJECT_CLASS_TYPE (klass
),
211 g_cclosure_marshal_VOID__VOID
,
214 settings_signals
[ICONS_CHANGED
] =
215 g_signal_new ("icons-changed",
216 G_OBJECT_CLASS_TYPE (klass
),
219 g_cclosure_marshal_VOID__VOID
,
222 g_type_class_add_private (klass
, sizeof (YelpSettingsPriv
));
226 yelp_settings_init (YelpSettings
*settings
)
230 settings
->priv
= GET_PRIV (settings
);
231 settings
->priv
->mutex
= g_mutex_new ();
232 settings
->priv
->icon_size
= 24;
234 for (i
= 0; i
< YELP_SETTINGS_NUM_ICONS
; i
++)
235 settings
->priv
->icons
[i
] = NULL
;
236 for (i
= 0; i
< YELP_SETTINGS_NUM_FONTS
; i
++) {
237 settings
->priv
->setfonts
[i
] = NULL
;
238 settings
->priv
->fonts
[i
] = NULL
;
241 settings
->priv
->tokens
= g_hash_table_new_full (g_str_hash
, g_str_equal
,
246 yelp_settings_constructed (GObject
*object
)
248 YelpSettings
*settings
= YELP_SETTINGS (object
);
249 GDBusConnection
*connection
;
250 GVariant
*ret
, *names
;
253 gboolean env_shell
, env_panel
, env_unity
, env_xfce
;
254 GError
*error
= NULL
;
256 connection
= g_bus_get_sync (G_BUS_TYPE_SESSION
, NULL
, &error
);
257 if (connection
== NULL
) {
258 g_warning ("Unable to connect to dbus: %s", error
->message
);
259 g_error_free (error
);
263 ret
= g_dbus_connection_call_sync (connection
,
264 "org.freedesktop.DBus",
265 "/org/freedesktop/DBus",
266 "org.freedesktop.DBus",
269 G_VARIANT_TYPE ("(as)"),
270 G_DBUS_CALL_FLAGS_NONE
,
273 g_warning ("Unable to query dbus: %s", error
->message
);
274 g_error_free (error
);
277 env_shell
= env_panel
= env_unity
= env_xfce
= FALSE
;
278 names
= g_variant_get_child_value (ret
, 0);
279 g_variant_iter_init (&iter
, names
);
280 while (g_variant_iter_loop (&iter
, "&s", &name
)) {
281 if (g_str_equal (name
, "org.gnome.Panel"))
283 else if (g_str_equal (name
, "org.gnome.Shell"))
285 else if (g_str_equal (name
, "com.canonical.Unity"))
287 else if (g_str_equal (name
, "org.xfce.Panel"))
290 g_variant_unref (names
);
291 g_variant_unref (ret
);
293 yelp_settings_set_if_token (settings
, "platform:gnome-shell");
295 yelp_settings_set_if_token (settings
, "platform:xfce");
297 yelp_settings_set_if_token (settings
, "platform:unity");
299 yelp_settings_set_if_token (settings
, "platform:gnome-panel");
301 yelp_settings_set_if_token (settings
, "action:install");
305 yelp_settings_dispose (GObject
*object
)
307 YelpSettings
*settings
= YELP_SETTINGS (object
);
309 G_OBJECT_CLASS (yelp_settings_parent_class
)->dispose (object
);
313 yelp_settings_finalize (GObject
*object
)
315 YelpSettings
*settings
= YELP_SETTINGS (object
);
317 g_mutex_free (settings
->priv
->mutex
);
319 g_hash_table_destroy (settings
->priv
->tokens
);
321 G_OBJECT_CLASS (yelp_settings_parent_class
)->finalize (object
);
325 yelp_settings_get_property (GObject
*object
,
330 YelpSettings
*settings
= YELP_SETTINGS (object
);
333 case PROP_GTK_SETTINGS
:
334 g_value_set_object (value
, settings
->priv
->gtk_settings
);
336 case PROP_GTK_ICON_THEME
:
337 g_value_set_object (value
, settings
->priv
->gtk_icon_theme
);
339 case PROP_FONT_ADJUSTMENT
:
340 g_value_set_int (value
, settings
->priv
->font_adjustment
);
342 case PROP_SHOW_TEXT_CURSOR
:
343 g_value_set_boolean (value
, settings
->priv
->show_text_cursor
);
345 case PROP_EDITOR_MODE
:
346 g_value_set_boolean (value
, settings
->priv
->editor_mode
);
349 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, prop_id
, pspec
);
355 yelp_settings_set_property (GObject
*object
,
360 YelpSettings
*settings
= YELP_SETTINGS (object
);
363 case PROP_GTK_SETTINGS
:
364 if (settings
->priv
->gtk_settings
) {
365 g_signal_handler_disconnect (settings
->priv
->gtk_settings
,
366 settings
->priv
->gtk_theme_changed
);
367 g_signal_handler_disconnect (settings
->priv
->gtk_settings
,
368 settings
->priv
->gtk_font_changed
);
369 g_object_unref (settings
->priv
->gtk_settings
);
371 settings
->priv
->gtk_settings
= g_value_get_object (value
);
372 if (settings
->priv
->gtk_settings
!= NULL
) {
373 g_object_ref (settings
->priv
->gtk_settings
);
374 settings
->priv
->gtk_theme_changed
=
375 g_signal_connect (settings
->priv
->gtk_settings
,
376 "notify::gtk-theme-name",
377 (GCallback
) gtk_theme_changed
,
379 settings
->priv
->gtk_font_changed
=
380 g_signal_connect (settings
->priv
->gtk_settings
,
381 "notify::gtk-font-name",
382 (GCallback
) gtk_font_changed
,
384 gtk_theme_changed (settings
->priv
->gtk_settings
, NULL
, settings
);
385 gtk_font_changed (settings
->priv
->gtk_settings
, NULL
, settings
);
388 settings
->priv
->gtk_theme_changed
= 0;
389 settings
->priv
->gtk_font_changed
= 0;
392 case PROP_GTK_ICON_THEME
:
393 if (settings
->priv
->gtk_icon_theme
) {
394 g_signal_handler_disconnect (settings
->priv
->gtk_icon_theme
,
395 settings
->priv
->icon_theme_changed
);
396 g_object_unref (settings
->priv
->gtk_icon_theme
);
398 settings
->priv
->gtk_icon_theme
= g_value_get_object (value
);
399 if (settings
->priv
->gtk_icon_theme
!= NULL
) {
401 gint search_path_len
, i
;
402 gboolean append_search_path
= TRUE
;
403 gtk_icon_theme_get_search_path (settings
->priv
->gtk_icon_theme
,
404 &search_path
, &search_path_len
);
405 for (i
= search_path_len
- 1; i
>= 0; i
--)
406 if (g_str_equal (search_path
[i
], YELP_ICON_PATH
)) {
407 append_search_path
= FALSE
;
410 if (append_search_path
)
411 gtk_icon_theme_append_search_path (settings
->priv
->gtk_icon_theme
,
413 append_search_path
= TRUE
;
414 for (i
= search_path_len
- 1; i
>= 0; i
--)
415 if (g_str_equal (search_path
[i
], DATADIR
"/yelp/icons")) {
416 append_search_path
= FALSE
;
419 if (append_search_path
)
420 gtk_icon_theme_append_search_path (settings
->priv
->gtk_icon_theme
,
421 DATADIR
"/yelp/icons");
422 g_strfreev (search_path
);
423 g_object_ref (settings
->priv
->gtk_icon_theme
);
424 settings
->priv
->icon_theme_changed
=
425 g_signal_connect (settings
->priv
->gtk_icon_theme
,
427 (GCallback
) icon_theme_changed
,
429 icon_theme_changed (settings
->priv
->gtk_icon_theme
, settings
);
432 settings
->priv
->icon_theme_changed
= 0;
435 case PROP_FONT_ADJUSTMENT
:
436 settings
->priv
->font_adjustment
= g_value_get_int (value
);
437 gtk_font_changed (settings
->priv
->gtk_settings
, NULL
, settings
);
439 case PROP_SHOW_TEXT_CURSOR
:
440 settings
->priv
->show_text_cursor
= g_value_get_boolean (value
);
442 case PROP_EDITOR_MODE
:
443 settings
->priv
->editor_mode
= g_value_get_boolean (value
);
446 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, prop_id
, pspec
);
451 /******************************************************************************/
454 yelp_settings_get_default (void)
456 static GStaticMutex mutex
= G_STATIC_MUTEX_INIT
;
457 static YelpSettings
*settings
= NULL
;
458 g_static_mutex_lock (&mutex
);
459 if (settings
== NULL
)
460 settings
= g_object_new (YELP_TYPE_SETTINGS
,
461 "gtk-settings", gtk_settings_get_default (),
462 "gtk-icon-theme", gtk_icon_theme_get_default (),
464 g_static_mutex_unlock (&mutex
);
468 /******************************************************************************/
471 yelp_settings_get_color (YelpSettings
*settings
,
472 YelpSettingsColor color
)
475 g_return_val_if_fail (color
< YELP_SETTINGS_NUM_COLORS
, NULL
);
477 g_mutex_lock (settings
->priv
->mutex
);
478 colorstr
= g_strdup (settings
->priv
->colors
[color
]);
479 g_mutex_unlock (settings
->priv
->mutex
);
485 yelp_settings_get_colors (YelpSettings
*settings
)
487 gchar
**colors
= g_new0 (gchar
*, YELP_SETTINGS_NUM_COLORS
+ 1);
489 for (i
= 0; i
< YELP_SETTINGS_NUM_COLORS
; i
++)
490 colors
[i
] = yelp_settings_get_color (settings
, i
);
495 yelp_settings_set_colors (YelpSettings
*settings
,
496 YelpSettingsColor first_color
,
499 YelpSettingsColor color
;
502 g_mutex_lock (settings
->priv
->mutex
);
503 va_start (args
, first_color
);
506 while ((gint
) color
>= 0) {
507 gchar
*colorstr
= va_arg (args
, gchar
*);
509 for (i
= 0; i
< 7; i
++) {
510 settings
->priv
->colors
[color
][i
] = colorstr
[i
];
511 if (colorstr
[i
] == '\0')
514 settings
->priv
->colors
[color
][7] = '\0';
515 color
= va_arg (args
, YelpSettingsColor
);
519 g_mutex_unlock (settings
->priv
->mutex
);
521 g_signal_emit (settings
, settings_signals
[COLORS_CHANGED
], 0);
525 yelp_settings_get_color_param (YelpSettingsColor color
)
527 static const gchar
*params
[YELP_SETTINGS_NUM_COLORS
] = {
533 "color.gray_background",
534 "color.dark_background",
536 "color.blue_background",
538 "color.red_background",
540 "color.yellow_background",
541 "color.yellow_border"
543 g_return_val_if_fail (color
< YELP_SETTINGS_NUM_COLORS
, NULL
);
544 return params
[color
];
547 /******************************************************************************/
550 yelp_settings_get_font (YelpSettings
*settings
,
551 YelpSettingsFont font
)
554 g_return_val_if_fail (font
< YELP_SETTINGS_NUM_FONTS
, NULL
);
556 g_mutex_lock (settings
->priv
->mutex
);
557 if (settings
->priv
->setfonts
[font
])
558 ret
= g_strdup (settings
->priv
->setfonts
[font
]);
560 ret
= g_strdup (settings
->priv
->fonts
[font
]);
561 g_mutex_unlock (settings
->priv
->mutex
);
567 yelp_settings_get_font_family (YelpSettings
*settings
,
568 YelpSettingsFont font
)
570 const gchar
*def
= (font
== YELP_SETTINGS_FONT_VARIABLE
) ? "Sans" : "Monospace";
571 gchar
*desc
, *ret
, *c
; /* do not free */
572 g_return_val_if_fail (font
< YELP_SETTINGS_NUM_FONTS
, NULL
);
574 g_mutex_lock (settings
->priv
->mutex
);
576 if (settings
->priv
->setfonts
[font
])
577 desc
= g_strdup (settings
->priv
->setfonts
[font
]);
579 desc
= g_strdup (settings
->priv
->fonts
[font
]);
582 ret
= g_strdup (def
);
586 c
= strrchr (desc
, ' ');
588 g_warning ("Cannot parse font: %s", desc
);
589 ret
= g_strdup (def
);
593 ret
= g_strndup (desc
, c
- desc
);
596 g_mutex_unlock (settings
->priv
->mutex
);
601 yelp_settings_get_font_size (YelpSettings
*settings
,
602 YelpSettingsFont font
)
604 gchar
*desc
, *c
; /* do not free */
606 g_return_val_if_fail (font
< YELP_SETTINGS_NUM_FONTS
, 0);
608 g_mutex_lock (settings
->priv
->mutex
);
610 if (settings
->priv
->setfonts
[font
])
611 desc
= g_strdup (settings
->priv
->setfonts
[font
]);
613 desc
= g_strdup (settings
->priv
->fonts
[font
]);
620 c
= strrchr (desc
, ' ');
622 g_warning ("Cannot parse font %s", desc
);
627 ret
= g_ascii_strtod (c
, NULL
);
630 g_mutex_unlock (settings
->priv
->mutex
);
631 ret
+= settings
->priv
->font_adjustment
;
632 ret
= (ret
< 5) ? 5 : ret
;
637 yelp_settings_set_fonts (YelpSettings
*settings
,
638 YelpSettingsFont first_font
,
641 YelpSettingsFont font
;
644 g_mutex_lock (settings
->priv
->mutex
);
645 va_start (args
, first_font
);
648 while ((gint
) font
>= 0) {
649 gchar
*fontname
= va_arg (args
, gchar
*);
650 if (settings
->priv
->setfonts
[font
] != NULL
)
651 g_free (settings
->priv
->setfonts
[font
]);
652 settings
->priv
->setfonts
[font
] = g_strdup (fontname
);
653 font
= va_arg (args
, YelpSettingsFont
);
657 g_mutex_unlock (settings
->priv
->mutex
);
659 g_signal_emit (settings
, settings_signals
[FONTS_CHANGED
], 0);
663 yelp_settings_get_font_adjustment (YelpSettings
*settings
)
665 return settings
->priv
->font_adjustment
;
669 yelp_settings_set_font_adjustment (YelpSettings
*settings
,
672 g_object_set (settings
, "font-adjustment", adjustment
, NULL
);
675 /******************************************************************************/
678 yelp_settings_get_icon_size (YelpSettings
*settings
)
680 return settings
->priv
->icon_size
;
684 yelp_settings_set_icon_size (YelpSettings
*settings
,
687 settings
->priv
->icon_size
= size
;
688 if (settings
->priv
->gtk_icon_theme
!= NULL
)
689 icon_theme_changed (settings
->priv
->gtk_icon_theme
, settings
);
693 yelp_settings_get_icon (YelpSettings
*settings
,
694 YelpSettingsIcon icon
)
697 g_return_val_if_fail (icon
< YELP_SETTINGS_NUM_ICONS
, NULL
);
699 g_mutex_lock (settings
->priv
->mutex
);
700 ret
= g_strdup (settings
->priv
->icons
[icon
]);
701 g_mutex_unlock (settings
->priv
->mutex
);
707 yelp_settings_set_icons (YelpSettings
*settings
,
708 YelpSettingsIcon first_icon
,
711 YelpSettingsIcon icon
;
714 g_mutex_lock (settings
->priv
->mutex
);
715 va_start (args
, first_icon
);
718 while ((gint
) icon
>= 0) {
719 gchar
*filename
= va_arg (args
, gchar
*);
720 if (settings
->priv
->icons
[icon
] != NULL
)
721 g_free (settings
->priv
->icons
[icon
]);
722 settings
->priv
->icons
[icon
] = g_filename_to_uri (filename
, NULL
, NULL
);
723 icon
= va_arg (args
, YelpSettingsIcon
);
727 g_mutex_unlock (settings
->priv
->mutex
);
729 g_signal_emit (settings
, settings_signals
[ICONS_CHANGED
], 0);
733 yelp_settings_get_icon_param (YelpSettingsIcon icon
)
735 static const gchar
*params
[YELP_SETTINGS_NUM_ICONS
] = {
737 "icons.note.important",
742 g_return_val_if_fail (icon
< YELP_SETTINGS_NUM_ICONS
, NULL
);
746 /******************************************************************************/
749 yelp_settings_get_show_text_cursor (YelpSettings
*settings
)
751 return settings
->priv
->show_text_cursor
;
755 yelp_settings_set_show_text_cursor (YelpSettings
*settings
,
758 g_object_set (settings
, "show-text-cursor", show
, NULL
);
762 yelp_settings_get_editor_mode (YelpSettings
*settings
)
764 return settings
->priv
->editor_mode
;
768 yelp_settings_set_editor_mode (YelpSettings
*settings
,
769 gboolean editor_mode
)
771 g_object_set (settings
, "editor-mode", editor_mode
, NULL
);
774 /******************************************************************************/
777 yelp_settings_set_if_token (YelpSettings
*settings
,
780 if (g_hash_table_lookup (settings
->priv
->tokens
, token
) == NULL
) {
781 gchar
*ins
= g_strdup (token
);
782 g_hash_table_insert (settings
->priv
->tokens
, ins
, ins
);
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 ("'");
827 envs
= g_hash_table_get_keys (settings
->priv
->tokens
);
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.custom");
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
);