NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name altWheelScroll
// @namespace trespassersW
// @description Alt+mouse-wheel scrolls browser window horizontally
// @include http://*
// @include https://*
// @include file://*
// about:config -> greasemonkey.fileIsGreaseable <- true
// /homepageURL https://userscripts.org/scripts/show/153201
// /updateURL
// @version 1.2
// @date 2013-06-03
// @run-at document-start
// @grant none
// ==/UserScript==
// 2013-04-05 ‘smooth’ scrolling
// 2013-01-06 mouse button + scroll
// 2012-12-04 win key added; use it only in conjunction with other key!
const kShift = 1, kAlt = 2, kCtrl = 4, kWin = 8;
const mLeft = 0x100, mMiddle = 0x200 //, mRight =0x400; // mouse buttons
// key kombination for invoking me:
var hscrollKey = kAlt // mLeft kShift kCtrl +kWin // mLeft // mMiddle
var hscrollStep=60; // pixels
var hscrollPace=20; // px: Step/Pace = scrolling speed
// https://developer.mozilla.org/en-US/docs/Mozilla_event_reference/wheel
(function(window,document) {
var prefix = "", _addEventListener, onwheel, support;
// detect event model
if ( window.addEventListener ) {
_addEventListener = "addEventListener";
} else {
_addEventListener = "attachEvent";
prefix = "on";
}
// detect available wheel event
if ( document.onmousewheel !== undefined ) {
// Webkit and IE support at least "mousewheel"
support = "mousewheel"
}
try {
// Modern browsers support "wheel"
WheelEvent("wheel");
support = "wheel";
} catch (e) {}
if ( !support ) {
// let's assume that remaining browsers are older Firefox
support = "DOMMouseScroll";
}
window.addWheelListener = function( elem, callback, useCapture ) {
_addWheelListener( elem, support, callback, useCapture );
// handle MozMousePixelScroll in older Firefox
if( support == "DOMMouseScroll" ) {
_addWheelListener( elem, "MozMousePixelScroll", callback, useCapture );
}
};
function _addWheelListener( elem, eventName, callback, useCapture ) {
elem[ _addEventListener ]( prefix + eventName, support == "wheel" ? callback : function( originalEvent ) {
!originalEvent && ( originalEvent = window.event );
// create a normalized event object
var event = {
// keep a ref to the original event object
originalEvent: originalEvent,
target: originalEvent.target || originalEvent.srcElement,
type: "wheel",
deltaMode: originalEvent.type == "MozMousePixelScroll" ? 0 : 1,
deltaX: 0,
delatZ: 0,
preventDefault: function() {
originalEvent.preventDefault ?
originalEvent.preventDefault() :
originalEvent.returnValue = false;
}
};
// calculate deltaY (and deltaX) according to the event
if ( support == "mousewheel" ) {
event.deltaY = - 1/40 * originalEvent.wheelDelta;
// Webkit also support wheelDeltaX
originalEvent.wheelDeltaX && ( event.deltaX = - 1/40 * originalEvent.wheelDeltaX );
} else {
event.deltaY = originalEvent.detail;
}
// it's time to fire the callback
return callback( event );
}, useCapture || false );
}
})(window,document);
var keyMod=0;
var scrollTurn=0;
var hscrollPos,hscrollFoot;
function onScroll(e){
if(keyMod!=hscrollKey) return false;
hscrollPos=0;
hscrollFoot=hscrollPace*((e.deltaY>0)*2-1);
onTout();
e.preventDefault(),
e.stopPropagation(),
scrollTurn++;
return true;
}
// smooth?? 2013-05-04
function onTout(){
window.scrollBy( hscrollFoot, 0 );
hscrollPos += hscrollPace;
if( hscrollPos < hscrollStep )
window.setTimeout(onTout,50);
}
const kMap = {16: kShift, 17:kCtrl, 18: kAlt, 91: kWin}
function kDn(e) {
var k = e.keyCode;
if(k) k = kMap[k];
if(k) {
keyMod |= k;
if(k==kWin && (hscrollKey & kWin))
// GM_log('k:'+e.keyCode),
e.preventDefault(),
e.stopPropagation();
}
else keyMod=0, scrollTurn=0;
}
function kUp(e) {
if(keyMod == hscrollKey)
e.preventDefault(),
e.stopPropagation();
keyMod =0, scrollTurn=0;
}
const mMap= {0: mLeft, 1: mMiddle /*, 2: mRight*/}
function mDn(e){
k= mMap[e.button];
if(k == hscrollKey){
keyMod |= k;
} else
keyMod = 0, scrollTurn=0;
}
function mUp(e){
if(keyMod == hscrollKey && scrollTurn != 0)
e.preventDefault(),
e.stopPropagation();
keyMod=0, scrollTurn=0;
}
if(hscrollKey & 0x00ff)
window.addEventListener("keydown", kDn, false),
window.addEventListener("keyup", kUp, false),
addWheelListener( window, onScroll );
else if(hscrollKey & 0xff00)
window.addEventListener("mousedown", mDn, false),
window.addEventListener("mouseup", mUp, false),
addWheelListener( window, onScroll );