slideshow: add "spotlight" support

The spotlight is a replacement for the mouse pointer that
is bigger while obscuring less (which works better for
screencasts, for example).
This commit is contained in:
Matthew Flatt 2013-09-05 06:55:02 -06:00
parent 54a75a4031
commit c70a0313e7
8 changed files with 72 additions and 5 deletions

View File

@ -1,5 +1,7 @@
#lang scribble/doc #lang scribble/doc
@(require "ss.rkt" scribble/struct) @(require "ss.rkt"
scribble/struct
scribble/decode)
@(define (control-table . l) @(define (control-table . l)
(make-table (make-table
@ -8,7 +10,7 @@
(list (make-flow (list (make-paragraph (list (hspace 2))))) (list (make-flow (list (make-paragraph (list (hspace 2)))))
(make-flow (list (make-paragraph (list (car p))))) (make-flow (list (make-paragraph (list (car p)))))
(make-flow (list (make-paragraph (list (hspace 1) ":" (hspace 1))))) (make-flow (list (make-paragraph (list (hspace 1) ":" (hspace 1)))))
(make-flow (list (make-paragraph (list (cadr p))))))) (make-flow (list (decode-paragraph (list (cadr p)))))))
l))) l)))
@ -70,6 +72,7 @@ Alt-q (or Meta-q) to end the slides. Here are more controls:
(list "Alt-c, Cmd-c, or Meta-c" "show/hide commentary") (list "Alt-c, Cmd-c, or Meta-c" "show/hide commentary")
(list "Alt-d, Cmd-d, or Meta-d" "show/hide preview") (list "Alt-d, Cmd-d, or Meta-d" "show/hide preview")
(list "Alt-m, Cmd-m, or Meta-m" "show/hide mouse cursor") (list "Alt-m, Cmd-m, or Meta-m" "show/hide mouse cursor")
(list "Alt-l, Cmd-l, or Meta-l" "show/hide ``spotlight''")
(list "Shift with arrow" "move window 1 pixel") (list "Shift with arrow" "move window 1 pixel")
(list "Alt, Meta, or Cmd with arrow" "move window 10 pixels") (list "Alt, Meta, or Cmd with arrow" "move window 10 pixels")
] ]

View File

@ -325,7 +325,17 @@ input to the function is the default string and the slide
number, and the result is what is drawn in the bottom right number, and the result is what is drawn in the bottom right
corner. The default parameter value just returns its first corner. The default parameter value just returns its first
argument. argument.
} }
@defproc[(set-spotlight-style! [#:size size (or/c #f (>=/c 0)) #f]
[#:color color (or/c #f string? (is-a?/c color%)) #f])
void?]{
Adjusts the size and color of the ``spotlight,'' which can be enabled
in Slideshow as an alternative to the mouse. Note that the color
normally should have alpha value less than 1 (to make it partially
transparent). If @racket[size] or @racket[color] is @racket[#f], the
corresponding setting is unchanged.}
@; ------------------------------------------------------------------------ @; ------------------------------------------------------------------------

View File

@ -45,4 +45,5 @@
current-page-number-font current-page-number-color current-page-number-adjust current-page-number-font current-page-number-color current-page-number-adjust
current-titlet current-para-width current-titlet current-para-width
set-page-numbers-visible! done-making-slides set-page-numbers-visible! done-making-slides
set-spotlight-style!
clickback interactive make-slide-inset slide-inset? apply-slide-inset)) clickback interactive make-slide-inset slide-inset? apply-slide-inset))

View File

@ -165,6 +165,9 @@
(define (set-page-numbers-visible! on?) (define (set-page-numbers-visible! on?)
(viewer:set-page-numbers-visible! (and on? #t))) (viewer:set-page-numbers-visible! (and on? #t)))
(define (set-spotlight-style! #:size [size #f] #:color [color #f])
(viewer:set-spotlight-style! #:size size #:color color))
(define current-page-number-font (define current-page-number-font
(make-parameter (make-parameter
(make-object font% 10 'default 'normal 'normal) (make-object font% 10 'default 'normal 'normal)

View File

@ -27,6 +27,7 @@
enable-click-advance! enable-click-advance!
set-page-numbers-visible! set-page-numbers-visible!
done-making-slides done-making-slides
set-spotlight-style!
;; Called when a clickback-containing slide is rendered: ;; Called when a clickback-containing slide is rendered:
add-click-region! add-click-region!
;; Called when a interactive-containing slide is rendered: ;; Called when a interactive-containing slide is rendered:
@ -80,6 +81,7 @@
current-page-number-font current-page-number-color current-page-number-adjust current-page-number-font current-page-number-color current-page-number-adjust
current-titlet current-para-width current-titlet current-para-width
set-page-numbers-visible! done-making-slides set-page-numbers-visible! done-making-slides
set-spotlight-style!
clickback clickback
interactive interactive
make-slide-inset make-slide-inset

View File

@ -128,6 +128,7 @@
current-page-number-font current-page-number-color current-page-number-adjust current-page-number-font current-page-number-color current-page-number-adjust
current-titlet current-para-width current-titlet current-para-width
set-page-numbers-visible! done-making-slides set-page-numbers-visible! done-making-slides
set-spotlight-style!
slide/timeout slide/timeout
slide/title/timeout slide/title/timeout
slide/center/timeout slide/center/timeout

View File

@ -60,6 +60,9 @@
(define set-page-numbers-visible! void) (define set-page-numbers-visible! void)
(define add-click-region! void) (define add-click-region! void)
(define add-interactive! void) (define add-interactive! void)
(define (set-spotlight-style! #:size [size #f]
#:color [color #f])
(void))
(define done-making-slides void)) (define done-making-slides void))
CORE])))) CORE]))))
(parameterize ([current-namespace ns]) (parameterize ([current-namespace ns])

View File

@ -28,6 +28,7 @@
(viewer:set-use-background-frame! set-use-background-frame!) (viewer:set-use-background-frame! set-use-background-frame!)
(viewer:enable-click-advance! enable-click-advance!) (viewer:enable-click-advance! enable-click-advance!)
(viewer:set-page-numbers-visible! set-page-numbers-visible!) (viewer:set-page-numbers-visible! set-page-numbers-visible!)
(viewer:set-spotlight-style! set-spotlight-style!)
(viewer:done-making-slides done-making-slides))) (viewer:done-making-slides done-making-slides)))
(define-accessor margin get-margin) (define-accessor margin get-margin)
@ -40,6 +41,10 @@
(define show-page-numbers? #t) (define show-page-numbers? #t)
(define click-to-advance? #t) (define click-to-advance? #t)
(define blank-cursor-allowed? #t) (define blank-cursor-allowed? #t)
(define spotlight-on? #f)
(define spotlight-shown? #f)
(define spotlight-size 36)
(define spotlight-color (make-color 230 230 0 0.5))
(define click-regions null) (define click-regions null)
(define interactives #hash()) (define interactives #hash())
(define talk-slide-list null) (define talk-slide-list null)
@ -128,6 +133,11 @@
(define (viewer:set-page-numbers-visible! on?) (define (viewer:set-page-numbers-visible! on?)
(set! show-page-numbers? (and on? #t))) (set! show-page-numbers? (and on? #t)))
(viewer:set-page-numbers-visible! config:show-page-numbers?) (viewer:set-page-numbers-visible! config:show-page-numbers?)
(define (viewer:set-spotlight-style! #:size [size #f]
#:color [color #f])
(when size (set! spotlight-size size))
(when color (set! spotlight-color color)))
(define adjust-cursor (lambda () (send f set-blank-cursor #f))) (define adjust-cursor (lambda () (send f set-blank-cursor #f)))
@ -302,6 +312,13 @@
(send e get-alt-down)) (send e get-alt-down))
(set! blank-cursor-allowed? (not blank-cursor-allowed?)) (set! blank-cursor-allowed? (not blank-cursor-allowed?))
(send f set-blank-cursor blank-cursor-allowed?))] (send f set-blank-cursor blank-cursor-allowed?))]
[(#\l)
(when (or (send e get-meta-down)
(send e get-alt-down))
(set! spotlight-on? (not spotlight-on?))
(when spotlight-on?
(set! spotlight-shown? #t))
(send c refresh))]
[else [else
#f])))) #f]))))
@ -659,10 +676,13 @@
(define c% (define c%
(class canvas% (class canvas%
(inherit get-dc get-client-size make-bitmap (inherit get-dc get-client-size make-bitmap
client->screen) client->screen refresh)
(define clicking #f) (define clicking #f)
(define clicking-hit? #f) (define clicking-hit? #f)
(define mouse-x 0)
(define mouse-y 0)
(define/override (on-paint) (define/override (on-paint)
(let ([dc (get-dc)]) (let ([dc (get-dc)])
@ -674,8 +694,23 @@
[else [else
(send dc clear) (send dc clear)
(paint-slide this dc)]) (paint-slide this dc)])
(show-spotlight dc)
(show-time dc))) (show-time dc)))
(define/private (show-spotlight dc)
(when (and spotlight-on? spotlight-shown?)
(define old-p (send dc get-pen))
(define old-b (send dc get-brush))
(send dc set-pen "black" 0 'transparent)
(send dc set-brush spotlight-color 'solid)
(send dc draw-ellipse
(- mouse-x (/ spotlight-size 2))
(- mouse-y (/ spotlight-size 2))
spotlight-size
spotlight-size)
(send dc set-pen old-p)
(send dc set-brush old-b)))
(define/private (show-time dc) (define/private (show-time dc)
(when config:show-time? (when config:show-time?
(define c (send dc get-text-foreground)) (define c (send dc get-text-foreground))
@ -700,6 +735,13 @@
(inherit get-top-level-window) (inherit get-top-level-window)
(define/override (on-event e) (define/override (on-event e)
(unless (and (= mouse-x (send e get-x))
(= mouse-y (send e get-y)))
(set! mouse-x (send e get-x))
(set! mouse-y (send e get-y))
(when spotlight-on?
(set! spotlight-shown? #t)
(refresh)))
(cond (cond
[(send e button-down?) [(send e button-down?)
(let ([c (ormap (let ([c (ormap
@ -873,6 +915,7 @@
(let ([dc (get-dc)]) (let ([dc (get-dc)])
(send dc clear) (send dc clear)
(paint-slide this dc))]) (paint-slide this dc))])
(show-spotlight (get-dc))
(show-time (get-dc)) (show-time (get-dc))
(swap-interactives! old-interactives interactives))) (swap-interactives! old-interactives interactives)))
@ -1160,6 +1203,7 @@
(define refresh-page (define refresh-page
(lambda ([immediate-prefetch? #f]) (lambda ([immediate-prefetch? #f])
(hide-cursor-until-moved) (hide-cursor-until-moved)
(set! spotlight-shown? #f)
(send f set-blank-cursor #t) (send f set-blank-cursor #t)
(when (= current-page 0) (when (= current-page 0)
(set! start-time #f) (set! start-time #f)