2009-10-21 4 views
0

Я создаю составной виджет и хотел бы, чтобы у него были свои собственные ускорители (горячие клавиши), доступные только тогда, когда они находятся в фокусе. Единственная идея, которой я до сих пор знаю, как это сделать, - это изменить группу ускорителей на верхнем уровне, когда мой виджет входит и выходит из фокуса. Кажется, должен быть лучший способ.Gtk для ускорителей виджета

ответ

0

Вот функция класса инициализации, которая является решением я искал

static void 
webview_class_init (WebviewClass *klass) 
{ 

    GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass); 

    GtkBindingSet *binding_set; 

    signals[ZOOM_IN] = g_signal_new_class_handler("zoom_in", 
        G_OBJECT_CLASS_TYPE (object_class), 
        G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, 
        G_CALLBACK (webview_zoom_in), 
        NULL, NULL, 
        g_cclosure_marshal_VOID__VOID, 
        G_TYPE_NONE, 1, 
        G_TYPE_BOOLEAN, TRUE); 

    binding_set = gtk_binding_set_by_class (klass); 

    gtk_binding_entry_add_signal (binding_set, GDK_plus, GDK_CONTROL_MASK, 
        "zoom_in", 1, 
        G_TYPE_BOOLEAN, TRUE); 

} 
0

Каждый класс виджетов предоставляет указатели на его обработчики как часть структуры класса виджетов. Вы можете их исправить во время выполнения, после вызова gtk_init(), но перед входом в основной цикл приложения.

Так, например, вы могли бы залатать ключ-отжимают обработчик GtkFoo так:

static gboolean (*oldFooKeyPress)(GtkWidget* _widget, GdkEventKey* _event); 
... 
GtkWidgetClass* fooClass = GTK_WIDGET_CLASS(g_type_class_ref(GTK_TYPE_FOO)); 
oldFooKeyPress = fooClass->key_press_event; 
fooClass->key_press_event = myFooKeyPress; 

Тогда вы могли бы написать myFooKeyPress() так:

static gboolean myFooKeyPress(GtkWidget* widget, GdkEventKey* event) 
{ 
    if (widget is one I am interested in && 
     event is a special accelerator for that widget) 
    { 
     do something special here 
     and maybe return 
    } 

    return oldFooKeyPress(widget, event); 
} 

Насколько я помню, когда вы делаете исправление выше, вызывая GTK_TYPE_FOO, инициализирует класс виджета Foo, если он еще не был инициализирован.

Смежные вопросы