Bindings

Bindings — Привязки клавиш для индивидуальных виджетов

Краткое описание

#include <gtk/gtk.h> GtkBindingSet; GtkBindingEntry; GtkBindingSignal; GtkBindingArg; GtkBindingSet* gtk_binding_set_new (const gchar *set_name); GtkBindingSet* gtk_binding_set_by_class (gpointer object_class); GtkBindingSet* gtk_binding_set_find (const gchar *set_name); gboolean gtk_bindings_activate (GtkObject *object, guint keyval, GdkModifierType modifiers); gboolean gtk_bindings_activate_event (GtkObject *object, GdkEventKey *event); gboolean gtk_binding_set_activate (GtkBindingSet *binding_set, guint keyval, GdkModifierType modifiers, GtkObject *object); void gtk_binding_entry_add_signal (GtkBindingSet *binding_set, guint keyval, GdkModifierType modifiers, const gchar *signal_name, guint n_args, ...); void gtk_binding_entry_skip (GtkBindingSet *binding_set, guint keyval, GdkModifierType modifiers); void gtk_binding_entry_remove (GtkBindingSet *binding_set, guint keyval, GdkModifierType modifiers); void gtk_binding_set_add_path (GtkBindingSet *binding_set, GtkPathType path_type, const gchar *path_pattern, GtkPathPriorityType priority);

Описание

GtkBinding обеспечивает механизм для конфигурации привязок клавиш Gtk+ через RC файлы. Это облегчает настройку привязок клавиш для программистов и пользователей, а также обеспечивает пользователей Gtk+ или администраторов большей возможностью конфигурировать привязки клавиш не требуя изменений со стороны приложения или инструментария.

Установка привязок клавиш

Ресурсные файлы привязок содержат описания 'привязок' ('binding') и соответсвующие спецификации для применения привязок к специфическим типам виджетов. Детально механизм соответсвий описан в Pathnames and patterns. Внутри описания привязок, клавишные комбинации связаны со специальными эмиссиями сигнала на целевом виджете. Комбинации клавиш являются строками содержащими опционально название GdkModifierType и имена клавиш например которые определены в <gdk/gdkkeysyms.h> или возвращаются из gdk_keyval_name(), они должны подходить для анализа с помощью gtk_accelerator_parse(). Спецификации эмисcий сигнала содержат строки идентифицирующие имя сигнала и список определённых параметров сигнала в круглых скобках. Например для привязки управления и клавиш левой или правой стрелки к курсору виджета GtkEntry c сигналом GtkEntry::move-cursor перемещения курсора, чтобы перемещение происходило в 3 символьных шага, может использоваться следующие привязки:

binding "MoveCursor3" { bind "<Control>Right" { "move-cursor" (visual-positions, 3, 0) } bind "<Control>Left" { "move-cursor" (visual-positions, -3, 0) } } class "GtkEntry" binding "MoveCursor3"

Отмена существующих привязок клавиш

Gtk+ уже определяет множество полезных привязок для виджетов. Поскольку выборочные привязки установленные в RC файлах имеют приоритет перед привязками по умолчанию установленными в Gtk+, перезапись существующих привязок также демонстрируется в Установка привязок клавиш. Этот же механизм однако, не может использоваться для отмены "unbind" существующих привязок.

binding "MoveCursor3" { bind "<Control>Right" { } bind "<Control>Left" { } } class "GtkEntry" binding "MoveCursor3"

Выше приведённый пример не имеет желаемого эфекта игнорирования нажатия "<Control>Right" and "<Control>Left" клавиш. Вместо этого, просто удаляется существующие любые привязки "MoveCursor3", поэтому когда нажимаются клавиши "<Control>Right" или "<Control>Left", никаких привязок для этих клавиш не обнаруживается в установках "MoveCursor3". Gtk+ таким образом продолжит поиск и в конечном счете обнаружит привязки по умолчанию для ввода которые осуществляют перемещения по словам. Для сохранения активными привязок по умолчанию Gtk+, может использоваться ключевое слово "unbind":

binding "MoveCursor3" { unbind "<Control>Right" unbind "<Control>Left" } class "GtkEntry" binding "MoveCursor3"

Теперь, Gtk+ не будет искать соответсвие нажатию "<Control>Right" and "<Control>Left" в привязках по умолчанию так как ("unbind") инструктирует прервать поиск, поэтому нажатие клавиш не обрабатывается этим виджетом. Дальнейшая обработка нажатия клавиш, например родительским виджетом, всё ещё возможна.

Детали

GtkBindingSet

typedef struct { gchar *set_name; gint priority; GSList *widget_path_pspecs; GSList *widget_class_pspecs; GSList *class_branch_pspecs; GtkBindingEntry *entries; GtkBindingEntry *current; guint parsed : 1; /* From RC content */ } GtkBindingSet;

Установка привязок сопровождается списком активируемых привязок клавиш. Единственая установленная привязка может соответствовать множеству типов виджетов. Подобно стилям, виджеты могут быть отображены путём имени виджета, путём класса виджета или типами класса виджета. Когда активируется установленная привязка, в целевом виджете издаётся сигнал действия для выполнения фактической активации.

gchar *set_name; уникальное имя набора привязок
gint priority; не используется
GSList *widget_path_pspecs; путь соответствующего виджета к которому применяется набор привязок
GSList *widget_class_pspecs; путь класса соответствующего виджета к которому применяется набор привязок
GSList *class_branch_pspecs; класс соответствующего виджета к которому применяется набор привязок
GtkBindingEntry *entries; привязка клавиш ввода в данном наборе привязок
GtkBindingEntry *current; детали реализации
guint parsed : 1; основан ли набор привязок на RC файле и изменяется ли при изменении темы

GtkBindingEntry

typedef struct { /* клавишная часть */ guint keyval; GdkModifierType modifiers; GtkBindingSet *binding_set; guint destroyed : 1; guint in_emission : 1; guint marks_unbound : 1; GtkBindingEntry *set_next; GtkBindingEntry *hash_next; GtkBindingSignal *signals; } GtkBindingEntry;

Каждый элемент списка наборов привязок представляется с помощью GtkBindingEntry.

guint keyval; значение соответствующей клавиши
GdkModifierType modifiers; модификатор соответствующей клавиши
GtkBindingSet *binding_set; набор привязок к которому принадлежит этот ввод
guint destroyed : 1; детали реализации
guint in_emission : 1; детали реализации
guint marks_unbound : 1;
GtkBindingEntry *set_next; связанный список вводов сопровождаемый набором привязок
GtkBindingEntry *hash_next; детали реализации
GtkBindingSignal *signals; сигнал действия этого ввода

GtkBindingSignal

typedef struct { GtkBindingSignal *next; gchar *signal_name; guint n_args; GtkBindingArg *args; } GtkBindingSignal;

GtkBindingSignal хранит необходимую информацию для активации виджета в ответ на нажатие клавиши через эмиссию сигнала.

GtkBindingSignal *next; детали реализации
gchar *signal_name; издаваемый сигнал действия
guint n_args; количество аргументов определённых для сигнала
GtkBindingArg *args; аргументы определённые для сигнала

GtkBindingArg

typedef struct { GType arg_type; union { glong long_data; gdouble double_data; gchar *string_data; } d; } GtkBindingArg;

GtkBindingArg содержит данные связанные с аргументами для привязки клавиш эмиссии сигнала которые храняться в GtkBindingSignal.

GType arg_type; детали реализации

gtk_binding_set_new ()

GtkBindingSet* gtk_binding_set_new (const gchar *set_name);

Gtk+ поддерживает общий список наборов привязок. Каждый набор привязок имеет уникальное имя которое необходимо определить после создания.

set_name : уникальное имя набора привязок
Возвращает : новый набор привязок

gtk_binding_set_by_class ()

GtkBindingSet* gtk_binding_set_by_class (gpointer object_class);

Эта функция возвращает набор привязок названный в честь имени типа помещённого в структуру класса. Новые наборы привязок создаются вызовом этой функции.

object_class : допустимый GtkObject класс
Возвращает : набор привязок соответствующий object_class

gtk_binding_set_find ()

GtkBindingSet* gtk_binding_set_find (const gchar *set_name);

Находит набор привязок по общему уникальному имени. Параметр set_name может быть либо именем используемым для gtk_binding_set_new(), либо именем типа класса используемого в gtk_binding_set_by_class().

set_name : уникальное имя набора привязок
Возвращает : NULL или определённый набор привязок

gtk_bindings_activate ()

gboolean gtk_bindings_activate (GtkObject *object, guint keyval, GdkModifierType modifiers);

Находит привязку клавиш соответствующую keyval и modifiers и активизирующую object.

object : объект для активации при обнаружении привязки
keyval : значение клавиши привязки
modifiers : клавиша модификатор привязки
Возвращает : TRUE если привязка найдена и активизирована

gtk_bindings_activate_event ()

gboolean gtk_bindings_activate_event (GtkObject *object, GdkEventKey *event);

Ищет привязку клавиш для объекта object находя любое соответсвие event, и если находит активирует его.

object : GtkObject (в основном должен быть виджетом)
event : GdkEventKey
Возвращает : TRUE если соответствующая привязка клавиш найдена

gtk_binding_set_activate ()

gboolean gtk_binding_set_activate (GtkBindingSet *binding_set, guint keyval, GdkModifierType modifiers, GtkObject *object);

Ищет привязку клавиш соответствующую keyval и modifiers внутри binding_set и активирует привязку на object.

binding_set : binding_set для активации
keyval : значение клавиши привязки
modifiers : клавиша модификатор привязки
object : объект для активации при обнаружении привязки
Возвращает : TRUE если привязка была найдена и активирована

gtk_binding_entry_add_signal ()

void gtk_binding_entry_add_signal (GtkBindingSet *binding_set, guint keyval, GdkModifierType modifiers, const gchar *signal_name, guint n_args, ...);

Переписывает или устанавливает новую привязку клавиш для keyval с modifiers в binding_set. Когда привязка активирована, signal_name издаётся на целевом виджете, n_args Varargs используются как аргументы.

binding_set : binding_set для устанавливаемого ввода
keyval : значение клавиши или привязка для установки
modifiers : клавиша модификатор или привязка для установки
signal_name : сигнал для выполнения активации
n_args : количество аргументов для signal_name @: аргументы для signal_name
... :

gtk_binding_entry_skip ()

void gtk_binding_entry_skip (GtkBindingSet *binding_set, guint keyval, GdkModifierType modifiers);

binding_set : binding_set для пропуска ввода
keyval : значение клавиши привязки для пропуска
modifiers : клавиша модификатор или привязка для пропуска

Начиная с версии 2.12 Устанавливает привязку в @binding_set который заставляет прерывать найденые клавиши, препятствуя активации привязок с более низким приоритетом.


gtk_binding_entry_remove ()

void gtk_binding_entry_remove (GtkBindingSet *binding_set, guint keyval, GdkModifierType modifiers);

Удаляет предварительно установленные привязки с помощью gtk_binding_entry_add_signal() в binding_set.

binding_set : binding_set для удаления ввода
keyval : значение клавиши привязки для удаления
modifiers : клавиша модификатор привязки для удаления

gtk_binding_set_add_path ()

void gtk_binding_set_add_path (GtkBindingSet *binding_set, GtkPathType path_type, const gchar *path_pattern, GtkPathPriorityType priority);

Эта функция используется внутренне механизмом анализа GtkRC для связи соответствующих шаблонов с GtkBindingSet структурами.

binding_set : набор привязок для добавления в путь
path_type : тип пути приеняемого шаблона
path_pattern : фактический шаблон соответствия
priority : приоритет привязки

Смотрите также

Keyboard Accelerators -

установка и использование горячих клавиш (short-cuts).

Resource Files -

Ресурсные файлы Gtk+ - определение поведения и стиля.