src/java.desktop/unix/native/libawt_xawt/awt/gtk_interface.c
author mbaesken
Wed, 04 Sep 2019 10:12:42 +0200
changeset 58319 18e7ed2cd7d1
parent 49301 3e3696a308e1
permissions -rw-r--r--
8230480: check malloc/calloc results in java.desktop Reviewed-by: rriggs
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
37711
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
     1
/*
58319
18e7ed2cd7d1 8230480: check malloc/calloc results in java.desktop
mbaesken
parents: 49301
diff changeset
     2
 * Copyright (c) 2005, 2019, Oracle and/or its affiliates. All rights reserved.
37711
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
     4
 *
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    10
 *
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    15
 * accompanied this code).
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    16
 *
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    20
 *
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    23
 * questions.
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    24
 */
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    25
#include <dlfcn.h>
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    26
#include <stdlib.h>
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    27
#include "jvm_md.h"
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    28
#include "gtk_interface.h"
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    29
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    30
GtkApi* gtk2_load(JNIEnv *env, const char* lib_name);
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    31
GtkApi* gtk3_load(JNIEnv *env, const char* lib_name);
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    32
37811
40c09ac0ca71 8156020: 8145547 breaks AIX and and uses RTLD_NOLOAD incorrectly
simonis
parents: 37711
diff changeset
    33
gboolean gtk2_check(const char* lib_name, gboolean load);
40c09ac0ca71 8156020: 8145547 breaks AIX and and uses RTLD_NOLOAD incorrectly
simonis
parents: 37711
diff changeset
    34
gboolean gtk3_check(const char* lib_name, gboolean load);
37711
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    35
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    36
GtkApi *gtk;
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    37
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    38
typedef struct {
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    39
    GtkVersion version;
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    40
    const char* name;
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    41
    const char* vname;
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    42
    GtkApi* (*load)(JNIEnv *env, const char* lib_name);
37811
40c09ac0ca71 8156020: 8145547 breaks AIX and and uses RTLD_NOLOAD incorrectly
simonis
parents: 37711
diff changeset
    43
    gboolean (*check)(const char* lib_name, gboolean load);
37711
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    44
} GtkLib;
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    45
39033
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
    46
static GtkLib gtk_libs[] = {
37711
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    47
    {
49301
3e3696a308e1 8198649: Switch AWT/Swing's default GTK version to 3
prr
parents: 47216
diff changeset
    48
        GTK_3,
3e3696a308e1 8198649: Switch AWT/Swing's default GTK version to 3
prr
parents: 47216
diff changeset
    49
        JNI_LIB_NAME("gtk-3"),
3e3696a308e1 8198649: Switch AWT/Swing's default GTK version to 3
prr
parents: 47216
diff changeset
    50
        VERSIONED_JNI_LIB_NAME("gtk-3", "0"),
3e3696a308e1 8198649: Switch AWT/Swing's default GTK version to 3
prr
parents: 47216
diff changeset
    51
        &gtk3_load,
3e3696a308e1 8198649: Switch AWT/Swing's default GTK version to 3
prr
parents: 47216
diff changeset
    52
        &gtk3_check
3e3696a308e1 8198649: Switch AWT/Swing's default GTK version to 3
prr
parents: 47216
diff changeset
    53
    },
3e3696a308e1 8198649: Switch AWT/Swing's default GTK version to 3
prr
parents: 47216
diff changeset
    54
    {
37711
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    55
        GTK_2,
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    56
        JNI_LIB_NAME("gtk-x11-2.0"),
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    57
        VERSIONED_JNI_LIB_NAME("gtk-x11-2.0", "0"),
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    58
        &gtk2_load,
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    59
        &gtk2_check
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    60
    }
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    61
};
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    62
39033
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
    63
static GtkLib** get_libs_order(GtkVersion version) {
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
    64
    static GtkLib** load_order;
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
    65
    static int n_libs = 0;
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
    66
    if (!n_libs) {
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
    67
        n_libs = sizeof(gtk_libs) / sizeof(GtkLib);
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
    68
        load_order = calloc(n_libs + 1, sizeof(GtkLib *));
58319
18e7ed2cd7d1 8230480: check malloc/calloc results in java.desktop
mbaesken
parents: 49301
diff changeset
    69
        if (load_order == NULL) {
18e7ed2cd7d1 8230480: check malloc/calloc results in java.desktop
mbaesken
parents: 49301
diff changeset
    70
          return NULL;
18e7ed2cd7d1 8230480: check malloc/calloc results in java.desktop
mbaesken
parents: 49301
diff changeset
    71
        }
39033
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
    72
    }
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
    73
    int i, first = 0;
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
    74
    for (i = 0; i < n_libs; i++) {
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
    75
        load_order[i] = &gtk_libs[i];
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
    76
        if (load_order[i]->version == version) {
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
    77
            first = i;
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
    78
        }
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
    79
    }
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
    80
    if (first) {
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
    81
        for (i = first; i > 0; i--) {
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
    82
            load_order[i] = load_order[i - 1];
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
    83
        }
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
    84
        load_order[0] = &gtk_libs[first];
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
    85
    }
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
    86
    return load_order;
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
    87
}
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
    88
37711
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    89
static GtkLib* get_loaded() {
39033
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
    90
    GtkLib** libs = get_libs_order(GTK_ANY);
58319
18e7ed2cd7d1 8230480: check malloc/calloc results in java.desktop
mbaesken
parents: 49301
diff changeset
    91
    if (libs == NULL) return NULL;
39033
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
    92
    while(!gtk && *libs) {
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
    93
        GtkLib* lib = *libs++;
37811
40c09ac0ca71 8156020: 8145547 breaks AIX and and uses RTLD_NOLOAD incorrectly
simonis
parents: 37711
diff changeset
    94
        if (lib->check(lib->vname, /* load = */FALSE)) {
37711
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    95
            return lib;
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    96
        }
37811
40c09ac0ca71 8156020: 8145547 breaks AIX and and uses RTLD_NOLOAD incorrectly
simonis
parents: 37711
diff changeset
    97
        if (lib->check(lib->name, /* load = */FALSE)) {
37711
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    98
            return lib;
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
    99
        }
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   100
    }
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   101
    return NULL;
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   102
}
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   103
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   104
gboolean gtk_load(JNIEnv *env, GtkVersion version, gboolean verbose) {
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   105
    if (gtk == NULL) {
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   106
        GtkLib* lib = get_loaded();
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   107
        if (lib) {
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   108
            if (verbose) {
39033
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
   109
                fprintf(stderr, "Looking for GTK%d library...\n",
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
   110
                                                                 lib->version);
37711
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   111
            }
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   112
            gtk = lib->load(env, lib->vname);
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   113
            if (!gtk) {
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   114
                gtk = lib->load(env, lib->name);
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   115
            }
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   116
        } else {
39033
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
   117
            GtkLib** libs = get_libs_order(version);
58319
18e7ed2cd7d1 8230480: check malloc/calloc results in java.desktop
mbaesken
parents: 49301
diff changeset
   118
            while (!gtk && libs && *libs) {
39033
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
   119
                lib = *libs++;
37711
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   120
                if (version == GTK_ANY || lib->version == version) {
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   121
                    if (verbose) {
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   122
                        fprintf(stderr, "Looking for GTK%d library...\n",
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   123
                                                                  lib->version);
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   124
                    }
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   125
                    gtk = lib->load(env, lib->vname);
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   126
                    if (!gtk) {
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   127
                        gtk = lib->load(env, lib->name);
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   128
                    }
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   129
                    if (verbose && !gtk) {
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   130
                        fprintf(stderr, "Not found.\n");
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   131
                    }
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   132
                }
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   133
            }
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   134
        }
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   135
        if (verbose) {
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   136
            if (gtk) {
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   137
                fprintf(stderr, "GTK%d library loaded.\n", lib->version);
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   138
            } else {
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   139
                fprintf(stderr, "Failed to load GTK library.\n");
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   140
            }
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   141
        }
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   142
    }
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   143
    return gtk != NULL;
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   144
}
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   145
37811
40c09ac0ca71 8156020: 8145547 breaks AIX and and uses RTLD_NOLOAD incorrectly
simonis
parents: 37711
diff changeset
   146
static gboolean check_version(GtkVersion version) {
39033
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
   147
    GtkLib** libs = get_libs_order(version);
58319
18e7ed2cd7d1 8230480: check malloc/calloc results in java.desktop
mbaesken
parents: 49301
diff changeset
   148
    if (libs == NULL) return FALSE;
39033
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
   149
    while (*libs) {
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
   150
        GtkLib* lib = *libs++;
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
   151
        if (lib->check(lib->vname, /* load = */TRUE)) {
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
   152
            return TRUE;
37711
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   153
        }
39033
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
   154
        if (lib->check(lib->name, /* load = */TRUE)) {
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
   155
            return TRUE;
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
   156
        }
37711
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   157
    }
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   158
    return FALSE;
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   159
}
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   160
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   161
gboolean gtk_check_version(GtkVersion version) {
39033
d61135c3795c 8156121: "Fail forward" fails for GTK3 if no GTK2 available
ssadetsky
parents: 37811
diff changeset
   162
    if (gtk || get_loaded()) {
37711
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   163
        return TRUE;
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   164
    }
37811
40c09ac0ca71 8156020: 8145547 breaks AIX and and uses RTLD_NOLOAD incorrectly
simonis
parents: 37711
diff changeset
   165
    return check_version(version);
37711
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   166
}
972001566d66 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
ssadetsky
parents:
diff changeset
   167