2
/* Lefteris Koutsofios - AT&T Bell Laboratories */
9
#define WTU widget->u.t
11
int GTcreatewidget (Gwidget_t *parent, Gwidget_t *widget,
12
int attrn, Gwattr_t *attrp) {
19
static XawTextSelectType sarray[] = {
20
XawselectLine, XawselectNull
24
Gerr (POS, G_ERRNOPARENTWIDGET);
28
ps.x = ps.y = MINTWSIZE;
31
for (ai = 0; ai < attrn; ai++) {
32
switch (attrp[ai].id) {
34
GETSIZE (attrp[ai].u.s, ps, MINTWSIZE);
36
case G_ATTRBORDERWIDTH:
37
ADD2ARGS (XtNborderWidth, attrp[ai].u.i);
40
ADD2ARGS (XtNstring, attrp[ai].u.t);
42
case G_ATTRAPPENDTEXT:
43
Gerr (POS, G_ERRCANNOTSETATTR1, "appendtext");
49
color = attrp[ai].u.c.index;
50
if (color != 0 && color != 1) {
51
Gerr (POS, G_ERRBADCOLORINDEX, color);
54
c.red = attrp[ai].u.c.r * 257;
55
c.green = attrp[ai].u.c.g * 257;
56
c.blue = attrp[ai].u.c.b * 257;
58
Gdisplay, DefaultColormap (Gdisplay, Gscreenn), &c
61
ADD2ARGS (XtNbackground, c.pixel);
63
ADD2ARGS (XtNforeground, c.pixel);
66
Gerr (POS, G_ERRCANNOTSETATTR1, "windowid");
69
WTU->func = (Gtwnewlinecb) attrp[ai].u.func;
72
widget->udata = attrp[ai].u.u;
75
Gerr (POS, G_ERRBADATTRID, attrp[ai].id);
79
ADD2ARGS (XtNwidth, ps.x);
80
ADD2ARGS (XtNheight, ps.y);
81
if (Strcmp ("oneline", s) == 0)
82
ADD2ARGS (XtNeditType, XawtextAppend);
83
else if (Strcmp ("input", s) == 0 || Strcmp ("select", s) == 0)
84
ADD2ARGS (XtNeditType, XawtextEdit);
85
else if (Strcmp ("output", s) == 0)
86
ADD2ARGS (XtNeditType, XawtextRead);
88
Gerr (POS, G_ERRBADATTRVALUE, s);
91
ADD2ARGS (XtNscrollHorizontal, XawtextScrollWhenNeeded);
92
ADD2ARGS (XtNscrollVertical, XawtextScrollWhenNeeded);
93
if (!(widget->w = XtCreateWidget ("ascii", asciiTextWidgetClass,
94
parent->w, argp, argn))) {
95
Gerr (POS, G_ERRCANNOTCREATEWIDGET);
98
if (Strcmp ("oneline", s) == 0 || Strcmp ("input", s) == 0)
99
XtOverrideTranslations (widget->w, Gtweoltable);
100
else if (Strcmp ("select", s) == 0)
101
XawTextSetSelectionArray (widget->w, sarray);
102
Glazymanage (widget->w);
106
int GTsetwidgetattr (Gwidget_t *widget, int attrn, Gwattr_t *attrp) {
114
for (ai = 0; ai < attrn; ai++) {
115
switch (attrp[ai].id) {
117
GETSIZE (attrp[ai].u.s, ps, MINTWSIZE);
118
ADD2ARGS (XtNwidth, ps.x);
119
ADD2ARGS (XtNheight, ps.y);
121
case G_ATTRBORDERWIDTH:
122
ADD2ARGS (XtNborderWidth, attrp[ai].u.i);
125
ADD2ARGS (XtNstring, attrp[ai].u.t);
127
case G_ATTRAPPENDTEXT:
128
XawTextSetInsertionPoint (widget->w, 327670000);
129
li = XawTextGetInsertionPoint (widget->w);
130
tb.firstPos = 0, tb.length = strlen (attrp[ai].u.t);
131
tb.ptr = attrp[ai].u.t, tb.format = FMT8BIT;
132
XawTextReplace (widget->w, li, li, &tb);
133
li = XawTextGetInsertionPoint (widget->w);
134
tb.firstPos = 0, tb.length = 1;
135
tb.ptr = "\n", tb.format = FMT8BIT;
136
XawTextReplace (widget->w, li, li, &tb);
139
if (Strcmp ("oneline", attrp[ai].u.t) == 0)
140
ADD2ARGS (XtNeditType, XawtextAppend);
141
else if (Strcmp ("input", attrp[ai].u.t) == 0)
142
ADD2ARGS (XtNeditType, XawtextEdit);
143
else if (Strcmp ("output", attrp[ai].u.t) == 0)
144
ADD2ARGS (XtNeditType, XawtextRead);
146
Gerr (POS, G_ERRBADATTRVALUE, attrp[ai].u.t);
151
color = attrp[ai].u.c.index;
152
if (color != 0 && color != 1) {
153
Gerr (POS, G_ERRBADCOLORINDEX, color);
156
c.red = attrp[ai].u.c.r * 257;
157
c.green = attrp[ai].u.c.g * 257;
158
c.blue = attrp[ai].u.c.b * 257;
160
Gdisplay, DefaultColormap (Gdisplay, Gscreenn), &c
163
ADD2ARGS (XtNbackground, c.pixel);
165
ADD2ARGS (XtNforeground, c.pixel);
168
Gerr (POS, G_ERRCANNOTSETATTR2, "windowid");
170
case G_ATTRNEWLINECB:
171
WTU->func = (Gtwnewlinecb) attrp[ai].u.func;
174
widget->udata = attrp[ai].u.u;
177
Gerr (POS, G_ERRBADATTRID, attrp[ai].id);
181
XtSetValues (widget->w, argp, argn);
185
int GTgetwidgetattr (Gwidget_t *widget, int attrn, Gwattr_t *attrp) {
186
Dimension width, height;
187
XawTextEditType mode;
193
for (ai = 0; ai < attrn; ai++) {
195
switch (attrp[ai].id) {
197
ADD2ARGS (XtNwidth, &width);
198
ADD2ARGS (XtNheight, &height);
199
XtGetValues (widget->w, argp, argn);
200
attrp[ai].u.s.x = width, attrp[ai].u.s.y = height;
202
case G_ATTRBORDERWIDTH:
203
ADD2ARGS (XtNborderWidth, &width);
204
XtGetValues (widget->w, argp, argn);
205
attrp[ai].u.i = width;
208
w = XawTextGetSource (widget->w);
209
tb.firstPos = 0, tb.ptr = NULL, tb.format = FMT8BIT, tb.length = 0;
210
rtn = XawTextSourceRead (w, 0, &tb, 30000);
211
if (rtn > Gbufn + 1) {
212
Gbufp = Marraygrow (Gbufp, (long) (rtn + 1) * BUFSIZE);
215
for (Gbufi = 0; Gbufi < rtn; Gbufi++)
216
Gbufp[Gbufi] = tb.ptr[Gbufi];
217
Gbufp[Gbufi++] = '\000';
218
attrp[ai].u.t = &Gbufp[0];
220
case G_ATTRAPPENDTEXT:
221
Gerr (POS, G_ERRCANNOTGETATTR, "appendtext");
223
case G_ATTRSELECTION:
224
w = XawTextGetSource (widget->w);
225
XawTextGetSelectionPos (widget->w, &fi, &li);
226
tb.firstPos = 0, tb.ptr = NULL, tb.format = FMT8BIT, tb.length = 0;
227
rtn = XawTextSourceRead (w, fi, &tb, li - fi);
228
if (li - fi > Gbufn + 1) {
229
Gbufp = Marraygrow (Gbufp, (long) (rtn + 1) * BUFSIZE);
232
for (Gbufi = 0; Gbufi < li - fi; Gbufi++)
233
Gbufp[Gbufi] = tb.ptr[Gbufi];
234
Gbufp[Gbufi++] = '\000';
235
attrp[ai].u.t = &Gbufp[0];
238
ADD2ARGS (XtNeditType, &mode);
239
XtGetValues (widget->w, argp, argn);
240
if (mode == XawtextAppend)
241
attrp[ai].u.t = "oneline";
242
else if (mode == XawtextEdit)
243
attrp[ai].u.t = "input";
244
else if (mode == XawtextRead)
245
attrp[ai].u.t = "output";
247
panic (POS, "GTgetwidgetattr", "unexpected text mode");
252
sprintf (&Gbufp[0], "0x%lx", XtWindow (widget->w));
253
attrp[ai].u.t = &Gbufp[0];
255
case G_ATTRNEWLINECB:
256
attrp[ai].u.func = WTU->func;
259
attrp[ai].u.u = widget->udata;
262
Gerr (POS, G_ERRBADATTRID, attrp[ai].id);
269
int GTdestroywidget (Gwidget_t *widget) {
270
XtDestroyWidget (widget->w);
274
/* used for one line text input widgets */
275
void Gtweolaction (Widget w, XEvent *evp, char **app, unsigned int *anp) {
279
int ret, fi, li, n, i;
281
widget = findwidget ((unsigned long) w, G_TEXTWIDGET);
282
li = XawTextGetInsertionPoint (w) - 1;
283
ww = XawTextGetSource (w);
284
tb.firstPos = 0, tb.ptr = "\n", tb.format = FMT8BIT, tb.length = 1;
285
fi = XawTextSourceSearch (ww, li, XawsdLeft, &tb);
286
if (fi == XawTextSearchError)
291
Gbufp[(Gbufi = 0)] = '\000';
293
ret = XawTextSourceRead (ww, fi, &tb, n - Gbufi) - fi;
294
for (i = 0; i < ret; i++)
295
Gbufp[Gbufi++] = tb.ptr[i];
297
Gbufp[Gbufi] = '\000';
298
if (n >= 0 && WTU->func)
299
(*WTU->func) (widget - &Gwidgets[0], Gbufp);