1 ! Copyright (C) 2005, 2006 Eduardo Cavazos and Slava Pestov
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: alien alien.c-types hashtables kernel math math.vectors
4 math.bitwise namespaces sequences x11.xlib x11.constants x11.glx
8 : create-window-mask ( -- n )
9 { CWBackPixel CWBorderPixel CWColormap CWEventMask } flags ;
11 : create-colormap ( visinfo -- colormap )
12 dpy get root get rot XVisualInfo-visual AllocNone
30 : window-attributes ( visinfo -- attributes )
31 "XSetWindowAttributes" <c-object>
32 0 over set-XSetWindowAttributes-background_pixel
33 0 over set-XSetWindowAttributes-border_pixel
34 [ >r create-colormap r> set-XSetWindowAttributes-colormap ] keep
35 event-mask over set-XSetWindowAttributes-event_mask ;
37 : set-size-hints ( window -- )
38 "XSizeHints" <c-object>
39 USPosition over set-XSizeHints-flags
40 dpy get -rot XSetWMNormalHints ;
42 : auto-position ( window loc -- )
43 { 0 0 } = [ drop ] [ set-size-hints ] if ;
45 : create-window ( loc dim visinfo -- window )
47 >r >r >r dpy get root get r> first2 r> { 1 1 } vmax first2 0 r>
48 [ XVisualInfo-depth InputOutput ] keep
49 [ XVisualInfo-visual create-window-mask ] keep
50 window-attributes XCreateWindow
51 dup r> auto-position ;
53 : glx-window ( loc dim -- window glx )
54 GLX_DOUBLEBUFFER 1array choose-visual
55 [ create-window ] keep
59 : create-pixmap ( dim visual -- pixmap )
60 [ [ { 0 0 } swap ] dip create-window ] [
61 drop [ dpy get ] 2dip first2 24 XCreatePixmap
62 [ "Failed to create offscreen pixmap" throw ] unless*
65 : (create-glx-pixmap) ( pixmap visual -- pixmap glx-pixmap )
67 [ dpy get ] 2dip swap glXCreateGLXPixmap
68 [ "Failed to create offscreen GLXPixmap" throw ] unless*
71 : create-glx-pixmap ( dim visual -- pixmap glx-pixmap )
72 [ create-pixmap ] [ (create-glx-pixmap) ] bi ;
74 : glx-pixmap ( dim -- glx pixmap glx-pixmap )
76 [ nip create-glx ] [ create-glx-pixmap ] [ nip XFree ] 2tri ;
78 : destroy-window ( win -- )
79 dpy get swap XDestroyWindow drop ;
81 : set-closable ( win -- )
82 dpy get swap "WM_DELETE_WINDOW" x-atom <Atom> 1
83 XSetWMProtocols drop ;
85 : map-window ( win -- ) dpy get swap XMapWindow drop ;
87 : unmap-window ( win -- ) dpy get swap XUnmapWindow drop ;
89 : pixmap-bits ( dim pixmap -- alien )
90 swap first2 '[ dpy get _ 0 0 _ _ AllPlanes ZPixmap XGetImage ] call
91 [ XImage-pixels ] [ XDestroyImage drop ] bi ;