[Pkg-mozext-commits] [firetray] 41/84: Overcome titlebar buttons not firing expected events.

David Prévot taffit at moszumanska.debian.org
Sun Jul 20 01:42:44 UTC 2014


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

taffit pushed a commit to branch master
in repository firetray.

commit 9b2f2016aa1d8ad360d1c54dd394b712edf3ea8b
Author: foudfou <foudil.newbie+git at gmail.com>
Date:   Sun Mar 16 18:40:59 2014 +0100

    Overcome titlebar buttons not firing expected events.
---
 src/chrome/content/overlay.js        | 107 +++++++++++++++++++++++++++++------
 src/modules/FiretrayHandler.jsm      |   2 +-
 src/modules/commons.js               |  17 +++++-
 src/modules/linux/FiretrayWindow.jsm |   2 +-
 src/modules/winnt/FiretrayWindow.jsm |   2 +-
 5 files changed, 109 insertions(+), 21 deletions(-)

diff --git a/src/chrome/content/overlay.js b/src/chrome/content/overlay.js
index dbe01a9..f65306e 100644
--- a/src/chrome/content/overlay.js
+++ b/src/chrome/content/overlay.js
@@ -27,6 +27,7 @@ var firetrayChrome = { // each new window gets a new firetrayChrome !
     this.winId = firetray.Handler.registerWindow(win);
 
     win.addEventListener('close', firetrayChrome.onClose, true);
+    this.hijackTitlebarButtons();
 
     firetray_log.debug('Firetray LOADED: ' + init);
     return true;
@@ -47,30 +48,102 @@ var firetrayChrome = { // each new window gets a new firetrayChrome !
    hides_on_close is set (we are not actually closing the tabs!). There is no
    use trying to set warnOnClose=false temporarily in onClose, since onClose is
    called *after* the popup */
-  // FIXME: https://bugzilla.mozilla.org/show_bug.cgi?id=827880 menubar
-  // prevents close button to fire 'close'
   onClose: function(event) {
     firetray_log.debug('Firetray CLOSE');
-    if (event.originalTarget != window)
-      throw new TypeError('originalTarget not the current ChromeWindow');
-
     let hides_on_close = firetray.Utils.prefService.getBoolPref('hides_on_close');
     firetray_log.debug('hides_on_close: '+hides_on_close);
-    if (hides_on_close) {
-      let hides_single_window = firetray.Utils.prefService.getBoolPref('hides_single_window');
-      let hides_last_only = firetray.Utils.prefService.getBoolPref('hides_last_only');
-      firetray_log.debug('hides_single_window='+hides_single_window+', windowsCount='+firetray.Handler.windowsCount);
-      if (hides_last_only && (firetray.Handler.windowsCount > 1)) return;
-
-      if (hides_single_window)
-        firetray.Handler.hideWindow(firetrayChrome.winId);
-      else
-        firetray.Handler.hideAllWindows();
-
-      event && event.preventDefault();
+    if (!hides_on_close) return false;
+
+    let hides_single_window = firetray.Utils.prefService.getBoolPref('hides_single_window');
+    let hides_last_only = firetray.Utils.prefService.getBoolPref('hides_last_only');
+    firetray_log.debug('hides_single_window='+hides_single_window+', windowsCount='+firetray.Handler.windowsCount);
+    if (hides_last_only && (firetray.Handler.windowsCount > 1)) return true;
+
+    if (hides_single_window)
+      firetray.Handler.hideWindow(firetrayChrome.winId);
+    else
+      firetray.Handler.hideAllWindows();
+
+    if (event) event.preventDefault();
+    return true;
+  },
+
+  /*
+   * Minimize/Restore/Close buttons can be overlayed by titlebar (fake) buttons
+   * which do not fire the events that we rely on (see Bug 827880). This is why
+   * we override the fake buttons' default actions.
+   */
+  hijackTitlebarButtons: function() {
+    Object.keys(this.titlebarDispatch).map(function(val, idx) {
+      let fInfo = firetrayChrome.replaceCommand(val, firetrayChrome.titlebarDispatch[val]['new']);
+      if (fInfo) {
+        firetrayChrome.titlebarDispatch[val]['old'] = fInfo[0];
+        firetray_log.debug('replaced command='+val+' type='+fInfo[1]+' func='+fInfo[0]);
+        firetrayChrome.titlebarDispatch[val]['type'] = fInfo[1];
+      }
+    });
+  },
+
+  titlebarDispatch: {
+    "titlebar-min": {new: function(e){
+      firetray_log.debug('  titlebar-min clicked');
+      if (!firetray.Handler.onMinimize(firetrayChrome.winId))
+        firetrayChrome.applyDefaultCommand("titlebar-min");
+    }, old: null, type: null},
+
+    "titlebar-close": {new: function(e){
+      firetray_log.debug('  titlebar-close clicked');
+      if (!firetrayChrome.onClose(null)) {
+        firetrayChrome.applyDefaultCommand("titlebar-close");
+      }
+    }, old: null, type: null}
+  },
+
+  replaceCommand: function(eltId, func) {
+    let elt = document.getElementById(eltId);
+    if (!elt) {
+      firetray_log.info("Element '"+eltId+"' not found. Command not replaced.");
+      return null;
+    }
+
+    let command = elt.command;
+    let oncommand = elt.getAttribute("oncommand");
+    let old = null, type = null;
+    if (command) {
+      firetray_log.debug('command');
+      type = FIRETRAY_XUL_ATTRIBUTE_COMMAND;
+      old = elt.command;
+      elt.command = null;
+      elt.addEventListener('click', func, false);
+    } else if (oncommand) {
+      firetray_log.debug('oncommand');
+      type = FIRETRAY_XUL_ATTRIBUTE_ONCOMMAND;
+      let prev = elt.getAttribute("oncommand");
+      old = new Function(prev);
+      elt.setAttribute("oncommand", void(0));
+      elt.addEventListener('command', func, false);
+    } else {
+      firetray_log.warn('Could not replace oncommand on '+eltId);
+    }
+
+    return [old, type];
+  },
+  applyDefaultCommand: function(key) {
+    let callType = this.titlebarDispatch[key]['type'];
+    if (callType === FIRETRAY_XUL_ATTRIBUTE_COMMAND) {
+      let cmdName = firetrayChrome.titlebarDispatch[key]['old'];
+      let cmd = document.getElementById(cmdName);
+      cmd.doCommand();
+
+    } else if (callType === FIRETRAY_XUL_ATTRIBUTE_ONCOMMAND) {
+      firetrayChrome.titlebarDispatch[key]['old']();
+
+    } else {
+      firetray_log.error("Calling type undefined for "+key);
     }
   }
 
+
 };
 
 // should be sufficient for a delayed Startup (no need for window.setTimeout())
diff --git a/src/modules/FiretrayHandler.jsm b/src/modules/FiretrayHandler.jsm
index 0c4a59a..2cce91b 100644
--- a/src/modules/FiretrayHandler.jsm
+++ b/src/modules/FiretrayHandler.jsm
@@ -370,7 +370,7 @@ firetray.Handler = {
     }
   },
 
-  hideOnMinimizeMaybe: function(wid) {
+  onMinimize: function(wid) {
     let hidden = false;
     let hides_on_minimize = firetray.Utils.prefService.getBoolPref('hides_on_minimize');
     if (hides_on_minimize) {
diff --git a/src/modules/commons.js b/src/modules/commons.js
index c0f3f1f..ade9158 100644
--- a/src/modules/commons.js
+++ b/src/modules/commons.js
@@ -15,7 +15,8 @@ var EXPORTED_SYMBOLS =
     "FIRETRAY_ACCOUNT_SERVER_TYPE_IM", "FIRETRAY_DELAY_STARTUP_MILLISECONDS",
     "FIRETRAY_DELAY_NOWAIT_MILLISECONDS", "FIRETRAY_MESSAGE_COUNT_TYPE_UNREAD",
     "FIRETRAY_MESSAGE_COUNT_TYPE_NEW", "FIRETRAY_CHAT_ICON_BLINK_STYLE_NORMAL",
-    "FIRETRAY_CHAT_ICON_BLINK_STYLE_FADE", "FIRETRAY_APP_DB" ];
+    "FIRETRAY_CHAT_ICON_BLINK_STYLE_FADE", "FIRETRAY_APP_DB",
+    "FIRETRAY_XUL_ATTRIBUTE_COMMAND", "FIRETRAY_XUL_ATTRIBUTE_ONCOMMAND" ];
 
 const Cc = Components.classes;
 const Ci = Components.interfaces;
@@ -55,6 +56,9 @@ const FIRETRAY_DELAY_NOWAIT_MILLISECONDS        = 0;
 const FIRETRAY_CHAT_ICON_BLINK_STYLE_NORMAL = 0;
 const FIRETRAY_CHAT_ICON_BLINK_STYLE_FADE   = 1;
 
+const FIRETRAY_XUL_ATTRIBUTE_COMMAND   = 0;
+const FIRETRAY_XUL_ATTRIBUTE_ONCOMMAND = 1;
+
 const FIRETRAY_APP_DB = {
 
   firefox: {
@@ -266,6 +270,17 @@ firetray.Utils = {
     timer.initWithCallback({ notify: callback },
       delay, timerType);
     return timer;
+  },
+
+  /*
+   * Extracts statements from functions. Intended for feeding a 'oncommand'
+   * attribute.
+   * BUG: |let| assignations break oncommand inline callback under TB27
+   * The statements should probably be limited to a single function call.
+   */
+  bodyToString: function(func) {
+    let matches = func.toSource().match(/\{([\s\S]*)\}/m);
+    return matches ? matches[1] : matches;
   }
 
 };
diff --git a/src/modules/linux/FiretrayWindow.jsm b/src/modules/linux/FiretrayWindow.jsm
index 7c77713..577114d 100644
--- a/src/modules/linux/FiretrayWindow.jsm
+++ b/src/modules/linux/FiretrayWindow.jsm
@@ -560,7 +560,7 @@ firetray.Window.filterWindow = function(xev, gdkEv, data) {
     // prevent the event.
     if (isHidden) {
       log.debug("GOT ICONIFIED");
-      firetray.Handler.hideOnMinimizeMaybe(xid);
+      firetray.Handler.onMinimize(xid);
     }
     break;
 
diff --git a/src/modules/winnt/FiretrayWindow.jsm b/src/modules/winnt/FiretrayWindow.jsm
index afd9a4f..eed2bd1 100644
--- a/src/modules/winnt/FiretrayWindow.jsm
+++ b/src/modules/winnt/FiretrayWindow.jsm
@@ -74,7 +74,7 @@ firetray.Window.wndProc = function(hWnd, uMsg, wParam, lParam) { // filterWindow
     log.debug("wndProc CALLED with WM_SYSCOMMAND wParam="+wParam);
     if (wParam === win32.SC_MINIMIZE) {
       log.debug("GOT ICONIFIED");
-      if (firetray.Window.hideOnMinimizeMaybe(wid)) {
+      if (firetray.Handler.hideOnMinimizeMaybe(wid)) {
         return 0;               // processed => preventDefault
       }
     }

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