我可以为鼠标按钮设置全局GTK加速器吗?

第843章

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我可以添加加速器以在Angular Material Datepicker字段中输入日期吗?

来自分类Dev

可以改变巨型加速器的高度吗?

来自分类Dev

我可以为Angular Material启用硬件加速吗?

来自分类Dev

我可以为提交按钮设置两个值吗?

来自分类Dev

我们可以为一个zend \ form设置多个水化器吗?

来自分类Dev

我可以为Android任务切换器设置其他图标吗?

来自分类Dev

我可以为服务器的每个以太网端口设置相同的IP地址吗?

来自分类Dev

我们可以为不同的CPU设置不同的p状态调节器吗?

来自分类Dev

Javafx + FXML +加速器-平台独立吗?

来自分类Dev

我可以为联合的C ++函数设置默认参数吗

来自分类Dev

我可以为tmux窗口设置默认标题吗?

来自分类Dev

我可以为Expect()设置基本网址吗?

来自分类Dev

我可以为确定的表设置条件吗?

来自分类Dev

我可以在JMeter中设置加速周期0吗?

来自分类Dev

我可以为Android手表侧面的物理硬件按钮安装一个监听器吗?

来自分类Dev

Python - 我可以为此使用装饰器吗?

来自分类Dev

PHP崩溃的加速器

来自分类Dev

Python GTK3工具栏加速器不起作用

来自分类Dev

Python GTK3工具栏加速器不起作用

来自分类Dev

HTTPS是否在AWS的负载均衡器或全局加速器处终止?

来自分类Dev

我可以为那些知道互斥锁密码的进程全局创建Windows互斥锁吗?

来自分类Dev

是否可以为所有控制器全局设置[Authorize]属性?

来自分类Dev

我可以全局设置要使用的接口实现吗?

来自分类Dev

我可以在Redis中设置全局TTL吗?

来自分类Dev

我可以通过方法设置全局值吗?

来自分类Dev

pyplot:我可以设置全局标记大小参数吗?

来自分类Dev

我可以为我的应用程序重置模拟器的联系人和位置权限设置,以模拟首次使用情况吗?

来自分类Dev

我可以为我不拥有的网站设置CSS规则吗?

来自分类Dev

可以为设计文档设置updateInterval吗?

Related 相关文章

  1. 1

    我可以添加加速器以在Angular Material Datepicker字段中输入日期吗?

  2. 2

    可以改变巨型加速器的高度吗?

  3. 3

    我可以为Angular Material启用硬件加速吗?

  4. 4

    我可以为提交按钮设置两个值吗?

  5. 5

    我们可以为一个zend \ form设置多个水化器吗?

  6. 6

    我可以为Android任务切换器设置其他图标吗?

  7. 7

    我可以为服务器的每个以太网端口设置相同的IP地址吗?

  8. 8

    我们可以为不同的CPU设置不同的p状态调节器吗?

  9. 9

    Javafx + FXML +加速器-平台独立吗?

  10. 10

    我可以为联合的C ++函数设置默认参数吗

  11. 11

    我可以为tmux窗口设置默认标题吗?

  12. 12

    我可以为Expect()设置基本网址吗?

  13. 13

    我可以为确定的表设置条件吗?

  14. 14

    我可以在JMeter中设置加速周期0吗?

  15. 15

    我可以为Android手表侧面的物理硬件按钮安装一个监听器吗?

  16. 16

    Python - 我可以为此使用装饰器吗?

  17. 17

    PHP崩溃的加速器

  18. 18

    Python GTK3工具栏加速器不起作用

  19. 19

    Python GTK3工具栏加速器不起作用

  20. 20

    HTTPS是否在AWS的负载均衡器或全局加速器处终止?

  21. 21

    我可以为那些知道互斥锁密码的进程全局创建Windows互斥锁吗?

  22. 22

    是否可以为所有控制器全局设置[Authorize]属性?

  23. 23

    我可以全局设置要使用的接口实现吗?

  24. 24

    我可以在Redis中设置全局TTL吗?

  25. 25

    我可以通过方法设置全局值吗?

  26. 26

    pyplot:我可以设置全局标记大小参数吗?

  27. 27

    我可以为我的应用程序重置模拟器的联系人和位置权限设置,以模拟首次使用情况吗?

  28. 28

    我可以为我不拥有的网站设置CSS规则吗?

  29. 29

    可以为设计文档设置updateInterval吗?

热门标签

归档