home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD1.bin / new / util / edit / jade / src / amiga_commandline.c < prev    next >
C/C++ Source or Header  |  1994-06-29  |  5KB  |  193 lines

  1. /* amiga_commandline.c -- prompt for AmigaDOS
  2.    Copyright (C) 1993, 1994 John Harper <jsh@ukc.ac.uk>
  3.  
  4.    This file is part of Jade.
  5.  
  6.    Jade is free software; you can redistribute it and/or modify it
  7.    under the terms of the GNU General Public License as published by
  8.    the Free Software Foundation; either version 2, or (at your option)
  9.    any later version.
  10.  
  11.    Jade is distributed in the hope that it will be useful, but
  12.    WITHOUT ANY WARRANTY; without even the implied warranty of
  13.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.    GNU General Public License for more details.
  15.  
  16.    You should have received a copy of the GNU General Public License
  17.    along with Jade; see the file COPYING.  If not, write to
  18.    the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  19.  
  20. #include "jade.h"
  21. #include "jade_protos.h"
  22.  
  23. #define INTUI_V36_NAMES_ONLY
  24. #include <clib/intuition_protos.h>
  25. #include <clib/keymap_protos.h>
  26. #include <string.h>
  27.  
  28. _PR u_char *sys_prompt(VW *, u_char *, u_char *);
  29.  
  30. /*
  31.  * returns a string got from the command line
  32.  * it (the string) must be valstrfree()'ed after use.
  33.  * cursor should be off.
  34.  */
  35. u_char *
  36. sys_prompt(VW *vw, u_char *prompt, u_char *original)
  37. {
  38.     u_char *cmdline;
  39.     long cmdlen;
  40.     long promptlen = strlen(prompt);
  41.     if(!sys_unsleep_vw(vw))
  42.     return(FALSE);
  43.     cmdline = str_dup(original ? original : (STRPTR)"");
  44.     if(cmdline)
  45.     {
  46.     POS oldcursor = vw->vw_CursorPos;
  47.     long oldstartcol = vw->vw_StartCol;
  48.     long prevx;
  49.     char keepgoing = 0;
  50.  
  51.     cmdlen = strlen(cmdline) + 1;
  52.     vw->vw_CursorPos.pos_Col = promptlen + cmdlen - 1;
  53.     vw->vw_CursorPos.pos_Line = vw->vw_StartCol + vw->vw_MaxY - 1;
  54.     prevx = vw->vw_CursorPos.pos_Col;
  55.     if(vw->vw_CursorPos.pos_Col >= vw->vw_MaxX)
  56.         vw->vw_StartCol = vw->vw_CursorPos.pos_Col - vw->vw_MaxX + 1;
  57.     else
  58.         vw->vw_StartCol = 0;
  59.  
  60.     redraw_cmd_line(vw, prompt, cmdline, promptlen, cmdlen - 1);
  61.     cmd_line_cursor(vw, CURS_ON);
  62.  
  63.     while(!keepgoing)
  64.     {
  65.         struct IntuiMessage *imsg;
  66.  
  67.         Wait(1 << vw->vw_Window->UserPort->mp_SigBit);
  68.         while((!keepgoing) && (imsg = ami_get_win_imsg(vw->vw_Window)))
  69.         {
  70.         struct IntuiMessage imsgcopy = *imsg;
  71.         ReplyMsg((struct Message *)imsg);
  72.         if(imsgcopy.Class == IDCMP_RAWKEY)
  73.         {
  74.             cmd_line_cursor(vw, CURS_OFF);
  75.             switch(imsgcopy.Code)
  76.             {
  77.             case 0x41:    /* delete */
  78.             if(cmdlen > 1)
  79.             {
  80.                 u_char *newline;
  81.                 vw->vw_CursorPos.pos_Col--;
  82.                 cmdlen--;
  83.                 if(newline = str_dupn(cmdline, cmdlen - 1))
  84.                 {
  85.                 str_free(cmdline);
  86.                 cmdline = newline;
  87.                 }
  88.             }
  89.             break;
  90.             case 0x44:    /* return */
  91.             keepgoing = 1;
  92.             break;
  93.             case 0x45:    /* escape */
  94.             keepgoing = -1;
  95.             break;
  96.             case 0x4c:    /* up */
  97.             case 0x4d:    /* down */
  98.             if(last_prompted)
  99.             {
  100.                 u_char *temp = cmdline;
  101.                 cmdline = last_prompted;
  102.                 last_prompted = temp;
  103.                 cmdlen = strlen(cmdline) + 1;
  104.                 vw->vw_CursorPos.pos_Col = cmdlen + promptlen - 1;
  105.                 prevx = 20000;
  106.             }
  107.             break;
  108.             default:
  109.             if(!(imsgcopy.Code & IECODE_UP_PREFIX))
  110.             {
  111.                 struct InputEvent ie;
  112.                 u_char buff[256];
  113.                 long len;
  114.  
  115.                 ie.ie_Class = IECLASS_RAWKEY;
  116.                 ie.ie_SubClass = 0;
  117.                 ie.ie_Code = imsgcopy.Code;
  118.                 ie.ie_Qualifier = imsgcopy.Qualifier;
  119.                 ie.ie_EventAddress = *((APTR *)imsgcopy.IAddress);
  120.                 if((len = MapRawKey(&ie, buff, 255, NULL)) != -1)
  121.                 {
  122.                 u_char *newline;
  123.                 buff[len] = 0;
  124.                 if(newline = str_dupn(cmdline, cmdlen + len))
  125.                 {
  126.                     strcat(newline, buff);
  127.                     str_free(cmdline);
  128.                     cmdline = newline;
  129.                     cmdlen += len;
  130.                     vw->vw_CursorPos.pos_Col += len;
  131.                 }
  132.                 }
  133.             }
  134.             break;
  135.             }
  136.         }
  137.         else if(imsgcopy.Class == IDCMP_NEWSIZE)
  138.         {
  139.             cmd_line_cursor(vw, CURS_OFF);
  140.             vw->vw_StartCol = oldstartcol;
  141.             sys_update_dimensions(vw);
  142.             redraw_all(vw);
  143.             prevx = 20000;
  144. #if 0
  145.             redraw_cmd_line(vw, prompt, cmdline, promptlen,
  146.                     cmdlen - 1);
  147. #endif
  148.         }
  149.         else
  150.             continue;
  151.  
  152.         if(vw->vw_CursorPos.pos_Col >= vw->vw_MaxX)
  153.         {
  154.             vw->vw_StartCol = vw->vw_CursorPos.pos_Col - vw->vw_MaxX + 1;
  155.             redraw_cmd_line(vw, prompt, cmdline, promptlen,
  156.                     cmdlen - 1);
  157.         }
  158.         else
  159.         {
  160.             vw->vw_StartCol = 0;
  161.             if(prevx >= vw->vw_MaxX)
  162.             redraw_cmd_line(vw, prompt, cmdline, promptlen,
  163.                     cmdlen - 1);
  164.             else if(prevx < vw->vw_CursorPos.pos_Col)
  165.             redraw_cmd_line_from(vw, prompt, cmdline, promptlen,
  166.                          cmdlen - 1, prevx);
  167.             else
  168.             redraw_cmd_line_from(vw, prompt, cmdline, promptlen,
  169.                          cmdlen - 1,
  170.                          vw->vw_CursorPos.pos_Col);
  171.         }
  172.         prevx = vw->vw_CursorPos.pos_Col;
  173.         cmd_line_cursor(vw, CURS_ON);
  174.         }
  175.     }
  176.     if(keepgoing < 0)
  177.     {
  178.         str_free(cmdline);
  179.         cmdline = NULL;
  180.     }
  181.     else
  182.     {
  183.         str_free(last_prompted);
  184.         last_prompted = str_dup(cmdline);
  185.     }
  186.     cmd_line_cursor(vw, CURS_OFF);
  187.     vw->vw_CursorPos = oldcursor;
  188.     vw->vw_StartCol = oldstartcol;
  189.     return(cmdline);
  190.     }
  191.     return(FALSE);
  192. }
  193.