scx/scheme/xlib/window.scm

357 lines
13 KiB
Scheme

;; Copyright (c) 2001-2003 by Norbert Freudemann, David Frese
(define-enumerated-type bit-gravity :bit-gravity
bit-gravity? bit-gravities bit-gravity-name bit-gravity-index
(forget north-west north north-east west center east south-west
south south-east static))
(define-exported-binding "scx-bit-gravity" :bit-gravity)
(define-exported-binding "scx-bit-gravities" bit-gravities)
(define-enumerated-type win-gravity :win-gravity
win-gravity? win-gravities win-gravity-name win-gravity-index
(unmap north-west north north-east west center east south-west
south south-east static))
(define-exported-binding "scx-win-gravity" :win-gravity)
(define-exported-binding "scx-win-gravities" win-gravities)
(define-enumerated-type backing-store :backing-store
backing-store? backing-stores backing-store-name backing-store-index
(not-useful when-mapped always))
(define-exported-binding "scx-backing-store" :backing-store)
(define-exported-binding "scx-backing-stores" backing-stores)
(define-enumerated-type set-window-attribute :set-window-attribute
set-window-attribute?
set-window-attributes
set-window-attribute-name
set-window-attribute-index
;; don't change the order of the attributes! background-pixmap can
;; be a pixmap including (special-pixmap:none dpy) and
;; (special-pixmap:parent-relative dpy) border-pixmap can be a
;; pixmap or (special-pixmap:copy-from-parent dpy)
(background-pixmap background-pixel border-pixmap border-pixel
bit-gravity gravity backing-store backing-planes backing-pixel
override-redirect save-under event-mask do-not-propagate-mask colormap
cursor))
(define-exported-binding "scx-set-window-attribute" :set-window-attribute)
(define-syntax make-set-window-attribute-alist
(syntax-rules
()
((make-set-window-attribute-alist (attr arg) rest ...)
(cons (cons (set-window-attribute attr) arg)
(make-set-window-attribute-alist rest ...)))
((make-set-window-attribute-alist)
'())))
;; *** create windows ************************************************
(import-xlib-function create-window
(display parent x y width height border_width depth class visual attribs)
"scx_Create_Window")
(import-xlib-function create-simple-window
(display parent x y width height border_width border background)
"scx_Create_Simple_Window")
;; *** change window attributes **************************************
(import-xlib-function change-window-attributes (display window attribs)
"scx_Change_Window_Attributes")
(define (make-win-attr-setter attribute)
(lambda (display window value)
(change-window-attributes display window (list (cons attribute value)))))
(define set-window-background-pixmap!
(make-win-attr-setter (set-window-attribute background-pixmap)))
(define set-window-background-pixel!
(make-win-attr-setter (set-window-attribute background-pixel)))
(define set-window-border-pixmap!
(make-win-attr-setter (set-window-attribute border-pixmap)))
(define set-window-border-pixel!
(make-win-attr-setter (set-window-attribute border-pixel)))
(define set-window-bit-gravity!
(make-win-attr-setter (set-window-attribute bit-gravity)))
(define set-window-gravity!
(make-win-attr-setter (set-window-attribute gravity)))
(define set-window-backing-store!
(make-win-attr-setter (set-window-attribute backing-store)))
(define set-window-backing-planes!
(make-win-attr-setter (set-window-attribute backing-planes)))
(define set-window-backing-pixel!
(make-win-attr-setter (set-window-attribute backing-pixel)))
(define set-window-save-under!
(make-win-attr-setter (set-window-attribute save-under)))
(define set-window-event-mask!
(make-win-attr-setter (set-window-attribute event-mask)))
(define set-window-do-not-propagate-mask!
(make-win-attr-setter (set-window-attribute do-not-propagate-mask)))
(define set-window-override-redirect!
(make-win-attr-setter (set-window-attribute override-redirect)))
(define set-window-colormap!
(make-win-attr-setter (set-window-attribute colormap)))
(define set-window-cursor!
(make-win-attr-setter (set-window-attribute cursor)))
;; *** configure windows *********************************************
(define-enumerated-type stack-mode :stack-mode
stack-mode? stack-modes stack-mode-name stack-mode-index
(above below top-if buttom-if opposite))
(define-exported-binding "scx-stack-mode" :stack-mode)
(define-exported-binding "scx-stack-modes" stack-modes)
;; an enumerated type for XWindowChange. Used in configure-window
(define-enumerated-type window-change :window-change
window-change? window-changes window-change-name window-change-index
(x y width height border-width sibling stack-mode))
(define-exported-binding "scx-window-change" :window-change)
(define-exported-binding "scx-window-changes" window-changes)
(define-syntax make-window-change-alist
(syntax-rules
()
((make-window-change-alist (attr arg) rest ...)
(cons (cons (window-change attr) arg)
(make-window-change-alist rest ...)))
((make-window-change-alist)
'())))
(import-xlib-function configure-window (display window changes)
"scx_Configure_Window")
(define (make-win-configurer change)
(lambda (display window value)
(configure-window display window (list (cons change value)))))
(define set-window-x! (make-win-configurer (window-change x)))
(define set-window-y! (make-win-configurer (window-change y)))
(define set-window-width! (make-win-configurer (window-change width)))
(define set-window-height! (make-win-configurer (window-change height)))
(define set-window-border-width!
(make-win-configurer (window-change border-width)))
(define set-window-sibling! (make-win-configurer (window-change sibling)))
(define set-window-stack-mode!
(make-win-configurer (window-change stack-mode)))
(define (move-window display window x y)
(configure-window display window
(make-window-change-alist (x x) (y y))))
(define (resize-window display window width height)
(configure-window display window
(make-window-change-alist (width width)
(height height))))
(define (move-resize-window display window x y width height)
(configure-window display window
(make-window-change-alist (x x) (y y)
(width width)
(height height))))
;; *** get current window attribute or geometry **********************
(define-enumerated-type map-state :map-state
map-state? map-states map-state-name map-state-index
(is-unmapped is-unviewable is-viewable))
(define-exported-binding "scx-map-state" :map-state)
(define-exported-binding "scx-map-states" map-states)
(define-enumerated-type window-class :window-class
window-class? window-classes window-class-name window-class-index
(copy-from-parent input-output input-only))
(define-exported-binding "scx-window-class" :window-class)
(define-exported-binding "scx-window-classes" window-classes)
(define-record-type window-attributes :window-attributes
(make-window-attributes x y width height border-width depth visual root
class bit-gravity gravity backing-store
backing-planes backing-pixel save-under
colormap map-installed map-state all-event-masks
your-event-mask do-not-propagate-mask
override-redirect screen)
window-attributes?
(x window-attribute:x)
(y window-attribute:y)
(width window-attribute:width)
(height window-attribute:height)
(border-width window-attribute:border-width)
(depth window-attribute:depth)
(visual window-attribute:visual)
(root window-attribute:root)
(class window-attribute:class)
(bit-gravity window-attribute:bit-gravity)
(gravity window-attribute:gravity)
(backing-store window-attribute:backing-store)
(backing-planes window-attribute:backing-planes)
(backing-pixel window-attribute:backing-pixel)
(save-under window-attribute:save-under)
(colormap window-attribute:colormap)
(map-installed window-attribute:map-installed)
(map-state window-attribute:map-state)
(all-event-masks window-attribute:all-event-masks)
(your-event-mask window-attribute:your-event-mask)
(do-not-propagate-mask window-attribute:do-not-propagate-mask)
(override-redirect window-attribute:override-redirect)
(screen window-attribute:screen))
(define-exported-binding "scx-window-attributes" :window-attributes)
(import-xlib-function get-window-attributes (display window)
"scx_Get_Window_Attributes")
;; returns a vector #(root-window x y width height border-width depth) or #f
(import-xlib-function get-geometry (display drawable)
"scx_Get_Geometry")
(define (make-geometry-getter i)
(lambda (display window)
(let ((a (get-geometry display window)))
(and a (vector-ref a i)))))
;;(define window-root (make-geometry-getter 0))
(define window-x (make-geometry-getter 1))
(define window-y (make-geometry-getter 2))
(define window-width (make-geometry-getter 3))
(define window-height (make-geometry-getter 4))
(define window-border-width (make-geometry-getter 5))
(define window-depth (make-geometry-getter 6))
;; *** map windows ***************************************************
(import-xlib-function map-window (display window)
"scx_Map_Window")
(import-xlib-function map-raised (display window)
"scx_Map_Raised")
(import-xlib-function map-subwindows (display window)
"scx_Map_Subwindows")
;; *** unmap windows *************************************************
(import-xlib-function unmap-window (display window)
"scx_Unmap_Window")
(import-xlib-function unmap-subwindows (display window)
"scx_Unmap_Subwindows")
;; *** destroy windows ***********************************************
(import-xlib-function destroy-window (display window)
"scx_Destroy_Window")
(import-xlib-function destroy-subwindows (display window)
"scx_Destroy_Subwindows")
;; *** change window stacking order **********************************
(import-xlib-function raise-window (display window)
"scx_Raise_Window")
(import-xlib-function lower-window (display window)
"scx_Lower_Window")
(define-enumerated-type circulate-direction :circulate-direction
circulate-direction? circulate-directions circulate-direction-name
circulate-direction-index
(raise-lowest lower-highest))
(define-exported-binding "scx-circulate-direction" :circulate-direction)
(import-xlib-function circulate-subwindows (display window direction)
"scx_Circulate_Subwindows")
(define (circulate-subwindows-up display window)
(circulate-subwindows display window (circulate-direction raise-lowest)))
(define (circulate-subwindows-down display window)
(circulate-subwindows display window (circulate-direction lower-highest)))
(import-xlib-function restack-windows (display windows)
"scx_Restack_Windows")
;; *** clear area or window ******************************************
(import-xlib-function clear-area
(display window x y width height exposures?)
"scx_Clear_Area")
(import-xlib-function clear-window (display window)
"scx_Clear_Window")
;; *** query window tree information *********************************
;; returns a list (root-window parent-window children) or #f
(import-xlib-function query-tree (display window)
"scx_Query_Tree")
(define (window-root display window)
(let ((t (query-tree display window)))
(and t (car t))))
(define (window-parent display window)
(let ((t (query-tree display window)))
(and t (cadr t))))
(define (window-children display window)
(let ((t (query-tree display window)))
(and t (caddr t))))
;; *** translate window coordinates **********************************
;; returns a list (dest-x dest-y child) or #f
(import-xlib-function translate-coordinates
(display src-w dest-w src-x src-y)
"scx_Translate_Coordinates")
;; *** get pointer coordinates ***************************************
(import-xlib-function %query-pointer (display window)
"scx_Query_Pointer")
(define (query-pointer-root display)
(let ((q (%query-pointer display (default-root-window display))))
(and q (list (vector-ref q 0) ;; the root-window that the pointer is on
(vector-ref q 2) ;; x and
(vector-ref q 3))))) ;; y coordinates on that root-window
(define (query-pointer-state display)
(let ((q (%query-pointer display (default-root-window display))))
(and q (vector-ref q 6))))
(define (query-pointer display window)
(let ((q (%query-pointer display window)))
(and q (vector-ref q 7)
(list (vector-ref q 1) ;; child of window that contains
;; the pointer or None
(vector-ref q 4) ;; x and y coordinates
(vector-ref q 5))))) ;; relative to window
;; *** convenience functions *****************************************
(define (window-exists? dpy window)
(display-sync dpy #f)
(let ((before (use-x-error-warnings! dpy #t)))
(let ((result
(call-with-current-continuation
(lambda (return)
(with-handler (lambda (condition punt)
(return #f))
(lambda ()
(query-tree dpy window)
(display-sync dpy #f)
#t))))))
(if (not before) (use-x-error-warnings! dpy #f))
result)))