Сначала необходимо установить специальную группу для горячих клавиш - GtkAccelGroup. Хочу заметить, что комбинации клавиш из этой группы будут действовать по всей площади окна, независимо от активного в данный момент виджета.
$accel_group = new GtkAccelGroup();
$window->add_accel_group($accel_group);
Теперь необходимо к каждому пункту меню применить метод add_accelerator(). Первым параметром передаётся сигнал, издаваемый при нажатии соответствующей комбинации, вторым - GtkAccelGroup, третьим - модификатор горячей клавиши (полный список модификаторов находится здесь), четвёртым - вторая клавиша из комбинации. Ниже представлен список некоторых наиболее полезных модификаторов для четвёртого параметра (полный список находится здесь):
- Gdk::CONTROL_MASK - клавиша Ctrl
- Gdk::SHIFT_MASK - клавиша Shift
- Gdk::MOD1_MASK - клавиша Alt
- Gdk::SUPER_MASK - клавиша Super (в терминологии Linux) или Win (в терминологии Windows)
Пятым параметром указывается некий флаг. Я всегда использую значение 1.
$open->add_accelerator('activate', $accel_group, Gdk::KEY_O, Gdk::CONTROL_MASK, 1);
Полный код программы:
<?php
$window = new GtkWindow();
$window->set_position(Gtk::WIN_POS_CENTER);
$window->set_size_request(200, -1);
$window->connect_simple('destroy', array('Gtk', 'main_quit'));
$accel_group = new GtkAccelGroup();
$window->add_accel_group($accel_group);
$vbox = new GtkVBox();
$menubar = new GtkMenuBar();
$vbox->pack_start($menubar, FALSE, FALSE, 0);
$file = new GtkMenuItem('_Файл');
$menubar->append($file);
$sub_file = new GtkMenu();
$file->set_submenu($sub_file);
$open = new GtkMenuItem('_Открыть');
$open->add_accelerator('activate', $accel_group, Gdk::KEY_O, Gdk::CONTROL_MASK, 1);
$open->connect('activate', 'on_activate');
$sub_file->append($open);
$save = new GtkMenuItem('_Сохранить');
$save->add_accelerator('activate', $accel_group, Gdk::KEY_S, Gdk::CONTROL_MASK, 1);
$save->connect('activate', 'on_activate');
$sub_file->append($save);
$quit = new GtkMenuItem('_Выход');
$quit->add_accelerator('activate', $accel_group, Gdk::KEY_Q, Gdk::CONTROL_MASK, 1);
$quit->connect_simple('activate', array('Gtk', 'main_quit'));
$sub_file->append($quit);
function on_activate($menu)
{
echo $menu->child->get_label()."\n";
}
$window->add($vbox);
$window->show_all();
Gtk::main();
?>
Комментариев нет:
Отправить комментарий