1
0
mirror of https://github.com/moparisthebest/FireTray synced 2024-08-13 15:53:47 -04:00

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.
This commit is contained in:
foudfou 2014-02-06 00:17:28 +01:00
parent 7a0ff56cd1
commit 705b0ffb59
7 changed files with 56 additions and 84 deletions

View File

@ -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"/>

View File

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

View File

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

View File

@ -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);

View File

@ -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");

View File

@ -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");

View File

@ -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();
}
};