LINUX.ORG.RU

GTK обработка «горячих клавиш»


0

0

С помощью glade я добавил "горячие клавиши" на форму... судя по коду он
 их добавил так:

  accel_group = gtk_accel_group_new ();

  main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_widget_add_accelerator (main_window, "activate_default", accel_group,
                              GDK_F, (GdkModifierType) GDK_CONTROL_MASK | GDK_MOD1_MASK,
                              GTK_ACCEL_VISIBLE);
  gtk_widget_add_accelerator (main_window, "activate_default", accel_group,
                              GDK_G, (GdkModifierType) GDK_CONTROL_MASK | GDK_MOD1_MASK,
                              GTK_ACCEL_VISIBLE);

подскажие а какой функциией их обработать, причем надо как то понять
 нажато Ctrl+Alt+F или Ctrl+Alt+G ?

anonymous

Никак не определить. Просто будет активирована кнопка в диалоге по умолчанию при нажатии обоих клавиш. Наверное, что-то другое необходимо было реализовать, так для этого надо как-то по-другому в glade клавиши задавать. Ускоритель обычно означает то, что при нажатии клавиши выполняется какое-то действие с существующим виджетом, например, кнопка нажимается, поле ввода получает фокус и т.д. К этому виджету и надо добавлять ускоритель, а не к main_window. Так что опиши, что нужно сделать, попробуем разобратся.

P.S. не рекомендуется код использовать, который glade сделал. Лучше libglade использовать.

welkam ★★
()
Ответ на: комментарий от welkam

Спасибо за ответ... да действительно я и подозревал что именно так... да так и происходит, четр возьми, когда я задал две горячих клавиши для окна, то при обработке on_main_window_can_activate_accel я получаю само сабытие а найти какие горячие клавиши не составляется возможным :(

Мне нужно "задать" для главного окна, грубо говоря, чтоб при нажатии на Ctrl+Alt+F вызывалась my_func1() a при нажатии на Ctrl+Alt+G вызывалась my_func2(), т.е. просто нажатие без всяких виджетов и элементов меню. Такое возможно реализовать в GTK?

anonymous
()
Ответ на: комментарий от welkam

Дело в том что сами по себе действия на клавишах очень плохо обнаруживаются пользователями. Поэтому действия, привязаные к клавишам и не привязанные не к чему другому не очень хорошая вещь. Например если Ctrl+Alt+F вычисляет значение в одном из полей, то хорошо бы эту же функцию продублировать или в меню (если это приложение) или дополнительной кнопкой (если это диалог). На эти элементы и нужно вешать accelerator

Просто функции по нажатию клавиш, конечно, тоже можно сделать, например, с помощью GtkUIManager или вручную дописав код для той же accel_group, тот же notify вызывать с указанием detail, но не в glade.

welkam ★★
()
Ответ на: комментарий от welkam

Хм интересные вещи рассказываешь...

При Ctrl+Alt+F обновление конфиг файла.. прога должна показать окошко в этоге где написано: "Конфиг обновлен успешно" или "Неверный конфиг"

При Ctrl+Alt+G долно показываться окно отладке, где будет выводиться отладочная информация

При этом нельзя дублировать эти функции в меню а нужно чтоб они работали в окне... типо кто знает эти функции тот молодец, кто не знает в меню их не видет :) Я думал для этого и существуют "горячие клавиши" ;) , да и если честно это требование заказчика :( против этого не попрешь!

Мы сможем это обойти не дописывая ничего в код? Прога кросплатформенная ради это функции не хотелось бы перекомпиливать GTK под Linux & win32

anonymous
()
Ответ на: комментарий от anonymous

Не понял про перекомпиляцию. Свой же код ты пишешь всё-таки. Так и добавь обработчик сигнала realize у window. В этом обработчике получай accel_group которая используется и добавляй в неё свои ускорители с помощью gtk_action_group_connect создавая свои closure, а уж они и будут вызывать функции что тебе надо. В glade это всё равно не получится.

welkam ★★
()
Ответ на: комментарий от anonymous

>При этом нельзя дублировать эти функции в меню а нужно чтоб они работали в окне... типо кто знает эти функции тот молодец, кто не знает в меню их не видет :) Я думал для этого и существуют "горячие клавиши" ;) , да и если честно это требование заказчика :( против этого не попрешь!

А ты виджет добавь и акселератор повесь, но show виджету не делай :)

petrosha ★★★★★
()
Ответ на: комментарий от petrosha

При активизации акселератора проверяется, mapped ли widget, так что не будет работать :)

welkam ★★
()
Ответ на: комментарий от welkam

> В этом обработчике получай accel_group которая используется и добавляй в неё свои ускорители с помощью gtk_action_group_connect создавая свои closure, а уж они и будут вызывать функции что тебе надо. В glade это всё равно не получится.

А можно чуть поподрочнее с примером кода?.. что то не совсем понятно... дело то новое :(

anonymous
()
Ответ на: комментарий от anonymous

Тока че то не понятно функция activate_key возвращает в числовом эквеваленте accel_key равным 102, а GDK_F = 70...

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.