|
|
1.1 root 1: /* $Header: TextActs.c,v 1.1 87/09/11 07:59:49 toddb Exp $ */
2: #ifndef lint
3: static char *sccsid = "@(#)TextActions.c 1.17 2/25/87";
4: #endif lint
5:
6: /*
7: * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
8: *
9: * All Rights Reserved
10: *
11: * Permission to use, copy, modify, and distribute this software and its
12: * documentation for any purpose and without fee is hereby granted,
13: * provided that the above copyright notice appear in all copies and that
14: * both that copyright notice and this permission notice appear in
15: * supporting documentation, and that the name of Digital Equipment
16: * Corporation not be used in advertising or publicity pertaining to
17: * distribution of the software without specific, written prior permission.
18: *
19: *
20: * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
21: * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
22: * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
23: * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
24: * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
25: * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
26: * SOFTWARE.
27: */
28:
29:
30: #include "Xlib.h"
31: #include "Intrinsic.h"
32: #include "Text.h"
33: #include "TextDisp.h"
34: #include "Dialog.h"
35: #include <sys/file.h>
36:
37: #define min(x,y) ((x) < (y) ? (x) : (y))
38: #define max(x,y) ((x) > (y) ? (x) : (y))
39:
40: /* ||| Kludge, declar in .h file somewhere */
41:
42: extern char *_XtTextGetText(); /* ctx, left, right */
43: /* TextContext *ctx; */
44: /* XtTextPosition left, right; */
45:
46: extern caddr_t XtSetActionBindings();/* eventTable, actionTable, defaultValue */
47: /* XtEventsPtr eventTable; */
48: /* XtActionsPtr actionTable; */
49: /* caddr_t defaultValue; */
50:
51: extern void AlterSelection(); /* ctx, mode, action */
52: /* TextContext *ctx; */
53: /* SelectionMode mode; /* {XtsmTextSelect, XtsmTextExtend} */
54: /* SelectionAction action; /* {XtactionStart, XtactionAdjust, XtactionEnd} */
55:
56: extern void ForceBuildLineTable(); /* ctx */
57: /* TextContext *ctx; */
58:
59: /* Misc. routines */
60:
61: /*ARGSUSED*/
62: static DoFeep(ctx)
63: TextContext *ctx;
64: {
65: XBell(ctx->dpy, 50);
66: }
67:
68: static DeleteOrKill(ctx, from, to, kill)
69: TextContext *ctx;
70: XtTextPosition from, to;
71: Boolean kill;
72: {
73: XtTextBlock text;
74: char *ptr;
75:
76: if (kill && from < to) {
77: ptr = _XtTextGetText(ctx, from, to);
78: XStoreBuffer(ctx->dpy, ptr, strlen(ptr), 1);
79: XtFree(ptr);
80: }
81: text.length = 0;
82: if (ReplaceText(ctx, from, to, &text)) {
83: XBell(ctx->dpy, 50);
84: return;
85: }
86: _XtTextSetNewSelection(ctx, from, from);
87: ctx->insertPos = from;
88: ctx->showposition = TRUE;
89: }
90:
91:
92: StuffFromBuffer(ctx, buffer)
93: TextContext *ctx;
94: int buffer;
95: {
96: extern char *XFetchBuffer();
97: XtTextBlock text;
98: text.ptr = XFetchBuffer(ctx->dpy, &(text.length), buffer);
99: if (ReplaceText(ctx, ctx->insertPos, ctx->insertPos, &text)) {
100: XBell(ctx->dpy, 50);
101: return;
102: }
103: ctx->insertPos = ctx->source->scan(ctx->source, ctx->insertPos,
104: XtstPositions, XtsdRight, text.length, TRUE);
105: _XtTextSetNewSelection(ctx, ctx->insertPos, ctx->insertPos);
106: XtFree(text.ptr);
107: }
108:
109:
110: static UnKill(ctx)
111: TextContext *ctx;
112: {
113: StuffFromBuffer(ctx, 1);
114: }
115:
116: static Stuff(ctx)
117: TextContext *ctx;
118: {
119: StuffFromBuffer(ctx, 0);
120: }
121:
122:
123: static XtTextPosition NextPosition(ctx, position, kind, direction)
124: TextContext *ctx;
125: XtTextPosition position;
126: ScanType kind;
127: ScanDirection direction;
128: {
129: XtTextPosition pos;
130:
131: pos = ctx->source->scan(
132: ctx->source, position, kind, direction, 1, FALSE);
133: if (pos == ctx->insertPos)
134: pos = ctx->source->scan(
135: ctx->source, position, kind, direction, 2, FALSE);
136: return pos;
137: }
138:
139: /* routines for moving around */
140:
141: static MoveForwardChar(ctx)
142: TextContext *ctx;
143: {
144: ctx->insertPos = ctx->source->scan(
145: ctx->source, ctx->insertPos, XtstPositions, XtsdRight, 1, TRUE);
146: }
147:
148: static MoveBackwardChar(ctx)
149: TextContext *ctx;
150: {
151: ctx->insertPos = ctx->source->scan(
152: ctx->source, ctx->insertPos, XtstPositions, XtsdLeft, 1, TRUE);
153: }
154:
155: static MoveForwardWord(ctx)
156: TextContext *ctx;
157: {
158: ctx->insertPos = NextPosition(ctx, ctx->insertPos, XtstWhiteSpace, XtsdRight);
159: }
160:
161: static MoveBackwardWord(ctx)
162: TextContext *ctx;
163: {
164: ctx->insertPos = NextPosition(ctx, ctx->insertPos, XtstWhiteSpace, XtsdLeft);
165: }
166:
167: static MoveBackwardParagraph(ctx)
168: TextContext *ctx;
169: {
170: ctx->insertPos = NextPosition(ctx, ctx->insertPos, XtstEOL, XtsdLeft);
171: }
172:
173: static MoveForwardParagraph(ctx)
174: TextContext *ctx;
175: {
176: ctx->insertPos = NextPosition(ctx, ctx->insertPos, XtstEOL, XtsdRight);
177: }
178:
179:
180: static MoveToLineStart(ctx)
181: TextContext *ctx;
182: {
183: int line;
184: _XtTextShowPosition(ctx);
185: line = LineForPosition(ctx, ctx->insertPos);
186: ctx->insertPos = ctx->lt.info[line].position;
187: }
188:
189: static MoveToLineEnd(ctx)
190: TextContext *ctx;
191: {
192: int line;
193: XtTextPosition next;
194: _XtTextShowPosition(ctx);
195: line = LineForPosition(ctx, ctx->insertPos);
196: next = ctx->lt.info[line+1].position;
197: if (next > ctx->lastPos)
198: next = ctx->lastPos;
199: else
200: next = ctx->source->scan(ctx->source, next, XtstPositions, XtsdLeft, 1, TRUE);
201: ctx->insertPos = next;
202: }
203:
204:
205: static int LineLastWidth = 0;
206: static XtTextPosition LineLastPosition = 0;
207:
208: static MoveNextLine(ctx)
209: TextContext *ctx;
210: {
211: int width, width2, height, line;
212: XtTextPosition position, maxp;
213: _XtTextShowPosition(ctx);
214: line = LineForPosition(ctx, ctx->insertPos);
215: if (line == ctx->lt.lines - 1) {
216: _XtTextScroll(ctx, 1);
217: line = LineForPosition(ctx, ctx->insertPos);
218: }
219: if (LineLastPosition == ctx->insertPos)
220: width = LineLastWidth;
221: else
222: ctx->sink->findDistance(ctx->sink, ctx->source,
223: ctx->lt.info[line].position, ctx->lt.info[line].x,
224: ctx->insertPos, &width, &position, &height);
225: line++;
226: if (ctx->lt.info[line].position > ctx->lastPos) {
227: ctx->insertPos = ctx->lastPos;
228: return;
229: }
230: ctx->sink->findPosition(ctx->sink, ctx->source,
231: ctx->lt.info[line].position, ctx->lt.info[line].x,
232: width, FALSE, &position, &width2, &height);
233: maxp = ctx->source->scan(ctx->source, ctx->lt.info[line+1].position,
234: XtstPositions, XtsdLeft, 1, TRUE);
235: if (position > maxp)
236: position = maxp;
237: ctx->insertPos = position;
238: LineLastWidth = width;
239: LineLastPosition = position;
240: }
241:
242: static MovePreviousLine(ctx)
243: TextContext *ctx;
244: {
245: int width, width2, height, line;
246: XtTextPosition position, maxp;
247: _XtTextShowPosition(ctx);
248: line = LineForPosition(ctx, ctx->insertPos);
249: if (line == 0) {
250: _XtTextScroll(ctx, -1);
251: line = LineForPosition(ctx, ctx->insertPos);
252: }
253: if (line > 0) {
254: if (LineLastPosition == ctx->insertPos)
255: width = LineLastWidth;
256: else
257: ctx->sink->findDistance(ctx->sink, ctx->source,
258: ctx->lt.info[line].position, ctx->lt.info[line].x,
259: ctx->insertPos, &width, &position, &height);
260: line--;
261: ctx->sink->findPosition(ctx->sink, ctx->source,
262: ctx->lt.info[line].position, ctx->lt.info[line].x,
263: width, FALSE, &position, &width2, &height);
264: maxp = ctx->source->scan(ctx->source, ctx->lt.info[line+1].position,
265: XtstPositions, XtsdLeft, 1, TRUE);
266: if (position > maxp)
267: position = maxp;
268: ctx->insertPos = position;
269: LineLastWidth = width;
270: LineLastPosition = position;
271: }
272: }
273:
274:
275:
276: static MoveBeginningOfFile(ctx)
277: TextContext *ctx;
278: {
279: ctx->insertPos = ctx->source->scan(ctx->source, ctx->insertPos, XtstFile,
280: XtsdLeft, 1, TRUE);
281: }
282:
283:
284: static MoveEndOfFile(ctx)
285: TextContext *ctx;
286: {
287: ctx->insertPos = ctx->source->scan(ctx->source, ctx->insertPos, XtstFile,
288: XtsdRight, 1, TRUE);
289: }
290:
291: static ScrollOneLineUp(ctx)
292: TextContext *ctx;
293: {
294: _XtTextScroll(ctx, 1);
295: }
296:
297: static ScrollOneLineDown(ctx)
298: TextContext *ctx;
299: {
300: _XtTextScroll(ctx, -1);
301: }
302:
303: static MoveNextPage(ctx)
304: TextContext *ctx;
305: {
306: _XtTextScroll(ctx, max(1, ctx->lt.lines - 2));
307: ctx->insertPos = ctx->lt.top;
308: }
309:
310: static MovePreviousPage(ctx)
311: TextContext *ctx;
312: {
313: _XtTextScroll(ctx, -max(1, ctx->lt.lines - 2));
314: ctx->insertPos = ctx->lt.top;
315: }
316:
317:
318:
319:
320: /* delete routines */
321:
322: static DeleteForwardChar(ctx)
323: TextContext *ctx;
324: {
325: XtTextPosition next;
326:
327: next = ctx->source->scan(
328: ctx->source, ctx->insertPos, XtstPositions, XtsdRight, 1, TRUE);
329: DeleteOrKill(ctx, ctx->insertPos, next, FALSE);
330: }
331:
332: static DeleteBackwardChar(ctx)
333: TextContext *ctx;
334: {
335: XtTextPosition next;
336:
337: next = ctx->source->scan(
338: ctx->source, ctx->insertPos, XtstPositions, XtsdLeft, 1, TRUE);
339: DeleteOrKill(ctx, next, ctx->insertPos, FALSE);
340: }
341:
342: static DeleteForwardWord(ctx)
343: TextContext *ctx;
344: {
345: XtTextPosition next;
346:
347: next = NextPosition(ctx, ctx->insertPos, XtstWhiteSpace, XtsdRight);
348: DeleteOrKill(ctx, ctx->insertPos, next, FALSE);
349: }
350:
351: static DeleteBackwardWord(ctx)
352: TextContext *ctx;
353: {
354: XtTextPosition next;
355:
356: next = NextPosition(ctx, ctx->insertPos, XtstWhiteSpace, XtsdLeft);
357: DeleteOrKill(ctx, next, ctx->insertPos, FALSE);
358: }
359:
360: static KillForwardWord(ctx)
361: TextContext *ctx;
362: {
363: XtTextPosition next;
364:
365: next = NextPosition(ctx, ctx->insertPos, XtstWhiteSpace, XtsdRight);
366: DeleteOrKill(ctx, ctx->insertPos, next, TRUE);
367: }
368:
369: static KillBackwardWord(ctx)
370: TextContext *ctx;
371: {
372: XtTextPosition next;
373:
374: next = NextPosition(ctx, ctx->insertPos, XtstWhiteSpace, XtsdLeft);
375: DeleteOrKill(ctx, next, ctx->insertPos, TRUE);
376: }
377:
378: static KillCurrentSelection(ctx)
379: TextContext *ctx;
380: {
381: DeleteOrKill(ctx, ctx->s.left, ctx->s.right, TRUE);
382: }
383:
384: static DeleteCurrentSelection(ctx)
385: TextContext *ctx;
386: {
387: DeleteOrKill(ctx, ctx->s.left, ctx->s.right, FALSE);
388: }
389:
390: static KillToEndOfLine(ctx)
391: TextContext *ctx;
392: {
393: int line;
394: XtTextPosition last, next;
395: _XtTextShowPosition(ctx);
396: line = LineForPosition(ctx, ctx->insertPos);
397: last = ctx->lt.info[line + 1].position;
398: next = ctx->source->scan(ctx->source, ctx->insertPos, XtstEOL, XtsdRight,
399: 1, FALSE);
400: if (last > ctx->lastPos)
401: last = ctx->lastPos;
402: if (last > next && ctx->insertPos < next)
403: last = next;
404: DeleteOrKill(ctx, ctx->insertPos, last, TRUE);
405: }
406:
407: static KillToEndOfParagraph(ctx)
408: TextContext *ctx;
409: {
410: XtTextPosition next;
411:
412: next = ctx->source->scan(ctx->source, ctx->insertPos, XtstEOL, XtsdRight,
413: 1, FALSE);
414: if (next == ctx->insertPos)
415: next = ctx->source->scan(ctx->source, next, XtstEOL, XtsdRight, 1, TRUE);
416: DeleteOrKill(ctx, ctx->insertPos, next, TRUE);
417: }
418:
419: static int InsertNewLineAndBackup(ctx)
420: TextContext *ctx;
421: {
422: XtTextBlock text;
423: text.length = 1;
424: text.ptr = "\n";
425: text.firstPos = 0;
426: if (ReplaceText(ctx, ctx->insertPos, ctx->insertPos, &text)) {
427: XBell(ctx->dpy, 50);
428: return(EDITERROR);
429: }
430: _XtTextSetNewSelection(ctx, (XtTextPosition) 0, (XtTextPosition) 0);
431: ctx->showposition = TRUE;
432: return(EDITDONE);
433: }
434:
435:
436:
437: static int InsertNewLine(ctx)
438: TextContext *ctx;
439: {
440: XtTextPosition next;
441:
442: if (InsertNewLineAndBackup(ctx))
443: return(EDITERROR);
444: next = ctx->source->scan(ctx->source, ctx->insertPos,
445: XtstPositions, XtsdRight, 1, TRUE);
446: ctx->insertPos = next;
447: return(EDITDONE);
448: }
449:
450:
451: static InsertNewLineAndIndent(ctx)
452: TextContext *ctx;
453: {
454: XtTextBlock text;
455: XtTextPosition pos1, pos2;
456:
457: pos1 = ctx->source->scan(ctx->source, ctx->insertPos, XtstEOL, XtsdLeft,
458: 1, FALSE);
459: pos2 = ctx->source->scan(ctx->source, pos1, XtstEOL, XtsdLeft, 1, TRUE);
460: pos2 = ctx->source->scan(ctx->source, pos2, XtstWhiteSpace, XtsdRight, 1, TRUE);
461: text.ptr = _XtTextGetText(ctx, pos1, pos2);
462: text.length = strlen(text.ptr);
463: if (InsertNewLine(ctx)) return;
464: if (ReplaceText(ctx, ctx->insertPos, ctx->insertPos, &text)) {
465: XBell(ctx->dpy, 50);
466: return;
467: }
468: ctx->insertPos = ctx->source->scan(ctx->source, ctx->insertPos,
469: XtstPositions, XtsdRight, text.length, TRUE);
470: XtFree(text.ptr);
471: }
472:
473: static NewSelection(ctx, l, r)
474: TextContext *ctx;
475: XtTextPosition l, r;
476: {
477: char *ptr;
478: _XtTextSetNewSelection(ctx, l, r);
479: if (l < r) {
480: ptr = _XtTextGetText(ctx, l, r);
481: XStoreBuffer(ctx->dpy, ptr, min(strlen(ptr), MAXCUT), 0);
482: XtFree(ptr);
483: }
484: }
485:
486: static SelectWord(ctx)
487: TextContext *ctx;
488: {
489: XtTextPosition l, r;
490: l = ctx->source->scan(ctx->source, ctx->insertPos, XtstWhiteSpace, XtsdLeft,
491: 1, FALSE);
492: r = ctx->source->scan(ctx->source, l, XtstWhiteSpace, XtsdRight, 1, FALSE);
493: NewSelection(ctx, l, r);
494: }
495:
496:
497: static SelectAll(ctx)
498: TextContext *ctx;
499: {
500: NewSelection(ctx, (XtTextPosition) 0, ctx->lastPos);
501: }
502:
503: static SelectStart(ctx)
504: TextContext *ctx;
505: {
506: AlterSelection(ctx, XtsmTextSelect, XtactionStart);
507: }
508:
509: static SelectAdjust(ctx)
510: TextContext *ctx;
511: {
512: AlterSelection(ctx, XtsmTextSelect, XtactionAdjust);
513: }
514:
515: static SelectEnd(ctx)
516: TextContext *ctx;
517: {
518: AlterSelection(ctx, XtsmTextSelect, XtactionEnd);
519: }
520:
521: static ExtendStart(ctx)
522: TextContext *ctx;
523: {
524: AlterSelection(ctx, XtsmTextExtend, XtactionStart);
525: }
526:
527: static ExtendAdjust(ctx)
528: TextContext *ctx;
529: {
530: AlterSelection(ctx, XtsmTextExtend, XtactionAdjust);
531: }
532:
533: static ExtendEnd(ctx)
534: TextContext *ctx;
535: {
536: AlterSelection(ctx, XtsmTextExtend, XtactionEnd);
537: }
538:
539:
540: static RedrawDisplay(ctx)
541: TextContext *ctx;
542: {
543: ForceBuildLineTable(ctx);
544: DisplayTextWindow(ctx);
545: }
546:
547:
548: _XtTextAbortDialog(ctx)
549: TextContext *ctx;
550: {
551: if (ctx->dialog) {
552: XDestroyWindow(ctx->dpy, ctx->dialog);
553: (void) XtSendDestroyNotify(ctx->dpy, ctx->dialog);
554: ctx->dialog = NULL;
555: }
556: }
557:
558:
559: /* Insert a file of the given name into the text. Returns 0 if file found,
560: -1 if not. */
561:
562: static InsertFileNamed(ctx, str)
563: TextContext *ctx;
564: char *str;
565: {
566: int fid;
567: XtTextBlock text;
568: char buf[1000];
569: XtTextPosition position;
570:
571: if (str == NULL || strlen(str) == 0) return -1;
572: fid = open(str, O_RDONLY);
573: if (fid <= 0) return -1;
574: _XtTextPrepareToUpdate(ctx);
575: position = ctx->insertPos;
576: while ((text.length = read(fid, buf, 512)) > 0) {
577: text.ptr = buf;
578: (void) ReplaceText(ctx, position, position, &text);
579: position = ctx->source->scan(ctx->source, position, XtstPositions,
580: XtsdRight, text.length, TRUE);
581: }
582: (void) close(fid);
583: ctx->insertPos = position;
584: _XtTextExecuteUpdate(ctx);
585: return 0;
586: }
587:
588: static DoInsert(ctx)
589: TextContext *ctx;
590: {
591: if (InsertFileNamed(ctx, XtDialogGetValueString(ctx->dpy, ctx->dialog)))
592: XBell(ctx->dpy, 50);
593: else
594: _XtTextAbortDialog(ctx);
595: }
596:
597: static InsertFile(ctx)
598: TextContext *ctx;
599: {
600: char *ptr;
601: XtTextBlock text;
602:
603: if (ctx->source->editType(ctx->source) != XttextEdit) {
604: XBell(ctx->dpy, 50);
605: return;
606: }
607: if (ctx->s.left < ctx->s.right) {
608: ptr = _XtTextGetText(ctx, ctx->s.left, ctx->s.right);
609: DeleteCurrentSelection(ctx);
610: if (InsertFileNamed(ctx, ptr)) {
611: XBell(ctx->dpy, 50);
612: text.ptr = ptr;
613: text.length = strlen(ptr);
614: (void) ReplaceText(ctx, ctx->insertPos, ctx->insertPos, &text);
615: ctx->s.left = ctx->insertPos;
616: ctx->s.right = ctx->insertPos =
617: ctx->source->scan(ctx->source, ctx->insertPos, XtstPositions,
618: XtsdRight, text.length, TRUE);
619: }
620: XtFree(ptr);
621: return;
622: }
623: if (ctx->dialog)
624: _XtTextAbortDialog(ctx);
625: ctx->dialog = XtDialogCreate(ctx->dpy, ctx->w, "Insert File:", "", (ArgList)NULL, 0);
626: XtDialogAddButton(ctx->dpy, ctx->dialog, "Abort", _XtTextAbortDialog, (caddr_t)ctx);
627: XtDialogAddButton(ctx->dpy, ctx->dialog, "DoIt", DoInsert, (caddr_t)ctx);
628: XMapWindow(ctx->dpy, ctx->dialog);
629: }
630:
631: /* Actions Table */
632:
633: static XtActionsRec actionsTable [] = {
634: /* motion bindings */
635: {"forward-character", (caddr_t)MoveForwardChar},
636: {"backward-character", (caddr_t)MoveBackwardChar},
637: {"forward-word", (caddr_t)MoveForwardWord},
638: {"backward-word", (caddr_t)MoveBackwardWord},
639: {"forward-paragraph", (caddr_t)MoveForwardParagraph},
640: {"backward-paragraph", (caddr_t)MoveBackwardParagraph},
641: {"beginning-of-line", (caddr_t)MoveToLineStart},
642: {"end-of-line", (caddr_t)MoveToLineEnd},
643: {"next-line", (caddr_t)MoveNextLine},
644: {"previous-line", (caddr_t)MovePreviousLine},
645: {"next-page", (caddr_t)MoveNextPage},
646: {"previous-page", (caddr_t)MovePreviousPage},
647: {"beginning-of-file", (caddr_t)MoveBeginningOfFile},
648: {"end-of-file", (caddr_t)MoveEndOfFile},
649: {"scroll-one-line-up", (caddr_t)ScrollOneLineUp},
650: {"scroll-one-line-down", (caddr_t)ScrollOneLineDown},
651: /* delete bindings */
652: {"delete-next-character", (caddr_t)DeleteForwardChar},
653: {"delete-previous-character", (caddr_t)DeleteBackwardChar},
654: {"delete-next-word", (caddr_t)DeleteForwardWord},
655: {"delete-previous-word", (caddr_t)DeleteBackwardWord},
656: {"delete-selection", (caddr_t)DeleteCurrentSelection},
657: /* kill bindings */
658: {"kill-word", (caddr_t)KillForwardWord},
659: {"backward-kill-word", (caddr_t)KillBackwardWord},
660: {"kill-selection", (caddr_t)KillCurrentSelection},
661: {"kill-to-end-of-line", (caddr_t)KillToEndOfLine},
662: {"kill-to-end-of-paragraph", (caddr_t)KillToEndOfParagraph},
663: /* unkill bindings */
664: {"unkill", (caddr_t)UnKill},
665: {"stuff", (caddr_t)Stuff},
666: /* new line stuff */
667: {"newline-and-indent", (caddr_t)InsertNewLineAndIndent},
668: {"newline-and-backup", (caddr_t)InsertNewLineAndBackup},
669: {"newline", (caddr_t)InsertNewLine},
670: /* Selection stuff */
671: {"select-word", (caddr_t)SelectWord},
672: {"select-all", (caddr_t)SelectAll},
673: {"select-start", (caddr_t)SelectStart},
674: {"select-adjust", (caddr_t)SelectAdjust},
675: {"select-end", (caddr_t)SelectEnd},
676: {"extend-start", (caddr_t)ExtendStart},
677: {"extend-adjust", (caddr_t)ExtendAdjust},
678: {"extend-end", (caddr_t)ExtendEnd},
679: /* Miscellaneous */
680: {"redraw-display", (caddr_t)RedrawDisplay},
681: {"insert-file", (caddr_t)InsertFile},
682: {NULL,NULL}
683: };
684:
685: static char *defaultTextEventBindings[] = {
686: /* motion bindings */
687: "<Ctrl>F: forward-character\n",
688: "<Key>0xff53: forward-character\n",
689: "<Ctrl>B: backward-character\n",
690: "<Key>0xff51: backward-character\n",
691: "<Meta>F: forward-word\n",
692: "<Meta>B: backward-word\n",
693: "<Meta>]: forward-paragraph\n",
694: "<Ctrl>[: backward-paragraph\n",
695: "<Ctrl>A: beginning-of-line\n",
696: "<Ctrl>E: end-of-line\n",
697: "<Ctrl>N: next-line\n",
698: "<Key>0xff54: next-line\n",
699: "<Ctrl>P: previous-line\n",
700: "<Key>0xff52: previous-line\n",
701: "<Ctrl>V: next-page\n",
702: "<Meta>V: previous-page\n",
703: "<Meta>\\<: beginning-of-file\n",
704: "<Meta>\\>: end-of-file\n",
705: "<Ctrl>Z: scroll-one-line-up\n",
706: "<Meta>Z: scroll-one-line-down\n",
707: /* delete bindings */
708: "<Ctrl>D: delete-next-character\n",
709: "<Ctrl>H: delete-previous-character\n",
710: "<Key>0xff7f: delete-previous-character\n",
711: "<Key>0xffff: delete-previous-character\n",
712: "<Key>0xff08: delete-previous-character\n",
713: "<Meta>D: delete-next-word\n",
714: "<Meta>H: delete-previous-word\n",
715: /* kill bindings */
716: "s<Meta>D: kill-word\n",
717: "s<Meta>H: backward-kill-word\n",
718: "<Ctrl>W: kill-selection\n",
719: "<Ctrl>K: kill-to-end-of-line\n",
720: "<Meta>K: kill-to-end-of-paragraph\n",
721: /* unkill bindings */
722: "<Ctrl>Y: unkill\n",
723: "<Meta>Y: stuff\n",
724: /* new line stuff */
725: "<Ctrl>J: newline-and-indent\n",
726: "<Key>0xff0a: newline-and-indent\n",
727: "<Ctrl>O: newline-and-backup\n",
728: "<Ctrl>M: newline\n",
729: "<Key>0xff0d: newline\n",
730: /* Miscellaneous */
731: "<Ctrl>L: redraw-display\n",
732: "<Meta>I: insert-file\n",
733: /* selection stuff */
734: "<BtnDown>1: select-start\n",
735: "<PtrMoved>1: extend-adjust\n",
736: "<BtnUp>1: extend-end\n",
737: "<BtnDown>2: stuff\n",
738: "<BtnDown>3: extend-start\n",
739: "<PtrMoved>3: extend-adjust\n",
740: "<BtnUp>3: extend-end\n",
741: NULL
742: };
743:
744: caddr_t XtSetTextEventBindings(dpy, eventTable)
745: Display *dpy;
746: XtEventsPtr eventTable;
747: {
748: caddr_t state;
749:
750: if (eventTable == NULL) /* supply defaults */
751: eventTable = XtParseEventBindings(defaultTextEventBindings);
752: state = XtSetActionBindings(
753: dpy, eventTable, actionsTable, (caddr_t) DoFeep);
754: return state;
755: }
756:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.