.
original commit: c4a9010d1705aa5d24e0e7f7958e8aac09f0a165
This commit is contained in:
parent
e72c8fb672
commit
ff3b3f0d3f
|
@ -78,6 +78,7 @@
|
||||||
|
|
||||||
;; If the tree is completed
|
;; If the tree is completed
|
||||||
(define up-to-date? #t)
|
(define up-to-date? #t)
|
||||||
|
(define/public (get-up-to-date?) up-to-date?)
|
||||||
|
|
||||||
;; The tree of tokens that have been invalidated by an edit
|
;; The tree of tokens that have been invalidated by an edit
|
||||||
;; but might still be valid.
|
;; but might still be valid.
|
||||||
|
@ -110,6 +111,8 @@
|
||||||
(set! end-pos end)
|
(set! end-pos end)
|
||||||
(reset-tokens))
|
(reset-tokens))
|
||||||
|
|
||||||
|
(define/public (get-region) (values start-pos end-pos))
|
||||||
|
|
||||||
;; Modify the end of the region.
|
;; Modify the end of the region.
|
||||||
(define/public (update-region-end end)
|
(define/public (update-region-end end)
|
||||||
(set! end-pos end))
|
(set! end-pos end))
|
||||||
|
@ -394,8 +397,7 @@
|
||||||
|
|
||||||
;; ----------------------- Match parentheses ----------------------------
|
;; ----------------------- Match parentheses ----------------------------
|
||||||
|
|
||||||
(define clear-old-locations 'dummy)
|
(define clear-old-locations void)
|
||||||
(set! clear-old-locations void)
|
|
||||||
|
|
||||||
(define mismatch-color (make-object color% "PINK"))
|
(define mismatch-color (make-object color% "PINK"))
|
||||||
(define/private (get-match-color) (preferences:get 'framework:paren-match-color))
|
(define/private (get-match-color) (preferences:get 'framework:paren-match-color))
|
||||||
|
@ -704,9 +706,6 @@
|
||||||
(super on-enable-surrogate text)
|
(super on-enable-surrogate text)
|
||||||
(send text start-colorer token-sym->style get-token matches))
|
(send text start-colorer token-sym->style get-token matches))
|
||||||
|
|
||||||
(super-instantiate ())))
|
(super-new)))
|
||||||
|
|
||||||
(define text-mode% (text-mode-mixin mode:surrogate-text%))))
|
(define text-mode% (text-mode-mixin mode:surrogate-text%)))))
|
||||||
|
|
||||||
|
|
||||||
)
|
|
||||||
|
|
|
@ -592,14 +592,11 @@
|
||||||
|
|
||||||
(define (tabify-all) (tabify-selection 0 (last-position)))
|
(define (tabify-all) (tabify-selection 0 (last-position)))
|
||||||
(define (insert-return)
|
(define (insert-return)
|
||||||
(printf "insert-return ~s\n" (tabify-on-return?))
|
|
||||||
(if (tabify-on-return?)
|
(if (tabify-on-return?)
|
||||||
(begin
|
(begin
|
||||||
(begin-edit-sequence)
|
(begin-edit-sequence)
|
||||||
(insert #\newline)
|
(insert #\newline)
|
||||||
(printf "calling tabify\n")
|
|
||||||
(tabify (get-start-position))
|
(tabify (get-start-position))
|
||||||
(printf "called tabify\n")
|
|
||||||
(set-position
|
(set-position
|
||||||
(let loop ([new-pos (get-start-position)])
|
(let loop ([new-pos (get-start-position)])
|
||||||
(if (let ([next (get-character new-pos)])
|
(if (let ([next (get-character new-pos)])
|
||||||
|
|
|
@ -839,6 +839,9 @@ WARNING: printf is rebound in the body of the unit to always
|
||||||
(define-struct peeker (bytes skip-count pe resp-chan nack) (make-inspector))
|
(define-struct peeker (bytes skip-count pe resp-chan nack) (make-inspector))
|
||||||
(define-struct committer (kr commit-peeker-evt done-evt resp-chan resp-nack))
|
(define-struct committer (kr commit-peeker-evt done-evt resp-chan resp-nack))
|
||||||
|
|
||||||
|
(define msec-timeout 500)
|
||||||
|
(define output-buffer-full 4096)
|
||||||
|
|
||||||
(define ports-mixin
|
(define ports-mixin
|
||||||
(mixin ((class->interface text%) #;scheme:text<%>) (ports<%>)
|
(mixin ((class->interface text%) #;scheme:text<%>) (ports<%>)
|
||||||
(inherit begin-edit-sequence
|
(inherit begin-edit-sequence
|
||||||
|
@ -954,6 +957,7 @@ WARNING: printf is rebound in the body of the unit to always
|
||||||
[(and (insertion-point . <= . start)
|
[(and (insertion-point . <= . start)
|
||||||
(= start end)
|
(= start end)
|
||||||
(submit-to-port? key))
|
(submit-to-port? key))
|
||||||
|
(insert "\n")
|
||||||
(let ([snips/chars (extract-snips/chars unread-start-point (last-position))])
|
(let ([snips/chars (extract-snips/chars unread-start-point (last-position))])
|
||||||
(for-each (lambda (s/c)
|
(for-each (lambda (s/c)
|
||||||
(cond
|
(cond
|
||||||
|
@ -963,9 +967,7 @@ WARNING: printf is rebound in the body of the unit to always
|
||||||
(for-each (lambda (b) (channel-put read-chan b))
|
(for-each (lambda (b) (channel-put read-chan b))
|
||||||
(bytes->list (string->bytes/utf-8 (string s/c))))]))
|
(bytes->list (string->bytes/utf-8 (string s/c))))]))
|
||||||
snips/chars)
|
snips/chars)
|
||||||
(channel-put read-chan (bytes-ref #"\n" 0))
|
|
||||||
(set! allow-tabify? #f)
|
(set! allow-tabify? #f)
|
||||||
(super on-local-char key)
|
|
||||||
(set! allow-tabify? #t)
|
(set! allow-tabify? #t)
|
||||||
(set! unread-start-point (last-position))
|
(set! unread-start-point (last-position))
|
||||||
(set! insertion-point (last-position))
|
(set! insertion-point (last-position))
|
||||||
|
@ -1042,35 +1044,47 @@ WARNING: printf is rebound in the body of the unit to always
|
||||||
(end-edit-sequence)))
|
(end-edit-sequence)))
|
||||||
|
|
||||||
(define output-buffer-thread
|
(define output-buffer-thread
|
||||||
(let ([buffer-full 40]
|
(let ([converter (bytes-open-converter "UTF-8-permissive" "UTF-8")])
|
||||||
[converter (bytes-open-converter "UTF-8-permissive" "UTF-8")])
|
|
||||||
(thread
|
(thread
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(let loop (;; text-to-insert : (queue (cons (union snip bytes) style))
|
(let loop (;; text-to-insert : (queue (cons (union snip bytes) style))
|
||||||
[text-to-insert (empty-queue)])
|
[text-to-insert (empty-queue)]
|
||||||
|
[last-flush (current-inexact-milliseconds)])
|
||||||
(sync
|
(sync
|
||||||
|
|
||||||
|
(if (queue-empty? text-to-insert)
|
||||||
|
never-evt
|
||||||
|
(handle-evt
|
||||||
|
(alarm-evt (+ last-flush msec-timeout))
|
||||||
|
(lambda (_)
|
||||||
|
(let-values ([(viable-bytes remaining-queue) (split-queue converter text-to-insert)])
|
||||||
|
(queue-insertion viable-bytes always-evt)
|
||||||
|
(loop remaining-queue (current-inexact-milliseconds))))))
|
||||||
|
|
||||||
(handle-evt
|
(handle-evt
|
||||||
flush-chan
|
flush-chan
|
||||||
(lambda (return-evt)
|
(lambda (return-evt)
|
||||||
(let-values ([(viable-bytes remaining-queue) (split-queue converter text-to-insert)])
|
(let-values ([(viable-bytes remaining-queue) (split-queue converter text-to-insert)])
|
||||||
(queue-insertion viable-bytes return-evt)
|
(queue-insertion viable-bytes return-evt)
|
||||||
(loop remaining-queue))))
|
(loop remaining-queue (current-inexact-milliseconds)))))
|
||||||
(handle-evt
|
(handle-evt
|
||||||
clear-output-chan
|
clear-output-chan
|
||||||
(lambda (_)
|
(lambda (_)
|
||||||
(loop (empty-queue))))
|
(loop (empty-queue) (current-inexact-milliseconds))))
|
||||||
(handle-evt
|
(handle-evt
|
||||||
write-chan
|
write-chan
|
||||||
(lambda (pr)
|
(lambda (pr)
|
||||||
(cond
|
(let ([new-text-to-insert (enqueue pr text-to-insert)])
|
||||||
[((queue-size text-to-insert) . < . buffer-full)
|
(cond
|
||||||
(loop (enqueue pr text-to-insert))]
|
[((queue-size text-to-insert) . < . output-buffer-full)
|
||||||
[else
|
(loop new-text-to-insert last-flush)]
|
||||||
(let ([chan (make-channel)])
|
[else
|
||||||
(let-values ([(viable-bytes remaining-queue) (split-queue converter text-to-insert)])
|
(let ([chan (make-channel)])
|
||||||
(queue-insertion viable-bytes (channel-put-evt chan (void)))
|
(let-values ([(viable-bytes remaining-queue)
|
||||||
(channel-get chan)
|
(split-queue converter new-text-to-insert)])
|
||||||
(loop remaining-queue)))])))))))))
|
(queue-insertion viable-bytes (channel-put-evt chan (void)))
|
||||||
|
(channel-get chan)
|
||||||
|
(loop remaining-queue (current-inexact-milliseconds))))]))))))))))
|
||||||
|
|
||||||
(field [in-port #f]
|
(field [in-port #f]
|
||||||
[out-port #f]
|
[out-port #f]
|
||||||
|
@ -1124,7 +1138,7 @@ WARNING: printf is rebound in the body of the unit to always
|
||||||
|
|
||||||
(define out-sd (make-object style-delta% 'change-normal))
|
(define out-sd (make-object style-delta% 'change-normal))
|
||||||
(define err-sd (make-object style-delta% 'change-italic))
|
(define err-sd (make-object style-delta% 'change-italic))
|
||||||
(define value-sd (make-object style-delta% 'change-normal))
|
(define value-sd (make-object style-delta% 'change-family 'modern))
|
||||||
(send out-sd set-delta-foreground (make-object color% 150 0 150))
|
(send out-sd set-delta-foreground (make-object color% 150 0 150))
|
||||||
(send err-sd set-delta-foreground (make-object color% 255 0 0))
|
(send err-sd set-delta-foreground (make-object color% 255 0 0))
|
||||||
(send value-sd set-delta-foreground (make-object color% 0 0 175))
|
(send value-sd set-delta-foreground (make-object color% 0 0 175))
|
||||||
|
@ -1622,27 +1636,41 @@ WARNING: printf is rebound in the body of the unit to always
|
||||||
;;
|
;;
|
||||||
;; queues
|
;; queues
|
||||||
;;
|
;;
|
||||||
(define-struct queue (eles count))
|
(define-struct queue (front back count))
|
||||||
(define (empty-queue) (make-queue '() 0))
|
(define (empty-queue) (make-queue '() '() 0))
|
||||||
(define (enqueue e q) (make-queue (append (queue-eles q) (list e))
|
(define (enqueue e q) (make-queue
|
||||||
(+ (queue-count q) 1)))
|
(cons e (queue-front q))
|
||||||
|
(queue-back q)
|
||||||
|
(+ (queue-count q) 1)))
|
||||||
(define (queue-first q)
|
(define (queue-first q)
|
||||||
(let ([eles (queue-eles q)])
|
(flip-around q)
|
||||||
(if (null? eles)
|
(let ([back (queue-back q)])
|
||||||
|
(if (null? back)
|
||||||
(error 'queue-first "empty queue")
|
(error 'queue-first "empty queue")
|
||||||
(car eles))))
|
(car back))))
|
||||||
(define (queue-rest q)
|
(define (queue-rest q)
|
||||||
(let ([eles (queue-eles q)])
|
(flip-around q)
|
||||||
(if (null? eles)
|
(let ([back (queue-back q)])
|
||||||
|
(if (null? back)
|
||||||
(error 'queue-rest "empty queue")
|
(error 'queue-rest "empty queue")
|
||||||
(make-queue (cdr eles)
|
(make-queue (queue-front q)
|
||||||
|
(cdr back)
|
||||||
(- (queue-count q) 1)))))
|
(- (queue-count q) 1)))))
|
||||||
(define (queue-empty? q) (null? (queue-eles q)))
|
(define (flip-around q)
|
||||||
|
(when (null? (queue-back q))
|
||||||
|
(set-queue-back! q (reverse (queue-front q)))
|
||||||
|
(set-queue-front! q '())))
|
||||||
|
|
||||||
|
(define (queue-empty? q) (zero? (queue-count q)))
|
||||||
(define (queue-size q) (queue-count q))
|
(define (queue-size q) (queue-count q))
|
||||||
|
|
||||||
;; queue->list : (queue x) -> (listof x)
|
;; queue->list : (queue x) -> (listof x)
|
||||||
;; returns the elements in the order that successive deq's would have
|
;; returns the elements in the order that successive deq's would have
|
||||||
(define (queue->list q) (queue-eles q))
|
(define (queue->list q)
|
||||||
|
(let ([ans (append (queue-back q) (reverse (queue-front q)))])
|
||||||
|
(set-queue-back! q ans)
|
||||||
|
(set-queue-front! q '())
|
||||||
|
ans))
|
||||||
|
|
||||||
;;
|
;;
|
||||||
;; end queue abstraction
|
;; end queue abstraction
|
||||||
|
|
Loading…
Reference in New Issue
Block a user