1 | |
2 | #include "gtkgizmoprivate.h" |
3 | #include "gtkwidgetprivate.h" |
4 | |
5 | |
6 | G_DEFINE_TYPE (GtkGizmo, gtk_gizmo, GTK_TYPE_WIDGET); |
7 | |
8 | static void |
9 | gtk_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 | |
25 | static void |
26 | gtk_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 | |
37 | static void |
38 | gtk_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 | |
49 | static gboolean |
50 | gtk_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 | |
62 | static gboolean |
63 | gtk_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 | |
74 | static gboolean |
75 | gtk_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 | |
85 | static void |
86 | gtk_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 | |
104 | static void |
105 | gtk_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 | |
120 | static void |
121 | gtk_gizmo_init (GtkGizmo *self) |
122 | { |
123 | } |
124 | |
125 | GtkWidget * |
126 | gtk_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 | |
144 | GtkWidget * |
145 | gtk_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 | |