1
2#include "gtkgizmoprivate.h"
3#include "gtkwidgetprivate.h"
4
5
6G_DEFINE_TYPE (GtkGizmo, gtk_gizmo, GTK_TYPE_WIDGET);
7
8static void
9gtk_gizmo_measure (GtkWidget *widget,
10 GtkOrientation orientation,
11 int for_size,
12 int *minimum,
13 int *natural,
14 int *minimum_baseline,
15 int *natural_baseline)
16{
17 GtkGizmo *self = GTK_GIZMO (widget);
18
19 if (self->measure_func)
20 self->measure_func (self, orientation, for_size,
21 minimum, natural,
22 minimum_baseline, natural_baseline);
23}
24
25static void
26gtk_gizmo_size_allocate (GtkWidget *widget,
27 int width,
28 int height,
29 int baseline)
30{
31 GtkGizmo *self = GTK_GIZMO (widget);
32
33 if (self->allocate_func)
34 self->allocate_func (self, width, height, baseline);
35}
36
37static void
38gtk_gizmo_snapshot (GtkWidget *widget,
39 GtkSnapshot *snapshot)
40{
41 GtkGizmo *self = GTK_GIZMO (widget);
42
43 if (self->snapshot_func)
44 self->snapshot_func (self, snapshot);
45 else
46 GTK_WIDGET_CLASS (gtk_gizmo_parent_class)->snapshot (widget, snapshot);
47}
48
49static gboolean
50gtk_gizmo_contains (GtkWidget *widget,
51 double x,
52 double y)
53{
54 GtkGizmo *self = GTK_GIZMO (widget);
55
56 if (self->contains_func)
57 return self->contains_func (self, x, y);
58 else
59 return GTK_WIDGET_CLASS (gtk_gizmo_parent_class)->contains (widget, x, y);
60}
61
62static gboolean
63gtk_gizmo_focus (GtkWidget *widget,
64 GtkDirectionType direction)
65{
66 GtkGizmo *self = GTK_GIZMO (widget);
67
68 if (self->focus_func)
69 return self->focus_func (self, direction);
70
71 return FALSE;
72}
73
74static gboolean
75gtk_gizmo_grab_focus (GtkWidget *widget)
76{
77 GtkGizmo *self = GTK_GIZMO (widget);
78
79 if (self->grab_focus_func)
80 return self->grab_focus_func (self);
81
82 return FALSE;
83}
84
85static void
86gtk_gizmo_finalize (GObject *object)
87{
88 GtkGizmo *self = GTK_GIZMO (object);
89 GtkWidget *widget;
90
91 widget = _gtk_widget_get_first_child (GTK_WIDGET (self));
92 while (widget != NULL)
93 {
94 GtkWidget *next = _gtk_widget_get_next_sibling (widget);
95
96 gtk_widget_unparent (widget);
97
98 widget = next;
99 }
100
101 G_OBJECT_CLASS (gtk_gizmo_parent_class)->finalize (object);
102}
103
104static void
105gtk_gizmo_class_init (GtkGizmoClass *klass)
106{
107 GObjectClass *object_class = G_OBJECT_CLASS (klass);
108 GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
109
110 object_class->finalize = gtk_gizmo_finalize;
111
112 widget_class->measure = gtk_gizmo_measure;
113 widget_class->size_allocate = gtk_gizmo_size_allocate;
114 widget_class->snapshot = gtk_gizmo_snapshot;
115 widget_class->contains = gtk_gizmo_contains;
116 widget_class->grab_focus = gtk_gizmo_grab_focus;
117 widget_class->focus = gtk_gizmo_focus;
118}
119
120static void
121gtk_gizmo_init (GtkGizmo *self)
122{
123}
124
125GtkWidget *
126gtk_gizmo_new (const char *css_name,
127 GtkGizmoMeasureFunc measure_func,
128 GtkGizmoAllocateFunc allocate_func,
129 GtkGizmoSnapshotFunc snapshot_func,
130 GtkGizmoContainsFunc contains_func,
131 GtkGizmoFocusFunc focus_func,
132 GtkGizmoGrabFocusFunc grab_focus_func)
133{
134 return gtk_gizmo_new_with_role (css_name,
135 role: GTK_ACCESSIBLE_ROLE_WIDGET,
136 measure_func,
137 allocate_func,
138 snapshot_func,
139 contains_func,
140 focus_func,
141 grab_focus_func);
142}
143
144GtkWidget *
145gtk_gizmo_new_with_role (const char *css_name,
146 GtkAccessibleRole role,
147 GtkGizmoMeasureFunc measure_func,
148 GtkGizmoAllocateFunc allocate_func,
149 GtkGizmoSnapshotFunc snapshot_func,
150 GtkGizmoContainsFunc contains_func,
151 GtkGizmoFocusFunc focus_func,
152 GtkGizmoGrabFocusFunc grab_focus_func)
153{
154 GtkGizmo *gizmo = GTK_GIZMO (g_object_new (GTK_TYPE_GIZMO,
155 "css-name", css_name,
156 "accessible-role", role,
157 NULL));
158
159 gizmo->measure_func = measure_func;
160 gizmo->allocate_func = allocate_func;
161 gizmo->snapshot_func = snapshot_func;
162 gizmo->contains_func = contains_func;
163 gizmo->focus_func = focus_func;
164 gizmo->grab_focus_func = grab_focus_func;
165
166 return GTK_WIDGET (gizmo);
167}
168

source code of gtk/gtk/gtkgizmo.c