【问题标题】:Can I set up a global GTK accelerator for mouse buttons?我可以为鼠标按钮设置全局 GTK 加速器吗?
【发布时间】:2021-03-05 13:14:10
【问题描述】:

我正在修改现有的 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

【问题讨论】:

    标签: c gtk gtk3


    【解决方案1】:

    您可以编写一个全局 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);
    }
    

    您可以在调用gtk_main 后立即使用gdk_event_handler_set 安装此处理程序:

    gdk_event_handler_set(&event_handler, NULL, NULL);
    

    使用此处理程序,涉及按钮 8 和 9 的事件将被传递到顶级窗口。然后,您可以按照最初的预期将button-press-event 信号处理程序附加到窗口。

    您甚至可以完全放弃窗口信号处理程序,直接在全局处理程序中处理按钮事件。

    【讨论】:

      猜你喜欢
      • 2013-01-09
      • 2011-06-30
      • 2014-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      相关资源
      最近更新 更多