comparison console/libgnt/gntwidget.c @ 13930:3dbcbc5e57e1

[gaim-migrate @ 16457] Enable resizing (Alt+r, then the arrow keys, then enter/escape to end). It 'works', but needs fine-tuning. But I am going to put it off for a later date. Some other minor decoration tweaks. committer: Tailor Script <tailor@pidgin.im>
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Sat, 08 Jul 2006 02:11:11 +0000
parents 9309d27d780c
children cd2da4b079cf
comparison
equal deleted inserted replaced
13929:59af3aecf580 13930:3dbcbc5e57e1
1 /* Stuff brutally ripped from Gflib */ 1 /* Stuff brutally ripped from Gflib */
2 2
3 #include "gntwidget.h" 3 #include "gntwidget.h"
4 #include "gntutils.h" 4 #include "gntutils.h"
5 #include "gnt.h" 5 #include "gnt.h"
6
7 #define MIN_SIZE 5
6 8
7 enum 9 enum
8 { 10 {
9 SIG_DESTROY, 11 SIG_DESTROY,
10 SIG_DRAW, 12 SIG_DRAW,
13 SIG_KEY_PRESSED, 15 SIG_KEY_PRESSED,
14 SIG_MAP, 16 SIG_MAP,
15 SIG_ACTIVATE, 17 SIG_ACTIVATE,
16 SIG_EXPOSE, 18 SIG_EXPOSE,
17 SIG_SIZE_REQUEST, 19 SIG_SIZE_REQUEST,
20 SIG_CONFIRM_SIZE,
18 SIG_POSITION, 21 SIG_POSITION,
19 SIGS 22 SIGS
20 }; 23 };
21 24
22 static GObjectClass *parent_class = NULL; 25 static GObjectClass *parent_class = NULL;
23 static guint signals[SIGS] = { 0 }; 26 static guint signals[SIGS] = { 0 };
24 27
28 static void init_widget(GntWidget *widget);
29
25 static void 30 static void
26 gnt_widget_init(GTypeInstance *instance, gpointer class) 31 gnt_widget_init(GTypeInstance *instance, gpointer class)
27 { 32 {
28 GntWidget *widget = GNT_WIDGET(instance); 33 GntWidget *widget = GNT_WIDGET(instance);
29 widget->priv.name = NULL; 34 widget->priv.name = NULL;
59 static void 64 static void
60 gnt_widget_focus_change(GntWidget *widget) 65 gnt_widget_focus_change(GntWidget *widget)
61 { 66 {
62 if (GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_MAPPED) 67 if (GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_MAPPED)
63 gnt_widget_draw(widget); 68 gnt_widget_draw(widget);
69 }
70
71 static gboolean
72 gnt_widget_dummy_confirm_size(GntWidget *widget, int width, int height)
73 {
74 if (width < MIN_SIZE || height < MIN_SIZE)
75 return FALSE;
76 if (widget->priv.width != width && !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_GROW_X))
77 return FALSE;
78 if (widget->priv.height != height && !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_GROW_Y))
79 return FALSE;
80 return TRUE;
64 } 81 }
65 82
66 static void 83 static void
67 gnt_widget_class_init(GntWidgetClass *klass) 84 gnt_widget_class_init(GntWidgetClass *klass)
68 { 85 {
77 klass->draw = gnt_widget_draw; 94 klass->draw = gnt_widget_draw;
78 klass->expose = gnt_widget_expose; 95 klass->expose = gnt_widget_expose;
79 klass->map = gnt_widget_map; 96 klass->map = gnt_widget_map;
80 klass->lost_focus = gnt_widget_focus_change; 97 klass->lost_focus = gnt_widget_focus_change;
81 klass->gained_focus = gnt_widget_focus_change; 98 klass->gained_focus = gnt_widget_focus_change;
99 klass->confirm_size = gnt_widget_dummy_confirm_size;
82 100
83 klass->key_pressed = NULL; 101 klass->key_pressed = NULL;
84 klass->activate = NULL; 102 klass->activate = NULL;
85 103
86 signals[SIG_DESTROY] = 104 signals[SIG_DESTROY] =
153 G_SIGNAL_RUN_LAST, 171 G_SIGNAL_RUN_LAST,
154 G_STRUCT_OFFSET(GntWidgetClass, size_request), 172 G_STRUCT_OFFSET(GntWidgetClass, size_request),
155 NULL, NULL, 173 NULL, NULL,
156 g_cclosure_marshal_VOID__VOID, 174 g_cclosure_marshal_VOID__VOID,
157 G_TYPE_NONE, 0); 175 G_TYPE_NONE, 0);
176 signals[SIG_CONFIRM_SIZE] =
177 g_signal_new("confirm_size",
178 G_TYPE_FROM_CLASS(klass),
179 G_SIGNAL_RUN_LAST,
180 G_STRUCT_OFFSET(GntWidgetClass, confirm_size),
181 NULL, NULL,
182 gnt_closure_marshal_BOOLEAN__INT_INT,
183 G_TYPE_BOOLEAN, 2, G_TYPE_INT, G_TYPE_INT);
158 signals[SIG_KEY_PRESSED] = 184 signals[SIG_KEY_PRESSED] =
159 g_signal_new("key_pressed", 185 g_signal_new("key_pressed",
160 G_TYPE_FROM_CLASS(klass), 186 G_TYPE_FROM_CLASS(klass),
161 G_SIGNAL_RUN_LAST, 187 G_SIGNAL_RUN_LAST,
162 G_STRUCT_OFFSET(GntWidgetClass, key_pressed), 188 G_STRUCT_OFFSET(GntWidgetClass, key_pressed),
268 if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW)) 294 if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW))
269 shadow = FALSE; 295 shadow = FALSE;
270 296
271 widget->window = newwin(widget->priv.height + shadow, widget->priv.width + shadow, 297 widget->window = newwin(widget->priv.height + shadow, widget->priv.width + shadow,
272 widget->priv.y, widget->priv.x); 298 widget->priv.y, widget->priv.x);
273 wbkgd(widget->window, COLOR_PAIR(GNT_COLOR_NORMAL)); 299
274 300 init_widget(widget);
275 if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_NO_BORDER))
276 {
277 WINDOW *tmp = derwin(widget->window, widget->priv.height, widget->priv.width, 0, 0);
278 box(tmp, 0, 0);
279 delwin(tmp);
280 }
281 else
282 werase(widget->window);
283
284 if (shadow)
285 {
286 wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_SHADOW));
287 mvwvline(widget->window, 1, widget->priv.width, ' ', widget->priv.height);
288 mvwhline(widget->window, widget->priv.height, 1, ' ', widget->priv.width);
289 }
290 } 301 }
291 302
292 g_signal_emit(widget, signals[SIG_DRAW], 0); 303 g_signal_emit(widget, signals[SIG_DRAW], 0);
293 gnt_widget_queue_update(widget); 304 gnt_widget_queue_update(widget);
294 GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_DRAWING); 305 GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_DRAWING);
360 if (height) 371 if (height)
361 *height = wid->priv.height + shadow; 372 *height = wid->priv.height + shadow;
362 373
363 } 374 }
364 375
365 void 376 static void
377 init_widget(GntWidget *widget)
378 {
379 gboolean shadow = TRUE;
380
381 if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW))
382 shadow = FALSE;
383
384 wbkgd(widget->window, COLOR_PAIR(GNT_COLOR_NORMAL));
385 werase(widget->window);
386
387 if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_NO_BORDER))
388 {
389 WINDOW *tmp = derwin(widget->window, widget->priv.height, widget->priv.width, 0, 0);
390 box(tmp, 0, 0);
391 delwin(tmp);
392 }
393
394 if (shadow)
395 {
396 wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_SHADOW));
397 mvwvline(widget->window, 1, widget->priv.width, ' ', widget->priv.height);
398 mvwhline(widget->window, widget->priv.height, 1, ' ', widget->priv.width);
399 }
400 }
401
402 gboolean
366 gnt_widget_set_size(GntWidget *widget, int width, int height) 403 gnt_widget_set_size(GntWidget *widget, int width, int height)
367 { 404 {
368 widget->priv.width = width; 405 gboolean ret = TRUE;
369 widget->priv.height = height; 406
370 GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_MAPPED); 407 if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_MAPPED))
408 {
409 if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW))
410 {
411 width--;
412 height--;
413 }
414 g_signal_emit(widget, signals[SIG_CONFIRM_SIZE], 0, width, height, &ret);
415 }
416
417 if (ret)
418 {
419 gboolean shadow = TRUE;
420
421 if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW))
422 shadow = FALSE;
423
424 widget->priv.width = width;
425 widget->priv.height = height;
426 if (widget->window)
427 wresize(widget->window, height + shadow, width + shadow);
428 if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_MAPPED))
429 init_widget(widget);
430 else
431 GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_MAPPED);
432 }
433
434 return ret;
371 } 435 }
372 436
373 gboolean 437 gboolean
374 gnt_widget_set_focus(GntWidget *widget, gboolean set) 438 gnt_widget_set_focus(GntWidget *widget, gboolean set)
375 { 439 {