Mercurial > pidgin
annotate finch/libgnt/gntwidget.c @ 21304:add12afc3140
Fix size calculation when shadow is enabled.
Also, when the terminal is resized, the SIGWINCH callback needs to refresh
after endwin to get the correct new size of the terminal.
author | Sadrul Habib Chowdhury <imadil@gmail.com> |
---|---|
date | Sat, 10 Nov 2007 23:48:57 +0000 |
parents | 6de09629f091 |
children | d270b6aebabc |
rev | line source |
---|---|
18049
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15945
diff
changeset
|
1 /** |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15945
diff
changeset
|
2 * GNT - The GLib Ncurses Toolkit |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15945
diff
changeset
|
3 * |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15945
diff
changeset
|
4 * GNT is the legal property of its developers, whose names are too numerous |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15945
diff
changeset
|
5 * to list here. Please refer to the COPYRIGHT file distributed with this |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15945
diff
changeset
|
6 * source distribution. |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15945
diff
changeset
|
7 * |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15945
diff
changeset
|
8 * This library is free software; you can redistribute it and/or modify |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15945
diff
changeset
|
9 * it under the terms of the GNU General Public License as published by |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15945
diff
changeset
|
10 * the Free Software Foundation; either version 2 of the License, or |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15945
diff
changeset
|
11 * (at your option) any later version. |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15945
diff
changeset
|
12 * |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15945
diff
changeset
|
13 * This program is distributed in the hope that it will be useful, |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15945
diff
changeset
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15945
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15945
diff
changeset
|
16 * GNU General Public License for more details. |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15945
diff
changeset
|
17 * |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15945
diff
changeset
|
18 * You should have received a copy of the GNU General Public License |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15945
diff
changeset
|
19 * along with this program; if not, write to the Free Software |
19681
44b4e8bd759b
The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
18566
diff
changeset
|
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
18049
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15945
diff
changeset
|
21 */ |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15945
diff
changeset
|
22 |
15817 | 23 /* Stuff brutally ripped from Gflib */ |
24 | |
25 #include "gntwidget.h" | |
26 #include "gntstyle.h" | |
27 #include "gntmarshal.h" | |
28 #include "gntutils.h" | |
29 #include "gnt.h" | |
30 | |
31 enum | |
32 { | |
33 SIG_DESTROY, | |
34 SIG_DRAW, | |
35 SIG_HIDE, | |
36 SIG_GIVE_FOCUS, | |
37 SIG_LOST_FOCUS, | |
38 SIG_KEY_PRESSED, | |
39 SIG_MAP, | |
40 SIG_ACTIVATE, | |
41 SIG_EXPOSE, | |
42 SIG_SIZE_REQUEST, | |
43 SIG_CONFIRM_SIZE, | |
44 SIG_SIZE_CHANGED, | |
45 SIG_POSITION, | |
46 SIG_CLICKED, | |
47 SIG_CONTEXT_MENU, | |
48 SIGS | |
49 }; | |
50 | |
51 static GObjectClass *parent_class = NULL; | |
52 static guint signals[SIGS] = { 0 }; | |
53 | |
54 static void init_widget(GntWidget *widget); | |
55 | |
56 static void | |
57 gnt_widget_init(GTypeInstance *instance, gpointer class) | |
58 { | |
59 GntWidget *widget = GNT_WIDGET(instance); | |
60 widget->priv.name = NULL; | |
61 GNTDEBUG; | |
62 } | |
63 | |
64 static void | |
65 gnt_widget_map(GntWidget *widget) | |
66 { | |
67 /* Get some default size for the widget */ | |
68 GNTDEBUG; | |
69 g_signal_emit(widget, signals[SIG_MAP], 0); | |
70 GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_MAPPED); | |
71 } | |
72 | |
73 static void | |
74 gnt_widget_dispose(GObject *obj) | |
75 { | |
76 GntWidget *self = GNT_WIDGET(obj); | |
18565
980d6e1b2d21
Fix a crash Eric found. These parameters were in reverse order.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18223
diff
changeset
|
77 g_signal_emit(self, signals[SIG_DESTROY], 0); |
15817 | 78 parent_class->dispose(obj); |
79 GNTDEBUG; | |
80 } | |
81 | |
82 static void | |
83 gnt_widget_focus_change(GntWidget *widget) | |
84 { | |
85 if (GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_MAPPED) | |
86 gnt_widget_draw(widget); | |
87 } | |
88 | |
89 static gboolean | |
90 gnt_widget_dummy_confirm_size(GntWidget *widget, int width, int height) | |
91 { | |
15945
92fa7d6e75b0
A few more fixes for resizing.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15943
diff
changeset
|
92 gboolean shadow; |
15817 | 93 if (width < widget->priv.minw || height < widget->priv.minh) |
94 return FALSE; | |
15945
92fa7d6e75b0
A few more fixes for resizing.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15943
diff
changeset
|
95 shadow = gnt_widget_has_shadow(widget); |
92fa7d6e75b0
A few more fixes for resizing.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15943
diff
changeset
|
96 if (widget->priv.width + shadow != width && !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_GROW_X)) |
15817 | 97 return FALSE; |
15945
92fa7d6e75b0
A few more fixes for resizing.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15943
diff
changeset
|
98 if (widget->priv.height + shadow != height && !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_GROW_Y)) |
15817 | 99 return FALSE; |
100 return TRUE; | |
101 } | |
102 | |
103 static gboolean | |
104 context_menu(GntBindable *bind, GList *null) | |
105 { | |
106 gboolean ret = FALSE; | |
107 g_signal_emit(bind, signals[SIG_CONTEXT_MENU], 0, &ret); | |
108 return ret; | |
109 } | |
110 | |
111 static void | |
112 gnt_widget_class_init(GntWidgetClass *klass) | |
113 { | |
114 GObjectClass *obj_class = G_OBJECT_CLASS(klass); | |
115 | |
116 parent_class = g_type_class_peek_parent(klass); | |
117 | |
118 obj_class->dispose = gnt_widget_dispose; | |
119 | |
120 klass->destroy = gnt_widget_destroy; | |
121 klass->show = gnt_widget_show; | |
122 klass->draw = gnt_widget_draw; | |
123 klass->expose = gnt_widget_expose; | |
124 klass->map = gnt_widget_map; | |
125 klass->lost_focus = gnt_widget_focus_change; | |
126 klass->gained_focus = gnt_widget_focus_change; | |
127 klass->confirm_size = gnt_widget_dummy_confirm_size; | |
128 | |
129 klass->key_pressed = NULL; | |
130 klass->activate = NULL; | |
131 klass->clicked = NULL; | |
132 | |
133 signals[SIG_DESTROY] = | |
134 g_signal_new("destroy", | |
135 G_TYPE_FROM_CLASS(klass), | |
136 G_SIGNAL_RUN_LAST, | |
137 G_STRUCT_OFFSET(GntWidgetClass, destroy), | |
138 NULL, NULL, | |
139 g_cclosure_marshal_VOID__VOID, | |
140 G_TYPE_NONE, 0); | |
141 signals[SIG_GIVE_FOCUS] = | |
142 g_signal_new("gained-focus", | |
143 G_TYPE_FROM_CLASS(klass), | |
144 G_SIGNAL_RUN_LAST, | |
145 G_STRUCT_OFFSET(GntWidgetClass, gained_focus), | |
146 NULL, NULL, | |
147 g_cclosure_marshal_VOID__VOID, | |
148 G_TYPE_NONE, 0); | |
149 signals[SIG_LOST_FOCUS] = | |
150 g_signal_new("lost-focus", | |
151 G_TYPE_FROM_CLASS(klass), | |
152 G_SIGNAL_RUN_LAST, | |
153 G_STRUCT_OFFSET(GntWidgetClass, lost_focus), | |
154 NULL, NULL, | |
155 g_cclosure_marshal_VOID__VOID, | |
156 G_TYPE_NONE, 0); | |
157 signals[SIG_ACTIVATE] = | |
158 g_signal_new("activate", | |
159 G_TYPE_FROM_CLASS(klass), | |
160 G_SIGNAL_RUN_LAST, | |
161 G_STRUCT_OFFSET(GntWidgetClass, activate), | |
162 NULL, NULL, | |
163 g_cclosure_marshal_VOID__VOID, | |
164 G_TYPE_NONE, 0); | |
165 signals[SIG_MAP] = | |
166 g_signal_new("map", | |
167 G_TYPE_FROM_CLASS(klass), | |
168 G_SIGNAL_RUN_LAST, | |
169 G_STRUCT_OFFSET(GntWidgetClass, map), | |
170 NULL, NULL, | |
171 g_cclosure_marshal_VOID__VOID, | |
172 G_TYPE_NONE, 0); | |
173 signals[SIG_DRAW] = | |
174 g_signal_new("draw", | |
175 G_TYPE_FROM_CLASS(klass), | |
176 G_SIGNAL_RUN_LAST, | |
177 G_STRUCT_OFFSET(GntWidgetClass, draw), | |
178 NULL, NULL, | |
179 g_cclosure_marshal_VOID__VOID, | |
180 G_TYPE_NONE, 0); | |
181 signals[SIG_HIDE] = | |
182 g_signal_new("hide", | |
183 G_TYPE_FROM_CLASS(klass), | |
184 G_SIGNAL_RUN_LAST, | |
185 G_STRUCT_OFFSET(GntWidgetClass, hide), | |
186 NULL, NULL, | |
187 g_cclosure_marshal_VOID__VOID, | |
188 G_TYPE_NONE, 0); | |
189 signals[SIG_EXPOSE] = | |
190 g_signal_new("expose", | |
191 G_TYPE_FROM_CLASS(klass), | |
192 G_SIGNAL_RUN_LAST, | |
193 G_STRUCT_OFFSET(GntWidgetClass, expose), | |
194 NULL, NULL, | |
195 gnt_closure_marshal_VOID__INT_INT_INT_INT, | |
196 G_TYPE_NONE, 4, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT); | |
197 signals[SIG_POSITION] = | |
198 g_signal_new("position-set", | |
199 G_TYPE_FROM_CLASS(klass), | |
200 G_SIGNAL_RUN_LAST, | |
201 G_STRUCT_OFFSET(GntWidgetClass, set_position), | |
202 NULL, NULL, | |
203 gnt_closure_marshal_VOID__INT_INT, | |
204 G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT); | |
205 signals[SIG_SIZE_REQUEST] = | |
206 g_signal_new("size_request", | |
207 G_TYPE_FROM_CLASS(klass), | |
208 G_SIGNAL_RUN_LAST, | |
209 G_STRUCT_OFFSET(GntWidgetClass, size_request), | |
210 NULL, NULL, | |
211 g_cclosure_marshal_VOID__VOID, | |
212 G_TYPE_NONE, 0); | |
213 signals[SIG_SIZE_CHANGED] = | |
214 g_signal_new("size_changed", | |
215 G_TYPE_FROM_CLASS(klass), | |
216 G_SIGNAL_RUN_LAST, | |
217 G_STRUCT_OFFSET(GntWidgetClass, size_changed), | |
218 NULL, NULL, | |
219 gnt_closure_marshal_VOID__INT_INT, | |
220 G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT); | |
221 signals[SIG_CONFIRM_SIZE] = | |
222 g_signal_new("confirm_size", | |
223 G_TYPE_FROM_CLASS(klass), | |
224 G_SIGNAL_RUN_LAST, | |
225 G_STRUCT_OFFSET(GntWidgetClass, confirm_size), | |
226 NULL, NULL, | |
227 gnt_closure_marshal_BOOLEAN__INT_INT, | |
228 G_TYPE_BOOLEAN, 2, G_TYPE_INT, G_TYPE_INT); | |
229 signals[SIG_KEY_PRESSED] = | |
230 g_signal_new("key_pressed", | |
231 G_TYPE_FROM_CLASS(klass), | |
232 G_SIGNAL_RUN_LAST, | |
233 G_STRUCT_OFFSET(GntWidgetClass, key_pressed), | |
234 gnt_boolean_handled_accumulator, NULL, | |
235 gnt_closure_marshal_BOOLEAN__STRING, | |
236 G_TYPE_BOOLEAN, 1, G_TYPE_STRING); | |
237 | |
238 signals[SIG_CLICKED] = | |
239 g_signal_new("clicked", | |
240 G_TYPE_FROM_CLASS(klass), | |
241 G_SIGNAL_RUN_LAST, | |
242 G_STRUCT_OFFSET(GntWidgetClass, clicked), | |
243 gnt_boolean_handled_accumulator, NULL, | |
244 gnt_closure_marshal_BOOLEAN__INT_INT_INT, | |
245 G_TYPE_BOOLEAN, 3, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT); | |
246 | |
247 signals[SIG_CONTEXT_MENU] = | |
248 g_signal_new("context-menu", | |
249 G_TYPE_FROM_CLASS(klass), | |
250 G_SIGNAL_RUN_LAST, | |
251 0, | |
252 gnt_boolean_handled_accumulator, NULL, | |
253 gnt_closure_marshal_BOOLEAN__VOID, | |
254 G_TYPE_BOOLEAN, 0); | |
255 | |
256 /* This is relevant for all widgets */ | |
257 gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "context-menu", context_menu, | |
258 GNT_KEY_POPUP, NULL); | |
259 gnt_bindable_register_binding(GNT_BINDABLE_CLASS(klass), "context-menu", GNT_KEY_F11, NULL); | |
260 | |
261 gnt_style_read_actions(G_OBJECT_CLASS_TYPE(klass), GNT_BINDABLE_CLASS(klass)); | |
262 GNTDEBUG; | |
263 } | |
264 | |
265 /****************************************************************************** | |
266 * GntWidget API | |
267 *****************************************************************************/ | |
268 GType | |
269 gnt_widget_get_gtype(void) | |
270 { | |
271 static GType type = 0; | |
272 | |
273 if(type == 0) { | |
274 static const GTypeInfo info = { | |
275 sizeof(GntWidgetClass), | |
276 NULL, /* base_init */ | |
277 NULL, /* base_finalize */ | |
278 (GClassInitFunc)gnt_widget_class_init, | |
279 NULL, | |
280 NULL, /* class_data */ | |
281 sizeof(GntWidget), | |
282 0, /* n_preallocs */ | |
283 gnt_widget_init, /* instance_init */ | |
284 NULL /* value_table */ | |
285 }; | |
286 | |
287 type = g_type_register_static(GNT_TYPE_BINDABLE, | |
288 "GntWidget", | |
289 &info, G_TYPE_FLAG_ABSTRACT); | |
290 } | |
291 | |
292 return type; | |
293 } | |
294 | |
295 void gnt_widget_set_take_focus(GntWidget *widget, gboolean can) | |
296 { | |
297 if (can) | |
298 GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_CAN_TAKE_FOCUS); | |
299 else | |
300 GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_CAN_TAKE_FOCUS); | |
301 } | |
302 | |
303 /** | |
304 * gnt_widget_destroy: | |
305 * @obj: The #GntWidget instance. | |
306 * | |
307 * Emits the "destroy" signal notifying all reference holders that they | |
308 * should release @obj. | |
309 */ | |
310 void | |
311 gnt_widget_destroy(GntWidget *obj) | |
312 { | |
313 g_return_if_fail(GNT_IS_WIDGET(obj)); | |
314 | |
18565
980d6e1b2d21
Fix a crash Eric found. These parameters were in reverse order.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18223
diff
changeset
|
315 if(!(GNT_WIDGET_FLAGS(obj) & GNT_WIDGET_DESTROYING)) { |
980d6e1b2d21
Fix a crash Eric found. These parameters were in reverse order.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18223
diff
changeset
|
316 GNT_WIDGET_SET_FLAGS(obj, GNT_WIDGET_DESTROYING); |
980d6e1b2d21
Fix a crash Eric found. These parameters were in reverse order.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18223
diff
changeset
|
317 gnt_widget_hide(obj); |
980d6e1b2d21
Fix a crash Eric found. These parameters were in reverse order.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18223
diff
changeset
|
318 delwin(obj->window); |
15817 | 319 g_object_run_dispose(G_OBJECT(obj)); |
18565
980d6e1b2d21
Fix a crash Eric found. These parameters were in reverse order.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18223
diff
changeset
|
320 } |
15817 | 321 GNTDEBUG; |
322 } | |
323 | |
324 void | |
325 gnt_widget_show(GntWidget *widget) | |
326 { | |
327 gnt_widget_draw(widget); | |
328 gnt_screen_occupy(widget); | |
329 } | |
330 | |
331 void | |
332 gnt_widget_draw(GntWidget *widget) | |
333 { | |
334 /* Draw the widget */ | |
335 if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_DRAWING)) | |
336 return; | |
337 | |
338 GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_DRAWING); | |
339 if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_MAPPED)) { | |
340 gnt_widget_map(widget); | |
341 } | |
342 | |
343 if (widget->window == NULL) | |
344 { | |
345 #if 0 | |
346 int x, y, maxx, maxy, w, h; | |
347 int oldw, oldh; | |
348 gboolean shadow = TRUE; | |
349 | |
350 if (!gnt_widget_has_shadow(widget)) | |
351 shadow = FALSE; | |
352 | |
353 x = widget->priv.x; | |
354 y = widget->priv.y; | |
355 w = oldw = widget->priv.width + shadow; | |
356 h = oldh = widget->priv.height + shadow; | |
357 | |
358 getmaxyx(stdscr, maxy, maxx); | |
359 maxy -= 1; /* room for the taskbar */ | |
360 | |
361 x = MAX(0, x); | |
362 y = MAX(0, y); | |
363 if (x + w >= maxx) | |
364 x = MAX(0, maxx - w); | |
365 if (y + h >= maxy) | |
366 y = MAX(0, maxy - h); | |
367 | |
368 w = MIN(w, maxx); | |
369 h = MIN(h, maxy); | |
370 | |
371 widget->priv.x = x; | |
372 widget->priv.y = y; | |
373 if (w != oldw || h != oldh) { | |
374 widget->priv.width = w - shadow; | |
375 widget->priv.height = h - shadow; | |
376 g_signal_emit(widget, signals[SIG_SIZE_CHANGED], 0, oldw, oldh); | |
377 } | |
378 #else | |
379 widget->window = newpad(widget->priv.height + 20, widget->priv.width + 20); /* XXX: */ | |
380 #endif | |
381 init_widget(widget); | |
382 } | |
383 | |
384 g_signal_emit(widget, signals[SIG_DRAW], 0); | |
385 gnt_widget_queue_update(widget); | |
386 GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_DRAWING); | |
387 } | |
388 | |
389 gboolean | |
390 gnt_widget_key_pressed(GntWidget *widget, const char *keys) | |
391 { | |
392 gboolean ret; | |
393 if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_CAN_TAKE_FOCUS)) | |
394 return FALSE; | |
395 | |
18566
3c634117a7ef
Allow disabling the widget actions on specific widgets. This allows, for
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18565
diff
changeset
|
396 if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_DISABLE_ACTIONS) && |
3c634117a7ef
Allow disabling the widget actions on specific widgets. This allows, for
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18565
diff
changeset
|
397 gnt_bindable_perform_action_key(GNT_BINDABLE(widget), keys)) |
15817 | 398 return TRUE; |
399 | |
400 keys = gnt_bindable_remap_keys(GNT_BINDABLE(widget), keys); | |
401 g_signal_emit(widget, signals[SIG_KEY_PRESSED], 0, keys, &ret); | |
402 return ret; | |
403 } | |
404 | |
405 gboolean | |
406 gnt_widget_clicked(GntWidget *widget, GntMouseEvent event, int x, int y) | |
407 { | |
408 gboolean ret; | |
409 g_signal_emit(widget, signals[SIG_CLICKED], 0, event, x, y, &ret); | |
410 return ret; | |
411 } | |
412 | |
413 void | |
414 gnt_widget_expose(GntWidget *widget, int x, int y, int width, int height) | |
415 { | |
416 g_signal_emit(widget, signals[SIG_EXPOSE], 0, x, y, width, height); | |
417 } | |
418 | |
419 void | |
420 gnt_widget_hide(GntWidget *widget) | |
421 { | |
422 g_signal_emit(widget, signals[SIG_HIDE], 0); | |
21250
9187d331aebe
Add gnt_color_pair, which will replace color codes with 'appropriate' text
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
423 wbkgdset(widget->window, '\0' | gnt_color_pair(GNT_COLOR_NORMAL)); |
15817 | 424 #if 0 |
425 /* XXX: I have no clue why, but this seemed to be necessary. */ | |
426 if (gnt_widget_has_shadow(widget)) | |
427 mvwvline(widget->window, 1, widget->priv.width, ' ', widget->priv.height); | |
428 #endif | |
429 gnt_screen_release(widget); | |
430 GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_INVISIBLE); | |
431 GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_MAPPED); | |
432 } | |
433 | |
434 void | |
435 gnt_widget_set_position(GntWidget *wid, int x, int y) | |
436 { | |
437 g_signal_emit(wid, signals[SIG_POSITION], 0, x, y); | |
438 /* XXX: Need to install properties for these and g_object_notify */ | |
439 wid->priv.x = x; | |
440 wid->priv.y = y; | |
441 } | |
442 | |
443 void | |
444 gnt_widget_get_position(GntWidget *wid, int *x, int *y) | |
445 { | |
446 if (x) | |
447 *x = wid->priv.x; | |
448 if (y) | |
449 *y = wid->priv.y; | |
450 } | |
451 | |
452 void | |
453 gnt_widget_size_request(GntWidget *widget) | |
454 { | |
455 g_signal_emit(widget, signals[SIG_SIZE_REQUEST], 0); | |
456 } | |
457 | |
458 void | |
459 gnt_widget_get_size(GntWidget *wid, int *width, int *height) | |
460 { | |
461 gboolean shadow = TRUE; | |
462 if (!gnt_widget_has_shadow(wid)) | |
463 shadow = FALSE; | |
464 | |
465 if (width) | |
466 *width = wid->priv.width + shadow; | |
467 if (height) | |
468 *height = wid->priv.height + shadow; | |
469 } | |
470 | |
471 static void | |
472 init_widget(GntWidget *widget) | |
473 { | |
474 gboolean shadow = TRUE; | |
475 | |
476 if (!gnt_widget_has_shadow(widget)) | |
477 shadow = FALSE; | |
478 | |
21250
9187d331aebe
Add gnt_color_pair, which will replace color codes with 'appropriate' text
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
479 wbkgd(widget->window, gnt_color_pair(GNT_COLOR_NORMAL)); |
15817 | 480 werase(widget->window); |
481 | |
482 if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_NO_BORDER)) | |
483 { | |
484 /* - This is ugly. */ | |
485 /* - What's your point? */ | |
21250
9187d331aebe
Add gnt_color_pair, which will replace color codes with 'appropriate' text
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
486 mvwvline(widget->window, 0, 0, ACS_VLINE | gnt_color_pair(GNT_COLOR_NORMAL), widget->priv.height); |
15817 | 487 mvwvline(widget->window, 0, widget->priv.width - 1, |
21250
9187d331aebe
Add gnt_color_pair, which will replace color codes with 'appropriate' text
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
488 ACS_VLINE | gnt_color_pair(GNT_COLOR_NORMAL), widget->priv.height); |
15817 | 489 mvwhline(widget->window, widget->priv.height - 1, 0, |
21250
9187d331aebe
Add gnt_color_pair, which will replace color codes with 'appropriate' text
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
490 ACS_HLINE | gnt_color_pair(GNT_COLOR_NORMAL), widget->priv.width); |
9187d331aebe
Add gnt_color_pair, which will replace color codes with 'appropriate' text
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
491 mvwhline(widget->window, 0, 0, ACS_HLINE | gnt_color_pair(GNT_COLOR_NORMAL), widget->priv.width); |
9187d331aebe
Add gnt_color_pair, which will replace color codes with 'appropriate' text
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
492 mvwaddch(widget->window, 0, 0, ACS_ULCORNER | gnt_color_pair(GNT_COLOR_NORMAL)); |
15817 | 493 mvwaddch(widget->window, 0, widget->priv.width - 1, |
21250
9187d331aebe
Add gnt_color_pair, which will replace color codes with 'appropriate' text
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
494 ACS_URCORNER | gnt_color_pair(GNT_COLOR_NORMAL)); |
15817 | 495 mvwaddch(widget->window, widget->priv.height - 1, 0, |
21250
9187d331aebe
Add gnt_color_pair, which will replace color codes with 'appropriate' text
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
496 ACS_LLCORNER | gnt_color_pair(GNT_COLOR_NORMAL)); |
15817 | 497 mvwaddch(widget->window, widget->priv.height - 1, widget->priv.width - 1, |
21250
9187d331aebe
Add gnt_color_pair, which will replace color codes with 'appropriate' text
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
498 ACS_LRCORNER | gnt_color_pair(GNT_COLOR_NORMAL)); |
15817 | 499 } |
500 | |
501 if (shadow) | |
502 { | |
21250
9187d331aebe
Add gnt_color_pair, which will replace color codes with 'appropriate' text
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
503 wbkgdset(widget->window, '\0' | gnt_color_pair(GNT_COLOR_SHADOW)); |
15817 | 504 mvwvline(widget->window, 1, widget->priv.width, ' ', widget->priv.height); |
505 mvwhline(widget->window, widget->priv.height, 1, ' ', widget->priv.width); | |
506 } | |
507 } | |
508 | |
509 gboolean | |
510 gnt_widget_set_size(GntWidget *widget, int width, int height) | |
511 { | |
512 gboolean ret = TRUE; | |
513 | |
514 if (gnt_widget_has_shadow(widget)) | |
515 { | |
516 width--; | |
517 height--; | |
518 } | |
519 if (width <= 0) | |
520 width = widget->priv.width; | |
521 if (height <= 0) | |
522 height = widget->priv.height; | |
523 | |
524 if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_MAPPED)) | |
525 { | |
526 ret = gnt_widget_confirm_size(widget, width, height); | |
527 } | |
528 | |
529 if (ret) | |
530 { | |
531 gboolean shadow = TRUE; | |
532 int oldw, oldh; | |
533 | |
534 if (!gnt_widget_has_shadow(widget)) | |
535 shadow = FALSE; | |
536 | |
537 oldw = widget->priv.width; | |
538 oldh = widget->priv.height; | |
539 | |
540 widget->priv.width = width; | |
541 widget->priv.height = height; | |
15943
7db39d873d52
Do not crash when resizing with shadows turned on.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15817
diff
changeset
|
542 if (width + shadow >= getmaxx(widget->window) || height + shadow >= getmaxy(widget->window)) { |
15817 | 543 delwin(widget->window); |
544 widget->window = newpad(height + 20, width + 20); | |
545 } | |
546 | |
547 g_signal_emit(widget, signals[SIG_SIZE_CHANGED], 0, oldw, oldh); | |
548 | |
549 if (widget->window) | |
550 { | |
551 init_widget(widget); | |
552 } | |
553 if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_MAPPED)) | |
554 init_widget(widget); | |
555 else | |
556 GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_MAPPED); | |
557 } | |
558 | |
559 return ret; | |
560 } | |
561 | |
562 gboolean | |
563 gnt_widget_set_focus(GntWidget *widget, gboolean set) | |
564 { | |
565 if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_CAN_TAKE_FOCUS)) | |
566 return FALSE; | |
567 | |
568 if (set && !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_HAS_FOCUS)) | |
569 { | |
570 GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_HAS_FOCUS); | |
571 g_signal_emit(widget, signals[SIG_GIVE_FOCUS], 0); | |
572 } | |
18223
5023ad94ebc9
Notify a window when it loses focus because another window was moved to
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18049
diff
changeset
|
573 else if (!set && GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_HAS_FOCUS)) |
15817 | 574 { |
575 GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_HAS_FOCUS); | |
576 g_signal_emit(widget, signals[SIG_LOST_FOCUS], 0); | |
577 } | |
578 else | |
579 return FALSE; | |
580 | |
581 return TRUE; | |
582 } | |
583 | |
584 void gnt_widget_set_name(GntWidget *widget, const char *name) | |
585 { | |
586 g_free(widget->priv.name); | |
587 widget->priv.name = g_strdup(name); | |
588 } | |
589 | |
590 const char *gnt_widget_get_name(GntWidget *widget) | |
591 { | |
592 return widget->priv.name; | |
593 } | |
594 | |
595 void gnt_widget_activate(GntWidget *widget) | |
596 { | |
597 g_signal_emit(widget, signals[SIG_ACTIVATE], 0); | |
598 } | |
599 | |
600 static gboolean | |
601 update_queue_callback(gpointer data) | |
602 { | |
603 GntWidget *widget = GNT_WIDGET(data); | |
604 | |
605 if (!g_object_get_data(G_OBJECT(widget), "gnt:queue_update")) | |
606 return FALSE; | |
607 if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_MAPPED)) | |
608 gnt_screen_update(widget); | |
609 g_object_set_data(G_OBJECT(widget), "gnt:queue_update", NULL); | |
610 return FALSE; | |
611 } | |
612 | |
613 void gnt_widget_queue_update(GntWidget *widget) | |
614 { | |
615 if (widget->window == NULL) | |
616 return; | |
617 while (widget->parent) | |
618 widget = widget->parent; | |
21161
e119edfc0fb0
applied changes from 172a59b41412c4630834d66f2e7ec3be970cc36b
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
619 |
15817 | 620 if (!g_object_get_data(G_OBJECT(widget), "gnt:queue_update")) |
621 { | |
622 int id = g_timeout_add(0, update_queue_callback, widget); | |
623 g_object_set_data_full(G_OBJECT(widget), "gnt:queue_update", GINT_TO_POINTER(id), | |
624 (GDestroyNotify)g_source_remove); | |
625 } | |
626 } | |
627 | |
628 gboolean gnt_widget_confirm_size(GntWidget *widget, int width, int height) | |
629 { | |
630 gboolean ret = FALSE; | |
631 g_signal_emit(widget, signals[SIG_CONFIRM_SIZE], 0, width, height, &ret); | |
632 return ret; | |
633 } | |
634 | |
635 void gnt_widget_set_visible(GntWidget *widget, gboolean set) | |
636 { | |
637 if (set) | |
638 GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_INVISIBLE); | |
639 else | |
640 GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_INVISIBLE); | |
641 } | |
642 | |
643 gboolean gnt_widget_has_shadow(GntWidget *widget) | |
644 { | |
645 return (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW) && | |
646 gnt_style_get_bool(GNT_STYLE_SHADOW, FALSE)); | |
647 } | |
648 |