From b4dbb3616865cd236cda4f2e4ac806b3b4840b29 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Wed, 27 Aug 2014 07:09:58 +0000 Subject: Cairo support on X11. --- pugl_cairo_test.c | 167 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 pugl_cairo_test.c (limited to 'pugl_cairo_test.c') 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 + + 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 +#include +#include + +#include + +#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; +} -- cgit v1.2.3