source: viewwin.c @ afbf668

barnowl_perlaimdebianowlrelease-1.4release-1.5release-1.6release-1.7release-1.8release-1.9
Last change on this file since afbf668 was afbf668, checked in by Erik Nygren <nygren@mit.edu>, 17 years ago
pexec will now incrimentally display data as it is output by the child process. Additionally, commands running under pexec may now be killed by quitting out of the popless window. Added muxevents select loop dispatcher. File descriptors may be registered with muxevents and handlers will be dispatched to when data is available for non-blocking read/write/except. Switched the stderr_redir stuff to use muxevents.
  • Property mode set to 100644
File size: 3.7 KB
Line 
1#include <string.h>
2#include "owl.h"
3
4static const char fileIdent[] = "$Id$";
5
6#define BOTTOM_OFFSET 1
7
8/* initialize the viewwin e.  'win' is an already initialzed curses
9 * window that will be used by viewwin
10 */
11void owl_viewwin_init_text(owl_viewwin *v, WINDOW *win, int winlines, int wincols, char *text)
12{
13  owl_fmtext_init_null(&(v->fmtext));
14  if (text) {
15    owl_fmtext_append_normal(&(v->fmtext), text);
16    if (text[strlen(text)-1]!='\n' && text[0]!='\0') {
17      owl_fmtext_append_normal(&(v->fmtext), "\n");
18    }
19    v->textlines=owl_fmtext_num_lines(&(v->fmtext));
20  }
21  v->topline=0;
22  v->rightshift=0;
23  v->winlines=winlines;
24  v->wincols=wincols;
25  v->curswin=win;
26  v->onclose_hook = NULL;
27}
28
29void owl_viewwin_append_text(owl_viewwin *v, char *text) {
30    owl_fmtext_append_normal(&(v->fmtext), text);
31    v->textlines=owl_fmtext_num_lines(&(v->fmtext)); 
32}
33
34/* initialize the viewwin e.  'win' is an already initialzed curses
35 * window that will be used by viewwin
36 */
37void owl_viewwin_init_fmtext(owl_viewwin *v, WINDOW *win, int winlines, int wincols, owl_fmtext *fmtext)
38{
39  owl_fmtext_copy(&(v->fmtext), fmtext);
40  v->textlines=owl_fmtext_num_lines(&(v->fmtext));
41  v->topline=0;
42  v->rightshift=0;
43  v->winlines=winlines;
44  v->wincols=wincols;
45  v->curswin=win;
46}
47
48void owl_viewwin_set_curswin(owl_viewwin *v, WINDOW *w, int winlines, int wincols)
49{
50  v->curswin=w;
51  v->winlines=winlines;
52  v->wincols=wincols;
53}
54
55void owl_viewwin_set_onclose_hook(owl_viewwin *v, void (*onclose_hook) (owl_viewwin *vwin, void *data), void *onclose_hook_data) {
56  v->onclose_hook = onclose_hook;
57  v->onclose_hook_data = onclose_hook_data;
58}
59
60/* regenerate text on the curses window. */
61/* if update == 1 then do a doupdate() */
62void owl_viewwin_redisplay(owl_viewwin *v, int update)
63{
64  owl_fmtext fm1, fm2;
65 
66  werase(v->curswin);
67  wmove(v->curswin, 0, 0);
68
69  owl_fmtext_init_null(&fm1);
70  owl_fmtext_init_null(&fm2);
71 
72  owl_fmtext_truncate_lines(&(v->fmtext), v->topline, v->winlines-BOTTOM_OFFSET, &fm1);
73  owl_fmtext_truncate_cols(&fm1, v->rightshift, v->wincols-1+v->rightshift, &fm2);
74
75  owl_fmtext_curs_waddstr(&fm2, v->curswin);
76
77  /* print the message at the bottom */
78  wmove(v->curswin, v->winlines-1, 0);
79  wattrset(v->curswin, A_REVERSE);
80  if (v->textlines - v->topline > v->winlines-BOTTOM_OFFSET) {
81    waddstr(v->curswin, "--More-- (Space to see more, 'q' to quit)");
82  } else {
83    waddstr(v->curswin, "--End-- (Press 'q' to quit)");
84  }
85  wattroff(v->curswin, A_REVERSE);
86  wnoutrefresh(v->curswin);
87
88  if (update==1) {
89    doupdate();
90  }
91
92  owl_fmtext_free(&fm1);
93  owl_fmtext_free(&fm2);
94}
95
96void owl_viewwin_pagedown(owl_viewwin *v)
97{
98  v->topline+=v->winlines - BOTTOM_OFFSET;
99  if ( (v->topline+v->winlines-BOTTOM_OFFSET) > v->textlines) {
100    v->topline = v->textlines - v->winlines + BOTTOM_OFFSET;
101  }
102}
103
104void owl_viewwin_linedown(owl_viewwin *v)
105{
106  v->topline++;
107  if ( (v->topline+v->winlines-BOTTOM_OFFSET) > v->textlines) {
108    v->topline = v->textlines - v->winlines + BOTTOM_OFFSET;
109  }
110}
111
112void owl_viewwin_pageup(owl_viewwin *v)
113{
114  v->topline-=v->winlines;
115  if (v->topline<0) v->topline=0;
116}
117
118void owl_viewwin_lineup(owl_viewwin *v)
119{
120  v->topline--;
121  if (v->topline<0) v->topline=0;
122}
123
124void owl_viewwin_right(owl_viewwin *v, int n)
125{
126  v->rightshift+=n;
127}
128
129void owl_viewwin_left(owl_viewwin *v, int n)
130{
131  v->rightshift-=n;
132  if (v->rightshift<0) v->rightshift=0;
133}
134
135void owl_viewwin_top(owl_viewwin *v)
136{
137  v->topline=0;
138  v->rightshift=0;
139}
140
141void owl_viewwin_bottom(owl_viewwin *v)
142{
143  v->topline = v->textlines - v->winlines + BOTTOM_OFFSET;
144}
145
146void owl_viewwin_free(owl_viewwin *v)
147{
148  if (v->onclose_hook) {
149    v->onclose_hook(v, v->onclose_hook_data);
150  }
151  owl_fmtext_free(&(v->fmtext));
152}
Note: See TracBrowser for help on using the repository browser.