Skip to content

Instantly share code, notes, and snippets.

@rrika
Last active March 27, 2023 20:57
Show Gist options
  • Save rrika/1a43ad01702c8e88f612f182f219ad2c to your computer and use it in GitHub Desktop.
Save rrika/1a43ad01702c8e88f612f182f219ad2c to your computer and use it in GitHub Desktop.
GSK Demo
// compile with: cc -g `pkg-config --libs --cflags gtk4` -o gsk-demo gsk-demo.c
#include <stdio.h>
#include <gdk/gdk.h>
#include <gsk/gsk.h>
void gtk_init(void);
static const char node[] = "container {\
color {\
color: #d4d0c8;\
}\
border {\
outline: 5 5 40 40;\
colors: #808080 #ffffff #ffffff #808080;\
}\
border {\
outline: 6 6 38 38;\
colors: #ffffff #808080 #808080 #ffffff;\
}\
}";
static gboolean surface_event(GdkSurface *surface, GdkEvent *event, GMainLoop *loop) {
(void) surface;
GdkEventType event_type = gdk_event_get_event_type(event);
if (event_type == GDK_DELETE) {
g_main_loop_quit(loop);
return TRUE;
}
return FALSE;
}
static gboolean surface_render(GdkSurface *surface, cairo_region_t *region, GskRenderer *renderer) {
(void) surface;
GBytes *bytes = g_bytes_new_static(node, sizeof(node));
GskRenderNode *root = gsk_render_node_deserialize(bytes, 0, 0);
gsk_renderer_render(renderer, root, region);
gsk_render_node_unref(root);
return TRUE;
}
static void toplevel_compute_size(GdkToplevel *toplevel, GdkToplevelSize *size, void *userdata) {
(void) toplevel;
(void) userdata;
gdk_toplevel_size_set_size(size, 50, 50);
}
int main(int argc, char const *argv[]) {
(void) argc;
(void) argv;
gtk_init(); // needed to call gdk_event_init_types
GMainLoop *loop = g_main_loop_new(NULL, FALSE);
GdkDisplay *display = gdk_display_open(0);
GdkSurface *surface = gdk_surface_new_toplevel(display);
GskRenderer *renderer = gsk_renderer_new_for_surface(surface);
g_signal_connect(surface, "event", G_CALLBACK (surface_event), /*userdata=*/loop);
g_signal_connect(surface, "render", G_CALLBACK (surface_render), /*userdata=*/renderer);
g_signal_connect(surface, "compute-size", G_CALLBACK (toplevel_compute_size), /*userdata=*/0);
GdkToplevelLayout *layout = gdk_toplevel_layout_new();
gdk_toplevel_layout_set_resizable(layout, FALSE);
gdk_toplevel_present(GDK_TOPLEVEL(surface), layout);
g_main_loop_run(loop);
g_main_loop_unref(loop);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment