我正在修改现有的GTK3应用程序,并希望全局处理“后退”和“前进”鼠标按钮(分别具有8和9的整数值)。
我尝试将信号处理程序附加到窗口:
g_signal_connect(window, "button-press-event", G_CALLBACK(onButtonPress), NULL);
假设光标下面的小部件也不处理按钮按下操作(例如,普通按钮的单击/按钮处理程序),则此方法有效,在这种情况下,事件不会传播到窗口,因为它是由小部件处理的。
关键事件首先在基础窗口小部件之前发送给加速器,这是我想要的行为,但是我使用的鼠标按钮似乎不被支持为加速器或助记符。
如何以这种方式为鼠标按钮设置窗口级处理程序?
这是GTK事件处理和传播的参考:https : //developer.gnome.org/gtk3/stable/chap-input-handling.html
您可以编写一个全局GDK事件处理程序,将这些按钮事件传递到顶级窗口:
#define BUTTON_FORWARD 8
#define BUTTON_BACK 9
static void redirect_button_events(GdkEvent *event) {
if (event->type != GDK_BUTTON_PRESS)
return;
GtkWidget *widget = gtk_get_event_widget(event);
if (widget == NULL)
return;
GtkWidget *window = gtk_widget_get_toplevel(widget);
if (window == NULL)
return;
switch (event->button.button) {
case BUTTON_FORWARD:
case BUTTON_BACK:
event->any.window = gtk_widget_get_window(window);
/* XXX: fix up mouse coordinates if needed */
break;
}
}
static void event_handler(GdkEvent *event, void *_) {
redirect_button_events(event);
gtk_main_do_event(event);
}
您可以gdk_event_handler_set
在调用后立即使用来安装此处理程序gtk_main
:
gdk_event_handler_set(&event_handler, NULL, NULL);
使用此处理程序,涉及按钮8和9的事件将传递到顶级窗口。然后,您可以button-press-event
按照最初的意图将信号处理程序附加到窗口。
您甚至可以完全省去窗口信号处理程序,而直接在全局处理程序中处理按钮事件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句