1 ! Copyright (C) 2005, 2006 Eduardo Cavazos and Slava Pestov
2 ! See http://factorcode.org/license.txt for BSD license.
4 USING: arrays errors freetype gadgets gadgets-listener
5 gadgets-workspace hashtables kernel kernel-internals math
6 namespaces opengl sequences strings timers ;
8 ! In the X11 backend, world-handle is a pair { window context }.
9 ! The window is an X11 window ID, and the context is a
10 ! GLX context pointer.
12 M: world expose-event nip relayout ;
14 : configured-loc ( event -- dim )
15 dup XConfigureEvent-x swap XConfigureEvent-y 2array ;
17 : configured-dim ( event -- dim )
18 dup XConfigureEvent-width swap XConfigureEvent-height 2array ;
20 M: world configure-event
21 over configured-loc over set-world-loc
22 swap configured-dim swap set-gadget-dim ;
33 { HEX: FF08 "BACKSPACE" }
35 { HEX: FF0D "RETURN" }
37 { HEX: FF1B "ESCAPE" }
38 { HEX: FFFF "DELETE" }
44 { HEX: FF55 "PAGE_UP" }
45 { HEX: FF56 "PAGE_DOWN" }
59 : ignored-key? ( keycode -- ? )
61 HEX: FFE1 HEX: FFE2 HEX: FFE3 HEX: FFE4 HEX: FFE5
62 HEX: FFE6 HEX: FFE7 HEX: FFE8 HEX: FFE9 HEX: FFEA
63 HEX: FFEB HEX: FFEC HEX: FFED HEX: FFEE
66 : key-code ( event -- keycode )
67 lookup-string drop dup ignored-key? [
70 dup key-codes hash [ ] [ ch>string ] ?if
73 : event-modifiers XKeyEvent-state modifiers modifier ;
75 : key-event>gesture ( event -- modifiers gesture )
76 dup event-modifiers swap key-code ;
78 : key-down-event>gesture ( event -- gesture )
79 key-event>gesture [ <key-down> ] [ drop f ] if* ;
81 M: world key-down-event
82 world-focus over key-down-event>gesture [
84 [ swap lookup-string nip swap user-input ] [ 2drop ] if
90 world-focus swap key-event>gesture dup [
91 <key-up> dup [ swap send-gesture drop ] [ 2drop ] if
96 : mouse-event-loc ( event -- loc )
97 dup XButtonEvent-x swap XButtonEvent-y 2array ;
99 : mouse-event>gesture ( event -- modifiers button loc )
100 dup event-modifiers over XButtonEvent-button
101 rot mouse-event-loc ;
103 M: world button-down-event
104 >r mouse-event>gesture >r <button-down> r> r>
107 M: world button-up-event
108 >r mouse-event>gesture >r <button-up> r> r>
111 : mouse-event>scroll-direction ( event -- pair )
112 #! Reminder for myself: 4 is up, 5 is down
113 XButtonEvent-button 5 = 1 -1 ? 0 swap 2array ;
116 >r dup mouse-event>scroll-direction swap mouse-event-loc r>
119 M: world enter-event motion-event ;
121 M: world leave-event 2drop forget-rollover ;
123 M: world motion-event
124 >r dup XMotionEvent-x swap XMotionEvent-y 2array r>
125 move-hand fire-motion ;
127 M: world focus-in-event nip focus-world ;
129 M: world focus-out-event nip unfocus-world ;
131 M: world selection-notify-event
132 [ world-handle first selection-from-event ] keep
133 world-focus user-input ;
135 : supported-type? ( atom -- ? )
136 { "STRING" "UTF8_STRING" "TEXT" }
137 [ x-atom = ] contains-with? ;
139 M: world selection-request-event
140 drop dup XSelectionRequestEvent-target {
141 { [ dup supported-type? ] [ drop dup set-selection-prop send-notify-success ] }
142 { [ dup "TARGETS" x-atom = ] [ drop dup set-targets-prop send-notify-success ] }
143 { [ dup "TIMESTAMP" x-atom = ] [ drop dup set-timestamp-prop send-notify-success ] }
144 { [ t ] [ drop send-notify-failure ] }
147 : close-box? ( event -- ? )
148 dup XClientMessageEvent-message_type "WM_PROTOCOLS" x-atom =
149 swap XClientMessageEvent-data0 "WM_DELETE_WINDOW" x-atom =
152 M: world client-event
156 r> first2 destroy-window*
161 : gadget-window ( world -- )
163 dup world-loc over rect-dim glx-window >r
164 [ register-window ] keep r> 2array
165 ] keep set-world-handle ;
169 [ do-events ] ui-try event-loop
174 : set-title ( string world -- )
175 world-handle first dpy get -rot swap XStoreName drop ;
177 : open-window* ( world -- )
180 world-handle first dup set-closable map-window ;
182 : raise-window ( world -- )
183 dpy get swap world-handle first XRaiseWindow drop ;
185 : select-gl-context ( handle -- )
186 dpy get swap first2 glXMakeCurrent
187 [ "Failed to set current GLX context" throw ] unless ;
189 : flush-gl-context ( handle -- )
190 dpy get swap first glXSwapBuffers ;
212 : default-shell "DISPLAY" os-env empty? "tty" "ui" ? ;