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