[Pkg-mozext-commits] [firetray] 120/399: * fix unload event listeners (and thus unregistration of windows) * add hides_single_window preference * revert to JS handeling of 'delete-event' (rely on onclose rather than GTK)

David Prévot taffit at alioth.debian.org
Tue Oct 29 18:23:26 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 4c72b1fcbdafb51dec8d1b3373e7fac4552b8908
Author: foudfou <foudil.newbie+git at gmail.com>
Date:   Fri Dec 23 16:44:09 2011 +0100

    * fix unload event listeners (and thus unregistration of windows)
    * add hides_single_window preference
    * revert to JS handeling of 'delete-event' (rely on onclose rather than GTK)
    
    WORK IN PROGESS
---
 src/chrome/content/options.js           |   20 ++++-----
 src/chrome/content/options.xul          |    4 ++
 src/chrome/content/overlay.js           |   48 +++++++++------------
 src/chrome/locale/en-US/options.dtd     |    2 +
 src/defaults/preferences/prefs.js       |    1 +
 src/modules/gtk2/FiretrayStatusIcon.jsm |    4 +-
 src/modules/gtk2/FiretrayWindow.jsm     |   69 +++++++++++++------------------
 7 files changed, 66 insertions(+), 82 deletions(-)

diff --git a/src/chrome/content/options.js b/src/chrome/content/options.js
index c346804..b4bf75c 100644
--- a/src/chrome/content/options.js
+++ b/src/chrome/content/options.js
@@ -23,7 +23,9 @@ const TREELEVEL_EXCLUDED_ACCOUNTS = 1;
 firetray.UIOptions = {
   strings: null,
 
-  onLoad: function() {
+  onLoad: function(e) {
+    window.removeEventListener('load', arguments.callee, true);
+
     this.strings = document.getElementById("firetray-options-strings");
 
     if(firetray.Handler.inMailApp) {
@@ -36,7 +38,9 @@ firetray.UIOptions = {
 
   },
 
-  onQuit: function() {
+  onQuit: function(e) {
+    window.removeEventListener('unload', arguments.callee, true);
+
     // cleaning: removeEventListener on cells
     // NOTE: not sure this is necessary on window close
     let tree = document.getElementById("ui_tree_mail_accounts");
@@ -415,13 +419,5 @@ firetray.UIOptions = {
 };
 
 
-window.addEventListener(
-  'load', function (e) {
-    removeEventListener('load', arguments.callee, true);
-    firetray.UIOptions.onLoad(); },
-  false);
-window.addEventListener(
-  'unload', function (e) {
-    removeEventListener('unload', arguments.callee, true);
-    firetray.UIOptions.onQuit(); },
-  false);
+window.addEventListener('load', firetray.UIOptions.onLoad, false);
+window.addEventListener('unload', firetray.UIOptions.onQuit, false);
diff --git a/src/chrome/content/options.xul b/src/chrome/content/options.xul
index 8308bba..50c88f9 100644
--- a/src/chrome/content/options.xul
+++ b/src/chrome/content/options.xul
@@ -21,6 +21,7 @@
     <preferences>
       <preference id="pref_bool_hides_on_close" name="extensions.firetray.hides_on_close" type="bool"/>
       <preference id="pref_bool_hides_on_minimize" name="extensions.firetray.hides_on_minimize" type="bool"/>
+      <preference id="pref_bool_hides_single_window" name="extensions.firetray.hides_single_window" type="bool"/>
       <preference id="pref_string_icon_text_color" name="extensions.firetray.icon_text_color" type="string" />
       <preference id="pref_string_custom_mail_icon" name="extensions.firetray.custom_mail_icon" type="string" />
       <preference id="pref_string_mail_accounts" name="extensions.firetray.mail_accounts" type="string"/>
@@ -46,6 +47,9 @@
                       label="&bool_hides_on_minimize.label;"
                       accesskey="&bool_hides_on_minimize.accesskey;"
                       disabled="true" tooltiptext="&NOT_IMPLEMENTED_YET;"/>
+            <checkbox id="ui_hides_single_window" preference="pref_bool_hides_single_window"
+                      label="&bool_hides_single_window.label;"
+                      accesskey="&bool_hides_single_window.accesskey;"/>
           </groupbox>
 
         </tabpanel>
diff --git a/src/chrome/content/overlay.js b/src/chrome/content/overlay.js
index 28aecf0..933e3e8 100644
--- a/src/chrome/content/overlay.js
+++ b/src/chrome/content/overlay.js
@@ -16,15 +16,16 @@ if ("undefined" == typeof(firetray)) {
 
 firetray.Main = {
 
-  onLoad: function(win) {
+  onLoad: function() {
+    window.removeEventListener('load', arguments.callee, true);
+
     // initialization code
     this.strings = document.getElementById("firetray-strings");
 
     try {
       // Set up preference change observer
       firetray.Utils.prefService.QueryInterface(Ci.nsIPrefBranch2);
-      let that = this;
-      firetray.Utils.prefService.addObserver("", that, false);
+      firetray.Utils.prefService.addObserver("", firetray.Main, false);
     }
     catch (ex) {
       ERROR(ex);
@@ -32,30 +33,28 @@ firetray.Main = {
     }
 
     let init = firetray.Handler.initialized || firetray.Handler.init();
-    firetray.Handler.registerWindow(win);
+    firetray.Handler.registerWindow(window);
 
     // update unread messages count
     if (firetray.Handler.inMailApp && firetray.Messaging.initialized)
       firetray.Messaging.updateUnreadMsgCount();
 
-/* GTK TEST
     // prevent window closing.
-    let that = this;
-    window.addEventListener('close', that.onClose, true);
+    window.addEventListener('close', firetray.Main.onClose, true);
     // NOTE: each new window gets a new firetray.Main, and hence listens to pref
     // changes
-*/
 
     LOG('Firetray LOADED: ' + init);
     return true;
   },
 
-  onQuit: function(win) {
+  onQuit: function(e) {
+    window.removeEventListener('unload', arguments.callee, true);
+
     // Remove observer
-    let that = this;
-    firetray.Utils.prefService.removeObserver("", that);
+    firetray.Utils.prefService.removeObserver("", firetray.Main);
 
-    firetray.Handler.unregisterWindow(win);
+    firetray.Handler.unregisterWindow(window);
 
     /* NOTE: don't firetray.Handler.initialized=false here, otherwise after a
      window close, a new window will create a new handler (and hence, a new
@@ -63,18 +62,21 @@ firetray.Main = {
     LOG('Firetray UNLOADED !');
   },
 
-/* GTK TEST
   // TODO: prevent preceding warning about closing multiple tabs (browser.tabs.warnOnClose)
   onClose: function(event) {
     LOG('Firetray CLOSE');
     let hides_on_close = firetray.Utils.prefService.getBoolPref('hides_on_close');
-    LOG('hides_on_close: '+hides_on_close);
+    let hides_single_window = firetray.Utils.prefService.getBoolPref('hides_single_window');
+    LOG('hides_on_close: '+hides_on_close+', hides_single_window='+hides_single_window);
+    LOG('event.originalTarget: '+event.originalTarget);
     if (hides_on_close) {
-      firetray.Handler.showHideToTray();
+      if (hides_single_window)
+        firetray.Window.hideWindow(window);
+      else
+        firetray.Handler.hideAllWindows(window);
       event && event.preventDefault(); // no event when called directly (xul)
     }
   },
-*/
 
   observe: function(subject, topic, data) {
     // Observer for pref changes
@@ -86,17 +88,7 @@ firetray.Main = {
 };
 
 // should be sufficient for a delayed Startup (no need for window.setTimeout())
-// https://developer.mozilla.org/en/Extensions/Performance_best_practices_in_extensions
 // https://developer.mozilla.org/en/XUL_School/JavaScript_Object_Management.html
 // https://developer.mozilla.org/en/Extensions/Performance_best_practices_in_extensions#Removing_Event_Listeners
-let thatWindow = window;
-window.addEventListener(
-  'load', function (e) {
-    removeEventListener('load', arguments.callee, true);
-    firetray.Main.onLoad(thatWindow); },
-  false);
-window.addEventListener(
-  'unload', function (e) {
-    removeEventListener('unload', arguments.callee, true);
-    firetray.Main.onQuit(thatWindow); },
-  false);
+window.addEventListener('load', firetray.Main.onLoad, false);
+window.addEventListener('unload', firetray.Main.onQuit, false);
diff --git a/src/chrome/locale/en-US/options.dtd b/src/chrome/locale/en-US/options.dtd
index d14b1b8..f96fddd 100644
--- a/src/chrome/locale/en-US/options.dtd
+++ b/src/chrome/locale/en-US/options.dtd
@@ -14,6 +14,8 @@
 <!ENTITY bool_hides_on_close.accesskey "C">
 <!ENTITY bool_hides_on_minimize.label "Minimize window hides to tray">
 <!ENTITY bool_hides_on_minimize.accesskey "M">
+<!ENTITY bool_hides_single_window.label "Hide the current window only (not all windows)">
+<!ENTITY bool_hides_single_window.accesskey "H">
 
 <!ENTITY mail_notification.label "Mail notification">
 <!ENTITY mail_notification_disabled.label "disabled">
diff --git a/src/defaults/preferences/prefs.js b/src/defaults/preferences/prefs.js
index d3a92f5..f165ad3 100644
--- a/src/defaults/preferences/prefs.js
+++ b/src/defaults/preferences/prefs.js
@@ -8,6 +8,7 @@ pref("browser.tabs.warnOnClose", false);
 
 pref("extensions.firetray.hides_on_close", true);
 pref("extensions.firetray.hides_on_minimize", true);
+pref("extensions.firetray.hides_single_window", true); // FIXME: should default to 'false'
 
 pref("extensions.firetray.mail_notification", 1);
 pref("extensions.firetray.icon_text_color", "#000000");
diff --git a/src/modules/gtk2/FiretrayStatusIcon.jsm b/src/modules/gtk2/FiretrayStatusIcon.jsm
index 977aae2..30f589d 100644
--- a/src/modules/gtk2/FiretrayStatusIcon.jsm
+++ b/src/modules/gtk2/FiretrayStatusIcon.jsm
@@ -49,8 +49,8 @@ firetray.StatusIcon = {
 
     LOG("showHideAllWindows: "+firetray.Handler.hasOwnProperty("showHideAllWindows"));
     firetray_iconActivateCb = gtk.GCallbackStatusIconActivate_t(firetray.Handler.showHideAllWindows);
-    let res = gobject.g_signal_connect(firetray.StatusIcon.trayIcon, "activate", firetray_iconActivateCb, null);
-    LOG("g_connect activate="+res);
+    let handlerId = gobject.g_signal_connect(firetray.StatusIcon.trayIcon, "activate", firetray_iconActivateCb, null);
+    LOG("g_connect activate="+handlerId);
 
     this.initialized = true;
     return true;
diff --git a/src/modules/gtk2/FiretrayWindow.jsm b/src/modules/gtk2/FiretrayWindow.jsm
index 3cd83a9..325e475 100644
--- a/src/modules/gtk2/FiretrayWindow.jsm
+++ b/src/modules/gtk2/FiretrayWindow.jsm
@@ -57,20 +57,9 @@ firetray.Handler.registerWindow = function(win) {
    gdk.GDK_ALL_EVENTS_MASK); */
 
   try {
-
-    /* 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 mozDeleteEventCbId = gobject.g_signal_handler_find(gtkWin, gobject.G_SIGNAL_MATCH_ID, deleteEventId, 0, null, null, null);
-    LOG("mozDeleteEventCbId="+mozDeleteEventCbId);
-    gobject.g_signal_handler_block(gtkWin, mozDeleteEventCbId); // not _disconnect !
-    this.windows[xid].mozDeleteEventCbId = mozDeleteEventCbId;
-
-    this.windows[xid].windowDeleteCb = gtk.GCallbackGenericEvent_t(firetray.Window.windowDelete);
-    // NOTE: it'd be nice to pass the xid to g_signal_connect...
-    this.windows[xid].windowDeleteCbId = gobject.g_signal_connect(gtkWin, "delete-event", that.windows[xid].windowDeleteCb, null);
-    LOG("g_connect delete-event="+this.windows[xid].windowDeleteCbId);
+    /* NOTE: we could try to catch the "delete-event" here and block
+       delete_event_cb (in gtk2/nsWindow.cpp), but we prefer to use the
+       provided "close" JS event */
 
     /* we'll catch minimize events with Gtk:
      http://stackoverflow.com/questions/8018328/what-is-the-gtk-event-called-when-a-window-minimizes */
@@ -91,30 +80,26 @@ firetray.Handler.unregisterWindow = function(win) {
   LOG("unregister window");
 
   try {
-    let [gtkWin, gdkWin, xid] = firetray.Window.getWindowsFromChromeWindow(win);
-
-    // unblock Moz original delete-event handler
-    gobject.g_signal_handler_disconnect(gtkWin, this.windows[xid].windowDeleteCbId);
-    gobject.g_signal_handler_unblock(gtkWin, this.windows[xid].mozDeleteEventCbId);
-
+    let xid = firetray.Window.getXIDFromChromeWindow(win);
     return this._unregisterWindowByXID(xid);
   } catch (x) {
     ERROR(x);
   }
-  return null;
+  return false;
 };
 
 firetray.Handler._unregisterWindowByXID = function(xid) {
-    try {
-  if (this.windows.hasOwnProperty(xid))
-    delete this.windows[xid];
-  else {
-    ERROR("can't unregister unknown window "+xid);
+  try {
+    if (this.windows.hasOwnProperty(xid))
+      delete this.windows[xid];
+    else {
+      ERROR("can't unregister unknown window "+xid);
+      return false;
+    }
+  } catch (x) {
+    ERROR(x);
     return false;
   }
-    } catch (x) {
-      ERROR(x);
-    }
   LOG("window "+xid+" unregistered");
   return true;
 };
@@ -200,11 +185,11 @@ firetray.Window = {
    * @param userData: _find_data_t
    */
   _findGtkWindowByTitle: function(gtkWidget, userData) {
-    LOG("GTK Window: "+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());
+    // LOG("inTitle="+inTitle.readString());
 
     let gtkWin = ctypes.cast(gtkWidget, gtk.GtkWindow.ptr);
     let winTitle = gtk.gtk_window_get_title(gtkWin);
@@ -244,6 +229,7 @@ firetray.Window = {
     return null;
   },
 
+  /** consider using getXIDFromChromeWindow() if you only need the XID */
   getWindowsFromChromeWindow: function(win) {
     let gtkWin = firetray.Window.getGtkWindowHandle(win);
     LOG("gtkWin="+gtkWin);
@@ -254,24 +240,27 @@ firetray.Window = {
     return [gtkWin, gdkWin, xid];
   },
 
-  windowDelete: function(gtkWidget, gdkEv, userData){
-    LOG("gtk_widget_hide: "+gtkWidget+", "+gdkEv+", "+userData);
-    let xid = firetray.Window.getXIDFromGtkWidget(gtkWidget);
-    LOG("windowDelete XID="+xid);
+  getXIDFromChromeWindow: function(win) {
+    for (let xid in firetray.Handler.windows)
+      if (firetray.Handler.windows[xid].win === win)
+        return xid;
+    ERROR("unknown window while lookup");
+    return null;
+  },
 
+  hideWindow: function(win) {
+    LOG("hideWindow");
+    let xid = this.getXIDFromChromeWindow(win);
+    LOG("found xid="+xid);
     try {
       firetray.Window._saveWindowPositionSizeState(xid);
 
       // hide window - NOTE: we don't use BaseWindow.visibility to have full
       // control
-      let gdkWin = firetray.Window.getGdkWindowFromGtkWindow(gtkWidget);
-      gdk.gdk_window_hide(gdkWin);
+      gdk.gdk_window_hide(firetray.Handler.windows[xid].gdkWin);
     } catch (x) {
       ERROR(x);
     }
-
-    let stopPropagation = true;
-    return stopPropagation;
   },
 
   _saveWindowPositionSizeState: function(xid) {

-- 
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