diff options
Diffstat (limited to 'examples/viewer-x.c')
-rw-r--r-- | examples/viewer-x.c | 229 |
1 files changed, 151 insertions, 78 deletions
diff --git a/examples/viewer-x.c b/examples/viewer-x.c index 7327ab7f..772dd719 100644 --- a/examples/viewer-x.c +++ b/examples/viewer-x.c @@ -1,4 +1,4 @@ -/* viewer-x.c: Common code X-based rendering demos +/* viewer-x.c: Common code for X-based viewers * * Copyright (C) 1999,2004,2005 Red Hat, Inc. * Copyright (C) 2001 Sun Microsystems @@ -19,36 +19,81 @@ * Boston, MA 02111-1307, USA. */ #include <config.h> -#include <errno.h> -#include <stdlib.h> -#include <stdio.h> #include <string.h> -#include "viewer-x.h" #include "renderdemo.h" +#include "viewer-x.h" + +void +x_view_init (gpointer instance, + const PangoViewer *klass) +{ + XViewer *x = (XViewer *)instance; + + x->display = XOpenDisplay (NULL); + if (!x->display) + fail ("Cannot open display %s\n", XDisplayName (NULL)); + + x->screen = DefaultScreen (x->display); +} + +gpointer +x_view_create (const PangoViewer *klass) +{ + XViewer *instance; + + instance = g_slice_new (XViewer); + + x_view_init (instance, klass); + + return instance; +} -/* initialized by main() */ -static Display *display; -static int screen; -static Window window; -static Pixmap pixmap; +void +x_view_destroy (gpointer instance) +{ + XViewer *x = (XViewer *)instance; + + XCloseDisplay (x->display); + + g_slice_free (XViewer, instance); +} + +gpointer +x_view_create_surface (gpointer instance, + int width, + int height) +{ + XViewer *x = (XViewer *) instance; + Pixmap pixmap; + + pixmap = XCreatePixmap (x->display, DefaultRootWindow (x->display), width, height, + DefaultDepth (x->display, x->screen)); -/* initialized by do_init() */ -static PangoContext *context; -static int width, height; + return (gpointer) pixmap; +} + +void +x_view_destroy_surface (gpointer instance, + gpointer surface) +{ + XViewer *x = (XViewer *) instance; + Pixmap pixmap = (Pixmap) surface; -/* runtime stuff */ -static Region update_region = NULL; -static gboolean show_borders; + XFreePixmap (x->display, pixmap); +} static void -update (void) +update (Display *display, + Pixmap pixmap, + Window window, + Region *update_region) { GC gc; XRectangle extents; int width, height; - XClipBox (update_region, &extents); + XClipBox (*update_region, &extents); width = extents.width; height = extents.height; @@ -62,111 +107,139 @@ update (void) XFreeGC (display, gc); - XDestroyRegion (update_region); - update_region = NULL; + XDestroyRegion (*update_region); + *update_region = NULL; } static void -expose (XExposeEvent *xev) +expose (XExposeEvent *xev, + Region *update_region) { XRectangle r; - if (!update_region) - update_region = XCreateRegion (); + if (!*update_region) + *update_region = XCreateRegion (); r.x = xev->x; r.y = xev->y; r.width = xev->width; r.height = xev->height; - XUnionRectWithRegion (&r, update_region, update_region); + XUnionRectWithRegion (&r, *update_region, *update_region); } -int -main (int argc, char **argv) +gpointer +x_view_create_window (gpointer instance, + const char *title, + int width, + int height) { - XEvent xev; + XViewer *x = (XViewer *) instance; unsigned long bg; + Window window; XSizeHints size_hints; - unsigned int quit_keycode; - unsigned int borders_keycode; - const char *title; - - g_type_init(); - parse_options (argc, argv); - - display = XOpenDisplay (NULL); - if (!display) - fail ("Cannot open display %s\n", XDisplayName (NULL)); - screen = DefaultScreen (display); - - do_init (display, screen, opt_dpi, &context, &width, &height); - - bg = WhitePixel (display, screen); - window = XCreateSimpleWindow (display, DefaultRootWindow (display), + bg = WhitePixel (x->display, x->screen); + window = XCreateSimpleWindow (x->display, DefaultRootWindow (x->display), 0, 0, width, height, 0, bg, bg); - pixmap = XCreatePixmap (display, window, width, height, - DefaultDepth (display, screen)); - XSelectInput (display, window, ExposureMask | KeyPressMask); + + XSelectInput (x->display, window, ExposureMask | KeyPressMask); - XMapWindow (display, window); - title = get_options_string (); - XmbSetWMProperties (display, window, + XMapWindow (x->display, window); + XmbSetWMProperties (x->display, window, title, NULL, NULL, 0, NULL, NULL, NULL); - g_free (title); memset ((char *)&size_hints, 0, sizeof (XSizeHints)); size_hints.flags = PSize | PMaxSize; size_hints.width = width; size_hints.height = height; /* for compat only */ size_hints.max_width = width; size_hints.max_height = height; - XSetWMNormalHints (display, window, &size_hints); + XSetWMNormalHints (x->display, window, &size_hints); - borders_keycode = XKeysymToKeycode(display, 'B'); - quit_keycode = XKeysymToKeycode(display, 'Q'); + return (gpointer) window; +} + +void +x_view_destroy_window (gpointer instance, + gpointer window) +{ + XViewer *x = (XViewer *) instance; + Window win = (Window) window; - do_render (display, screen, window, pixmap, context, width, height, show_borders); + XDestroyWindow (x->display, win); +} + +gpointer +x_view_display (gpointer instance, + gpointer surface, + gpointer win, + int width, + int height, + gpointer state) +{ + XViewer *x = (XViewer *) instance; + Pixmap pixmap = (Pixmap) surface; + Window window = (Window) win; + XEvent xev; + XRectangle r; + Region update_region; + unsigned int quit_keycode; + unsigned int borders_keycode; + gboolean show_borders = FALSE; + + if (state) + show_borders = GPOINTER_TO_UINT (state) == 0xdeadbeef; + + /* force a full redraw */ + update_region = XCreateRegion (); + r.x = 0; + r.y = 0; + r.width = width; + r.height = height; + XUnionRectWithRegion (&r, update_region, update_region); + + borders_keycode = XKeysymToKeycode(x->display, 'B'); + quit_keycode = XKeysymToKeycode(x->display, 'Q'); while (1) { - if (!XPending (display) && update_region) - update (); + if (!XPending (x->display) && update_region) + update (x->display, pixmap, window, &update_region); - XNextEvent (display, &xev); + XNextEvent (x->display, &xev); switch (xev.xany.type) { case KeyPress: if (xev.xkey.keycode == quit_keycode) - goto done; + return NULL; else if (xev.xkey.keycode == borders_keycode) { - XRectangle r; show_borders = !show_borders; - do_render (display, screen, window, pixmap, context, width, height, show_borders); - - if (!update_region) - update_region = XCreateRegion (); - - r.x = 0; - r.y = 0; - r.width = width; - r.height = height; - XUnionRectWithRegion (&r, update_region, update_region); + return GUINT_TO_POINTER (show_borders ? 0xdeadbeef : 0xbe); } break; case Expose: - expose (&xev.xexpose); + expose (&xev.xexpose, &update_region); break; } } - -done: - - g_object_unref (context); - XFreePixmap (display, pixmap); - finalize (); - - return 0; } + +const PangoViewer x_viewer = { + "X", + NULL, + NULL, + x_view_create, + x_view_destroy, + NULL, + x_view_create_surface, + x_view_destroy_surface, + NULL, + NULL, + x_view_create_window, + x_view_destroy_window, + x_view_display +}; + +const PangoViewer *fallback_viewer = &x_viewer; |