From 37e18b784e17e5b0dbbc0f0c4481e0e042f5d483 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 21 Mar 2024 07:15:44 -0400 Subject: [PATCH] gtk-demo: Add a callback cursor Make one of the GTK logo cursors in the cursors demo use a callback cursor that follows the cursor theme size, to show that that is possible. --- demos/gtk-demo/cursors.c | 46 ++++++++++ demos/gtk-demo/cursors.ui | 11 +-- demos/gtk-demo/demo.gresource.xml | 1 + demos/gtk-demo/gtk-logo.svg | 138 ++++++++++++++++++++++++++++++ 4 files changed, 188 insertions(+), 8 deletions(-) create mode 100644 demos/gtk-demo/gtk-logo.svg diff --git a/demos/gtk-demo/cursors.c b/demos/gtk-demo/cursors.c index 209dfd9b58..572dfb9a15 100644 --- a/demos/gtk-demo/cursors.c +++ b/demos/gtk-demo/cursors.c @@ -15,12 +15,54 @@ on_destroy (gpointer data) window = NULL; } +static GdkTexture * +cursor_callback (GdkCursor *cursor, + int cursor_size, + double scale, + int *width, + int *height, + int *hotspot_x, + int *hotspot_y, + gpointer data) +{ + GdkPixbuf *pixbuf; + GdkTexture *texture; + GError *error = NULL; + int scaled_size; + + scaled_size = ceil (cursor_size * scale); + + pixbuf = gdk_pixbuf_new_from_resource_at_scale ("/cursors/images/gtk-logo.svg", + scaled_size, scaled_size, + TRUE, + &error); + if (!pixbuf) + { + g_print ("%s\n", error->message); + g_error_free (error); + return NULL; + } + + texture = gdk_texture_new_for_pixbuf (pixbuf); + + g_object_unref (pixbuf); + + *width = cursor_size; + *height = cursor_size; + *hotspot_x = 18 * cursor_size / 32.0; + *hotspot_y = 2 * cursor_size / 32.0; + + return texture; +} + GtkWidget * do_cursors (GtkWidget *do_widget) { if (!window) { GtkBuilder *builder; + GtkWidget *logo_callback; + GdkCursor *cursor; builder = gtk_builder_new_from_resource ("/cursors/cursors.ui"); window = GTK_WIDGET (gtk_builder_get_object (builder, "window")); @@ -29,6 +71,10 @@ do_cursors (GtkWidget *do_widget) gtk_widget_get_display (do_widget)); g_signal_connect (window, "destroy", G_CALLBACK (on_destroy), NULL); + logo_callback = GTK_WIDGET (gtk_builder_get_object (builder, "logo_callback")); + cursor = gdk_cursor_new_from_callback (cursor_callback, NULL, NULL, NULL); + gtk_widget_set_cursor (logo_callback, cursor); + g_object_unref (cursor); g_object_unref (builder); } diff --git a/demos/gtk-demo/cursors.ui b/demos/gtk-demo/cursors.ui index 45e75724a3..dbcf2ad2dc 100644 --- a/demos/gtk-demo/cursors.ui +++ b/demos/gtk-demo/cursors.ui @@ -40,10 +40,6 @@ 18 2 - - gtk-logo - gtk-logo_cursor_image - resource:///cursors/images/gtk_logo_cursor.png 18 @@ -827,15 +823,14 @@ 32 32 gtk-logo_cursor_image - An image cursor + An image cursor for the GTK logo - + 32 32 - gtk-logo_cursor_fallback - The "gtk-logo" named cursor falling back to an image cursor + A callback cursor for the GTK logo diff --git a/demos/gtk-demo/demo.gresource.xml b/demos/gtk-demo/demo.gresource.xml index 306ca976c9..2998560b02 100644 --- a/demos/gtk-demo/demo.gresource.xml +++ b/demos/gtk-demo/demo.gresource.xml @@ -116,6 +116,7 @@ w_resize_cursor.png zoom_in_cursor.png zoom_out_cursor.png + gtk-logo.svg dnd.css diff --git a/demos/gtk-demo/gtk-logo.svg b/demos/gtk-demo/gtk-logo.svg new file mode 100644 index 0000000000..9edbe2da97 --- /dev/null +++ b/demos/gtk-demo/gtk-logo.svg @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + +