[요청] 사례금 지급 ^^; 모질라 브라우저 엔진을 xlib에 연결 시킨 경험 있으신분..
글쓴이: lobin2 / 작성시간: 목, 2007/07/05 - 11:26오전
이 문제로 3주 가까이 해외포럼도 뒤져봤지만... 결과가 안나오네요.. ㅠ.ㅠ
Xlib로 구현된 메인 프로그램에 모질라 브라우저 엔진을 연결시키는 작업입니다.
현재 모질라 홈페이지를 가보면 Embed Mozilla를 편하게 쓸 수 있도록 GtkMozEmbed나 Ruby를 통해서 편한 인터페이스를 제공하고 있습니다.
하지만 Xlib로는 제공하고 있질 않네요... Embed Mozilla를 Xlib로 연결시키면 가장 Best지만... 제 예상으로는 힘들 것 같네요.
혹시... 브라우저 엔진을 Xlib로 빌드해서 프로그램에 연결해 보신 분의 도움이 필요합니다.
내용: 모질라 브라우저 엔진을 Xlib로 빌드해서 메인 프로그램에 연결 시키는 작업 + 약간의 Embedding
사례금: 개인 프로젝트라서 많이는 못드리구요 10만원 + a 정도 예상합니다.
연락처: gateslee2@hotmail.com ( 016-411-8187 )
많은 시도를 하다가 최종적으로 이 방법을 택하게 됐는데... 너무 질책하지 말아 주셨으면 합니다. ^^;
브라우저 엔진을 Xlib로 연결해 보신 경험이 있으신 분의 연락 부탁드립니다.
Forums:


그냥 gtkmozembed쓰는걸
그냥 gtkmozembed쓰는걸 추천합니다.
필요한 것만 집어넣고 cram으로 구겨넣으면 8메가 안에도 들어갈 수 있을 것입니다.
----
Do not feed troll!
----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러
gtkmozembed를 쓸 수 없는 상황이라...
브라우저 엔진 외에 동영상 엔진과 mp3 엔진을 이미 xlib로 올려놓은 상태입니다.
화면의 일부분에 표시가 되어야 되고, GTK가 멀티 쓰레드에 문제가 좀 있어서 Xlib로 연결시켜야 하는 상황입니다.
GtkMozEmbed로 구현을 해 봤는데, 이 문제외에도 여러 문제가 발생해서 최종적으로 xlib로 연결하는 방법을 택하게 된 것입니다.
도움 부탁드립니다.
동영상과 mp3는
동영상과 mp3는 xlib쓰도록 하고 브라우져는 브라우져대로 돌아가게 하면 될텐데요?
Xlib으로 Window를 만든 다음 해당 window id로 gdkwindow를 만들고 그위에 gtkmozembed를 올리면 될 것 같습니다만..
http://developer.gnome.org/doc/API/2.0/gdk/gdk-X-Window-System-Interaction.html#gdk-window-foreign-new
http://developer.gnome.org/doc/API/2.0/gtk/GtkWidget.html#gtk-widget-set-parent-window
를 살펴보시기 바랍니다.
그리고 멀티쓰레드쪽은 화면을 그리는 부분 앞뒤에 적절히 gdk_threads_enter()와 gdk_threads_leave()를 호출해주시면 될껍니다.
----
Do not feed troll!
----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러
그렇게 하면 다른 문제가 발생해요...
GdkWindow는 GtkWidget의 한 멤버 변수이고, GtkWidget의 다른 멤버 변수들의 값을 구하지 못해서 아래와 같이 디폴트 윈도우를 생성하였습니다.
GtkWidget *gtkWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
이렇게 생성된 gtkWindow의 GdkWindow 멤버변수의 말씀해 주신 함수를 써서 연결을 시켰는데, 제대로 동작하지 않네요.
또한 gtk_window_new를 써서 생성한 윈도우가 GTK_WINDOW_POPUP을 써도... xlib에서 생성한 parentwindow 밑으로 들어가는게 아니라서
프로그램을 실행하면 2개의 창이 테스크바에 뜨게 되는 문제가 있네요.
GtkMozembed의 nsIBaseWindow::InitWindow 의 첫번째 인자가 GtkWidget형으로 window가 들어가서 브라우저와 연결이 되는데,
이를 Xlib의 Window*형으로 연결시키는 방법이 없을까요?
GtkWidget *browser =
----
Do not feed troll!
----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러
말씀해 주신대로 했는데도 안되네요...
일단 Firefox/mozilla/embedding/browser/gtk/tests의 TestGtkEmbed.cpp를 아래의 코드로 최소화 시켰습니다.
그리고.. 말씀해 주신 방식대로 "// Test " 아래 부분을 수정하고, 적당히 main에서 인자를 넘겨 보여주려고 시도를 했는데,
아무런 화면이 나오질 않네요....
main.cpp에서 CGtkMozEmbed.Run을 실행해서 Display*와 Window* 값을 넘기고 아래의 루틴을 탑니다...
ganadist님.. 죄송하지만.. 아래 소스를 Window*로 표시하도록 수정좀 해 주시면 안될까요...
너무나 어렵네요....
#include "TestGtkEmbedClass.h" #include "gtkmozembed.h" #include <gtk/gtk.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <pthread.h> // mozilla specific headers #include "nsIDOMKeyEvent.h" #include "nsIDOMMouseEvent.h" #include "nsIDOMUIEvent.h" #include "prenv.h" #ifdef NS_TRACE_MALLOC #include "nsTraceMalloc.h" #endif #ifdef MOZ_JPROF #include "jprof.h" #endif typedef struct _TestGtkBrowser { GtkWidget *topLevelWindow; GtkWidget *topLevelVBox; GtkWidget *urlEntry; GtkWidget *mozEmbed; } TestGtkBrowser; // the list of browser windows currently open GList *browser_list = g_list_alloc(); Display* s_dis; Window* s_xid; GdkWindow *xwin; static TestGtkBrowser *new_gtk_browser (guint32 chromeMask); static void set_browser_visibility (TestGtkBrowser *browser, gboolean visibility); static int num_browsers = 0; // callbacks from the UI static gboolean delete_cb (GtkWidget *widget, GdkEventAny *event, TestGtkBrowser *browser); static void destroy_cb (GtkWidget *widget, TestGtkBrowser *browser); // callbacks from the singleton object static void new_window_orphan_cb (GtkMozEmbedSingle *embed, GtkMozEmbed **retval, guint chromemask, gpointer data); int mainmodule(int argc, char **argv) { #ifdef NS_TRACE_MALLOC argc = NS_TraceMallocStartupArgs(argc, argv); #endif gtk_set_locale(); gtk_init(&argc, &argv); #ifdef MOZ_JPROF setupProfilingStuff(); #endif char *home_path; char *full_path; home_path = PR_GetEnv("HOME"); if (!home_path) { fprintf(stderr, "Failed to get HOME\n"); exit(1); } full_path = g_strdup_printf("%s/%s", home_path, ".TestGtkEmbed"); gtk_moz_embed_set_profile_path(full_path, "TestGtkEmbed"); TestGtkBrowser *browser = new_gtk_browser(GTK_MOZ_EMBED_FLAG_DEFAULTCHROME); // set our minimum size gtk_widget_set_usize(browser->mozEmbed, 400, 400); set_browser_visibility(browser, TRUE); gtk_moz_embed_load_url(GTK_MOZ_EMBED(browser->mozEmbed), "http://www.google.com"); // get the singleton object and hook up to its new window callback // so we can create orphaned windows. GtkMozEmbedSingle *single; single = gtk_moz_embed_single_get(); if (!single) { fprintf(stderr, "Failed to get singleton embed object!\n"); exit(1); } gtk_signal_connect(GTK_OBJECT(single), "new_window_orphan", GTK_SIGNAL_FUNC(new_window_orphan_cb), NULL); gtk_main(); return 0; } static TestGtkBrowser * new_gtk_browser(guint32 chromeMask) { guint32 actualChromeMask = chromeMask; TestGtkBrowser *browser = 0; num_browsers++; browser = g_new0(TestGtkBrowser, 1); browser_list = g_list_prepend(browser_list, browser); g_print("new_gtk_browser\n"); if (chromeMask == GTK_MOZ_EMBED_FLAG_DEFAULTCHROME) actualChromeMask = GTK_MOZ_EMBED_FLAG_ALLCHROME; // create our new toplevel window browser->topLevelWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); // new vbox browser->topLevelVBox = gtk_vbox_new(FALSE, 0); // add it to the toplevel window gtk_container_add(GTK_CONTAINER(browser->topLevelWindow), browser->topLevelVBox); // create our new gtk moz embed widget browser->mozEmbed = gtk_moz_embed_new(); // Test /* xwin = gdk_window_foreign_new((GdkNativeWindow)(*s_xid)); printf("[TEST] s_xid=%d(0x%08x), xwin=0x%08x(%d)\n", *s_xid, s_xid, xwin, xwin); gtk_widget_set_parent_window(browser->mozEmbed, xwin);*/ // add it to the toplevel vbox gtk_box_pack_start(GTK_BOX(browser->topLevelVBox), browser->mozEmbed, TRUE, // expand TRUE, // fill 0); // padding // catch the destruction of the toplevel window gtk_signal_connect(GTK_OBJECT(browser->topLevelWindow), "delete_event", GTK_SIGNAL_FUNC(delete_cb), browser); gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "destroy", GTK_SIGNAL_FUNC(destroy_cb), browser); // set the chrome type so it's stored in the object gtk_moz_embed_set_chrome_mask(GTK_MOZ_EMBED(browser->mozEmbed), actualChromeMask); return browser; } void set_browser_visibility (TestGtkBrowser *browser, gboolean visibility) { gtk_widget_show(browser->mozEmbed); gtk_widget_show(browser->topLevelVBox); gtk_widget_show(browser->topLevelWindow); } gboolean delete_cb(GtkWidget *widget, GdkEventAny *event, TestGtkBrowser *browser) { g_print("delete_cb\n"); gtk_widget_destroy(widget); return TRUE; } void destroy_cb (GtkWidget *widget, TestGtkBrowser *browser) { GList *tmp_list; g_print("destroy_cb\n"); num_browsers--; tmp_list = g_list_find(browser_list, browser); browser_list = g_list_remove_link(browser_list, tmp_list); if (num_browsers == 0) gtk_main_quit(); } void new_window_orphan_cb (GtkMozEmbedSingle *embed, GtkMozEmbed **retval, guint chromemask, gpointer data) { g_print("new_window_orphan_cb\n"); g_print("chromemask is %d\n", chromemask); TestGtkBrowser *newBrowser = new_gtk_browser(chromemask); *retval = GTK_MOZ_EMBED(newBrowser->mozEmbed); g_print("new browser is %p\n", (void *)*retval); } void* func2(void *argv) { mainmodule(1, (char**)argv); return NULL; } CGtkMozEmbed::CGtkMozEmbed() { } CGtkMozEmbed::~CGtkMozEmbed() { } void CGtkMozEmbed::Run(int argc, char **argv, Display* dis, Window* xwin) { s_dis = dis; s_xid = xwin; //pthread_t thread; //pthread_create(&thread, NULL, func2, (void*)argv); mainmodule(argc, argv); }댓글 삭제가 없네요 ㅠ.ㅠ
..
댓글 달기