src/solaris/native/sun/awt/gtk2_interface.c

Print this page

        

*** 30,39 **** --- 30,40 ---- #include <string.h> #include "gtk2_interface.h" #include "java_awt_Transparency.h" #define GTK2_LIB "libgtk-x11-2.0.so.0" + #define GTHREAD_LIB "libgthread-2.0.so.0" #define G_TYPE_INVALID G_TYPE_MAKE_FUNDAMENTAL (0) #define G_TYPE_NONE G_TYPE_MAKE_FUNDAMENTAL (1) #define G_TYPE_INTERFACE G_TYPE_MAKE_FUNDAMENTAL (2) #define G_TYPE_CHAR G_TYPE_MAKE_FUNDAMENTAL (3)
*** 73,82 **** --- 74,84 ---- const gint FOCUSED = 1 << 8; const gint SELECTED = 1 << 9; const gint DEFAULT = 1 << 10; static void *gtk2_libhandle = NULL; + static void *gthread_libhandle = NULL; static jmp_buf j; /* Widgets */ static GtkWidget *gtk2_widget = NULL; static GtkWidget *gtk2_window = NULL;
*** 148,158 **** static GtkWidget *gtk2_widgets[_GTK_WIDGET_TYPE_SIZE]; /************************* * Glib function pointers *************************/ - static void (*fp_g_free)(gpointer mem); static gboolean (*fp_g_main_context_iteration)(GMainContext *context, gboolean may_block); static GValue* (*fp_g_value_init)(GValue *value, GType g_type); --- 150,159 ----
*** 202,214 **** gint* width, gint* height); /************************ * Gtk function pointers ************************/ - static gchar* (*fp_gtk_check_version)(guint required_major, - guint required_minor, - guint required_micro); static gboolean (*fp_gtk_init_check)(int* argc, char** argv); /* Painting */ static void (*fp_gtk_paint_hline)(GtkStyle* style, GdkWindow* window, GtkStateType state_type, GdkRectangle* area, GtkWidget* widget, --- 203,212 ----
*** 328,338 **** static void (*fp_gtk_menu_shell_append)(GtkMenuShell *menu_shell, GtkWidget *child); static void (*fp_gtk_menu_item_set_submenu)(GtkMenuItem *menu_item, GtkWidget *submenu); static void (*fp_gtk_widget_realize)(GtkWidget *widget); - static void (*fp_gtk_widget_destroy)(GtkWidget *widget); static GdkPixbuf* (*fp_gtk_widget_render_icon)(GtkWidget *widget, const gchar *stock_id, GtkIconSize size, const gchar *detail); static void (*fp_gtk_widget_set_name)(GtkWidget *widget, const gchar *name); static void (*fp_gtk_widget_set_parent)(GtkWidget *widget, GtkWidget *parent); static void (*fp_gtk_widget_set_direction)(GtkWidget *widget, --- 326,335 ----
*** 386,395 **** --- 383,401 ---- longjmp(j, NO_SYMBOL_EXCEPTION); return result; } + static void* dl_symbol_gthread(const char* name) + { + void* result = dlsym(gthread_libhandle, name); + if (!result) + longjmp(j, NO_SYMBOL_EXCEPTION); + + return result; + } + gboolean gtk2_check_version() { if (gtk2_libhandle != NULL) { /* We've already successfully opened the GTK libs, so return true. */ return TRUE;
*** 412,431 **** return result; } } gboolean gtk2_load() { gboolean result; int i; int (*handler)(); int (*io_handler)(); char *gtk_modules_env; gtk2_libhandle = dlopen(GTK2_LIB, RTLD_LAZY | RTLD_LOCAL); ! if (gtk2_libhandle == NULL) return FALSE; if (setjmp(j) == 0) { fp_gtk_check_version = dl_symbol("gtk_check_version"); --- 418,466 ---- return result; } } + /** + * Functions for sun_awt_X11_GtkFileDialogPeer.c + */ + void gtk2_file_chooser_load() + { + fp_gtk_file_chooser_get_filename = dl_symbol( + "gtk_file_chooser_get_filename"); + fp_gtk_file_chooser_dialog_new = dl_symbol("gtk_file_chooser_dialog_new"); + fp_gtk_file_chooser_set_current_folder = dl_symbol( + "gtk_file_chooser_set_current_folder"); + fp_gtk_file_chooser_set_filename = dl_symbol( + "gtk_file_chooser_set_filename"); + fp_gtk_file_filter_add_custom = dl_symbol("gtk_file_filter_add_custom"); + fp_gtk_file_chooser_set_filter = dl_symbol("gtk_file_chooser_set_filter"); + fp_gtk_file_chooser_get_type = dl_symbol("gtk_file_chooser_get_type"); + fp_gtk_file_filter_new = dl_symbol("gtk_file_filter_new"); + fp_gtk_file_chooser_set_do_overwrite_confirmation = dl_symbol( + "gtk_file_chooser_set_do_overwrite_confirmation"); + fp_gtk_file_chooser_set_select_multiple = dl_symbol( + "gtk_file_chooser_set_select_multiple"); + fp_gtk_file_chooser_get_current_folder = dl_symbol( + "gtk_file_chooser_get_current_folder"); + fp_gtk_file_chooser_get_filenames = dl_symbol( + "gtk_file_chooser_get_filenames"); + fp_gtk_g_slist_length = dl_symbol("g_slist_length"); + } + gboolean gtk2_load() { gboolean result; int i; int (*handler)(); int (*io_handler)(); char *gtk_modules_env; gtk2_libhandle = dlopen(GTK2_LIB, RTLD_LAZY | RTLD_LOCAL); ! gthread_libhandle = dlopen(GTHREAD_LIB, RTLD_LAZY | RTLD_LOCAL); ! ! if (gtk2_libhandle == NULL || gthread_libhandle == NULL) return FALSE; if (setjmp(j) == 0) { fp_gtk_check_version = dl_symbol("gtk_check_version");
*** 595,604 **** --- 630,663 ---- fp_gtk_widget_size_request = dl_symbol("gtk_widget_size_request"); fp_gtk_range_get_adjustment = dl_symbol("gtk_range_get_adjustment"); + fp_gtk_widget_hide = dl_symbol("gtk_widget_hide"); + fp_gtk_main_quit = dl_symbol("gtk_main_quit"); + fp_g_signal_connect_data = dl_symbol("g_signal_connect_data"); + fp_gtk_widget_show = dl_symbol("gtk_widget_show"); + fp_gtk_main = dl_symbol("gtk_main"); + + /** + * GLib thread system + */ + fp_g_thread_get_initialized = dl_symbol_gthread( + "g_thread_get_initialized"); + fp_g_thread_init = dl_symbol_gthread("g_thread_init"); + fp_gdk_threads_init = dl_symbol("gdk_threads_init"); + fp_gdk_threads_enter = dl_symbol("gdk_threads_enter"); + fp_gdk_threads_leave = dl_symbol("gdk_threads_leave"); + + /** + * Functions for sun_awt_X11_GtkFileDialogPeer.c + */ + if (fp_gtk_check_version(2, 4, 0) == NULL) { + // The current GtkFileChooser is available from GTK+ 2.4 + gtk2_file_chooser_load(); + } + /* Some functions may be missing in pre-2.4 GTK. We handle them specially here. */ fp_gtk_combo_box_new = dlsym(gtk2_libhandle, "gtk_combo_box_new"); if (fp_gtk_combo_box_new == NULL) {
*** 624,633 **** --- 683,696 ---- */ else { dlclose(gtk2_libhandle); gtk2_libhandle = NULL; + + dlclose(gthread_libhandle); + gthread_libhandle = NULL; + return FALSE; } /* * Strip the AT-SPI GTK_MODULEs if present
*** 676,685 **** --- 739,759 ---- * BadMatch errors which we would normally ignore. The IO error handler * is preserved here, too, just for consistency. */ handler = XSetErrorHandler(NULL); io_handler = XSetIOErrorHandler(NULL); + + if (fp_gtk_check_version(2, 2, 0) == NULL) { + // Init the thread system to use GLib in a thread-safe mode + if (!fp_g_thread_get_initialized()) { + fp_g_thread_init(NULL); + + //According the GTK documentation, gdk_threads_init() should be + //called before gtk_init() or gtk_init_check() + fp_gdk_threads_init(); + } + } result = (*fp_gtk_init_check)(NULL, NULL); XSetErrorHandler(handler); XSetIOErrorHandler(io_handler);
*** 720,729 **** --- 794,804 ---- gtk2_window = NULL; } dlerror(); dlclose(gtk2_libhandle); + dlclose(gthread_libhandle); if ((gtk2_error = dlerror()) != NULL) { return FALSE; } return TRUE;