Xpoint
   [напомнить пароль]

XUL: отловить смену раскладки клавиатуры

Метки: [без меток]
2009-09-25 13:21:20 [обр] Just(0/8)[досье]

Привет всем.

Наверняка кто-нибудь сталкивался.
Думаю, некоторые хотя бы видели нечто подобное, или знают где копать...

Начну "издалека".
Хобби у меня — писать клавиатурне тренажеры.
Недавно сделал версию для 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...", который бы мне в этом помог.
Может кто-нибудь знает "такое" решение?

Да, за работающий вариант Вы будете упомянуты в каментах к коду,
 и в "справочной системе" Вам будет отдельная спасибка.
Ну, если Вам это (спасибка == реклама?), нужно.

Собственно, это — основное...

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

Понимаете, я один, я не программист, и это просто хобби...

В общем, камрады, если кто-нибудь реально захочет помочь:

  1. Если у кого-нибудь есть мак...

У меня мака нет, и у друзей нет, и ставить хакинтошъ как-то, IMHO, не совсем честно что ли...
Но я знаю, что в макоси есть мозилла...
А? Откликнитесь? Потестите?

  1. Я не знаю как сделать так, чтобы загрузка JS кода и его "готовность к исполнению"

были прозрачно очевидны. В HTA есть readyState. Здесь я его не нашел.
Поэтому использую try catch(e)... Жду, когда нужные функции подгрузятся...
Там же везде AJAX, значит асинхронность.
Конкретно весьма проблемный код получился в kernel.txt, функция kernel.fns.boot().
Предаврительно использую применительно к созданным скриптам parentNode != null...
Но это, явно — не то.
Если кто-нибудь может прокомментировать эту ситуацию...

  1. Последнее: если кто-нибудь реально знает как что-нибудь сделать "проще/лучше",

и захочет принять участие — всегда рад ...

:)

Уважаемый господин модератор, я знаю что Вы лично весьма увлекаетесь XUL ;^)
Вам я лично Очень признателен, мне весьма помогало чтение кодов плагинов,
в разработке которых Вы принимали участие
(в основном меня интересовало размещение кнопки на панели и install.rdf)...
Спасибо Вам отдельное!
Если хотите, могу поставить ссылку у себя на сайте на этот чудесный форум (его я читаю давным давно).
Раньше здесь про мою поделку ничего не было, теперь есть этот тред, формально — это повод.
Когда-то на заре становления интернета cross-linking считался хорошей штукой...
Это будет "нормально"?

Ну, вот, вроде-бы и — всё.
Всем, заранее, выражаю огромную признательность!

Простите, "если что не так", и за то, что "многа букаф".

спустя 3 минуты [обр] Just(0/8)[досье]

Простите, еще кое-что, ну, раз уж, то уч что уж тут...

Кто-нибудь знает как проверить валидность кода для старых версий?
Просто у меня FF 3.5.3.
Я знаю, что вероятнее всего код будет работать и на ранних версиях.
Но ставить их только затем чтобы потестить...

Powered by POEM™ Engine Copyright © 2002-2005