[Pkg-mozext-commits] [firetray] 117/399: * extract FiretrayWindow.jsm out of FiretrayStatusIcon.jsm * new windows get registered (onLoad) * basic show/hide fonctionality

David Prévot taffit at alioth.debian.org
Tue Oct 29 18:23:25 UTC 2013


This is an automated email from the git hooks/post-receive script.

taffit pushed a commit to branch dfsg-clean
in repository firetray.

commit 88bf1451e03a71af5b509d67810e29fd2a5eca6e
Author: foudfou <foudil.newbie+git at gmail.com>
Date:   Sat Dec 17 04:15:02 2011 +0100

    * extract FiretrayWindow.jsm out of FiretrayStatusIcon.jsm
    * new windows get registered (onLoad)
    * basic show/hide fonctionality
    
    WORK IN PROGRESS
---
 src/chrome/content/overlay.js           |    1 +
 src/modules/FiretrayHandler.jsm         |   47 ++++---
 src/modules/gdk.jsm                     |    1 +
 src/modules/gtk2/FiretrayStatusIcon.jsm |  212 ++--------------------------
 src/modules/gtk2/FiretrayWindow.jsm     |  228 +++++++++++++++++++++++++++++++
 src/modules/x11.jsm                     |    2 +
 6 files changed, 270 insertions(+), 221 deletions(-)

diff --git a/src/chrome/content/overlay.js b/src/chrome/content/overlay.js
index 929e8e1..8210a58 100644
--- a/src/chrome/content/overlay.js
+++ b/src/chrome/content/overlay.js
@@ -32,6 +32,7 @@ firetray.Main = {
     }
 
     let init = firetray.Handler.initialized || firetray.Handler.init();
+    firetray.Handler.registerWindow(window);
 
     // update unread messages count
     if (firetray.Handler.inMailApp && firetray.Messaging.initialized)
diff --git a/src/modules/FiretrayHandler.jsm b/src/modules/FiretrayHandler.jsm
index 5d19650..ad6b705 100644
--- a/src/modules/FiretrayHandler.jsm
+++ b/src/modules/FiretrayHandler.jsm
@@ -35,11 +35,9 @@ firetray.Handler = {
   FILENAME_NEWMAIL: null,
   runtimeOS: null,
   inMailApp: false,
+  windows: [],
 
-  _windowsHidden: false,
-  _handledDOMWindows: [],
-
-  init: function() {            // creates icon
+  init: function() {            // does creates icon
     this.appName = Services.appinfo.name.toLowerCase();
     this.FILENAME_DEFAULT = firetray.Utils.chromeToPath(
       "chrome://firetray/skin/" +  this.appName + this.FILENAME_SUFFIX);
@@ -48,8 +46,10 @@ firetray.Handler = {
     this.FILENAME_NEWMAIL = firetray.Utils.chromeToPath(
       "chrome://firetray/skin/message-mail-new.png");
 
+/* GTK TEST
     // init all handled windows
     this._updateHandledDOMWindows();
+*/
 
     // OS/platform checks
     this.runtimeABI = Services.appinfo.XPCOMABI;
@@ -61,6 +61,8 @@ firetray.Handler = {
     case "Linux":
       Cu.import("resource://firetray/gtk2/FiretrayStatusIcon.jsm");
       LOG('FiretrayStatusIcon imported');
+      Cu.import("resource://firetray/gtk2/FiretrayWindow.jsm");
+      LOG('FiretrayWindow imported');
 
       // instanciate tray icon
       firetray.StatusIcon.init();
@@ -116,6 +118,9 @@ firetray.Handler = {
   setText: function(text, color) {},
   setTooltip: function(localizedMessage) {},
   setTooltipDefault: function() {},
+  showHideToTray: function() {},
+  registerWindow: function(win) {},
+  unregisterWindow: function(win) {},
 
   _getBaseOrXULWindowFromDOMWindow: function(win, winType) {
     let winInterface, winOut;
@@ -143,24 +148,26 @@ firetray.Handler = {
     return winOut;
   },
 
-  /*
-   * DAMN IT ! getZOrderDOMWindowEnumerator doesn't work on Linux :-(
-   * https://bugzilla.mozilla.org/show_bug.cgi?id=156333, and all windows
-   * seem to have the same zlevel ("normalZ") which is different from the
-   * z-order. There seems to be no means to get/set the z-order at this
-   * time...
-   */
-  _updateHandledDOMWindows: function() {
-    LOG("_updateHandledDOMWindows");
-    this._handledDOMWindows = [];
-    var windowsEnumerator = Services.wm.getEnumerator(null); // returns a nsIDOMWindow
-    while (windowsEnumerator.hasMoreElements()) {
-      this._handledDOMWindows[this._handledDOMWindows.length] =
-        windowsEnumerator.getNext();
-    }
-  },
 
 /* GTK TEST */
+
+  // /*
+  //  * DAMN IT ! getZOrderDOMWindowEnumerator doesn't work on Linux :-(
+  //  * https://bugzilla.mozilla.org/show_bug.cgi?id=156333, and all windows
+  //  * seem to have the same zlevel ("normalZ") which is different from the
+  //  * z-order. There seems to be no means to get/set the z-order at this
+  //  * time...
+  //  */
+  // _updateHandledDOMWindows: function() {
+  //   LOG("_updateHandledDOMWindows");
+  //   this._handledDOMWindows = [];
+  //   var windowsEnumerator = Services.wm.getEnumerator(null); // returns a nsIDOMWindow
+  //   while (windowsEnumerator.hasMoreElements()) {
+  //     this._handledDOMWindows[this._handledDOMWindows.length] =
+  //       windowsEnumerator.getNext();
+  //   }
+  // },
+
   // showHideToTray: function(a1) { // unused param
   //   LOG("showHideToTray");
 
diff --git a/src/modules/gdk.jsm b/src/modules/gdk.jsm
index 2298bc1..4726bc9 100644
--- a/src/modules/gdk.jsm
+++ b/src/modules/gdk.jsm
@@ -129,6 +129,7 @@ function gdk_defines(lib) {
     ctypes.default_abi, this.GdkFilterReturn,
     [this.GdkXEvent.ptr, this.GdkEvent.ptr, gobject.gpointer]).ptr;
 
+  lib.lazy_bind("gdk_x11_drawable_get_xid", x11.XID, this.GdkDrawable.ptr);
   lib.lazy_bind("gdk_window_new", this.GdkWindow.ptr, this.GdkWindow.ptr, this.GdkWindowAttributes.ptr, gobject.gint);
   lib.lazy_bind("gdk_window_destroy", ctypes.void_t, this.GdkWindow.ptr);
   lib.lazy_bind("gdk_x11_window_set_user_time", ctypes.void_t, this.GdkWindow.ptr, gobject.guint32);
diff --git a/src/modules/gtk2/FiretrayStatusIcon.jsm b/src/modules/gtk2/FiretrayStatusIcon.jsm
index e5bb515..d6ae933 100644
--- a/src/modules/gtk2/FiretrayStatusIcon.jsm
+++ b/src/modules/gtk2/FiretrayStatusIcon.jsm
@@ -17,36 +17,17 @@ Cu.import("resource://firetray/libc.jsm");
 Cu.import("resource://firetray/pango.jsm");
 Cu.import("resource://firetray/commons.js");
 
-const Services2 = {};
-XPCOMUtils.defineLazyServiceGetter(
-  Services2,
-  "uuid",
-  "@mozilla.org/uuid-generator;1",
-  "nsIUUIDGenerator"
-);
-
 if ("undefined" == typeof(firetray.Handler))
-  ERROR("FiretrayIcon*.jsm MUST be imported from/after FiretrayHandler !");
+  ERROR("This module MUST be imported from/after FiretrayHandler !");
 
-// pointers to JS functions. should *not* be eaten by GC ("Running global
-// cleanup code from study base classes" ?)
+// pointers to JS functions. MUST LIVE DURING ALL THE EXECUTION
 var firetray_iconActivateCb;
 var firetray_popupMenuCb;
 var firetray_menuItemQuitActivateCb;
-var firetray_findGtkWindowByTitleCb;
-var firetray_windowDeleteCb;
-var firetray_windowStateCb;
-
-/**
- * custum type used to pass data in to and out of firetray_findGtkWindowByTitleCb
- */
-var _find_data_t = ctypes.StructType("_find_data_t", [
-  { inTitle: ctypes.char.ptr },
-  { outWindow: gtk.GtkWindow.ptr }
-]);
 
 
 firetray.StatusIcon = {
+  initialized: false,
   trayIcon: null,
   menu: null,
   MIN_FONT_SIZE: 4,
@@ -66,60 +47,23 @@ firetray.StatusIcon = {
 
     firetray.Handler.setTooltipDefault();
 
-    // attach popupMenu to trayIcon
-    try {
-
-      /* GTK TEST. initWindow should be done somewhere else
-         (Firetray.WindowLinux ?) */
-      let win = Services.wm.getMostRecentWindow(null);
-      /* NOTE: it should not be necessary to cast gtkWin to a GtkWidget, nor
-         gtk_widget_add_events(gtkWin, gdk.GDK_ALL_EVENTS_MASK); */
-      let gtkWin = this.getGtkWindowHandle(win);
-      LOG("gtkWin="+gtkWin);
-      let gdkWin = gtk.gtk_widget_get_window(
-        ctypes.cast(gtkWin, gtk.GtkWidget.ptr));
-      LOG("gdkWin="+gdkWin);
-
-      firetray_iconActivateCb = gtk.GCallbackStatusIconActivate_t(firetray.StatusIcon.showHideToTray);
-      // gobject.g_signal_connect(this.trayIcon, "activate", firetray_iconActivateCb, null);
-      gobject.g_signal_connect(this.trayIcon, "activate", firetray_iconActivateCb, gdkWin); // TEST
-
-      /* delete_event_cb (in gtk2/nsWindow.cpp) prevents us from catching
-         "delete-event" */
-
-      let deleteEventId = gobject.g_signal_lookup("delete-event", gtk.gtk_window_get_type());
-      LOG("deleteEventId="+deleteEventId);
-      let deleteEventHandler = gobject.g_signal_handler_find(gtkWin, gobject.G_SIGNAL_MATCH_ID, deleteEventId, 0, null, null, null);
-      LOG("deleteEventHandler="+deleteEventHandler);
-      gobject.g_signal_handler_block(gtkWin, deleteEventHandler); // not _disconnect
-
-      firetray_windowDeleteCb = gtk.GCallbackGenericEvent_t(firetray.StatusIcon.windowDelete);
-      // let res = gobject.g_signal_connect(gtkWin, "delete_event", firetray_windowDeleteCb, null);
-      let res = gobject.g_signal_connect(gtkWin, "delete_event", firetray_windowDeleteCb, null);
-      LOG("g_connect delete-event="+res);
-
-
-      /* we'll catch minimize events with Gtk:
-       http://stackoverflow.com/questions/8018328/what-is-the-gtk-event-called-when-a-window-minimizes */
-      firetray_windowStateCb = gtk.GCallbackGenericEvent_t(firetray.StatusIcon.windowState);
-      res = gobject.g_signal_connect(gtkWin, "window-state-event", firetray_windowStateCb, null);
-      LOG("g_connect window-state-event="+res);
-
-    } catch (x) {
-      ERROR(x);
-      return false;
-    }
+    LOG("showHideToTray: "+firetray.Handler.hasOwnProperty("showHideToTray"));
+    firetray_iconActivateCb = gtk.GCallbackStatusIconActivate_t(firetray.Handler.showHideToTray);
+    let res = gobject.g_signal_connect(firetray.StatusIcon.trayIcon, "activate", firetray_iconActivateCb, null);
+    LOG("g_connect activate="+res);
 
+    this.initialized = true;
     return true;
   },
 
   shutdown: function() {
     cairo.close();
-    // glib.close();
     gobject.close();
     gdk.close();
     gtk.close();
     pango.close();
+
+    this.initialized = false;
   },
 
   _buildPopupMenu: function() {
@@ -146,8 +90,7 @@ firetray.StatusIcon = {
        definition) because we need the args passed to it ! As a consequence, we
        need to abandon 'this' in popupMenu() */
     let that = this;
-    firetray_popupMenuCb =
-      gtk.GCallbackMenuPopup_t(that.popupMenu);
+    firetray_popupMenuCb = gtk.GCallbackMenuPopup_t(that.popupMenu);
     gobject.g_signal_connect(this.trayIcon, "popup-menu",
                              firetray_popupMenuCb, this.menu);
   },
@@ -165,135 +108,6 @@ firetray.StatusIcon = {
     } catch (x) {
       LOG(x);
     }
-
-  },
-
-  /**
-   * Iterate over all Gtk toplevel windows to find a window. We rely on
-   * Service.wm to watch windows correctly: we should find only one window.
-   *
-   * @author Nils Maier (stolen from MiniTrayR)
-   * @param window nsIDOMWindow from Services.wm
-   * @return a gtk.GtkWindow.ptr
-   */
-  getGtkWindowHandle: function(window) {
-    let baseWindow = window
-      .QueryInterface(Ci.nsIInterfaceRequestor)
-      .getInterface(Ci.nsIWebNavigation)
-      .QueryInterface(Ci.nsIBaseWindow);
-
-    // Tag the base window
-    let oldTitle = baseWindow.title;
-    baseWindow.title = Services2.uuid.generateUUID().toString();
-
-    try {
-      // Search the window by the *temporary* title
-      let widgets = gtk.gtk_window_list_toplevels();
-      let that = this;
-      firetray_findGtkWindowByTitleCb = gobject.GFunc_t(that._findGtkWindowByTitle);
-      var userData = new _find_data_t(
-        ctypes.char.array()(baseWindow.title),
-        null
-      ).address();
-      LOG("userData="+userData);
-      gobject.g_list_foreach(widgets, firetray_findGtkWindowByTitleCb, userData);
-      gobject.g_list_free(widgets);
-
-      if (userData.contents.outWindow.isNull()) {
-        throw new Error("Window not found!");
-      }
-      LOG("found window: "+userData.contents.outWindow);
-    } catch (x) {
-      ERROR(x);
-    } finally {
-      // Restore
-      baseWindow.title = oldTitle;
-    }
-
-    return userData.contents.outWindow;
-  },
-
-  /**
-   * compares a GtkWindow's title with a string passed in userData
-   * @param gtkWidget: GtkWidget from gtk_window_list_toplevels()
-   * @param userData: _find_data_t
-   */
-  _findGtkWindowByTitle: function(gtkWidget, userData) {
-    LOG("GTK Window: "+gtkWidget+", "+userData);
-
-    let data = ctypes.cast(userData, _find_data_t.ptr);
-    let inTitle = data.contents.inTitle;
-    LOG("inTitle="+inTitle.readString());
-
-    let gtkWin = ctypes.cast(gtkWidget, gtk.GtkWindow.ptr);
-    let winTitle = gtk.gtk_window_get_title(gtkWin);
-
-    try {
-      if (!winTitle.isNull()) {
-        LOG(inTitle+" = "+winTitle);
-        if (libc.strcmp(inTitle, winTitle) == 0)
-          data.contents.outWindow = gtkWin;
-      }
-    } catch (x) {
-      ERROR(x);
-    }
-  },
-
-  // FIXME: it may not be worth wrapping gtk_widget_get_window...
-  getGdkWindowFromGtkWindow: function(gtkWin) {
-    try {
-      let gtkWid = ctypes.cast(gtkWin, gtk.GtkWidget.ptr);
-      var gdkWin = gtk.gtk_widget_get_window(gtkWid);
-    } catch (x) {
-      ERROR(x);
-    }
-    return gdkWin;
-  },
-
-  getGdkWindowHandle: function(win) {
-    try {
-      let gtkWin = firetray.StatusIcon.getGtkWindowHandle(win);
-      LOG("FOUND: "+gtk.gtk_window_get_title(gtkWin).readString());
-      let gdkWin = this.getGdkWindowFromGtkWindow(gtkWin);
-      if (!gdkWin.isNull()) {
-        LOG("has window");
-        return gdkWin;
-      }
-    } catch (x) {
-      ERROR(x);
-    }
-    return null;
-  },
-
-  showHideToTray: function(gtkStatusIcon, userData){
-    LOG("showHideToTray: "+userData);
-    try {
-      let gdkWin = ctypes.cast(userData, gdk.GdkWindow.ptr);
-      gdk.gdk_window_show(gdkWin);
-    } catch (x) {
-      ERROR(x);
-    }
-
-    let stopPropagation = true;
-    return stopPropagation;
-  },
-
-  windowDelete: function(gtkWidget, gdkEv, userData){
-    LOG("gtk_widget_hide: "+gtkWidget+", "+gdkEv+", "+userData);
-    try{
-      let gdkWin = firetray.StatusIcon.getGdkWindowFromGtkWindow(gtkWidget);
-      gdk.gdk_window_hide(gdkWin);
-    } catch (x) {
-      ERROR(x);
-    }
-    let stopPropagation = true;
-    return stopPropagation;
-  },
-
-  windowState: function(gtkWidget, gdkEv, userData){
-    LOG("window-state-event");
-    let stopPropagation = true;
-    return stopPropagation;
   }
 
 }; // firetray.StatusIcon
@@ -445,7 +259,3 @@ firetray.Handler.setText = function(text, color) { // TODO: split into smaller f
 
   return true;
 };
-
-firetray.Handler.showHideToTray = function() {
-  // How to do that ?? is called in overlay.xul
-};
diff --git a/src/modules/gtk2/FiretrayWindow.jsm b/src/modules/gtk2/FiretrayWindow.jsm
new file mode 100644
index 0000000..9a72d6b
--- /dev/null
+++ b/src/modules/gtk2/FiretrayWindow.jsm
@@ -0,0 +1,228 @@
+/* -*- Mode: js2; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+
+/* GdkWindow and GtkWindow are totally different things. A GtkWindow is a
+ "standalone" window. A GdkWindow is just a region on the screen that can
+ capture events and has certain attributes (such as a cursor, and a coordinate
+ system). Basically a GdkWindow is an X window, in the Xlib sense, and
+ GtkWindow is a widget used for a particular UI effect.
+ (http://mail.gnome.org/archives/gtk-app-devel-list/1999-January/msg00138.html) */
+
+var EXPORTED_SYMBOLS = [ "firetray" ];
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+const Cu = Components.utils;
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/ctypes.jsm");
+Cu.import("resource://firetray/gobject.jsm");
+Cu.import("resource://firetray/gdk.jsm");
+Cu.import("resource://firetray/gtk.jsm");
+Cu.import("resource://firetray/libc.jsm");
+Cu.import("resource://firetray/commons.js");
+
+const Services2 = {};
+XPCOMUtils.defineLazyServiceGetter(
+  Services2,
+  "uuid",
+  "@mozilla.org/uuid-generator;1",
+  "nsIUUIDGenerator"
+);
+
+if ("undefined" == typeof(firetray.Handler))
+  ERROR("This module MUST be imported from/after FiretrayHandler !");
+
+/**
+ * custum type used to pass data in to and out of findGtkWindowByTitleCb
+ */
+var _find_data_t = ctypes.StructType("_find_data_t", [
+  { inTitle: ctypes.char.ptr },
+  { outWindow: gtk.GtkWindow.ptr }
+]);
+
+
+firetray.Handler.registerWindow = function(win) {
+  let that = this;
+
+  /* GTK TEST. */
+  try {
+
+    let gtkWin = firetray.Window.getGtkWindowHandle(win);
+    LOG("gtkWin="+gtkWin);
+    let gdkWin = gtk.gtk_widget_get_window(ctypes.cast(gtkWin, gtk.GtkWidget.ptr));
+    LOG("gdkWin="+gdkWin);
+    /* NOTE: it should not be necessary to gtk_widget_add_events(gtkWin,
+       gdk.GDK_ALL_EVENTS_MASK); */
+
+    // register
+    let xid = gdk.gdk_x11_drawable_get_xid(ctypes.cast(gdkWin, gdk.GdkDrawable.ptr));
+    LOG("XID="+xid);
+    this.windows[xid] = {}; // windows.hasOwnProperty(xid) is true, remove with: delete windows[xid]
+    this.windows[xid].gtkWin = gtkWin;
+    this.windows[xid].gdkWin = gdkWin;
+
+    /* delete_event_cb (in gtk2/nsWindow.cpp) prevents us from catching
+     "delete-event" */
+    let deleteEventId = gobject.g_signal_lookup("delete-event", gtk.gtk_window_get_type());
+    LOG("deleteEventId="+deleteEventId);
+    let mozDeleteEventCb = gobject.g_signal_handler_find(gtkWin, gobject.G_SIGNAL_MATCH_ID, deleteEventId, 0, null, null, null);
+    LOG("mozDeleteEventCb="+mozDeleteEventCb);
+    gobject.g_signal_handler_block(gtkWin, mozDeleteEventCb); // not _disconnect !
+    this.windows[xid].mozDeleteEventCb = mozDeleteEventCb; // FIXME: cb should be unblocked
+
+    this.windows[xid].windowDeleteCb = gtk.GCallbackGenericEvent_t(firetray.Window.windowDelete);
+    res = gobject.g_signal_connect(gtkWin, "delete-event", that.windows[xid].windowDeleteCb, null);
+    LOG("g_connect delete-event="+res);
+
+    /* we'll catch minimize events with Gtk:
+     http://stackoverflow.com/questions/8018328/what-is-the-gtk-event-called-when-a-window-minimizes */
+    this.windows[xid].windowStateCb = gtk.GCallbackGenericEvent_t(firetray.Window.windowState);
+    res = gobject.g_signal_connect(gtkWin, "window-state-event", this.windows[xid].windowStateCb, null);
+    LOG("g_connect window-state-event="+res);
+
+  } catch (x) {
+    ERROR(x);
+    return false;
+  }
+
+  return true;
+};
+
+firetray.Handler.unregisterWindow = function(win) {};
+
+firetray.Handler.showHideToTray = function(gtkStatusIcon, userData) {
+  LOG("showHideToTray: "+userData);
+
+  for (let xid in firetray.Handler.windows) {
+    LOG(xid);
+    try {
+      gdk.gdk_window_show(firetray.Handler.windows[xid].gdkWin);
+    } catch (x) {
+      ERROR(x);
+    }
+  }
+
+  let stopPropagation = true;
+  return stopPropagation;
+};
+
+
+firetray.Window = {
+
+  /**
+   * Iterate over all Gtk toplevel windows to find a window. We rely on
+   * Service.wm to watch windows correctly: we should find only one window.
+   *
+   * @author Nils Maier (stolen from MiniTrayR)
+   * @param window nsIDOMWindow from Services.wm
+   * @return a gtk.GtkWindow.ptr
+   */
+  getGtkWindowHandle: function(window) {
+    let baseWindow = window
+      .QueryInterface(Ci.nsIInterfaceRequestor)
+      .getInterface(Ci.nsIWebNavigation)
+      .QueryInterface(Ci.nsIBaseWindow);
+
+    // Tag the base window
+    let oldTitle = baseWindow.title;
+    baseWindow.title = Services2.uuid.generateUUID().toString();
+
+    try {
+      // Search the window by the *temporary* title
+      let widgets = gtk.gtk_window_list_toplevels();
+      let that = this;
+      let findGtkWindowByTitleCb = gobject.GFunc_t(that._findGtkWindowByTitle);
+      var userData = new _find_data_t(
+        ctypes.char.array()(baseWindow.title),
+        null
+      ).address();
+      LOG("userData="+userData);
+      gobject.g_list_foreach(widgets, findGtkWindowByTitleCb, userData);
+      gobject.g_list_free(widgets);
+
+      if (userData.contents.outWindow.isNull()) {
+        throw new Error("Window not found!");
+      }
+      LOG("found window: "+userData.contents.outWindow);
+    } catch (x) {
+      ERROR(x);
+    } finally {
+      // Restore
+      baseWindow.title = oldTitle;
+    }
+
+    return userData.contents.outWindow;
+  },
+
+  /**
+   * compares a GtkWindow's title with a string passed in userData
+   * @param gtkWidget: GtkWidget from gtk_window_list_toplevels()
+   * @param userData: _find_data_t
+   */
+  _findGtkWindowByTitle: function(gtkWidget, userData) {
+    LOG("GTK Window: "+gtkWidget+", "+userData);
+
+    let data = ctypes.cast(userData, _find_data_t.ptr);
+    let inTitle = data.contents.inTitle;
+    LOG("inTitle="+inTitle.readString());
+
+    let gtkWin = ctypes.cast(gtkWidget, gtk.GtkWindow.ptr);
+    let winTitle = gtk.gtk_window_get_title(gtkWin);
+
+    try {
+      if (!winTitle.isNull()) {
+        LOG(inTitle+" = "+winTitle);
+        if (libc.strcmp(inTitle, winTitle) == 0)
+          data.contents.outWindow = gtkWin;
+      }
+    } catch (x) {
+      ERROR(x);
+    }
+  },
+
+  // FIXME: it may not be worth wrapping gtk_widget_get_window...
+  getGdkWindowFromGtkWindow: function(gtkWin) {
+    try {
+      let gtkWid = ctypes.cast(gtkWin, gtk.GtkWidget.ptr);
+      var gdkWin = gtk.gtk_widget_get_window(gtkWid);
+    } catch (x) {
+      ERROR(x);
+    }
+    return gdkWin;
+  },
+
+  getGdkWindowHandle: function(win) {
+    try {
+      let gtkWin = firetray.Window.getGtkWindowHandle(win);
+      LOG("FOUND: "+gtk.gtk_window_get_title(gtkWin).readString());
+      let gdkWin = this.getGdkWindowFromGtkWindow(gtkWin);
+      if (!gdkWin.isNull()) {
+        LOG("has window");
+        return gdkWin;
+      }
+    } catch (x) {
+      ERROR(x);
+    }
+    return null;
+  },
+
+  windowDelete: function(gtkWidget, gdkEv, userData){
+    LOG("gtk_widget_hide: "+gtkWidget+", "+gdkEv+", "+userData);
+    try{
+      let gdkWin = firetray.Window.getGdkWindowFromGtkWindow(gtkWidget);
+      gdk.gdk_window_hide(gdkWin);
+    } catch (x) {
+      ERROR(x);
+    }
+    let stopPropagation = true;
+    return stopPropagation;
+  },
+
+  windowState: function(gtkWidget, gdkEv, userData){
+    LOG("window-state-event");
+    let stopPropagation = true;
+    return stopPropagation;
+  }
+
+}; // firetray.Window
diff --git a/src/modules/x11.jsm b/src/modules/x11.jsm
index 4b26669..a21df69 100644
--- a/src/modules/x11.jsm
+++ b/src/modules/x11.jsm
@@ -45,11 +45,13 @@ function x11_defines(lib) {
     this.Atom = ctypes.unsigned_long;
     this.Window = ctypes.unsigned_long;
     this.Time = ctypes.unsigned_long;
+    this.XID = ctypes.unsigned_long;
   } else {
     this.CARD32 = ctypes.unsigned_long;
     this.Atom = this.CARD32;
     this.Window = this.CARD32;
     this.Time =  this.CARD32;
+    this.XID =  this.CARD32;
   }
 
   // X.h

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-mozext/firetray.git



More information about the Pkg-mozext-commits mailing list