Mercurial > pidgin
comparison console/libgnt/gntwidget.c @ 13943:25be562aaca8
[gaim-migrate @ 16480]
New widget GntLine to use as a separator.
A partial dialog for add-account callback. Updating the dialog
as a result of selection-change in the prpl dropdown is way ickier
than I had expected it to be. It 'works' now, but quite a bit
quirky. I will try to smooth things up later, perhaps next week.
committer: Tailor Script <tailor@pidgin.im>
author | Sadrul Habib Chowdhury <imadil@gmail.com> |
---|---|
date | Mon, 10 Jul 2006 23:55:24 +0000 |
parents | cd2da4b079cf |
children | a71678d2da16 |
comparison
equal
deleted
inserted
replaced
13942:b14fdab68eac | 13943:25be562aaca8 |
---|---|
1 /* Stuff brutally ripped from Gflib */ | 1 /* Stuff brutally ripped from Gflib */ |
2 | 2 |
3 #include "gntwidget.h" | 3 #include "gntwidget.h" |
4 #include "gntmarshal.h" | 4 #include "gntmarshal.h" |
5 #include "gnt.h" | 5 #include "gnt.h" |
6 | |
7 #define MIN_SIZE 5 | |
8 | 6 |
9 enum | 7 enum |
10 { | 8 { |
11 SIG_DESTROY, | 9 SIG_DESTROY, |
12 SIG_DRAW, | 10 SIG_DRAW, |
16 SIG_MAP, | 14 SIG_MAP, |
17 SIG_ACTIVATE, | 15 SIG_ACTIVATE, |
18 SIG_EXPOSE, | 16 SIG_EXPOSE, |
19 SIG_SIZE_REQUEST, | 17 SIG_SIZE_REQUEST, |
20 SIG_CONFIRM_SIZE, | 18 SIG_CONFIRM_SIZE, |
19 SIG_SIZE_CHANGED, | |
21 SIG_POSITION, | 20 SIG_POSITION, |
22 SIGS | 21 SIGS |
23 }; | 22 }; |
24 | 23 |
25 static GObjectClass *parent_class = NULL; | 24 static GObjectClass *parent_class = NULL; |
69 } | 68 } |
70 | 69 |
71 static gboolean | 70 static gboolean |
72 gnt_widget_dummy_confirm_size(GntWidget *widget, int width, int height) | 71 gnt_widget_dummy_confirm_size(GntWidget *widget, int width, int height) |
73 { | 72 { |
74 if (width < MIN_SIZE || height < MIN_SIZE) | 73 if (width < widget->priv.minw || height < widget->priv.minh) |
75 return FALSE; | 74 return FALSE; |
76 if (widget->priv.width != width && !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_GROW_X)) | 75 if (widget->priv.width != width && !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_GROW_X)) |
77 return FALSE; | 76 return FALSE; |
78 if (widget->priv.height != height && !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_GROW_Y)) | 77 if (widget->priv.height != height && !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_GROW_Y)) |
79 return FALSE; | 78 return FALSE; |
171 G_SIGNAL_RUN_LAST, | 170 G_SIGNAL_RUN_LAST, |
172 G_STRUCT_OFFSET(GntWidgetClass, size_request), | 171 G_STRUCT_OFFSET(GntWidgetClass, size_request), |
173 NULL, NULL, | 172 NULL, NULL, |
174 g_cclosure_marshal_VOID__VOID, | 173 g_cclosure_marshal_VOID__VOID, |
175 G_TYPE_NONE, 0); | 174 G_TYPE_NONE, 0); |
175 signals[SIG_SIZE_CHANGED] = | |
176 g_signal_new("size_changed", | |
177 G_TYPE_FROM_CLASS(klass), | |
178 G_SIGNAL_RUN_LAST, | |
179 G_STRUCT_OFFSET(GntWidgetClass, size_changed), | |
180 NULL, NULL, | |
181 gnt_closure_marshal_VOID__INT_INT, | |
182 G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT); | |
176 signals[SIG_CONFIRM_SIZE] = | 183 signals[SIG_CONFIRM_SIZE] = |
177 g_signal_new("confirm_size", | 184 g_signal_new("confirm_size", |
178 G_TYPE_FROM_CLASS(klass), | 185 G_TYPE_FROM_CLASS(klass), |
179 G_SIGNAL_RUN_LAST, | 186 G_SIGNAL_RUN_LAST, |
180 G_STRUCT_OFFSET(GntWidgetClass, confirm_size), | 187 G_STRUCT_OFFSET(GntWidgetClass, confirm_size), |
243 * should release @obj. | 250 * should release @obj. |
244 */ | 251 */ |
245 void | 252 void |
246 gnt_widget_destroy(GntWidget *obj) | 253 gnt_widget_destroy(GntWidget *obj) |
247 { | 254 { |
248 int id; | |
249 g_return_if_fail(GNT_IS_WIDGET(obj)); | 255 g_return_if_fail(GNT_IS_WIDGET(obj)); |
250 | |
251 if ((id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(obj), "gnt:queue_update")))) | |
252 { | |
253 g_source_remove(id); | |
254 g_object_set_data(G_OBJECT(obj), "gnt:queue_update", NULL); | |
255 } | |
256 | 256 |
257 gnt_widget_hide(obj); | 257 gnt_widget_hide(obj); |
258 delwin(obj->window); | 258 delwin(obj->window); |
259 if(!(GNT_WIDGET_FLAGS(obj) & GNT_WIDGET_DESTROYING)) | 259 if(!(GNT_WIDGET_FLAGS(obj) & GNT_WIDGET_DESTROYING)) |
260 g_object_run_dispose(G_OBJECT(obj)); | 260 g_object_run_dispose(G_OBJECT(obj)); |
274 | 274 |
275 void | 275 void |
276 gnt_widget_draw(GntWidget *widget) | 276 gnt_widget_draw(GntWidget *widget) |
277 { | 277 { |
278 /* Draw the widget */ | 278 /* Draw the widget */ |
279 DEBUG; | |
280 if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_DRAWING)) | 279 if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_DRAWING)) |
281 return; | 280 return; |
282 | 281 |
283 GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_DRAWING); | 282 GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_DRAWING); |
284 if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_MAPPED)) | 283 if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_MAPPED)) |
291 { | 290 { |
292 gboolean shadow = TRUE; | 291 gboolean shadow = TRUE; |
293 | 292 |
294 if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW)) | 293 if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW)) |
295 shadow = FALSE; | 294 shadow = FALSE; |
296 | 295 |
297 widget->window = newwin(widget->priv.height + shadow, widget->priv.width + shadow, | 296 widget->window = newwin(widget->priv.height + shadow, widget->priv.width + shadow, |
298 widget->priv.y, widget->priv.x); | 297 widget->priv.y, widget->priv.x); |
299 | |
300 init_widget(widget); | 298 init_widget(widget); |
301 } | 299 } |
302 | 300 |
303 g_signal_emit(widget, signals[SIG_DRAW], 0); | 301 g_signal_emit(widget, signals[SIG_DRAW], 0); |
304 gnt_widget_queue_update(widget); | 302 gnt_widget_queue_update(widget); |
335 } | 333 } |
336 | 334 |
337 void | 335 void |
338 gnt_widget_set_position(GntWidget *wid, int x, int y) | 336 gnt_widget_set_position(GntWidget *wid, int x, int y) |
339 { | 337 { |
338 g_signal_emit(wid, signals[SIG_POSITION], 0, x, y); | |
340 /* XXX: Need to install properties for these and g_object_notify */ | 339 /* XXX: Need to install properties for these and g_object_notify */ |
341 wid->priv.x = x; | 340 wid->priv.x = x; |
342 wid->priv.y = y; | 341 wid->priv.y = y; |
343 | |
344 g_signal_emit(wid, signals[SIG_POSITION], 0, x, y); | |
345 } | 342 } |
346 | 343 |
347 void | 344 void |
348 gnt_widget_get_position(GntWidget *wid, int *x, int *y) | 345 gnt_widget_get_position(GntWidget *wid, int *x, int *y) |
349 { | 346 { |
402 gboolean | 399 gboolean |
403 gnt_widget_set_size(GntWidget *widget, int width, int height) | 400 gnt_widget_set_size(GntWidget *widget, int width, int height) |
404 { | 401 { |
405 gboolean ret = TRUE; | 402 gboolean ret = TRUE; |
406 | 403 |
404 if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW)) | |
405 { | |
406 width--; | |
407 height--; | |
408 } | |
409 | |
407 if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_MAPPED)) | 410 if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_MAPPED)) |
408 { | 411 { |
409 if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW)) | 412 ret = gnt_widget_confirm_size(widget, width, height); |
410 { | |
411 width--; | |
412 height--; | |
413 } | |
414 g_signal_emit(widget, signals[SIG_CONFIRM_SIZE], 0, width, height, &ret); | |
415 } | 413 } |
416 | 414 |
417 if (ret) | 415 if (ret) |
418 { | 416 { |
419 gboolean shadow = TRUE; | 417 gboolean shadow = TRUE; |
418 int oldw, oldh; | |
420 | 419 |
421 if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW)) | 420 if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW)) |
422 shadow = FALSE; | 421 shadow = FALSE; |
423 | 422 |
423 oldw = widget->priv.width; | |
424 oldh = widget->priv.height; | |
425 | |
424 widget->priv.width = width; | 426 widget->priv.width = width; |
425 widget->priv.height = height; | 427 widget->priv.height = height; |
428 | |
429 g_signal_emit(widget, signals[SIG_SIZE_CHANGED], 0, oldw, oldh); | |
430 | |
426 if (widget->window) | 431 if (widget->window) |
432 { | |
427 wresize(widget->window, height + shadow, width + shadow); | 433 wresize(widget->window, height + shadow, width + shadow); |
434 init_widget(widget); | |
435 } | |
428 if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_MAPPED)) | 436 if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_MAPPED)) |
429 init_widget(widget); | 437 init_widget(widget); |
430 else | 438 else |
431 GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_MAPPED); | 439 GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_MAPPED); |
432 } | 440 } |
473 GntWidget *widget = GNT_WIDGET(data); | 481 GntWidget *widget = GNT_WIDGET(data); |
474 | 482 |
475 if (!g_object_get_data(G_OBJECT(widget), "gnt:queue_update")) | 483 if (!g_object_get_data(G_OBJECT(widget), "gnt:queue_update")) |
476 return FALSE; | 484 return FALSE; |
477 gnt_screen_update(widget); | 485 gnt_screen_update(widget); |
478 g_object_set_data(G_OBJECT(widget), "gnt:queue_update", GINT_TO_POINTER(FALSE)); | 486 g_object_set_data(G_OBJECT(widget), "gnt:queue_update", NULL); |
479 return FALSE; | 487 return FALSE; |
480 } | 488 } |
481 | 489 |
482 void gnt_widget_queue_update(GntWidget *widget) | 490 void gnt_widget_queue_update(GntWidget *widget) |
483 { | 491 { |
485 widget = widget->parent; | 493 widget = widget->parent; |
486 | 494 |
487 if (!g_object_get_data(G_OBJECT(widget), "gnt:queue_update")) | 495 if (!g_object_get_data(G_OBJECT(widget), "gnt:queue_update")) |
488 { | 496 { |
489 int id = g_timeout_add(0, update_queue_callback, widget); | 497 int id = g_timeout_add(0, update_queue_callback, widget); |
490 g_object_set_data(G_OBJECT(widget), "gnt:queue_update", GINT_TO_POINTER(id)); | 498 g_object_set_data_full(G_OBJECT(widget), "gnt:queue_update", GINT_TO_POINTER(id), |
491 } | 499 (GDestroyNotify)g_source_remove); |
492 } | 500 } |
493 | 501 } |
502 | |
503 gboolean gnt_widget_confirm_size(GntWidget *widget, int width, int height) | |
504 { | |
505 gboolean ret = FALSE; | |
506 g_signal_emit(widget, signals[SIG_CONFIRM_SIZE], 0, width, height, &ret); | |
507 return ret; | |
508 } | |
509 |