home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 10: Diskmags / nf_archive_10.iso / MAGS / AT_WORLD / ATRIW5.MSA / INSCHAR_INSCHAR.C < prev    next >
C/C++ Source or Header  |  1995-06-09  |  9KB  |  356 lines

  1.  
  2.  
  3.  
  4. /*  
  5. **  Accessory to write character to the main program
  6. **  running at the time the DA is called as if it had been
  7. **  typed in at the keyboard.
  8. **
  9. **  This software is placed in the Public Domain and is
  10. **  made freely available to anyone to use or alter in
  11. **  any way they see fit, I accept no liability for its
  12. **  use or abuse.  Matthew Carey 1st November 1991.
  13. */
  14.  
  15.  
  16.  
  17. /*  
  18. **  Accessory to write a date string to the main program
  19. **  running at the time the DA is called as if it had been
  20. **  typed in at the keyboard.
  21. **
  22. **  This software is placed in the Public Domain and is
  23. **  made freely available to anyone to use or alter in
  24. **  any way they see fit, I accept no liability for its
  25. **  use or abuse.  Matthew Carey 19th April 1995
  26. */
  27.  
  28.  
  29. /*
  30. ** 
  31. **   Author:             Matthew Carey
  32. **   Language:           Lattice C version 5.6 (from Hisoft) 
  33. **   Compiler options:   -w -cuf -ta -v -Lg
  34. **                       ie. (short integers, unsigned characters, 
  35. **                       compulsory prototypes, no stack checking, 
  36. **                       desk accesory startup code and graphic library.)
  37. */
  38.  
  39. /*
  40. **   Tested with:
  41. **   Machine:            Mega 4 with 4 Meg RAM
  42. **   TOS Vers:           1.4
  43. **   Nationality:        UK
  44. */
  45.  
  46. /*
  47. **   
  48. **   Compatabilities:    First Word Plus, Timeworks DTP,
  49. **                       MS Write, Calligrapher, Calamus, 
  50. **                       Neodesk CLI, CixRead, 
  51. **                       Tempus version 1, Everest,
  52. **                       and the Hisoft C Editor.
  53. ** 
  54. **   Incompatabilities:  Doesn't work well within
  55. **                       Codehead's Multidesk utility, as
  56. **                       Multidesk curtails communication with 
  57. **                       slow programs like First Word Plus.
  58. **                       Also some programs like Tempus 2 use 
  59. **                       a different method to poll the 
  60. **                       keyboard. And some like CixComm are not
  61. **                       happy to get characters without a scancode
  62. **                       which is the whole point of this program.
  63. **                       Programs that only accept text
  64. **                       from a dialogue box such as Outline Art
  65. **                       and Touch Up or suspend menus when
  66. **                       entering text, eg. Easydraw2 & Degas Elite.
  67. **                       Non GEM programs obviously.
  68. **
  69. */
  70.                       
  71. #include <osbind.h>
  72. #include <gemlib.h>
  73. #include <string.h>
  74. #include <time.h>
  75. #include <dos.h>
  76. #ifdef DEBUG
  77. #include <stdio.h>
  78. #endif
  79.  
  80.  
  81. #include "inscrsc.h"
  82.  
  83. /* Function prototypes */
  84.  
  85. void send_ch(char x);
  86. #ifdef DEBUG
  87. int main(void);
  88. #else
  89. void main(void);
  90. #endif
  91. int getboxchar(struct object *ob, short ind);
  92. short dialogue(struct object *box_tree, int field);
  93. int form_under_mouse(OBJECT *box_tree,short *x,short *y,short *w,short *h);
  94. int form_at(short nx, short ny, OBJECT *box_tree,short *x,short *y,short *w,short *h);
  95. short get_scancode(char ch);
  96. void init_keys(void);
  97. void fix_dec_str(char *str,int n);
  98. short get_dec(char *str);
  99.  
  100.  
  101. /* void pause(time_t how_long); */
  102.  
  103. /* the decompiled resource 
  104. */
  105.  
  106. #include "inscrsc.c"
  107.  
  108.  
  109. #define TRUE  1
  110. #define FALSE 0
  111.  
  112. /* Structures used in this program */
  113.  
  114. /* Circular OS input buffer */
  115. #ifndef _DOS_H
  116. struct iorec {
  117.     char *ibuf;     /* Buffer */
  118.     short ibufsiz;  /* Size */
  119.     short ibufhd;   /* Head index */
  120.     short ibuftl;   /* Tail index */
  121.     short ibuflow;  /* low water mark */
  122.     short ibufhi;   /* high water mark */
  123. };
  124. #endif
  125.  
  126. /* AES tools */
  127.  
  128. int gl_apid;
  129.  
  130. int  menu_id, event;
  131. int  msgbuff[8];
  132. /* this is to allow easy patching */
  133. unsigned long p1 = 0x3E3E3E3E;
  134. short scan_dummy = 0x3E00;
  135. unsigned long p2 = 0x3C3C3C3C;
  136. /* The value to be patched is surrounded with >>>>> and <<<< */
  137. /* Functions */
  138. #ifdef DEBUG
  139. int main(void)
  140. #else
  141. void main(void)
  142. #endif
  143. {
  144.      short ret;
  145.      unsigned char x;
  146.  
  147.      gl_apid = appl_init();
  148.      
  149.      init_keys();
  150.      rsrc_init();
  151.  
  152. #ifndef DEBUG
  153. /* insert menu text */
  154.      menu_id = menu_register (gl_apid,"  Insert Char");
  155.      scan_dummy &= 127;
  156. /* Never ending loop */ 
  157.      for (;;)
  158.      {
  159.  
  160. /* wait for AES */
  161.           evnt_mesag (msgbuff); 
  162. /* If called wake up */        
  163.           if( msgbuff[0] == AC_OPEN
  164.                && msgbuff[4] == menu_id )
  165. #endif
  166.           {
  167.                do
  168.                {
  169.                     ret = dialogue(CH_TABLE,0);
  170.                     CH_TABLE[ret].ob_state &= ~SELECTED;
  171.                     if ((ret != CANCEL) && (CH_TABLE[ret].ob_type == G_BOXCHAR)) 
  172.                     {
  173.                          x = getboxchar(CH_TABLE,ret);
  174.                          send_ch(x);
  175.                     }
  176.                     else if(ret==QUESTION)
  177.                     {
  178.                          fix_dec_str(((TEDINFO *)SETTINGS[SCAN_DUMMY].ob_spec)->te_ptext,scan_dummy);
  179.                          SETTINGS[dialogue(SETTINGS,SCAN_DUMMY)].ob_state &= ~SELECTED;
  180.                          scan_dummy=get_dec(((TEDINFO *)SETTINGS[SCAN_DUMMY].ob_spec)->te_ptext) & 127;
  181.                     }
  182.                }while(ret==QUESTION);
  183.           }
  184. #ifndef DEBUG
  185.  
  186. /* go to sleep */
  187.      }
  188. #else
  189.      return(0);
  190. #endif
  191. /* we never get here */
  192. }
  193.  
  194.  
  195. void send_ch(char x)
  196. {
  197.  
  198. #ifdef DEBUG
  199.      char str[100];
  200.  
  201.      sprintf(str,"[1][Character %c %d selected][OK]",x,x);
  202.      form_alert(1,str);
  203. }
  204. #else
  205.  
  206.      short index;
  207.      struct iorec *io;
  208.      
  209. /* get address of OS buffer */
  210.      io=Iorec(1);
  211.      index=io->ibuftl;
  212.  
  213. /* 
  214.    The OS places 32 bit integers for each key 
  215.    in the buffer but the index position is 
  216.    recorded for 8 bit characters
  217. */ 
  218.      index+=4;
  219.  
  220.      if ( index >= io->ibufsiz) 
  221.      {
  222.           index=0;
  223.      }
  224.      io->ibuf[index+3]=x;
  225.      io->ibuf[index+2]=0;
  226.      io->ibuf[index+1]=get_scancode(x);
  227.      io->ibuf[index]=0;
  228. /*
  229.    Set the read position to the begining
  230.    of our string and the write position 
  231.    to the end of it (this might not be right)
  232. */
  233.      io->ibufhd = io->ibuftl;
  234.      io->ibuftl = index;
  235. } /* done */
  236. #endif
  237. int getboxchar(struct object *ob, short ind)
  238. {
  239.      return (int)((unsigned long)(ob[ind].ob_spec)>>24);
  240. }
  241.  
  242. short dialogue(struct object *box_tree, int field)
  243. {
  244.      short x, y, w, h, littlex, littley, littlew, littleh;
  245.      short ret;
  246.      GRECT wr;
  247.  
  248.      wind_get(DESK,WF_WORKXYWH,&wr.g_x,&wr.g_y,&wr.g_w,&wr.g_h);
  249.  
  250.  
  251.      if (field < 0) field = 0;
  252.  
  253.  
  254.      evnt_timer(1000,0);
  255.  
  256.      form_under_mouse(box_tree,&x,&y,&w,&h); 
  257.      littlew = littleh = 50;
  258.      littlex = x + w / 2 - littlew;
  259.      littley = y + h / 2 - littleh;
  260.      form_dial(FMD_START,littlex,littley,littlew,littleh,x,y,w,h);
  261. /*   form_dial(FMD_GROW,littlex,littley,littlew,littleh,x,y,w,h);  */
  262.      objc_draw(box_tree,0,MAX_DEPTH,x,y,w,h);
  263.      ret = form_do(box_tree,field) & 0x7fff;
  264.  
  265. /*   form_dial(FMD_SHRINK,littlex,littley,littlew,littleh,x,y,w,h); */
  266.      form_dial(FMD_FINISH,littlex,littley,littlew,littleh,x,y,w,h);
  267.      return (ret);
  268. }
  269.  
  270. int form_under_mouse(OBJECT *box_tree,short *x,short *y,short *w,short *h)
  271. {
  272.      short mx,my,dummy;
  273.      GRECT wr, or;
  274.  
  275.      wind_get(DESK,WF_WORKXYWH,&wr.g_x,&wr.g_y,&wr.g_w,&wr.g_h);
  276.  
  277.      graf_mkstate(&mx,&my,&dummy,&dummy);
  278.  
  279. /*
  280.      or.g_x=box_tree[0].ob_x-10;
  281.      or.g_y=box_tree[0].ob_y-10;
  282. */   
  283.      or.g_w=box_tree[0].ob_width+20;     
  284.      or.g_h=box_tree[0].ob_height+20;     
  285.  
  286.      or.g_x=mx-(or.g_w/2);
  287.      or.g_y=my-(or.g_h/2);
  288.  
  289.      rc_constrain(&wr,&or);
  290.  
  291.      box_tree[0].ob_x=or.g_x+10;     
  292.      box_tree[0].ob_y=or.g_y+10;     
  293.  
  294.      *x=or.g_x; *y=or.g_y; *w=or.g_w; *h=or.g_h;
  295.      return 0;
  296. }
  297.  
  298.  
  299. struct keytab *keys;
  300.  
  301. void init_keys(void)
  302. {
  303.      keys = (struct keytab *)Keytbl((char *)-1,(char *)-1,(char *)-1);
  304. }
  305.  
  306. short get_scancode(char ch)
  307. {
  308.      register short c;
  309.      for (c = 0; c < 128; c++)
  310.           if (( keys->unshift[c]  == ch) ||
  311.               ( keys->shift[c]    == ch) ||
  312.               ( keys->capslock[c] == ch)) return(c);
  313.      return (scan_dummy);
  314. }
  315.  
  316. void fix_dec_str(char *str,int n)
  317. {
  318.  
  319.      str[2]='0'+(n % 10);
  320.      n=n/10;
  321.      str[1]='0'+(n % 10);
  322.      n=n/10;
  323.      str[0]='0'+(n % 10);
  324.      str[3]=0;
  325. }
  326.  
  327. short get_dec(char *str)
  328. {
  329.      short ret=0;
  330.  
  331.      if (str[0] && str[0]<='9' && str[0]>='0')
  332.           ret += str[0]-'0';
  333.      else if (!str[0]) return ret;
  334.  
  335.     if (str[1] && str[1]<='9' && str[1]>='0')
  336.      {
  337.           ret *= 10;
  338.           ret += str[1]-'0';
  339.      }
  340.      else if (!str[1]) return ret;
  341.  
  342.      if (str[2] && str[2]<='9' && str[2]>='0')
  343.      {
  344.           ret *= 10;
  345.           ret += str[2]-'0';
  346.      }
  347.      return ret;
  348. }
  349.  
  350.  
  351.  
  352.       
  353.  
  354.  
  355.  
  356.