Lisp HUG Maillist Archive

Question about APPLY-IN-PANE-PROCRESS

Hi!

I recently needed a text input pane that can verify its input when the
focus leaves the pane.  Luckily, I found an implementation of such a
thing which was posted here a while ago by "lisptracker" - thanks.
The slightly modified code for my version is below.

This works fine.  However, I first tried with a simpler version which
didn't have a HAS-FOCUS-P slot and where the call to PROCESS-WAIT
looked like this:

  (mp:process-wait "Waiting for blur event"
                   #'(lambda ()
                       (not (capi:pane-has-focus-p pane))))

To my surprise this didn't work as expected.  Now I'm wondering why
the call to APPLY-IN-PANE-PROCESS makes a difference here.  According
to the Reference Manual it is required when the function "modifies
[the] pane or changes how it is displayed."  But this doesn't happen
here.

Any ideas?

Thanks,
Edi.



(defclass verified-text-input-pane (capi:text-input-pane)
  ((waitingp :initform nil
             :accessor waitingp)
   (has-focus-p :initform nil
                :accessor has-focus-p)
   (verify-callback :initform nil
                    :initarg :verify-callback
                    :accessor verify-callback)))

(defmethod initialize-instance :after ((pane verified-text-input-pane) &rest initargs)
  (declare (ignore initargs))
  (when-let (verify-callback (verify-callback pane))
    (let ((old-change-callback (capi:text-input-pane-change-callback pane)))
      (setf (capi:text-input-pane-change-callback pane)
            (lambda (&rest args)
              (unless (waitingp pane)
                (setf (waitingp pane) t
                      (has-focus-p pane) t)
                (mp:process-run-function "Guard for VERIFIED-TEXT-INPUT-PANE"
                                         '(:priority 0)
                                         (lambda ()
                                           (mp:process-wait "Waiting for blur event"
                                                            #'(lambda ()
                                                                (capi:apply-in-pane-process
                                                                 pane
                                                                 (lambda ()
                                                                   (setf (has-focus-p pane)
                                                                         (capi:pane-has-focus-p pane))))
                                                                (not (has-focus-p pane))))
                                           (funcall verify-callback pane)
                                           (setf (waitingp pane) nil))))
              (when old-change-callback
                (apply old-change-callback args)))))))


Re: Question about APPLY-IN-PANE-PROCRESS

Hello Edi,

| Hi!
|
| I recently needed a text input pane that can verify its input when the
| focus leaves the pane.  Luckily, I found an implementation of such a
| thing which was posted here a while ago by "lisptracker" - thanks.
| The slightly modified code for my version is below.
|
| This works fine.  However, I first tried with a simpler version which
| didn't have a HAS-FOCUS-P slot and where the call to PROCESS-WAIT
| looked like this:
|
|   (mp:process-wait "Waiting for blur event"
|                    #'(lambda ()
|                        (not (capi:pane-has-focus-p pane))))
|
| To my surprise this didn't work as expected.  Now I'm wondering why
| the call to APPLY-IN-PANE-PROCESS makes a difference here.  According
| to the Reference Manual it is required when the function "modifies
| [the] pane or changes how it is displayed."  But this doesn't happen
| here.
|
| Any ideas?
|...snip...|

IIRC, some previous postings have mentioned that APPLY-IN-PANE-PROCESS is
desirable for reading as well. Though this results in rather an awkward
code, the sad answer is "Focus should be checked within the interface
process" :-(
--
Sincerely,
Dmitriy Ivanov
lisp.ystok.ru


Updated at: 2020-12-10 08:50 UTC