summaryrefslogtreecommitdiffstatsci
path: root/src/cairo-xcb.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/cairo-xcb.cpp')
-rw-r--r--src/cairo-xcb.cpp82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/cairo-xcb.cpp b/src/cairo-xcb.cpp
new file mode 100644
index 0000000..7a67a54
--- /dev/null
+++ b/src/cairo-xcb.cpp
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2017 © Samsung Research America, Silicon Valley
+ *
+ * Use of this source code is governed by the 3-Clause BSD license
+ * specified in the COPYING file included with this source code.
+ */
+#include <config.h>
+
+#include <err.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#include <cairo.h>
+#include <cairo-xcb.h>
+
+#include "xcb.h"
+#include "device_config.h"
+
+static xcb_state_t *state;
+static cairo_surface_t *cairo_surface;
+
+cairo_surface_t *
+create_cairo_surface_xcb (const device_config_t& config)
+{
+ // TODO: This needs initted to 0
+ state = (xcb_state_t*) malloc (sizeof (xcb_state_t));
+ if (!state) {
+ warnx ("Out of memory\n");
+ return NULL;
+ }
+
+ if (!createXCBContextAndWindow(state, config.width, config.height)) {
+ cleanup_state_xcb(state);
+ errx (-1, "Could not create XCB context and window\n");
+ }
+
+ assert(state->xcb_window >= 0);
+ assert(state->xcb_connection);
+ assert(state->xcb_visual_type);
+
+ // TODO: Do XCB-specific setup and surface creation
+ cairo_surface = cairo_xcb_surface_create(
+ state->xcb_connection, // XCB connection
+ state->xcb_window, // XCB drawable window
+ state->xcb_visual_type, // Visual to use for drawing to window
+ config.width, // Window width
+ config.height); // Window height
+
+ // TODO: Set background, clear colors, etc.
+
+ return cairo_surface;
+}
+
+void
+destroy_cairo_xcb(void)
+{
+ cleanup_state_xcb((void*)state);
+
+ cairo_surface_finish(cairo_surface);
+
+ // TODO: Do I need to destroy the surface here, or higher up? If here, then do I need to track
+ // cairo_surface in state? Uncommented, this causes a ref count fault, so it appears to
+ // already have been destroyed (maybe by _finish?)
+ //cairo_surface_destroy(cairo_surface);
+}
+
+void
+update_cairo_xcb(void)
+{
+ // TODO
+}
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :