Вот ситуация:
1) У меня есть два окна верхнего уровня, A и B
2) А впереди Б
Как я могу отправить фокус клавиатуры в окно B, сохраняя при этом окно A перед B?
Вот ситуация:
1) У меня есть два окна верхнего уровня, A и B
2) А впереди Б
Как я могу отправить фокус клавиатуры в окно B, сохраняя при этом окно A перед B?
Я предполагаю, что вы управляете обоими окнами, и это в системе X11, такой как Linux. Если нет, то это намного сложнее. Я делал подобные вещи в одном приложении, и вот некоторые воспоминания.
Вы, наверное, уже поняли, что не можете просто использовать gtk_widget_grab_focus(), чтобы сделать это. Это работает только для определения того, какой виджет в окне имеет фокус, когда само окно имеет фокус.
Именно X11 определяет, какое окно получает событие клавиатуры, основываясь на иерархии окон, информации от оконного менеджера и т. д. Однако вы можете поэкспериментировать с этим через GDK, чтобы получить желаемый результат.
Вам нужно будет узнать о распространении событий GDK и, возможно, прочитать некоторые источники GDK. Но я считаю, что, как правило, вам нужно сделать следующее:
Если окна принадлежат разным приложениям, вы можете посмотреть gdk_event_send_client_message(), но я никогда не использовал ее.
Если вы не возражаете, что это не напрямую, вы можете отправить события клавиатуры из окна верхнего уровня в окно за ним. Конечно, это предполагает, что оба окна созданы вами, а не написаны программа для зависания в фоновом режиме и чтения ввода с клавиатуры, используемого в отдельной программе.
gtk_window_set_keep_above
(a)
, за которым следует < a href="http://library.gnome.org/devel/gtk/stable/GtkWindow.html#gtk-window-present" rel="nofollow">gtk_window_present
(b)
?