22 июня 2009 г.

Работа с треем.

О том, как создать иконку в трее я рассказал в статье Программа управления веб-сервером Apache. Часть 1. Теперь предлагаю решить другую немаловажную задачу - появление/скрытие окна программы при щелчке левой клавишей мыши по этой иконке.

Как я уже говорил, при нажатии на иконку издаётся сигнал 'activate'. Перехватив его, мы скроем окно методом hide(), при этом оно также исчезнет и с панели задач. При повторном нажатии вызовем метод show_all() для того, чтобы вновь показать окно со всем его содержимым. Для определения текущего состояние окна нам понадобится метод is_visible(), который возвращает TRUE, если окно находится на экране, и FALSE - если скрыто.

В коде это выглядит следующим образом:
<?php
 
$tray = new GtkStatusIcon;
$tray->set_from_stock(Gtk::STOCK_EXECUTE);
$tray->connect_simple('activate', 'window_hide');
 
$window = new GtkWindow;
$window->set_size_request(200, 100);
$window->connect_simple('destroy', array('Gtk', 'main_quit'));
$window->add(new GtkLabel('Привет, мир!'));
$window->show_all();
Gtk::main();
 
function window_hide()
{
global $window;
 
if ($window->is_visible())
$window->hide();
else
$window->show_all();
}
 
?>

11 комментариев:

Gene комментирует...
Этот комментарий был удален автором.
Gene комментирует...

Я также попробовал сделать set_from_file и взял свой файл - он был автоматически уменьшен до размеров других иконок в трее. Так что получается можно брать любую картинку, предпочтительно квадратную.

Интересно, а как управлять иконкой с надписью php в верхнем левом углу окна? И возможно ли это вообще?

Shecspi комментирует...

Да, картинку можно брать любую, но больше, чем 48x48, смысла нет, ибо качество будет плохое при масштабировании.

Имеете ввиду иконку окна? Я про работу с ней рассказал в статье Создание простого окна. Часть2.. Метод set_icon().

Gene комментирует...

Я обратил внимание на интересный момент - если до вызова hide() окно было свернуто (не закрыто другими окнами, а именно свернуто), то после вызова show_all() оно так и остается свернутым. А есть ли возможность его развернуть из свернутого состояния по щелчку на иконке в трее? Есть ли вообще такой метод? (Многие другие программы именно так и работают).

Gene комментирует...

Кроме того, ряд программ умеют прятаться в трей при сворачивании окна. Видимо, для окна происходит некоторое событие, по которому они вызывают метод подобный hide().

То есть, есть два вопроса - есть ли такие события в PHP-GTK (сворачивание и разворачивание окна) и есть ли методы, позволяющие выполнять это из программы?

Shecspi комментирует...

Да, такие методы есть, но на память я их уже не помню. Чуть позднее поищу и напишу ;)

Shecspi комментирует...

При минимизации окна издается сигнал window_state_event. Обработчик:
if ($event->new_window_state & GDK_WINDOW_STATE_ICONIFIED)
{
// Окно сворачивается в панель задач. Делаем hide().
}

Shecspi комментирует...

Для того, чтобы принудительно минимизировать окно, существует метод iconify(), а чтобы показать окно пользователю - present() (именно его нужно вызывать при разворачивании из трея).

Gene комментирует...

Большое спасибо за ответ!
Кстати, моя проверка показала, что $window->present(); нужно вызывать после $window->show_all(); - иначе не срабатывает. Видимо, в свернутом состоянии вызов present() игнорируется.

Gene комментирует...

Кстати, обратил внимание не в первый раз, что константы, которые начинаются на GDK_ не работают, потому что не определены (в нашем примере это GDK_WINDOW_STATE_ICONIFIED). А Gdk::WINDOW_STATE_ICONIFIED работает отлично.
Видимо, их перенесли в класс Gdk, сделав константами класса.

Shecspi комментирует...

Да, сори. Взял константу из Си, не из PHP)))