better key handling
svn: r4084
This commit is contained in:
parent
4c9868bf8c
commit
bc9f5abc34
|
@ -19,6 +19,11 @@
|
||||||
(current-command-line-arguments)
|
(current-command-line-arguments)
|
||||||
(args filenames filenames)))
|
(args filenames filenames)))
|
||||||
|
|
||||||
|
(define icons-bitmap
|
||||||
|
(let ([icons (collection-path "icons")])
|
||||||
|
(lambda (name)
|
||||||
|
(make-object bitmap% (build-path icons name)))))
|
||||||
|
|
||||||
;; updates the command-line-arguments with only the files
|
;; updates the command-line-arguments with only the files
|
||||||
;; to open. See also main.ss.
|
;; to open. See also main.ss.
|
||||||
(current-command-line-arguments (apply vector files-to-open))
|
(current-command-line-arguments (apply vector files-to-open))
|
||||||
|
@ -32,84 +37,74 @@
|
||||||
|
|
||||||
(define high-color? ((get-display-depth) . > . 8))
|
(define high-color? ((get-display-depth) . > . 8))
|
||||||
(define special-state #f)
|
(define special-state #f)
|
||||||
(define normal-bitmap #f)
|
(define normal-bitmap #f) ; set by load-magic-images
|
||||||
(define (get-normal-bitmap)
|
|
||||||
(unless normal-bitmap
|
|
||||||
(set! normal-bitmap (make-object bitmap% (build-path (collection-path "icons") "PLT-206.png"))))
|
|
||||||
normal-bitmap)
|
|
||||||
|
|
||||||
(define-struct magic-image (string filename bitmap))
|
(define-struct magic-image (chars filename bitmap))
|
||||||
|
|
||||||
(define (magic-img str img)
|
(define (magic-img str img)
|
||||||
(make-magic-image (list->string (reverse (string->list str))) img #f))
|
(make-magic-image (reverse (string->list str)) img #f))
|
||||||
|
|
||||||
;; magic strings and their associated images. Any string in this list that's a prefix of any other
|
;; magic strings and their associated images. There should not be a string
|
||||||
;; is not going to be reachable; you could change that by removing the (set! key-codes null) line
|
;; in this list that is a prefix of another.
|
||||||
;; where the match occurs
|
|
||||||
(define magic-images
|
(define magic-images
|
||||||
(list
|
(list (magic-img "larval" "PLT-206-larval.png")
|
||||||
(magic-img "larval" "PLT-206-larval.png")
|
(magic-img "mars" "PLT-206-mars.jpg")))
|
||||||
(magic-img "mars" "PLT-206-mars.jpg")))
|
|
||||||
|
|
||||||
(define (load-magic-images)
|
(define (load-magic-images)
|
||||||
(get-normal-bitmap)
|
(set! load-magic-images void) ; run only once
|
||||||
(for-each
|
(unless normal-bitmap (set! normal-bitmap (icons-bitmap "PLT-206.png")))
|
||||||
(λ (magic-image)
|
(for-each (λ (magic-image)
|
||||||
(unless (magic-image-bitmap magic-image)
|
(unless (magic-image-bitmap magic-image)
|
||||||
(set-magic-image-bitmap!
|
(set-magic-image-bitmap!
|
||||||
magic-image
|
magic-image
|
||||||
(make-object bitmap% (build-path (collection-path "icons") (magic-image-filename magic-image))))))
|
(icons-bitmap (magic-image-filename magic-image)))))
|
||||||
magic-images))
|
magic-images))
|
||||||
|
|
||||||
(define longest-magic-string (apply max (map (λ (s) (string-length (magic-image-string s))) magic-images)))
|
(define longest-magic-string
|
||||||
|
(apply max (map (λ (s) (length (magic-image-chars s))) magic-images)))
|
||||||
|
|
||||||
(define key-codes null)
|
(define key-codes null)
|
||||||
(define key-codes-len 0)
|
|
||||||
|
(define (find-magic-image)
|
||||||
|
(define (prefix? l1 l2)
|
||||||
|
(or (null? l1)
|
||||||
|
(and (pair? l2)
|
||||||
|
(eq? (car l1) (car l2))
|
||||||
|
(prefix? (cdr l1) (cdr l2)))))
|
||||||
|
(ormap (λ (i) (and (prefix? (magic-image-chars i) key-codes) i))
|
||||||
|
magic-images))
|
||||||
|
|
||||||
(define (add-key-code new-code)
|
(define (add-key-code new-code)
|
||||||
(unless (eq? 'release new-code)
|
(let loop ([n (- longest-magic-string 2)] [l key-codes])
|
||||||
(set! key-codes
|
(cond [(null? l) 'done]
|
||||||
(let loop ([n longest-magic-string]
|
[(zero? n) (set-cdr! l '())]
|
||||||
[l (cons new-code key-codes)])
|
[else (loop (sub1 n) (cdr l))]))
|
||||||
(cond
|
(set! key-codes (cons new-code key-codes)))
|
||||||
[(zero? n) null]
|
|
||||||
[(null? l) null]
|
|
||||||
[else (cons (car l) (loop (- n 1) (cdr l)))])))))
|
|
||||||
|
|
||||||
(let ([set-splash-bitmap (dynamic-require '(lib "splash.ss" "framework") 'set-splash-bitmap)])
|
(let ([set-splash-bitmap
|
||||||
|
(dynamic-require '(lib "splash.ss" "framework") 'set-splash-bitmap)])
|
||||||
((dynamic-require '(lib "splash.ss" "framework") 'set-splash-char-observer)
|
((dynamic-require '(lib "splash.ss" "framework") 'set-splash-char-observer)
|
||||||
(λ (evt)
|
(λ (evt)
|
||||||
(add-key-code (send evt get-key-code))
|
(let ([ch (send evt get-key-code)])
|
||||||
|
(when (char? ch)
|
||||||
;; as soon as something is typed, load the bitmaps
|
;; as soon as something is typed, load the bitmaps
|
||||||
(load-magic-images)
|
(load-magic-images)
|
||||||
|
(add-key-code ch)
|
||||||
(when (andmap char? key-codes)
|
(let ([match (find-magic-image)])
|
||||||
(let ((s (apply string key-codes)))
|
(when match
|
||||||
(cond
|
(set! key-codes null)
|
||||||
[(ormap (λ (m)
|
(set-splash-bitmap
|
||||||
(if (string=? s (magic-image-string m))
|
(if (eq? special-state match)
|
||||||
m
|
(begin (set! special-state #f) normal-bitmap)
|
||||||
#f)) magic-images)
|
(begin (set! special-state match)
|
||||||
=>
|
(magic-image-bitmap match)))))))))))
|
||||||
(λ (match)
|
|
||||||
(set! key-codes null)
|
|
||||||
(set-splash-bitmap
|
|
||||||
(if (and special-state (string=? special-state (magic-image-string match)))
|
|
||||||
(begin
|
|
||||||
(set! special-state #f)
|
|
||||||
(get-normal-bitmap))
|
|
||||||
(begin
|
|
||||||
(set! special-state (magic-image-string match))
|
|
||||||
(magic-image-bitmap match)))))]
|
|
||||||
[else (void)]))))))
|
|
||||||
|
|
||||||
(when (eb-bday?)
|
(when (eb-bday?)
|
||||||
(let ()
|
(let ()
|
||||||
(define main-size 260)
|
(define main-size 260)
|
||||||
(define pi (atan 0 -1))
|
(define pi (atan 0 -1))
|
||||||
|
|
||||||
(define eli (make-object bitmap% (build-path (collection-path "icons") "eli-purple.jpg")))
|
(define eli (icons-bitmap "eli-purple.jpg"))
|
||||||
(define bitmap (make-object bitmap% main-size main-size))
|
(define bitmap (make-object bitmap% main-size main-size))
|
||||||
(define bdc (make-object bitmap-dc% bitmap))
|
(define bdc (make-object bitmap-dc% bitmap))
|
||||||
|
|
||||||
|
@ -157,7 +152,7 @@
|
||||||
(with-handlers ([exn:fail? (lambda (x)
|
(with-handlers ([exn:fail? (lambda (x)
|
||||||
(printf "~s\n" (exn-message x))
|
(printf "~s\n" (exn-message x))
|
||||||
#f)])
|
#f)])
|
||||||
(let ([b (make-object bitmap% (build-path (collection-path "icons") "recycle.gif"))])
|
(let ([b (icons-bitmap bitmap% "recycle.gif")])
|
||||||
(cond
|
(cond
|
||||||
[(send b ok?)
|
[(send b ok?)
|
||||||
(let ([gbdc (make-object bitmap-dc% b)]
|
(let ([gbdc (make-object bitmap-dc% b)]
|
||||||
|
|
Loading…
Reference in New Issue
Block a user