Gtk: отправить фокус в окно верхнего уровня без потери первого окна верхнего уровня - PullRequest
1 голос
/ 07 декабря 2010

Вот ситуация:

1) У меня есть два окна верхнего уровня, A и B

2) А перед В

Как отправить фокус на клавиатуре в окно B, оставив окно A перед B?

Ответы [ 3 ]

1 голос
/ 08 декабря 2010

Я предполагаю, что вы управляете обоими окнами, и это на системе X11, такой как Linux.Если нет, то это намного сложнее.Я делал подобные вещи в одном приложении, и вот некоторые воспоминания.

Вы, наверное, поняли, что не можете просто использовать gtk_widget_grab_focus () .Это работает только для определения того, какой виджет в окне имеет фокус, когда само окно имеет фокус.

Это X11 определяет, какое окно получает событие клавиатуры, основываясь на иерархии окон, информации из оконного менеджера и т. Д.Тем не менее, вы можете поэкспериментировать с этим через GDK, чтобы получить желаемый результат.

Вам нужно будет узнать о распространении события GDK и, возможно, прочитать некоторые из источников GDK.Но я считаю, что, как правило, вам нужно сделать следующее:

  1. Используйте gdk_event_handler_set () для установки вашего собственного обработчика событий.Вам нужно будет сделать это после инициализации GTK + и связать с gtk_main_do_event ().
  2. Когда вы получите событие клавиатуры (GdkEventKey), посмотрите на структуру событий X.Если у него есть XID для окна A, замените его XID для окна B и передайте его GTK +.Вам может потребоваться продублировать событие и не изменять исходное.

Если окна принадлежат разным приложениям, вы можете посмотреть на gdk_event_send_client_message (), но я никогда не использовал его.

1 голос
/ 09 декабря 2010

gtk_window_set_keep_above(a), за которым следует gtk_window_present(b)?

1 голос
/ 07 декабря 2010

Если вы не возражаете, что он не прямой, вы можете отправлять события клавиатуры из окна верхнего уровня в окно позади него. Конечно, это предполагает, что вы создаете оба окна, а не пишете программу для наведения на задний план и чтения ввода с клавиатуры, используемого в отдельной программе.

...