Changeset 702


Ignore:
Timestamp:
Mar 22, 2004, 9:38:00 AM (21 years ago)
Author:
Gary Byers
Message:

Maintain event queue in per-frame thread.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ccl/hemlock/src/cocoa-hemlock.lisp

    r674 r702  
    77(in-package :hemlock-internals)
    88
    9 (defstruct command-interpreter-info
    10   (current-command (make-array 10 :fill-pointer 0 :adjustable t))
    11   (current-translation (make-array 10 :fill-pointer 0 :adjustable t))
    12   (last-command-type nil)
    13   (command-type-set nil)
    14   (prefix-argument nil)
    15   (prefix-argument-supplied nil)
    16   frame
    17   (event-mode-list nil)                 ; for extended modal
    18   )
     9(defstruct (frame-event-queue (:include ccl::locked-dll-header))
     10  (signal (ccl::make-semaphore)))
    1911
    20 (defvar *current-command-info* nil)
    21 
    22 (defun push-event-mode-function (f)
    23   (push f (command-interpreter-info-event-mode-list *current-command-info*))
    24   f)
    25 
    26 (defun exit-event-mode ()
    27   (setf (command-interpreter-info-event-mode-list *current-command-info*)
    28         (cdr (command-interpreter-info-event-mode-list *current-command-info*))))
    29 
    30 (defun current-event-mode ()
    31   (car (command-interpreter-info-event-mode-list *current-command-info*)))
    32 
    33 (defun add-one-shot-event-mode-function (f)
    34   (push-event-mode-function #'(lambda (key)
    35                                 (exit-event-mode)
    36                                 (funcall f key))))
     12(defstruct (buffer-operation (:include ccl::dll-node))
     13  (thunk nil))
    3714
    3815
     16(defun enqueue-key-event (q event)
     17  (ccl::locked-dll-header-enqueue event q)
     18  (ccl::signal-semaphore (frame-event-queue-signal q)))
     19
     20(defun dequeue-key-event (q)
     21  (ccl::wait-on-semaphore (frame-event-queue-signal q))
     22  (ccl::locked-dll-header-dequeue q))
     23
     24(defun unget-key-event (event q)
     25  (ccl::with-locked-dll-header (q)
     26    (ccl::insert-dll-node-after event q))
     27  (ccl::signal-semaphore (frame-event-queue-signal q)))
     28
     29
     30
     31
     32 
    3933
    4034(defun buffer-windows (buffer)
     
    6660
    6761(defvar *input-transcript* ())
     62
     63(defun get-key-event (q &optional ignore-pending-aborts)
     64  (declare (ignore ignore-pending-aborts))
     65  (do* ((e (dequeue-key-event q) (dequeue-key-event q)))
     66       ((typep e 'hemlock-ext:key-event)
     67        (setq *last-key-event-typed* e))
     68    (if (typep e 'buffer-operation)
     69      (funcall (buffer-operation-thunk e)))))
     70
     71(defun listen-editor-input (q)
     72  (ccl::with-locked-dll-header (q)
     73    (not (eq (ccl::dll-header-first q) q))))
Note: See TracChangeset for help on using the changeset viewer.