another update from CVS HEAD, for QA
[alioth/jupp.git] / qw.c
1 /*
2  *      Query windows
3  *      Copyright
4  *              (C) 1992 Joseph H. Allen
5  *
6  *      This file is part of JOE (Joe's Own Editor)
7  */
8 #include "config.h"
9 #include "types.h"
10
11 __RCSID("$MirOS: contrib/code/jupp/qw.c,v 1.11 2017/12/08 02:17:22 tg Exp $");
12
13 #include <stdlib.h>
14
15 #include "utils.h"
16 #include "vs.h"
17 #include "charmap.h"
18 #include "qw.h"
19 #include "scrn.h"
20 #include "w.h"
21
22 static void dispqw(jobject jO, int flg __attribute__((__unused__)))
23 {
24         QW *qw = jO.qw;
25         W *w = qw->parent;
26
27         /* Scroll buffer and position prompt */
28         if (qw->promptlen > w->w / 2 + w->w / 4)
29                 qw->promptofst = qw->promptlen - w->w / 2;
30         else
31                 qw->promptofst = 0;
32
33         /* Set cursor position */
34         w->curx = qw->promptlen - qw->promptofst;
35         w->cury = 0;
36
37         /* Generate prompt */
38         w->t->t->updtab[w->y] = 1;
39         genfield(w->t->t,
40             w->t->t->scrn + w->y * w->t->t->co + w->x,
41             w->t->t->attr + w->y * w->t->t->co + w->x,
42             w->x,
43             w->y,
44             qw->promptofst,
45             qw->prompt,
46             qw->promptlen,
47             0,
48             w->w - w->x,
49             1,
50             NULL);
51 }
52
53 static void dispqwn(jobject jO, int flg __attribute__((__unused__)))
54 {
55         QW *qw = jO.qw;
56         W *w = qw->parent;
57
58         /* Scroll buffer and position prompt */
59         if (qw->promptlen > w->w / 2 + w->w / 4)
60                 qw->promptofst = qw->promptlen - w->w / 2;
61         else
62                 qw->promptofst = 0;
63
64         /* Set cursor position */
65         if (w->win->watom->follow && w->win->object.base)
66                 w->win->watom->follow(w->win->object);
67         if (w->win->watom->disp && w->win->object.base)
68                 w->win->watom->disp(w->win->object, 1);
69         w->curx = w->win->curx;
70         w->cury = w->win->cury + w->win->y - w->y;
71
72         /* Generate prompt */
73         w->t->t->updtab[w->y] = 1;
74         genfield(w->t->t,
75             w->t->t->scrn + w->y * w->t->t->co + w->x,
76             w->t->t->attr + w->y * w->t->t->co + w->x,
77             w->x,
78             w->y,
79             qw->promptofst,
80             qw->prompt,
81             qw->promptlen,
82             0,
83             w->w - w->x,
84             1,
85             NULL);
86 }
87
88 /* When user hits a key in a query window */
89
90 struct utf8_sm qw_sm;
91
92 static int utypeqw(jobject jO, int c)
93 {
94         QW *qw = jO.qw;
95         W *win;
96         W *w = qw->parent;
97         int *notify = w->notify;
98         jpoly_int *func;
99         void *object = qw->object;
100
101         if (locale_map->type) {
102                 c = utf8_decode(&qw_sm, c);
103                 if (c<0)
104                         return 0;
105         }
106
107         win = qw->parent->win;
108         func = qw->func;
109         vsrm(qw->prompt);
110         free(qw);
111         w->object.base = NULL;
112         w->notify = NULL;
113         wabort(w);
114         if (func)
115                 return func(win->object, c, object, notify);
116         return -1;
117 }
118
119 static int abortqw(jobject jO)
120 {
121         QW *qw = jO.qw;
122         W *win = qw->parent->win;
123         void *object = qw->object;
124         jpoly_int *abrt = qw->abrt;
125
126         vsrm(qw->prompt);
127         free(qw);
128         if (abrt)
129                 return abrt(win->object, object);
130         else
131                 return -1;
132 }
133
134 static WATOM watomqw = {
135         US "query",
136         dispqw,
137         NULL,
138         abortqw,
139         NULL,
140         utypeqw,
141         NULL,
142         NULL,
143         NULL,
144         NULL,
145         TYPEQW
146 };
147
148 static WATOM watqwn = {
149         US "querya",
150         dispqwn,
151         NULL,
152         abortqw,
153         NULL,
154         utypeqw,
155         NULL,
156         NULL,
157         NULL,
158         NULL,
159         TYPEQW
160 };
161
162 static WATOM watqwsr = {
163         US "querysr",
164         dispqwn,
165         NULL,
166         abortqw,
167         NULL,
168         utypeqw,
169         NULL,
170         NULL,
171         NULL,
172         NULL,
173         TYPEQW
174 };
175
176 /* Create a query window */
177
178 QW *mkqw(W *w, unsigned char *prompt, int len, jpoly_int *func, jpoly_int *abrt, void *object, int *notify)
179 {
180         W *new;
181         QW *qw;
182
183         new = wcreate(w->t, &watomqw, w, w, w->main, 1, NULL, notify);
184         if (!new) {
185                 if (notify)
186                         *notify = 1;
187                 return NULL;
188         }
189         wfit(new->t);
190         new->object.qw = qw = malloc(sizeof(QW));
191         qw->parent = new;
192         qw->prompt = vsncpy(NULL, 0, prompt, len);
193         qw->promptlen = len;
194         qw->promptofst = 0;
195         qw->func = func;
196         qw->abrt = abrt;
197         qw->object = object;
198         w->t->curwin = new;
199         return qw;
200 }
201
202 /* Same as above, but cursor is left in original window */
203 /* For Ctrl-Meta thing */
204
205 QW *mkqwna(W *w, unsigned char *prompt, int len, jpoly_int *func, jpoly_int *abrt, void *object, int *notify)
206 {
207         W *new;
208         QW *qw;
209
210         new = wcreate(w->t, &watqwn, w, w, w->main, 1, NULL, notify);
211         if (!new) {
212                 if (notify)
213                         *notify = 1;
214                 return NULL;
215         }
216         wfit(new->t);
217         new->object.qw = qw = malloc(sizeof(QW));
218         qw->parent = new;
219         qw->prompt = vsncpy(NULL, 0, prompt, len);
220         qw->promptlen = len;
221         qw->promptofst = 0;
222         qw->func = func;
223         qw->abrt = abrt;
224         qw->object = object;
225         w->t->curwin = new;
226         return qw;
227 }
228
229 /* Same as above, but cursor is left in original window */
230 /* For search and replace thing */
231
232 QW *mkqwnsr(W *w, unsigned char *prompt, int len, jpoly_int *func, jpoly_int *abrt, void *object, int *notify)
233 {
234         W *new;
235         QW *qw;
236
237         new = wcreate(w->t, &watqwsr, w, w, w->main, 1, NULL, notify);
238         if (!new) {
239                 if (notify)
240                         *notify = 1;
241                 return NULL;
242         }
243         wfit(new->t);
244         new->object.qw = qw = malloc(sizeof(QW));
245         qw->parent = new;
246         qw->prompt = vsncpy(NULL, 0, prompt, len);
247         qw->promptlen = len;
248         qw->promptofst = 0;
249         qw->func = func;
250         qw->abrt = abrt;
251         qw->object = object;
252         w->t->curwin = new;
253         return qw;
254 }