The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Каталог документации / Раздел "Программирование, языки" / Оглавление документа

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+ - определение поведения и стиля.





Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру