gui/gui-lib/mred/private/wx/gtk/x11.rkt
Matthew Flatt 9058a148f8 another try at fixing graphics for GTK+ 3
The `gdk_window_ensure_native` call for window freeze and thaw
really is needed, but since it is incompatible with transparent
canvases, don't use freeze and thaw at all for those.

Meanwhile, repair the backing bitmap for both GTK+ 2 and 3
for a transparent canvas when a scale is in effect. And go
back to using X11 bitmaps for backing a canvas on GTK+ 3;
I'm not sure that's the right choice, but probably putting
the bitmap data on the X server instead of client is the
right thing.

Finally, restore GL bitmap support (partly by using X11 bitmaps
to back a canvas).

GL rendering to a canvas with a backing scale is not yet right,
either for GTK+ 2 or 3.
2015-08-18 09:01:28 -06:00

113 lines
3.5 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_window_get_visual
gdk_drawable_get_visual
gdk_visual_get_best
gdk_screen_get_root_window
gdk_visual_get_depth
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
XFreePixmap
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-gdk gdk_visual_get_best (_fun -> _GdkVisual)
#:make-fail make-not-available)
(define-gdk gdk_window_get_visual (_fun _GdkWindow -> _GdkVisual)
#:make-fail make-not-available)
(define-gdk gdk_visual_get_depth (_fun _GdkVisual -> _int)
#:make-fail make-not-available)
(define-gdk gdk_screen_get_root_window (_fun _GdkScreen -> _GdkWindow))
(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)
#:wrap (deallocator cadr))
(define-x11 XCreatePixmap (_fun _Display _Window _int _int _int -> _Pixmap)
#:wrap (lambda (proc)
(lambda (dpy win w h d)
(((allocator (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)))))))