Annotation of researchv9/X11/src/X.V11R1/lib/oldXtk/TextActs.c, revision 1.1.1.2

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.