From 4fb215ce82d4347595084616491bcb0719cc6443 Mon Sep 17 00:00:00 2001 From: foudfou Date: Tue, 24 Jul 2012 02:00:44 +0200 Subject: [PATCH] fix start_hidden which was based on 'resize' events. "Too small window" bug with Lightning installed. start_hidden is not so easy to achieve since: - we can't rely on appStarted (window displayed in between) - we can't rely on 'load' event (window not fully realized - position, size) - we can't rely on 'resize' event (window displayed/shown/resized a variable number of times) Besides, nsIBaseWindow.visibility remains the surest way to hide windows at startup. --- src/chrome/content/overlay.js | 30 ++++++------------------- src/modules/FiretrayHandler.jsm | 9 ++++---- src/modules/linux/FiretrayPopupMenu.jsm | 22 +++++++++--------- src/modules/linux/FiretrayWindow.jsm | 22 +++++++++++++----- 4 files changed, 40 insertions(+), 43 deletions(-) diff --git a/src/chrome/content/overlay.js b/src/chrome/content/overlay.js index c904d02..3512a76 100644 --- a/src/chrome/content/overlay.js +++ b/src/chrome/content/overlay.js @@ -12,7 +12,6 @@ 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 @@ -22,9 +21,9 @@ var firetrayChrome = { // each new window gets a new firetrayChrome ! F.LOG("ONLOAD"); firetray.Handler.dumpWindows(); this.winId = firetray.Handler.registerWindow(win); + win.setTimeout(firetrayChrome.startHiddenMaybe, 0, this.winId); win.addEventListener('close', firetrayChrome.onClose, true); - win.addEventListener('resize', firetrayChrome.onResize, true); F.LOG('Firetray LOADED: ' + init); return true; @@ -55,34 +54,19 @@ 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) { - firetray.Handler.hideSingleWindow(firetrayChrome.winId); + firetray.Handler.hideWindow(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); + startHiddenMaybe: function(winId) { + F.LOG('startHiddenMaybe'+'. appStarted='+firetray.Handler.appStarted); - 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; - } + if (firetray.Utils.prefService.getBoolPref('start_hidden') && + !firetray.Handler.appStarted) { // !appStarted for new windows ! + firetray.Handler.startupHideWindow(winId); } } diff --git a/src/modules/FiretrayHandler.jsm b/src/modules/FiretrayHandler.jsm index e339c38..480863d 100644 --- a/src/modules/FiretrayHandler.jsm +++ b/src/modules/FiretrayHandler.jsm @@ -181,8 +181,9 @@ firetray.Handler = { registerWindow: function(win) {}, unregisterWindow: function(win) {}, getWindowIdFromChromeWindow: function(win) {}, - hideSingleWindow: function(winId) {}, - showSingleWindow: function(winId) {}, + hideWindow: function(winId) {}, + startupHideWindow: function(winId) {}, + showWindow: function(winId) {}, showHideAllWindows: function() {}, activateLastWindow: function(gtkStatusIcon, gdkEvent, userData) {}, @@ -190,14 +191,14 @@ firetray.Handler = { F.LOG("showAllWindows"); for (let winId in firetray.Handler.windows) { if (!firetray.Handler.windows[winId].visible) - firetray.Handler.showSingleWindow(winId); + firetray.Handler.showWindow(winId); } }, hideAllWindows: function() { F.LOG("hideAllWindows"); for (let winId in firetray.Handler.windows) { if (firetray.Handler.windows[winId].visible) - firetray.Handler.hideSingleWindow(winId); + firetray.Handler.hideWindow(winId); } }, diff --git a/src/modules/linux/FiretrayPopupMenu.jsm b/src/modules/linux/FiretrayPopupMenu.jsm index 7737bcd..4e23c9b 100644 --- a/src/modules/linux/FiretrayPopupMenu.jsm +++ b/src/modules/linux/FiretrayPopupMenu.jsm @@ -104,7 +104,7 @@ firetray.PopupMenu = { this.setWindowItemLabel(menuItemWindow, xid.toString()); // default to xid this.callbacks.menuItemWindowActivate[xid] = gobject.GCallback_t( - function(){firetray.Handler.showSingleWindow(xid);}); + function(){firetray.Handler.showWindow(xid);}); gobject.g_signal_connect(menuItemWindow, "activate", firetray.PopupMenu.callbacks.menuItemWindowActivate[xid], null); @@ -130,14 +130,14 @@ firetray.PopupMenu = { showAllWindowItemsOnlyVisibleWindows: function() { for (let xid in firetray.Handler.windows) if (!firetray.Handler.windows[xid].visible) - this.showSingleWindowItem(xid); + this.showWindowItem(xid); }, - showSingleWindowItem: function(xid) { + showWindowItem: function(xid) { if (!this.windowItemsHandled()) return; - F.LOG("showSingleWindowItem"); + F.LOG("showWindowItem"); let menuItemWindow = firetray.Handler.gtkPopupMenuWindowItems.get(xid); this.showItem(menuItemWindow); this.setWindowItemLabel(menuItemWindow, firetray.Window.getWindowTitle(xid)); @@ -156,25 +156,25 @@ firetray.PopupMenu = { hideAllWindowItems: function() { for (let xid in firetray.Handler.windows) - this.hideSingleWindowItemAndSeparator(xid); + this.hideWindowItemAndSeparator(xid); }, - hideSingleWindowItemAndSeparator: function(xid) { - this.hideSingleWindowItem(xid); + hideWindowItemAndSeparator: function(xid) { + this.hideWindowItem(xid); this.hideWindowSeparator(); }, - hideSingleWindowItemAndSeparatorMaybe: function(xid) { + hideWindowItemAndSeparatorMaybe: function(xid) { if (!this.windowItemsHandled()) return; - this.hideSingleWindowItem(xid); + this.hideWindowItem(xid); if (firetray.Handler.visibleWindowsCount === firetray.Handler.windowsCount) this.hideWindowSeparator(); }, - hideSingleWindowItem: function(xid) { - F.LOG("hideSingleWindowItem"); + hideWindowItem: function(xid) { + F.LOG("hideWindowItem"); let menuItemWindow = firetray.Handler.gtkPopupMenuWindowItems.get(xid); this.hideItem(menuItemWindow); }, diff --git a/src/modules/linux/FiretrayWindow.jsm b/src/modules/linux/FiretrayWindow.jsm index 3313461..5efcfb5 100644 --- a/src/modules/linux/FiretrayWindow.jsm +++ b/src/modules/linux/FiretrayWindow.jsm @@ -204,7 +204,7 @@ firetray.Window = { if (firetray.Utils.prefService.getBoolPref('show_activates')) firetray.Window.activate(xid); - firetray.PopupMenu.hideSingleWindowItemAndSeparatorMaybe(xid); + firetray.PopupMenu.hideWindowItemAndSeparatorMaybe(xid); firetray.Handler.showHideIcon(); }, @@ -218,7 +218,18 @@ firetray.Window = { firetray.Window.setVisibility(xid, false); - firetray.PopupMenu.showSingleWindowItem(xid); + firetray.PopupMenu.showWindowItem(xid); + firetray.Handler.showHideIcon(); + }, + + startupHide: function(xid) { + F.LOG('startupHide: '+xid); + + firetray.Handler.windows[xid].baseWin.visibility = false; + firetray.Handler.windows[xid].visible = false; + firetray.Handler.visibleWindowsCount -= 1; + + firetray.PopupMenu.showWindowItem(xid); firetray.Handler.showHideIcon(); }, @@ -492,7 +503,7 @@ firetray.Window = { let hides_single_window = firetray.Utils.prefService.getBoolPref('hides_single_window'); if (hides_on_minimize) { if (hides_single_window) { - firetray.Handler.hideSingleWindow(xwin); + firetray.Handler.hideWindow(xwin); } else firetray.Handler.hideAllWindows(); } @@ -569,8 +580,9 @@ firetray.Handler.unregisterWindow = function(win) { return firetray.Window.unregisterWindowByXID(xid); }; -firetray.Handler.showSingleWindow = firetray.Window.show; -firetray.Handler.hideSingleWindow = firetray.Window.hide; +firetray.Handler.showWindow = firetray.Window.show; +firetray.Handler.hideWindow = firetray.Window.hide; +firetray.Handler.startupHideWindow = firetray.Window.startupHide; firetray.Handler.showHideAllWindows = function(gtkStatusIcon, userData) { F.LOG("showHideAllWindows: "+userData);