 M: world selection-request-event
     drop dup target>> {
         { [ dup supported-type? ] [ drop dup set-selection-prop send-notify-success ] }
-        { [ dup "TARGETS" x-atom = ] [ drop dup set-targets-prop send-notify-success ] }
-        { [ dup "TIMESTAMP" x-atom = ] [ drop dup set-timestamp-prop send-notify-success ] }
+        { [ dup XA_TARGETS = ] [ drop dup set-targets-prop send-notify-success ] }
+        { [ dup XA_TIMESTAMP = ] [ drop dup set-timestamp-prop send-notify-success ] }
         [ drop send-notify-failure ]
     } cond ;
 

! Copyright (C) 2005, 2010 Eduardo Cavazos and Slava Pestov
! See http://factorcode.org/license.txt for BSD license.
USING: accessors alien.c-types alien.data ascii assocs classes.struct
combinators combinators.short-circuit command-line environment
io.encodings.ascii io.encodings.string io.encodings.utf8 kernel
literals locals math namespaces sequences specialized-arrays
strings ui ui.backend ui.clipboards ui.event-loop ui.gadgets
ui.gadgets.private ui.gadgets.worlds ui.gestures ui.pixel-formats
ui.pixel-formats.private ui.private x11 x11.clipboard x11.constants
x11.events x11.glx x11.io x11.windows x11.xim x11.xlib ;
FROM: unix.ffi => system ;
SPECIALIZED-ARRAY: uchar
IN: ui.backend.x11

SINGLETON: x11-ui-backend

: XA_NET_WM_NAME ( -- atom ) "_NET_WM_NAME" x-atom ;

TUPLE: x11-handle-base glx ;
TUPLE: x11-handle < x11-handle-base window xic ;

    handle>> window>> swap
    [ dpy get ] 2dip [ set-title-old ] [ set-title-new ] 3bi ;

: make-fullscreen-msg ( window ? -- msg )
    XClientMessageEvent <struct>
        ClientMessage >>type
        dpy get >>display
        XA_NET_WM_STATE >>message_type
        swap _NET_WM_STATE_ADD _NET_WM_STATE_REMOVE ? >>data0
        swap >>window
        32 >>format
        XA_NET_WM_STATE_FULLSCREEN >>data1 ;

: send-event ( event -- )
    [
        dpy get
        root get
        0
        SubstructureNotifyMask SubstructureRedirectMask bitor
    ] dip XSendEvent drop ;

M: x11-ui-backend (set-fullscreen) ( world ? -- )
    [ handle>> window>> ] dip make-fullscreen-msg send-event ;

M: x11-ui-backend (open-window) ( world -- )
    dup gadget-window handle>> window>>
    [ set-closable ]
    [ [ dpy get ] dip set-class ]
    [ map-window ]
    tri ;

: make-raise-window-msg ( window -- msg )
    XClientMessageEvent <struct>
        ClientMessage >>type
        1 >>send_event
        dpy get >>display
        swap >>window
        XA_NET_ACTIVE_WINDOW >>message_type
        32 >>format ;

: raise-window-new ( window -- )
    make-raise-window-msg send-event ;

: raise-window-old ( window -- )
    [ dpy get ] dip
    [ RevertToPointerRoot CurrentTime XSetInputFocus drop ]
    [ XRaiseWindow drop ]
    2bi ;

M: x11-ui-backend raise-window* ( world -- )
    handle>> [
        window>>
        XA_NET_ACTIVE_WINDOW net-wm-hint-supported?
        [ raise-window-new ] [ raise-window-old ] if
    ] when* ;

M: x11-handle select-gl-context ( handle -- )
