A simple mouse gesture script
// ==UserScript== // @name My Mouse Gestures // @name:zh-CN 我的鼠标手势 // @name:zh-TW 我的滑鼠手勢 // @description A simple mouse gesture script // @description:zh-CN 一个简单的鼠标手势脚本 // @description:zh-TW 一個簡單的滑鼠手勢腳本 // @version 0.2.2 // @match *://*/* // @run-at document-start // @grant GM_openInTab // @grant window.close // @grant GM_setValue // @grant GM_getValue // @namespace https://greasyfork.org/users/4968 // ==/UserScript== // --- Settings --- const SENSITIVITY = 3; // 1 ~ 5 const TOLERANCE = 3; // 1 ~ 5 const funcs = { 'U': () => window.scrollTo(0, 0), 'D': () => window.scrollTo(0, 1073741824), 'L': () => window.history.back(), 'R': () => window.history.forward(), 'DR': () => window.top.close(), 'UD': () => window.location.reload(), 'RU': () => { GM_openInTab('about:newtab', false); if (navigator.userAgent.indexOf('Firefox') !== -1) { GM_openInTab('about:blank', false); } }, 'RL': () => { let closedTabs = GM_getValue("closedTabs", []); if (closedTabs.length > 0) { let lastclosedTab = closedTabs.pop(); GM_setValue("closedTabs", closedTabs); GM_openInTab(lastclosedTab, false); } } }; // ---------------- const s = 1 << ((7 - SENSITIVITY) << 1); const t1 = Math.tan(0.15708 * TOLERANCE); const t2 = 1 / t1; const abs = Math.abs; let x, y, path, lastGesture; const tracer = function (e) { const { clientX: cx, clientY: cy } = e; const dx = cx - x; const dy = cy - y; const distance = dx ** 2 + dy ** 2; if (distance > s) { const slope = abs(dy / dx); let direction = ''; if (slope > t1) { direction = dy > 0 ? 'D' : 'U'; } else if (slope <= t2) { direction = dx > 0 ? 'R' : 'L'; } if (lastGesture !== direction) { lastGesture = direction; path += direction; } x = cx; y = cy; } }; window.addEventListener('mousedown', function (e) { if (e.button === 2) { x = e.clientX; y = e.clientY; path = ""; lastGesture = ""; window.addEventListener('mousemove', tracer, false); } }, false); window.addEventListener('contextmenu', function (e) { window.removeEventListener('mousemove', tracer, false); if (path !== "") { e.preventDefault(); if (funcs.hasOwnProperty(path)) { funcs[path](); } } }, false); window.addEventListener("beforeunload", () => { let closedTabs = GM_getValue("closedTabs", []).slice(-10); closedTabs.push(window.location.href); GM_setValue("closedTabs", closedTabs); });