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