home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / AP / JED / JED097-1.TAR / jed / lib / mouse.sl < prev    next >
Encoding:
Text File  |  1994-12-12  |  5.7 KB  |  249 lines

  1. %
  2. % JED mouse interface 
  3. %
  4. % These routines assume a 3 button mouse
  5. %  
  6. %          left :  set point to mouse point
  7. %        middle :  paste from cut buffer moving point to mouse point
  8. %         right :  copy region from point to mouse point to cut buffer
  9. %     drag left :  mark a region and copy it to cut buffer
  10. %    drag right :  mark a region and copy it to cut buffer
  11. %    shift left :  split window mouse is in
  12. %  control left :  delete window mouse is in
  13. % control right :  kill region between point and mouse point to cut buffer
  14. %
  15. %  Other buttons are undefined.
  16. %
  17.  
  18. setkey ("mouse_set_point_open",        "^[^@Dl");   % left button down
  19. setkey ("mouse_set_point_close",    "^[^@Ul");   % left button up
  20. setkey ("mouse_yank_cutbuffer",        "^[^@Dm");   % middle down
  21. setkey ("mouse_mark_and_copy",        "^[^@Dr");   % right down
  22. setkey ("mouse_set_point_close",    "^[^@Ur");   % right up
  23. setkey ("mouse_null",            "^[^@Um");   % middle up
  24.  
  25. % dragging
  26. setkey ("mouse_drag",            "^[^@^@l");  % left dragging
  27. setkey ("mouse_drag",            "^[^@^@r");  % right dragging
  28. setkey ("mouse_null",            "^[^@^@^L"); % C-left dragging
  29. setkey ("mouse_drag",            "^[^@^@^R"); % C-right dragging
  30. setkey ("mouse_null",            "^[^@^@L");  % S-left dragging
  31. setkey ("mouse_null",            "^[^@^@R");  % S-right dragging
  32.  
  33. % shifted
  34. setkey ("mouse_split_window",        "^[^@DL");   % Shift-left button down
  35. setkey ("mouse_null",            "^[^@UL");   % left button up
  36. setkey ("mouse_yank_from_jed",        "^[^@DM");   % middle down
  37. setkey ("mouse_null",            "^[^@DR");   % right down
  38. setkey ("mouse_null",            "^[^@UR");   % right up
  39. setkey ("mouse_null",            "^[^@UM");   % middle up
  40.  
  41. % ctrl
  42. setkey ("mouse_delete_window",        "^[^@D^L");  % left button down
  43. setkey ("mouse_null",            "^[^@U^L");  % left button up
  44. setkey ("mouse_null",            "^[^@D^M");  % middle down
  45. setkey ("mouse_kill_region",        "^[^@D^R");  % right down
  46. setkey ("mouse_set_point_close",    "^[^@U^R");  % right up
  47. setkey ("mouse_null",            "^[^@U^M");  % middle up
  48.  
  49. define mouse_null ();
  50.  
  51. % loop through windows moving the point to the mouse point
  52. % if same_window is false, and mouse is on status line, call status_fun
  53. % if use_status_fun is non-zero.
  54. define mouse_point_mouse (force, same_window, push, use_status_fun, status_fun)
  55. {
  56.    variable n = nwindows ();
  57.    variable top, bot, dy, col, want_col;
  58.    
  59.    while (n)
  60.      {
  61.         top = window_info('t');
  62.     bot = window_info('r') + top;
  63.     if ((MOUSE_Y >= top) and (MOUSE_Y < bot))
  64.              { 
  65.          if (push) call("set_mark_cmd");
  66.          dy = MOUSE_Y - (top - 1 + window_line());
  67.          if (dy > 0) 
  68.            {       
  69.                 dy -= down(dy);
  70.                eol();
  71.                 if (force) loop (dy) newline();
  72.            }                                                   
  73.          else go_up(- dy);
  74.          
  75.          eol();
  76.          col = what_column ();
  77.                 want_col = window_info('c') + MOUSE_X - 1;
  78.          !if (force or (want_col <= col)) want_col = col;
  79.          goto_column_best_try(want_col); pop();
  80.          return 1;
  81.       }
  82.     
  83.     if (same_window) 
  84.       {
  85.          if (push) call("set_mark_cmd");
  86.                 if (MOUSE_Y >= bot)
  87.                   {
  88.                       go_down(MOUSE_Y - bot);
  89.                   }
  90.                 else
  91.                   {
  92.                  go_up(top - MOUSE_Y);
  93.                   }
  94.          x_warp_pointer ();
  95.                return 1;
  96.             }
  97.     
  98.           if ((bot == MOUSE_Y) and (use_status_fun)) 
  99.       {
  100.          status_fun ();
  101.          return 0;
  102.       }
  103.     
  104.     otherwindow();
  105.     n--;
  106.      }
  107.    error ("Mouse not in a window.");
  108. }
  109.       
  110. variable Mouse_Drag_Mode = 0;
  111. variable Mouse_Buffer = " *Mouse buffer*";
  112. variable Mouse_Delete_Region = 0;
  113. define copy_kill_to_mouse_buffer ()
  114. {
  115.    variable cbuf = whatbuf ();
  116.    variable pnt, n;
  117.    % 
  118.    % We are not going to copy to the pastebuffer if the region is nil
  119.    %
  120.    n = whatline(); pnt = POINT; 
  121.    push_spot();
  122.    pop_mark(1);
  123.    if ((whatline() == n) and (POINT == pnt)) 
  124.      {
  125.     pop_spot();
  126.     return;
  127.      }
  128.    push_mark();
  129.    pop_spot();
  130.    
  131.    setbuf(Mouse_Buffer);
  132.    erase_buffer ();
  133.    setbuf (cbuf);
  134.    
  135.    if (Mouse_Delete_Region) pop(dupmark());
  136.    dupmark();  pop();               %/* for cut buffer */
  137.    x_copy_region_to_cutbuffer ();
  138.    copy_region(Mouse_Buffer);
  139.    if (Mouse_Delete_Region) 
  140.      {
  141.     Mouse_Delete_Region = 0;
  142.     del_region();
  143.      }
  144.    message ("region copied.");
  145. }
  146.  
  147.  
  148. define mouse_next_buffer ()
  149. {
  150.    variable n, buf, cbuf = whatbuf ();
  151.    
  152.    n = buffer_list ();               %/* buffers on stack */
  153.    loop (n)
  154.      {
  155.     =buf;
  156.     n--;
  157.     if (buf[0] == ' ') continue;
  158.     if (buffer_visible (buf)) continue;
  159.     sw2buf (buf);
  160.     loop (n) pop ();
  161.     return;
  162.      }
  163.    error ("All buffers are visible.");
  164. }
  165.  
  166.     
  167.  
  168.  
  169. define mouse_set_point_open ()
  170. {
  171.    Mouse_Drag_Mode = 0;
  172.    mouse_point_mouse (0, 0, 0, 1, &mouse_next_buffer); pop ();
  173. }
  174.  
  175. define mouse_set_point_close ()
  176. {
  177.    if (Mouse_Drag_Mode) 
  178.      {
  179.     copy_kill_to_mouse_buffer ();
  180.     Mouse_Drag_Mode = 0;
  181.      }
  182.    else if (MOUSE_BUTTON == 3)
  183.      {
  184.     dupmark(); pop();
  185.     copy_kill_to_mouse_buffer ();
  186.     pop_mark(1);
  187.      }
  188. }
  189.  
  190. define mouse_yank_from_jed ()
  191. {
  192.    mouse_point_mouse (0, 0, 0, 0, 0); pop ();
  193.    if (bufferp(Mouse_Buffer)) insbuf(Mouse_Buffer);
  194. }
  195.  
  196. define mouse_yank_cutbuffer ()
  197. {
  198.    if (mouse_point_mouse (0, 0, 0, 1, &splitwindow))
  199.      {
  200.     x_insert_cutbuffer (); pop();
  201.     return;
  202.      }
  203. }
  204.  
  205. define delete_window ()
  206. {
  207.    call("delete_window");
  208. }
  209.  
  210. define mouse_mark_and_copy ()
  211. {
  212.    Mouse_Drag_Mode = 0;
  213.    mouse_point_mouse (0, 0, 1, 1, &delete_window); pop ();
  214. }
  215.  
  216.    
  217. define mouse_drag ()
  218. {
  219.    !if (Mouse_Drag_Mode)
  220.      {
  221.     call ("set_mark_cmd");
  222.     Mouse_Drag_Mode = 1;
  223.      }
  224.    mouse_point_mouse (0, 1, 0, 0, 0); pop ();
  225.    update (not(input_pending(0)));
  226. }
  227.  
  228.    
  229. define mouse_kill_region ()
  230. {
  231.    Mouse_Delete_Region = 1;
  232.    mouse_mark_and_copy (0, 0, 1); 
  233. }
  234.  
  235.  
  236. define mouse_split_window ()
  237. {
  238.    mouse_point_mouse (0, 0, 0, 0, 0); pop ();
  239.    splitwindow();
  240. }
  241.  
  242. define mouse_delete_window ()
  243. {
  244.    mouse_point_mouse (0, 0, 0, 0, 0); pop ();
  245.    delete_window ();
  246. }
  247.  
  248.    
  249.