Gtk应用程序窗口是否具有鼠标移动的回调?

时间:2018-11-11 03:44:22

标签: gtk gtk3

我只是在玩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))

1 个答案:

答案 0 :(得分:0)

原来不是鼠标移动的回调问题。

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

要修复MCVE脚本,使其正常运行,只需在shebang行之后添加此行,告诉它仅将溢出和无效视为浮点错误,而不用零除:(sb-int:set -floating-point-modes:traps'(:overflow:invalid))