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