
The main advantage of GTK+ 3 is better support for HiDPI displays. If GTK+ 3 libraries are not available or if the `PLT_GTK2` environment variable is defined, GTK+ 2 is used as before.
98 lines
3.0 KiB
Racket
98 lines
3.0 KiB
Racket
#lang racket/base
|
|
(require ffi/unsafe
|
|
ffi/unsafe/define
|
|
ffi/unsafe/alloc
|
|
"utils.rkt")
|
|
|
|
(provide
|
|
(protect-out define-x11
|
|
|
|
gdk_pixmap_new
|
|
gdk_window_get_display
|
|
gdk_drawable_get_display
|
|
gdk_drawable_get_visual
|
|
gdk_x11_drawable_get_xid
|
|
gdk_x11_display_get_xdisplay
|
|
gdk_x11_visual_get_xvisual
|
|
gdk_x11_screen_get_screen_number
|
|
gdk_x11_window_get_xid
|
|
|
|
_Display
|
|
_Window
|
|
_Pixmap
|
|
XCreatePixmap
|
|
XCreateSimpleWindow
|
|
XDestroyWindow))
|
|
|
|
(define x11-lib (ffi-lib "libX11" '("6" "5" "")))
|
|
|
|
(define-ffi-definer define-x11 x11-lib
|
|
#:default-make-fail make-not-available)
|
|
|
|
(define _GdkDrawable _pointer)
|
|
(define _GdkDisplay (_cpointer 'GdkDisplay))
|
|
(define _GdkWindow (_cpointer 'GdkWindow))
|
|
(define _GdkScreen (_cpointer 'GdkScreen))
|
|
(define _GdkVisual (_cpointer 'GdkVisual))
|
|
(define _GdkPixmap (_cpointer 'GdkPixmap))
|
|
(define _Visual (_cpointer 'Visual))
|
|
(define _Display (_cpointer 'Display))
|
|
(define _Drawable _ulong)
|
|
|
|
;; This should be `_ulong`, but we use pointers for various
|
|
;; reasons, including support for dealloctaors:
|
|
(define _Window (_cpointer 'Window))
|
|
(define _Pixmap (_cpointer 'Pixmap))
|
|
|
|
(define-gdk gdk_pixmap_new (_fun _GdkDrawable _int _int _int -> _GdkPixmap)
|
|
#:wrap (allocator gobject-unref)
|
|
#:make-fail make-not-available)
|
|
|
|
(define-gdk gdk_drawable_get_display (_fun _GdkDrawable -> _GdkDisplay)
|
|
#:make-fail make-not-available)
|
|
(define-gdk gdk_window_get_display (_fun _GdkWindow -> _GdkDisplay)
|
|
#:make-fail make-not-available)
|
|
(define-gdk gdk_drawable_get_visual (_fun _GdkDrawable -> _GdkVisual)
|
|
#:make-fail make-not-available)
|
|
|
|
(define-gtk gdk_x11_window_get_xid (_fun _GdkWindow -> _Window)
|
|
#:make-fail make-not-available)
|
|
(define-gdk gdk_x11_drawable_get_xid (_fun _GdkDrawable -> _Drawable)
|
|
#:fail (lambda () (lambda (d)
|
|
(cast
|
|
(gdk_x11_window_get_xid (cast d _GdkDrawable _GdkWindow))
|
|
_pointer
|
|
_ulong))))
|
|
|
|
(define-gdk gdk_x11_display_get_xdisplay (_fun _GdkDisplay -> _Display)
|
|
#:make-fail make-not-available)
|
|
|
|
(define-gdk gdk_x11_visual_get_xvisual (_fun _GdkVisual -> _Visual)
|
|
#:make-fail make-not-available)
|
|
|
|
(define-gdk gdk_x11_screen_get_screen_number (_fun _GdkScreen -> _int)
|
|
#:make-fail make-not-available)
|
|
|
|
(define-x11 XFreePixmap (_fun _Display _Pixmap -> _void))
|
|
(define-x11 XCreatePixmap (_fun _Display _Window _int _int _int -> _Pixmap)
|
|
#:wrap (lambda (proc)
|
|
(lambda (dpy win w h d)
|
|
(((allocator ((deallocator)
|
|
(lambda (pixmap)
|
|
(XFreePixmap dpy pixmap))))
|
|
(lambda ()
|
|
(proc dpy win w h d)))))))
|
|
(define-x11 XDestroyWindow (_fun _Display _Window -> _void)
|
|
#:wrap (deallocator cadr))
|
|
(define-x11 XCreateSimpleWindow (_fun _Display _Window
|
|
_int _int _int _int
|
|
_int _long _long
|
|
-> _Window)
|
|
#:wrap (lambda (proc)
|
|
(lambda (dpy win x y w h bw b bg)
|
|
(((allocator (lambda (win)
|
|
(XDestroyWindow dpy win)))
|
|
(lambda ()
|
|
(proc dpy win x y w h bw b bg)))))))
|
|
|