首页 > 解决方案 > Gtk 应用程序窗口是否有鼠标移动回调?

问题描述

我只是在玩 Gtk,决定是否应该花时间学习它。我有一个带有“激活”回调的应用程序窗口,它被调用。在该回调返回并且窗口出现在屏幕上之后,如果我移动鼠标,我会收到“除零”错误。我没有鼠标移动回调。如果这是问题,我应该添加一个。但是鼠标移动回调的名称是什么?我发现的唯一一个是“移动光标”,它似乎是用于编辑光标,而不是鼠标光标。

我正在使用 /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))

标签: gtkgtk3

解决方案


鼠标移动的回调结果不是问题。

被零除错误的原因原来是 GTK 依赖于能够被零除。我所要做的就是告诉 SBCL 不要将除以零视为错误。涉及鼠标移动的唯一原因是当时发生了除以零。在大多数其他编程语言中没有发生这种情况的原因是他们不认为除以零是错误的。

要修复 MCVE 脚本,使其工作,只需在 shebang 行之后添加这一行,告诉它只考虑溢出和无效为浮点错误,而不是除以零:(sb-int:set-floating-点模式:陷阱'(:溢出:无效))


推荐阅读