Получение позиции gtk.StatusIcon в Windows

Я помогаю с поддержкой Windows для приложения PyGTK, которое отображается как апплет на панели задач, но я не так силен в липких вещах GTK+...

У нас это так, когда вы щелкаете левой кнопкой мыши по значку в системном трее, окно появляется прямо рядом со значком в трее, независимо от того, где находится ваш системный лоток — и в Linux это прекрасно работает, используя результаты gtk.StatusIcon.get_geometry() для расчета размера и положения.

Конечно, документы для gtk.StatusIcon.get_geometry() указывают, что «некоторые платформы не предоставляют эту информацию» — и это включает MS Windows, так как в результате я получаю NoneType.

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

Итак, есть ли удобный для Windows способ получить положение значка на панели задач, чтобы я мог разместить свое окно там?


Обратите внимание: я уже использую gtk_menu_popup() с gtk_status_icon_position_menu для всплывающего меню, которое работает правильно.

Но я пытаюсь позиционировать отдельное окно gtk.Window, которое не примет gtk_status_icon_position_menu (потому что это не меню).

Любые другие идеи будут оценены...


person ewall    schedule 07.08.2009    source источник


Ответы (3)


Gtk предоставляет функцию gtk_status_icon_position_menu, которую можно передать в gtk_menu_popup как GtkPositionFunc. Это, кажется, обеспечивает запрошенную функциональность.

person dmitry_vk    schedule 07.08.2009
comment
gtk_status_icon_position_menu кажется подходящим для всплывающего меню, но будет ли он работать для дочернего элемента gtk.Window? В настоящее время мы используем gtk.Windows.move(x,y) для ручного позиционирования после вычисления. Если я предполагаю, что большинство системных панелей Windoze находятся в правом нижнем углу экрана (я знаю, что это плохое предположение), установите гравитацию на юго-восток и отобразите там, тогда она будет отображаться под панелью задач. В идеале, если бы я мог определить, где на самом деле находится systray/gtk.StatusIcon в Windows, я мог бы расположить окно относительно этого места. Или, может быть, есть еще один лучший способ? - person ewall; 11.08.2009

Поведение, которое я испытал в окнах с gtk_status_icon_position_menu, заключалось в том, что оно порождает окно в том месте, где пользователь щелкнул значок состояния.

person Paulo Neves    schedule 09.12.2009

Я также ищу ответ на этот вопрос, но нашел то, что может помочь.

Мне кажется, что GTK выясняет, где вызвать PopupMenu из положения мыши. Каким-то образом выясняется, что кнопка мыши была нажата на значок состояния. Предположительно либо из-за событий мыши, отправленных оконной системой, либо из-за какого-то знания о том, где находится StatusIcon.

Я имею в виду, что GTK должен либо 1) знать фактическое местоположение StatusIcon, либо 2) получать события из оконной системы, когда мышь щелкает на StatusIcon. Так что он должен знать информацию.

У меня также есть всплывающее окно, которое я хочу поднять рядом с StatusIcon, и у меня также есть PopupMenu, который работает нормально. Итак, я попробовал это в pygtk:

x, y, push = gtk.status_icon_position_menu(popup_menu, status_icon)

Я прошел через PopupMenu, чтобы попытаться найти StatusIcon, хотя я не пытаюсь открыть всплывающее меню. Это действительно получает позицию рядом с StatusIcon, но странно то, что это работает только после того, как PopupMenu всплыло один раз.

В любом случае, это немного приблизило меня и может помочь вам или кому-то еще найти полное решение.

person jcoffland    schedule 16.07.2010