由于工作需要,研究了一下gecko的引擎嵌入的问题,花了三天多的时间,总算成功让gecko在Gtk控件下正确显示网页了。其实并不复杂,如果能找对正确的做法。基本思路是:
Makefile如下:
test.cpp如下:
#include
"
nsXPCOM.h
"
#include
"
nscore.h
"
#include
"
nsEmbedAPI.h
"
#include
"
nsWeakReference.h
"
#include
"
nsIWebBrowserChrome.h
"
#include
"
nsIEmbeddingSiteWindow.h
"
#include
"
nsCOMPtr.h
"
#include
"
nsIInterfaceRequestor.h
"
#include
"
nsEmbedString.h
"
#include
"
nsIWebBrowser.h
"
#include
"
widget/nsIBaseWindow.h
"
#include
"
nsEmbedCID.h
"
#include
"
nsComponentManagerUtils.h
"
#include
"
nsIWebProgressListener.h
"
#include
"
docshell/nsIWebNavigation.h
"
#include
"
docshell/nsIDocShellTreeItem.h
"
#include
<
iostream
>
#include
<
gtk
/
gtk.h
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
using
namespace
std;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
class
SillyBrowser:
public
nsIWebBrowserChrome,
p
- 下载mozilla的cvs代码。参考moziila官方的说明。这里重要的是要选择checkout xulrunner。我在多次尝试后,发现只有xulrunner能够正常的运行自己写的demo和embedding的demo,当然官方提供的TestGtkEmbed在browser下跑时也会有问题,如果不想走弯路,xulrunner是正确的选择。.mozconfig参考如下:
ff_topsrc =/ mnt / sda2 / devel / mozilla
. $ {ff_topsrc} / xulrunner / config / mozconfig
mk_add_options MOZ_OBJDIR =$ {ff_topsrc} / xulrunner-build
ac_add_options --enable-application = xulrunner
ac_add_options --enable-optimize
ac_add_options --enable-default-toolkit = cairo-gtk2
ac_add_options --enable-xft
ac_add_options --enable-shared
ac_add_options --disable-static
ac_add_options --enable- debug
ac_add_options --enable-libxul
ac_add_options --disable-tests
- 编译xulrunner。编译的.mozconfig文件中记得按照xulrunner编写,必须enable libxul。
Makefile如下:
MOZ_ROOT
=/
mnt
/
sda2
/
devel
/
mozilla
/
xulrunner-build
LDFLAGS = -lpthread -Wl , -rpath -Wl ,$ {MOZ_ROOT} / dist / bin / -Wl , -rpath -Wl ,$ {MOZ_ROOT} / dist / lib
-L $ {MOZ_ROOT} / dist / lib / -lxpcom -lnspr4
CXXFLAGS = -ggdb -fno-rtti -fno-exceptions -Wall -Wconversion -Wpointer-arith -Wcast-align
-Woverloaded-virtual -Wsynth -Wno-ctor-dtor-privacy -Wno-non-virtual-dtor -Wno-long-long -pedantic
-fshort-wchar -pthread -pipe -DNDEBUG -DTRIMMED -O -I / usr / include / gtk- 2.0 -I / usr / lib / gtk- 2.0 / include
-I / usr / include / atk- 1.0 -I / usr / include / cairo -I / usr / include / pango- 1.0 -I / usr / include / glib- 2.0
-I / usr / lib / glib- 2.0 / include -I / usr / include / freetype2 -I / usr / include / libpng12
COMPILE_CFLAGS = -I $ {MOZ_ROOT} / dist / include / system_wrappers
-include / mnt / sda2 / devel / mozilla / config / gcc_hidden . h -DMOZILLA_STRICT_API
-DOSTYPE = " Linux2.6.22 " -DOSARCH = Linux -I $ {MOZ_ROOT} / dist / include / xpcom
-I $ {MOZ_ROOT} / dist / include / intl -I $ {MOZ_ROOT} / dist / include / embedcomponents
-I $ {MOZ_ROOT} / dist / include -I $ {MOZ_ROOT} / dist / include / embed_base
-I $ {MOZ_ROOT} / dist / include / nspr -I $ {MOZ_ROOT} / dist / include / gtkembedmoz
-DMOZ_PNG_READ -DMOZ_PNG_WRITE -I $ {MOZ_ROOT} / dist / sdk / include
-Wall -W -Wno-unused -Wpointer-arith -Wcast-align -Wno-long-long -pedantic
-pthread -pipe -DNDEBUG -DTRIMMED -O -include $ {MOZ_ROOT} / mozilla-config . h
-DMOZILLA_CLIENT
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
all: test
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
test: test . o
g ++ -o test $( LDFLAGS ) `pkg-config --libs gtk + - 2.0 ` test . o $ {MOZ_ROOT} / embedding / base / libembed_base_s . a $ {MOZ_ROOT} / xpcom / glue / standalone / libxpcomglue . a
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
$
{MOZ_ROOT}
/
embedding
/
base
/
libembed_base_s
.
a
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
test
.
o: test
.
cpp
g
++
-c
$(
CXXFLAGS
)
$(
COMPILE_CFLAGS
)
`pkg-config --cflags gtk
+
-
2.0
` test
.
cpp
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
clean:
rm *
.
o test
LDFLAGS = -lpthread -Wl , -rpath -Wl ,$ {MOZ_ROOT} / dist / bin / -Wl , -rpath -Wl ,$ {MOZ_ROOT} / dist / lib
-L $ {MOZ_ROOT} / dist / lib / -lxpcom -lnspr4
CXXFLAGS = -ggdb -fno-rtti -fno-exceptions -Wall -Wconversion -Wpointer-arith -Wcast-align
-Woverloaded-virtual -Wsynth -Wno-ctor-dtor-privacy -Wno-non-virtual-dtor -Wno-long-long -pedantic
-fshort-wchar -pthread -pipe -DNDEBUG -DTRIMMED -O -I / usr / include / gtk- 2.0 -I / usr / lib / gtk- 2.0 / include
-I / usr / include / atk- 1.0 -I / usr / include / cairo -I / usr / include / pango- 1.0 -I / usr / include / glib- 2.0
-I / usr / lib / glib- 2.0 / include -I / usr / include / freetype2 -I / usr / include / libpng12
COMPILE_CFLAGS = -I $ {MOZ_ROOT} / dist / include / system_wrappers
-include / mnt / sda2 / devel / mozilla / config / gcc_hidden . h -DMOZILLA_STRICT_API
-DOSTYPE = " Linux2.6.22 " -DOSARCH = Linux -I $ {MOZ_ROOT} / dist / include / xpcom
-I $ {MOZ_ROOT} / dist / include / intl -I $ {MOZ_ROOT} / dist / include / embedcomponents
-I $ {MOZ_ROOT} / dist / include -I $ {MOZ_ROOT} / dist / include / embed_base
-I $ {MOZ_ROOT} / dist / include / nspr -I $ {MOZ_ROOT} / dist / include / gtkembedmoz
-DMOZ_PNG_READ -DMOZ_PNG_WRITE -I $ {MOZ_ROOT} / dist / sdk / include
-Wall -W -Wno-unused -Wpointer-arith -Wcast-align -Wno-long-long -pedantic
-pthread -pipe -DNDEBUG -DTRIMMED -O -include $ {MOZ_ROOT} / mozilla-config . h
-DMOZILLA_CLIENT
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
all: test
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
test: test . o
g ++ -o test $( LDFLAGS ) `pkg-config --libs gtk + - 2.0 ` test . o $ {MOZ_ROOT} / embedding / base / libembed_base_s . a $ {MOZ_ROOT} / xpcom / glue / standalone / libxpcomglue . a
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
test.cpp如下:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)