Есть ли в окне приложения Gtk обратный вызов для перемещения мыши? - PullRequest
0 голосов
/ 11 ноября 2018

Я просто играю с Gtk, решая, стоит ли мне его изучать. У меня есть окно приложения с «активированным» обратным вызовом, который вызывается. После этого обратного вызова возвращается, и на экране появляется окно, если я перемещаю мышь, я получаю ошибку «деление на ноль». У меня нет обратного вызова движения мыши. Если это проблема, я должен добавить один. Но как называется обратный вызов движения мыши? Единственный, что я нашел, это "курсор перемещения", который, по-видимому, предназначен для курсора редактирования, а не курсора мыши.

Я использую /usr/lib/x86_64-linux-gnu/libgtk-3.so.0, потому что это то, что происходит на моем компьютере с Ubuntu. 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 голосов
/ 19 декабря 2018

Обратный вызов для движения мыши, как оказалось, не является проблемой.

Причиной ошибки деления на ноль оказалось то, что GTK полагается на возможность деления на ноль. Все, что мне нужно было сделать, чтобы это исправить, - это сказать SBCL, чтобы он не считал деление на ноль ошибкой. Единственная причина, по которой было задействовано движение мыши, заключалась в том, что деление на ноль происходит тогда. Причина, по которой этого не происходит в большинстве других языков программирования, заключается в том, что они не считают деление на ноль ошибкой.

Чтобы исправить сценарий MCVE, чтобы он работал, просто добавьте эту строку после строки shebang, чтобы сказать, что она должна рассматривать только переполнение и недопустимую как ошибки с плавающей запятой, а не деление на ноль: (sb-int: set -floating-point-mode: traps '(: переполнение: недопустимо))

...