get-diplay-size' and get-display-left-top-inset' use #f for failure

Since the number of monitors can change at any time, reliable
use of these functions requires handling failure in some way.
Handling #f results is easier (and less likely to mask other
problems) than catching exceptions.
This commit is contained in:
Matthew Flatt 2011-09-09 09:16:58 -06:00
parent 69832d9925
commit ce4705cedc
5 changed files with 37 additions and 30 deletions

View File

@ -89,7 +89,7 @@
(define (check-for-break) #f)
(define (display-origin xb yb all? num)
(define (display-origin xb yb all? num fail)
(if (or all? (positive? num))
(unless (atomically
(with-autorelease
@ -108,13 +108,13 @@
(NSSize-height (NSRect-size f0)))))))
#t)
#f))))
(error 'get-display-left-top-inset "no such monitor: ~v" num))
(fail))
(set-box! xb 0))
(when (zero? num)
(set-box! yb 0))
(set-box! yb (+ (unbox yb) (get-menu-bar-height))))
(define (display-size xb yb all? num)
(define (display-size xb yb all? num fail)
(unless (atomically
(with-autorelease
(let ([screens (tell NSScreen screens)])
@ -134,7 +134,7 @@
(get-menu-bar-height)]))))
#t)
#f))))
(error 'get-display-size "no such monitor: ~v" num)))
(fail)))
(define (display-count)

View File

@ -265,7 +265,7 @@
(send p get-size sw-box sh-box)
(set-box! sx-box (send p get-x))
(set-box! sy-box (send p get-y)))
(display-size sw-box sh-box #t 0)))
(display-size sw-box sh-box #t 0 void)))
(let* ([sw (unbox sw-box)]
[sh (unbox sh-box)]
[fw (unbox w-box)]
@ -497,21 +497,21 @@
(define-gdk gdk_screen_get_monitor_geometry (_fun _GdkScreen _int _GdkRectangle-pointer -> _void))
(define-gdk gdk_screen_get_n_monitors (_fun _GdkScreen -> _int))
(define (monitor-rect who num)
(define (monitor-rect num fail)
(let ([s (gdk_screen_get_default)]
[r (make-GdkRectangle 0 0 0 0)])
(unless (num . < . (gdk_screen_get_n_monitors s))
(error who "no such monitor: ~v" num))
(fail))
(gdk_screen_get_monitor_geometry s num r)
r))
(define (display-origin x y all? num)
(let ([r (monitor-rect 'get-display-left-top-inset num)])
(define (display-origin x y all? num fail)
(let ([r (monitor-rect num fail)])
(set-box! x (- (GdkRectangle-x r)))
(set-box! y (- (GdkRectangle-y r)))))
(define (display-size w h all? num)
(let ([r (monitor-rect 'get-display-size num)])
(define (display-size w h all? num fail)
(let ([r (monitor-rect num fail)])
(set-box! w (GdkRectangle-width r))
(set-box! h (GdkRectangle-height r))))

View File

@ -78,12 +78,12 @@
#f)
(reverse rects)))
(define (display-size xb yb all? num)
(define (display-size xb yb all? num fail)
(cond
[(positive? num)
(let ([rs (get-all-screen-rects)])
(unless (num . < . (length rs))
(error 'get-display-size "no such monitor: ~v" num))
(fail))
(let ([r (list-ref rs num)])
(set-box! xb (- (caddr r) (car r)))
(set-box! yb (- (cadddr r) (cadr r)))))]
@ -99,12 +99,12 @@
(set-box! xb (- (RECT-right r) (RECT-left r)))
(set-box! yb (- (RECT-bottom r) (RECT-top r))))]))
(define (display-origin xb yb avoid-bars? num)
(define (display-origin xb yb avoid-bars? num fail)
(cond
[(positive? num)
(let ([rs (get-all-screen-rects)])
(unless (num . < . (length rs))
(error 'get-display-left-top-inset "no such monitor: ~v" num))
(fail))
(let ([r (list-ref rs num)])
(set-box! xb (- (car r)))
(set-box! yb (- (cadr r)))))]
@ -435,7 +435,7 @@
[wh (box 0)]
[wx (box 0)]
[wy (box 0)])
(display-size sw sh #f 0)
(display-size sw sh #f 0 void)
(if wrt
(begin
(send wrt get-size ww wh)

View File

@ -35,19 +35,22 @@
(lambda ([full-screen? #f] #:monitor [monitor 0])
(unless (exact-nonnegative-integer? monitor)
(raise-type-error 'get-display-size "exact non-negative integer" monitor))
(let ([xb (box 0)]
[yb (box 0)])
(wx:display-size xb yb full-screen? monitor)
(values (unbox xb) (unbox yb)))))
(let/ec esc
(let ([xb (box 0)]
[yb (box 0)])
(wx:display-size xb yb full-screen? monitor
(lambda () (esc #f #f)))
(values (unbox xb) (unbox yb))))))
(define get-display-left-top-inset
(lambda ([advisory? #f] #:monitor [monitor 0])
(unless (exact-nonnegative-integer? monitor)
(raise-type-error 'get-display-left-top-inset "exact non-negative integer" monitor))
(let ([xb (box 0)]
[yb (box 0)])
(wx:display-origin xb yb advisory? monitor)
(values (unbox xb) (unbox yb)))))
(let/ec esc
(let ([xb (box 0)]
[yb (box 0)])
(wx:display-origin xb yb advisory? monitor (lambda () (esc #f #f)))
(values (unbox xb) (unbox yb))))))
(define get-display-count
(lambda ()

View File

@ -29,7 +29,8 @@ Returns the depth of the main display (a value of 1 denotes a monochrome display
@defproc[(get-display-left-top-inset [avoid-bars? any/c #f]
[#:monitor monitor exact-nonnegative-integer? 0])
(values exact-nonnegative-integer? exact-nonnegative-integer?)]{
(values (or/c exact-nonnegative-integer? #f)
(or/c exact-nonnegative-integer? #f))]{
When the optional argument is @racket[#f] (the default), this function
returns the offset of @racket[monitor]'s origin from the
@ -46,13 +47,15 @@ When the optional @racket[avoid-bars?] argument is true, for @racket[monitor]
monitor @racket[0], the result is always @racket[0] and @racket[0].
For monitors other than @racket[0], @racket[avoid-bars?] has no effect.
If @racket[monitor] is not less than the current number of available monitors, the
@racket[exn:fail] exception is raised.}
If @racket[monitor] is not less than the current number of available
monitors (which can change at any time), the results are @racket[#f]
and @racket[#f].}
@defproc[(get-display-size [full-screen? any/c #f]
[#:monitor monitor exact-nonnegative-integer? 0])
(values exact-nonnegative-integer? exact-nonnegative-integer?)]{
(values (or/c exact-nonnegative-integer? #f)
(or/c exact-nonnegative-integer? #f))]{
@index["screen resolution"]{Gets} the physical size of the specified @racket[monitor] in
pixels. On Windows, this size does not include the task bar by
@ -62,8 +65,9 @@ If @racket[monitor] is not less than the current number of available monitors, t
On Windows and Mac OS X, if the optional argument is true and @racket[monitor] is @racket[0], then
the task bar, menu bar, and dock area are included in the result.
If @racket[monitor] is not less than the current number of available monitors, the
@racket[exn:fail] exception is raised.}
If @racket[monitor] is not less than the current number of available
monitors (which can change at any time), the results are @racket[#f]
and @racket[#f].}
@defproc[(is-color-display?)