From da4795895a32286434bbbfb5be042c2f58f1a6d6 Mon Sep 17 00:00:00 2001 From: Noitidart Date: Wed, 14 May 2014 22:09:51 -0700 Subject: [PATCH] 1.2 --- chrome/content/MouseControl.js | 245 ++++++++++++++++++++++++--------- chrome/content/prefs.xul | 57 +++++++- chrome/locale/en-US/prefs.dtd | 17 ++- defaults/preferences/prefs.js | 4 + install.rdf | 6 +- 5 files changed, 252 insertions(+), 77 deletions(-) diff --git a/chrome/content/MouseControl.js b/chrome/content/MouseControl.js index 0b41fe8..5939e21 100644 --- a/chrome/content/MouseControl.js +++ b/chrome/content/MouseControl.js @@ -2,48 +2,76 @@ var MouseControl = { prefs: Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch('extensions.MouseControl@neocodex.us.'), ss: Components.classes['@mozilla.org/browser/sessionstore;1'].getService(Components.interfaces.nsISessionStore), fm: Components.classes["@mozilla.org/focus-manager;1"].getService(Components.interfaces.nsIFocusManager), + wm: Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator), itabHistory: [], lastUp: 0, register: function(event) { - gBrowser.addEventListener("DOMMouseScroll", MouseControl.scrollHandler, true); - gBrowser.addEventListener("mousedown", MouseControl.downHandler, true); - gBrowser.addEventListener("mouseup", MouseControl.upHandler, true); + gBrowser.mPanelContainer.addEventListener("DOMMouseScroll", MouseControl.scrollHandler, true); + gBrowser.mPanelContainer.addEventListener("mousedown", MouseControl.downHandler, true); + gBrowser.mPanelContainer.addEventListener("mouseup", MouseControl.upHandler, true); + gBrowser.mPanelContainer.addEventListener("mousemove", MouseControl.moveHandler, true); gBrowser.tabContainer.addEventListener("TabSelect", MouseControl.tabSeld, false); gBrowser.tabContainer.addEventListener("TabOpen", MouseControl.tabOpened, false); gBrowser.tabContainer.addEventListener("TabClose", MouseControl.tabClosed, false); - window.addEventListener('popupshowing', MouseControl.prevC, true); - gBrowser.addEventListener("click", MouseControl.clickHandler, true); - gBrowser.addEventListener("dblclick", MouseControl.dblHandler, true); + gBrowser.mPanelContainer.addEventListener('popupshowing', MouseControl.prevC, true); + gBrowser.mPanelContainer.addEventListener("click", MouseControl.clickHandler, true); + gBrowser.mPanelContainer.addEventListener("dblclick", MouseControl.dblHandler, true); try { MouseControl.notifier = Components.classes["@mozilla.org/alerts-service;1"].getService(Components.interfaces.nsIAlertsService); } catch(e) { } + MouseControl.zoomStyle = MouseControl.prefs.getIntPref('zoomStyle'); + //detect and set zoomStyle + MouseControl.globalZoom = MouseControl.prefs.getCharPref('globalZoom'); + if (MouseControl.globalZoom > 0) { + MouseControl.zoomStyle = 2; + } else { + if (gPrefService.getBoolPref('browser.zoom.siteSpecific')) { + MouseControl.zoomStyle = 1; + } else { + MouseControl.zoomStyle = 0; + } + } + MouseControl.prefs.setIntPref('zoomStyle',MouseControl.zoomStyle); + FullZoom.onLocationChange=function FullZoom_onLocationChange(aURI,aIsTabSwitch,aBrowser){MouseControl.globalZoom=MouseControl.prefs.getCharPref('globalZoom');MouseControl.zoomStyle=MouseControl.prefs.getIntPref('zoomStyle');if(!this.siteSpecfic&&MouseControl.zoomStyle==2&&MouseControl.globalZoom>0){if(ZoomManager.zoom!=MouseControl.globalZoom){ZoomManager.setZoomForBrowser(aBrowser||gBrowser.selectedBrowser,MouseControl.globalZoom)}return}if(!aURI||aIsTabSwitch&&!this.siteSpecific){return}if(aURI.spec=="about:blank"){this._applyPrefToSetting(undefined,aBrowser);return}var self=this;Services.contentPrefs.getPref(aURI,this.name,function(aResult){var browser=aBrowser||gBrowser.selectedBrowser;if(aURI.equals(browser.currentURI)){self._applyPrefToSetting(aResult,browser)}})}; + FullZoom._applySettingToPref=function FullZoom__applySettingToPref(){MouseControl.globalZoom=MouseControl.prefs.getCharPref('globalZoom');MouseControl.zoomStyle=MouseControl.prefs.getIntPref('zoomStyle');if(!this.siteSpecfic&&MouseControl.zoomStyle==2&&MouseControl.globalZoom>0){var zoomLevel=ZoomManager.zoom;MouseControl.globalZoom=zoomLevel;MouseControl.prefs.setCharPref('globalZoom',zoomLevel)}if(!this.siteSpecific||gInPrintPreviewMode||content.document instanceof Ci.nsIImageDocument){return}var zoomLevel=ZoomManager.zoom;Services.contentPrefs.setPref(gBrowser.currentURI,this.name,zoomLevel)}; + FullZoom.reset=function FullZoom_reset(){if(typeof this.globalValue!="undefined"){ZoomManager.zoom=this.globalValue}else{ZoomManager.reset()}MouseControl.globalZoom=MouseControl.prefs.getCharPref('globalZoom');MouseControl.zoomStyle=MouseControl.prefs.getIntPref('zoomStyle');if(!this.siteSpecfic&&MouseControl.zoomStyle==2&&MouseControl.globalZoom){var zoomLevel=ZoomManager.zoom;MouseControl.globalZoom=zoomLevel;MouseControl.prefs.setCharPref('globalZoom',zoomLevel)}this._removePref();}; }, unregister: function(event) { - gBrowser.removeEventListener("DOMMouseScroll", MouseControl.scrollHandler, true); - gBrowser.removeEventListener("mousedown", MouseControl.downHandler, true); - gBrowser.removeEventListener("mouseup", MouseControl.upHandler, true); + gBrowser.mPanelContainer.removeEventListener("DOMMouseScroll", MouseControl.scrollHandler, true); + gBrowser.mPanelContainer.removeEventListener("mousedown", MouseControl.downHandler, true); + gBrowser.mPanelContainer.removeEventListener("mouseup", MouseControl.upHandler, true); gBrowser.tabContainer.removeEventListener("TabSelect", MouseControl.tabSeld, false); gBrowser.tabContainer.removeEventListener("TabOpen", MouseControl.tabOpened, false); gBrowser.tabContainer.removeEventListener("TabClose", MouseControl.tabClosed, false); - window.removeEventListener('popupshowing', MouseControl.prevC, true); - gBrowser.removeEventListener("click", MouseControl.clickHandler, true); - gBrowser.removeEventListener("dblclick", MouseControl.dblHandler, true); - }, - undoCloseTab: function() { - MouseControl.closedTabUndid = true; - MouseControl.ss.undoCloseTab(window, 0); + gBrowser.mPanelContainer.removeEventListener('popupshowing', MouseControl.prevC, true); + gBrowser.mPanelContainer.removeEventListener("click", MouseControl.clickHandler, true); + gBrowser.mPanelContainer.removeEventListener("dblclick", MouseControl.dblHandler, true); }, setInscroll: function() { - if (!MouseControl.inscroll) { + if ((!MouseControl.inscroll && MouseControl.down) || MouseControl.dblDown) { if (window.fullScreen) { FullScreen.mouseoverToggle(true); - gBrowser.mPanelContainer.removeEventListener("mousemove", FullScreen._collapseCallback, false); + if (MouseControl.dblDown && !MouseControl.duped) { + } else { + gBrowser.mPanelContainer.removeEventListener("mousemove", FullScreen._collapseCallback, false); + } } var menu = document.getElementById('contentAreaContextMenu'); if (menu.state == 'open') { menu.hidePopup(); } MouseControl.inscroll = true; + MouseControl.restoreFocus(); + } + if (!MouseControl.inscroll && MouseControl.pdown) { + MouseControl.inscroll = true; + MouseControl.restoreFocus(); + if (gBrowser.contentDocument.body) { + gBrowser.contentDocument.body.style.MozUserSelect = '-moz-none'; + } + } + }, + restoreFocus: function() { if (MouseControl.focPreDown != MouseControl.fm.focusedElement) { if (MouseControl.focPreDown) { var dontFocusTags = ['EMBED', 'APPLET']; @@ -53,7 +81,13 @@ var MouseControl = { } else { MouseControl.fm.clearFocus(gBrowser.selectedTab.ownerDocument.defaultView); } - } + } + }, + moveHandler: function(event) { + if (MouseControl.pdown && MouseControl.inscroll) { + event.preventDefault(); + event.returnValue = false; + event.stopPropagation(); } }, scrollHandler: function(event) { @@ -68,34 +102,13 @@ var MouseControl = { event.preventDefault(); event.returnValue = false; event.stopPropagation(); - } - }, - dblHandler: function(event) { - if (event.button == 2) { - document.getElementById('contentAreaContextMenu').hidePopup(); - var relativeToCurrent = MouseControl.prefs.getBoolPref('newTabRelativeToCurrent'); - if (relativeToCurrent) { - try { - gBrowser.loadOneTab(null, {inBackground: false, relatedToCurrent: true}); - } catch (e) { - var newIndex = gBrowser.selectedTab._tPos + 1; - var newTab = gBrowser.addTab(); - gBrowser.selectedTab = newTab; - gBrowser.moveTabTo(newTab, newIndex); - } - } else { - try { - gBrowser.loadOneTab(null, {inBackground: false, relatedToCurrent: false}); - } catch (e) { - var newTab = gBrowser.addTab(); - gBrowser.selectedTab = newTab; - } + } else if (MouseControl.pdown) { + MouseControl.setInscroll(); + if (event.detail > 0) { + FullZoom.reduce(); + } else { + FullZoom.enlarge(); } - focusAndSelectUrlBar(); - MouseControl.lastUp = new Date().getTime(); - event.preventDefault(); - event.returnValue = false; - event.stopPropagation(); } }, cleanHistory: function() { @@ -123,32 +136,73 @@ var MouseControl = { MouseControl.closedTabUndid = false; MouseControl.undoClosedTabTimeout = setTimeout(MouseControl.undoCloseTab, 200); } + } else if (MouseControl.pdown) { + event.preventDefault(); + event.returnValue = false; + event.stopPropagation(); + if (event.button == 1) { + MouseControl.restoreFocus(); + MouseControl.inscroll = true; + FullZoom.reset(); + if (MouseControl.zoomStyle == 2) { + MouseControl.globalZoom = 1; + } + } } else { - if (event.button == 2 && !MouseControl.down) { + if (event.button == 2 && !MouseControl.down && !MouseControl.pdown) { + var secDblClickAble = MouseControl.prefs.getBoolPref('secDblClickAble'); + if (secDblClickAble && new Date().getTime() - MouseControl.lastDown <= 200) { + //trigger dbl on mouse up + MouseControl.down = true; + MouseControl.dblDown = true; + MouseControl.setInscroll(); + MouseControl.duped = false; + MouseControl.dupeTO = setTimeout(MouseControl.dupeTab,300); + event.preventDefault(); + event.returnValue = false; + event.stopPropagation(); + return false; + } + MouseControl.down = true; + MouseControl.dblDown = false; + MouseControl.lastDown = new Date().getTime(); document.getElementById('contentAreaContextMenu').popupBoxObject.setConsumeRollupEvent(Components.interfaces.nsIPopupBoxObject.ROLLUP_NO_CONSUME); MouseControl.focPreDown = MouseControl.fm.focusedElement; MouseControl.scrollUpMoveRight = MouseControl.prefs.getBoolPref('scrollUpMoveRight'); - MouseControl.down = true; if (MouseControl.itabHistory.length > 0 && MouseControl.itabHistory[MouseControl.itabHistory.length - 1] != gBrowser.selectedTab) { MouseControl.itabHistory.push(gBrowser.selectedTab); } } + var primClickAble = MouseControl.prefs.getBoolPref('primClickAble'); + if (primClickAble && event.button == 0 && !MouseControl.down && !MouseControl.pdown) { + MouseControl.focPreDown = MouseControl.fm.focusedElement; + MouseControl.pdown = true; + } } }, upHandler: function(event) { if (event.button == 0 || event.button == 1) { - if (MouseControl.down) { + if (MouseControl.down || (MouseControl.pdown && MouseControl.inscroll)) { event.preventDefault(); event.returnValue = false; event.stopPropagation(); } + if (MouseControl.pdown) { + if (event.button == 0) { + MouseControl.offscroll(); + } + } } else if (event.button == 2) { - if (MouseControl.inscroll) { + if (MouseControl.inscroll || MouseControl.dblDown) { MouseControl.lastUp = new Date().getTime(); event.preventDefault(); event.returnValue = false; event.stopPropagation(); } + if (MouseControl.dblDown && !MouseControl.duped) { + clearTimeout(MouseControl.dupeTO); + MouseControl.newTab(); + } if (MouseControl.itabHistory.length > 0 && MouseControl.itabHistory[MouseControl.itabHistory.length - 1] != gBrowser.selectedTab) { MouseControl.itabHistory.push(gBrowser.selectedTab); } @@ -163,11 +217,17 @@ var MouseControl = { if (event.button == 1) { if (!MouseControl.closedTabUndid) { clearTimeout(MouseControl.undoClosedTabTimeout); - if (MouseControl.itabHistory.length > 0 && MouseControl.itabHistory[MouseControl.itabHistory.length - 1] == gBrowser.selectedTab) { - MouseControl.itabHistory.splice(MouseControl.itabHistory.length - 1, 1); + if (new Date().getTime() < MouseControl.domainCloseLimit) { + MouseControl.closeDomain(); + } else { + if (MouseControl.itabHistory.length > 0 && MouseControl.itabHistory[MouseControl.itabHistory.length - 1] == gBrowser.selectedTab) { + MouseControl.itabHistory.splice(MouseControl.itabHistory.length - 1, 1); + } + MouseControl.setInscroll(); + MouseControl.targetHostname = gBrowser.currentURI.asciiHost; + gBrowser.removeCurrentTab(); + MouseControl.domainCloseLimit = new Date().getTime() + 200; } - MouseControl.setInscroll(); - gBrowser.removeCurrentTab(); } else { MouseControl.closedTabUndid = false; } @@ -186,6 +246,10 @@ var MouseControl = { } } } + } else if (MouseControl.pdown) { + event.preventDefault(); + event.returnValue = false; + event.stopPropagation(); } else { if (new Date().getTime() - MouseControl.lastUp <= 100) { event.preventDefault(); @@ -194,6 +258,52 @@ var MouseControl = { } } }, + dblHandler: function(event) { + if (new Date().getTime() - MouseControl.lastUp <= 100) { + event.preventDefault(); + event.returnValue = false; + event.stopPropagation(); + } + }, + undoCloseTab: function() { + MouseControl.closedTabUndid = true; + MouseControl.ss.undoCloseTab(window, 0); + }, + closeDomain: function() { + var closeThese = []; + var tabbrowser = MouseControl.wm.getMostRecentWindow('navigator:browser').gBrowser; + for (var index = 0; index < tabbrowser.tabContainer.childNodes.length; index++) { + // Get the next tab + var currentTab = tabbrowser.tabContainer.childNodes[index]; + if (!currentTab.pinned && gBrowser.getBrowserForTab(currentTab).currentURI.asciiHost == MouseControl.targetHostname) { + closeThese.push(currentTab); + } + } + for (var i=0; i 1) { @@ -216,26 +326,29 @@ var MouseControl = { } }, prevC: function(event) { - if (MouseControl.inscroll) { - event.preventDefault(); - event.returnValue = false; - event.stopPropagation(); - } else if (new Date().getTime() - MouseControl.lastUp <= 100) { + if (MouseControl.inscroll || (new Date().getTime() - MouseControl.lastUp <= 100)) { event.preventDefault(); event.returnValue = false; event.stopPropagation(); } }, offscroll: function() { + if (MouseControl.down || MouseControl.dblDown) { + clearTimeout(MouseControl.undoClosedTabTimeout); + if (MouseControl.itabHistory.length == 0 || MouseControl.itabHistory[MouseControl.itabHistory.length - 1] != gBrowser.selectedTab) { + MouseControl.itabHistory.push(gBrowser.selectedTab); + } + if (window.fullScreen) { + FullScreen.mouseoverToggle(false); + } + } else if (MouseControl.inscroll && MouseControl.pdown) { + if (gBrowser.contentDocument.body) { + gBrowser.contentDocument.body.style.MozUserSelect = ''; + } + } MouseControl.down = false; + MouseControl.pdown = false; MouseControl.inscroll = false; - clearTimeout(MouseControl.undoClosedTabTimeout); - if (MouseControl.itabHistory.length == 0 || MouseControl.itabHistory[MouseControl.itabHistory.length - 1] != gBrowser.selectedTab) { - MouseControl.itabHistory.push(gBrowser.selectedTab); - } - if (window.fullScreen) { - FullScreen.mouseoverToggle(false); - } }, tabSeld: function() { if (!MouseControl.inscroll) { diff --git a/chrome/content/prefs.xul b/chrome/content/prefs.xul index d6ce635..a3ab7eb 100644 --- a/chrome/content/prefs.xul +++ b/chrome/content/prefs.xul @@ -3,13 +3,50 @@ - + + + + + + - + + + + + + + + + + + + @@ -18,10 +55,18 @@ - - - - + + + + + + + + + + + + diff --git a/chrome/locale/en-US/prefs.dtd b/chrome/locale/en-US/prefs.dtd index 360cc39..66bb1b9 100644 --- a/chrome/locale/en-US/prefs.dtd +++ b/chrome/locale/en-US/prefs.dtd @@ -2,6 +2,19 @@ - + - \ No newline at end of file + + + + + + + + + + + + + + \ No newline at end of file diff --git a/defaults/preferences/prefs.js b/defaults/preferences/prefs.js index fcbb7b4..c716a6b 100644 --- a/defaults/preferences/prefs.js +++ b/defaults/preferences/prefs.js @@ -1,2 +1,6 @@ pref('extensions.MouseControl@neocodex.us.scrollUpMoveRight', false); pref('extensions.MouseControl@neocodex.us.newTabRelativeToCurrent', true); +pref('extensions.MouseControl@neocodex.us.zoomStyle', -1); +pref('extensions.MouseControl@neocodex.us.globalZoom', '0'); +pref('extensions.MouseControl@neocodex.us.secDblClickAble', true); +pref('extensions.MouseControl@neocodex.us.primClickAble', false); \ No newline at end of file diff --git a/install.rdf b/install.rdf index c143061..08f5a25 100644 --- a/install.rdf +++ b/install.rdf @@ -3,9 +3,9 @@ MouseControl@neocodex.us 2 - 1.1 + 1.2 Noitidart - https://addons.mozilla.org/en-US/firefox/addon/255249/ + http://www.neocodex.us/personal/noit/mousecontrol/about.htm chrome://MouseControl/skin/icon.png chrome://MouseControl/content/prefs.xul FoxTabs by The FoxTab Team for ideas @@ -36,7 +36,7 @@ {ec8030f7-c20a-464f-9b0e-13a3a9e97384} 3.0 - 4.0b8pre + 4.0b9pre