gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:12:27 25 4
gpt4 key购买 nike

我正在修改现有的 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 信号处理程序附加到窗口,如您最初预期的那样。

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

关于我可以为鼠标按钮设置全局 GTK 加速器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64957969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com