我构建了一个复合小部件,并希望它只有在焦点时才能使用它自己的加速器(热键)。到目前为止,我唯一知道如何实现这一点的想法是在我的小部件进入和失焦时更换顶级的加速器组。似乎应该有更好的方法。
答案 0 :(得分: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小部件类。
答案 1 :(得分:0)
看起来我需要使用键绑定而不是加速器
http://library.gnome.org/devel/gtk/unstable/gtk-Bindings.html
GtkTextView的交叉引用显示了如何 http://www.koders.com/c/fid959C3555A3004EA74AD6E0276122FC19673F9912.aspx?s=sort
答案 2 :(得分: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);
}
答案 3 :(得分:0)
请参见this,以仅针对有重点的窗口小部件实现加速器
步骤:
GSimpleActionGroup
,然后gtk_widget_insert_action_group
到您的特定窗口小部件。 gtk_application_set_accels_for_action()
为该特定操作(名称)设置快捷方式。