Здравствуйте. Задумал я в качестве самообучения написать корректор раскладки. Долго погуглив, составил примерный план дейтсвий1. Вызов функции для определение активного окна (с фокусом ввода)
2. вызов gtk_window_get_focus () для получения виджета на котором фокус ввода
3. установка обработчика для события "focus-out-event", и обработчика для “key-press-event”
обработчик "focus-out-event"
1.1. снимаем обработчик сигнала key-press-event и focus-out-event
1.2. сбрасываем текущий буфер ввода
1.3. возврат к п.1. поиска фокуса
обработчик “key-press-event”
2.1. Если пробел, обнуляем буфер, выход
2.2. Если символ, кладем в буфер новый символ, запускаем нити на поиск
2.3. Иначе обнуляем буфер и выход
вот, но проблема возникает с самым первым этапом, получения дескриптора окна на которой сейчас фокус. Перерыл тонну сайтов, документацию по Gtk так и ненашел функции делающей это.
Но, нашел два других варианта, первый это Xlib:
XGetInputFocus(display, focus_return, revert_to_return)
Display *display;
Window *focus_return;
int *revert_to_return;
вроде то что нужно, но как мне Window переделать в GtkWindow, ведь вся работа далее ведется именно с ним.
Второй способ, это делать связку функций
функция gtk_window_list_toplevels()
Цитата
Возвращает список всех существующих окон верхнего уровня. На виджеты в списке нет индивидуальных ссылок. Если вы хотите выполнить итерацию через список и выполнить действия, вовлекающие callbacks-функции, которые могли бы уничтожить виджеты, вы должны сначала вызвать g_list_foreach (result, (GFunc)g_object_ref, NULL), а затем убрать ссылки на все виджеты.
Далее перебирать весь список и проверять каждое окно функцией gtk_window_is_active ()
Цитата
Определяет, является ли окно частью текущего активного верхнего уровня. (Таким образом, окно верхнего уровня получает нажатие клавиши.) Значение TRUE возвращается, если активно непосредственно окно верхнего уровня, а так же если, скажем, GtkPlug встроен в активный верхний уровень. Вы можете использовать эту функцию, если хотите отрисовывать виджет по разному в активном и не активном окне. Смотрите gtk_window_has_toplevel_focus()
но тут я неуверн в том что правильно понял суть функций, и все же это мне кажеться плохое решение.
Подскажите что нибудь.