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

相關問題