Firefox SDK: как захватить горячую клавишу пользователей в настройках?

В package.json у меня есть:

"preferences": [{
    "name": "hotkeyPopup",
    "title": "Hotkey for translating selected text",
    "type": "string",
    "value": "alt-Y"
  }]

И это похоже на input type=text. Как я могу захватить комбинацию горячих клавиш пользователя? Это не круто, что пользователь должен набирать руками слова типа alt или еще хуже accel.

В официальная документация по горячим клавишам ничего не говорит о захвате предпочтения.


person Vitaly Zdanevich    schedule 26.09.2015    source источник
comment
Я включаю захват для своих пользователей. У меня просто есть пользователь, нажимающий горячую клавишу, затем я уведомляю их о прослушивании, пожалуйста, введите комбинацию, и когда они набирают, я запоминаю клавиши. Совсем не сложно, просто простой addEventListener с предотвращением использования по умолчанию и остановкой распространения.   -  person Noitidart    schedule 26.09.2015
comment
@Noitidart, вы сделали это в простых настройках или на пользовательском экране с настройками?   -  person Vitaly Zdanevich    schedule 26.09.2015
comment
Являются ли простые настройки страницей встроенных параметров? Вот где я это сделал: addons.mozilla .org/en-US/firefox/addon/workspacehopper/   -  person Noitidart    schedule 27.09.2015
comment
@Noitidart Я установил ваш аддон и открыл настройки - для Hop Window я могу установить только один ключ - например Alt - а не например Alt + Y?   -  person Vitaly Zdanevich    schedule 27.09.2015
comment
Ах да, но вы можете легко слушать alt и т. д., просто нажмите e.altKey metaKey или ctrlKey   -  person Noitidart    schedule 27.09.2015
comment
@Noitidart Не могли бы вы написать в ответ код, который может захватывать несколько горячих клавиш? Я добавлю этот код в вики в Mozilla Developer Network о горячих клавишах и настройках.   -  person Vitaly Zdanevich    schedule 27.09.2015
comment
Хорошо, я напишу что-нибудь, основываясь на моем аддоне выше. С нетерпением жду вашего вклада в MDN!   -  person Noitidart    schedule 27.09.2015


Ответы (1)


В этом фрагменте окно может быть окном содержимого (вкладка/iframe/и т. д.) или окном xul (nsIDOMWindow)

Очень простой, очень подробный, никаких трюков. Непроверенный.

function enterHotkeyRecord() {
    window.addEventListener('keydown', downed, false);
    window.addEventListener('keyup', upped, false);
    window.addEventListener('keypress', pressed, false);
}

function exitHotkeyRecord() {
    window.removeEventListener('keydown', downed, false);
    window.removeEventListener('keyup', upped, false);
    window.removeEventListener('keypress', pressed, false);
}

function pressed(e) {
    e.preventDefault();
    e.stopPropagation();
}

function upped(e) {
    e.preventDefault();
    e.stopPropagation();
}

function downed(e) {
    e.preventDefault();

    if (e.repeat) {
        // if hold down a key it fires multiple times so ignore it
        return;
    }


    var key = String.fromCharCode(e.code);

    var str = [];

    if (e.keyCode == 27) {
        // user hit escape so lets exit
        enterHotkeyRecord();
        return;
    }

    if (e.altKey) {
        str.push('Alt');
    }

    if (e.shiftKey) {
        str.push('Shift');
    }

    if (e.metaKey) {
        str.push('Meta');
    }

    if (e.ctrlKey) {
        str.push('Ctrl');
    }


    str.push(key);

    console.log('you pressed:', str.join(' + '));
}

enterHotkeyRecord();
person Noitidart    schedule 27.09.2015
comment
У меня есть файл package.json с настройками горячих клавиш - как я могу вызвать enterHotkeyRecord(), когда пользователь нажимает кнопку в настройках аддона? - person Vitaly Zdanevich; 27.09.2015
comment
Если это страница с встроенными параметрами, вы можете прослушать отображение панели опций с помощью наблюдателя, показанного здесь: developer.mozilla.org/en-US/Add-ons/, а затем aSubject этого наблюдателя является window областью действия вашей страницы надстройки, выполните getElementById и прикрепите ее. - person Noitidart; 27.09.2015
comment
Страница встроенных опций - это когда мой json с настройками не в виде отдельного файла, а прямо в index.js? - person Vitaly Zdanevich; 27.09.2015
comment
Пример страницы встроенных параметров: github.com/Noitidart/l10n/tree/inline-options этот xpi в этой ветке плохой, но скачайте как zip и установите, затем перейдите в менеджер дополнений, затем нажмите на опцию для строки надстроек l10n, это встроенные страницы, я думаю, что sdk simple-prefs — это то же самое. - person Noitidart; 28.09.2015
comment
Хм, еще раз о вашем аддоне WorkspaceHopper - нажимаю на Set Hotkey, но ничего не происходит (даже если я пытаюсь установить какую-то горячую клавишу)... Но, насколько я помню, несколько часов назад я видел, что текст на кнопке изменился... - person Vitaly Zdanevich; 28.09.2015
comment
Возможно, это ошибка, которую я сделал пару лет назад, и она была новой с аддоном sdk, так что это был экспериментальный аддон, я сошел с ума, ха-ха - person Noitidart; 28.09.2015
comment
Можно ли изменить label кнопки control в настройках? - person Vitaly Zdanevich; 28.09.2015
comment
Динамически? Да легко, просто дайте ему идентификатор, а затем выполните getElementById с aSubject наблюдателя. Или getElementsByTagName и т.д. и т.д. - person Noitidart; 28.09.2015
comment
Возможно ли это только при встроенных настройках, а не в отдельном package.json? - person Vitaly Zdanevich; 28.09.2015
comment
Перейти на IRC, давайте teamviewer я покажу вам, как это сделать. Я не знаком с package.json, но уверен, что с инспектором DOM мы увидим то же самое. client00.chat.mibbit.com / - person Noitidart; 28.09.2015
comment
Спасибо за ответ, я немного отредактирую ваш код и приму его - с этим я действительно могу захватить горячую клавишу, но без изменения текста на кнопке в настройках я не могу это использовать. Я подумаю о html-странице для предпочтений... - person Vitaly Zdanevich; 29.09.2015
comment
Используйте наблюдателя, чтобы прослушать страницу ваших настроек, aSubject — это window, затем getElementsByTagName или любые другие манипуляции с DOM, чтобы добраться до вашей кнопки и изменить метку. Если вы хотите увидеть пример html-страницы, см. здесь: github.com/Noitidart/l10n/tree /html-параметры - person Noitidart; 29.09.2015