LINUX.ORG.RU

cl-gobject-introspection и динамические обработчики сигналов

 , , ,


0

2

Вот у меня есть окно и у программы с ней есть различные режимы. В разных режимах поведение окна кардинально разное. Думаю это можно устроить двумя способами: тупой - обработчик сигнала определяет какой режим и действует по ситуации, и более мне интересный - замена обработчика сигнала.

Насчёт последнего тут опять есть один очевидный вариант - вся эта динамика возлагается на имплементацию CL, т.е. намертво приколачиваем к сигналу лямбду, а та в свою очередь вызывает лямбду, которую лисп может менять в соответствии с режимом программы.

У меня же вопрос с более низкоуровневым переключением, на уровне инфраструктуры gtk. Что-то типа функции отключающей обработчики от сигнала, чтобы затем подключить другой соответствующий другому режиму. Я вот практически уверен, что ничего такого в cl-gobject-introspection нет. Остаётся вопрос - возможно ли это?

cast monk

★★★★★

Не очень понял чего именно ты хочешь, но вот такую мою пробу пера observable не рассмотришь?

dave ★★★★★ ()
Последнее исправление: dave (всего исправлений: 1)
Ответ на: комментарий от dave

Я вижу - это ещё одна система сигналов, реализованная на чистом CL.

Нет, извини, но у меня здесь вопрос по большей части к системе сигналов gtk.

ados ★★★★★ ()

Добавил. Теперь можно так:

(let ((id (gir:connect object signal-name handler)))
  ...
  ...
  (gir:disconnect object id)
  (gir:connect object signal-name another-handler))
monk ★★★★★ ()
Ответ на: комментарий от monk
; file: /home/redarch19/.local/share/quicklisp/local-projects/cl-gobject-introspection/src/signal.lisp
; in: CFFI:DEFCALLBACK G-SIGNAL-HANDLER-DISCONNECT
;     (CFFI:DEFCALLBACK GIR::G-SIGNAL-HANDLER-DISCONNECT
;         :VOID
;         (GIR::INSTANCE :POINTER)
;       (GIR::ID :ULONG))
; 
; caught ERROR:
;   (during macroexpansion of (CFFI:DEFCALLBACK G-SIGNAL-HANDLER-DISCONNECT
;       ...))
;   The value
;     INSTANCE
;   is not of type
;     LIST

ados ★★★★★ ()
Ответ на: комментарий от monk

Протестировал

В общем поменять defcallback на defcfun и всё работает. Спасибо.

ados ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.