fix start_hidden bug introduced in f86a3ac

This commit is contained in:
foudfou 2012-05-12 15:24:14 +02:00
parent 4174095780
commit 2b2ce871a0
2 changed files with 40 additions and 60 deletions

View File

@ -10,6 +10,10 @@ if ("undefined" == typeof(Cu)) var Cu = Components.utils;
// https://groups.google.com/group/mozilla.dev.extensions/browse_thread/thread/e89e9c2a834ff2b6#
var firetrayChrome = { // each new window gets a new firetrayChrome !
strings: null,
winId: null,
startedHidden: false,
onLoad: function(win) {
this.strings = document.getElementById("firetray-strings"); // chrome-specific
@ -17,17 +21,13 @@ var firetrayChrome = { // each new window gets a new firetrayChrome !
let init = firetray.Handler.initialized || firetray.Handler.init();
F.LOG("ONLOAD"); firetray.Handler.dumpWindows();
let winId = firetray.Handler.registerWindow(win);
this.winId = firetray.Handler.registerWindow(win);
if (firetray.Handler.inMailApp && firetray.Messaging.initialized)
firetray.Messaging.updateMsgCount();
win.addEventListener('close', firetrayChrome.onClose, true);
if (firetray.Handler.windows[winId].startHidden) {
F.LOG('start_hidden');
firetray.Handler.hideSingleWindow(winId);
}
win.addEventListener('resize', firetrayChrome.onResize, true);
F.LOG('Firetray LOADED: ' + init);
return true;
@ -58,13 +58,37 @@ var firetrayChrome = { // each new window gets a new firetrayChrome !
F.LOG('hides_on_close: '+hides_on_close+', hides_single_window='+hides_single_window);
if (hides_on_close) {
if (hides_single_window) {
let winId = firetray.Handler.getWindowIdFromChromeWindow(win);
firetray.Handler.hideSingleWindow(winId);
firetray.Handler.hideSingleWindow(firetrayChrome.winId);
} else
firetray.Handler.hideAllWindows();
event && event.preventDefault();
}
},
/**
* at startup windows are displayed/shown/resized multiple times. We can't
* just set baseWin.visibility=false on 'load' because the window is not
* fully realized (position, size incorrect), neither when appStarted because
* windows would be displayed in between
*/
onResize: function(event) {
F.LOG('onResize'+'. appStarted='+firetray.Handler.appStarted);
let win = event.originalTarget;
win.removeEventListener('resize', firetrayChrome.onResize, true);
if(!firetray.Handler.appStarted &&
firetray.Utils.prefService.getBoolPref('start_hidden')) {
F.LOG('start_hidden: '+firetrayChrome.winId);
let baseWin = firetray.Handler.getWindowInterface(win, "nsIBaseWindow");
baseWin.visibility = false;
if (!firetrayChrome.startedHidden) {
firetray.Handler.windows[firetrayChrome.winId].visible = false;
firetray.Handler.visibleWindowsCount -= 1;
firetrayChrome.startedHidden = true;
}
}
}
};
// should be sufficient for a delayed Startup (no need for window.setTimeout())

View File

@ -188,8 +188,8 @@ firetray.Window = {
return true;
},
showSingleStateful: function(xid) {
F.LOG("showSingleStateful xid="+xid);
show: function(xid) {
F.LOG("show xid="+xid);
// try to restore previous state. TODO: z-order respected ?
firetray.Window.restorePositionAndSize(xid);
@ -205,22 +205,10 @@ firetray.Window = {
firetray.PopupMenu.hideSingleWindowItemAndSeparatorMaybe(xid);
firetray.Handler.showHideIcon();
},
showSingleStatelessOnce: function(xid) {
F.LOG("showSingleStateless");
firetray.Window.setVisibility(xid, true);
firetray.PopupMenu.hideSingleWindowItemAndSeparatorMaybe(xid);
firetray.Handler.showHideIcon();
firetray.Handler.windows[xid].show = firetray.Window.showSingleStateful; // reset
},
// NOTE: we keep using high-level cross-plat BaseWindow.visibility (instead of
// gdk_window_show_unraised)
/* FIXME: hiding windows should also hide child windows */
hideSingleStateful: function(xid) {
F.LOG("hideSingleStateful");
hide: function(xid) {
F.LOG("hide");
firetray.Window.savePositionAndSize(xid);
firetray.Window.saveStates(xid);
@ -231,21 +219,6 @@ firetray.Window = {
firetray.PopupMenu.showSingleWindowItem(xid);
firetray.Handler.showHideIcon();
},
/**
* hides without saving window states (position, size, ...) This is needed
* when application starts hidden: as windows are not realized, their state
* is not accurate.
*/
hideSingleStatelessOnce: function(xid) {
F.LOG("hideSingleStateless");
firetray.Window.setVisibility(xid, false);
firetray.PopupMenu.showSingleWindowItem(xid);
firetray.Handler.showHideIcon();
firetray.Handler.windows[xid].hide = firetray.Window.hideSingleStateful; // reset
},
savePositionAndSize: function(xid) {
let gx = {}, gy = {}, gwidth = {}, gheight = {};
@ -322,7 +295,7 @@ firetray.Window = {
},
setVisibility: function(xid, visibility) {
F.WARN("setVisibility="+visibility);
F.LOG("setVisibility="+visibility);
let gtkWidget = ctypes.cast(firetray.Handler.gtkWindows.get(xid), gtk.GtkWidget.ptr);
if (visibility)
gtk.gtk_widget_show_all(gtkWidget);
@ -512,6 +485,7 @@ firetray.Window = {
// break;
}
// NOTE: Gecko 8.0 provides the 'sizemodechange' event
if (isHidden) { // minimized
F.LOG("winStates="+winStates+", isHidden="+isHidden);
let hides_on_minimize = firetray.Utils.prefService.getBoolPref('hides_on_minimize');
@ -585,17 +559,6 @@ firetray.Handler.registerWindow = function(win) {
return null;
}
if (!firetray.Handler.appStarted &&
firetray.Utils.prefService.getBoolPref('start_hidden')) {
this.windows[xid].startHidden = true;
this.windows[xid].hide = firetray.Window.hideSingleStatelessOnce;
this.windows[xid].show = firetray.Window.showSingleStatelessOnce;
} else {
this.windows[xid].startHidden = false;
this.windows[xid].hide = firetray.Window.hideSingleStateful;
this.windows[xid].show = firetray.Window.showSingleStateful;
}
F.LOG("AFTER"); firetray.Handler.dumpWindows();
return xid;
};
@ -606,15 +569,8 @@ firetray.Handler.unregisterWindow = function(win) {
return firetray.Window.unregisterWindowByXID(xid);
};
firetray.Handler.showSingleWindow = function(xid) {
F.LOG("showSingleWindow xid="+xid);
this.windows[xid].show(xid);
};
firetray.Handler.hideSingleWindow = function(xid) {
F.LOG("hideSingleWindow xid="+xid);
this.windows[xid].hide(xid);
};
firetray.Handler.showSingleWindow = firetray.Window.show;
firetray.Handler.hideSingleWindow = firetray.Window.hide;
firetray.Handler.showHideAllWindows = function(gtkStatusIcon, userData) {
F.LOG("showHideAllWindows: "+userData);