我可以为鼠标按钮设置全局 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 信号处理程序,直接在全局处理程序中处理按钮事件。