XUL: отловить смену раскладки клавиатуры
Привет всем.
Наверняка кто-нибудь сталкивался.
Думаю, некоторые хотя бы видели нечто подобное, или знают где копать...
Начну "издалека".
Хобби у меня — писать клавиатурне тренажеры.
Недавно сделал версию для Fire Fox.
Это не реклама, это, чтобы было понятно:
https://addons.mozilla.org/ru/firefox/addon/14396
В общем, господа, кто-нибудь может помочь?
Собственно, что мне нужно:
Мне необходимо отловить реакцию смены раскладки клавиатуры.
В каталоге bin после установки дополнения будет файлик kb.txt .
Есть в нем функция kb.changeMap().
Она в самом начале, седьмая строчка...
Так вот, написанный код отлавливает реакцию нажатия клавишь Ctrl Alt Shift.
В Windows "всё чудесно" :)
На моей любимой убунту, ради которой всё, собственно, и началось — "бида бида"...
Пришлось дописать туда кнопку 116 (F5), для принудительной смены раскладки.
Попытки микроскопного изучения вопроса привели к тому, что в случае если в тренажере выбрано
такое же сочетание как и в системе, то нажатие какой-нибудь функциональной клавиши
сбрасывается в "0". Например нажатие Ctrl + Alt сбрасывает Alt или Ctrl в keyCode == 0.
Еще одно замечание: в 0 сбрасывается то, что было нажато вторым.
В результате вот прообраз будущего измененного кода этой функции:
kb.changeMap = function(event){
var mc = kernel.vars.user.mapChanger;
var ek = event.keyCode;
var ctk = false, shk = false, alk = false;
if(event.ctrlKey || (ek == 17)){ ctk = true; }
if(event.shiftKey || (ek == 16)){shk = true; }
if(event.altKey || (ek == 18)){ alk = true; }
// document.title = "changeMap() " + ek + " " + ctk + " " + shk + " " + alk;
if(
((ek == 0) && (navigator.platform.toLowerCase().indexOf('win') == -1))
//Linux keyb switching function is fief ! it's stole ek!
(ek == 116)
(
(mc[0] == ctk) &&
(mc[1] == shk) &&
(mc[2] == alk)
)
){
if(!kb.changeMap.stopControl){
kb.changeMap.stopControl = true;
window.setTimeout("kb.truStopControl()", 200);
kb.t_changeMap();
}
}
}
Каменты в теле оставил для понятности.
Но, что-то мне подсказывает, что это не совсем верно.
Во всяком случае такая "заплатка" перехватывает нажатие не всегда, а через раз.
Иногда "залипает" надолго.
Как показала практика 100% срабатывает если нажимать медленно и последовательно.
От быстрого нажатия — "залипает", блин...
Кто-нибудь может подсказать где здесь "собака порылась"?
Да, самое, на "мой вкус" "чудовное" решение — просто прочесть текущую раскладку.
Читать ее, скажем, каждые 100 милисекунд...
Но как это сделать? Я так и не нашел никакого класса в "@nsI...", который бы мне в этом помог.
Может кто-нибудь знает "такое" решение?
Да, за работающий вариант Вы будете упомянуты в каментах к коду,
и в "справочной системе" Вам будет отдельная спасибка.
Ну, если Вам это (спасибка == реклама?), нужно.
Собственно, это — основное...
Уважаемый господин модератор, если сочтете нужным, то напишите мне, и я перенесу
нижеследующее в отдельный тред.
Но, просто сразу заводить его специально я не стал, т.к. речь, в общем-то, об одном и том же...
Понимаете, я один, я не программист, и это просто хобби...
В общем, камрады, если кто-нибудь реально захочет помочь:
- Если у кого-нибудь есть мак...
У меня мака нет, и у друзей нет, и ставить хакинтошъ как-то, IMHO, не совсем честно что ли...
Но я знаю, что в макоси есть мозилла...
А? Откликнитесь? Потестите?
- Я не знаю как сделать так, чтобы загрузка JS кода и его "готовность к исполнению"
были прозрачно очевидны. В HTA есть readyState. Здесь я его не нашел.
Поэтому использую try catch(e)... Жду, когда нужные функции подгрузятся...
Там же везде AJAX, значит асинхронность.
Конкретно весьма проблемный код получился в kernel.txt, функция kernel.fns.boot().
Предаврительно использую применительно к созданным скриптам parentNode != null...
Но это, явно — не то.
Если кто-нибудь может прокомментировать эту ситуацию...
- Последнее: если кто-нибудь реально знает как что-нибудь сделать "проще/лучше",
и захочет принять участие — всегда рад ...
:)
Уважаемый господин модератор, я знаю что Вы лично весьма увлекаетесь XUL ;^)
Вам я лично Очень признателен, мне весьма помогало чтение кодов плагинов,
в разработке которых Вы принимали участие
(в основном меня интересовало размещение кнопки на панели и install.rdf)...
Спасибо Вам отдельное!
Если хотите, могу поставить ссылку у себя на сайте на этот чудесный форум (его я читаю давным давно).
Раньше здесь про мою поделку ничего не было, теперь есть этот тред, формально — это повод.
Когда-то на заре становления интернета cross-linking считался хорошей штукой...
Это будет "нормально"?
Ну, вот, вроде-бы и — всё.
Всем, заранее, выражаю огромную признательность!
Простите, "если что не так", и за то, что "многа букаф".
![[logo]](/site/images/logo.jpg)