Возьмите фокус на встроенное окно внутри Gtk::Socket

Я встроил gvim в Gtk::Socket, который помещен в Gtk::Box, как я могу захватить фокус на встроенном окне gvim, чтобы добиться того же, что и указывать и щелкать во встроенном окне?

С помощью ->grab_focus() на виджет Gtk::Socket не оказывает никакого влияния.

Согласно спецификации XEMBED ( http://standards.freedesktop.org/xembed-spec/xembed-spec-latest.html) кажется, что устройство для встраивания (Gtk::Socket) должно отправить либо XEMBED_FOCUS_IN или XEMBED_WINDOW_ACTIVATE сигнал для ребенка, но в Gtk::Socket, похоже, нет интерфейса для этого.

Простой пример того, что я пытаюсь сделать на основе примеров Gtk:: Plug и Gtk::Socket, можно найти здесь: https://github.com/gauteh/plug-socket-grab-focus.

В случае, если это ошибка, об этом сообщалось здесь: https://bugzilla.gnome.org/show_bug.cgi?id=729248

1 ответ

Решение

Теперь есть два способа добиться этого, один из них - использовать патч, как указано в: https://bugzilla.gnome.org/show_bug.cgi?id=729248 который добавляет gtk_socket_focus_forward () метод для GtkSocket, Вызов этого будет фокусировать первый виджет внутри Gtk::Plug окно.

Пример использования gtk_socket_focus_forward можно найти в ветви focus_forward примера, адаптированного из стандартного примера.

Второй способ добиться этого - отправить Gtk::DIR_TAB_FORWARD Сигнал, как описано в списке рассылки, аналогичный пример можно найти в ветке tab_forward.

Это включает в себя следующее:

socket->set_can_focus (true);
socket->child_focus (Gtk::DIR_TAB_FORWARD);

Метод немного отличается от того, что возможно с gtk_socket_focus_forward, но, кажется, делает свое дело.

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