From 06ef7e384db15cb15f20fee7b1d53726fea0c13a Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Mon, 27 Aug 2007 14:03:00 +0000 Subject: [PATCH] improve menu mode - track open popup count and menubar activation --- chrome/content/vimperator/events.js | 56 +++++++++++++++++++------ chrome/content/vimperator/vimperator.js | 1 + 2 files changed, 45 insertions(+), 12 deletions(-) diff --git a/chrome/content/vimperator/events.js b/chrome/content/vimperator/events.js index a66b3b3c..cf81346b 100644 --- a/chrome/content/vimperator/events.js +++ b/chrome/content/vimperator/events.js @@ -72,14 +72,46 @@ function Events() //{{{ vimperator.setMode(); // trick to reshow the mode in the command line }, null); - // Code for keeping track if a popup is currently active - // XXX: does currently not handle submenus - this.openPopupCount = 0; - this.menuBarActive = 100; - window.addEventListener("popupshown", function() { vimperator.log(++vimperator.events.openPopupCount); vimperator.addMode(null, vimperator.modes.MENU); }, true); - window.addEventListener("popuphidden", function() { vimperator.log(--vimperator.events.openPopupCount); vimperator.removeMode(null, vimperator.modes.MENU); }, true); - window.addEventListener("DOMMenuBarActive", function() { vimperator.log(++vimperator.events.menuBarActive);vimperator.addMode(null, vimperator.modes.MENU); }, true); - window.addEventListener("DOMMenuBarInactive", function() { vimperator.log(--vimperator.events.menuBarActive); vimperator.removeMode(null, vimperator.modes.MENU); }, true); + // + // track if a popup is open or the menubar is active + // + + var popup_count = 0; + var active_menubar = false; + + function enterPopupMode() + { + popup_count++; + vimperator.log("Open popup window count: " + popup_count, 9); + vimperator.addMode(null, vimperator.modes.MENU); + } + + function exitPopupMode() + { + popup_count--; + vimperator.log("Open popup window count: " + popup_count, 9); + if (popup_count == 0) + vimperator.removeMode(null, vimperator.modes.MENU); + } + + function enterMenuMode() + { + active_menubar = true; + vimperator.log("Menubar is active", 9); + vimperator.addMode(null, vimperator.modes.MENU) + } + + function exitMenuMode() + { + active_menubar = false; + vimperator.log("Menubar is inactive", 9); + vimperator.removeMode(null, vimperator.modes.MENU); + } + + window.addEventListener("popupshown", enterPopupMode, true); + window.addEventListener("popuphidden", exitPopupMode, true); + window.addEventListener("DOMMenuBarActive", enterMenuMode, true); + window.addEventListener("DOMMenuBarInactive", exitMenuMode, true); window.document.addEventListener("DOMTitleChanged", function(event) { @@ -219,10 +251,10 @@ function Events() //{{{ getBrowser().removeProgressListener(this.progressListener); - window.removeEventListener("popupshowing"); - window.removeEventListener("popuphidden"); - window.removeEventListener("DOMMenuBarActive"); - window.removeEventListener("DOMMenuBarInactive"); + window.removeEventListener("popupshowing", enterPopupMode(), true); + window.removeEventListener("popuphidden", exitPopupMode(), true); + window.removeEventListener("DOMMenuBarActive", enterMenuMode(), true); + window.removeEventListener("DOMMenuBarInactive", exitMenuMode(), true); } // This method pushes keys into the event queue from vimperator diff --git a/chrome/content/vimperator/vimperator.js b/chrome/content/vimperator/vimperator.js index 16701bc8..16d35791 100644 --- a/chrome/content/vimperator/vimperator.js +++ b/chrome/content/vimperator/vimperator.js @@ -64,6 +64,7 @@ const vimperator = (function() //{{{ mode_messages[modes.QUICK_HINT] = "quick"; mode_messages[modes.EXTENDED_HINT] = "extended"; mode_messages[modes.ALWAYS_HINT] = "always"; + mode_messages[modes.MENU] = "menu"; // TODO: desirable? var mode = modes.NORMAL; var extended_mode = modes.NONE;