diff --git a/src/chrome.manifest b/src/chrome.manifest index a53f94e..dde9827 100644 --- a/src/chrome.manifest +++ b/src/chrome.manifest @@ -3,8 +3,6 @@ skin firetray classic/1.0 chrome/skin/ locale firetray en-US chrome/locale/en-US/ resource firetray modules/ resource firetray modules/ -resource firetray-lib lib/linux/firetray_i686-gcc4.so abi=Linux_x86-gcc3 -#resource firetray-lib lib/win32/addon.dll abi=WINNT_x86-msvc overlay chrome://browser/content/browser.xul chrome://firetray/content/overlay.xul overlay chrome://messenger/content/messenger.xul chrome://firetray/content/overlay.xul diff --git a/src/lib/linux/Makefile b/src/lib/linux/Makefile index 582a699..869380d 100644 --- a/src/lib/linux/Makefile +++ b/src/lib/linux/Makefile @@ -12,6 +12,16 @@ LIBS += $(shell pkg-config --libs $(deps)) libs = firetray_$(platform)-gcc$(GCCVERSION).so all: $(libs) + @echo + @echo add this line to chrome.manifest: + @echo -e "resource\tfiretray-lib\t\t\tlib/linux/$(libs)" + @echo + @echo and use + @echo 'Cu.import("resource://firetray/ctypes/libfiretray.jsm");' + @echo 'libfiretray.init();' + @echo '//...' + @echo 'libfiretray.shutdown();' + @echo $(libs): firetray.o $(CC) $(CFLAGS) $(LDFLAGS) $< $(LIBS) -o $@ diff --git a/src/modules/linux/FiretrayWindow.jsm b/src/modules/linux/FiretrayWindow.jsm index 2f76e19..4975b24 100644 --- a/src/modules/linux/FiretrayWindow.jsm +++ b/src/modules/linux/FiretrayWindow.jsm @@ -73,7 +73,7 @@ firetray.Window = { * @param window nsIDOMWindow from Services.wm * @return a gtk.GtkWindow.ptr */ - getGtkWindowHandle: function(window) { + getGtkWindowFromChromeWindow: function(window) { let baseWindow = window .QueryInterface(Ci.nsIInterfaceRequestor) .getInterface(Ci.nsIWebNavigation) @@ -154,13 +154,44 @@ firetray.Window = { return null; }, + addrPointedByInHex: function(ptr) { + return "0x"+ctypes.cast(ptr, ctypes.uintptr_t.ptr).contents.toString(16); + }, + + getGdkWindowFromNativeHandle: function(nativeHandle) { + let gdkw = new gdk.GdkWindow.ptr(ctypes.UInt64(nativeHandle)); // a new pointer to the GdkWindow + F.LOG("gdkw="+gdkw+" *gdkw="+this.addrPointedByInHex(gdkw)); + return gdkw; + }, + + getGtkWindowFromGdkWindow: function(gdkWin) { + let gptr = new gobject.gpointer; + gdk.gdk_window_get_user_data(gdkWin, gptr.address()); + F.LOG("gptr="+gptr+" *gptr="+this.addrPointedByInHex(gptr)); + let gtkw = ctypes.cast(gptr, gtk.GtkWindow.ptr); + let gtkw_voidp = ctypes.cast(gtkw, ctypes.void_t.ptr); + let gtkwid_top = gtk.gtk_widget_get_toplevel(ctypes.cast(gtkw, gtk.GtkWidget.ptr)); + gtkw = ctypes.cast(gtkwid_top, gtk.GtkWindow.ptr); + F.LOG("gtkw="+gtkw+" *gtkw="+this.addrPointedByInHex(gtkw)); + return gtkw; + }, + /* consider using getXIDFromChromeWindow() if you only need the XID */ getWindowsFromChromeWindow: function(win) { - let gtkWin = firetray.Window.getGtkWindowHandle(win); - let gdkWin = firetray.Window.getGdkWindowFromGtkWindow(gtkWin); + let baseWin = firetray.Handler.getWindowInterface(win, "nsIBaseWindow"); + let nativeHandle = baseWin.nativeHandle; // Moz' private pointer to the GdkWindow + F.LOG("nativeHandle="+nativeHandle); + let gtkWin, gdkWin; + if (nativeHandle) { // Gecko 17+ + gdkWin = firetray.Window.getGdkWindowFromNativeHandle(nativeHandle); + gtkWin = firetray.Window.getGtkWindowFromGdkWindow(gdkWin); + } else { + gtkWin = firetray.Window.getGtkWindowFromChromeWindow(win); + gdkWin = firetray.Window.getGdkWindowFromGtkWindow(gtkWin); + } let xid = firetray.Window.getXIDFromGdkWindow(gdkWin); F.LOG("XID="+xid); - return [gtkWin, gdkWin, xid]; + return [baseWin, gtkWin, gdkWin, xid]; }, getXIDFromChromeWindow: function(win) { @@ -435,7 +466,7 @@ firetray.Window = { getWindowTitle: function(xid) { let title = firetray.Handler.windows[xid].baseWin.title; - F.LOG("baseWin.title="+title); + F.LOG("|baseWin.title="+title+"|"); let tailIndex = title.indexOf(" - Mozilla "+firetray.Handler.appName); if (tailIndex !== -1) return title.substring(0, tailIndex); @@ -522,99 +553,11 @@ firetray.Handler.registerWindow = function(win) { F.LOG("register window"); // register - let [gtkWin, gdkWin, xid] = firetray.Window.getWindowsFromChromeWindow(win); - firetray.Window.checkSubscribedEventMasks(xid); + let [baseWin, gtkWin, gdkWin, xid] = firetray.Window.getWindowsFromChromeWindow(win); this.windows[xid] = {}; this.windows[xid].chromeWin = win; - this.windows[xid].baseWin = firetray.Handler.getWindowInterface(win, "nsIBaseWindow"); - - try { // TESTing nativeHandle - Cu.import("resource://firetray/ctypes/libfiretray.jsm"); -libfiretray.init(); - F.WARN("libfiretray available"); - - function addrPointedBy(ptr) { - return ctypes.cast(ptr, ctypes.uintptr_t.ptr).contents.toString(16); - } - - F.WARN("TEST gdkWin="+gdkWin+" gdkWin is actually a pointer to a GdkWindow"); - F.WARN("TEST *gdkWin=0x"+addrPointedBy(gdkWin)); - - let nativeHandle = this.windows[xid].baseWin.nativeHandle; - if ("undefined" === typeof(nativeHandle)) { - F.WARN("nativeHandle undefined"); - } else { - F.WARN("TEST nativeHandle="+nativeHandle+" this is Moz' private pointer to the GdkWindow !"); - - // construct GdkWindow.ptr from nativeHandle - let gdkw = new gdk.GdkWindow.ptr(ctypes.UInt64(nativeHandle)); - F.WARN("TEST gdkw="+gdkw+" a new pointer to a GdkWindow"); - F.WARN("gdkw isGdkWin="+libfiretray.gdk_is_window(ctypes.cast(gdkw, ctypes.void_t.ptr))); - - // check - if (firetray.js.strEquals(addrPointedBy(gdkWin), addrPointedBy(gdkw))) - F.WARN("OK: check"); - else - F.WARN("NOT OK: check"); - F.WARN("gdkWin="+gdkWin+" gdkw="+gdkw+" *gdkWin=0x"+addrPointedBy(gdkWin).toString(16)+" *gdkw=0x"+addrPointedBy(gdkw).toString(16)); - - // gdk.gdk_window_set_title(gdkw, "FOUDIL WAS HERE"); - - // getting the GtkWin from GdkWindow user_data - F.WARN("TEST *gtkWin=0x"+addrPointedBy(gtkWin)+" = REFERENCE"); - - let gptr = new gobject.gpointer; - gdk.gdk_window_get_user_data(gdkWin, gptr.address()); - F.WARN("\nTEST gptr-gdkWin="+gptr); - F.WARN("TEST *gptr-gdkWin=0x"+addrPointedBy(gptr)); - - gdk.gdk_window_get_user_data(gdkw, gptr.address()); - F.WARN("\nTEST gptr-gdkw="+gptr); - F.WARN("TEST *gptr-gdkw=0x"+addrPointedBy(gptr)); - - let gtkw = ctypes.cast(gptr, gtk.GtkWindow.ptr); - let gtkw_voidp = ctypes.cast(gtkw, ctypes.void_t.ptr); - F.WARN("gtkw isGtkWin="+libfiretray.gtk_is_window(gtkw_voidp)); - F.WARN("gtkw isGtkWid="+libfiretray.gtk_is_widget(gtkw_voidp)); - let gtkwid_top = gtk.gtk_widget_get_toplevel(ctypes.cast(gtkw, gtk.GtkWidget.ptr)); - F.WARN("gtkwid_top="+gtkwid_top); - gtkw = ctypes.cast(gtkwid_top, gtk.GtkWindow.ptr); - F.WARN("gtkw isGtkWin="+libfiretray.gtk_is_window(ctypes.cast(gtkw, ctypes.void_t.ptr))); - - if (firetray.js.strEquals(addrPointedBy(gtkWin), addrPointedBy(gtkw))) - F.WARN("OK: gtk"); - else - F.WARN("NOT OK: gtk"); - - gtk.gtk_window_set_decorated(gtkw, false); - -libfiretray.shutdown(); - F.WARN("OK"); - } - - } catch (x) {F.ERROR(x);} -// *** WARN firetray: libfiretray available -// *** WARN firetray: TEST gdkWin=GdkWindow.ptr(ctypes.UInt64("0xa1d2830")) gdkWin is actually a pointer to a GdkWindow -// *** WARN firetray: TEST *gdkWin=0x9f5df00 -// *** WARN firetray: TEST nativeHandle=0x9f63440 this is Moz' private pointer to the GdkWindow ! -// *** WARN firetray: TEST gdkw=GdkWindow.ptr(ctypes.UInt64("0x9f63440")) a new pointer to a GdkWindow -// *** WARN firetray: gdkw isGdkWin=1 -// *** WARN firetray: OK: check -// *** WARN firetray: gdkWin=GdkWindow.ptr(ctypes.UInt64("0xa1d2830")) gdkw=GdkWindow.ptr(ctypes.UInt64("0x9f63440")) *gdkW -// in=0x9f5df00 *gdkw=0x9f5df00 -// *** WARN firetray: TEST *gtkWin=0xa17bd18 = REFERENCE -// *** WARN firetray: -// TEST gptr-gdkWin=ctypes.voidptr_t(ctypes.UInt64("0xa1d28e0")) -// *** WARN firetray: TEST *gptr-gdkWin=0xa17bd18 -// *** WARN firetray: -// TEST gptr-gdkw=ctypes.voidptr_t(ctypes.UInt64("0x9f5d168")) -// *** WARN firetray: TEST *gptr-gdkw=0xabe8b00 -// *** WARN firetray: gtkw isGtkWin=0 -// *** WARN firetray: gtkw isGtkWid=1 -// *** WARN firetray: gtkwid_top=GtkWidget.ptr(ctypes.UInt64("0xa1d28e0")) -// *** WARN firetray: gtkw isGtkWin=1 -// *** WARN firetray: OK - + this.windows[xid].baseWin = baseWin; + firetray.Window.checkSubscribedEventMasks(xid); try { this.gtkWindows.insert(xid, gtkWin); this.gdkWindows.insert(xid, gdkWin); diff --git a/testing/bug760802.patch b/testing/bug760802.patch deleted file mode 100644 index 8899b91..0000000 --- a/testing/bug760802.patch +++ /dev/null @@ -1,153 +0,0 @@ -diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp ---- a/docshell/base/nsDocShell.cpp -+++ b/docshell/base/nsDocShell.cpp -@@ -4860,6 +4860,13 @@ - } - - NS_IMETHODIMP -+nsDocShell::GetNativeHandle(JSContext *cx, jsval *ret) -+{ -+ NS_ASSERTION(false, "Not Yet Implemented: nsDocShell"); -+ return NS_ERROR_NOT_IMPLEMENTED; -+} -+ -+NS_IMETHODIMP - nsDocShell::GetVisibility(bool * aVisibility) - { - NS_ENSURE_ARG_POINTER(aVisibility); -diff --git a/embedding/browser/webBrowser/nsDocShellTreeOwner.cpp b/embedding/browser/webBrowser/nsDocShellTreeOwner.cpp ---- a/embedding/browser/webBrowser/nsDocShellTreeOwner.cpp -+++ b/embedding/browser/webBrowser/nsDocShellTreeOwner.cpp -@@ -584,6 +584,14 @@ - } - - NS_IMETHODIMP -+nsDocShellTreeOwner::GetNativeHandle(JSContext *cx, jsval *ret) -+{ -+ //XXX First Check In -+ NS_ASSERTION(false, "You can't call this: nsDocShellTreeOwner"); -+ return NS_ERROR_NULL_POINTER; -+} -+ -+NS_IMETHODIMP - nsDocShellTreeOwner::GetVisibility(bool* aVisibility) - { - nsCOMPtr ownerWin = GetOwnerWin(); -diff --git a/embedding/browser/webBrowser/nsWebBrowser.cpp b/embedding/browser/webBrowser/nsWebBrowser.cpp ---- a/embedding/browser/webBrowser/nsWebBrowser.cpp -+++ b/embedding/browser/webBrowser/nsWebBrowser.cpp -@@ -7,6 +7,7 @@ - #include "nsWebBrowser.h" - - // Helper Classes -+#include "nsDOMJSUtils.h" //XXX for jsval - #include "nsGfxCIID.h" - #include "nsWidgetsCID.h" - -@@ -1380,6 +1381,13 @@ - return NS_OK; - } - -+NS_IMETHODIMP nsWebBrowser::GetNativeHandle(JSContext *cx, jsval *ret) -+{ -+ //XXX First Check In -+ NS_ASSERTION(false, "Not Yet Implemented"); -+ return NS_OK; -+} -+ - NS_IMETHODIMP nsWebBrowser::GetVisibility(bool* visibility) - { - NS_ENSURE_ARG_POINTER(visibility); -diff --git a/widget/nsIBaseWindow.idl b/widget/nsIBaseWindow.idl ---- a/widget/nsIBaseWindow.idl -+++ b/widget/nsIBaseWindow.idl -@@ -153,6 +153,14 @@ - attribute nativeWindow parentNativeWindow; - - /* -+ TODO: -+ https://bugzilla.mozilla.org/show_bug.cgi?id=760802 -+ https://groups.google.com/d/msg/mozilla.dev.extensions/JXgOCHSK0ZU/bR5A2ZCZV3sJ -+ */ -+ // readonly attribute jsval nativeHandle; -+ [implicit_jscontext] readonly attribute jsval nativeHandle; -+ -+ /* - Attribute controls the visibility of the object behind this interface. - Setting this attribute to false will hide the control. Setting it to - true will show it. -diff --git a/xpfe/appshell/src/nsChromeTreeOwner.cpp b/xpfe/appshell/src/nsChromeTreeOwner.cpp ---- a/xpfe/appshell/src/nsChromeTreeOwner.cpp -+++ b/xpfe/appshell/src/nsChromeTreeOwner.cpp -@@ -9,6 +9,7 @@ - #include "nsXULWindow.h" - - // Helper Classes -+#include "nsDOMJSUtils.h" //XXX for jsval - #include "nsString.h" - #include "nsIEmbeddingSiteWindow.h" - #include "nsIEmbeddingSiteWindow2.h" -@@ -423,6 +424,12 @@ - return NS_ERROR_NOT_IMPLEMENTED; - } - -+NS_IMETHODIMP nsChromeTreeOwner::GetNativeHandle(JSContext *cx, jsval *ret) -+{ -+ NS_ENSURE_STATE(mXULWindow); -+ return mXULWindow->GetNativeHandle(cx, ret); -+} -+ - NS_IMETHODIMP nsChromeTreeOwner::GetVisibility(bool* aVisibility) - { - NS_ENSURE_STATE(mXULWindow); -diff --git a/xpfe/appshell/src/nsContentTreeOwner.cpp b/xpfe/appshell/src/nsContentTreeOwner.cpp ---- a/xpfe/appshell/src/nsContentTreeOwner.cpp -+++ b/xpfe/appshell/src/nsContentTreeOwner.cpp -@@ -10,6 +10,7 @@ - #include "nsXULWindow.h" - - // Helper Classes -+#include "nsDOMJSUtils.h" //XXX for jsval - #include "nsIServiceManager.h" - #include "nsAutoPtr.h" - -@@ -637,6 +638,12 @@ - return NS_ERROR_NOT_IMPLEMENTED; - } - -+NS_IMETHODIMP nsContentTreeOwner::GetNativeHandle(JSContext *cx, jsval *ret) -+{ -+ NS_ENSURE_STATE(mXULWindow); -+ return mXULWindow->GetNativeHandle(cx, ret); -+} -+ - NS_IMETHODIMP nsContentTreeOwner::GetVisibility(bool* aVisibility) - { - NS_ENSURE_STATE(mXULWindow); -diff --git a/xpfe/appshell/src/nsXULWindow.cpp b/xpfe/appshell/src/nsXULWindow.cpp ---- a/xpfe/appshell/src/nsXULWindow.cpp -+++ b/xpfe/appshell/src/nsXULWindow.cpp -@@ -748,6 +748,23 @@ - return NS_OK; - } - -+NS_IMETHODIMP nsXULWindow::GetNativeHandle(JSContext *cx, jsval *ret) -+{ -+ nsCOMPtr mainWidget; -+ NS_ENSURE_SUCCESS(GetMainWidget(getter_AddRefs(mainWidget)), NS_ERROR_FAILURE); -+ -+ if (mainWidget) { -+ // this will return the actual address of the native window obj (not a -+ // pointer to it) -+ nativeWindow nativeWindowPtr = mainWidget->GetNativeData(NS_NATIVE_WINDOW); -+ uintptr_t ptr = *static_cast(nativeWindowPtr); -+ if (!JS_NewNumberValue(cx, (double)ptr, ret)) // JSBool -+ return NS_ERROR_UNEXPECTED; -+ } -+ -+ return NS_OK; -+} -+ - NS_IMETHODIMP nsXULWindow::GetVisibility(bool* aVisibility) - { - NS_ENSURE_ARG_POINTER(aVisibility);