testgtk: Redo the cursor example
Use cursor names instead of font cursors, so we can also show cursors that are not represented in the X cursor font and thus don't have a value in the GdkCursorType enumeration.
This commit is contained in:
parent
cb750f60f9
commit
e77b2832aa
230
tests/testgtk.c
230
tests/testgtk.c
@ -4847,56 +4847,172 @@ cursor_draw (GtkWidget *widget,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static const gchar *cursor_names[] = {
|
||||||
set_cursor (GtkWidget *spinner,
|
"arrow",
|
||||||
GtkWidget *widget)
|
"bd_double_arrow",
|
||||||
|
"boat",
|
||||||
|
"bottom_left_corner",
|
||||||
|
"bottom_right_corner",
|
||||||
|
"bottom_side",
|
||||||
|
"bottom_tee",
|
||||||
|
"box_spiral",
|
||||||
|
"center_ptr",
|
||||||
|
"circle",
|
||||||
|
"clock",
|
||||||
|
"coffee_mug",
|
||||||
|
"copy",
|
||||||
|
"cross",
|
||||||
|
"crossed_circle",
|
||||||
|
"cross_reverse",
|
||||||
|
"crosshair",
|
||||||
|
"diamond_cross",
|
||||||
|
"dnd-ask",
|
||||||
|
"dnd-copy",
|
||||||
|
"dnd-link",
|
||||||
|
"dnd-move",
|
||||||
|
"dnd-none",
|
||||||
|
"dot",
|
||||||
|
"dotbox",
|
||||||
|
"double_arrow",
|
||||||
|
"draft_large",
|
||||||
|
"draft_small",
|
||||||
|
"draped_box",
|
||||||
|
"exchange",
|
||||||
|
"fd_double_arrow",
|
||||||
|
"fleur",
|
||||||
|
"gobbler",
|
||||||
|
"gumby",
|
||||||
|
"grabbing",
|
||||||
|
"hand",
|
||||||
|
"hand1",
|
||||||
|
"hand2",
|
||||||
|
"heart",
|
||||||
|
"h_double_arrow",
|
||||||
|
"help",
|
||||||
|
"icon",
|
||||||
|
"iron_cross",
|
||||||
|
"left_ptr",
|
||||||
|
"left_ptr_help",
|
||||||
|
"left_ptr_watch",
|
||||||
|
"left_side",
|
||||||
|
"left_tee",
|
||||||
|
"leftbutton",
|
||||||
|
"link",
|
||||||
|
"ll_angle",
|
||||||
|
"lr_angle",
|
||||||
|
"man",
|
||||||
|
"middlebutton",
|
||||||
|
"mouse",
|
||||||
|
"move",
|
||||||
|
"pencil",
|
||||||
|
"pirate",
|
||||||
|
"plus",
|
||||||
|
"question_arrow",
|
||||||
|
"right_ptr",
|
||||||
|
"right_side",
|
||||||
|
"right_tee",
|
||||||
|
"rightbutton",
|
||||||
|
"rtl_logo",
|
||||||
|
"sailboat",
|
||||||
|
"sb_down_arrow",
|
||||||
|
"sb_h_double_arrow",
|
||||||
|
"sb_left_arrow",
|
||||||
|
"sb_right_arrow",
|
||||||
|
"sb_up_arrow",
|
||||||
|
"sb_v_double_arrow",
|
||||||
|
"shuttle",
|
||||||
|
"sizing",
|
||||||
|
"spider",
|
||||||
|
"spraycan",
|
||||||
|
"star",
|
||||||
|
"target",
|
||||||
|
"tcross",
|
||||||
|
"top_left_arrow",
|
||||||
|
"top_left_corner",
|
||||||
|
"top_right_corner",
|
||||||
|
"top_side",
|
||||||
|
"top_tee",
|
||||||
|
"trek",
|
||||||
|
"ul_angle",
|
||||||
|
"umbrella",
|
||||||
|
"ur_angle",
|
||||||
|
"v_double_arrow",
|
||||||
|
"watch",
|
||||||
|
"X_cursor",
|
||||||
|
"xterm"
|
||||||
|
};
|
||||||
|
|
||||||
|
static GtkTreeModel *
|
||||||
|
cursor_model (void)
|
||||||
{
|
{
|
||||||
guint c;
|
GtkListStore *store;
|
||||||
GdkCursor *cursor;
|
gint i;
|
||||||
GtkWidget *label;
|
store = gtk_list_store_new (1, G_TYPE_STRING);
|
||||||
GEnumClass *class;
|
|
||||||
GEnumValue *vals;
|
|
||||||
|
|
||||||
c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
|
for (i = 0; i < G_N_ELEMENTS (cursor_names); i++)
|
||||||
c &= 0xfe;
|
gtk_list_store_insert_with_values (store, NULL, -1, 0, cursor_names[i], -1);
|
||||||
|
|
||||||
label = g_object_get_data (G_OBJECT (spinner), "user_data");
|
return (GtkTreeModel *)store;
|
||||||
|
|
||||||
class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
|
|
||||||
vals = class->values;
|
|
||||||
|
|
||||||
while (vals && vals->value != c)
|
|
||||||
vals++;
|
|
||||||
if (vals)
|
|
||||||
gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
|
|
||||||
else
|
|
||||||
gtk_label_set_text (GTK_LABEL (label), "<unknown>");
|
|
||||||
|
|
||||||
g_type_class_unref (class);
|
|
||||||
|
|
||||||
cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
|
|
||||||
gdk_window_set_cursor (gtk_widget_get_window (widget),
|
|
||||||
cursor);
|
|
||||||
g_object_unref (cursor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gint
|
static gint
|
||||||
cursor_event (GtkWidget *widget,
|
cursor_event (GtkWidget *widget,
|
||||||
GdkEvent *event,
|
GdkEvent *event,
|
||||||
GtkSpinButton *spinner)
|
GtkWidget *entry)
|
||||||
{
|
{
|
||||||
|
const gchar *name;
|
||||||
|
gint i;
|
||||||
|
const gint n = G_N_ELEMENTS (cursor_names);
|
||||||
|
|
||||||
|
name = (const gchar *)g_object_get_data (G_OBJECT (widget), "name");
|
||||||
|
if (name != NULL)
|
||||||
|
{
|
||||||
|
for (i = 0; i < n; i++)
|
||||||
|
if (strcmp (name, cursor_names[i]) == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
i = 0;
|
||||||
|
|
||||||
if ((event->type == GDK_BUTTON_PRESS) &&
|
if ((event->type == GDK_BUTTON_PRESS) &&
|
||||||
((event->button.button == GDK_BUTTON_PRIMARY) ||
|
((event->button.button == GDK_BUTTON_PRIMARY) ||
|
||||||
(event->button.button == GDK_BUTTON_SECONDARY)))
|
(event->button.button == GDK_BUTTON_SECONDARY)))
|
||||||
{
|
{
|
||||||
gtk_spin_button_spin (spinner, event->button.button == GDK_BUTTON_PRIMARY ?
|
if (event->button.button == GDK_BUTTON_PRIMARY)
|
||||||
GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
|
i = (i + 1) % n;
|
||||||
|
else
|
||||||
|
i = (i + n - 1) % n;
|
||||||
|
|
||||||
|
gtk_entry_set_text (GTK_ENTRY (entry), cursor_names[i]);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_cursor_from_name (GtkWidget *entry,
|
||||||
|
GtkWidget *widget)
|
||||||
|
{
|
||||||
|
const gchar *name;
|
||||||
|
GdkCursor *cursor;
|
||||||
|
|
||||||
|
name = gtk_entry_get_text (GTK_ENTRY (entry));
|
||||||
|
cursor = gdk_cursor_new_from_name (gtk_widget_get_display (widget), name);
|
||||||
|
|
||||||
|
if (cursor == NULL)
|
||||||
|
{
|
||||||
|
name = NULL;
|
||||||
|
cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), GDK_BLANK_CURSOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
gdk_window_set_cursor (gtk_widget_get_window (widget), cursor);
|
||||||
|
g_object_unref (cursor);
|
||||||
|
|
||||||
|
g_object_set_data_full (G_OBJECT (widget), "name", g_strdup (name), g_free);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef GDK_WINDOWING_X11
|
#ifdef GDK_WINDOWING_X11
|
||||||
#include "x11/gdkx.h"
|
#include "x11/gdkx.h"
|
||||||
#endif
|
#endif
|
||||||
@ -4941,13 +5057,13 @@ create_cursors (GtkWidget *widget)
|
|||||||
GtkWidget *main_vbox;
|
GtkWidget *main_vbox;
|
||||||
GtkWidget *vbox;
|
GtkWidget *vbox;
|
||||||
GtkWidget *darea;
|
GtkWidget *darea;
|
||||||
GtkWidget *spinner;
|
|
||||||
GtkWidget *button;
|
GtkWidget *button;
|
||||||
GtkWidget *label;
|
GtkWidget *label;
|
||||||
GtkWidget *any;
|
GtkWidget *any;
|
||||||
GtkAdjustment *adjustment;
|
|
||||||
GtkWidget *entry;
|
GtkWidget *entry;
|
||||||
GtkWidget *size;
|
GtkWidget *size;
|
||||||
|
GtkEntryCompletion *completion;
|
||||||
|
GtkTreeModel *model;
|
||||||
gboolean cursor_demo = FALSE;
|
gboolean cursor_demo = FALSE;
|
||||||
|
|
||||||
if (!window)
|
if (!window)
|
||||||
@ -4987,11 +5103,11 @@ create_cursors (GtkWidget *widget)
|
|||||||
|
|
||||||
if (cursor_demo)
|
if (cursor_demo)
|
||||||
{
|
{
|
||||||
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
|
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
|
||||||
gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
|
gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
|
||||||
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
|
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
|
||||||
|
|
||||||
label = gtk_label_new ("Cursor Theme : ");
|
label = gtk_label_new ("Cursor Theme:");
|
||||||
gtk_widget_set_halign (label, GTK_ALIGN_START);
|
gtk_widget_set_halign (label, GTK_ALIGN_START);
|
||||||
gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
|
gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
|
||||||
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
|
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
|
||||||
@ -5010,21 +5126,23 @@ create_cursors (GtkWidget *widget)
|
|||||||
G_CALLBACK (change_cursor_theme), hbox);
|
G_CALLBACK (change_cursor_theme), hbox);
|
||||||
}
|
}
|
||||||
|
|
||||||
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
|
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
|
||||||
gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
|
gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
|
||||||
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
|
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
|
||||||
|
|
||||||
label = gtk_label_new ("Cursor Value : ");
|
label = gtk_label_new ("Cursor Name:");
|
||||||
gtk_widget_set_halign (label, GTK_ALIGN_START);
|
gtk_widget_set_halign (label, GTK_ALIGN_START);
|
||||||
gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
|
gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
|
||||||
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
|
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
|
||||||
|
|
||||||
adjustment = gtk_adjustment_new (0,
|
entry = gtk_entry_new ();
|
||||||
0, 152,
|
completion = gtk_entry_completion_new ();
|
||||||
2,
|
model = cursor_model ();
|
||||||
10, 0);
|
gtk_entry_completion_set_model (completion, model);
|
||||||
spinner = gtk_spin_button_new (adjustment, 0, 0);
|
gtk_entry_completion_set_text_column (completion, 0);
|
||||||
gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
|
gtk_entry_set_completion (GTK_ENTRY (entry), completion);
|
||||||
|
g_object_unref (model);
|
||||||
|
gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
|
||||||
|
|
||||||
frame =
|
frame =
|
||||||
g_object_new (gtk_frame_get_type (),
|
g_object_new (gtk_frame_get_type (),
|
||||||
@ -5043,25 +5161,13 @@ create_cursors (GtkWidget *widget)
|
|||||||
G_CALLBACK (cursor_draw),
|
G_CALLBACK (cursor_draw),
|
||||||
NULL);
|
NULL);
|
||||||
gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
|
gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
|
||||||
g_signal_connect (darea,
|
g_signal_connect (darea, "button_press_event",
|
||||||
"button_press_event",
|
G_CALLBACK (cursor_event), entry);
|
||||||
G_CALLBACK (cursor_event),
|
|
||||||
spinner);
|
|
||||||
gtk_widget_show (darea);
|
gtk_widget_show (darea);
|
||||||
|
|
||||||
g_signal_connect (spinner, "changed",
|
g_signal_connect (entry, "changed",
|
||||||
G_CALLBACK (set_cursor),
|
G_CALLBACK (set_cursor_from_name), darea);
|
||||||
darea);
|
|
||||||
|
|
||||||
label = g_object_new (GTK_TYPE_LABEL,
|
|
||||||
"visible", TRUE,
|
|
||||||
"label", "XXX",
|
|
||||||
"parent", vbox,
|
|
||||||
NULL);
|
|
||||||
gtk_container_child_set (GTK_CONTAINER (vbox), label,
|
|
||||||
"expand", FALSE,
|
|
||||||
NULL);
|
|
||||||
g_object_set_data (G_OBJECT (spinner), "user_data", label);
|
|
||||||
|
|
||||||
any = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
|
any = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
|
||||||
gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
|
gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
|
||||||
@ -5078,7 +5184,7 @@ create_cursors (GtkWidget *widget)
|
|||||||
|
|
||||||
gtk_widget_show_all (window);
|
gtk_widget_show_all (window);
|
||||||
|
|
||||||
set_cursor (spinner, darea);
|
set_cursor_from_name (entry, darea);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_widget_destroy (window);
|
||||||
|
Loading…
Reference in New Issue
Block a user