changeset 588:1b398af1ec38

Implemented dynamic loading of the Mozilla renderer.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Mon, 23 May 2005 01:43:36 +0000
parents 9e81f23b57ae
children bb439280ece2
files configure configure.in gtk/dw.c
diffstat 3 files changed, 147 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/configure	Sun May 22 19:14:15 2005 +0000
+++ b/configure	Mon May 23 01:43:36 2005 +0000
@@ -3629,7 +3629,18 @@
 fi
 
 	if test x"$PKG_CFG" != x; then
-	  GTK_LIBS=`$PKG_CFG --silence-errors --libs gtk+-2.0 gthread-2.0 mozilla-gtkmozembed`
+	  GTK_LIBS=`$PKG_CFG --silence-errors --libs gtk+-2.0 gthread-2.0`
+	  MOZEMBED_LIBS=`$PKG_CFG --silence-errors --libs firefox-gtkmozembed`
+	  MOZEMBED_CFLAGS=`$PKG_CFG --silence-errors --cflags firefox-gtkmozembed`
+	  RPATH=`$PKG_CFG --silence-errors --libs-only-L firefox-gtkmozembed | cut -b 3-`
+	  if test x"$MOZEMBED_LIBS" = x; then
+	  	MOZEMBED_LIBS=`$PKG_CFG --silence-errors --libs mozilla-gtkmozembed`
+	  	MOZEMBED_CFLAGS=`$PKG_CFG --silence-errors --cflags mozilla-gtkmozembed`
+		RPATH=`$PKG_CFG --silence-errors --libs-only-L mozilla-gtkmozembed | cut -b 3-`
+          fi
+	  if test x"$RPATH" != x; then
+          	RPATH="-Wl,-R$RPATH"
+          fi
 	fi
 
 	if test x"$GTK_LIBS" = x; then
@@ -4496,8 +4507,8 @@
   rm -f conf.gdkimlibtest
 
 	else
-	  GTK_CFLAGS=`$PKG_CFG --cflags gtk+-2.0 gthread-2.0 mozilla-gtkmozembed`
-	  GTK_LIBS=`$PKG_CFG --libs gtk+-2.0 gthread-2.0 mozilla-gtkmozembed`
+	  GTK_CFLAGS=`$PKG_CFG --cflags gtk+-2.0 gthread-2.0`
+	  GTK_LIBS=`$PKG_CFG --libs gtk+-2.0 gthread-2.0`
 	fi
 fi
 
@@ -4800,10 +4811,12 @@
 fi
 
 
-CFLAGS="$CFLAGS $GTK_CFLAGS $GDK_IMLIB_FLAGS"
-LIBS="$LIBS $GTK_LIBS $PTHREAD_LIBS $GDK_IMLIB_LIBS"
-
-echo "$as_me:$LINENO: checking for gtk_moz_embed_new in -lgtkembedmoz" >&5
+CFLAGS="$CFLAGS $GTK_CFLAGS $GDK_IMLIB_FLAGS $MOZEMBED_CFLAGS"
+
+if test x"$MOZEMBED_LIBS" != x; then
+	SAVE_LIBS="$LIBS"
+	LIBS="$LIBS $GTK_LIBS $PTHREAD_LIBS $GDK_IMLIB_LIBS $MOZEMBED_LIBS"
+	echo "$as_me:$LINENO: checking for gtk_moz_embed_new in -lgtkembedmoz" >&5
 echo $ECHO_N "checking for gtk_moz_embed_new in -lgtkembedmoz... $ECHO_C" >&6
 if test "${ac_cv_lib_gtkembedmoz_gtk_moz_embed_new+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -4865,6 +4878,10 @@
 
 fi
 
+        LIBS="$SAVE_LIBS"
+fi
+
+LIBS="$RPATH $LIBS $GTK_LIBS $PTHREAD_LIBS $GDK_IMLIB_LIBS"
 
 RM="rm -f"
 LN="ln -s"
--- a/configure.in	Sun May 22 19:14:15 2005 +0000
+++ b/configure.in	Mon May 23 01:43:36 2005 +0000
@@ -64,7 +64,18 @@
 else
 	AC_CHECK_PROG(PKG_CFG, pkg-config, pkg-config)
 	if test x"$PKG_CFG" != x; then
-	  GTK_LIBS=`$PKG_CFG --silence-errors --libs gtk+-2.0 gthread-2.0 mozilla-gtkmozembed`
+	  GTK_LIBS=`$PKG_CFG --silence-errors --libs gtk+-2.0 gthread-2.0`
+	  MOZEMBED_LIBS=`$PKG_CFG --silence-errors --libs firefox-gtkmozembed`
+	  MOZEMBED_CFLAGS=`$PKG_CFG --silence-errors --cflags firefox-gtkmozembed`
+	  RPATH=`$PKG_CFG --silence-errors --libs-only-L firefox-gtkmozembed | cut -b 3-`
+	  if test x"$MOZEMBED_LIBS" = x; then
+	  	MOZEMBED_LIBS=`$PKG_CFG --silence-errors --libs mozilla-gtkmozembed`
+	  	MOZEMBED_CFLAGS=`$PKG_CFG --silence-errors --cflags mozilla-gtkmozembed`
+		RPATH=`$PKG_CFG --silence-errors --libs-only-L mozilla-gtkmozembed | cut -b 3-`
+          fi
+	  if test x"$RPATH" != x; then
+          	RPATH="-Wl,-R$RPATH"
+          fi
 	fi
 
 	if test x"$GTK_LIBS" = x; then
@@ -72,8 +83,8 @@
 	  AM_PATH_GTK(1.2.0,,AC_MSG_ERROR(AC_MSG_ERROR(Cannot find GTK: Is gtk-config in path?)), gthread)
 	  AM_PATH_GDK_IMLIB(1.9.4, AC_DEFINE(USE_IMLIB), AC_MSG_ERROR(IMLIB not found or too old. Dynamic Windows cannot build without it.))
 	else
-	  GTK_CFLAGS=`$PKG_CFG --cflags gtk+-2.0 gthread-2.0 mozilla-gtkmozembed`
-	  GTK_LIBS=`$PKG_CFG --libs gtk+-2.0 gthread-2.0 mozilla-gtkmozembed`
+	  GTK_CFLAGS=`$PKG_CFG --cflags gtk+-2.0 gthread-2.0`
+	  GTK_LIBS=`$PKG_CFG --libs gtk+-2.0 gthread-2.0`
 	fi
 fi
 
@@ -87,10 +98,16 @@
   )
 )
 
-CFLAGS="$CFLAGS $GTK_CFLAGS $GDK_IMLIB_FLAGS"
-LIBS="$LIBS $GTK_LIBS $PTHREAD_LIBS $GDK_IMLIB_LIBS"
+CFLAGS="$CFLAGS $GTK_CFLAGS $GDK_IMLIB_FLAGS $MOZEMBED_CFLAGS"
 
-AC_CHECK_LIB(gtkembedmoz,gtk_moz_embed_new,AC_DEFINE(USE_GTKMOZEMBED),)
+if test x"$MOZEMBED_LIBS" != x; then
+	SAVE_LIBS="$LIBS"
+	LIBS="$LIBS $GTK_LIBS $PTHREAD_LIBS $GDK_IMLIB_LIBS $MOZEMBED_LIBS"
+	AC_CHECK_LIB(gtkembedmoz,gtk_moz_embed_new,AC_DEFINE(USE_GTKMOZEMBED),)
+        LIBS="$SAVE_LIBS"
+fi
+
+LIBS="$RPATH $LIBS $GTK_LIBS $PTHREAD_LIBS $GDK_IMLIB_LIBS"
 
 RM="rm -f"
 LN="ln -s"
--- a/gtk/dw.c	Sun May 22 19:14:15 2005 +0000
+++ b/gtk/dw.c	Mon May 23 01:43:36 2005 +0000
@@ -31,6 +31,8 @@
 #endif
 #ifdef USE_GTKMOZEMBED
 #include <gtkmozembed.h>
+#undef GTK_TYPE_MOZ_EMBED
+#define GTK_TYPE_MOZ_EMBED             (_dw_moz_embed_get_type())
 #endif
 #if GTK_MAJOR_VERSION > 1
 #include <gdk-pixbuf/gdk-pixbuf.h>
@@ -124,6 +126,18 @@
 static gint _switch_page_event(GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer data);
 static gint _column_click_event(GtkWidget *widget, gint column_num, gpointer data);
 
+/* Embedable Mozilla functions*/
+#ifdef USE_GTKMOZEMBED
+void (*_gtk_moz_embed_go_back)(GtkMozEmbed *) = NULL;
+void (*_gtk_moz_embed_go_forward)(GtkMozEmbed *) = NULL;
+void (*_gtk_moz_embed_load_url)(GtkMozEmbed *, const char *) = NULL;
+void (*_gtk_moz_embed_reload)(GtkMozEmbed *, guint32) = NULL;
+void (*_gtk_moz_embed_stop_load)(GtkMozEmbed *) = NULL;
+void (*_gtk_moz_embed_render_data)(GtkMozEmbed *, const char *, guint32, const char *, const char *) = NULL;
+GtkWidget *(*_gtk_moz_embed_new)(void) = NULL;
+GtkType (*_dw_moz_embed_get_type)(void) = NULL;
+#endif
+
 typedef struct
 {
 	GdkPixmap *pixmap;
@@ -1860,6 +1874,65 @@
 	}
 }
 
+/* Try to load the mozilla embed shared libary */
+#ifdef USE_GTKMOZEMBED
+#include <ctype.h>
+void init_mozembed(void)
+{
+	void *handle = NULL;
+	FILE *fp = popen("pkg-config --libs-only-L mozilla-gtkmozembed", "r");
+	char output[1024];
+
+	/* First we try to get the correct location
+	 * from pkg-config.
+     */
+	if(fp)
+	{
+		fgets(output, 1024, fp);
+
+		printf("Output: %s\n", output);
+		if(output[0] == '-' && output[1] == 'L')
+		{
+			int x, len = strlen(output);
+
+			for(x=len;x>0;x--)
+			{
+				if(!isalpha(output[x]) && !isnumber(output[x]) && output[x] != '/')
+					output[x] = 0;
+			}
+			strncat(output, "/libgtkembedmoz.so", 1024);
+			handle = dlopen(&output[2], RTLD_NOW);
+			if(!handle)
+				printf("Output: %s Error: %s\n", &output[2], dlerror());
+		}
+		fclose(fp);
+	}
+	/* Try the default path */
+	if(!handle)
+		handle = dlopen("libgtkembedmoz.so", RTLD_NOW);
+	/* Finally try some common locations */
+	if(!handle)
+		handle = dlopen("/usr/X11R6/lib/mozilla/libgtkembedmoz.so", RTLD_NOW);
+	if(!handle)
+		handle = dlopen("/usr/lib/mozilla/libgtkembedmoz.so", RTLD_NOW);
+	if(!handle)
+		handle = dlopen("/usr/local/lib/mozilla/libgtkembedmoz.so", RTLD_NOW);
+
+	/* If we loaded it, grab the symbols we want */
+	if(handle)
+	{
+		_gtk_moz_embed_go_back = dlsym(handle, "gtk_moz_embed_go_back");
+		_gtk_moz_embed_go_forward = dlsym(handle, "gtk_moz_embed_go_forward");
+		_gtk_moz_embed_load_url = dlsym(handle, "gtk_moz_embed_load_url");
+		_gtk_moz_embed_reload = dlsym(handle, "gtk_moz_embed_reload");
+		_gtk_moz_embed_stop_load = dlsym(handle, "gtk_moz_embed_stop_load");
+		_gtk_moz_embed_render_data = dlsym(handle, "gtk_moz_embed_render_data");
+		_dw_moz_embed_get_type = dlsym(handle, "gtk_moz_embed_get_type");
+		_gtk_moz_embed_new = dlsym(handle, "gtk_moz_embed_new");
+	}
+}
+#endif
+
 /*
  * Initializes the Dynamic Windows engine.
  * Parameters:
@@ -1904,6 +1977,10 @@
 
 	gtk_rc_parse_string("style \"gtk-tooltips-style\" { bg[NORMAL] = \"#eeee00\" } widget \"gtk-tooltips\" style \"gtk-tooltips-style\"");
 
+#ifdef USE_GTKMOZEMBED
+	init_mozembed();
+#endif
+
 	return TRUE;
 }
 
@@ -9855,23 +9932,26 @@
 #ifdef USE_GTKMOZEMBED
 	int _locked_by_me = FALSE;
 
+	if(!_gtk_moz_embed_new)
+		return;
+
 	DW_MUTEX_LOCK;
 	switch(action)
 	{
 	case DW_HTML_GOBACK:
-        gtk_moz_embed_go_back(GTK_MOZ_EMBED(handle));
+		_gtk_moz_embed_go_back(GTK_MOZ_EMBED(handle));
 		break;
 	case DW_HTML_GOFORWARD:
-        gtk_moz_embed_go_forward(GTK_MOZ_EMBED(handle));
+		_gtk_moz_embed_go_forward(GTK_MOZ_EMBED(handle));
 		break;
 	case DW_HTML_GOHOME:
-		gtk_moz_embed_load_url(GTK_MOZ_EMBED(handle), "http://dwindows.netlabs.org");
+		_gtk_moz_embed_load_url(GTK_MOZ_EMBED(handle), "http://dwindows.netlabs.org");
 		break;
 	case DW_HTML_RELOAD:
-        gtk_moz_embed_reload(GTK_MOZ_EMBED(handle), 0);
+		_gtk_moz_embed_reload(GTK_MOZ_EMBED(handle), 0);
 		break;
 	case DW_HTML_STOP:
-        gtk_moz_embed_stop_load(GTK_MOZ_EMBED(handle));
+		_gtk_moz_embed_stop_load(GTK_MOZ_EMBED(handle));
 		break;
 	}
 	DW_MUTEX_UNLOCK;
@@ -9892,8 +9972,11 @@
 #ifdef USE_GTKMOZEMBED
 	int _locked_by_me = FALSE;
 
-	DW_MUTEX_LOCK;
-    gtk_moz_embed_render_data(GTK_MOZ_EMBED(handle), string, strlen(string), "", "");
+	if(!_gtk_moz_embed_new)
+		return -1;
+
+	DW_MUTEX_LOCK;
+	_gtk_moz_embed_render_data(GTK_MOZ_EMBED(handle), string, strlen(string), "", "");
 	DW_MUTEX_UNLOCK;
 	return 0;
 #endif
@@ -9914,8 +9997,11 @@
 #ifdef USE_GTKMOZEMBED
 	int _locked_by_me = FALSE;
 
-	DW_MUTEX_LOCK;
-	gtk_moz_embed_load_url(GTK_MOZ_EMBED(handle), url);
+	if(!_gtk_moz_embed_new)
+		return -1;
+
+	DW_MUTEX_LOCK;
+	_gtk_moz_embed_load_url(GTK_MOZ_EMBED(handle), url);
 	DW_MUTEX_UNLOCK;
 	return 0;
 #endif
@@ -9934,8 +10020,11 @@
 	GtkWidget *widget;
 	int _locked_by_me = FALSE;
 
-	DW_MUTEX_LOCK;
-	widget = gtk_moz_embed_new();
+	if(!_gtk_moz_embed_new)
+		return NULL;
+
+	DW_MUTEX_LOCK;
+	widget = _gtk_moz_embed_new();
 	DW_MUTEX_UNLOCK;
 	return widget;
 #else