2009-10-21 35 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窗口小部件类,如果它尚未初始化。

相关问题