diff --git a/src/fe-gtk/fe-gtk.c b/src/fe-gtk/fe-gtk.c index 07bab186..b7376750 100644 --- a/src/fe-gtk/fe-gtk.c +++ b/src/fe-gtk/fe-gtk.c @@ -117,6 +117,8 @@ create_msg_dialog (gchar *title, gchar *message) gtk_widget_destroy (dialog); } +static char *win32_argv0_dir; + static void win32_set_gsettings_schema_dir (void) { @@ -225,24 +227,66 @@ static void win32_configure_icon_theme (void) { GtkIconTheme *theme; + const char *env_icons_path; char *base_path; char *icons_path; + char *cwd_dir; + char *cwd_path; + char *argv0_icons_path; + const char *selected_source = NULL; + char *selected_path = NULL; + + #define WIN32_SET_ICON_PATH(source_name, path_value) \ + G_STMT_START { \ + if ((path_value) != NULL && g_file_test ((path_value), G_FILE_TEST_IS_DIR)) \ + { \ + gtk_icon_theme_append_search_path (theme, (path_value)); \ + if (selected_path == NULL) \ + { \ + selected_source = (source_name); \ + selected_path = g_strdup (path_value); \ + } \ + } \ + } G_STMT_END theme = gtk_icon_theme_get_default (); if (!theme) return; + env_icons_path = g_getenv ("ZOITECHAT_ICON_PATH"); + if (env_icons_path && *env_icons_path) + WIN32_SET_ICON_PATH ("ZOITECHAT_ICON_PATH", env_icons_path); + base_path = g_win32_get_package_installation_directory_of_module (NULL); - if (!base_path) - return; + if (base_path) + { + icons_path = g_build_filename (base_path, "share", "icons", NULL); + WIN32_SET_ICON_PATH ("module base", icons_path); + g_free (icons_path); + } - icons_path = g_build_filename (base_path, "share", "icons", NULL); + cwd_dir = g_get_current_dir (); + cwd_path = g_build_filename (cwd_dir, "share", "icons", NULL); + WIN32_SET_ICON_PATH ("current working directory", cwd_path); + g_free (cwd_path); + g_free (cwd_dir); - if (g_file_test (icons_path, G_FILE_TEST_IS_DIR)) - gtk_icon_theme_append_search_path (theme, icons_path); + if (win32_argv0_dir) + { + argv0_icons_path = g_build_filename (win32_argv0_dir, "share", "icons", NULL); + WIN32_SET_ICON_PATH ("argv[0] directory", argv0_icons_path); + g_free (argv0_icons_path); + } - g_free (icons_path); + if (selected_path) + g_message ("win32_configure_icon_theme: selected icon path (%s): %s", selected_source, selected_path); + else + g_message ("win32_configure_icon_theme: no usable icon path found (checked ZOITECHAT_ICON_PATH, module base/share/icons, cwd/share/icons, argv[0]/share/icons)"); + + g_free (selected_path); g_free (base_path); + + #undef WIN32_SET_ICON_PATH } #endif @@ -361,16 +405,10 @@ fe_args (int argc, char *argv[]) /* cuts can. So we have to set the current dir manually, to the path */ /* of the exe. */ { - char *tmp = g_strdup (argv[0]); - char *sl; - - sl = strrchr (tmp, G_DIR_SEPARATOR); - if (sl) - { - *sl = 0; - chdir (tmp); - } - g_free (tmp); + g_free (win32_argv0_dir); + win32_argv0_dir = g_path_get_dirname (argv[0]); + if (win32_argv0_dir) + chdir (win32_argv0_dir); } #endif