WindowKeyPressFcn перестает вызываться

Я работаю над некоторыми модификациями EEGlab's eegplot функция (такие как навигация в стиле vim и т. д.), которая должна работать через WindowKeyPressFcn,
Однако обратный вызов по какой-то причине не вызывается. Я отлаживал проблему в течение некоторого времени, и я немного потерян. Я ищу предложения о том, что может быть не так. К сожалению eegplot функция большая, сложная и несколько запутанная, и я не смог воспроизвести проблему на простом примере. Поэтому я ищу общие предложения о том, почему дескриптор функции, который явно присутствует в WindowKeyPressFcn может перестать использоваться в какой-то момент.

Вот что я узнал до сих пор:

  • Если я иду в режим отладки в eegplot (установить точку останова в конце функции настройки [первая половина eegplot]) Я могу запустить WindowKeyPressFcn Хотя бы один раз.
  • Однако - функция перестает вызываться в какой-то момент во время отладки (иногда даже после вызова только один раз).
  • Если я бегу eegplot без отладки (то есть ожидания его завершения и возврата управления мне) я не могу позвонить WindowKeyPressFcn нажатием клавиши. Дескриптор функции все еще присутствует в WindowKeyPressFcn свойство фигуры.
  • Когда WindowKeyPressFcn не используется, когда я нажимаю клавишу, я все еще могу вызвать ее с помощью:

    figh = gcf;
    fun = get(figh, 'WindowKeyPressFcn');
    ev.Key = 'rightarrow';
    ev.Character = ' ';
    ev.Modifier = [];
    feval(fun, figh, ev);
    

Таким образом, дескриптор функции, так сказать, "здоров", но по какой-то причине он больше не используется, когда нажата клавиша и фигура находится в фокусе. Когда и почему могло произойти нечто подобное? Любые идеи о вещах, которые я должен проверить, чтобы понять эту проблему?

Обновление:
Я обнаружил, что обратный вызов WindowKeyPressFcn иногда может блокироваться некоторыми прослушивателями окон, и попробовал следующее решение:

hManager = uigetmodemanager(gcf);
set(hManager.WindowListenerHandles,'Enable','off');

Это не работает - WindowKeyPressFcn все еще не вызывается, когда я нажимаю клавишу.:(

Обновление 2:
Еще одна вещь, которая не работает:

chld = get(gcf, 'Children');
tp = get(chld, 'type');
chld = chld(strcmp(tp, 'uicontrol'));
set(chld, 'KeyPressFcn', @eegplot_readkey_new)

(eegplot_readkey_new это функция, которую я использую для реагирования на нажатия клавиш)

Обновление 3:
И еще один не работает:

addlistener(gcf, 'WindowKeyPress', @eegplot_readkey_new);

1 ответ

Решение

Хорошо, я все выяснил, хотя решение странно, если не сказать больше. По какой-то таинственной причине, используя linesmoothing недокументированное свойство предотвращает WindowKeyPressFcn от вызова. Я понятия не имею, почему...

Другие вопросы по тегам