我可以为鼠标按钮设置全局 GTK 加速器吗?
Can I set up a global GTK accelerator for mouse buttons?
我正在修改现有的 GTK3 应用程序,并希望全局处理“后退”和“前进”鼠标按钮(整数值分别为 8 和 9)。
我尝试将信号处理程序附加到 window:
g_signal_connect(window, "button-press-event", G_CALLBACK(onButtonPress), NULL);
假设光标下方的小部件也不处理按钮按下(例如,普通按钮的单击/按钮处理程序),这将起作用,在这种情况下,事件不会传播到 window 作为它由小部件处理。
键事件在底层小部件之前首先发送到加速器,这是我想要的行为,但我使用的鼠标按钮似乎不支持作为加速器或助记符。
如何以这种方式为鼠标按钮设置 window 级处理程序?
这里是 GTK 事件处理和传播的参考:https://developer.gnome.org/gtk3/stable/chap-input-handling.html
您可以编写一个全局 GDK 事件处理程序,将这些按钮事件传递到顶层 window:
#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);
}
您可以在调用 gtk_main
:
后立即使用 gdk_event_handler_set
安装此处理程序
gdk_event_handler_set(&event_handler, NULL, NULL);
使用此处理程序,涉及按钮 8 和 9 的事件将传递到顶层 window。然后,您可以将 button-press-event
信号处理程序附加到 window,如您最初预期的那样。
您甚至可以完全放弃 window 信号处理程序,直接在全局处理程序中处理按钮事件。
我正在修改现有的 GTK3 应用程序,并希望全局处理“后退”和“前进”鼠标按钮(整数值分别为 8 和 9)。
我尝试将信号处理程序附加到 window:
g_signal_connect(window, "button-press-event", G_CALLBACK(onButtonPress), NULL);
假设光标下方的小部件也不处理按钮按下(例如,普通按钮的单击/按钮处理程序),这将起作用,在这种情况下,事件不会传播到 window 作为它由小部件处理。
键事件在底层小部件之前首先发送到加速器,这是我想要的行为,但我使用的鼠标按钮似乎不支持作为加速器或助记符。
如何以这种方式为鼠标按钮设置 window 级处理程序?
这里是 GTK 事件处理和传播的参考:https://developer.gnome.org/gtk3/stable/chap-input-handling.html
您可以编写一个全局 GDK 事件处理程序,将这些按钮事件传递到顶层 window:
#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);
}
您可以在调用 gtk_main
:
gdk_event_handler_set
安装此处理程序
gdk_event_handler_set(&event_handler, NULL, NULL);
使用此处理程序,涉及按钮 8 和 9 的事件将传递到顶层 window。然后,您可以将 button-press-event
信号处理程序附加到 window,如您最初预期的那样。
您甚至可以完全放弃 window 信号处理程序,直接在全局处理程序中处理按钮事件。