GTK: Как точно узнать, когда мышь действительно покидает окно. (Решено (смотрим на элемент detail в структуре события))

Модератор: Модераторы разделов

nick87720z
Сообщения: 180
ОС: Gentoo / Calculate

GTK: Как точно узнать, когда мышь действительно покидает окно.

Сообщение nick87720z »

Окно - панель (вернее, док). Пробовал leave-notify-event для окна как GtkWidget, но этот сигнал выдается еще и при попытке взаимодействовать с его содержимым. Т.е., есть кнопка на панели. Щелкнул - панель решила, что мышь ее покинула (дальше по сценарию).
Пробовал frame-event из GtkWindow, но он ни в какую просто не выдается (видимо, особенность панели).
Вариант с motion-notify-event тоже нп рокатывает.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: GTK: Как точно узнать, когда мышь действительно покидает окно.

Сообщение eddy »

Пробовали gtk_window_get_focus, gtk_widget_has_focus?
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
nick87720z
Сообщения: 180
ОС: Gentoo / Calculate

Re: GTK: Как точно узнать, когда мышь действительно покидает окно.

Сообщение nick87720z »

eddy писал(а):
09.03.2011 16:15
Пробовали gtk_window_get_focus, gtk_widget_has_focus?

Не то, Фокус, насколько я понимаю, относится ко вводу с клавы. Еще раз - это не просто окно, а панель (тип окна - Dock). Мышь нужна для автоскрытия. Кстати, пробовал еще gtk_container_foreach() - для соединения одного и того же обработчика сигналов "enter" и "leave", чтобы каждый виджет в окне увеличивал общий счетчик использования, но и это не помогло. Сначала корневой виджет (окно) теряет указатель и счетчик обнуляется, делая эту затею безполезной. Тем более, только от одного клика по кнопке, добавленной в окно, оно теряет и получает мышь 2 - 3 раза.
Спасибо сказали:
nick87720z
Сообщения: 180
ОС: Gentoo / Calculate

Re: GTK: Как точно узнать, когда мышь действительно покидает окно.

Сообщение nick87720z »

Проблему с получением фокуса так и не решил, однако выход все равно есть.
Счетчик фокусов убрал, т.к. он только запутывает; оставил один флаг - visible.
Когда виджет получает или теряет мышь, он не делает то, что надо, сразу, а меняет флаг visible и ставит таймер, срабатывающий только один раз (у меня - 100 мс).
Функция, вызываемая таймером, делает то, что надо, ориентируясь на флаг visible. В моем случае, по счастью, последним событием было получение фокуса.
Тут получается, что чем меньше таймаут, тем больше вероятность появления данного глюка. При 1 мс он появляется на 100%. При 2 мс уже вроде успокаивается. Для надежности поставил 10 мс (по мне так и 100 мс хватило бы, но тут задержка уже заметна, я бы предпочел таки не замечать ее :)
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: GTK: Как точно узнать, когда мышь действительно покидает окно.

Сообщение eddy »

nick87720z писал(а):
09.03.2011 19:37
Не то, Фокус, насколько я понимаю, относится ко вводу с клавы.

Прошу прощения. У меня фокус всегда находится под курсором мыши, поэтому о том, что фокус клавиатуры может быть в другом окне, я не подумал :(
А если вам попробовать принудительно лишить окно фокуса клавиатуры перед тем, как его скрывать?
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
nick87720z
Сообщения: 180
ОС: Gentoo / Calculate

Re: GTK: Как точно узнать, когда мышь действительно покидает окно.

Сообщение nick87720z »

По моему, вы не совсем в теме ;)

Кстати, кажется нашлось настоящее решение - только что глянул в состав события GdkEventCrossing. Там должна быть дополнительная инфа, где именно произошло пересечение.

P.S. Так и есть, это event->detail
Спасибо сказали: