summaryrefslogtreecommitdiff
path: root/examples/viewer-x.c
diff options
context:
space:
mode:
Diffstat (limited to 'examples/viewer-x.c')
-rw-r--r--examples/viewer-x.c229
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;