--- old/src/java.desktop/unix/native/libawt_xawt/awt/gtk_interface.c 2016-05-26 13:45:41.634241428 +0300 +++ new/src/java.desktop/unix/native/libawt_xawt/awt/gtk_interface.c 2016-05-26 13:45:41.522241432 +0300 @@ -43,7 +43,7 @@ gboolean (*check)(const char* lib_name, gboolean load); } GtkLib; -static GtkLib libs[] = { +static GtkLib gtk_libs[] = { { GTK_2, JNI_LIB_NAME("gtk-x11-2.0"), @@ -57,26 +57,43 @@ VERSIONED_JNI_LIB_NAME("gtk-3", "0"), >k3_load, >k3_check - }, - { - 0, - NULL, - NULL, - NULL, - NULL } }; +static GtkLib** get_libs_order(GtkVersion version) { + static GtkLib** load_order; + static int n_libs = 0; + if (!n_libs) { + n_libs = sizeof(gtk_libs) / sizeof(GtkLib); + load_order = malloc(1 + n_libs * sizeof(GtkLib *)); + load_order[n_libs] = 0; + } + int i, first = 0; + for (i = 0; i < n_libs; i++) { + load_order[i] = >k_libs[i]; + if (load_order[i]->version == version) { + first = i; + } + } + if (first) { + for (i = first; i > 0; i--) { + load_order[i] = load_order[i - 1]; + } + load_order[0] = >k_libs[first]; + } + return load_order; +} + static GtkLib* get_loaded() { - GtkLib* lib = libs; - while(!gtk && lib->version) { + GtkLib** libs = get_libs_order(GTK_ANY); + while(!gtk && *libs) { + GtkLib* lib = *libs++; if (lib->check(lib->vname, /* load = */FALSE)) { return lib; } if (lib->check(lib->name, /* load = */FALSE)) { return lib; } - lib++; } return NULL; } @@ -85,23 +102,18 @@ if (gtk == NULL) { GtkLib* lib = get_loaded(); if (lib) { - if (version != GTK_ANY && lib->version != version) { - if (verbose) { - fprintf(stderr, "WARNING: Cannot load GTK%d library: \ - GTK%d has already been loaded\n", version, lib->version); - } - return FALSE; - } if (verbose) { - fprintf(stderr, "Looking for GTK%d library...\n", version); + fprintf(stderr, "Looking for GTK%d library...\n", + lib->version); } gtk = lib->load(env, lib->vname); if (!gtk) { gtk = lib->load(env, lib->name); } } else { - lib = libs; - while (!gtk && lib->version) { + GtkLib** libs = get_libs_order(version); + while (!gtk && *libs) { + lib = *libs++; if (version == GTK_ANY || lib->version == version) { if (verbose) { fprintf(stderr, "Looking for GTK%d library...\n", @@ -115,9 +127,7 @@ fprintf(stderr, "Not found.\n"); } } - lib++; } - lib--; } if (verbose) { if (gtk) { @@ -131,17 +141,15 @@ } static gboolean check_version(GtkVersion version) { - GtkLib* lib = libs; - while (lib->version) { - if (version == GTK_ANY || lib->version == version) { - if (lib->check(lib->vname, /* load = */TRUE)) { - return TRUE; - } - if (lib->check(lib->name, /* load = */TRUE)) { - return TRUE; - } + GtkLib** libs = get_libs_order(GTK_ANY); + while (*libs) { + GtkLib* lib = *libs++; + if (lib->check(lib->vname, /* load = */TRUE)) { + return TRUE; + } + if (lib->check(lib->name, /* load = */TRUE)) { + return TRUE; } - lib++; } return FALSE; }