2 USING: kernel io combinators namespaces quotations arrays sequences
5 mortar mortar.sugar slot-accessors
11 x.widgets.wm.frame.drag.move
12 x.widgets.wm.frame.drag.size ;
14 IN: x.widgets.wm.frame
18 <wm-frame> <widget> { "child" "gc" "last-state" } accessors define-simple-class
20 <wm-frame> "create" !( id <wm-frame> -- wm-frame ) [
22 swap <wm-child> new* >>child
23 <gc> new* "white" <-- set-foreground >>gc
26 SubstructureRedirectMask
33 SubstructureNotifyMask
38 "cornflowerblue" <-- set-background
39 dup $child <- position <-- move
40 dup $child over <-- reparent drop
50 SYMBOL: WM_DELETE_WINDOW
53 "WM_PROTOCOLS" 0 intern-atom WM_PROTOCOLS set
54 "WM_DELETE_WINDOW" 0 intern-atom WM_DELETE_WINDOW set ;
58 "fit-to-child" !( wm-frame -- wm-frame )
59 [ dup $child <- size { 10 20 } v+ <-- resize ]
61 "position-child" !( wm-frame -- wm-frame )
62 [ dup $child { 5 15 } <-- move drop ]
64 "set-child-size" !( wm-frame size -- frame )
65 [ >r dup $child r> <-- resize drop <- fit-to-child ]
67 "set-child-width" !( wm-frame width -- frame )
68 [ >r dup $child r> <- set-width drop <- fit-to-child ]
70 "set-child-height" !( wm-frame height -- frame )
71 [ >r dup $child r> <- set-height drop <- fit-to-child ]
73 "adjust-child" !( wm-frame -- wm-frame )
74 [ dup $child over <- size { 10 20 } v- <-- resize drop ]
76 "update-title" !( wm-frame -- wm-frame )
79 ! dup $gc { 5 1 } pick $child <- fetch-name <--- draw-string/top-left
80 dup $gc { 5 11 } pick $child <- fetch-name <---- draw-string
83 "delete-child" !( wm-frame -- wm-frame ) [
84 dup $child WM_PROTOCOLS get WM_DELETE_WINDOW get <--- send-client-message
87 "drag-move" !( event wm-frame -- ) [ <wm-frame-drag-move> new* ]
89 "drag-size" !( event wm-frame -- ) [ <wm-frame-drag-size> new* ]
91 "make-frame-button" !( frame -- frame ) [
95 over [ <- unmap drop ] curry >>action-1
96 over [ <- delete-child drop ] curry >>action-3
98 NorthEastGravity <-- set-gravity
99 "white" <-- set-background
100 over <- width 9 - 5 - 3 2array <-- move
103 ! !!!!!!!!!! Event handlers !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
105 "handle-enter-window" !( event wm-frame -- )
106 [ nip $child RevertToPointerRoot CurrentTime <--- set-input-focus drop ]
108 "handle-expose" !( event wm-frame -- ) [ nip <- clear <- update-title drop ]
110 "handle-button-press" !( event wm-frame -- ) [
111 over XButtonEvent-button
112 { { [ dup Button1 = ] [ drop <- drag-move ] }
113 { [ dup Button2 = ] [ drop <- drag-size ] }
114 { [ t ] [ 3drop ] } }
117 "handle-map" !( event wm-frame -- )
118 [ "<wm-frame> handle-map :: ignoring values" print flush 2drop ]
120 "handle-unmap" !( event wm-frame -- ) [ nip <- unmap drop ]
122 "handle-destroy-window" !( event wm-frame -- ) [
123 nip dup $child <- remove-from-window-table drop
124 <- remove-from-window-table <- destroy ]
126 "handle-configure-request" !( event frame -- ) [
127 { { [ over dup CWX? swap CWY? and ]
128 [ over XConfigureRequestEvent-position <-- move ] }
129 { [ over CWX? ] [ over XConfigureRequestEvent-x <-- set-x ] }
130 { [ over CWY? ] [ over XConfigureRequestEvent-y <-- set-y ] }
131 { [ t ] [ "<wm-frame> handle-configure-request :: move not requested"
135 { { [ over dup CWWidth? swap CWHeight? and ]
136 [ over XConfigureRequestEvent-size <-- set-child-size ] }
138 [ over XConfigureRequestEvent-width <-- set-child-width ] }
140 [ over XConfigureRequestEvent-height <-- set-child-height ] }
142 [ "<wm-frame> handle-configure-request :: resize not requested"
149 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
151 : wm-frame-maximize ( wm-frame -- wm-frame )
154 dup $dpy $default-root <- size
159 : wm-frame-maximize-vertical ( wm-frame -- wm-frame )
161 dup $dpy $default-root <- height
165 <wm-frame> "save-state" !( wm-frame -- wm-frame ) [
172 <wm-frame> "restore-state" !( wm-frame -- wm-frame ) [
173 dup $last-state $pos <-- move
174 dup $last-state $dim <-- resize
178 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!