aboutsummaryrefslogtreecommitdiffstats
path: root/pugl_cairo_test.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2014-08-27 07:09:58 +0000
committerDavid Robillard <d@drobilla.net>2014-08-27 07:09:58 +0000
commitb4dbb3616865cd236cda4f2e4ac806b3b4840b29 (patch)
tree4a78f8298e42b95a074844e44d69a2446cb5eea3 /pugl_cairo_test.c
parentf25f829a3038db39c83ad8cc92dd5fdc4876751b (diff)
downloadpugl-b4dbb3616865cd236cda4f2e4ac806b3b4840b29.tar.gz
pugl-b4dbb3616865cd236cda4f2e4ac806b3b4840b29.tar.bz2
pugl-b4dbb3616865cd236cda4f2e4ac806b3b4840b29.zip
Cairo support on X11.
Diffstat (limited to 'pugl_cairo_test.c')
-rw-r--r--pugl_cairo_test.c167
1 files changed, 167 insertions, 0 deletions
diff --git a/pugl_cairo_test.c b/pugl_cairo_test.c
new file mode 100644
index 0000000..6ff5bd5
--- /dev/null
+++ b/pugl_cairo_test.c
@@ -0,0 +1,167 @@
+/*
+ Copyright 2012-2014 David Robillard <http://drobilla.net>
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted, provided that the above
+ copyright notice and this permission notice appear in all copies.
+
+ THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+
+/**
+ @file pugl_cairo_test.c A simple Pugl test that creates a top-level window.
+*/
+
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <cairo/cairo.h>
+
+#include "pugl/pugl.h"
+
+static int quit = 0;
+
+typedef struct {
+ int x;
+ int y;
+ int w;
+ int h;
+ bool pressed;
+ const char* label;
+} Button;
+
+static Button toggle_button = { 16, 16, 128, 64, false, "Test" };
+
+static void
+roundedBox(cairo_t* cr, double x, double y, double w, double h)
+{
+ static const double radius = 10;
+ static const double degrees = 3.14159265 / 180.0;
+
+ cairo_new_sub_path(cr);
+ cairo_arc(cr,
+ x + w - radius,
+ y + radius,
+ radius, -90 * degrees, 0 * degrees);
+ cairo_arc(cr,
+ x + w - radius, y + h - radius,
+ radius, 0 * degrees, 90 * degrees);
+ cairo_arc(cr,
+ x + radius, y + h - radius,
+ radius, 90 * degrees, 180 * degrees);
+ cairo_arc(cr,
+ x + radius, y + radius,
+ radius, 180 * degrees, 270 * degrees);
+ cairo_close_path(cr);
+}
+
+static void
+drawButton(cairo_t* cr, const Button* but)
+{
+ // Draw base
+ if (but->pressed) {
+ cairo_set_source_rgba(cr, 0.4, 0.9, 0.1, 1);
+ } else {
+ cairo_set_source_rgba(cr, 0.3, 0.5, 0.1, 1);
+ }
+ roundedBox(cr, but->x, but->y, but->w, but->h);
+ cairo_fill_preserve(cr);
+
+ // Draw border
+ cairo_set_source_rgba(cr, 0.4, 0.9, 0.1, 1);
+ cairo_set_line_width(cr, 4.0);
+ cairo_stroke(cr);
+
+ // Draw label
+ cairo_text_extents_t extents;
+ cairo_set_font_size(cr, 32.0);
+ cairo_text_extents(cr, but->label, &extents);
+ cairo_move_to(cr,
+ (but->x + but->w / 2) - extents.width / 2,
+ (but->y + but->h / 2) + extents.height / 2);
+ cairo_set_source_rgba(cr, 0, 0, 0, 1);
+ cairo_show_text(cr, but->label);
+}
+
+static void
+onDisplay(PuglView* view)
+{
+ cairo_t* cr = puglGetContext(view);
+
+ drawButton(cr, &toggle_button);
+}
+
+static void
+onKeyboard(PuglView* view, bool press, uint32_t key)
+{
+ if (key == 'q' || key == 'Q' || key == PUGL_CHAR_ESCAPE) {
+ quit = 1;
+ }
+}
+
+static void
+onMouse(PuglView* view, int button, bool press, int x, int y)
+{
+ if (press &&
+ x >= toggle_button.x && x <= toggle_button.x + toggle_button.w &&
+ y >= toggle_button.y && y <= toggle_button.y + toggle_button.h) {
+ toggle_button.pressed = !toggle_button.pressed;
+ puglPostRedisplay(view);
+ }
+}
+
+static void
+onClose(PuglView* view)
+{
+ quit = 1;
+}
+
+int
+main(int argc, char** argv)
+{
+ bool ignoreKeyRepeat = false;
+ bool resizable = false;
+ for (int i = 1; i < argc; ++i) {
+ if (!strcmp(argv[i], "-h")) {
+ printf("USAGE: %s [OPTIONS]...\n\n"
+ " -h Display this help\n"
+ " -i Ignore key repeat\n"
+ " -r Resizable window\n", argv[0]);
+ return 0;
+ } else if (!strcmp(argv[i], "-i")) {
+ ignoreKeyRepeat = true;
+ } else if (!strcmp(argv[i], "-r")) {
+ resizable = true;
+ } else {
+ fprintf(stderr, "Unknown option: %s\n", argv[i]);
+ }
+ }
+
+ PuglView* view = puglInit(NULL, NULL);
+ puglInitWindowSize(view, 512, 512);
+ puglInitResizable(view, resizable);
+ puglInitContextType(view, PUGL_CAIRO);
+
+ puglIgnoreKeyRepeat(view, ignoreKeyRepeat);
+ puglSetKeyboardFunc(view, onKeyboard);
+ puglSetMouseFunc(view, onMouse);
+ puglSetDisplayFunc(view, onDisplay);
+ puglSetCloseFunc(view, onClose);
+
+ puglCreateWindow(view, "Pugl Test");
+ puglShowWindow(view);
+
+ while (!quit) {
+ puglProcessEvents(view);
+ }
+
+ puglDestroy(view);
+ return 0;
+}