home *** CD-ROM | disk | FTP | other *** search
/ Encyclopedia of Graphics File Formats Companion / GFF_CD.ISO / software / unix / saoimage / sao1_07.tar / mainkey.c < prev    next >
C/C++ Source or Header  |  1991-01-03  |  6KB  |  222 lines

  1. #ifndef lint
  2. static char SccsId[] = "%W%  %G%";
  3. #endif
  4.  
  5. /* Module:    mainkey.c (Main Key)
  6.  * Purpose:    Dispatch responses mapped to various keyboard keys
  7.  * Subroutine:    key_response()            returns: void
  8.  * Subroutine:    set_iraf_key_trigger()        returns: void
  9.  * Xlib calls:    XWarpPointer(), XSync()
  10.  * Copyright:    1989 Smithsonian Astrophysical Observatory
  11.  *        You may do anything you like with this file except remove
  12.  *        this copyright.  The Smithsonian Astrophysical Observatory
  13.  *        makes no representations about the suitability of this
  14.  *        software for any purpose.  It is provided "as is" without
  15.  *        express or implied warranty.
  16.  * Modified:    {0} Michael VanHilst    initial version        29 June 1989
  17.  *        {1} MVH display window key to trigger IRAF write 16 Aug 1989
  18.  *        {2} MVH support for text cursor              1 Jun 1991 
  19.  *        {n} <who> -- <does what> -- <when>
  20.  */
  21.  
  22. #include <X11/Xlib.h>        /*  X window stuff  */
  23. #include <X11/Xutil.h>        /*  X window manager stuff  */
  24. #include <X11/keysym.h>
  25. #include <X11/keysymdef.h>
  26. #include "hfiles/constant.h"    /*  Define codes  */
  27. #include "hfiles/struct.h"    /*  Declare structure types  */
  28. #include "hfiles/extern.h"    /*  Extern main parameter structures  */
  29.  
  30. #define MAX_MAPPED_STRING_LENGTH 16
  31. #define MetaMask Mod1Mask
  32.  
  33.  
  34. #ifdef ANSIC
  35. /*  Exported declarations must be centralized before ANSI C can be used  */
  36.  
  37. void        grab_keys_for_textcursor(    int state);
  38. void        set_iraf_key_trigger(    int state);
  39. void        key_response();
  40.  
  41. #endif
  42.  
  43.  
  44. static int textcursor = 0;
  45. /*  Subroutine:    grab_keys_for_textcursor
  46.  *  Purpose:    Direct all key input to the text cursor editor
  47.  */
  48. #ifdef ANSIC
  49. void grab_keys_for_textcursor ( int state )
  50. #else
  51. void grab_keys_for_textcursor ( state )
  52.      int state;
  53. #endif
  54. {
  55.   textcursor = state;
  56. }
  57.  
  58.  
  59. #ifdef IMTOOL
  60. static int iraf_trigger = 0;
  61. /*  Subroutine:    set_iraf_key_trigger
  62.  *  Purpose:    Set and clear trigger for cursor readback through IRAF pipe
  63.  */
  64. #ifdef ANSIC
  65. void set_iraf_key_trigger ( int state )
  66. #else
  67. void set_iraf_key_trigger ( state )
  68.      int state;
  69. #endif
  70. {
  71.   iraf_trigger = state;
  72. }
  73. #endif
  74.  
  75.  
  76. /*  Subroutine:    key_response
  77.  *  Purpose:    Respond to a key stroke
  78.  */
  79. void key_response()
  80. {
  81.   KeySym keysym;
  82.   XComposeStatus compose;
  83.   int char_cnt;
  84.   int x, y;
  85.   static int bufsize = MAX_MAPPED_STRING_LENGTH;
  86.   char buffer[MAX_MAPPED_STRING_LENGTH];
  87. #ifdef IMTOOL
  88.   int trigger_curpos_to_iraf();
  89. #endif
  90.   void magnify_pan(), magnify_disp(), say_goodbye(), disp_panbox();
  91.   void disp_dispbox(), raise_windows(), get_new_cmd(), print_table();
  92.   void ascii_region(), textcursor_keyentry();
  93.  
  94.   /*  Decode the key event to ascii  */
  95.   char_cnt = XLookupString(&control.event.xkey, buffer, bufsize,
  96.                &keysym, &compose);
  97.   /*  Key input from display window may be redirected for special purposes  */
  98.   if( control.event.xkey.window == dispbox.ID ) {
  99. #ifdef IMTOOL
  100.     if( iraf_trigger && (char_cnt == 1) &&
  101.     trigger_curpos_to_iraf(&control.event.xkey, (int)buffer[0]) )
  102.       return;
  103. #endif
  104.     /*  Redirect keyboard input for textcursor editor  */
  105.     if( textcursor ) {
  106.       textcursor_keyentry(&control.event.xkey, keysym);
  107.       return;
  108.     }
  109.   }
  110.   /*  Ignore modifier key pressing  */
  111.   if( ((control.event.xkey.state & (ControlMask | MetaMask)) == 0) ||
  112.       (keysym >= XK_BackSpace) ) {
  113.     switch( keysym ) {
  114.     case XK_Shift_L:
  115.     case XK_Shift_R:
  116. #ifdef IMTOOL
  117.       /*  Don't update tracking now if in IRAF interactive mode  */
  118.       if( iraf_trigger )
  119.     return;
  120. #endif
  121.       if( control.event.xkey.window == panbox.ID ) {
  122.     /*  Update magnifier if in panbox  */
  123.     magnify_pan (&control.event);
  124.       } else if( (control.event.xkey.window == dispbox.ID) &&
  125.          (!control.magni_track) ) {
  126.     /*  If in disp window and not now tracking, update magnifier  */
  127.     magnify_disp (&control.event, 1, !control.coord_track);
  128.       }
  129.       break;
  130. #ifdef SUN
  131.       /*  Shifted arrow keys on Sun keypad  */
  132.     case XK_R8:
  133.     case XK_R10:
  134.     case XK_R12:
  135.     case XK_R14:
  136.       if( keysym == XK_R8 )
  137.     keysym = XK_Up;
  138.       else if( keysym == XK_R10 )
  139.     keysym = XK_Left;
  140.       else if( keysym == XK_R12 )
  141.     keysym = XK_Right;
  142.       else if( keysym == XK_R14 )
  143.     keysym = XK_Down;
  144. #endif
  145.     case XK_Up:
  146.     case XK_Down:
  147.     case XK_Left:
  148.     case XK_Right:
  149.       /*  Use the mouse coordinates at time of key strike  */
  150.       if( keysym == XK_Up )
  151.     y = control.event.xkey.y - 1;
  152.       else if( keysym == XK_Down )
  153.     y = control.event.xkey.y + 1;
  154.       else
  155.     y = control.event.xkey.y;
  156.       if( keysym == XK_Right )
  157.     x = control.event.xkey.x + 1;
  158.       else if( keysym == XK_Left )
  159.     x = control.event.xkey.x - 1;
  160.       else
  161.     x = control.event.xkey.x;
  162.       /*  Move the mouse (supercede any recent mouse movement)  */
  163.       XSync (control.event.xkey.display, 0);
  164.       XWarpPointer(control.event.xkey.display, None,
  165.            control.event.xkey.window, 0, 0, 0, 0, x, y);
  166.       break;
  167.     case XK_A:
  168.     case XK_a:
  169.       /*  a or r (?) TO RAISE ALL WINDOWS OUT OF KAOS  */
  170.       disp_panbox();
  171.       disp_dispbox();
  172.       raise_windows();
  173.       break;
  174.     case XK_L:
  175.     case XK_l:
  176.       /*  Debugging print_table without scaling (fool it about scaling)  */
  177.       x = img.fiscaled;
  178.       img.fiscaled = 0;
  179.       print_table();
  180.       img.fiscaled = x;
  181.       break;
  182.     case XK_N:
  183.     case XK_n:
  184.       /*  Open a new image file (see CmdNew.c)  */
  185.       get_new_cmd();
  186.       break;
  187. #ifdef QUITKEY
  188.     case XK_Q:
  189.     case XK_q:
  190.       /*  q FOR QUIT  */
  191.       say_goodbye(0);
  192.       break;
  193. #endif
  194.     case XK_R:
  195.     case XK_r:
  196.       raise_windows();
  197.       break;
  198.     case XK_T:
  199.     case XK_t:
  200.       /*  Print table of image values if in display or pan windows  */
  201.       print_table();
  202.       break;
  203.     case XK_Delete:
  204.     case XK_D:
  205.     case XK_d:
  206.     case XK_E:
  207.     case XK_e:
  208.     case XK_S:
  209.     case XK_s:
  210.       /*  Character control in region (cursor) mode  */
  211.       if( control.mode == COP ) {
  212.     if( (control.event.xkey.window == dispbox.ID) ||
  213.         (cursor.type == COP_Text) )
  214.     ascii_region(&control.event.xkey, keysym);
  215.       }
  216.       break;
  217.     default:
  218.       break;
  219.     }
  220.   }
  221. }
  222.