1 /********************************************************************
2 This file is part of the abs 0.907 distribution.  abs is a spreadsheet
3 with graphical user interface.
4 
5 Copyright (C) 1998-2001  Andr� Bertin (Andre.Bertin@ping.be)
6 
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version if in the same spirit as version 2.
11 
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 
21 Concact: abs@pi.be
22          http://home.pi.be/bertin/abs.shtml
23 
24 *********************************************************************/
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 #include "param.h"
52 #include "memory.h"
53 #include "gr_interf.h"
54 #include <stdio.h>
55 
56 Arg w_args[50];
57 int w_n;
58 
59 
60 int
w_arg(String Name,XtArgVal Value)61 w_arg (String Name, XtArgVal Value)
62 {
63   XtSetArg (w_args[w_n], Name, Value);
64   w_n++;
65   return w_n;
66 }
67 
68 int
w_set(Widget w)69 w_set (Widget w)
70 {
71   XtSetValues (w, w_args, w_n);
72   return w_n;
73 }
74 
75 int
w_rel(Widget w,int x,int y)76 w_rel (Widget w, int x, int y)
77 {
78   XtSetArg (w_args[w_n], XtNfromHoriz, w);
79   w_n++;
80   XtSetArg (w_args[w_n], XtNfromVert, w);
81   w_n++;
82   XtSetArg (w_args[w_n], XtNhorizDistance, x);
83   w_n++;
84   XtSetArg (w_args[w_n], XtNvertDistance, y);
85   w_n++;
86   return w_n;
87 }
88 
89 int
w_relh(Widget w,int x)90 w_relh (Widget w, int x)
91 {
92   XtSetArg (w_args[w_n], XtNfromHoriz, w);
93   w_n++;
94   XtSetArg (w_args[w_n], XtNhorizDistance, x);
95   w_n++;
96   return w_n;
97 }
98 
99 int
w_relv(Widget w,int y)100 w_relv (Widget w, int y)
101 {
102   XtSetArg (w_args[w_n], XtNfromVert, w);
103   w_n++;
104   XtSetArg (w_args[w_n], XtNvertDistance, y);
105   w_n++;
106   return w_n;
107 }
108 
109 
110 int
w_dim(int x,int y)111 w_dim (int x, int y)
112 {
113   XtSetArg (w_args[w_n], XtNwidth, x);
114   w_n++;
115   XtSetArg (w_args[w_n], XtNheight, y);
116   w_n++;
117   return w_n;
118 }
119 
120 int
w_bord(int l)121 w_bord (int l)
122 {
123   XtSetArg (w_args[w_n], XtNborderWidth, l);
124   w_n++;
125   return w_n;
126 }
127 
128 int
w_inbord(int l)129 w_inbord (int l)
130 {
131   XtSetArg (w_args[w_n], XtNinternalBorderWidth, l);
132   w_n++;
133   return w_n;
134 }
135 
136 int
w_noresize()137 w_noresize ()
138 {
139   XtSetArg (w_args[w_n], XtNleft, XtChainLeft);
140   w_n++;
141   XtSetArg (w_args[w_n], XtNright, XtChainLeft);
142   w_n++;
143   XtSetArg (w_args[w_n], XtNtop, XtChainTop);
144   w_n++;
145   XtSetArg (w_args[w_n], XtNbottom, XtChainTop);
146   w_n++;
147 
148   return w_n;
149 }
150 
151 int
w_novresize()152 w_novresize ()
153 {
154   XtSetArg (w_args[w_n], XtNtop, XtChainTop);
155   w_n++;
156   XtSetArg (w_args[w_n], XtNbottom, XtChainTop);
157   w_n++;
158 
159   return w_n;
160 }
161 
162 int
w_novresizebot()163 w_novresizebot ()
164 {
165   XtSetArg (w_args[w_n], XtNtop, XtChainBottom);
166   w_n++;
167   XtSetArg (w_args[w_n], XtNbottom, XtChainBottom);
168   w_n++;
169 
170   return w_n;
171 }
172 
173 
174 int
w_nohresize()175 w_nohresize ()
176 {
177   XtSetArg (w_args[w_n], XtNleft, XtChainLeft);
178   w_n++;
179   XtSetArg (w_args[w_n], XtNright, XtChainLeft);
180   w_n++;
181 
182   return w_n;
183 }
184 
185 int
w_vresize()186 w_vresize ()
187 {
188   XtSetArg (w_args[w_n], XtNtop, XtChainTop);
189   w_n++;
190   XtSetArg (w_args[w_n], XtNbottom, XtChainBottom);
191   w_n++;
192 
193   return w_n;
194 }
195 
196 int
w_hresize()197 w_hresize ()
198 {
199   XtSetArg (w_args[w_n], XtNleft, XtChainLeft);
200   w_n++;
201   XtSetArg (w_args[w_n], XtNright, XtChainRight);
202   w_n++;
203 
204   return w_n;
205 }
206 
207 int
w_bONw()208 w_bONw ()
209 {
210   XtSetArg (w_args[w_n], XtNbackground, abswhite);
211   w_n++;
212   XtSetArg (w_args[w_n], XtNforeground, absblack);
213   w_n++;
214   return w_n;
215 }
216 
217 
218 
219 
220 Widget
CreateLabel(Widget base,char * label,int x,int y,int w,int h)221 CreateLabel (Widget base, char *label, int x, int y, int w, int h)
222 {
223 
224   w_n = 0;
225   w_dim (w, h);
226   w_rel (NULL, x, y);
227   XtSetArg (w_args[w_n], XtNborderWidth, 0);
228   w_n++;
229   XtSetArg (w_args[w_n], XtNlabel, label);
230   w_n++;
231   XtSetArg (w_args[w_n], XtNjustify, XtJustifyLeft);
232   w_n++;
233   return XtCreateManagedWidget
234     (label, labelWidgetClass, base, w_args, w_n);
235 }
236 
237 Widget
CreateText(Widget base,char * label,int x,int y,int w,int h)238 CreateText (Widget base, char *label, int x, int y, int w, int h)
239 {
240   w_n = 0;
241   w_dim (w, h);
242   w_rel (NULL, x, y);
243   XtSetArg (w_args[w_n], XtNborderWidth, 0);
244   w_n++;
245   XtSetArg (w_args[w_n], XtNjustify, XtJustifyLeft);
246   w_n++;
247   XtSetArg (w_args[w_n], XtNeditType, XawtextEdit);
248   w_n++;
249   XtSetArg (w_args[w_n], XtNscrollVertical, XawtextScrollWhenNeeded);
250   w_n++;
251   XtSetArg (w_args[w_n], XtNscrollHorizontal, XawtextScrollWhenNeeded);
252   w_n++;
253   return XtCreateManagedWidget
254     (label, asciiTextWidgetClass, base, w_args, w_n);
255 }
256 
257 void
TextPrintf(Widget w,char * str)258 TextPrintf (Widget w, char *str)
259 {
260   w_n = 0;
261   XtSetArg (w_args[w_n], XtNstring, str);
262   w_n++;
263   XtSetArg (w_args[w_n], XtNeditType, XawtextRead);
264   w_n++;
265   XtSetValues (w, w_args, w_n);
266 
267   XawTextDisplayCaret (w, False);
268 
269   XawTextSetInsertionPoint (w, 0);
270 }
271 
272 
273 
274 static char alltextTranslations[] = "\
275 <Key>Home:     beginning-of-line() \n\
276 <Key>End:      end-of-line() \n\
277 <Key>Right:     forward-character() \n\
278 <Key>Left:      backward-character() \n\
279 <Key>Down:      next-line() \n\
280 <Key>Up:        previous-line() \n\
281 <Key>BackSpace: delete-previous-character() \n\
282 <Key>Delete:    delete-next-character() \n\
283 <Key>Linefeed:  newline-and-indent() \n\
284 <Key>Return:    newline() \n\
285 <Key>:          insert-char() \n\
286 <FocusIn>:      focus-in() \n\
287 <FocusOut>:     focus-out() \n\
288 <Btn1Down>:     select-start() \n\
289 <Btn1Motion>:   extend-adjust() \n\
290 <Btn1Up>:       extend-end(PRIMARY, CUT_BUFFER0) \n\
291 <Btn2Down>:     insert-selection(PRIMARY, CUT_BUFFER0) \n\
292 <Btn3Down>:     extend-start() \n\
293 <Btn3Motion>:   extend-adjust() \n\
294 <Btn3Up>:       extend-end(PRIMARY, CUT_BUFFER0) \n\
295 ";
296 
297 Widget
CreateEntry(Widget base,char * label,int x,int y,int w,int h,char * val)298 CreateEntry (Widget base, char *label, int x, int y, int w, int h, char *val)
299 {
300   Widget ret;
301   XtTranslations trans_table = XtParseTranslationTable (alltextTranslations);
302   w_n = 0;
303   w_dim (w, h);
304   w_rel (NULL, x, y);
305   XtSetArg (w_args[w_n], XtNborderWidth, 0);
306   w_n++;
307   XtSetArg (w_args[w_n], XtNlabel, label);
308   w_n++;
309   XtSetArg (w_args[w_n], XtNjustify, XtJustifyLeft);
310   w_n++;
311   XtSetArg (w_args[w_n], XtNstring, val);
312   w_n++;
313   XtSetArg (w_args[w_n], XtNinsertPosition, 1);
314   w_n++;
315   XtSetArg (w_args[w_n], XtNeditType, XawtextEdit);
316   w_n++;
317   XtSetArg (w_args[w_n], XtNtranslations, trans_table);
318   w_n++;
319   w_bONw ();
320 
321   ret = XtCreateManagedWidget
322     (label, asciiTextWidgetClass, base, w_args, w_n);
323   return ret;
324 }
325 
326 int
EntrySetEditable(Widget w,int yes)327 EntrySetEditable (Widget w, int yes)
328 {
329   w_n = 0;
330   if (yes)
331     {
332       XtSetArg (w_args[w_n], XtNeditType, XawtextEdit);
333       w_n++;
334       XawTextDisplayCaret (w, True);
335     }
336   else
337     {
338       XtSetArg (w_args[w_n], XtNeditType, XawtextRead);
339       w_n++;
340       XawTextDisplayCaret (w, False);
341     }
342   w_set (w);
343   return 0;
344 }
345 
346 int
EntrySetInsertionPosition(Widget w,int pos)347 EntrySetInsertionPosition (Widget w, int pos)
348 {
349   w_n = 0;
350   XtSetArg (w_args[w_n], XtNinsertPosition, pos);
351   w_set (w);
352   return 0;
353 }
354 
355 
356 int
SetEntryString(Widget w,char * buf)357 SetEntryString (Widget w, char *buf)
358 {
359   w_n = 0;
360   XtSetArg (w_args[w_n], XtNstring, buf);
361   w_n++;
362   XtSetValues (w, w_args, w_n);
363   return 0;
364 }
365 
366 char *
GetEntryString(Widget w)367 GetEntryString (Widget w)
368 {
369   char *buf;
370 
371   w_n = 0;
372   XtSetArg (w_args[w_n], XtNstring, &buf);
373   w_n++;
374   XtGetValues (w, w_args, w_n);
375 
376   return buf;
377 }
378 
379 
380 int
SetEntryVal(Widget w,double val)381 SetEntryVal (Widget w, double val)
382 {
383   char buf[256];
384   sprintf (buf, "%g", val);
385   w_n = 0;
386   XtSetArg (w_args[w_n], XtNstring, buf);
387   w_n++;
388   XtSetValues (w, w_args, w_n);
389   return 0;
390 }
391 
392 double
GetEntryVal(Widget w)393 GetEntryVal (Widget w)
394 {
395   char *buf;
396   double val;
397 
398   w_n = 0;
399   XtSetArg (w_args[w_n], XtNstring, &buf);
400   w_n++;
401   XtGetValues (w, w_args, w_n);
402 
403   sscanf (buf, "%lf", &val);
404 
405   return val;
406 }
407 
408 
409 
410 int
insertstring(Widget w,char * str)411 insertstring (Widget w, char *str)
412 {
413   XawTextBlock text;
414   long p = XawTextGetInsertionPoint (w);
415   text.firstPos = 0;
416   text.length = strlen (str);
417   text.ptr = str;
418   XawTextReplace (w, p, p, &text);
419   XawTextSetInsertionPoint (w, p + text.length);
420 
421 
422   return 0;
423 }
424 
425 int
moveinsertionpoint(Widget w,int delta)426 moveinsertionpoint (Widget w, int delta)
427 {
428   int len;
429   XawTextPosition p;
430   char *str = GetEntryString (w);
431   if (str == NULL)
432     return -1;
433   len = strlen (str);
434   p = XawTextGetInsertionPoint (w);
435   if (p + delta >= len && p + delta < 0)
436     return -2;
437 
438   XawTextSetInsertionPoint (w, p + delta);
439   return 0;
440 }
441 
442 int
EntryDelChr(Widget t)443 EntryDelChr (Widget t)
444 {
445   long p;
446   int l, i;
447   char *str;
448   char *tmp;
449 
450   str = GetEntryString (t);
451   if (str == NULL)
452     return -1;
453 
454   l = strlen (str);
455   if (l <= 0)
456     return -2;
457   tmp = (char *) absmalloc (sizeof (char) * l + 1, "EntryString_delete:tmp");
458   strcpy (tmp, str);
459 
460   p = XawTextGetInsertionPoint (t);
461   if (p == l)
462     return -3;
463 
464   for (i = p; i < l - 1; i++)
465     tmp[i] = tmp[i + 1];
466   tmp[l - 1] = '\0';
467 
468   SetEntryString (t, tmp);
469   XawTextSetInsertionPoint (t, p);
470 
471   return 0;
472 }
473 
474 int
EntryBackChr(Widget t)475 EntryBackChr (Widget t)
476 {
477   long p;
478   int l, i;
479   char *str;
480   char *tmp;
481 
482   str = GetEntryString (t);
483   if (str == NULL)
484     return -1;
485 
486   l = strlen (str);
487   if (l <= 0)
488     return -2;
489   tmp = (char *) absmalloc (sizeof (char) * l + 1, "EntryString_delete:tmp");
490   strcpy (tmp, str);
491 
492   p = XawTextGetInsertionPoint (t);
493   if (p <= 0)
494     return -3;
495 
496   for (i = p - 1; i < l - 1; i++)
497     tmp[i] = tmp[i + 1];
498   tmp[l - 1] = '\0';
499 
500   SetEntryString (t, tmp);
501   XawTextSetInsertionPoint (t, p - 1);
502 
503   return 0;
504 }
505 
506 
507 
508 
509 
510 
511 void
shadow(Widget widget,XtPointer pointer,XEvent * event,Boolean * ctd)512 shadow (Widget widget, XtPointer pointer, XEvent * event, Boolean * ctd)
513 {
514   int n;
515   Dimension h, w;
516   Widget wi;
517   Arg args[2];
518   wi = (Widget) pointer;
519 
520   n = 0;
521   XtSetArg (args[n], XtNheight, &h);
522   n++;
523   XtSetArg (args[n], XtNwidth, &w);
524   n++;
525   XtGetValues (wi, args, n);
526   w--;
527   h--;
528   desactivate_zoom ();
529   drawline (XtDisplay (wi), XtWindow (wi), 0, 0, 0, w, 0, 0, 0);
530   drawline (XtDisplay (wi), XtWindow (wi), 3, w, 0, w, h, 0, 0);
531   drawline (XtDisplay (wi), XtWindow (wi), 3, w, h, 0, h, 0, 0);
532   drawline (XtDisplay (wi), XtWindow (wi), 0, 0, h, 0, 0, 0, 0);
533   reactivate_zoom ();
534 
535 }
536 
537 void
shadow2(Widget widget,XtPointer pointer,XEvent * event,Boolean * ctd)538 shadow2 (Widget widget, XtPointer pointer, XEvent * event, Boolean * ctd)
539 {
540   int n;
541   Dimension h, w;
542   Widget wi;
543   Arg args[2];
544   wi = (Widget) pointer;
545 
546   n = 0;
547   XtSetArg (args[n], XtNheight, &h);
548   n++;
549   XtSetArg (args[n], XtNwidth, &w);
550   n++;
551   XtGetValues (wi, args, n);
552   w--;
553   h--;
554   desactivate_zoom ();
555   drawline (XtDisplay (wi), XtWindow (wi), 3, 0, 0, w, 0, 0, 0);
556   drawline (XtDisplay (wi), XtWindow (wi), 0, w, 0, w, h, 0, 0);
557   drawline (XtDisplay (wi), XtWindow (wi), 0, w, h, 0, h, 0, 0);
558   drawline (XtDisplay (wi), XtWindow (wi), 3, 0, h, 0, 0, 0, 0);
559   reactivate_zoom ();
560 
561 }
562 
563 void
shadow3(Widget widget,XtPointer pointer,XEvent * event,Boolean * ctd)564 shadow3 (Widget widget, XtPointer pointer, XEvent * event, Boolean * ctd)
565 {
566   int n;
567   Dimension h, w;
568   Position x, y;
569   Widget wi, parent;
570   Arg args[4];
571   wi = (Widget) pointer;
572   parent = XtParent (wi);
573   n = 0;
574   XtSetArg (args[n], XtNx, &x);
575   n++;
576   XtSetArg (args[n], XtNy, &y);
577   n++;
578   XtSetArg (args[n], XtNheight, &h);
579   n++;
580   XtSetArg (args[n], XtNwidth, &w);
581   n++;
582   XtGetValues (wi, args, n);
583   desactivate_zoom ();
584   drawline (XtDisplay (parent), XtWindow (parent), 3, x - 1, y - 1, x - 1, y + h + 1, 0, 0);
585   drawline (XtDisplay (parent), XtWindow (parent), 0, x - 1, y + h + 1, x + w + 1, y + h + 1, 0, 0);
586   drawline (XtDisplay (parent), XtWindow (parent), 0, x + w + 1, y + h + 1, x + w + 1, y - 1, 0, 0);
587   drawline (XtDisplay (parent), XtWindow (parent), 3, x + w + 1, y - 1, x - 1, y - 1, 0, 0);
588   reactivate_zoom ();
589 }
590 
591 void
shadow4(Widget widget,XtPointer pointer,XEvent * event,Boolean * ctd)592 shadow4 (Widget widget, XtPointer pointer, XEvent * event, Boolean * ctd)
593 {
594   int n;
595   Dimension h, w;
596   Position x, y;
597   Widget wi, parent;
598   Arg args[4];
599   wi = (Widget) pointer;
600   parent = XtParent (wi);
601   n = 0;
602   XtSetArg (args[n], XtNx, &x);
603   n++;
604   XtSetArg (args[n], XtNy, &y);
605   n++;
606   XtSetArg (args[n], XtNheight, &h);
607   n++;
608   XtSetArg (args[n], XtNwidth, &w);
609   n++;
610   XtGetValues (wi, args, n);
611   desactivate_zoom ();
612   drawline (XtDisplay (parent), XtWindow (parent), 0, x - 1, y - 1, x - 1, y + h + 1, 0, 0);
613   drawline (XtDisplay (parent), XtWindow (parent), 3, x - 1, y + h + 1, x + w + 1, y + h + 1, 0, 0);
614   drawline (XtDisplay (parent), XtWindow (parent), 3, x + w + 1, y + h + 1, x + w + 1, y - 1, 0, 0);
615   drawline (XtDisplay (parent), XtWindow (parent), 0, x + w + 1, y - 1, x - 1, y - 1, 0, 0);
616   reactivate_zoom ();
617 }
618 
619 void
shadow5(Widget widget,XtPointer pointer,XEvent * event,Boolean * ctd)620 shadow5 (Widget widget, XtPointer pointer, XEvent * event, Boolean * ctd)
621 {
622   int n;
623   Dimension h, w;
624   Position x, y;
625   Widget wi, parent;
626   Arg args[4];
627   wi = (Widget) pointer;
628   parent = XtParent (wi);
629   n = 0;
630   XtSetArg (args[n], XtNx, &x);
631   n++;
632   XtSetArg (args[n], XtNy, &y);
633   n++;
634   XtSetArg (args[n], XtNheight, &h);
635   n++;
636   XtSetArg (args[n], XtNwidth, &w);
637   n++;
638   XtGetValues (wi, args, n);
639   desactivate_zoom ();
640   drawline (XtDisplay (parent), XtWindow (parent), 0, x + 3, y + 3, x + 3, y + h - 3, 0, 0);
641   drawline (XtDisplay (parent), XtWindow (parent), 3, x + 3, y + 3, x + w - 3, y + 3, 0, 0);
642   drawline (XtDisplay (parent), XtWindow (parent), 0, x + w - 3, y + 3, x + 3, y + 3, 0, 0);
643   reactivate_zoom ();
644 }
645 
646 void
shadow6(Widget widget,XtPointer pointer,XEvent * event,Boolean * ctd)647 shadow6 (Widget widget, XtPointer pointer, XEvent * event, Boolean * ctd)
648 {
649   int n;
650   Dimension h, w;
651   Position x, y;
652   Widget wi, parent;
653   Arg args[4];
654   wi = (Widget) pointer;
655   parent = XtParent (wi);
656   n = 0;
657   XtSetArg (args[n], XtNx, &x);
658   n++;
659   XtSetArg (args[n], XtNy, &y);
660   n++;
661   XtSetArg (args[n], XtNheight, &h);
662   n++;
663   XtSetArg (args[n], XtNwidth, &w);
664   n++;
665   XtGetValues (wi, args, n);
666   desactivate_zoom ();
667   drawline (XtDisplay (parent), XtWindow (parent), 3, x - 2, y - 2, x - 2, y + h + 2, 0, 0);
668   drawline (XtDisplay (parent), XtWindow (parent), 0, x - 2, y + h + 2, x + w + 1, y + h + 2, 0, 0);
669   drawline (XtDisplay (parent), XtWindow (parent), 0, x + w + 2, y + h + 2, x + w + 2, y - 2, 0, 0);
670   drawline (XtDisplay (parent), XtWindow (parent), 3, x + w + 2, y - 2, x - 2, y - 2, 0, 0);
671   reactivate_zoom ();
672 }
673 
674 
675 
676 int
addshadow(Widget w,int type)677 addshadow (Widget w, int type)
678 {
679   switch (type)
680     {
681     case 1:
682       XtAddEventHandler (w,
683 			 ExposureMask,
684 			 FALSE,
685 			 shadow,
686 			 (caddr_t) w);
687 
688 
689       break;
690 
691     case 2:
692       XtAddEventHandler (w,
693 			 ExposureMask,
694 			 FALSE,
695 			 shadow2,
696 			 (caddr_t) w);
697       break;
698     case 3:
699       XtAddEventHandler (w,
700 
701 			 VisibilityChangeMask,
702 			 FALSE,
703 			 shadow3,
704 			 (caddr_t) w);
705       break;
706     case 4:
707       {
708 	XtAddEventHandler (w,
709 			   ExposureMask,
710 			   FALSE,
711 			   shadow4,
712 			   (caddr_t) w);
713       }
714       break;
715     case 5:
716       XtAddEventHandler (w,
717 			 PointerMotionMask,
718 			 FALSE,
719 			 shadow5,
720 			 (caddr_t) w);
721       break;
722     case 6:
723       XtAddEventHandler (w,
724 			 VisibilityChangeMask,
725 			 TRUE,
726 			 shadow6,
727 			 (caddr_t) w);
728 
729 
730 
731       break;
732 
733     }
734   return 0;
735 }
736 
737 static char scrollTranslations[] =
738 "<Btn1Down>:   StartScroll(Continuous) MoveThumb() NotifyThumb() \n\
739      <Btn2Down>:   StartScroll(Continuous) MoveThumb() NotifyThumb() \n\
740      <Btn3Down>:   StartScroll(Continuous) MoveThumb() NotifyThumb() \n\
741      <Btn1Motion>: MoveThumb() NotifyThumb() \n\
742      <Btn2Motion>: MoveThumb() NotifyThumb() \n\
743      <Btn3Motion>: MoveThumb() NotifyThumb() \n\
744      <BtnUp>:      NotifyScroll(Proportional) EndScroll()";
745 
746 
747 #include <X11/cursorfont.h>
748 
749 int
modscroll(Widget w)750 modscroll (Widget w)
751 {
752   XtTranslations trans_table;
753 
754   trans_table = XtParseTranslationTable (scrollTranslations);
755   XtOverrideTranslations (w, trans_table);
756 
757   w_n = 0;
758   w_bONw ();
759   w_arg (XtNthumb, None);
760 
761 
762 
763 
764   w_set (w);
765   return 0;
766 }
767