Полезная информация

Хотите узнать больше о расширениях? Посмотрите ролики, рассказывающие о работе с расширениями Firefox.

№95120-07-2023 13:02:45

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 475
UA: Firefox 97.0

Re: UCF - ваши кнопки, скрипты…

Dumby - проверь плиз, код перехвата клавиш. b0ttle - Да, мой код глючит! :| (UPDATE пост обновил)
Проблема такая: если в поле ввода (ответа этого форума) нажать 1, вместе с запуском кода в поле ввода попадает вводимая клавиша.
Даже с preventDefault в поле ввода попадает символ, хотя на страницу ввод не передаётся, как это и задумано. (stopImmediatePropagation не помог)
Мне надо запретить передачу в поле ввода клавиши, если в блоке обработки прописано сочетание клавиш с нажатием этой клавиши в поле ввода - то есть Digit1_I.


В примере нажатия на странице и в поле ввода различаются (для поля ввода к имени нужно добавить "I").

Для Digit1_I (цифра 1 в поле ввода) выполняется preventDefault, но почему-то в поле ввода попадает символ.

Выделить код

Код:

(async anim => { // Для докум. окна браузера [ChromeOnly]
	var keyboard = { // нажатия клавиш Meta 8 Ctrl 4 Shift 2 Alt 1 Input 'I' Skip первая буква строчная
		Digit1() {
			console.log("■ клавиша 1 "+ Math.random());
		}, // Alt+X
		Digit1_I() { this.Digit1();
		},
		KeyX_1(e) {
			console.log("■ Alt+X "+ Math.random());
		},
		KeyX_1I(e) { this.KeyX_1(e)},  // Alt+X в поле ввода
	}
	var args = ["keydown", e => {
		if (e.repeat) return; //e.getModifierState("CapsLock")*16
		var k, m = (e.metaKey*8 +e.ctrlKey*4 +e.shiftKey*2 +e.altKey +"I".slice(!docShell.isCommandEnabled("cmd_insertText"))).replace(/^0/,'');
		m = e.code + ("_"+ m).slice(0, 5*Boolean(m)); k = m[0].toLowerCase() + m.slice(1);
		if (k in keyboard) m = k, k = 0; // не держать ввод
		if (e.keyCode > 31)
			if (m in keyboard) {
				keyboard[m](gBrowser.selectedTab);
				!k && e.preventDefault();
			}
		console.log("■ "+ m +' '+ Math.random());
	}, true];

	addEventListener(...args);
	var id = Symbol(), ucf = ucf_custom_script_win;
	ucf.unloadlisteners.push(id);
	ucf[id] = {destructor: () => removeEventListener(...args)};

})({animate: true});

Отредактировано Dobrov (29-07-2023 09:44:44)

Отсутствует

 

№95221-07-2023 09:41:28

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: UCF - ваши кнопки, скрипты…

Dobrov пишет

Для Digit1_I (цифра 1 в поле ввода) выполняется preventDefault

Это каким же образом?


Перед if-проверками в переменной k
находится строка с LowerCase'нутой первой буквой, то есть digit1_I


Первую if-проверку k не проходит, поскольку digit1_I в keyboard нет,
таким образом k не меняется, остаётся всё той же строкой digit1_I


Так и остаётся далее, где подходим к строке !k && e.preventDefault();
Отрицание непустой строки (!k) даёт false


Выражение вида false && something
сразу возвращает false
something, при этом, даже не рассматривается и не вычисляется.


Иными словами, e.preventDefault(), вопреки утверждению, не выполняется.

скрытый текст
Кстати, я тут возился с ucf_hookClicks.js типа как бы
избежать этого slice-replace сумбура в keydown_win()
Ну, просто так, на интерес. Вот вариант.


Пропускаем объект klaBa через некий парсер (без валидации, конечно)

Выделить код

Код:

((obj, re) => {
	for(var p in klaBa) {
		var func = klaBa[p];
		if (typeof func == "string") func = klaBa[func];

		var [key, mod] = p.split("_");
		mod = mod || "";

		var first = key[0];
		var upper = first.toUpperCase();
		var prevent = first == upper;

		var [, m, i] = mod.match(re);
		m = m || 0; // modifiers bitmap

		var arr = [func, prevent, i ? i == "I" ? 1 : 0 : -1]; // textfields flag

		var prop = prevent ? key : upper + key.slice(1);
		var o = obj[prop] || (obj[prop] = Object.create(null));

		o[m] ? o[m].push(arr) : o[m] = [arr];
	}
	klaBa = obj;
})(Object.create(null), /(\d+)?(i)?/i);

Тогда keydown_win() становится стройнее

Выделить код

Код:

keydown_win = e => { // перехват клавиш, учитывая поля ввода

	if (e.repeat) return;

	var data = klaBa[e.code]?.[e.metaKey*8 + e.ctrlKey*4 + e.shiftKey*2 + e.altKey];
	if (data) {
		var cmd = docShell.isCommandEnabled("cmd_insertText");

		for(var [func, p, i] of data) if (i ^ cmd)
			p && e.preventDefault(), func(e, gBrowser.selectedTab);
	}
},

И примечания к синтаксису свойств klaBa:


Если начинается с маленькой буквы — не вызывать e.preventDefault().
Если заканчивается на «I» — не запускать в полях ввода.
Если заканчивается на «i» — запускать только в полях ввода.


При наличии модификаторов и/или «iI»-флага — отделять от кода клавиши символом «_».


Проброс одинакового — вместо функции вписываем соответствующую строку
digit5(e, t) {console.log("Digit 5!"); console.log(t.label);},
numpad5: "digit5",


—————


Но так получается, что в klaBa нельзя вписывать что-то постороннее,
только клавишные сочетания. Незнаю насколько это плохо.


Ну и вообще, под парсер как концепцию,
можно запилить какой-нибудь менее птичий синтаксис, наверно.

Отсутствует

 

№95321-07-2023 12:29:28

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 475
UA: Firefox 97.0

Re: UCF - ваши кнопки, скрипты…

Dumby - спасибо за помощь, изучу твой код и исправлю свои ошибки! :beer:
Всё круто, но зачем отдельный Объект-парсер, может в одном keydown_win будет компактней?
Варианты: 1) запускать везде 2) не вызывать e.preventDefault 3) не запускать в полях ввода 4) только в полях ввода.


Не смог запустить сочетание клавиш Alt+X. По одной клавише пашет, а так нет:     KeyX_1(e) {    console.log("Alt+X");

нельзя вписывать что-то постороннее, только клавишные сочетания.

Может, ещё надумаешь вариант покруче? Как я понял, теперь нельзя использовать что-то вроде
    klaBa = {
        gClipboard: {
            write(str, ch = Cc["@mozilla.org/widget/clipboardhelper;1"]……

Первую if-проверку k не проходит, поскольку digit1_I в keyboard нет, таким образом k не меняется…

Ты проверял старый код, я вчера его улучшил, всё должно работать правильно

Выделить код

Код:

keydown_win = e => { if (e.repeat) return;
	var k, m = (e.metaKey*8 +e.ctrlKey*4 +e.shiftKey*2 +e.altKey +"I".slice(!docShell.isCommandEnabled("cmd_insertText"))).replace(/^0/,'');
	m = e.code + ("_"+ m).slice(0, 5*Boolean(m)); k = m[0].toLowerCase() + m.slice(1);
	// m = Digit1 k = digit1
	if (m in klaBa) // если прописаны одинаковые клавиши (Digit1 и digit1), приоритет имеют имена с Заглавной
		k = m, m = 0; // m = 0 – выполнять preventDefault
	if (k in klaBa) { // если Digit1 не найдено, запускаем digit1 и не выполняем preventDefault
		!m && e.preventDefault(); // пропуск, если имя с прописной буквы. Отрицание непустой строки !m = !Digit1 = false
		klaBa[k](e); // execute
	}
},

Отредактировано Dobrov (21-07-2023 15:50:51)

Отсутствует

 

№95423-07-2023 00:38:57

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: UCF - ваши кнопки, скрипты…

Dobrov пишет

зачем отдельный Объект-парсер, может в одном keydown_win будет компактней?

Парсер это не объект, а отдельный фрагмент кода.
Определяется функция и сразу вызывается.
В функцию завёрнуто просто чтобы внутри всякий свой var писать
не опасаясь, что он чего-нибудь испортит, ucf_hookClicks всё таки большой.


А в keydown_win() ему не место, она же по каждому keydown исполняется,
а парсер должен исполниться только один раз, подготовить что-то для keydown_win()
чтобы было оптимальней и выглядело понятнее и стройнее.


А сделать keydown_win() lazy-функцией не получится, она сразу регистрируется
как обработчик события, и после этого менять её бесполезно.


Разве что только переделать её в объект с методом handleEvent()
При первом вызове исполняется подготовительный код,
затем переопределяется handleEvent(), ну вызывается сразу. Да, так можно.

Может, ещё надумаешь вариант покруче? Как я понял, теперь нельзя использовать что-то вроде
klaBa = {
    gClipboard: {
        write(str, ch = Cc["@mozilla.org/widget/clipboardhelper;1"]……

Наверно можно, но не знаю нужно ли.
Допустим, выбрать из klaBa только клавишные свойства, и собрать в отдельную карту.
Попробовал — код получился жутковатый.

скрытый текст

Выделить код

Код:

var keyMap = Object.create(null);
(re => {
    var parse = (str, test) => {
        if (name.length < 2 || str.endsWith("_")) return null;

        var first = str[0];
        var upper = first.toUpperCase();
        var prevent = first == upper;
        upper = prevent ? str : upper + str.slice(1);

        if (test) return re.test(upper);

        var match = upper.match(re);
        if (match) {
            var [, kode, mod, i] = match;
            return [kode, str, prevent, i ? i == "I" ? 1 : 0 : -1, mod || 0];
        }
    }
    for(var name in klaBa) {
        var arr = parse(name);
        if (!arr) continue;

        var desc = Object.getOwnPropertyDescriptor(klaBa, name);
        if ("value" in desc) {
            var val = klaBa[name];
            if (typeof val == "string") {

                if (klaBa.hasOwnProperty(val) && parse(val, true)) arr[1] = val;
                else continue; // skip not alias strings
            }
            else if (typeof val != "function") continue; // skip not functions
        }
        else if (!desc.get) continue; // skip only setters

        var kode = arr.shift(), mod = arr.pop();

        var o = keyMap[kode] || (keyMap[kode] = Object.create(null));
        o[mod] ? o[mod].push(arr) : o[mod] = [arr];
    }

})(new RegExp(`^(${[
    // https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_code_values

    "Key[A-Z]|F(?:1?\\d|2[0-4])|Digit\\d",
    "Numpad(?:\\d|Enter|Add|Comma|Subtract|Decimal|Divide|Multiply|Equal)",
    "(?:Bracket|Arrow|Control|Shift|Alt|OS)(?:Left|Right)|(?:Arrow|Page)(?:Up|Down)",
    "Space|Quote|Equal|Comma|Minus|Period|Slash|Semicolon|Backslash|CapsLock|ContextMenu",
    "Backquote|Help|Backspace|Tab|Enter|Escape|End|Home|Insert|Delete|PrintScreen|NumLock",
    "Again|Convert|Copy|Cut|Eject|Find|IntlBackslash|IntlRo|IntlYen|KanaMode|NonConvert",
    "Open|Paste|Pause|Power|Props|ScrollLock|Select|Sleep|Undo|WakeUp|Lang[1-2]",
    "Media(?:PlayPause|Select|Stop|TrackNext|TrackPrevious)|Volume(?:Up|Down|Mute)",
    "Browser(?:Back|Favorites|Forward|Home|Refresh|Search|Stop)|Launch(?:App1|App2|Mail)"

].join("|")})(?:_(\\d\\d?)?([iI])?)?$`));
Выделить код

Код:

keydown_win = e => { // перехват клавиш, учитывая поля ввода

    if (e.repeat) return;

    var data = keyMap[e.code]?.[e.metaKey*8 + e.ctrlKey*4 + e.shiftKey*2 + e.altKey];
    if (data) {
        var cmd = docShell.isCommandEnabled("cmd_insertText");

        for(var [name, p, i] of data) if (i ^ cmd)
            p && e.preventDefault(), klaBa[name](e, gBrowser.selectedTab);
    }
},

Ты проверял старый код

Какой был предоставлен, такой и проверял.

Отредактировано Dumby (23-07-2023 00:42:16)

Отсутствует

 

№95523-07-2023 11:15:37

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 115.0

Re: UCF - ваши кнопки, скрипты…

Add Toolbar Buttons уже починяли? Если нет, Dumby, посмотри пожалуйста, из кнопки Восстановить закрытые вкладки пропали.

Отсутствует

 

№95623-07-2023 12:48:36

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1224
UA: Firefox 115.0

Re: UCF - ваши кнопки, скрипты…

voqabuhe
Northtech мне дал решение в личке.

В самом расширении есть файл parent.js
все getClosedTabCount заменить на getClosedTabCountForWindow

Отсутствует

 

№95723-07-2023 15:04:03

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 115.0

Re: UCF - ваши кнопки, скрипты…

xrun1
Спасибо, работает. А с другими кнопками всё нормально, не заметил чего?

Отсутствует

 

№95823-07-2023 20:58:48

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1224
UA: Firefox 115.0

Re: UCF - ваши кнопки, скрипты…

voqabuhe
Из тех, которыми пользуюсь - работают.

Отсутствует

 

№95924-07-2023 12:59:42

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 475
UA: Firefox 97.0

Re: UCF - ваши кнопки, скрипты…

Dumby - придумал вариант списка нажатий клавиш проще прежнего. Код доделаю нескоро, может у тебя получится?


Формат: получаем имя нажатой кнопки вместе с управляющими клавишами: Digit1_1 равно Alt+1 (учитывая LED-индикаторы, если в объекте вместо функции Digit1_1 есть строка "Digit1_1").
Но управляющие клавиши можно отделить от имени, если это упростит код (как у тебя сделано для перехвата нажатий мыши).

Пример объекта - Если вместо функции строка, то учитывем LED-индикаторы
1) Если в объекте есть функция Digit1_1 (без учёта LED), то все режимы разрешены, то есть выполняем её всегда.
2) Если нет функции Digit1_1 и строки-объекта "Digit1_1", то добавляем состояние LED-индикаторов (Digit1_17, если CapsLock включен) и ищем такую функцию или строку-объект.
3) Если вместо функции имеется строка-объект, то "Digit1_1" или "Digit1_17" содержит одну или несколько функций, имена которых равны сумме флагов.
Разрешающий флаг как в предыдущих кодах, включает: preventDefault*4 + Input*2 + MainPage
Преимущество в том, что одно и тоже сочетание клавиш (Alt+1) может работать по разному в зависимости от LED-индикаторов.
Можно добавить фильтр по операционной системе, тогда сначала ищем это же имя + ваша OS: "Digit1_1_macosx", потом обычное имя Digit1_1.

Выделить код

Код:

var keyData = { // имя объекта: Клавиша_Shift+Alt+Ctrl[LED]
	Digit1_1(e) { // 1+Alt если Имя = Функция, считаем, что все режимы разрешены
			console.log("Digit1 везде");
	},
	"Digit1_1": { // 1+Alt
		7(e){ // preventDefault*4 + Input*2 + MainPage
			console.log("Digit1 везде, игнорируя LED-индикаторы");
		},
		2(){}, // только в полях ввода, Skip preventDefault
		5(){}, // кроме полей ввода
	},
	"Digit1_1_macosx": { // массив для переопределения отдельных сочетаний клавиш для вашей OS
		16(e){ // только если CapsLock включен
			keyData["Digit1_1"][0]("Digit1_1_macosx"); // повторяем код из общего объекта
		}
	},
}

Отсутствует

 

№96025-07-2023 08:13:52

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: UCF - ваши кнопки, скрипты…

Dobrov пишет

Пример объекта - Если вместо функции строка, …

Что-то не вижу никакой строки вместо функции.


И, при такой записи, "Digit1_1" затрёт Digit1_1
то есть, у объекта keyData будет только два (не три) свойства,
Digit1_1 как объект (не фунция, функция затёрта объектом) и Digit1_1_macosx

Отсутствует

 

№96125-07-2023 08:37:38

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 475
UA: Firefox 97.0

Re: UCF - ваши кнопки, скрипты…

Dumby пишет

Что-то не вижу никакой строки вместо функции.
И, при такой записи, "Digit1_1" затрёт Digit1_1 то есть, у объекта keyData будет только два (не три) свойства,

В объекте все варианты для примера, а так должен быть только один из них. Далее разбор в зависисмости от режима e.getModifierState("CapsLock") и прочих LED…


То есть, эти две записи нельзя различить по типам, учитывая, что в объекте должна быть только одна из них?
KeyData = {   Digit1_1(e) {},   "Digit1_1": {}   }

Отсутствует

 

№96225-07-2023 12:23:29

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: UCF - ваши кнопки, скрипты…

Dobrov пишет

То есть, эти две записи нельзя различить по типам, учитывая, что в объекте должна быть только одна из них?
KeyData = {   Digit1_1(e) {},   "Digit1_1": {}   }

Не понял.
В одном объекте, даже не «должна», а «может»
быть только одна такая запись, то есть — различать просто не с чем.


А если имеется в виду, что различить такую же запись
но в другом объекте, то, разумеется, можно, это очевидно.

Отредактировано Dumby (25-07-2023 12:33:13)

Отсутствует

 

№96325-07-2023 17:31:51

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 475
UA: Firefox 97.0

Re: UCF - ваши кнопки, скрипты…

Dumby - я ранее расписал примерный алгоритм обработки нажатий. Различать по типу - если ключ это функция, то её запускаем, не проверяя режимы ввода. В примере это первый Digit1_1.


А в строковом ключе (имя свойства объекта) будут имена функций тех режимов, на которых надо запускать код для этого сочетания клавиш.
    "Digit1_1": { // 1+Alt
        7(e){}, // preventDefault*4 + Input*2 + MainPage
        2(){}, // только в полях ввода, Skip preventDefault
        16(e){} // только если CapsLock включен e.getModifierState("CapsLock")*16

Отредактировано Dobrov (25-07-2023 17:32:57)

Отсутствует

 

№96427-07-2023 02:00:22

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 115.0

Re: UCF - ваши кнопки, скрипты…

Dumby
Тут недавно говорили
https://forum.mozilla-russia.org/viewto … 64#p804264
и после последнего обновления ESR оно престало работать.

скрытый текст

Выделить код

Код:

(async style => {
	var uri = Services.io.newURI("data:text/css;charset=utf-8," + encodeURIComponent(style));
	var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
	sss.loadAndRegisterSheet(uri, sss.USER_SHEET);
})(`
...
`);


То ли лыжи не едут...

Отсутствует

 

№96527-07-2023 10:13:21

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: UCF - ваши кнопки, скрипты…

_zt
Прости великодушно, но я слишком глуп,
чтобы соотнести то, о чём «недавно говорили»,
с кодом регистрации стиля из-под спойлера.


Но да, на 115, вроде вполне достаточно будет просто только

скрытый текст

Выделить код

Код:

(async ids => {
	for(var id of ids)
		document.getElementById(id)?.setAttribute("removable", true);
})(["unified-extensions-button", "alltabs-button"]);

Отсутствует

 

№96627-07-2023 11:09:43

6e73epo
Участник
 
Группа: Members
Зарегистрирован: 06-05-2022
Сообщений: 207
UA: Firefox 118.0

Re: UCF - ваши кнопки, скрипты…

Dumby, подскажите, в чем разница между этими двумя записями?


Cc['@mozilla.org/file/directory_service;1'].getService(Ci.nsIProperties).get('UChrm', Ci.nsIFile);
Services.dirsvc.get("UChrm", Ci.nsIFile);

Отсутствует

 

№96727-07-2023 12:45:02

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: UCF - ваши кнопки, скрипты…

6e73epo пишет

в чем разница между этими двумя записями?

Мне кажется, что хоть в сколько-нибудь актуальной версии лисицы,
эти две записи совершенно эквивалентны.


Но, если интересно копнуть вглубь веков относительно сахара,
то Cc и Ci определены с Firefox 60, а Services определён с Firefox 104.

Отсутствует

 

№96827-07-2023 14:39:54

6e73epo
Участник
 
Группа: Members
Зарегистрирован: 06-05-2022
Сообщений: 207
UA: Firefox 118.0

Re: UCF - ваши кнопки, скрипты…

Dumby, благодарю, а чуть выше вы дали понять что в 115 записи для "unified-extensions-button" и "alltabs-button" могут быть эквивалентны, т.е. для config.js можно так

скрытый текст

Выделить код

Код:

// сделать кнопку All Tabs (alltabs-button) съемной
(async topic => {
	var obs = doc => doc.getElementById("alltabs-button")?.setAttribute("removable", true);
	Services.obs.addObserver(obs, topic);
	Services.obs.addObserver(function quit(s, t) {
		Services.obs.removeObserver(quit, t);
		Services.obs.removeObserver(obs, topic);
	}, "quit-application-granted");
})("chrome-document-interactive");

// сделать кнопку unified-extensions-button съемной
(async topic => {
	var obs = doc => doc.getElementById("unified-extensions-button")?.setAttribute("removable", true);
	Services.obs.addObserver(obs, topic);
	Services.obs.addObserver(function quit(s, t) {
		Services.obs.removeObserver(quit, t);
		Services.obs.removeObserver(obs, topic);
	}, "quit-application-granted");
})("chrome-document-interactive");

Как бы это дело подсократить, чтобы дублирующие строки не писать или оставить как есть?

Отредактировано 6e73epo (27-07-2023 14:41:38)

Отсутствует

 

№96927-07-2023 16:27:46

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: UCF - ваши кнопки, скрипты…

6e73epo пишет

Как бы это дело подсократить

Да обычный мерж, только и всего.
Не стал for of писать, чтобы не потерять наглядность.

скрытый текст

Выделить код

Код:

// установить для кнопок #alltabs-button и #unified-extensions-button
// атрибут "removable" как "true"
(async topic => {
	var obs = doc => {
		doc.getElementById("alltabs-button")?.setAttribute("removable", true);
		doc.getElementById("unified-extensions-button")?.setAttribute("removable", true);
	}
	Services.obs.addObserver(obs, topic);
	Services.obs.addObserver(function quit(s, t) {
		Services.obs.removeObserver(quit, t);
		Services.obs.removeObserver(obs, topic);
	}, "quit-application-granted");
})("chrome-document-interactive");

Отсутствует

 

№97027-07-2023 19:20:58

b0ttle
Участник
 
Группа: Members
Зарегистрирован: 22-10-2020
Сообщений: 182
UA: Firefox 115.0

Re: UCF - ваши кнопки, скрипты…

6e73epo
Что за кнопка alltabs-button, что-то понять не могу? Разобрался, а что, удобно.

Отредактировано b0ttle (27-07-2023 19:25:39)

Отсутствует

 

№97129-07-2023 08:32:11

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 475
UA: Firefox 97.0

Re: UCF - ваши кнопки, скрипты…

Dumby прошу дополнить первый вариант парсинга горячих клавиш, чтобы работал в зависимости от текущей операционной системы.


Логика такая: прописаны две одинаковых горячих клавиши, но у одной постфикс (или префикс, если это проще сделать в коде) с именем нужной ОС, для которой нужно выполнять код.
Если ОС, на которой запущен браузер, совпадает с именем сочетания клавиш Digit1_I_win с префиксом (постфиксом), то код из обычного имени Digit1_I игнорируется и выполняется Digit1_I_win (или Digit1_I_macosx, если браузер запущен на МакОС)
Тогда можно в один список включить как обычные сочетания клавиш, которые выполняются всегда, так и некоторые с постфиксом, которые будут действовать только на конкретной ОС (например, запуск Быстрых Заметок)
Вообще, синтаксис на твоё усмотрение, необязательно Клавиша_МОД Digit1_I, может вариант удобнее придумаешь ?

Выделить код

Код:

var KlaBa = {
keyX_1(e) { // обычное сочетание клавиш работает всегда
	console.log("Alt+X skip preventDefault");
},
Digit1_I_macosx(e, t) { // приоритет для вашей OS
	shell_RunwA("/usr/bin/open", ["-n","-b","com.apple.Stickies"]);
},
Digit1_I_win(e, t) { // приоритет для вашей OS
	shell_RunwA("C:\\Windows\\system32\\StikyNot.exe","");
},
Digit1_I(e, t) { // приоритет низкий
	run Notes
},
Digit1: "Digit1_I" //ссылка на функцию
};

Отредактировано Dobrov (29-07-2023 09:47:31)

Отсутствует

 

№97230-07-2023 08:06:54

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: UCF - ваши кнопки, скрипты…

Dobrov
Во загадал загадку!
Что-то ничего умнее не смог придумать, чем так

скрытый текст

Выделить код

Код:

((obj, re) => {
	var del = new Set();
	var platformRe = /_(?:win|linux|macosx)$/;
	var {platform} = AppConstants, num = -platform.length - 1;

	for(var p in klaBa) platformRe.test(p) && del.add(
		p.endsWith(platform) ? p.slice(0, num) : p
	);
	for(p in klaBa) del.has(klaBa[p]) && del.add(p);
	for(var d of del) delete klaBa[d];

Отсутствует

 

№97330-07-2023 13:33:56

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 475
UA: Firefox 97.0

Re: UCF - ваши кнопки, скрипты…

Dumby пишет

Во загадал загадку!

Спасибо! Но имена функций остаются в постфиксом ОС: Digit1_I_macosx(e, t)……
Перехват клавиш может не сработать ??? если нет нажатия управляющих клавиш: Digit1_macosx

пробовал убрать, создав копию свойства объекта, но не работает:

Выделить код

Код:

var klaBa = {
	keyX_1(e) {
		console.log("Alt+X skip preventDefault");
	},
	Digit1_I_macosx(e, t) { // приоритет для вашей OS
		shell_RunwA("/usr/bin/open", ["-n","-b","com.apple.Stickies"]);
	},
	Digit1_I_win(e, t) { // приоритет для вашей OS
		shell_RunwA("C:\\Windows\\system32\\StikyNot.exe","");
	},
	Digit1_I(e, t) { // приоритет низкий
		0;
	},
	Digit1: "Digit1_I" //ссылка на функцию
};

((obj, re) => {

	var del = new Set();
	var platformRe = /_(?:win|linux|macosx)$/;
	var {platform} = AppConstants, num = -platform.length - 1;

	for(var p in klaBa) platformRe.test(p) && del.add(
		p.endsWith(platform) ? p.slice(0, num) : p
	);
	for(var p in klaBa) del.has(klaBa[p]) && del.add(p);
	for(var d of del)
		delete klaBa[d]; //есть Key_OS ? удалить имена-клоны
	for(var p in klaBa)
		if (platformRe.test(p)) { //убрать имя вашей ОС из свойства
			klaBa[p.replace(platformRe,'')] = klaBa[p];
			delete klaBa[p];
	}
	for(var p in klaBa) {

		var func = klaBa[p];
		if (typeof func == "string") func = klaBa[func]; //ссылка на функцию

		var [key, mod] = p.split("_");
		mod = mod || "";

		var upper = key[0].toUpperCase();
		var prevent = key[0] == upper;

		var [, m, i] = mod.match(re);
		m = m || 0; // modifiers bitmap

		var arr = [func, prevent, i ? i == "I" ? 1 : 0 : -1]; // textfields flag

		var prop = prevent ? key : upper + key.slice(1); //имя клавиши без модификаторов

		var o = obj[prop] || (obj[prop] = Object.create(null));

		o[m] ? o[m].push(arr) : o[m] = [arr];
	}

	klaBa = obj;
})(Object.create(null), /(\d+)?([a-z]+)?/i);

for(p in klaBa)
	console.log(klaBa[p]);

Отсутствует

 

№97431-07-2023 08:31:17

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: UCF - ваши кнопки, скрипты…

Dobrov пишет

имена функций остаются в постфиксом ОС: Digit1_I_macosx(e, t)……

Имена функций значения не имеют, их вызов идёт без участия имени.
Функция перекочёвывает в массив,
а когда e.code и сумма модификаторов совпадает с нажатыми клавишами,
извлекается деструктурирующим присваиванием for(var [func, p, i] of data)

Перехват клавиш может не сработать ??? если нет нажатия управляющих клавиш: Digit1_macosx

Если отказаться от удаления ОС из свойств объекта, то будет работать неправильно.
Из-за того, что re был изменён с /(\d+)?(i)?/i на /(\d+)?([a-z]+)?/i
флаг полей ввода пропишется как ноль, то есть — только в полях ввода,
а должен быть минус единица, то есть — всегда.

пробовал убрать, создав копию свойства объекта, но не работает

Да вроде работает как написано, свойство Digit1_I_win успешно заменяется на Digit1_I
но имя самой функции, на которую ссылается klaBa.Digit1_I
при этом, конечно же, не меняется, остаётся Digit1_I_win

Отсутствует

 

№97502-08-2023 10:54:06

Black_Monk
Участник
 
Группа: Members
Зарегистрирован: 18-02-2012
Сообщений: 195
UA: Firefox 116.0

Re: UCF - ваши кнопки, скрипты…

После установки 116-й версии в очередной раз исчезла нижняя панель. :( Специалисты, подскажите как опять её вернуть-то? Пробовал вот это, но не помогло. Может надо версию обновить? У меня в version.txt прописано: "версия, дата г-м-д: 2021-9-23".


Windows 10 LTSC

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]