Changeset 68f63a2
- Timestamp:
- May 29, 2010, 1:14:57 PM (15 years ago)
- Branches:
- master, release-1.10, release-1.7, release-1.8, release-1.9
- Children:
- 1383b58
- Parents:
- 7c8811c
- git-author:
- David Benjamin <davidben@mit.edu> (05/27/10 02:49:57)
- git-committer:
- David Benjamin <davidben@mit.edu> (05/29/10 13:14:57)
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
functions.c
r13ebf92 r68f63a2 1285 1285 owl_popwin_up(pw); 1286 1286 owl_global_push_context(&g, OWL_CTX_POPLESS, v, "popless"); 1287 owl_viewwin_init_text(v, owl_popwin_get_curswin(pw), 1288 owl_popwin_get_lines(pw), owl_popwin_get_cols(pw), 1289 text); 1290 owl_viewwin_redisplay(v); 1291 owl_global_set_needrefresh(&g); 1287 owl_viewwin_init_text(v, owl_popwin_get_content(pw), text); 1292 1288 } 1293 1289 … … 1302 1298 owl_popwin_up(pw); 1303 1299 owl_global_push_context(&g, OWL_CTX_POPLESS, v, "popless"); 1304 owl_viewwin_init_fmtext(v, owl_popwin_get_curswin(pw), 1305 owl_popwin_get_lines(pw), owl_popwin_get_cols(pw), 1306 fm); 1307 owl_viewwin_redisplay(v); 1308 owl_global_set_needrefresh(&g); 1300 owl_viewwin_init_fmtext(v, owl_popwin_get_content(pw), fm); 1309 1301 } 1310 1302 -
global.c
r449af72 r68f63a2 511 511 512 512 void owl_global_relayout(owl_global *g) { 513 owl_popwin *pw;514 owl_viewwin *vw;515 516 513 if (!g->relayoutpending) return; 517 514 g->relayoutpending = 0; … … 528 525 * screen */ 529 526 owl_function_calculate_topmsg(OWL_DIRECTION_NONE); 530 531 /* recreate the popwin */532 pw = owl_global_get_popwin(g);533 if (owl_popwin_is_active(pw)) {534 /*535 * This is somewhat hacky; we probably want a proper windowing layer. We536 * destroy the popwin and recreate it. Then the viewwin is redirected to537 * the new window.538 */539 vw = owl_global_get_viewwin(g);540 owl_popwin_close(pw);541 owl_popwin_up(pw);542 owl_viewwin_set_curswin(vw, owl_popwin_get_curswin(pw),543 owl_popwin_get_lines(pw), owl_popwin_get_cols(pw));544 owl_viewwin_redisplay(vw);545 }546 527 547 528 /* refresh stuff */ -
keys.c
r44cc9ab r68f63a2 342 342 343 343 void owl_keys_popless_postalways(owl_input j) { 344 owl_viewwin *v = owl_global_get_viewwin(&g);345 const owl_popwin *pw = owl_global_get_popwin(&g);346 347 if (pw && owl_popwin_is_active(pw) && v) {348 owl_viewwin_redisplay(v);349 owl_global_set_needrefresh(&g);350 }351 344 } 352 345 -
owl.h
r449af72 r68f63a2 404 404 int rightshift; 405 405 int winlines, wincols; 406 WINDOW *curswin;406 owl_window *window; 407 407 void (*onclose_hook) (struct _owl_viewwin *vwin, void *data); 408 408 void *onclose_hook_data; … … 410 410 411 411 typedef struct _owl_popwin { 412 PANEL *borderpanel;413 PANEL *poppanel;412 owl_window *border; 413 owl_window *content; 414 414 int lines; 415 415 int cols; -
popexec.c
r125fd21 r68f63a2 28 28 owl_popwin_up(pw); 29 29 owl_global_push_context(&g, OWL_CTX_POPLESS, v, "popless"); 30 owl_viewwin_init_text(v, owl_popwin_get_curswin(pw), 31 owl_popwin_get_lines(pw), owl_popwin_get_cols(pw), 32 ""); 33 owl_viewwin_redisplay(v); 34 owl_global_set_needrefresh(&g); 30 owl_viewwin_init_text(v, owl_popwin_get_content(pw), ""); 35 31 owl_viewwin_set_onclose_hook(v, owl_popexec_viewwin_onclose, pe); 36 32 pe->refcount++; … … 111 107 if (pe->winactive) { 112 108 owl_viewwin_append_text(pe->vwin, "\n"); 113 owl_viewwin_redisplay(pe->vwin);114 owl_global_set_needrefresh(&g);115 109 } 116 110 owl_select_remove_io_dispatch(d); … … 139 133 if (pe->winactive) { 140 134 owl_viewwin_append_text(pe->vwin, buf); 141 owl_viewwin_redisplay(pe->vwin);142 owl_global_set_needrefresh(&g);143 135 } 144 136 owl_free(buf); -
popwin.c
r0881cdd r68f63a2 11 11 int owl_popwin_up(owl_popwin *pw) 12 12 { 13 int glines, gcols, startcol, startline; 14 WINDOW *popwin, *borderwin; 13 /* make them zero-size for now */ 14 pw->border = owl_window_new(0, 0, 0, 0, 0); 15 pw->content = owl_window_new(pw->border, 0, 0, 0, 0); 15 16 16 /* calculate the size of the popwin */ 17 glines=owl_global_get_lines(&g); 18 gcols=owl_global_get_cols(&g); 17 owl_window_set_redraw_cb(pw->border, owl_popwin_draw_border, pw, 0); 18 owl_window_set_resize_cb(pw->border, owl_popwin_resize_content, pw, 0); 19 /* HACK */ 20 owl_window_set_resize_cb(owl_window_get_screen(), owl_popwin_reposition, pw, 0); 19 21 20 pw->lines = owl_util_min(glines,24)*3/4 + owl_util_max(glines-24,0)/2; 21 startline = (glines-pw->lines)/2; 22 /* calculate position, THEN map the windows maybe setting a resize hook 23 * should just cause it to get called? */ 24 owl_popwin_reposition(owl_window_get_screen(), pw); 25 owl_window_map(pw->border, 1); 22 26 23 pw->cols = owl_util_min(gcols,90)*15/16 + owl_util_max(gcols-90,0)/2; 24 startcol = (gcols-pw->cols)/2; 27 pw->active=1; 28 return(0); 29 } 25 30 26 borderwin = newwin(pw->lines, pw->cols, startline, startcol); 27 pw->borderpanel = new_panel(borderwin); 28 popwin = newwin(pw->lines-2, pw->cols-2, startline+1, startcol+1); 29 pw->poppanel = new_panel(popwin); 31 void owl_popwin_reposition(owl_window *screen, void *user_data) 32 { 33 owl_popwin *pw = user_data; 34 int lines, cols, startline, startcol; 35 int glines, gcols; 30 36 31 werase(popwin); 32 werase(borderwin); 37 owl_window_get_position(screen, &glines, &gcols, 0, 0); 38 39 lines = owl_util_min(glines,24)*3/4 + owl_util_max(glines-24,0)/2; 40 startline = (glines-lines)/2; 41 cols = owl_util_min(gcols,90)*15/16 + owl_util_max(gcols-90,0)/2; 42 startcol = (gcols-cols)/2; 43 44 owl_window_set_position(pw->border, lines, cols, startline, startcol); 45 } 46 47 void owl_popwin_resize_content(owl_window *w, void *user_data) 48 { 49 owl_popwin *pw = user_data; 50 owl_window_get_position(w, &pw->lines, &pw->cols, 0, 0); 51 owl_window_set_position(pw->content, pw->lines-2, pw->cols-2, 1, 1); 52 } 53 54 void owl_popwin_draw_border(owl_window *w, WINDOW *borderwin, void *user_data) 55 { 56 owl_popwin *pw = user_data; 33 57 if (owl_global_is_fancylines(&g)) { 34 58 box(borderwin, 0, 0); … … 44 68 waddch(borderwin, '+'); 45 69 } 46 47 owl_global_set_needrefresh(&g);48 pw->active=1;49 return(0);50 70 } 51 71 52 72 int owl_popwin_close(owl_popwin *pw) 53 73 { 54 WINDOW *popwin, *borderwin; 55 56 popwin = panel_window(pw->poppanel); 57 borderwin = panel_window(pw->borderpanel); 58 59 del_panel(pw->poppanel); 60 del_panel(pw->borderpanel); 61 delwin(popwin); 62 delwin(borderwin); 63 74 owl_window_delete(pw->border); 75 pw->border = 0; 76 pw->content = 0; 64 77 pw->active=0; 65 owl_ global_set_needrefresh(&g);78 owl_window_set_resize_cb(owl_window_get_screen(), 0, 0, 0); 66 79 return(0); 67 80 } … … 72 85 } 73 86 74 WINDOW *owl_popwin_get_curswin(const owl_popwin *pw)87 owl_window *owl_popwin_get_content(const owl_popwin *pw) 75 88 { 76 return p anel_window(pw->poppanel);89 return pw->content; 77 90 } 78 91 -
viewwin.c
rfe4c786 r68f63a2 7 7 * window that will be used by viewwin 8 8 */ 9 void owl_viewwin_init_text(owl_viewwin *v, WINDOW *win, int winlines, int wincols, const char *text)9 void owl_viewwin_init_text(owl_viewwin *v, owl_window *win, const char *text) 10 10 { 11 11 owl_fmtext_init_null(&(v->fmtext)); … … 19 19 v->topline=0; 20 20 v->rightshift=0; 21 v->winlines=winlines;22 v->wincols=wincols;23 v->curswin=win;24 21 v->onclose_hook = NULL; 22 23 owl_viewwin_set_window(v, win); 25 24 } 26 25 … … 28 27 owl_fmtext_append_normal(&(v->fmtext), text); 29 28 v->textlines=owl_fmtext_num_lines(&(v->fmtext)); 29 owl_window_dirty(v->window); 30 30 } 31 31 … … 33 33 * window that will be used by viewwin 34 34 */ 35 void owl_viewwin_init_fmtext(owl_viewwin *v, WINDOW *win, int winlines, int wincols, const owl_fmtext *fmtext)35 void owl_viewwin_init_fmtext(owl_viewwin *v, owl_window *win, const owl_fmtext *fmtext) 36 36 { 37 37 char *text; … … 46 46 v->topline=0; 47 47 v->rightshift=0; 48 v->winlines=winlines; 49 v->wincols=wincols; 50 v->curswin=win; 48 49 owl_viewwin_set_window(v, win); 51 50 } 52 51 53 void owl_viewwin_set_ curswin(owl_viewwin *v, WINDOW *w, int winlines, int wincols)52 void owl_viewwin_set_window(owl_viewwin *v, owl_window *w) 54 53 { 55 v->curswin=w; 56 v->winlines=winlines; 57 v->wincols=wincols; 54 if (v->window) { 55 owl_window_set_redraw_cb(v->window, 0, 0, 0); 56 owl_window_set_resize_cb(v->window, 0, 0, 0); 57 } 58 v->window = w; 59 if (w) { 60 owl_window_get_position(w, &v->winlines, &v->wincols, 0, 0); 61 owl_window_set_redraw_cb(w, owl_viewwin_redisplay, v, 0); 62 owl_window_set_resize_cb(w, owl_viewwin_resize_hook, v, 0); 63 } 58 64 } 59 65 … … 63 69 } 64 70 71 void owl_viewwin_resize_hook(owl_window *w, void *user_data) 72 { 73 owl_viewwin *v = user_data; 74 owl_window_get_position(w, &v->winlines, &v->wincols, 0, 0); 75 } 76 65 77 /* regenerate text on the curses window. */ 66 void owl_viewwin_redisplay(owl_ viewwin *v)78 void owl_viewwin_redisplay(owl_window *w, WINDOW *curswin, void *user_data) 67 79 { 68 80 owl_fmtext fm1, fm2; 69 70 /* avoid segfault when screen too small to create curswin */ 71 if (v->curswin == NULL) 72 return; 81 owl_viewwin *v = user_data; 73 82 74 werase( v->curswin);75 wmove( v->curswin, 0, 0);83 werase(curswin); 84 wmove(curswin, 0, 0); 76 85 77 86 owl_fmtext_init_null(&fm1); … … 81 90 owl_fmtext_truncate_cols(&fm1, v->rightshift, v->wincols-1+v->rightshift, &fm2); 82 91 83 owl_fmtext_curs_waddstr_without_search(&fm2, v->curswin);92 owl_fmtext_curs_waddstr_without_search(&fm2, curswin); 84 93 85 94 /* print the message at the bottom */ 86 wmove( v->curswin, v->winlines-1, 0);87 wattrset( v->curswin, A_REVERSE);95 wmove(curswin, v->winlines-1, 0); 96 wattrset(curswin, A_REVERSE); 88 97 if (v->textlines - v->topline > v->winlines-BOTTOM_OFFSET) { 89 waddstr( v->curswin, "--More-- (Space to see more, 'q' to quit)");98 waddstr(curswin, "--More-- (Space to see more, 'q' to quit)"); 90 99 } else { 91 waddstr( v->curswin, "--End-- (Press 'q' to quit)");100 waddstr(curswin, "--End-- (Press 'q' to quit)"); 92 101 } 93 wattroff( v->curswin, A_REVERSE);102 wattroff(curswin, A_REVERSE); 94 103 95 104 owl_fmtext_cleanup(&fm1); … … 103 112 v->topline = v->textlines - v->winlines + BOTTOM_OFFSET; 104 113 } 114 owl_window_dirty(v->window); 105 115 } 106 116 … … 111 121 v->topline = v->textlines - v->winlines + BOTTOM_OFFSET; 112 122 } 123 owl_window_dirty(v->window); 113 124 } 114 125 … … 117 128 v->topline-=v->winlines; 118 129 if (v->topline<0) v->topline=0; 130 owl_window_dirty(v->window); 119 131 } 120 132 … … 123 135 v->topline--; 124 136 if (v->topline<0) v->topline=0; 137 owl_window_dirty(v->window); 125 138 } 126 139 … … 128 141 { 129 142 v->rightshift+=n; 143 owl_window_dirty(v->window); 130 144 } 131 145 … … 134 148 v->rightshift-=n; 135 149 if (v->rightshift<0) v->rightshift=0; 150 owl_window_dirty(v->window); 136 151 } 137 152 … … 140 155 v->topline=0; 141 156 v->rightshift=0; 157 owl_window_dirty(v->window); 142 158 } 143 159 … … 145 161 { 146 162 v->topline = v->textlines - v->winlines + BOTTOM_OFFSET; 163 owl_window_dirty(v->window); 147 164 } 148 165
Note: See TracChangeset
for help on using the changeset viewer.