File: //usr/share/jed/lib/mswmouse.sl
%
% JED mouse interface
%
% These routines assume a 2 button mouse
%
% left : set point to mouse point
% right : paste from cut buffer moving point to mouse point
% drag left : mark a region and copy it to cut buffer
% shift left : split window mouse is in
% control left : delete window mouse is in
%
% Other buttons are undefined.
%
setkey ("mouse_set_point_open", "\e^@Dl"); % left button down
setkey ("mouse_set_point_close", "\e^@Ul"); % left button up
setkey ("mouse_yank_cutbuffer", "\e^@Dm"); % middle down
setkey ("mouse_yank_cutbuffer", "\e^@Dr"); % right down
setkey ("mouse_null", "\e^@Um"); % middle up
setkey ("mouse_null", "\e^@Ur"); % right up
% dragging
setkey ("mouse_drag", "\e^@^@l"); % left dragging
setkey ("mouse_drag", "\e^@^@r"); % right dragging
setkey ("mouse_null", "\e^@^@^L"); % C-left dragging
setkey ("mouse_drag", "\e^@^@^R"); % C-right dragging
setkey ("mouse_null", "\e^@^@L"); % S-left dragging
setkey ("mouse_null", "\e^@^@R"); % S-right dragging
% shifted
setkey ("mouse_split_window", "\e^@DL"); % Shift-left button down
setkey ("mouse_null", "\e^@UL"); % left button up
setkey ("mouse_yank_from_jed", "\e^@DM"); % middle down
setkey ("mouse_yank_from_jed", "\e^@DR"); % right down
setkey ("mouse_null", "\e^@UR"); % right up
setkey ("mouse_null", "\e^@UM"); % middle up
% ctrl
setkey ("mouse_delete_window", "\e^@D^L"); % left button down
setkey ("mouse_null", "\e^@U^L"); % left button up
setkey ("mouse_null", "\e^@D^M"); % middle down
setkey ("mouse_null", "\e^@D^R"); % middle down
setkey ("mouse_null", "\e^@U^M"); % middle up
setkey ("mouse_null", "\e^@U^R"); % middle up
define mouse_null ();
% loop through windows moving the point to the mouse point
% if same_window is false, and mouse is on status line, call status_fun
% It returns zero if the status function was used, otherwise, it returns 1
define mouse_point_mouse (force, same_window, push, status_fun)
{
variable n = nwindows ();
variable top, bot, dy, col, want_col;
while (n)
{
top = window_info('t');
bot = window_info('r') + top;
if ((MOUSE_Y >= top) and (MOUSE_Y < bot))
{
if (push) push_visible_mark ();
dy = MOUSE_Y - (top - 1 + window_line());
if (dy > 0)
{
dy -= down(dy);
eol();
if (force) loop (dy) newline();
}
else go_up(- dy);
eol();
col = what_column ();
want_col = window_info('c') + MOUSE_X - 1;
ifnot (force or (want_col <= col)) want_col = col;
() = goto_column_best_try(want_col);
return 1;
}
if (same_window)
{
if (push) push_visible_mark ();
if (MOUSE_Y >= bot)
{
go_down(MOUSE_Y - bot + 1);
}
else
{
go_up(top - MOUSE_Y);
}
x_warp_pointer ();
return 1;
}
if ((bot == MOUSE_Y) and (use_status_fun != NULL))
{
@status_fun ();
return 0;
}
otherwindow();
n--;
}
error ("Mouse not in a window.");
}
variable Mouse_Drag_Mode = 0;
variable Mouse_Buffer = " *Mouse buffer*";
variable Mouse_Delete_Region = 0;
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_cutbuffer ();
copy_region(Mouse_Buffer);
if (Mouse_Delete_Region)
{
Mouse_Delete_Region = 0;
del_region();
}
message ("region copied.");
}
define mouse_next_buffer ()
{
variable n, buf, cbuf = whatbuf ();
n = buffer_list (); %/* buffers on stack */
loop (n)
{
=buf;
n--;
if (buf[0] == ' ') continue;
if (buffer_visible (buf)) continue;
sw2buf (buf);
loop (n) pop ();
return;
}
error ("All buffers are visible.");
}
custom_variable ("Mouse_Save_Point_Mode", 1);
%!%+
%\variable{Mouse_Save_Point_Mode}
%\synopsis{Mouse_Save_Point_Mode}
%\usage{Integer Mouse_Save_Point_Mode = 1;}
%\description
% If this variable is non-zero, the editing point will be restored to its
% original position when the left button is used to copy a region to the
% cutbuffer. If the variable is zero, the current point is left at the
% end of the copied region.
%!%-
private variable Mouse_Save_Point_Window;
private variable Mouse_Save_Point_Mark;
define mouse_set_point_open ()
{
Mouse_Drag_Mode = 0;
Mouse_Save_Point_Window = window_info ('t');
Mouse_Save_Point_Mark = create_user_mark ();
if (Mouse_Save_Point_Mode) Mouse_Save_Point_Mode = -1;
if (mouse_point_mouse (0, 0, 0, &mouse_next_buffer)
and Mouse_Save_Point_Mode)
{
Mouse_Save_Point_Mode = 1;
}
}
define mouse_set_point_close ()
{
if (Mouse_Drag_Mode)
{
copy_kill_to_mouse_buffer ();
Mouse_Drag_Mode = 0;
if ((MOUSE_BUTTON == 1) and (Mouse_Save_Point_Mode > 0))
{
loop (nwindows ())
{
if (window_info ('t') == Mouse_Save_Point_Window)
{
if (whatbuf () == Mouse_Save_Point_Mark.buffer_name)
goto_user_mark (Mouse_Save_Point_Mark);
break;
}
otherwindow ();
}
Mouse_Save_Point_Mode = -1;
}
}
else if (MOUSE_BUTTON == 3)
{
dupmark(); pop();
copy_kill_to_mouse_buffer ();
pop_mark_1 ();
}
}
define mouse_yank_from_jed ()
{
() = mouse_point_mouse (0, 0, 0, NULL);
if (bufferp(Mouse_Buffer)) insbuf(Mouse_Buffer);
}
define mouse_yank_cutbuffer ()
{
variable w = window_info ('t');
variable max_loops = nwindows ();
variable m = create_user_mark ();
if (mouse_point_mouse (0, 0, 1, &splitwindow))
{
pop_mark_1 (); % since we set it in the function call
while (max_loops and (w != window_info ('t')))
{
otherwindow ();
max_loops--;
}
if (max_loops)
{
goto_user_mark (m);
() = x_insert_cutbuffer ();
}
}
}
define delete_window ()
{
call("delete_window");
}
define mouse_mark_and_copy ()
{
Mouse_Drag_Mode = 0;
() = mouse_point_mouse (0, 0, 1, &delete_window);
}
define mouse_drag ()
{
ifnot (Mouse_Drag_Mode)
{
push_visible_mark ();
Mouse_Drag_Mode = 1;
}
() = mouse_point_mouse (0, 1, 0, NULL);
update_sans_update_hook (not(input_pending(0)));
}
define mouse_kill_region ()
{
Mouse_Delete_Region = 1;
mouse_mark_and_copy (0, 0, 1);
}
define mouse_split_window ()
{
() = mouse_point_mouse (0, 0, 0, NULL);
splitwindow();
}
define mouse_delete_window ()
{
() = mouse_point_mouse (0, 0, 0, NULL);
delete_window ();
}