[gtk+] gtk3-demo: Add a cursors demo
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] gtk3-demo: Add a cursors demo
- Date: Fri, 8 May 2015 01:30:26 +0000 (UTC)
commit 36006eb91824612cb25031101143fd70be68aa9d
Author: Matthias Clasen <mclasen redhat com>
Date: Thu May 7 20:01:14 2015 -0400
gtk3-demo: Add a cursors demo
demos/gtk-demo/Makefile.am | 1 +
demos/gtk-demo/cursors.c | 221 +++++++++++++++++++++++++++++++++++++
demos/gtk-demo/demo.gresource.xml | 1 +
3 files changed, 223 insertions(+), 0 deletions(-)
---
diff --git a/demos/gtk-demo/Makefile.am b/demos/gtk-demo/Makefile.am
index 183d109..d31e6be 100644
--- a/demos/gtk-demo/Makefile.am
+++ b/demos/gtk-demo/Makefile.am
@@ -17,6 +17,7 @@ demos = \
css_multiplebgs.c \
css_pixbufs.c \
css_shadows.c \
+ cursors.c \
dialog.c \
drawingarea.c \
editable_cells.c \
diff --git a/demos/gtk-demo/cursors.c b/demos/gtk-demo/cursors.c
new file mode 100644
index 0000000..d6046ee
--- /dev/null
+++ b/demos/gtk-demo/cursors.c
@@ -0,0 +1,221 @@
+/* Cursors
+ *
+ * Demonstrates a useful set of available cursors.
+ */
+#include <gtk/gtk.h>
+
+static void
+set_cursor (GtkWidget *button, gpointer data)
+{
+ GtkWidget *toplevel;
+ GdkCursor *cursor = data;
+ GdkWindow *window;
+
+ toplevel = gtk_widget_get_toplevel (button);
+ window = gtk_widget_get_window (toplevel);
+ gdk_window_set_cursor (window, cursor);
+}
+
+static GtkWidget *
+add_section (GtkWidget *box,
+ const gchar *heading)
+{
+ GtkWidget *label;
+ GtkWidget *section;
+
+ label = gtk_label_new (heading);
+ gtk_label_set_xalign (GTK_LABEL (label), 0.0);
+ gtk_widget_set_margin_top (label, 10);
+ gtk_widget_set_margin_bottom (label, 10);
+ gtk_box_pack_start (GTK_BOX (box), label, FALSE, TRUE, 0);
+ section = gtk_flow_box_new ();
+ gtk_widget_set_halign (section, GTK_ALIGN_START);
+ gtk_flow_box_set_selection_mode (GTK_FLOW_BOX (section), GTK_SELECTION_NONE);
+ gtk_flow_box_set_min_children_per_line (GTK_FLOW_BOX (section), 2);
+ gtk_flow_box_set_max_children_per_line (GTK_FLOW_BOX (section), 20);
+ gtk_box_pack_start (GTK_BOX (box), section, FALSE, TRUE, 0);
+
+ return section;
+}
+
+/* Map css cursor names to cursors commonly available in cursor themes */
+static const struct {
+ const char *css_name, *name;
+} name_map[] = {
+ { "default", "left_ptr" },
+ { "none", NULL },
+ { "help", "help" },
+ { "context-menu", "context-menu" },
+ { "pointer", "hand" },
+ { "progress", "left_ptr_watch" },
+ { "wait", "watch" },
+ { "cell", "crosshair" },
+ { "crosshair", "tcross" },
+ { "text", "xterm" },
+ { "vertical-text", "vertical-text" },
+ { "alias", "dnd-link" },
+ { "copy", "dnd-copy" },
+ { "move", "move" },
+ { "no-drop", "dnd-none" },
+ { "not-allowed", "crossed_circle" },
+ { "grab", "grab" },
+ { "grabbing", "grabbing" },
+ { "all-scroll", "all-scroll" },
+ { "col-resize", "h_double_arrow" },
+ { "row-resize", "v_double_arrow" },
+ { "n-resize", "top_side" },
+ { "e-resize", "right_side" },
+ { "s-resize", "bottom_side" },
+ { "w-resize", "left_side" },
+ { "ne-resize", "top_right_corner" },
+ { "nw-resize", "top_left_corner" },
+ { "sw-resize", "bottom_left_corner" },
+ { "se-resize", "bottom_right_corner" },
+ { "ew-resize", "h_double_arrow" },
+ { "ns-resize", "v_double_arrow" },
+ { "nesw-resize", "fd_double_arrow" },
+ { "nwse-resize", "bd_double_arrow" },
+ { "zoom-in", "zoom-in" },
+ { "zoome-out", "zoom-out" },
+ { NULL, NULL }
+};
+
+static const gchar *
+lookup_name (const gchar *css_name)
+{
+ gint i;
+
+ for (i = 0; name_map[i].css_name; i++)
+ {
+ if (g_strcmp0 (name_map[i].css_name, css_name) == 0)
+ return name_map[i].name;
+ }
+
+ return css_name;
+}
+
+static void
+add_button (GtkWidget *section,
+ const gchar *css_name)
+{
+ GtkWidget *image, *button;
+ GdkDisplay *display;
+ GdkCursor *cursor;
+ const gchar *name;
+
+ name = lookup_name (css_name);
+
+ display = gtk_widget_get_display (section);
+ if (name == NULL)
+ cursor = gdk_cursor_new_for_display (display, GDK_BLANK_CURSOR);
+ else
+ cursor = gdk_cursor_new_from_name (display, name);
+ if (cursor == NULL)
+ image = gtk_image_new_from_icon_name ("image-missing", GTK_ICON_SIZE_MENU);
+ else
+ image = gtk_image_new_from_pixbuf (gdk_cursor_get_image (cursor));
+ gtk_widget_set_size_request (image, 24, 24);
+ button = gtk_button_new ();
+ gtk_container_add (GTK_CONTAINER (button), image);
+ gtk_style_context_add_class (gtk_widget_get_style_context (button), "image-button");
+ g_signal_connect (button, "clicked", G_CALLBACK (set_cursor), cursor);
+
+ gtk_widget_set_tooltip_text (button, css_name);
+ gtk_container_add (GTK_CONTAINER (section), button);
+}
+
+GtkWidget *
+do_cursors (GtkWidget *do_widget)
+{
+ static GtkWidget *window = NULL;
+
+ if (!window)
+ {
+ GtkWidget *sw;
+ GtkWidget *box;
+ GtkWidget *section;
+
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_screen (GTK_WINDOW (window),
+ gtk_widget_get_screen (do_widget));
+ gtk_window_set_title (GTK_WINDOW (window), "Cursors");
+ gtk_window_set_default_size (GTK_WINDOW (window), 500, 500);
+
+ g_signal_connect (window, "destroy",
+ G_CALLBACK (gtk_widget_destroyed),
+ &window);
+
+ sw = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
+ GTK_POLICY_NEVER,
+ GTK_POLICY_AUTOMATIC);
+ gtk_container_add (GTK_CONTAINER (window), sw);
+ box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ g_object_set (box,
+ "margin-start", 20,
+ "margin-end", 20,
+ "margin-bottom", 10,
+ NULL);
+ gtk_container_add (GTK_CONTAINER (sw), box);
+
+ section = add_section (box, "General");
+ add_button (section, "default");
+ add_button (section, "none");
+
+ section = add_section (box, "Link & Status");
+ add_button (section, "context-menu");
+ add_button (section, "help");
+ add_button (section, "pointer");
+ add_button (section, "progress");
+ add_button (section, "wait");
+
+ section = add_section (box, "Selection");
+ add_button (section, "cell");
+ add_button (section, "crosshair");
+ add_button (section, "text");
+ add_button (section, "vertical-text");
+
+ section = add_section (box, "Drag & Drop");
+ add_button (section, "alias");
+ add_button (section, "copy");
+ add_button (section, "move");
+ add_button (section, "no-drop");
+ add_button (section, "not-allowed");
+ add_button (section, "grab");
+ add_button (section, "grabbing");
+
+ section = add_section (box, "Resize & Scrolling");
+ add_button (section, "all-scroll");
+ add_button (section, "col-resize");
+ add_button (section, "row-resize");
+ add_button (section, "n-resize");
+ add_button (section, "e-resize");
+ add_button (section, "s-resize");
+ add_button (section, "w-resize");
+ add_button (section, "ne-resize");
+ add_button (section, "nw-resize");
+ add_button (section, "se-resize");
+ add_button (section, "sw-resize");
+ add_button (section, "ew-resize");
+ add_button (section, "ns-resize");
+ add_button (section, "nesw-resize");
+ add_button (section, "nwse-resize");
+
+ section = add_section (box, "Zoom");
+ add_button (section, "zoom-in");
+ add_button (section, "zoom-out");
+ }
+
+ if (!gtk_widget_get_visible (window))
+ {
+ gtk_widget_show_all (window);
+ }
+ else
+ {
+ gtk_widget_destroy (window);
+ window = NULL;
+ }
+
+
+ return window;
+}
diff --git a/demos/gtk-demo/demo.gresource.xml b/demos/gtk-demo/demo.gresource.xml
index a970795..91db2a5 100644
--- a/demos/gtk-demo/demo.gresource.xml
+++ b/demos/gtk-demo/demo.gresource.xml
@@ -86,6 +86,7 @@
<file>css_multiplebgs.c</file>
<file>css_pixbufs.c</file>
<file>css_shadows.c</file>
+ <file>cursors.c</file>
<file>dialog.c</file>
<file>drawingarea.c</file>
<file>editable_cells.c</file>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]