mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2025-12-20 17:30:07 +01:00
XCreateWindow dies if asked to create a 0x0 window, so don't and use a 1x1 pixel window for a zero-sized surface.
97 lines
2.2 KiB
C
97 lines
2.2 KiB
C
#include <cairo.h>
|
|
#include <cairo-script-interpreter.h>
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
static const cairo_user_data_key_t _key;
|
|
|
|
#if CAIRO_HAS_XLIB_XRENDER_SURFACE
|
|
#include <cairo-xlib.h>
|
|
#include <cairo-xlib-xrender.h>
|
|
|
|
static Display *
|
|
_get_display (void)
|
|
{
|
|
static Display *dpy;
|
|
|
|
if (dpy != NULL)
|
|
return dpy;
|
|
|
|
dpy = XOpenDisplay (NULL);
|
|
if (dpy == NULL) {
|
|
fprintf (stderr, "Failed to open display.\n");
|
|
exit (1);
|
|
}
|
|
|
|
return dpy;
|
|
}
|
|
|
|
static void
|
|
_destroy_window (void *closure)
|
|
{
|
|
XFlush (_get_display ());
|
|
XDestroyWindow (_get_display(), (Window) closure);
|
|
}
|
|
|
|
static cairo_surface_t *
|
|
_surface_create (void *closure,
|
|
double width, double height)
|
|
{
|
|
Display *dpy;
|
|
Visual *visual;
|
|
XRenderPictFormat *xrender_format;
|
|
XSetWindowAttributes attr;
|
|
Window w;
|
|
cairo_surface_t *surface;
|
|
|
|
dpy = _get_display ();
|
|
|
|
visual = DefaultVisual (dpy, DefaultScreen (dpy));
|
|
xrender_format = XRenderFindVisualFormat (dpy, visual);
|
|
if (xrender_format == NULL) {
|
|
fprintf (stderr, "X server does not have the Render extension.\n");
|
|
exit (1);
|
|
}
|
|
|
|
attr.override_redirect = True;
|
|
w = XCreateWindow (dpy, DefaultRootWindow (dpy), 0, 0,
|
|
width <= 0 ? 1 : width,
|
|
height <= 0 ? 1 : height,
|
|
0, xrender_format->depth,
|
|
InputOutput, visual, CWOverrideRedirect, &attr);
|
|
XMapWindow (dpy, w);
|
|
|
|
surface = cairo_xlib_surface_create_with_xrender_format (dpy, w,
|
|
DefaultScreenOfDisplay (dpy),
|
|
xrender_format,
|
|
width, height);
|
|
cairo_surface_set_user_data (surface, &_key, (void *) w, _destroy_window);
|
|
|
|
return surface;
|
|
}
|
|
#else
|
|
/* fallback: just use an image surface */
|
|
static cairo_surface_t *
|
|
_surface_create (void *closure,
|
|
double width, double height)
|
|
{
|
|
return cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
|
|
}
|
|
#endif
|
|
|
|
int
|
|
main (int argc, char **argv)
|
|
{
|
|
cairo_script_interpreter_t *csi;
|
|
const cairo_script_interpreter_hooks_t hooks = {
|
|
.surface_create = _surface_create
|
|
};
|
|
int i;
|
|
|
|
csi = cairo_script_interpreter_create ();
|
|
cairo_script_interpreter_install_hooks (csi, &hooks);
|
|
for (i = 1; i < argc; i++)
|
|
cairo_script_interpreter_run (csi, argv[i]);
|
|
return cairo_script_interpreter_destroy (csi);
|
|
}
|