mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-27 14:10:30 +00:00
609e04ddcf
Clean up the code of many examples in minor ways, fix some memory leaks, and avoid the use of dialogs where a regular toplevel works just as well.
162 lines
5.0 KiB
C
162 lines
5.0 KiB
C
/* 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;
|
|
}
|
|
|
|
static void
|
|
add_button (GtkWidget *section,
|
|
const gchar *css_name)
|
|
{
|
|
GtkWidget *image, *button;
|
|
GdkDisplay *display;
|
|
GdkCursor *cursor;
|
|
|
|
display = gtk_widget_get_display (section);
|
|
cursor = gdk_cursor_new_from_name (display, css_name);
|
|
if (cursor == NULL)
|
|
image = gtk_image_new_from_icon_name ("image-missing", GTK_ICON_SIZE_MENU);
|
|
else
|
|
{
|
|
gchar *path;
|
|
|
|
path = g_strdup_printf ("/cursors/%s_cursor.png", css_name);
|
|
g_strdelimit (path, "-", '_');
|
|
image = gtk_image_new_from_resource (path);
|
|
g_free (path);
|
|
}
|
|
gtk_widget_set_size_request (image, 32, 32);
|
|
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);
|
|
|
|
|
|
return window;
|
|
}
|