- Timestamp:
- Jun 1, 2010, 1:27:14 AM (14 years ago)
- Branches:
- master, release-1.10, release-1.7, release-1.8, release-1.9
- Children:
- 05ca0d8
- Parents:
- 7a70e26
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
window.c
r7a70e26 r7a6e6c7 19 19 int nlines, ncols; 20 20 int begin_y, begin_x; 21 /* hooks */22 void (*redraw_cb)(owl_window *, WINDOW *, void *);23 void *redraw_cbdata;24 void (*redraw_cbdata_destroy)(void *);25 26 void (*size_cb)(owl_window *, void *);27 void *size_cbdata;28 void (*size_cbdata_destroy)(void *);29 21 }; 22 23 enum { 24 REDRAW, 25 RESIZED, 26 LAST_SIGNAL 27 }; 28 29 static guint window_signals[LAST_SIGNAL] = { 0 }; 30 30 31 31 static void owl_window_dispose(GObject *gobject); … … 42 42 static void _owl_window_unrealize(owl_window *w); 43 43 44 static void _owl_window_redraw_cleanup(owl_window *w, WINDOW *win); 45 44 46 G_DEFINE_TYPE (OwlWindow, owl_window, G_TYPE_OBJECT) 45 47 46 48 static void owl_window_class_init (OwlWindowClass *klass) 47 49 { 48 GObjectClass *object_class = G_OBJECT_CLASS (klass); 49 50 object_class->dispose = owl_window_dispose; 51 object_class->finalize = owl_window_finalize; 50 GObjectClass *gobject_class = G_OBJECT_CLASS (klass); 51 52 /* Set up the vtabl */ 53 gobject_class->dispose = owl_window_dispose; 54 gobject_class->finalize = owl_window_finalize; 55 56 klass->redraw = _owl_window_redraw_cleanup; 57 klass->resized = NULL; 58 59 /* Create the signals, remember IDs */ 60 window_signals[REDRAW] = 61 g_signal_new("redraw", 62 G_TYPE_FROM_CLASS(gobject_class), 63 G_SIGNAL_RUN_CLEANUP, 64 G_STRUCT_OFFSET(OwlWindowClass, redraw), 65 NULL, NULL, 66 g_cclosure_marshal_VOID__POINTER, 67 G_TYPE_NONE, 68 1, 69 G_TYPE_POINTER, NULL); 70 71 /* TODO: maybe type should be VOID__INT_INT_INT_INT; will need to generate a 72 * marshaller */ 73 window_signals[RESIZED] = 74 g_signal_new("resized", 75 G_TYPE_FROM_CLASS(gobject_class), 76 G_SIGNAL_RUN_FIRST, 77 G_STRUCT_OFFSET(OwlWindowClass, resized), 78 NULL, NULL, 79 g_cclosure_marshal_VOID__VOID, 80 G_TYPE_NONE, 81 0, 82 NULL); 52 83 } 53 84 … … 65 96 } 66 97 67 /* Clear all cbs */68 owl_window_set_redraw_cb (w, 0, 0, 0);69 owl_window_set_size_cb (w, 0, 0, 0);70 71 98 /* Remove from hierarchy */ 72 99 owl_window_unlink (w); … … 100 127 } 101 128 return dummy; 102 }103 104 static void _screen_calculate_size(owl_window *screen, void *user_data)105 {106 owl_global *g = user_data;107 int lines, cols;108 owl_global_get_terminal_size(&lines, &cols);109 if (!g->lines) g->lines = lines;110 if (!g->cols) g->cols = cols;111 owl_window_resize(screen, g->lines, g->cols);112 129 } 113 130 … … 120 137 screen = _owl_window_new(NULL, g.lines, g.cols, 0, 0); 121 138 screen->is_screen = 1; 122 owl_window_set_size_cb(screen, _screen_calculate_size, &g, 0);123 139 owl_window_show(screen); 124 140 } … … 154 170 155 171 return w; 156 }157 158 /** Callbacks **/159 160 void owl_window_set_redraw_cb(owl_window *w, void (*cb)(owl_window*, WINDOW*, void*), void *cbdata, void (*cbdata_destroy)(void*))161 {162 if (w->redraw_cbdata_destroy) {163 w->redraw_cbdata_destroy(w->redraw_cbdata);164 w->redraw_cbdata = 0;165 w->redraw_cbdata_destroy = 0;166 }167 168 w->redraw_cb = cb;169 w->redraw_cbdata = cbdata;170 w->redraw_cbdata_destroy = cbdata_destroy;171 172 /* mark the window as dirty, to take new cb in account */173 owl_window_dirty(w);174 }175 176 void owl_window_set_size_cb(owl_window *w, void (*cb)(owl_window*, void*), void *cbdata, void (*cbdata_destroy)(void*))177 {178 if (w->size_cbdata_destroy) {179 w->size_cbdata_destroy(w->size_cbdata);180 w->size_cbdata = 0;181 w->size_cbdata_destroy = 0;182 }183 184 w->size_cb = cb;185 w->size_cbdata = cbdata;186 w->size_cbdata_destroy = cbdata_destroy;187 188 owl_window_recompute_position(w);189 172 } 190 173 … … 368 351 { 369 352 if (!w->dirty) return; 370 if (w->win && w->redraw_cb) { 371 w->redraw_cb(w, w->win, w->redraw_cbdata); 372 wsyncup(w->win); 353 if (w->win) { 354 g_signal_emit(w, window_signals[REDRAW], 0, w->win); 373 355 } 374 356 w->dirty = 0; … … 390 372 { 391 373 _owl_window_redraw_subtree(owl_window_get_screen()); 374 } 375 376 static void _owl_window_redraw_cleanup(owl_window *w, WINDOW *win) 377 { 378 wsyncup(win); 392 379 } 393 380 … … 459 446 _owl_window_unrealize(w); 460 447 } 461 /* recalculate children sizes BEFORE remapping, so that everything can resize */ 462 owl_window_children_foreach(w, (GFunc)owl_window_recompute_position, 0); 448 g_signal_emit(w, window_signals[RESIZED], 0); 463 449 if (w->shown) { 464 450 _owl_window_realize(w); … … 470 456 owl_window_set_position(w, nlines, ncols, w->begin_y, w->begin_x); 471 457 } 472 473 void owl_window_recompute_position(owl_window *w)474 {475 if (w->size_cb) {476 /* TODO: size_cb probably wants to actually take four int*s */477 w->size_cb(w, w->size_cbdata);478 }479 }480 481 458 482 459 /** Stacking order **/
Note: See TracChangeset
for help on using the changeset viewer.