Gtk 应用程序窗口是不是有鼠标移动回调?
Posted
技术标签:
【中文标题】Gtk 应用程序窗口是不是有鼠标移动回调?【英文标题】:Does a Gtk application window have a callback for mouse movement?Gtk 应用程序窗口是否有鼠标移动回调? 【发布时间】:2018-11-11 03:44:21 【问题描述】:我只是在玩 Gtk,决定是否应该花时间学习它。我有一个带有“激活”回调的应用程序窗口,它被调用。在该回调返回并且窗口出现在屏幕上之后,如果我移动鼠标,我会收到“除零”错误。我没有鼠标移动回调。如果这是问题,我应该添加一个。但是鼠标移动回调的名称是什么?我发现的唯一一个是“move-cursor”,它似乎是用于编辑光标,而不是鼠标光标。
我正在使用 /usr/lib/x86_64-linux-gnu/libgtk-3.so.0,因为它恰好在我的 Ubuntu PC 上。 libgtk-3.so.0 与 libgtk-3.so.0.2200.25 相同。
MCVE:
#!/usr/local/bin/sbcl --script
(define-alien-routine gtk_application_window_new (* t) (app (* t)))
(define-alien-routine gtk_application_new (* t) (txt c-string) (flags int))
(define-alien-routine g_application_run int
(app (* t)) (argc int) (argv (* t)))
(define-alien-routine g_signal_connect_data int;
(instance (* t)) (sig c-string)
(cback (function void (* t) int))
(data (* t)) (unusedptr (* t)) (unusedint int))
(define-alien-routine gtk_window_set_title void (win (* t)) (ttl (c-string)))
(define-alien-routine gtk_window_set_default_size void
(win (* t)) (x int) (y int))
(define-alien-routine gtk_widget_show_all void (win (* t)))
(sb-alien::define-alien-callback mycallback void ((app (* t)) (u int))
(with-alien ((win (* t)))
(setf win (gtk_application_window_new app))
(gtk_window_set_title win "This")
(gtk_window_set_default_size win 100 100)
(gtk_widget_show_all win)))
(load-shared-object "/usr/lib/x86_64-linux-gnu/libgtk-3.so.0")
(with-alien ((app (* t)) (status int))
(setf app (gtk_application_new nil 0))
(g_signal_connect_data app "activate" mycallback nil nil 0)
(g_application_run app 0 nil))
【问题讨论】:
给我们一个 MCVE 来观察。我们不知道您的代码是什么样的。 我应该先给它鼠标移动回调,然后从中制作 MCVE。我目前给它的唯一回调是“激活”回调。它调用它并显示窗口。然后当它获得鼠标移动时,它会因被零除错误而崩溃。 如果你不知道我所说的回调是什么意思,我指的是你作为参数提供给 g_signal_connect 的函数。我目前唯一的回调是“激活”回调,它被调用并返回。然后,窗口可见,等待输入,我移动鼠标,它崩溃了。这似乎意味着我需要一个鼠标移动回调。对吗? 请先给我们看一些代码。我们无法猜测为什么您会突然出现除以 0 的错误。一个简单的应用程序不会因为您没有将回调连接到信号而崩溃。 请同时添加pkg-config --modversion gtk+-3.0
的结果,这样我们就知道您使用的版本,因为so名称大多没用。
【参考方案1】:
鼠标移动的回调结果不是问题。
结果被零除错误的原因是 GTK 依赖于能够被零除。我所要做的就是告诉 SBCL 不要将除以零视为错误。涉及鼠标移动的唯一原因是当时发生了除以零。在大多数其他编程语言中不会发生这种情况的原因是它们不认为除以零是错误的。
要修复 MCVE 脚本,使其工作,只需在 shebang 行之后添加这一行,告诉它只考虑溢出和无效为浮点错误,而不是除以零:(sb-int:set -floating-point-modes :traps '(:overflow :invalid))
【讨论】:
以上是关于Gtk 应用程序窗口是不是有鼠标移动回调?的主要内容,如果未能解决你的问题,请参考以下文章