factor/basis/x11/clipboard/clipboard.factor

77 lines
2.4 KiB
Factor
Raw Normal View History

2010-06-02 02:58:48 -04:00
! Copyright (C) 2006, 2010 Slava Pestov
2007-09-20 18:09:08 -04:00
! See http://factorcode.org/license.txt for BSD license.
USING: accessors alien.c-types alien.data alien.strings
classes.struct io.encodings.utf8 kernel namespaces sequences
specialized-arrays x11 x11.constants x11.xlib ;
SPECIALIZED-ARRAY: int
2007-09-20 18:09:08 -04:00
IN: x11.clipboard
! This code was based on by McCLIM's Backends/CLX/port.lisp
! and http://common-lisp.net/~crhodes/clx/demo/clipboard.lisp.
: XA_CLIPBOARD ( -- atom ) "CLIPBOARD" x-atom ;
: XA_UTF8_STRING ( -- atom ) "UTF8_STRING" x-atom ;
2010-06-02 02:58:48 -04:00
: XA_TARGETS ( -- atom ) "TARGETS" x-atom ;
: XA_TIMESTAMP ( -- atom ) "TIMESTAMP" x-atom ;
: XA_TEXT ( -- atom ) "TEXT" x-atom ;
2007-09-20 18:09:08 -04:00
TUPLE: x-clipboard atom contents ;
: <x-clipboard> ( atom -- clipboard )
"" x-clipboard boa ;
2007-09-20 18:09:08 -04:00
: selection-property ( -- n )
"org.factorcode.Factor.SELECTION" x-atom ;
: convert-selection ( win selection -- )
2008-12-15 21:34:57 -05:00
swap [ [ dpy get ] dip XA_UTF8_STRING selection-property ] dip
2007-09-20 18:09:08 -04:00
CurrentTime XConvertSelection drop ;
: snarf-property ( prop-return -- string )
2010-10-25 14:22:50 -04:00
dup void* deref [ void* deref utf8 alien>string ] [ drop f ] if ;
2007-09-20 18:09:08 -04:00
: window-property ( win prop delete? -- string )
2008-12-15 21:34:57 -05:00
[ [ dpy get ] 2dip 0 -1 ] dip AnyPropertyType
0 Atom <ref> 0 int <ref> 0 ulong <ref> 0 ulong <ref> f void* <ref>
2007-09-20 18:09:08 -04:00
[ XGetWindowProperty drop ] keep snarf-property ;
: selection-from-event ( event window -- string )
swap property>> 0 =
[ drop f ] [ selection-property 1 window-property ] if ;
2007-09-20 18:09:08 -04:00
: own-selection ( prop win -- )
2009-01-23 19:20:47 -05:00
[ dpy get ] 2dip CurrentTime XSetSelectionOwner drop
2007-09-20 18:09:08 -04:00
flush-dpy ;
: set-targets-prop ( evt -- )
[ dpy get ] dip [ requestor>> ] [ property>> ] bi
2010-06-02 02:58:48 -04:00
XA_TARGETS 32 PropModeReplace
XA_UTF8_STRING XA_STRING XA_TARGETS XA_TIMESTAMP int-array{ } 4sequence
2007-09-20 18:09:08 -04:00
4 XChangeProperty drop ;
: set-timestamp-prop ( evt -- )
[ dpy get ] dip
[ requestor>> ]
2010-06-02 02:58:48 -04:00
[ property>> XA_TIMESTAMP 32 PropModeReplace ]
2010-10-20 18:42:53 -04:00
[ time>> int <ref> ] tri
2007-09-20 18:09:08 -04:00
1 XChangeProperty drop ;
: send-notify ( evt prop -- )
XSelectionEvent <struct>
SelectionNotify >>type
swap >>property
over display>> >>display
over requestor>> >>requestor
over selection>> >>selection
over target>> >>target
over time>> >>time
[ [ dpy get ] dip requestor>> 0 0 ] dip
2007-09-20 18:09:08 -04:00
XSendEvent drop
flush-dpy ;
: send-notify-success ( evt -- )
dup property>> send-notify ;
2007-09-20 18:09:08 -04:00
: send-notify-failure ( evt -- )
0 send-notify ;