samstyle / Xpeccy

Multiplatform emulator of retro computers
MIT License
71 stars 13 forks source link

[MacOS] клавиатура #51

Closed ammehet closed 5 years ago

ammehet commented 5 years ago

Использую сборку 0.6.20190301, на предыдущих такое же поведение.

1) После нажатия и удерживания любой клавиши до срабатывания автоповтора, автоповтор не остановится до тех пор, пока не убрать фокус ввода с окна. Во время бесконтрольного автоповтора можно нажать любую другую (но не ту же самую!) кнопку и удерживать до уже её автоповтора, и тогда всё останавливается вообще, ни на что больше не реагирует. Продолжают работать только хоткеи самого эмулятора. Выход из ступора – переключение фокуса ввода из окна и обратно, можно даже через вызов и закрытие окна настроек по горячей клавише.

2) Нажатие любой клавиши в комбинации с command, даже быстрое, не дожидаясь автоповтора, приводит к тому же результату – начинается неконтролируемый автоповтор до перехватывания и возвращения обратно фокуса ввода.

UPD Через ZX Keyboard видно, что command (он же SS) отжимается, как и положено, а вот клавиша, нажатая в комбинации с ним, залипает.

samstyle commented 5 years ago

Заметка для себя: автоповтор в MacOS многократно нажимает клавишу без её отжатия. Событие отжатия происходит только при физическом отпускании кнопки.

samstyle commented 5 years ago

Сборка под macos обновлена. просьба проверить https://github.com/samstyle/Xpeccy/releases/download/0.6.20190302/xpeccy_0.6.20190303_x86_64.dmg

ammehet commented 5 years ago

Вот совсем другое дело! Пункт 1 можно вычеркнуть совсем.

А также в пункте 2 поведение изменилось: теперь после потери и возврата фокуса залипание не отлипает. Отлипнуть можно только ресетом спектрума или правой мышкой через ZX Keyboard.

ammehet commented 5 years ago

Ещё наблюдение: если отлипнуть через ZX Keyboard, то повторное однократное быстрое нажатие на ту же клавишу даже без command мгновенно приводит к залипанию, остальные клавиши отрабатывают нормально. Но если специально с commandом «залипнуть» какую-нибудь ещё, а затем отлипнуть через ZX Keyboard, то таких «залипучих» становится уже двое, остальные продолжают работать нормально. Если же «залипнуть» сочетание, например CS+1, то залипать начинает и CS и 1. То есть, даже после «отлипания» через ZX Keyboard и CS и 1 нажать, например, Backspace (CS+0), то CS остаётся залипшим. Также замечено, что если «залипшие» и отлепленные клавиши нажимать левой мышкой через ZX Keyboard, они тоже залипают точно так же, как если бы были нажаты на клавиатуре, остальные же ведут себя как положено.

Ресет спектрума по F12 очищает список залипшего, и можно начинать новую коллекцию.

То есть, здесь явно есть ещё что-то, что хранит список залипшего вплоть до ресета эмулируемой машины.

А про кнопку комманд да, есть такая тема. Приходилось даже залезать в исходники нативно портированного в Cocoa эмулятора fuse с целью принудительно вызывать отжатие клавиш, типа такого:

- (IBAction)disk_open_a:(id)sender
{
  [self openDisk:0];
  [self releaseCmdKeys:@"a" withCode:QZ_a];
}

Причём, сканкоды макосьных клавиш нигде не документированы, с трудом нагуглились здесь https://boredzo.org/blog/archives/2007-05-22/virtual-key-codes#comment-523980 (вдруг полезно будет)

samstyle commented 5 years ago

Опять пересобрал. LC перенесено на Ctrl. Оказалось, со стороны Qt эта кнопка называется Qt::Key_Meta, тогда как на PC-шной клаве это Win. Qt::Key_Control на MacOS это Command, а на PC Ctrl. Такие дела. С Ctrl залипаний нет, но если зажать Command+кнопка, то эта кнопка останется залипшей. Вот тут уже склонен валить на Qt - она реально не отжимается совместно с Command. https://github.com/samstyle/Xpeccy/releases/download/0.6.20190302/xpeccy_0.6.20190303_x86_64.dmg

PS: насчёт залипаний. в эмуляторе матрица zx-клавиатуры для каждой кнопки хранит счетчик, который увеличивается при нажатии и уменьшается при отжатии. это предотвращает фейковые отжатия кнопок (если нажать влево+вправо и отпустить влево, раньше отпускалось и CS)

Мне ещё интересно, что на Shift+6 и почему в такой комбинации это не ^

ammehet commented 5 years ago

Спасибо! Теперь всё работает в точности так, как и ожидалось! Комманд по-прежнему приводит к залипаниям, но кому он теперь нужен, когда есть контрол =)

Про счётчик нажатий/отжатий да, разумная идея, но надо особенно осторожно, когда обрабатывается сочетание клавиш. Ни разу не щупал реального спектрума со стрелочными кнопками, но почему-то уверен, что там аппаратно нажимается CS+5..8. То есть сочетание должно нажиматься и отжиматься полностью, а не частично. Одновременное нажатие двух стрелок может привести к интерпретации CS+6+CS+7, то есть двое CS и две цифры, а при отжатии один CS рискует остаться залипшим.

А вот про shift+6 пошёл проверить, и обнаружил только то, что реакция на кнопки зависит от текущей раскладки рус/лат. То есть, в случае рус shift+4 нажимает CS+SS+o (SS+o == ; и CS на самом деле тут лишний, но shift же нажат), так же происходит и при нажатии shift+;. Но при этом shift+6 (и 7 тоже) в рус нажимает только shift, хотя могло бы нажать и SS+c (?) или SS+b (*) соответственно, но нажимает только CS и всё. А также при этом shift+остальные цифры в рус работают так же, как и в лат, то есть правильно. В лат раскладке всё вообще правильно. Нет смысла заморачиваться, спектрум английский, юзайте лат =)