My Mouse Gestures

A simple mouse gesture script

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey, Greasemonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Userscripts.

Чтобы установить этот скрипт, сначала вы должны установить расширение браузера, например Tampermonkey.

Чтобы установить этот скрипт, вы должны установить расширение — менеджер скриптов.

(у меня уже есть менеджер скриптов, дайте мне установить скрипт!)

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

(у меня уже есть менеджер стилей, дайте мне установить скрипт!)

// ==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);
});