HEX
Server: Apache
System: Linux pdx1-shared-a1-38 6.6.104-grsec-jammy+ #3 SMP Tue Sep 16 00:28:11 UTC 2025 x86_64
User: mmickelson (3396398)
PHP: 8.1.31
Disabled: NONE
Upload Files
File: //usr/share/jed/lib/mouse.sl
unsetkey ("\e^@");
setkey ("mouse_cmd", "\e^@");

custom_variable ("Mouse_Wheel_Scroll_Lines", 3);

%!%+
%\variable{Mouse_Selection_Word_Chars}
%\synopsis{Characters that delimit double-click selections}
%\usage{String_Type Mouse_Selection_Word_Chars}
%\description
% The value of this variable represents a set of characters that serve
% to delimit double-click selections.  The default value of this
% variable is
%#v+
%    Mouse_Selection_Word_Chars = "^ \n\"%&'()*,;<=>?@[]^`{|}";
%#v-
% If the value of this variable is NULL, the word characters
% associated with the buffer will be used.
%\seealso{define_word}
%!%-
custom_variable ("Mouse_Selection_Word_Chars","^ \n\"%&'()*,;<=>?@[]^`{|}");

private variable Mouse_Drag_Mode = 0;
private variable Mouse_Save_Point_Mark;
private variable Mouse_Buffer = " *Mouse buffer*";
private variable Mouse_Delete_Region = 0;

define mouse_goto_position (col, line)
{
   goto_line (line);
   () = goto_column_best_try (col);
}

define mouse_yank_from_jed ()
{
   if (bufferp(Mouse_Buffer))
     insbuf(Mouse_Buffer);
}

define copy_kill_to_mouse_buffer ()
{
   variable cbuf = whatbuf ();
   variable pnt, n;
   %
   % We are not going to copy to the pastebuffer if the region is nil
   %
   n = what_line(); pnt = _get_point ();
   push_spot();
   pop_mark_1 ();
   if ((what_line() == n) and (_get_point () == pnt))
     {
	pop_spot();
	return;
     }
   push_mark();
   pop_spot();

   setbuf(Mouse_Buffer);
   erase_buffer ();
   setbuf (cbuf);

   if (Mouse_Delete_Region)
     () = dupmark();
   () = dupmark();		       %/* for cut buffer */
   x_copy_region_to_selection ();
   copy_region(Mouse_Buffer);
   if (Mouse_Delete_Region)
     {
	Mouse_Delete_Region = 0;
	del_region();
     }
}

define mouse_down_hook (line, col, but, shift)
{
   variable l;
   if (but == 8)
     {
	l = window_line();
	loop (Mouse_Wheel_Scroll_Lines) skip_hidden_lines_backward (1);

	bol();
	recenter(l);
	return 0;
     }
   if (but == 16)
     {
	l = window_line();
	loop (Mouse_Wheel_Scroll_Lines) skip_hidden_lines_forward (1);
	bol();
	recenter(l);
	return 0;
     }

   if (shift == 0)
     {
	if (but == 2)
	  {
	     mouse_set_current_window ();
	     () = x_insert_selection ();
	     return 0;
	  }

	if (is_visible_mark ())
	  {
	     if (but == 1)
	       {
		  pop_mark (0);
		  return 0;
	       }

	     if (but == 4)
	       Mouse_Delete_Region = 1;

	     copy_kill_to_mouse_buffer ();
	     return 0;
	  }

	Mouse_Drag_Mode = 0;
	Mouse_Save_Point_Mark = create_user_mark ();
	mouse_goto_position (col, line);
	return 0;
     }

   if (shift == 1)
     {
	if (but == 2)
	  {
	     mouse_set_current_window ();
	     mouse_yank_from_jed ();
	     return 0;
	  }
     }

   return -1;
}

define mouse_up_hook (line, col, but, shift)
{
   if (shift == 0)
     {
	if (but == 1)
	  {
	     if (Mouse_Drag_Mode)
	       {
		  Mouse_Drag_Mode = 0;
		  copy_kill_to_mouse_buffer ();

		  if (whatbuf () == Mouse_Save_Point_Mark.buffer_name)
		    goto_user_mark (Mouse_Save_Point_Mark);

		  return 0;
	       }
	     return 1;
	  }

	if (but == 4)
	  {
	     Mouse_Drag_Mode = 0;
	     return 1;
	  }
     }

   return -1;
}

define mouse_drag_hook (line, col, but, shift)
{
   variable top, bot;
   variable y;

   ifnot (Mouse_Drag_Mode)
     {
	ifnot (is_visible_mark ())
	  {
	     push_visible_mark ();
	  }
	Mouse_Drag_Mode = 1;
     }
   mouse_goto_position (col, line);

   % only warp if pointer is outside window.
   top = window_info ('t');
   bot = top + window_info ('r');

   (,y, ) = mouse_get_event_info ();

   if ((y < top) or (y > bot))
     x_warp_pointer ();

   return 0;
}

define mouse_next_buffer ()
{
   variable n, buf, cbuf = whatbuf ();

   n = buffer_list ();		       %/* buffers on stack */
   loop (n)
     {
	buf = ();
	n--;
	if (buf[0] == ' ') continue;
	sw2buf (buf);
	loop (n) pop ();
	return;
     }
}

define mouse_status_up_hook (line, col, but, shift)
{
   if (shift == 2)
     {
	if (but == 1)
	  {
	     delbuf (whatbuf ());
	     return 0;
	  }
     }

   return -1;
}

define mouse_status_down_hook (line, col, but, shift)
{
   if (shift == 0)
     {
	if (but == 1) mouse_next_buffer ();
	else if (but == 2) splitwindow ();
	else
	  call ("delete_window");
	return 0;
     }

   if (shift == 1)
     {
	try
	  {
	     if (but == 1)
	       call ("page_down");
	     else if (but == 4)
	       call ("page_up");
	  }
	catch AnyError;
	return 0;
     }

   return -1;
}

define mouse_2click_hook (line, col, but, shift)
{
   variable word_chars = Mouse_Selection_Word_Chars;
   if (word_chars == NULL)
     word_chars = get_word_chars ();

   if (but == 1)
     {
	mouse_goto_position (col, line);
	push_spot ();
	bskip_chars (word_chars);
	push_visible_mark ();
	skip_chars (word_chars);
	update_sans_update_hook (1);
	usleep (500);

	copy_kill_to_mouse_buffer ();
	pop_spot ();
	return 0;
     }
   return -1;
}

mouse_set_default_hook ("mouse_2click", "mouse_2click_hook");
mouse_set_default_hook ("mouse_up", "mouse_up_hook");
mouse_set_default_hook ("mouse_down", "mouse_down_hook");
mouse_set_default_hook ("mouse_drag", "mouse_drag_hook");
mouse_set_default_hook ("mouse_status_down", "mouse_status_down_hook");
mouse_set_default_hook ("mouse_status_up", "mouse_status_up_hook");