[요청] 사례금 지급 ^^; 모질라 브라우저 엔진을 xlib에 연결 시킨 경험 있으신분..

lobin2의 이미지

이 문제로 3주 가까이 해외포럼도 뒤져봤지만... 결과가 안나오네요.. ㅠ.ㅠ

Xlib로 구현된 메인 프로그램에 모질라 브라우저 엔진을 연결시키는 작업입니다.
현재 모질라 홈페이지를 가보면 Embed Mozilla를 편하게 쓸 수 있도록 GtkMozEmbed나 Ruby를 통해서 편한 인터페이스를 제공하고 있습니다.
하지만 Xlib로는 제공하고 있질 않네요... Embed Mozilla를 Xlib로 연결시키면 가장 Best지만... 제 예상으로는 힘들 것 같네요.
혹시... 브라우저 엔진을 Xlib로 빌드해서 프로그램에 연결해 보신 분의 도움이 필요합니다.

내용: 모질라 브라우저 엔진을 Xlib로 빌드해서 메인 프로그램에 연결 시키는 작업 + 약간의 Embedding
사례금: 개인 프로젝트라서 많이는 못드리구요 10만원 + a 정도 예상합니다.
연락처: gateslee2@hotmail.com ( 016-411-8187 )

많은 시도를 하다가 최종적으로 이 방법을 택하게 됐는데... 너무 질책하지 말아 주셨으면 합니다. ^^;
브라우저 엔진을 Xlib로 연결해 보신 경험이 있으신 분의 연락 부탁드립니다.

ganadist의 이미지

그냥 gtkmozembed쓰는걸 추천합니다.

필요한 것만 집어넣고 cram으로 구겨넣으면 8메가 안에도 들어갈 수 있을 것입니다.

----
Do not feed troll!

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

lobin2의 이미지

브라우저 엔진 외에 동영상 엔진과 mp3 엔진을 이미 xlib로 올려놓은 상태입니다.
화면의 일부분에 표시가 되어야 되고, GTK가 멀티 쓰레드에 문제가 좀 있어서 Xlib로 연결시켜야 하는 상황입니다.
GtkMozEmbed로 구현을 해 봤는데, 이 문제외에도 여러 문제가 발생해서 최종적으로 xlib로 연결하는 방법을 택하게 된 것입니다.
도움 부탁드립니다.

ganadist의 이미지

동영상과 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!

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

lobin2의 이미지

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*형으로 연결시키는 방법이 없을까요?

ganadist의 이미지


GtkWidget *browser = gtk_moz_embed_new();
GdkWindow *xwin = gdk_window_foreign_new(xid);
gtk_widget_set_parent_window(browser, xwin);

----
Do not feed troll!

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

lobin2의 이미지

일단 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);
}
lobin2의 이미지

..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.