1 ! Copyright (C) 2006 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
4 USING: arrays errors gadgets generic hashtables io kernel math
5 models namespaces prettyprint sequences test threads
6 sequences words timers ;
8 ! Assoc mapping aliens to gadgets
11 : window ( handle -- world ) windows get-global assoc ;
13 : window-focus ( handle -- gadget ) window world-focus ;
15 : register-window ( world handle -- )
16 swap 2array windows get-global push ;
18 : unregister-window ( handle -- )
20 [ first = not ] subset-with
23 : raised-window ( world -- )
24 windows get-global [ second eq? ] find-with drop
25 windows get-global [ length 1- ] keep exchange ;
27 TUPLE: titled-gadget title child ;
29 M: titled-gadget gadget-title titled-gadget-title ;
31 M: titled-gadget focusable-child* titled-gadget-child ;
33 C: titled-gadget ( gadget title -- )
34 [ set-titled-gadget-title ] keep
35 { { f set-titled-gadget-child f @center } } make-frame* ;
37 : open-window ( world -- )
38 dup pref-dim over set-gadget-dim
39 dup open-window* draw-world ;
41 : open-titled-window ( gadget title -- )
42 <model> <titled-gadget> <world> open-window ;
44 : find-window ( quot -- world )
45 windows get 1 <column>
46 [ world-gadget swap call ] find-last-with nip ; inline
48 : start-world ( world -- )
51 world-gadget request-focus ;
53 : close-global ( world global -- )
54 dup get-global find-world rot eq?
55 [ f swap set-global ] [ drop ] if ;
57 : focus-world ( world -- )
58 t over set-world-focused?
60 focused-ancestors f focus-gestures ;
62 : unfocus-world ( world -- )
63 f over set-world-focused?
64 focused-ancestors f swap focus-gestures ;
66 : reset-world ( world -- )
67 dup world-fonts clear-hash
69 f over set-world-focus
70 f over set-world-handle
73 : close-world ( world -- )
74 dup hand-clicked close-global
75 dup hand-gadget close-global
79 : restore-windows ( -- )
80 windows get [ 1 <column> >array ] keep delete-all
81 [ dup reset-world open-window* ] each
84 : restore-windows? ( -- ? )
85 windows get [ empty? not ] [ f ] if* ;