X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkmodules.c;h=5a15925993be61c7849cf524090b0515b43c4174;hb=ea043cab5718304d9b6170afa2d3f959fc99c718;hp=a6b40d88b5c870a840b6b3b45d17db5f32a0b45e;hpb=fa00f3e50a4a5a16ca00b08308f7fa6008b45d3e;p=~andy%2Fgtk diff --git a/gtk/gtkmodules.c b/gtk/gtkmodules.c index a6b40d88b..5a1592599 100644 --- a/gtk/gtkmodules.c +++ b/gtk/gtkmodules.c @@ -13,9 +13,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ #include "config.h" @@ -25,9 +23,9 @@ #include "gtkmodules.h" #include "gtksettings.h" #include "gtkdebug.h" -#include "gtkprivate.h" /* GTK_LIBDIR */ -#include "gtkintl.h" -#include "gtkalias.h" +#include "gtkprivate.h" +#include "gtkmodulesprivate.h" +#include "gtkintl.h" #include @@ -55,8 +53,6 @@ get_module_path (void) { const gchar *module_path_env; const gchar *exe_prefix; - const gchar *home_dir; - gchar *home_gtk_dir = NULL; gchar *module_path; gchar *default_dir; static gchar **result = NULL; @@ -64,32 +60,21 @@ get_module_path (void) if (result) return result; - home_dir = g_get_home_dir(); - if (home_dir) - home_gtk_dir = g_build_filename (home_dir, ".gtk-2.0", NULL); - module_path_env = g_getenv ("GTK_PATH"); exe_prefix = g_getenv ("GTK_EXE_PREFIX"); if (exe_prefix) - default_dir = g_build_filename (exe_prefix, "lib", "gtk-2.0", NULL); + default_dir = g_build_filename (exe_prefix, "lib", "gtk-3.0", NULL); else - default_dir = g_build_filename (GTK_LIBDIR, "gtk-2.0", NULL); + default_dir = g_build_filename (_gtk_get_libdir (), "gtk-3.0", NULL); - if (module_path_env && home_gtk_dir) - module_path = g_build_path (G_SEARCHPATH_SEPARATOR_S, - module_path_env, home_gtk_dir, default_dir, NULL); - else if (module_path_env) + if (module_path_env) module_path = g_build_path (G_SEARCHPATH_SEPARATOR_S, module_path_env, default_dir, NULL); - else if (home_gtk_dir) - module_path = g_build_path (G_SEARCHPATH_SEPARATOR_S, - home_gtk_dir, default_dir, NULL); else module_path = g_build_path (G_SEARCHPATH_SEPARATOR_S, default_dir, NULL); - g_free (home_gtk_dir); g_free (default_dir); result = pango_split_file_list (module_path); @@ -237,7 +222,16 @@ find_module (const gchar *name) } module = g_module_open (module_name, G_MODULE_BIND_LOCAL | G_MODULE_BIND_LAZY); - g_free(module_name); + + if (_gtk_module_has_mixed_deps (module)) + { + g_warning ("GTK+ module %s cannot be loaded.\n" + "GTK+ 2.x symbols detected. Using GTK+ 2.x and GTK+ 3 in the same process is not supported.", module_name); + g_module_close (module); + module = NULL; + } + + g_free (module_name); return module; } @@ -249,6 +243,22 @@ cmp_module (GtkModuleInfo *info, return info->module != module; } +static gboolean +module_is_blacklisted (const gchar *name, + gboolean verbose) +{ + if (g_str_equal (name, "gail") || + g_str_equal (name, "atk-bridge")) + { + if (verbose) + g_message ("Not loading module \"%s\": The functionality is provided by GTK natively. Please try to not load it.", name); + + return TRUE; + } + + return FALSE; +} + static GSList * load_module (GSList *module_list, const gchar *name) @@ -265,22 +275,31 @@ load_module (GSList *module_list, for (l = gtk_modules; l; l = l->next) { info = l->data; - if (g_slist_find_custom (info->names, name, + if (g_slist_find_custom (info->names, name, (GCompareFunc)strcmp)) { info->ref_count++; success = TRUE; + break; } + info = NULL; } - if (!success) + if (!success) { module = find_module (name); if (module) { - if (g_module_symbol (module, "gtk_module_init", &modinit_func_ptr)) + /* Do the check this late so we only warn about existing modules, + * not old modules that are still in the modules path. */ + if (module_is_blacklisted (name, TRUE)) + { + modinit_func = NULL; + success = TRUE; + } + else if (g_module_symbol (module, "gtk_module_init", &modinit_func_ptr)) modinit_func = modinit_func_ptr; else modinit_func = NULL; @@ -313,7 +332,7 @@ load_module (GSList *module_list, gtk_modules = g_slist_append (gtk_modules, info); /* display_init == NULL indicates a non-multihead aware module. - * For these, we delay the call to init_func until first display is + * For these, we delay the call to init_func until first display is * opened, see default_display_notify_cb(). * For multihead aware modules, we call init_func immediately, * and also call display_init_func on all opened displays. @@ -346,7 +365,7 @@ load_module (GSList *module_list, } } - if (success) + if (success && info) { if (!g_slist_find (module_list, info)) { @@ -354,8 +373,16 @@ load_module (GSList *module_list, } } else - g_message ("Failed to load module \"%s\": %s", name, g_module_error ()); - + { + if (!module_is_blacklisted (name, FALSE)) + { + const gchar *error = g_module_error (); + + g_message ("Failed to load module \"%s\"%s%s", + name, error ? ": " : "", error ? error : ""); + } + } + return module_list; } @@ -469,7 +496,7 @@ display_opened_cb (GdkDisplayManager *display_manager, for (i = 0; i < gdk_display_get_n_screens (display); i++) { - GValue value = { 0, }; + GValue value = G_VALUE_INIT; g_value_init (&value, G_TYPE_STRING); @@ -557,3 +584,29 @@ _gtk_modules_settings_changed (GtkSettings *settings, new_modules, settings_destroy_notify); } + +/* Return TRUE if module_to_check causes version conflicts. + * If module_to_check is NULL, check the main module. + */ +gboolean +_gtk_module_has_mixed_deps (GModule *module_to_check) +{ + GModule *module; + gpointer func; + gboolean result; + + if (!module_to_check) + module = g_module_open (NULL, 0); + else + module = module_to_check; + + if (g_module_symbol (module, "gtk_progress_get_type", &func)) + result = TRUE; + else + result = FALSE; + + if (!module_to_check) + g_module_close (module); + + return result; +}