aboutsummaryrefslogtreecommitdiff
path: root/demos
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2021-03-24 22:58:07 +0800
committercrupest <crupest@outlook.com>2021-03-24 22:58:07 +0800
commitba43736c55ad510942e9e83ca0c8bea7265cf055 (patch)
treea27a804ea3b95dbe33dde47568fe23b7f98439f6 /demos
parent7f15a1ff9a2007e119798053083a0a87d042990a (diff)
downloadcru-ba43736c55ad510942e9e83ca0c8bea7265cf055.tar.gz
cru-ba43736c55ad510942e9e83ca0c8bea7265cf055.tar.bz2
cru-ba43736c55ad510942e9e83ca0c8bea7265cf055.zip
...
Diffstat (limited to 'demos')
-rw-r--r--demos/CMakeLists.txt10
-rw-r--r--demos/xcb/CMakeLists.txt7
-rw-r--r--demos/xcb/cairo-start/CMakeLists.txt4
-rw-r--r--demos/xcb/cairo-start/main.cpp98
-rw-r--r--demos/xcb/start/CMakeLists.txt2
-rw-r--r--demos/xcb/start/main.cpp23
6 files changed, 142 insertions, 2 deletions
diff --git a/demos/CMakeLists.txt b/demos/CMakeLists.txt
index 16159d08..cf27d408 100644
--- a/demos/CMakeLists.txt
+++ b/demos/CMakeLists.txt
@@ -4,5 +4,11 @@ if(WIN32)
target_link_libraries(cru_demo_base INTERFACE cru_win_gui)
endif()
-add_subdirectory(main)
-add_subdirectory(input_method)
+if(WIN32) # Currently only enable tests on Windows.
+ add_subdirectory(main)
+ add_subdirectory(input_method)
+endif()
+
+if(UNIX)
+ add_subdirectory(xcb)
+endif()
diff --git a/demos/xcb/CMakeLists.txt b/demos/xcb/CMakeLists.txt
new file mode 100644
index 00000000..97292467
--- /dev/null
+++ b/demos/xcb/CMakeLists.txt
@@ -0,0 +1,7 @@
+find_library(LIBRARY_XCB xcb REQUIRED)
+
+add_library(demo-xcb-base INTERFACE)
+target_link_libraries(demo-xcb-base INTERFACE ${LIBRARY_XCB})
+
+add_subdirectory(start)
+add_subdirectory(cairo-start)
diff --git a/demos/xcb/cairo-start/CMakeLists.txt b/demos/xcb/cairo-start/CMakeLists.txt
new file mode 100644
index 00000000..d08f2c96
--- /dev/null
+++ b/demos/xcb/cairo-start/CMakeLists.txt
@@ -0,0 +1,4 @@
+find_library(LIBRARY_CAIRO cairo REQUIRED)
+
+add_executable(demo-xcb-cairo-start main.cpp)
+target_link_libraries(demo-xcb-cairo-start PUBLIC demo-xcb-base ${LIBRARY_CAIRO})
diff --git a/demos/xcb/cairo-start/main.cpp b/demos/xcb/cairo-start/main.cpp
new file mode 100644
index 00000000..331f90d7
--- /dev/null
+++ b/demos/xcb/cairo-start/main.cpp
@@ -0,0 +1,98 @@
+#include <cairo/cairo-xcb.h>
+#include <cairo/cairo.h>
+#include <unistd.h>
+#include <xcb/xcb.h>
+#include <cstdlib>
+#include <iostream>
+
+int main() {
+ int screen_num;
+ xcb_connection_t *connection = xcb_connect(NULL, &screen_num);
+ const xcb_setup_t *setup = xcb_get_setup(connection);
+ xcb_screen_iterator_t iter = xcb_setup_roots_iterator(setup);
+ xcb_screen_t *screen = iter.data;
+
+ uint32_t mask = XCB_CW_EVENT_MASK;
+ uint32_t data[] = {XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY};
+
+ int width = 500;
+ int height = 500;
+
+ xcb_window_t window = xcb_generate_id(connection);
+ xcb_create_window(connection, XCB_COPY_FROM_PARENT, window, screen->root, 0,
+ 0, width, height, 10, XCB_WINDOW_CLASS_INPUT_OUTPUT,
+ screen->root_visual, mask, data);
+ xcb_map_window(connection, window);
+ xcb_flush(connection);
+
+ xcb_visualtype_t *visual_type;
+
+ for (xcb_depth_iterator_t depth_iter =
+ xcb_screen_allowed_depths_iterator(screen);
+ depth_iter.rem; xcb_depth_next(&depth_iter)) {
+ for (xcb_visualtype_iterator_t visual_iter =
+ xcb_depth_visuals_iterator(depth_iter.data);
+ visual_iter.rem; xcb_visualtype_next(&visual_iter)) {
+ if (screen->root_visual == visual_iter.data->visual_id) {
+ visual_type = visual_iter.data;
+ break;
+ }
+ }
+ }
+
+ cairo_surface_t *surface =
+ cairo_xcb_surface_create(connection, window, visual_type, width, height);
+
+ cairo_t *cairo = cairo_create(surface);
+
+ xcb_generic_event_t *e;
+
+ auto paint = [](cairo_t *cairo, int width, int height) {
+ cairo_set_source_rgb(cairo, 1, 1, 1);
+ cairo_paint(cairo);
+ cairo_set_source_rgb(cairo, 1, 1, 0);
+ cairo_set_line_width(cairo, 5);
+ cairo_move_to(cairo, width / 2.0, 0);
+ cairo_curve_to(cairo, width, 0, width, 0, width, height / 2.0);
+ cairo_curve_to(cairo, width, height, width, height, width / 2.0, height);
+ cairo_curve_to(cairo, 0, height, 0, height, 0, height / 2.0);
+ cairo_curve_to(cairo, 0, 0, 0, 0, width / 2.0, 0);
+ cairo_stroke(cairo);
+ };
+
+ while ((e = xcb_wait_for_event(connection))) {
+ switch (e->response_type & ~0x80) {
+ case XCB_EXPOSE: {
+ paint(cairo, width, height);
+ break;
+ }
+ case XCB_CONFIGURE_NOTIFY: {
+ xcb_configure_notify_event_t *event =
+ reinterpret_cast<xcb_configure_notify_event_t *>(e);
+
+ width = event->width;
+ height = event->height;
+
+ cairo_xcb_surface_set_size(surface, width, height);
+
+ paint(cairo, width, height);
+
+ break;
+ }
+ default: {
+ /* Unknown event type, ignore it */
+ break;
+ }
+ }
+ /* Free the Generic Event */
+ free(e);
+ }
+
+ pause();
+
+ cairo_destroy(cairo);
+ cairo_surface_destroy(surface);
+ xcb_disconnect(connection);
+
+ return 0;
+}
diff --git a/demos/xcb/start/CMakeLists.txt b/demos/xcb/start/CMakeLists.txt
new file mode 100644
index 00000000..25e37be9
--- /dev/null
+++ b/demos/xcb/start/CMakeLists.txt
@@ -0,0 +1,2 @@
+add_executable(demo-xcb-start main.cpp)
+target_link_libraries(demo-xcb-start PUBLIC demo-xcb-base)
diff --git a/demos/xcb/start/main.cpp b/demos/xcb/start/main.cpp
new file mode 100644
index 00000000..c4e3761e
--- /dev/null
+++ b/demos/xcb/start/main.cpp
@@ -0,0 +1,23 @@
+#include <unistd.h>
+#include <xcb/xcb.h>
+
+int main() {
+ int screen_num;
+ xcb_connection_t* connection = xcb_connect(NULL, &screen_num);
+ const xcb_setup_t* setup = xcb_get_setup(connection);
+ xcb_screen_iterator_t iter = xcb_setup_roots_iterator(setup);
+ xcb_screen_t* screen = iter.data;
+
+ xcb_window_t window = xcb_generate_id(connection);
+ xcb_create_window(connection, XCB_COPY_FROM_PARENT, window, screen->root, 0,
+ 0, 150, 150, 10, XCB_WINDOW_CLASS_INPUT_OUTPUT,
+ screen->root_visual, 0, NULL);
+ xcb_map_window(connection, window);
+ xcb_flush(connection);
+
+ pause();
+
+ xcb_disconnect(connection);
+
+ return 0;
+}