Exemplo n.º 1
0
int loadGtk() {
#ifdef AIX 
#define DLFLAGS RTLD_LAZY | RTLD_MEMBER
#else
#define DLFLAGS RTLD_LAZY
#endif

	char *overlayScrollbar = getenv("LIBOVERLAY_SCROLLBAR");
	if (overlayScrollbar == NULL) {
		setenv("LIBOVERLAY_SCROLLBAR", "0", 0);
	}

	void *gdkLib = NULL, *gtkLib = NULL, *objLib = NULL, *pixLib = NULL, *x11Lib = NULL;
	
	char *gtk3 = getenv("SWT_GTK3");
	if (gtk3 == NULL || strcmp(gtk3,"1") == 0) {
		gdkLib = dlopen(GDK3_LIB, DLFLAGS);
		gtkLib = dlopen(GTK3_LIB, DLFLAGS);
		if (gtkLib != NULL) {
			const char * (*func)(int, int, int);
			dlerror();
			*(void**) (&func) = dlsym(gtkLib, "gtk_check_version");
			if (dlerror() == NULL && func) {
				const char *check = (*func)(3, 9, 0);
				if (check == NULL) {
					dlclose(gdkLib);
					dlclose(gtkLib);
					gdkLib = gtkLib = NULL;
					setenv("SWT_GTK3","0",1);
				}
			}
		}
	}
	if (!gtkLib || !gdkLib) {
		gdkLib = dlopen(GDK_LIB, DLFLAGS);
		gtkLib = dlopen(GTK_LIB, DLFLAGS);
		setenv("SWT_GTK3","0",1);
	}
	objLib = dlopen(GOBJ_LIB, DLFLAGS);
	pixLib = dlopen(PIXBUF_LIB, DLFLAGS);
	x11Lib = dlopen(X11_LIB, DLFLAGS);
	
	/* initialize ptr struct to 0's */
	memset(&gtk, 0, sizeof(struct GTK_PTRS));
	
	if ( gtkLib == NULL || loadGtkSymbols(gtkLib, gtkFunctions)  != 0) return -1;
	if ( gdkLib == NULL || loadGtkSymbols(gdkLib, gdkFunctions)  != 0) return -1;
	if ( pixLib == NULL || loadGtkSymbols(pixLib, pixFunctions)  != 0) return -1;
	if ( objLib == NULL || loadGtkSymbols(objLib, gobjFunctions) != 0) return -1;
	if ( x11Lib == NULL || loadGtkSymbols(x11Lib, x11Functions) != 0) return -1;
	
	return 0;
}
int loadGtk() {
#ifdef AIX 
#define DLFLAGS RTLD_LAZY | RTLD_MEMBER
#else
#define DLFLAGS RTLD_LAZY
#endif

	char *overlayScrollbar = getenv("LIBOVERLAY_SCROLLBAR");
	if (overlayScrollbar == NULL) {
		setenv("LIBOVERLAY_SCROLLBAR", "0", 0);
	}

	char *oxygenGtkHack = getenv("OXYGEN_DISABLE_INNER_SHADOWS_HACK");
	if (oxygenGtkHack == NULL) {
		setenv("OXYGEN_DISABLE_INNER_SHADOWS_HACK", "1", 0);
	}
	
	/* Disable GTK scaling*/
	setenv("GDK_SCALE", "1", 1);

	void *gdkLib = NULL, *gtkLib = NULL, *objLib = NULL, *pixLib = NULL, *x11Lib = NULL;
	
	char *gtk3 = getenv("SWT_GTK3");
	if (gtk3 == NULL || strcmp(gtk3,"1") == 0) {
		gdkLib = dlopen(GDK3_LIB, DLFLAGS);
		gtkLib = dlopen(GTK3_LIB, DLFLAGS);

		/* Work around for https://bugzilla.gnome.org/show_bug.cgi?id=677329, see Eclipse bug 435742 */
		char *gdkCoreDeviceEvents = getenv("GDK_CORE_DEVICE_EVENTS");
		if (gdkCoreDeviceEvents == NULL) {
			setenv("GDK_CORE_DEVICE_EVENTS", "1", 0);
		}
	}
	if (!gtkLib || !gdkLib) { //if GTK+ 2
		gdkLib = dlopen(GDK_LIB, DLFLAGS);
		gtkLib = dlopen(GTK_LIB, DLFLAGS);
		setenv("SWT_GTK3","0",1);

		const char * (*func)(int, int, int);
		dlerror();

		*(void**) (&func) = dlsym(gtkLib, "gtk_check_version");
		if (dlerror() == NULL && func) {
			const char *check = (*func)(minGtkMajorVersion, minGtkMinorVersion, minGtkMicroVersion);
			if (check != NULL) {
				GtkWidget* dialog;
				int gtkMajorVersion, gtkMinorVersion, gtkMicroVersion;
				void *gtkMajorPtr, *gtkMinorPtr, *gtkMicroPtr;

				/* this code is applicable for GTK+ 2 only*/
				dlerror();
				gtkMajorPtr = dlsym(gtkLib, "gtk_major_version");
				if ((dlerror() != NULL) || (gtkMajorPtr == NULL)) return -1;
				gtkMajorVersion = *(int *)gtkMajorPtr;

				gtkMinorPtr = dlsym(gtkLib, "gtk_minor_version");
				if ((dlerror() != NULL) || (gtkMinorPtr == NULL)) return -1;
				gtkMinorVersion = *(int *)gtkMinorPtr;

				gtkMicroPtr = dlsym(gtkLib, "gtk_micro_version");
				if ((dlerror() != NULL) || (gtkMicroPtr == NULL)) return -1;
				gtkMicroVersion = *(int *)gtkMicroPtr;

				objLib = dlopen(GOBJ_LIB, DLFLAGS);
				pixLib = dlopen(PIXBUF_LIB, DLFLAGS);
				x11Lib = dlopen(X11_LIB, DLFLAGS);

				memset(&gtk, 0, sizeof(struct GTK_PTRS));

				if ( gtkLib == NULL || loadGtkSymbols(gtkLib, gtkFunctions)  != 0) return -1;
				if ( gdkLib == NULL || loadGtkSymbols(gdkLib, gdkFunctions)  != 0) return -1;
				if ( pixLib == NULL || loadGtkSymbols(pixLib, pixFunctions)  != 0) return -1;
				if ( objLib == NULL || loadGtkSymbols(objLib, gobjFunctions) != 0) return -1;
				if ( x11Lib == NULL || loadGtkSymbols(x11Lib, x11Functions)  != 0) return -1;

				/* Initialize GTK. */
				if (gtk.gtk_init_with_args) {
					GError *error = NULL;
					if (!gtk.gtk_init_with_args(0, NULL, NULL, NULL, NULL, &error)) {
						printf("%s", gtkInitFail);
						exit (1);
					}
				}
				dialog = gtk.gtk_message_dialog_new(NULL, GTK_DIALOG_DESTROY_WITH_PARENT,
						GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
						"%s %d.%d.%d %s %d.%d.%d.\n%s %d.%d.%d %s", minVerMsg1, minGtkMajorVersion,
						minGtkMinorVersion, minGtkMicroVersion, minVerMsg2, gtkMajorVersion,
						gtkMinorVersion, gtkMicroVersion, upgradeWarning1, minGtkMajorVersion,
						minGtkMinorVersion, minGtkMicroVersion, upgradeWarning2);
				gtk.gtk_window_set_title((GtkWindow*)dialog, minVerTitle);
				gtk.gtk_dialog_run((GtkDialog*)dialog);
				gtk.gtk_widget_destroy(dialog);
				dlclose(gdkLib);
				dlclose(gtkLib);
				gdkLib = gtkLib = NULL;
				exit (1);
			}
		}
	}


	objLib = dlopen(GOBJ_LIB, DLFLAGS);
	pixLib = dlopen(PIXBUF_LIB, DLFLAGS);
	x11Lib = dlopen(X11_LIB, DLFLAGS);

	/* initialize ptr struct to 0's */
	memset(&gtk, 0, sizeof(struct GTK_PTRS));

	if ( gtkLib == NULL || loadGtkSymbols(gtkLib, gtkFunctions)  != 0) return -1;
	if ( gdkLib == NULL || loadGtkSymbols(gdkLib, gdkFunctions)  != 0) return -1;
	if ( pixLib == NULL || loadGtkSymbols(pixLib, pixFunctions)  != 0) return -1;
	if ( objLib == NULL || loadGtkSymbols(objLib, gobjFunctions) != 0) return -1;
	if ( x11Lib == NULL || loadGtkSymbols(x11Lib, x11Functions) != 0) return -1;

	return 0;
}
Exemplo n.º 3
0
int loadGtk() {
#ifdef AIX 
#define DLFLAGS RTLD_LAZY | RTLD_MEMBER
#else
#define DLFLAGS RTLD_LAZY
#endif

	void *gioLib = NULL, *glibLib = NULL, *gdkLib = NULL, *gtkLib = NULL, *objLib = NULL, *pixLib = NULL;
	
	gdkLib = dlopen(GDK3_LIB, DLFLAGS);
	gtkLib = dlopen(GTK3_LIB, DLFLAGS);

	if (!gtkLib || !gdkLib) {
		const char * (*func)(int, int, int);
		dlerror();

		*(void**) (&func) = dlsym(gtkLib, "gtk_check_version");
		if (dlerror() == NULL && func) {
			const char *check = (*func)(minGtkMajorVersion, minGtkMinorVersion, minGtkMicroVersion);
			if (check != NULL) {
				GtkWidget* dialog;
				int gtkMajorVersion, gtkMinorVersion, gtkMicroVersion;
				void *gtkMajorPtr, *gtkMinorPtr, *gtkMicroPtr;

				/* this code is applicable for GTK+ 2 only*/
				dlerror();
				gtkMajorPtr = dlsym(gtkLib, "gtk_major_version");
				if ((dlerror() != NULL) || (gtkMajorPtr == NULL)) return -1;
				gtkMajorVersion = *(int *)gtkMajorPtr;

				gtkMinorPtr = dlsym(gtkLib, "gtk_minor_version");
				if ((dlerror() != NULL) || (gtkMinorPtr == NULL)) return -1;
				gtkMinorVersion = *(int *)gtkMinorPtr;

				gtkMicroPtr = dlsym(gtkLib, "gtk_micro_version");
				if ((dlerror() != NULL) || (gtkMicroPtr == NULL)) return -1;
				gtkMicroVersion = *(int *)gtkMicroPtr;

				objLib = dlopen(GOBJ_LIB, DLFLAGS);
				pixLib = dlopen(PIXBUF_LIB, DLFLAGS);
				gioLib = dlopen(GIO_LIB, DLFLAGS);
				glibLib= dlopen(GLIB_LIB, DLFLAGS);

				memset(&gtk, 0, sizeof(struct GTK_PTRS));

				if ( gtkLib == NULL || loadGtkSymbols(gtkLib, gtkFunctions)  != 0) return -1;
				if ( gdkLib == NULL || loadGtkSymbols(gdkLib, gdkFunctions)  != 0) return -1;
				if ( gioLib == NULL || loadGtkSymbols(gdkLib, gioFunctions)  != 0) return -1;
				if ( glibLib == NULL || loadGtkSymbols(gdkLib, glibFunctions)  != 0) return -1;
				if ( pixLib == NULL || loadGtkSymbols(pixLib, pixFunctions)  != 0) return -1;
				if ( objLib == NULL || loadGtkSymbols(objLib, gobjFunctions) != 0) return -1;

				/* Initialize GTK. */
				if (gtk.gtk_init_with_args) {
					GError *error = NULL;
					if (!gtk.gtk_init_with_args(0, NULL, NULL, NULL, NULL, &error)) {
						printf("%s", gtkInitFail);
						exit (1);
					}
				}
				dialog = gtk.gtk_message_dialog_new(NULL, GTK_DIALOG_DESTROY_WITH_PARENT,
						GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
						"%s %d.%d.%d %s %d.%d.%d.\n%s %d.%d.%d %s", minVerMsg1, minGtkMajorVersion,
						minGtkMinorVersion, minGtkMicroVersion, minVerMsg2, gtkMajorVersion,
						gtkMinorVersion, gtkMicroVersion, upgradeWarning1, minGtkMajorVersion,
						minGtkMinorVersion, minGtkMicroVersion, upgradeWarning2);
				gtk.gtk_window_set_title((GtkWindow*)dialog, minVerTitle);
				gtk.gtk_dialog_run((GtkDialog*)dialog);
				gtk.gtk_widget_destroy(dialog);
				dlclose(gdkLib);
				dlclose(gtkLib);
				gdkLib = gtkLib = NULL;
				exit (1);
			}
		}
	}


	objLib = dlopen(GOBJ_LIB, DLFLAGS);
	pixLib = dlopen(PIXBUF_LIB, DLFLAGS);
	gioLib = dlopen(GIO_LIB, DLFLAGS);
	glibLib= dlopen(GLIB_LIB, DLFLAGS);

	/* initialize ptr struct to 0's */
	memset(&gtk, 0, sizeof(struct GTK_PTRS));

	if ( gtkLib == NULL || loadGtkSymbols(gtkLib, gtkFunctions)  != 0) return -1;
	if ( gdkLib == NULL || loadGtkSymbols(gdkLib, gdkFunctions)  != 0) return -1;
	if ( gioLib == NULL || loadGtkSymbols(gdkLib, gioFunctions)  != 0) return -1;
	if ( glibLib == NULL || loadGtkSymbols(gdkLib, glibFunctions)  != 0) return -1;
	if ( pixLib == NULL || loadGtkSymbols(pixLib, pixFunctions)  != 0) return -1;
	if ( objLib == NULL || loadGtkSymbols(objLib, gobjFunctions) != 0) return -1;

	return 0;
}