18 августа 2009 г.

"Независимые" горячие клавиши

В предыдущей статье я рассказал о том, как привязать горячие клавиши к пунктам меню. Но клавишные комбинации могут выступать и "независимо" от меню. При нажатии любой клавиши на клавиатуре издаётся сигнал 'key-press-event'. Причём, важной особенностью является то, что имеется возможность для различных виджетов установить различные комбинации клавиш. В данном примере я использовал только один виджет - окно GtkWindow.

$window->connect('key-press-event', 'on_key');

В функцию on_key() автоматически передаются два параметра: виджет и GdkEvent, содержащий информацию о нажатых клавишах. $event->keyval содержит модификатор нажатой клавиши (полный список модификаторов находится здесь), $event->state содержит маску дополнительно используемой клавиши (полный список). Следующее условие выполнится, если были нажаты Ctrl и q:
$keyval = $event->keyval;
$state = $event->state;
if ($state & Gdk::CONTROL_MASK && $keyval == Gdk::KEY_q)
{
echo "Ctrl + q\n";
}

При нажатии трёх клавиш, одна из которых Shift, в переменной $keyval будет содержаться заглавная буква, а не прописная:
elseif ($state & Gdk::CONTROL_MASK && $keyval == Gdk::KEY_A)
{
echo "Ctrl + Shift + A\n";
}


Полный код программы:

<?php
 
$window = new GtkWindow();
$window->set_position(Gtk::WIN_POS_CENTER);
$window->set_size_request(200, 100);
$window->connect_simple('destroy', array('Gtk', 'main_quit'));
 
$window->connect('key-press-event', 'on_key');
$window->show_all();
Gtk::main();
 
function on_key($widget, $event)
{
$keyval = $event->keyval;
$state = $event->state;
if ($state & Gdk::CONTROL_MASK && $keyval == Gdk::KEY_q)
{
echo "Ctrl + q\n";
}
elseif ($state & Gdk::MOD1_MASK && $keyval == Gdk::KEY_s)
{
echo "Alt + s\n";
}
elseif ($state & Gdk::SUPER_MASK && $keyval == Gdk::KEY_d)
{
echo "Super + d\n";
}
// Комбинация из трёх клавиш, одна из которых - Shift
elseif ($state & Gdk::CONTROL_MASK && $keyval == Gdk::KEY_A)
{
echo "Ctrl + Shift + A\n";
}
}

Комментариев нет: