gtk_window_is_active () не работает должным образом - PullRequest
1 голос
/ 10 октября 2019

Я вызываю gtk_window_is_active (wnd) и всегда получаю 0, даже когда я точно знаю, что wnd активен и получает ввод с клавиатуры. В чем причина и где решение этой проблемы?

На самом деле я запускаю gtk_window_list_toplevels () и перебираю список - и gtk_window_is_active () возвращает 0 для каждого из них!

Ответы [ 2 ]

1 голос
/ 11 октября 2019

Благодаря Эммануэле Басси, сотруднику Фонда Gnome, я понял: проблема в том, что мой обработчик фокуса в событии возвратил 1 (ИСТИНА) и, таким образом, предотвратил поведение GTK по умолчанию . Оказалось (что-то неочевидное), что отслеживание активного окна является частью поведения по умолчанию, которое я неосознанно переопределил.

Итак, я изменил обработчик фокуса в событии моих окон, чтобы вернуть FALSE (0), и с тех пор, как gtk_window_is_active () работает как часы.

Я осознал бесполезную (для моей задачи) деталь: gtk_window_is_active () работает только ПОСЛЕ того, как все обработчики фокуса в событии завершили работу. Ну, у меня есть обработчик щелчка мыши, который активирует какое-то другое окно, а затем должен проверить, активно ли определенное окно (эти вещи принадлежат разным объектам и разным модулям, но выполняются в рамках одного вызова хэдлера щелчка). В моем случае gtk_window_is_active () бесполезен: он возвращает FALSE для активного окна до тех пор, пока не будет завершен мой обработчик кликов и не завершены обработчики фокуса в (моем и по умолчанию).

1 голос
/ 11 октября 2019

Когда вы создаете GtkWindow, оно все еще находится в нереализованном состоянии. Вы должны вызвать show () для этого и позволить основному циклу работать, тогда окно реализуется. Поэтому, если вы вызовете gtk_window_is_active после создания окон, но до того, как главный цикл сможет запустить, вы получите false.

...