NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Scroll Everywhere // @description Scroll everywhere with right mouse button. // @author tumpio // @oujs:author tumpio // @namespace tumpio@sci.fi // @homepageURL https://openuserjs.org/scripts/tumpio/Scroll_Everywhere // @supportURL https://github.com/tumpio/gmscripts // @icon https://raw.githubusercontent.com/tumpio/gmscripts/master/Scroll_Everywhere/large.png // @include * // @grant none // @version 0.3a // ==/UserScript== /* jshint multistr: true, strict: false, browser: true, devel: true */ /* global escape: true,GM_getValue: true,GM_setValue: true,GM_addStyle: true,GM_xmlhttpRequest: true */ // TODO: add slow scroll start mode // FIXME: Linux/mac context menu on mousedown, probably needs browser level // FUTURE: Options dialog var mouseBtn, reverse, stopOnSecondClick, verticalScroll, startAnimDelay, cursorStyle, down, scrollevents, scrollBarWidth, cursorMask, isWin, fScrollX, fScrollY, fScroll, slowScrollStart; // NOTE: Do not run on iframes if (window.top === window.self) { // USER SETTINGS mouseBtn = 3; // 1:left, 2:middle, 3:right mouse button reverse = false; // reversed scroll direction stopOnSecondClick = false; // keep scrolling until the left mouse button clicked verticalScroll = false; // vertical scrolling slowScrollStart = false; // slow scroll start on begin startAnimDelay = 150; // slow scroll start mode animation delay cursorStyle = "grab"; // cursor style on scroll // END fScroll = ((reverse) ? fRevPos : fPos); fScrollX = ((verticalScroll) ? fScroll : noScrollX); fScrollY = fScroll; down = false; scrollevents = 0; scrollBarWidth = 2 * getScrollBarWidth(); cursorMask = document.createElement('div'); isWin = (window.navigator.appVersion.indexOf("Win") != -1 ? true : false); if (cursorStyle === "grab") cursorStyle = "-webkit-grabbing; cursor: -moz-grabbing"; cursorMask.id = "SE_cursorMask_cursor"; cursorMask.setAttribute("style", "position: fixed; width: 100%; height: 100%; zindex: 5000; top: 0px; left: 0px; cursor: " + cursorStyle + "; background: none; display: none;"); document.body.appendChild(cursorMask); window.addEventListener("mousedown", rightMbDown, false); } function rightMbDown(e) { if (e.which == mouseBtn) { if (!down) { down = true; window.addEventListener("mousemove", waitScroll, false); if (!stopOnSecondClick) window.addEventListener("mouseup", stop, false); } else { stop(); } } } function waitScroll(e) { scrollevents += 1; if (scrollevents > 2) { cursorMask.style.display = ""; if (isWin) document.oncontextmenu = fFalse; window.removeEventListener("mousemove", waitScroll, false); window.addEventListener("mousemove", scroll, false); } } function scroll(e) { //scrollevents += 1; if (!stopOnSecondClick && e.buttons === 0) { stop(); return; } window.scrollTo( fScrollX( window.innerWidth - scrollBarWidth, document.body.scrollWidth - window.innerWidth, e.clientX), fScrollY( window.innerHeight - scrollBarWidth, document.body.scrollHeight - window.innerHeight, e.clientY) ); } function stop() { cursorMask.style.display = "none"; if (isWin) document.oncontextmenu = !fFalse; down = false; scrollevents = 0; window.removeEventListener("mouseup", stop, false); window.removeEventListener("mousemove", scroll, false); window.removeEventListener("mousemove", waitScroll, false); } function noScrollX() { return document.documentElement.scrollLeft; } function fPos(win, doc, pos) { return doc * (pos / win); } function fRevPos(win, doc, pos) { return doc - fPos(win, doc, pos); } function getScrollBarWidth() { var style = document.body.style.overflow; document.body.style.overflow = 'hidden'; var width = document.body.clientWidth; document.body.style.overflow = 'scroll'; width -= document.body.clientWidth; if (!width) width = document.body.offsetWidth - document.body.clientWidth; document.body.style.overflow = style; return width; } function fFalse() { return false; } function slowF(x) { return 1 / (1 + Math.pow(Math.E, (-0.1 * x))); }