Mercurial > pidgin.yaz
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 { |