home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / the25.zip / thesrc251.zip / mouse.c < prev    next >
C/C++ Source or Header  |  1997-09-17  |  21KB  |  689 lines

  1. /***********************************************************************/
  2. /* MOUSE.C - THE mouse handling                                        */
  3. /* This file contains all commands that can be assigned to function    */
  4. /* keys or typed on the command line.                                  */
  5. /***********************************************************************/
  6. /*
  7.  * THE - The Hessling Editor. A text editor similar to VM/CMS xedit.
  8.  * Copyright (C) 1991-1997 Mark Hessling
  9.  *
  10.  * This program is free software; you can redistribute it and/or
  11.  * modify it under the terms of the GNU General Public License as
  12.  * published by the Free Software Foundation; either version 2 of
  13.  * the License, or any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  18.  * General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to:
  22.  *
  23.  *    The Free Software Foundation, Inc.
  24.  *    675 Mass Ave,
  25.  *    Cambridge, MA 02139 USA.
  26.  *
  27.  *
  28.  * If you make modifications to this software that you feel increases
  29.  * it usefulness for the rest of the community, please email the
  30.  * changes, enhancements, bug fixes as well as any and all ideas to me.
  31.  * This software is going to be maintained and enhanced as deemed
  32.  * necessary by the community.
  33.  *
  34.  * Mark Hessling                 Email:             M.Hessling@qut.edu.au
  35.  * PO Box 203                    Phone:                    +617 3802 0800
  36.  * Bellara                       http://www.gu.edu.au/gext/the/markh.html
  37.  * QLD 4507                      **** Maintainer PDCurses & REXX/SQL ****
  38.  * Australia                     ************* Author of THE ************
  39.  */
  40.  
  41. /*
  42. $Id: mouse.c 2.1 1995/06/24 16:29:25 MH Rel MH $
  43. */
  44.  
  45. #include <the.h>
  46. #include <proto.h>
  47.  
  48. /*
  49.  * Following #defines to cater for those platforms that don't
  50.  * have mouse definitions in <curses.h>
  51.  */
  52. #if !defined(BUTTON_SHIFT)
  53. # define BUTTON_SHIFT 0
  54. #endif
  55. #if !defined(BUTTON_CONTROL)
  56. # define BUTTON_CONTROL 0
  57. #endif
  58. #if !defined(BUTTON_ALT)
  59. # define BUTTON_ALT 0
  60. #endif
  61. #if !defined(BUTTON_PRESSED)
  62. # define BUTTON_PRESSED 0
  63. #endif
  64. #if !defined(BUTTON_RELEASED)
  65. # define BUTTON_RELEASED 0
  66. #endif
  67. #if !defined(BUTTON_MOVED)
  68. # define BUTTON_MOVED 0
  69. #endif
  70. #if !defined(BUTTON_DOUBLE_CLICKED)
  71. # define BUTTON_DOUBLE_CLICKED 0
  72. #endif
  73.  
  74. /*
  75.  * Button masks
  76.  */
  77. #define MOUSE_MODIFIER_MASK(x)  ((x) & 0xE000)
  78. #define MOUSE_ACTION_MASK(x)    ((x) & 0x1C00)
  79. #define MOUSE_BUTTON_MASK(x)    ((x) & 0x0380)
  80. #define MOUSE_WINDOW_MASK(x)    ((x) & 0x007F)
  81. /*
  82.  * Button modifiers
  83.  */
  84. #define MOUSE_MODIFIER_OFFSET   13
  85. #define MOUSE_NORMAL            0
  86. #define MOUSE_SHIFT             ((BUTTON_SHIFT >> 3)   << MOUSE_MODIFIER_OFFSET)
  87. #define MOUSE_CONTROL           ((BUTTON_CONTROL >> 3) << MOUSE_MODIFIER_OFFSET)
  88. #define MOUSE_ALT               ((BUTTON_ALT >> 3)     << MOUSE_MODIFIER_OFFSET)
  89. /*
  90.  * Button actions
  91.  */
  92. #define MOUSE_ACTION_OFFSET     10
  93. #define MOUSE_PRESS             (BUTTON_PRESSED << MOUSE_ACTION_OFFSET)
  94. #define MOUSE_RELEASE           (BUTTON_RELEASED << MOUSE_ACTION_OFFSET)
  95. #define MOUSE_DRAG              (BUTTON_MOVED << MOUSE_ACTION_OFFSET)
  96. #define MOUSE_DOUBLE_CLICK      (BUTTON_DOUBLE_CLICKED << MOUSE_ACTION_OFFSET)
  97. /*
  98.  * Button numbers
  99.  */
  100. #define MOUSE_BUTTON_OFFSET     7
  101. #define MOUSE_LEFT              (1 << MOUSE_BUTTON_OFFSET)
  102. #define MOUSE_MIDDLE            (2 << MOUSE_BUTTON_OFFSET)
  103. #define MOUSE_RIGHT             (3 << MOUSE_BUTTON_OFFSET)
  104.  
  105. #define MOUSE_INFO_TO_KEY(w,b,ba,bm) ((w)|(b<<MOUSE_BUTTON_OFFSET)|(ba<<MOUSE_ACTION_OFFSET)|((bm>>3)<<MOUSE_MODIFIER_OFFSET))
  106.  
  107. static CHARTYPE *button_names[] =
  108.  {(CHARTYPE *)"-button 0-",(CHARTYPE *)"LB",(CHARTYPE *)"MB",(CHARTYPE *)"RB"};
  109.  
  110. static CHARTYPE *button_modifier_names[] =
  111.  {(CHARTYPE *)"",(CHARTYPE *)"S-",(CHARTYPE *)"C-",(CHARTYPE *)"?",(CHARTYPE *)"A-"};
  112.  
  113. static CHARTYPE *button_action_names[] =
  114.  {(CHARTYPE *)"R",(CHARTYPE *)"P",(CHARTYPE *)"C",(CHARTYPE *)"2",(CHARTYPE *)"3",(CHARTYPE *)"D"};
  115.  
  116. #if defined(MOUSE_SUPPORT_ENABLED)   /* set in "the.h" */
  117.  
  118. /***********************************************************************/
  119. #ifdef HAVE_PROTO
  120. short THEMouse(CHARTYPE *params)
  121. #else
  122. short THEMouse(params)
  123. CHARTYPE *params;
  124. #endif
  125. /***********************************************************************/
  126. {
  127. /*-------------------------- external data ----------------------------*/
  128. /*--------------------------- local data ------------------------------*/
  129.  int w=0;
  130.  CHARTYPE scrn=0;
  131.  short rc=RC_OK;
  132.  int curr_button_action=0;
  133.  int curr_button_modifier=0;
  134.  int curr_button=0;
  135. /*--------------------------- processing ------------------------------*/
  136. #ifdef TRACE
  137.  trace_function("mouse.c:  THEMouse");
  138. #endif
  139.  which_window_is_mouse_in(&scrn,&w);
  140.  if (w == (-1)) /* shouldn't happen! */
  141.    {
  142. #ifdef TRACE
  143.     trace_return();
  144. #endif
  145.     return(RC_OK);
  146.    }
  147.  rc = get_mouse_info(&curr_button,&curr_button_action,&curr_button_modifier);
  148.  if (rc != RC_OK)
  149.    {
  150. #ifdef TRACE
  151.     trace_return();
  152. #endif
  153.     return(rc);
  154.    }
  155.  rc = execute_mouse_commands(MOUSE_INFO_TO_KEY(w,curr_button,curr_button_action,curr_button_modifier));
  156. #ifdef TRACE
  157.  trace_return();
  158. #endif
  159.  return(rc);
  160. }
  161. /***********************************************************************/
  162. #ifdef HAVE_PROTO
  163. void which_window_is_mouse_in(CHARTYPE *scrn,int *w)
  164. #else
  165. void which_window_is_mouse_in(scrn,w)
  166. CHARTYPE *scrn;
  167. int *w;
  168. #endif
  169. /***********************************************************************/
  170. {
  171. /*-------------------------- external data ----------------------------*/
  172.  extern CHARTYPE display_screens;
  173.  extern WINDOW *statarea,*divider;
  174.  extern bool horizontal;
  175. /*--------------------------- local data ------------------------------*/
  176.  CHARTYPE i=0;
  177.  int j=0;
  178.  int y=0,x=0;
  179. /*--------------------------- processing ------------------------------*/
  180. #ifdef TRACE
  181.  trace_function("mouse.c:  which_window_is_mouse_in");
  182. #endif
  183.  for (i=0;i<display_screens;i++)
  184.    {
  185.     for (j=0;j<VIEW_WINDOWS;j++)
  186.       {
  187.        if (screen[i].win[j] != (WINDOW *)NULL)
  188.          {
  189.           wmouse_position(screen[i].win[j],&y,&x);
  190.           if (y != (-1)
  191.           &&  x != (-1))
  192.             {
  193.              *scrn = i;
  194.              *w = j;
  195. #ifdef TRACE
  196.              trace_return();
  197. #endif
  198.              return;
  199.             }
  200.          }
  201.       }
  202.    }
  203. /*---------------------------------------------------------------------*/
  204. /* To get here, the mouse is NOT in any of the view windows; is it in  */
  205. /* the status line ?                                                   */
  206. /*---------------------------------------------------------------------*/
  207.  wmouse_position(statarea,&y,&x);
  208.  if (y != (-1)
  209.  &&  x != (-1))
  210.    {
  211.     *w = WINDOW_STATAREA;
  212.     *scrn = current_screen;
  213. #ifdef TRACE
  214.     trace_return();
  215. #endif
  216.     return;
  217.    }
  218. /*---------------------------------------------------------------------*/
  219. /* To get here, the mouse is NOT in any of the view windows; or the    */
  220. /* status line. Is it in the DIVIDER window ?                          */
  221. /*---------------------------------------------------------------------*/
  222.  if (display_screens > 1
  223.  &&  !horizontal)
  224.    {
  225.     wmouse_position(divider,&y,&x);
  226.     if (y != (-1)
  227.     &&  x != (-1))
  228.       {
  229.        *w = WINDOW_DIVIDER;
  230.        *scrn = current_screen;
  231. #ifdef TRACE
  232.        trace_return();
  233. #endif
  234.        return;
  235.       }
  236.    }
  237. /*---------------------------------------------------------------------*/
  238. /* To get here, the mouse is NOT in ANY window. Return an error.       */
  239. /*---------------------------------------------------------------------*/
  240.  *w = (-1);
  241. #ifdef TRACE
  242.  trace_return();
  243. #endif
  244.  return;
  245. }
  246. /***********************************************************************/
  247. #ifdef HAVE_PROTO
  248. short get_mouse_info(int *button,int *button_action,int *button_modifier)
  249. #else
  250. short get_mouse_info(button,button_action,button_modifier)
  251. int *button,*button_action,*button_modifier;
  252. #endif
  253. /***********************************************************************/
  254. {
  255. /*-------------------------- external data ----------------------------*/
  256. /*--------------------------- local data ------------------------------*/
  257.  short rc=RC_OK;
  258. /*--------------------------- processing ------------------------------*/
  259. #ifdef TRACE
  260.  trace_function("mouse.c:  get_mouse_info");
  261. #endif
  262.  request_mouse_pos();
  263.  if (A_BUTTON_CHANGED)
  264.    {
  265.     if (BUTTON_CHANGED(1))
  266.        *button = 1;
  267.     else
  268.        if (BUTTON_CHANGED(2))
  269.           *button = 2;
  270.        else
  271.           if (BUTTON_CHANGED(3))
  272.              *button = 3;
  273.           else
  274.             {
  275. #ifdef TRACE
  276.              trace_return();
  277. #endif
  278.              return(RC_OK);
  279.             }
  280.     if (BUTTON_STATUS(*button) & BUTTON_SHIFT)
  281.        *button_modifier = BUTTON_SHIFT;
  282.     else
  283.        if (BUTTON_STATUS(*button) & BUTTON_CONTROL)
  284.           *button_modifier = BUTTON_CONTROL;
  285.        else
  286.           if (BUTTON_STATUS(*button) & BUTTON_ALT)
  287.              *button_modifier = BUTTON_ALT;
  288.           else
  289.              *button_modifier = 0;
  290.     if (MOUSE_MOVED)
  291.        *button_action = BUTTON_MOVED;
  292.     else
  293.        *button_action = BUTTON_STATUS(*button) & BUTTON_ACTION_MASK;
  294.    }
  295.  else
  296.    {
  297.     *button = *button_action = *button_modifier = 0;
  298.     rc = RC_INVALID_OPERAND;
  299.    }
  300. #ifdef TRACE
  301.  trace_return();
  302. #endif
  303.  return(rc);
  304. }
  305. /***********************************************************************/
  306. #ifdef HAVE_PROTO
  307. void initialise_mouse_commands(void)
  308. #else
  309. void initialise_mouse_commands()
  310. #endif
  311. /***********************************************************************/
  312. {
  313. /*-------------------------- external data ----------------------------*/
  314.  extern DEFINE *first_mouse_define;
  315.  extern DEFINE *last_mouse_define;
  316. /*--------------------------- local data ------------------------------*/
  317. /*--------------------------- processing ------------------------------*/
  318. #ifdef TRACE
  319.  trace_function("mouse.c:   initialise_mouse_commands");
  320. #endif
  321.  
  322. /*
  323.  * Default mouse actions in FILEAREA
  324.  */
  325.  add_define(&first_mouse_define,&last_mouse_define,
  326.             WINDOW_FILEAREA|MOUSE_LEFT|MOUSE_PRESS|MOUSE_NORMAL,
  327.             (CHARTYPE *)"CURSOR MOUSE",FALSE);
  328.  add_define(&first_mouse_define,&last_mouse_define,
  329.             WINDOW_FILEAREA|MOUSE_LEFT|MOUSE_PRESS|MOUSE_SHIFT,
  330.             (CHARTYPE *)"CURSOR MOUSE#RESET BLOCK#MARK LINE",FALSE);
  331.  add_define(&first_mouse_define,&last_mouse_define,
  332.             WINDOW_FILEAREA|MOUSE_LEFT|MOUSE_PRESS|MOUSE_CONTROL,
  333.             (CHARTYPE *)"CURSOR MOUSE#RESET BLOCK#MARK BOX",FALSE);
  334.  add_define(&first_mouse_define,&last_mouse_define,
  335.             WINDOW_FILEAREA|MOUSE_LEFT|MOUSE_DRAG|MOUSE_SHIFT,
  336.             (CHARTYPE *)"CURSOR MOUSE#MARK LINE",FALSE);
  337.  add_define(&first_mouse_define,&last_mouse_define,
  338.             WINDOW_FILEAREA|MOUSE_LEFT|MOUSE_DRAG|MOUSE_CONTROL,
  339.             (CHARTYPE *)"CURSOR MOUSE#MARK BOX",FALSE);
  340.  add_define(&first_mouse_define,&last_mouse_define,
  341.             WINDOW_FILEAREA|MOUSE_RIGHT|MOUSE_PRESS|MOUSE_SHIFT,
  342.             (CHARTYPE *)"CURSOR MOUSE#MARK LINE",FALSE);
  343.  add_define(&first_mouse_define,&last_mouse_define,
  344.             WINDOW_FILEAREA|MOUSE_RIGHT|MOUSE_PRESS|MOUSE_CONTROL,
  345.             (CHARTYPE *)"CURSOR MOUSE#MARK BOX",FALSE);
  346.  add_define(&first_mouse_define,&last_mouse_define,
  347.             WINDOW_FILEAREA|MOUSE_RIGHT|MOUSE_PRESS|MOUSE_NORMAL,
  348.             (CHARTYPE *)"CURSOR MOUSE#SOS MAKECURR",FALSE);
  349.  add_define(&first_mouse_define,&last_mouse_define,
  350.             WINDOW_FILEAREA|MOUSE_LEFT|MOUSE_DRAG|MOUSE_SHIFT,
  351.             (CHARTYPE *)"CURSOR MOUSE#MARK LINE",FALSE);
  352.  add_define(&first_mouse_define,&last_mouse_define,
  353.             WINDOW_FILEAREA|MOUSE_LEFT|MOUSE_DRAG|MOUSE_CONTROL,
  354.             (CHARTYPE *)"CURSOR MOUSE#MARK BOX",FALSE);
  355.  add_define(&first_mouse_define,&last_mouse_define,
  356.             WINDOW_FILEAREA|MOUSE_LEFT|MOUSE_DOUBLE_CLICK|MOUSE_NORMAL,
  357.             (CHARTYPE *)"CURSOR MOUSE#SOS EDIT",FALSE);
  358. /*
  359.  * Default mouse actions in PREFIX area
  360.  */
  361.  add_define(&first_mouse_define,&last_mouse_define,
  362.             WINDOW_PREFIX|MOUSE_LEFT|MOUSE_PRESS|MOUSE_NORMAL,
  363.             (CHARTYPE *)"CURSOR MOUSE",FALSE);
  364.  add_define(&first_mouse_define,&last_mouse_define,
  365.             WINDOW_PREFIX|MOUSE_RIGHT|MOUSE_PRESS|MOUSE_NORMAL,
  366.             (CHARTYPE *)"CURSOR MOUSE#SOS MAKECURR",FALSE);
  367.  add_define(&first_mouse_define,&last_mouse_define,
  368.             WINDOW_PREFIX|MOUSE_LEFT|MOUSE_DOUBLE_CLICK|MOUSE_NORMAL,
  369.             (CHARTYPE *)"CURSOR MOUSE#SOS EDIT",FALSE);
  370. /*
  371.  * Default mouse actions in COMMAND line
  372.  */
  373.  add_define(&first_mouse_define,&last_mouse_define,
  374.             WINDOW_COMMAND|MOUSE_LEFT|MOUSE_PRESS|MOUSE_NORMAL,
  375.             (CHARTYPE *)"CURSOR MOUSE",FALSE);
  376. /*
  377.  * Default mouse actions in STATAREA
  378.  */
  379.  add_define(&first_mouse_define,&last_mouse_define,
  380.             WINDOW_STATAREA|MOUSE_LEFT|MOUSE_PRESS|MOUSE_NORMAL,
  381.             (CHARTYPE *)"STATUS",FALSE);
  382. /*
  383.  * Default mouse actions in IDLINE
  384.  */
  385.  add_define(&first_mouse_define,&last_mouse_define,
  386.             WINDOW_IDLINE|MOUSE_LEFT|MOUSE_PRESS|MOUSE_NORMAL,
  387.             (CHARTYPE *)"XEDIT",FALSE);
  388.  add_define(&first_mouse_define,&last_mouse_define,
  389.             WINDOW_IDLINE|MOUSE_RIGHT|MOUSE_PRESS|MOUSE_NORMAL,
  390.             (CHARTYPE *)"XEDIT -",FALSE);
  391. /*
  392.  * Default mouse actions in DIVIDER
  393.  */
  394.  add_define(&first_mouse_define,&last_mouse_define,
  395.             WINDOW_DIVIDER|MOUSE_LEFT|MOUSE_PRESS|MOUSE_NORMAL,
  396.             (CHARTYPE *)"SCREEN 1",FALSE);
  397.  
  398. #ifdef TRACE
  399.  trace_return();
  400. #endif
  401.  return;
  402. }
  403. /***********************************************************************/
  404. #ifdef HAVE_PROTO
  405. int mouse_info_to_key(int w, int button, int button_action, int button_modifier)
  406. #else
  407. int mouse_info_to_key(w,button,button_action,button_modifier)
  408. int w,button,button_action,button_modifier;
  409. #endif
  410. /***********************************************************************/
  411. {
  412. /*-------------------------- external data ----------------------------*/
  413. /*--------------------------- local data ------------------------------*/
  414. /*--------------------------- processing ------------------------------*/
  415. #ifdef TRACE
  416.  trace_function("mouse.c:   mouse_info_to_key");
  417. #endif
  418.  
  419. #ifdef TRACE
  420.  trace_return();
  421. #endif
  422.  return(MOUSE_INFO_TO_KEY(w,button,button_action,button_modifier));
  423. }
  424. #endif
  425. /***********************************************************************/
  426. #ifdef HAVE_PROTO
  427. CHARTYPE *mouse_key_number_to_name(int key_number,CHARTYPE *key_name)
  428. #else
  429. CHARTYPE *mouse_key_number_to_name(key_number,key_name)
  430. int key_number;
  431. CHARTYPE *key_name;
  432. #endif
  433. /***********************************************************************/
  434. {
  435. /*-------------------------- external data ----------------------------*/
  436.  extern AREAS valid_areas[ATTR_MAX];
  437. /*--------------------------- local data ------------------------------*/
  438.  register int i=0;
  439.  int w=0,b=0,ba=0,bm=0;
  440.  CHARTYPE *win_name=(CHARTYPE *)"*** unknown ***";
  441. /*--------------------------- processing ------------------------------*/
  442. #ifdef TRACE
  443.  trace_function("mouse.c:   mouse_key_number_to_name");
  444. #endif
  445.  w = MOUSE_WINDOW_MASK(key_number);
  446.  b = (MOUSE_BUTTON_MASK(key_number)>>MOUSE_BUTTON_OFFSET);
  447.  ba = (MOUSE_ACTION_MASK(key_number)>>MOUSE_ACTION_OFFSET);
  448.  bm = (MOUSE_MODIFIER_MASK(key_number)>>MOUSE_MODIFIER_OFFSET);
  449.  for (i=0;i<ATTR_MAX;i++)
  450.   {
  451.    if (w == valid_areas[i].area_window
  452.    &&  valid_areas[i].actual_window)
  453.      {
  454.       win_name = valid_areas[i].area;
  455.       break;
  456.      }
  457.   }
  458.  sprintf((DEFCHAR *)key_name,"%s%s%s in %s",button_modifier_names[bm],button_action_names[ba],
  459.          button_names[b],win_name);
  460. #ifdef TRACE
  461.  trace_return();
  462. #endif
  463.  return(key_name);
  464. }
  465. /***********************************************************************/
  466. #ifdef HAVE_PROTO
  467. int find_mouse_key_value(CHARTYPE *mnemonic,CHARTYPE *win_name)
  468. #else
  469. int find_mouse_key_value(mnemonic,win_name)
  470. CHARTYPE *mnemonic,*win_name;
  471. #endif
  472. /***********************************************************************/
  473. /*   Function: find the matching key value for the supplied key name   */
  474. /* Parameters:                                                         */
  475. /*   mnemonic: the key name to be matched                              */
  476. /***********************************************************************/
  477. {
  478. /*-------------------------- external data ----------------------------*/
  479.  extern AREAS valid_areas[ATTR_MAX];
  480. /*--------------------------- local data ------------------------------*/
  481.  register short i=0;
  482.  int w=(-1),key=0,len=0;
  483.  int b=0,ba=0,bm=0;
  484.  CHARTYPE tmp_buf[6];
  485. /*--------------------------- processing ------------------------------*/
  486. #ifdef TRACE
  487.  trace_function("mouse.c:   find_mouse_key_value");
  488. #endif
  489. /*---------------------------------------------------------------------*/
  490. /* Parse the mnemonic for a valid mouse key definition...              */
  491. /*---------------------------------------------------------------------*/
  492.  len = strlen((DEFCHAR *)mnemonic);
  493.  if (len == 3)
  494.    {
  495.     strcpy((DEFCHAR *)tmp_buf,"N-");
  496.     strcat((DEFCHAR *)tmp_buf,(DEFCHAR *)mnemonic);
  497.    }
  498.  else
  499.    {
  500.     if (len == 5)
  501.       {
  502.        strcpy((DEFCHAR *)tmp_buf,(DEFCHAR *)mnemonic);
  503.       }
  504.     else
  505.       {
  506.        display_error(1,mnemonic,FALSE);
  507. #ifdef TRACE
  508.        trace_return();
  509. #endif
  510.        return(-1);
  511.       }
  512.    }
  513.  if (tmp_buf[1] != '-'
  514.  || ( tmp_buf[4] != 'B'
  515.    && tmp_buf[4] != 'b'))
  516.    {
  517.     display_error(1,mnemonic,FALSE);
  518. #ifdef TRACE
  519.     trace_return();
  520. #endif
  521.     return(-1);
  522.    }
  523.  /*
  524.   * Validate button modifier
  525.   */
  526.  switch(tmp_buf[0])
  527.    {
  528.     case 'N':
  529.     case 'n':
  530.          bm = 0;
  531.          break;
  532.     case 'S':
  533.     case 's':
  534.          bm = MOUSE_SHIFT;
  535.          break;
  536.     case 'C':
  537.     case 'c':
  538.          bm = MOUSE_CONTROL;
  539.          break;
  540.     case 'A':
  541.     case 'a':
  542.          bm = MOUSE_ALT;
  543.          break;
  544.     default:
  545.          display_error(1,mnemonic,FALSE);
  546. #ifdef TRACE
  547.          trace_return();
  548. #endif
  549.          return(-1);
  550.          break;
  551.    }
  552.  /*
  553.   * Validate button action
  554.   */
  555.  switch(tmp_buf[2])
  556.    {
  557.     case 'P':
  558.     case 'p':
  559.          ba = MOUSE_PRESS;
  560.          break;
  561.     case 'R':
  562.     case 'r':
  563.          ba = MOUSE_RELEASE;
  564.          break;
  565.     case '2':
  566.          ba = MOUSE_DOUBLE_CLICK;
  567.          break;
  568.     case 'D':
  569.     case 'd':
  570.          ba = MOUSE_DRAG;
  571.          break;
  572.     default:
  573.          display_error(1,mnemonic,FALSE);
  574. #ifdef TRACE
  575.          trace_return();
  576. #endif
  577.          return(-1);
  578.          break;
  579.    }
  580.  /*
  581.   * Validate button number
  582.   */
  583.  switch(tmp_buf[3])
  584.    {
  585.     case 'L':
  586.     case 'l':
  587.          b = MOUSE_LEFT;
  588.          break;
  589.     case 'R':
  590.     case 'r':
  591.          b = MOUSE_RIGHT;
  592.          break;
  593.     case 'M':
  594.     case 'm':
  595.          b = MOUSE_MIDDLE;
  596.          break;
  597.     default:
  598.          display_error(1,mnemonic,FALSE);
  599. #ifdef TRACE
  600.          trace_return();
  601. #endif
  602.          return(-1);
  603.          break;
  604.    }
  605. /*---------------------------------------------------------------------*/
  606. /* Find a valid window name for win_name...                            */
  607. /*---------------------------------------------------------------------*/
  608.  for (i=0;i<ATTR_MAX;i++)
  609.    {
  610.     if (equal(valid_areas[i].area,win_name,valid_areas[i].area_min_len))
  611.       {
  612.        w = valid_areas[i].area_window;
  613.        break;
  614.       }
  615.    }
  616.  if (w == (-1))
  617.    {
  618.     display_error(1,win_name,FALSE);
  619. #ifdef TRACE
  620.     trace_return();
  621. #endif
  622.     return(-1);
  623.    }
  624.  key = w|b|ba|bm;
  625. #ifdef TRACE
  626.  trace_return();
  627. #endif
  628.  return(key);
  629. }
  630. #if defined(HAVE_SB_INIT)
  631. /***********************************************************************/
  632. #ifdef HAVE_PROTO
  633. short ScrollbarHorz(CHARTYPE *params)
  634. #else
  635. short ScrollbarHorz(params)
  636. CHARTYPE *params;
  637. #endif
  638. /***********************************************************************/
  639. {
  640. /*-------------------------- external data ----------------------------*/
  641. /*--------------------------- local data ------------------------------*/
  642.  int cur=0;
  643.  short rc=RC_OK;
  644. /*--------------------------- processing ------------------------------*/
  645. #ifdef TRACE
  646.  trace_function("mouse.c:   ScrollbarHorz");
  647. #endif
  648. /*---------------------------------------------------------------------*/
  649. /* Parse the mnemonic for a valid mouse key definition...              */
  650. /*---------------------------------------------------------------------*/
  651.  sb_get_horz(NULL,NULL,&cur);
  652.  if (cur < CURRENT_VIEW->verify_col)
  653.     rc = Left((CHARTYPE*)"FULL");
  654.  else
  655.     rc = Right((CHARTYPE*)"FULL");
  656. #ifdef TRACE
  657.  trace_return();
  658. #endif
  659.  return(rc);
  660. }
  661. /***********************************************************************/
  662. #ifdef HAVE_PROTO
  663. short ScrollbarVert(CHARTYPE *params)
  664. #else
  665. short ScrollbarVert(params)
  666. CHARTYPE *params;
  667. #endif
  668. /***********************************************************************/
  669. {
  670. /*-------------------------- external data ----------------------------*/
  671. /*--------------------------- local data ------------------------------*/
  672.  int cur=0;
  673.  short rc=RC_OK;
  674. /*--------------------------- processing ------------------------------*/
  675. #ifdef TRACE
  676.  trace_function("mouse.c:   ScrollbarVert");
  677. #endif
  678. /*---------------------------------------------------------------------*/
  679. /* Parse the mnemonic for a valid mouse key definition...              */
  680. /*---------------------------------------------------------------------*/
  681.  sb_get_vert(NULL,NULL,&cur);
  682.  rc = execute_makecurr((LINETYPE)cur);
  683. #ifdef TRACE
  684.  trace_return();
  685. #endif
  686.  return(rc);
  687. }
  688. #endif
  689.