[Pkg-mozext-commits] [firetray] 18/84: don't cache and update windows[wid].visible, windowsCount, visibleWindowsCount

David Prévot taffit at moszumanska.debian.org
Sun Jul 20 01:42:42 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 705b0ffb59d6f916f79dcfa2719975e1fac16cf2
Author: foudfou <foudil.newbie+git at gmail.com>
Date:   Thu Feb 6 00:17:28 2014 +0100

    don't cache and update windows[wid].visible, windowsCount, visibleWindowsCount
    
    Because the number of windows will generally be small, this is not worth the
    effort.
---
 src/chrome/content/overlay.xul           |  2 +-
 src/modules/FiretrayHandler.jsm          | 41 ++++++++++++++++++++++----------
 src/modules/FiretrayWindow.jsm           | 12 ----------
 src/modules/ctypes/linux/gtk.jsm         |  1 +
 src/modules/linux/FiretrayStatusIcon.jsm |  8 ++++++-
 src/modules/linux/FiretrayWindow.jsm     | 39 +++++++-----------------------
 src/modules/winnt/FiretrayWindow.jsm     | 37 +++++++---------------------
 7 files changed, 56 insertions(+), 84 deletions(-)

diff --git a/src/chrome/content/overlay.xul b/src/chrome/content/overlay.xul
index b5ec2ad..3ffea10 100644
--- a/src/chrome/content/overlay.xul
+++ b/src/chrome/content/overlay.xul
@@ -2,7 +2,7 @@
 <?xml-stylesheet href="chrome://firetray/skin/overlay.css" type="text/css"?>
 <!DOCTYPE overlay SYSTEM "chrome://firetray/locale/overlay.dtd">
 <overlay id="firetray-overlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  <script type="application/javascript;version=1.7" src="overlay.js"/>
+  <script type="application/javascript;version=1.8" src="overlay.js"/>
 
   <stringbundleset id="stringbundleset">
     <stringbundle id="firetray-strings" src="chrome://firetray/locale/overlay.properties"/>
diff --git a/src/modules/FiretrayHandler.jsm b/src/modules/FiretrayHandler.jsm
index e89b7c0..e8424fa 100644
--- a/src/modules/FiretrayHandler.jsm
+++ b/src/modules/FiretrayHandler.jsm
@@ -1,4 +1,5 @@
 /* -*- Mode: js2; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+"use strict";
 
 var EXPORTED_SYMBOLS = [ "firetray" ];
 
@@ -36,13 +37,15 @@ firetray.Handler = {
   inMailApp: false,
   appHasChat: false,
   appStarted: false,
-  /* TODO: we should rewrite firetray.Handler[wid].visible,
-   firetray.Handler.windowsCount, firetray.Handler.visibleWindowsCount as
-   getters. They mainly serve as a cache for computing the visibilityRate but
-   tend to be a bit heavy to handle. */
   windows: {},
-  windowsCount: 0,
-  visibleWindowsCount: 0,
+  get windowsCount() {return Object.keys(this.windows).length;},
+  get visibleWindowsCount() {
+    let count = 0;
+    for (let wid in firetray.Handler.windows) {
+      if (firetray.Handler.windows[wid].visible) count += 1;
+    }
+    return count;
+  },
   observedTopics: {},
   ctypesLibs: {},               // {"lib1": lib1, "lib2": lib2}
 
@@ -69,17 +72,17 @@ firetray.Handler = {
     switch (this.runtimeOS) {
     case "Linux":
       Cu.import("resource://firetray/linux/FiretrayStatusIcon.jsm");
-      log.debug('FiretrayStatusIcon imported');
+      log.debug('FiretrayStatusIcon Linux imported');
       Cu.import("resource://firetray/linux/FiretrayWindow.jsm");
-      log.debug('FiretrayWindow imported');
+      log.debug('FiretrayWindow Linux imported');
       break;
     case "WINNT":
       Cu.import("resource://firetray/winnt/FiretrayWin32.jsm");
       log.debug('FiretrayWin32 imported');
       Cu.import("resource://firetray/winnt/FiretrayStatusIcon.jsm");
-      log.debug('FiretrayStatusIcon imported');
+      log.debug('FiretrayStatusIcon WINNT imported');
       Cu.import("resource://firetray/winnt/FiretrayWindow.jsm");
-      log.debug('FiretrayWindow imported');
+      log.debug('FiretrayWindow WINNT imported');
       break;
     default:
       log.error("FIRETRAY: only Linux and WINNT platforms supported at this"
@@ -196,7 +199,7 @@ firetray.Handler = {
 
   tryCloseLibs: function() {
     try {
-      for (libName in this.ctypesLibs) {
+      for (let libName in this.ctypesLibs) {
         let lib = this.ctypesLibs[libName];
         if (lib.available())
           lib.close();
@@ -333,7 +336,6 @@ firetray.Handler = {
   unregisterWindow: function(win) {},
   hideWindow: function(winId) {},
   showWindow: function(winId) {},
-  showHideAllWindows: function() {},
   activateLastWindowCb: function(gtkStatusIcon, gdkEvent, userData) {},
   getActiveWindow: function() {},
 
@@ -352,6 +354,21 @@ firetray.Handler = {
     }
   },
 
+  showHideAllWindows: function() {
+    log.debug("showHideAllWindows");
+    log.debug("  visibleWindowsCount="+firetray.Handler.visibleWindowsCount +
+      " / windowsCount="+firetray.Handler.windowsCount);
+    let visibilityRate = firetray.Handler.visibleWindowsCount /
+          firetray.Handler.windowsCount;
+    log.debug("  visibilityRate="+visibilityRate);
+    if ((0.5 < visibilityRate) && (visibilityRate < 1)
+        || visibilityRate === 0) { // TODO: should be configurable
+      firetray.Handler.showAllWindows();
+    } else {
+      firetray.Handler.hideAllWindows();
+    }
+  },
+
   showHideIcon: function() {
     if (firetray.Utils.prefService.getBoolPref('show_icon_on_hide'))
       firetray.Handler.setIconVisibility(
diff --git a/src/modules/FiretrayWindow.jsm b/src/modules/FiretrayWindow.jsm
index 4312267..cf8ce76 100644
--- a/src/modules/FiretrayWindow.jsm
+++ b/src/modules/FiretrayWindow.jsm
@@ -17,18 +17,6 @@ if ("undefined" == typeof(firetray.Handler))
 function FiretrayWindow () {}
 FiretrayWindow.prototype = {
 
-  updateVisibility: function(winId, visibility) {
-    let win = firetray.Handler.windows[winId];
-    if (win.visible === visibility)
-      log.warn("window (winId="+winId+") was already visible="+win.visible);
-
-    firetray.Handler.visibleWindowsCount = visibility ?
-      firetray.Handler.visibleWindowsCount + 1 :
-      firetray.Handler.visibleWindowsCount - 1 ;
-
-    win.visible = visibility; // nsIBaseWin.visibility always true :-(
-  },
-
   getRegisteredWinIdFromChromeWindow: function(win) {
     for (let wid in firetray.Handler.windows)
       if (firetray.Handler.windows[wid].chromeWin === win) return wid;
diff --git a/src/modules/ctypes/linux/gtk.jsm b/src/modules/ctypes/linux/gtk.jsm
index ea3f5f6..fc70953 100644
--- a/src/modules/ctypes/linux/gtk.jsm
+++ b/src/modules/ctypes/linux/gtk.jsm
@@ -145,6 +145,7 @@ function gtk_defines(lib) {
 
   lib.lazy_bind("gtk_widget_is_focus", gobject.gboolean, this.GtkWidget.ptr);
   lib.lazy_bind("gtk_widget_has_focus", gobject.gboolean, this.GtkWidget.ptr);
+  lib.lazy_bind("gtk_widget_get_visible", gobject.gboolean, this.GtkWidget.ptr);
   lib.lazy_bind("gtk_widget_hide_on_delete", gobject.gboolean, this.GtkWidget.ptr);
   lib.lazy_bind("gtk_widget_hide", ctypes.void_t, this.GtkWidget.ptr);
   lib.lazy_bind("gtk_widget_show", ctypes.void_t, this.GtkWidget.ptr);
diff --git a/src/modules/linux/FiretrayStatusIcon.jsm b/src/modules/linux/FiretrayStatusIcon.jsm
index 78981bb..b29dffc 100644
--- a/src/modules/linux/FiretrayStatusIcon.jsm
+++ b/src/modules/linux/FiretrayStatusIcon.jsm
@@ -135,7 +135,7 @@ firetray.StatusIcon = {
 
     log.debug("showHideAllWindows: "+firetray.Handler.hasOwnProperty("showHideAllWindows"));
     this.callbacks.iconActivate = gtk.GCallbackStatusIconActivate_t(
-      firetray.Handler.showHideAllWindows);
+      firetray.StatusIcon.onClick);
     let handlerId = gobject.g_signal_connect(firetray.StatusIcon.trayIcon,
       "activate", firetray.StatusIcon.callbacks.iconActivate, null);
     log.debug("g_connect activate="+handlerId);
@@ -176,6 +176,12 @@ firetray.StatusIcon = {
     }
   },
 
+  onClick: function(gtkStatusIcon, userData) {
+    firetray.Handler.showHideAllWindows();
+    let stopPropagation = true;
+    return stopPropagation;
+  },
+
   setIconImageFromFile: function(filename) {
     if (!firetray.StatusIcon.trayIcon)
       log.error("Icon missing");
diff --git a/src/modules/linux/FiretrayWindow.jsm b/src/modules/linux/FiretrayWindow.jsm
index 3ff7ec5..9a6fed4 100644
--- a/src/modules/linux/FiretrayWindow.jsm
+++ b/src/modules/linux/FiretrayWindow.jsm
@@ -219,8 +219,6 @@ firetray.Window.unregisterWindowByXID = function(xid) {
     throw new DeleteError();
   firetray.Handler.gtkWindows.remove(xid);
   firetray.Handler.gdkWindows.remove(xid);
-  firetray.Handler.windowsCount -= 1;
-  firetray.Handler.visibleWindowsCount -= 1;
 
   firetray.PopupMenu.removeWindowItem(xid);
 
@@ -357,6 +355,12 @@ firetray.Window.restoreDesktop = function(xid) {
   delete firetray.Handler.windows[xid].savedDesktop;
 };
 
+firetray.Window.getVisibility = function(xid) {
+  let gtkWidget = ctypes.cast(firetray.Handler.gtkWindows.get(xid), gtk.GtkWidget.ptr);
+  // nsIBaseWin.visibility always true
+  return gtk.gtk_widget_get_visible(gtkWidget);
+};
+
 firetray.Window.setVisibility = function(xid, visibility) {
   log.debug("setVisibility="+visibility);
   let gtkWidget = ctypes.cast(firetray.Handler.gtkWindows.get(xid), gtk.GtkWidget.ptr);
@@ -364,10 +368,7 @@ firetray.Window.setVisibility = function(xid, visibility) {
     gtk.gtk_widget_show_all(gtkWidget);
   else
     gtk.gtk_widget_hide(gtkWidget);
-
-  this.updateVisibility(xid, visibility);
 };
-// firetray.Window.updateVisibility inherited
 
 firetray.Window.xSendClientMessgeEvent = function(xid, atom, data, dataSize) {
   let xev = new x11.XClientMessageEvent;
@@ -544,7 +545,6 @@ firetray.Window.filterWindow = function(xev, gdkEv, data) {
       // when app hidden at startup, then called from command line without
       // any argument (not through FireTray that is)
       log.warn("window not visible, correcting visibility");
-      firetray.Window.updateVisibility(xid, true);
       log.debug("visibleWindowsCount="+firetray.Handler.visibleWindowsCount);
     }
     break;
@@ -656,6 +656,9 @@ firetray.Handler.registerWindow = function(win) {
   this.windows[xid] = {};
   this.windows[xid].chromeWin = win;
   this.windows[xid].baseWin = baseWin;
+  Object.defineProperties(this.windows[xid], {
+    "visible": { get: function(){return firetray.Window.getVisibility(xid);} }
+  });
   firetray.Window.checkSubscribedEventMasks(xid);
   try {
     this.gtkWindows.insert(xid, gtkWin);
@@ -667,10 +670,6 @@ firetray.Handler.registerWindow = function(win) {
                 +" windows open. This breaks FireTray and most probably "
                 +firetray.Handler.appName+".");
   }
-  this.windowsCount += 1;
-  // NOTE: no need to check for window state to set visibility because all
-  // windows *are* shown at startup
-  firetray.Window.updateVisibility(xid, true);
   log.debug("window "+xid+" registered");
   // NOTE: shouldn't be necessary to gtk_widget_add_events(gtkWin, gdk.GDK_ALL_EVENTS_MASK);
 
@@ -710,26 +709,6 @@ firetray.Handler.unregisterWindow = function(win) {
 firetray.Handler.showWindow = firetray.Window.show;
 firetray.Handler.hideWindow = firetray.Window.hide;
 
-firetray.Handler.showHideAllWindows = function(gtkStatusIcon, userData) {
-  log.debug("showHideAllWindows: "+userData);
-  // NOTE: showHideAllWindows being a callback, we need to use
-  // 'firetray.Handler' explicitely instead of 'this'
-
-  log.debug("visibleWindowsCount="+firetray.Handler.visibleWindowsCount);
-  log.debug("windowsCount="+firetray.Handler.windowsCount);
-  let visibilityRate = firetray.Handler.visibleWindowsCount/firetray.Handler.windowsCount;
-  log.debug("visibilityRate="+visibilityRate);
-  if ((0.5 < visibilityRate) && (visibilityRate < 1)
-      || visibilityRate === 0) { // TODO: should be configurable
-    firetray.Handler.showAllWindows();
-  } else {
-    firetray.Handler.hideAllWindows();
-  }
-
-  let stopPropagation = true;
-  return stopPropagation;
-};
-
 firetray.Handler.showAllWindowsAndActivate = firetray.Window.showAllWindowsAndActivate;
 firetray.Handler.activateLastWindowCb = function(gtkStatusIcon, gdkEvent, userData) {
   log.debug("activateLastWindowCb");
diff --git a/src/modules/winnt/FiretrayWindow.jsm b/src/modules/winnt/FiretrayWindow.jsm
index 723270d..4951016 100644
--- a/src/modules/winnt/FiretrayWindow.jsm
+++ b/src/modules/winnt/FiretrayWindow.jsm
@@ -39,22 +39,19 @@ firetray.Window.shutdown = function() {
   this.initialized = false;
 };
 
-firetray.Window.getVisibility = function(hwnd) {
+firetray.Window.getVisibility = function(wid) {
+  let hwnd = firetray.Win32.hexStrToHwnd(wid);
   let style = user32.GetWindowLongW(hwnd, user32.GWL_STYLE);
-  let visible = ((style & user32.WS_VISIBLE) != 0); // user32.IsWindowVisible(hwnd);
-  log.debug("visible="+visible);
-  return visible;
+  return ((style & user32.WS_VISIBLE) != 0); // user32.IsWindowVisible(hwnd);
 };
 
-// firetray.Window.{show,hide} useless
+// firetray.Window.{show,hide} useless as we don't need to restore position and size
 firetray.Window.setVisibility = function(wid, visible) {
   log.debug("setVisibility="+visible);
   let hwnd = firetray.Win32.hexStrToHwnd(wid);
   let ret = user32.ShowWindow(hwnd, visible ? user32.SW_SHOW : user32.SW_HIDE);
   log.debug("  ShowWindow="+ret+" winLastError="+ctypes.winLastError);
-  this.updateVisibility(wid, visible);
 };
-// firetray.Window.updateVisibility inherited
 
 firetray.Window.wndProc = function(hWnd, uMsg, wParam, lParam) { // filterWindow
   // log.debug("wndProc CALLED: hWnd="+hWnd+", uMsg="+uMsg+", wParam="+wParam+", lParam="+lParam);
@@ -120,14 +117,15 @@ firetray.Handler.registerWindow = function(win) {
   this.windows[wid] = {};
   this.windows[wid].chromeWin = win;
   this.windows[wid].baseWin = baseWin;
+  Object.defineProperties(this.windows[wid], {
+    "visible": { get: function(){return firetray.Window.getVisibility(wid);} }
+  });
+
+  log.debug("window "+wid+" registered");
 
 //   SetupWnd(hwnd);
 
   try {
-    this.windowsCount += 1;
-    firetray.Window.updateVisibility(wid, true); // windows *are* visible at startup
-    log.debug("window "+wid+" registered");
-
     let wndProc = user32.WNDPROC(firetray.Window.wndProc);
     log.debug("proc="+wndProc);
     this.wndProcs.insert(wid, wndProc);
@@ -167,8 +165,6 @@ firetray.Handler.unregisterWindow = function(win) {
 
   if (!delete firetray.Handler.windows[wid])
     throw new DeleteError();
-  firetray.Handler.windowsCount -= 1;
-  firetray.Handler.visibleWindowsCount -= 1;
 
   log.debug("window "+wid+" unregistered");
   return true;
@@ -180,18 +176,3 @@ firetray.Handler.showWindow = function(wid) {
 firetray.Handler.hideWindow = function(wid) {
   return firetray.Window.setVisibility(wid, false);
 };
-
-firetray.Handler.showHideAllWindows = function() {
-  log.debug("showHideAllWindows");
-
-  log.debug("  visibleWindowsCount="+firetray.Handler.visibleWindowsCount);
-  log.debug("  windowsCount="+firetray.Handler.windowsCount);
-  let visibilityRate = firetray.Handler.visibleWindowsCount/firetray.Handler.windowsCount;
-  log.debug("  visibilityRate="+visibilityRate);
-  if ((0.5 < visibilityRate) && (visibilityRate < 1)
-      || visibilityRate === 0) { // TODO: should be configurable
-    firetray.Handler.showAllWindows();
-  } else {
-    firetray.Handler.hideAllWindows();
-  }
-};

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