libgimpwidgets: be smarter when changing icon themes, and have fallbacks
Add gimp_stock_set_icon_theme() which can be called at any time, also before gimp_stock_init(), in which case we avoid setting the configured icon theme twice on startup. Call it from libgimp/gimpui.c and from app/gui/icon-themes.c so the app and plug-ins use the same icon theme.
This commit is contained in:
@ -221,6 +221,11 @@ gui_init (Gimp *gimp,
|
|||||||
gui_unique_init (gimp);
|
gui_unique_init (gimp);
|
||||||
gimp_language_store_parser_init ();
|
gimp_language_store_parser_init ();
|
||||||
|
|
||||||
|
/* initialize icon themes before gimp_widgets_init() so we avoid
|
||||||
|
* setting the configured theme twice
|
||||||
|
*/
|
||||||
|
icon_themes_init (gimp);
|
||||||
|
|
||||||
gimp_widgets_init (gui_help_func,
|
gimp_widgets_init (gui_help_func,
|
||||||
gui_get_foreground_func,
|
gui_get_foreground_func,
|
||||||
gui_get_background_func,
|
gui_get_background_func,
|
||||||
@ -235,8 +240,6 @@ gui_init (Gimp *gimp,
|
|||||||
|
|
||||||
themes_init (gimp);
|
themes_init (gimp);
|
||||||
|
|
||||||
icon_themes_init (gimp);
|
|
||||||
|
|
||||||
initial_monitor = gimp_get_monitor_at_pointer (&initial_screen);
|
initial_monitor = gimp_get_monitor_at_pointer (&initial_screen);
|
||||||
gtk_widget_set_default_colormap (gdk_screen_get_rgb_colormap (initial_screen));
|
gtk_widget_set_default_colormap (gdk_screen_get_rgb_colormap (initial_screen));
|
||||||
|
|
||||||
|
@ -208,10 +208,6 @@ static void
|
|||||||
icons_apply_theme (Gimp *gimp,
|
icons_apply_theme (Gimp *gimp,
|
||||||
const gchar *icon_theme_name)
|
const gchar *icon_theme_name)
|
||||||
{
|
{
|
||||||
GtkIconTheme *icon_theme;
|
|
||||||
gchar **paths;
|
|
||||||
gint n_paths;
|
|
||||||
|
|
||||||
g_return_if_fail (GIMP_IS_GIMP (gimp));
|
g_return_if_fail (GIMP_IS_GIMP (gimp));
|
||||||
|
|
||||||
if (! icon_theme_name)
|
if (! icon_theme_name)
|
||||||
@ -220,22 +216,7 @@ icons_apply_theme (Gimp *gimp,
|
|||||||
if (gimp->be_verbose)
|
if (gimp->be_verbose)
|
||||||
g_print ("Loading icon theme '%s'\n", icon_theme_name);
|
g_print ("Loading icon theme '%s'\n", icon_theme_name);
|
||||||
|
|
||||||
icon_theme = gtk_icon_theme_get_default ();
|
gimp_stock_set_icon_theme (icon_themes_get_theme_dir (gimp, icon_theme_name));
|
||||||
|
|
||||||
gtk_icon_theme_get_search_path (icon_theme, &paths, &n_paths);
|
|
||||||
|
|
||||||
if (paths)
|
|
||||||
{
|
|
||||||
GFile *icon_theme_dir = icon_themes_get_theme_dir (gimp, icon_theme_name);
|
|
||||||
|
|
||||||
g_free (paths[0]);
|
|
||||||
paths[0] = g_file_get_path (icon_theme_dir);
|
|
||||||
|
|
||||||
gtk_icon_theme_set_search_path (icon_theme,
|
|
||||||
(const gchar **) paths, n_paths);
|
|
||||||
|
|
||||||
g_strfreev (paths);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -96,6 +96,7 @@ gimp_ui_init (const gchar *prog_name,
|
|||||||
GdkScreen *screen;
|
GdkScreen *screen;
|
||||||
const gchar *display_name;
|
const gchar *display_name;
|
||||||
gchar *themerc;
|
gchar *themerc;
|
||||||
|
GFile *icon_theme;
|
||||||
|
|
||||||
g_return_if_fail (prog_name != NULL);
|
g_return_if_fail (prog_name != NULL);
|
||||||
|
|
||||||
@ -137,6 +138,10 @@ gimp_ui_init (const gchar *prog_name,
|
|||||||
screen = gdk_screen_get_default ();
|
screen = gdk_screen_get_default ();
|
||||||
gtk_widget_set_default_colormap (gdk_screen_get_rgb_colormap (screen));
|
gtk_widget_set_default_colormap (gdk_screen_get_rgb_colormap (screen));
|
||||||
|
|
||||||
|
icon_theme = g_file_new_for_path (gimp_get_icon_theme_dir ());
|
||||||
|
gimp_stock_set_icon_theme (icon_theme);
|
||||||
|
g_object_unref (icon_theme);
|
||||||
|
|
||||||
gimp_widgets_init (gimp_ui_help_func,
|
gimp_widgets_init (gimp_ui_help_func,
|
||||||
gimp_context_get_foreground,
|
gimp_context_get_foreground,
|
||||||
gimp_context_get_background,
|
gimp_context_get_background,
|
||||||
|
@ -346,6 +346,131 @@ register_bidi_stock_icon (GtkIconFactory *factory,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static GFile *icon_theme_path = NULL;
|
||||||
|
static GFile *default_icon_theme_path = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
gimp_stock_change_icon_theme (GFile *path)
|
||||||
|
{
|
||||||
|
if (! default_icon_theme_path)
|
||||||
|
default_icon_theme_path = gimp_data_directory_file ("icons", "Default",
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
if (! g_file_equal (path, icon_theme_path))
|
||||||
|
{
|
||||||
|
GtkIconTheme *icon_theme = gtk_icon_theme_get_default ();
|
||||||
|
|
||||||
|
if (g_file_equal (icon_theme_path, default_icon_theme_path))
|
||||||
|
{
|
||||||
|
/* if the current icon theme is the default theme, simply
|
||||||
|
* prepend the new theme's path
|
||||||
|
*/
|
||||||
|
gchar *path_str = g_file_get_path (path);
|
||||||
|
|
||||||
|
gtk_icon_theme_prepend_search_path (icon_theme, path_str);
|
||||||
|
g_free (path_str);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* if the current theme is not the default theme, we need
|
||||||
|
* to deal with the search path's first element
|
||||||
|
*/
|
||||||
|
gchar **paths;
|
||||||
|
gint n_paths;
|
||||||
|
|
||||||
|
gtk_icon_theme_get_search_path (icon_theme, &paths, &n_paths);
|
||||||
|
|
||||||
|
if (g_file_equal (path, default_icon_theme_path))
|
||||||
|
{
|
||||||
|
/* when switching to the default theme, remove the
|
||||||
|
* first search path element, the default theme will
|
||||||
|
* still be in the search path as fallback
|
||||||
|
*/
|
||||||
|
gtk_icon_theme_set_search_path (icon_theme,
|
||||||
|
(const gchar **) paths + 1,
|
||||||
|
n_paths - 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* when switching between two non-default themes, replace
|
||||||
|
* the first element of the search path with the new
|
||||||
|
* theme's path
|
||||||
|
*/
|
||||||
|
g_free (paths[0]);
|
||||||
|
paths[0] = g_file_get_path (path);
|
||||||
|
|
||||||
|
gtk_icon_theme_set_search_path (icon_theme,
|
||||||
|
(const gchar **) paths, n_paths);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_strfreev (paths);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_object_unref (icon_theme_path);
|
||||||
|
icon_theme_path = g_object_ref (path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gimp_stock_set_icon_theme (GFile *path)
|
||||||
|
{
|
||||||
|
g_return_if_fail (path == NULL || G_IS_FILE (path));
|
||||||
|
|
||||||
|
if (path)
|
||||||
|
path = g_object_ref (path);
|
||||||
|
else
|
||||||
|
path = gimp_data_directory_file (gimp_data_directory (), "icons", "Default",
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
if (! g_file_query_exists (path, NULL))
|
||||||
|
{
|
||||||
|
g_warning ("Icon theme path does not exist: %s",
|
||||||
|
gimp_file_get_utf8_name (path));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GFile *hicolor = g_file_get_child (path, "hicolor");
|
||||||
|
|
||||||
|
if (! g_file_query_exists (hicolor, NULL))
|
||||||
|
{
|
||||||
|
g_warning ("Icon theme path has no 'hicolor' subdirectory: %s",
|
||||||
|
gimp_file_get_utf8_name (path));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GFile *index = g_file_get_child (hicolor, "index.theme");
|
||||||
|
|
||||||
|
if (! g_file_query_exists (index, NULL))
|
||||||
|
{
|
||||||
|
g_warning ("Icon theme path has no 'hicolor/index.theme': %s",
|
||||||
|
gimp_file_get_utf8_name (path));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* the path points to what looks like a valid icon theme */
|
||||||
|
|
||||||
|
if (icon_theme_path)
|
||||||
|
{
|
||||||
|
/* this is an icon theme change */
|
||||||
|
gimp_stock_change_icon_theme (path);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* this is the first call upon initialization */
|
||||||
|
icon_theme_path = g_object_ref (path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
g_object_unref (index);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_object_unref (hicolor);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_object_unref (path);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gimp_stock_init:
|
* gimp_stock_init:
|
||||||
*
|
*
|
||||||
@ -361,7 +486,6 @@ gimp_stock_init (void)
|
|||||||
|
|
||||||
GdkPixbuf *pixbuf;
|
GdkPixbuf *pixbuf;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
gchar *icon_theme;
|
|
||||||
gchar *icons_dir;
|
gchar *icons_dir;
|
||||||
gint i;
|
gint i;
|
||||||
|
|
||||||
@ -398,15 +522,29 @@ gimp_stock_init (void)
|
|||||||
gtk_stock_add_static (gimp_compat_stock_items,
|
gtk_stock_add_static (gimp_compat_stock_items,
|
||||||
G_N_ELEMENTS (gimp_compat_stock_items));
|
G_N_ELEMENTS (gimp_compat_stock_items));
|
||||||
|
|
||||||
icon_theme = g_strdup ("Default"); /* FIXME */
|
/* always prepend the default icon theme, it's never removed from
|
||||||
icons_dir = g_build_filename (gimp_data_directory (), "icons", icon_theme,
|
* the path again and acts as fallback for missing icons in other
|
||||||
NULL);
|
* themes.
|
||||||
g_free (icon_theme);
|
*/
|
||||||
|
if (! default_icon_theme_path)
|
||||||
|
default_icon_theme_path = gimp_data_directory_file ("icons", "Default",
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
icons_dir = g_file_get_path (default_icon_theme_path);
|
||||||
gtk_icon_theme_prepend_search_path (gtk_icon_theme_get_default (),
|
gtk_icon_theme_prepend_search_path (gtk_icon_theme_get_default (),
|
||||||
icons_dir);
|
icons_dir);
|
||||||
g_free (icons_dir);
|
g_free (icons_dir);
|
||||||
|
|
||||||
|
/* if an icon theme was chosen before init(), change to it */
|
||||||
|
if (icon_theme_path &&
|
||||||
|
! g_file_equal (icon_theme_path, default_icon_theme_path))
|
||||||
|
{
|
||||||
|
icons_dir = g_file_get_path (icon_theme_path);
|
||||||
|
gtk_icon_theme_prepend_search_path (gtk_icon_theme_get_default (),
|
||||||
|
icons_dir);
|
||||||
|
g_free (icons_dir);
|
||||||
|
}
|
||||||
|
|
||||||
pixbuf = gdk_pixbuf_new_from_resource ("/org/gimp/icons/64/gimp-wilber-eek.png",
|
pixbuf = gdk_pixbuf_new_from_resource ("/org/gimp/icons/64/gimp-wilber-eek.png",
|
||||||
&error);
|
&error);
|
||||||
|
|
||||||
|
@ -296,7 +296,9 @@ G_BEGIN_DECLS
|
|||||||
#define GIMP_STOCK_CONVERT_PRECISION GIMP_STOCK_CONVERT_RGB
|
#define GIMP_STOCK_CONVERT_PRECISION GIMP_STOCK_CONVERT_RGB
|
||||||
|
|
||||||
|
|
||||||
void gimp_stock_init (void);
|
void gimp_stock_init (void);
|
||||||
|
|
||||||
|
void gimp_stock_set_icon_theme (GFile *path);
|
||||||
|
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
@ -373,6 +373,7 @@ EXPORTS
|
|||||||
gimp_spin_button_new
|
gimp_spin_button_new
|
||||||
gimp_standard_help_func
|
gimp_standard_help_func
|
||||||
gimp_stock_init
|
gimp_stock_init
|
||||||
|
gimp_stock_set_icon_theme
|
||||||
gimp_string_combo_box_get_active
|
gimp_string_combo_box_get_active
|
||||||
gimp_string_combo_box_get_type
|
gimp_string_combo_box_get_type
|
||||||
gimp_string_combo_box_new
|
gimp_string_combo_box_new
|
||||||
|
Reference in New Issue
Block a user