[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#48409: Text runs away before user can copy it
From: |
Alan Mackenzie |
Subject: |
bug#48409: Text runs away before user can copy it |
Date: |
Fri, 21 May 2021 20:55:27 +0000 |
Hello, Martin.
On Thu, May 20, 2021 at 18:54:45 +0200, martin rudalics wrote:
> > For clicks into the bottom line the attached might help. Clicks above
> > must be caught elsewhere. But you don't get a drag event and no error
> > message for them.
> The attached patch should allow clicking anywhere in the minibuffer
> window. Its more than kludgy but this is a bug that has annoyed me
> for years.
I've been laboriously working out a patch, too, and have come up with
the one below. It takes a surprisingly similar approach to your own
patch [snipped], but doesn't test for a minibuffer, so perhaps is more
general. I didn't actually study your patch till my own was nearly
finished.
To detect mouse movement, my patch changes from comparing window
relative x, y to frame relative x, y. If the code detects no movement,
but a different window, the position of the up event is changed to be
inside the window of the down event.
diff --git a/src/keyboard.c b/src/keyboard.c
index 47b5e59024..08386e0685 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -5022,6 +5022,10 @@ static short const internal_border_parts[] = {
static Lisp_Object button_down_location;
+/* A cons recording the original frame-relative x and y coordinates of
+ the down mouse event. */
+static Lisp_Object frame_relative_event_pos;
+
/* Information about the most recent up-going button event: Which
button, what location, and what time. */
@@ -5673,6 +5677,7 @@ make_lispy_event (struct input_event *event)
double_click_count = 1;
button_down_time = event->timestamp;
*start_pos_ptr = Fcopy_alist (position);
+ frame_relative_event_pos = Fcons (event->x, event->y);
ignore_mouse_drag_p = false;
}
@@ -5695,20 +5700,12 @@ make_lispy_event (struct input_event *event)
ignore_mouse_drag_p = false;
else
{
- Lisp_Object new_down, down;
intmax_t xdiff = double_click_fuzz, ydiff = double_click_fuzz;
- /* The third element of every position
- should be the (x,y) pair. */
- down = Fcar (Fcdr (Fcdr (start_pos)));
- new_down = Fcar (Fcdr (Fcdr (position)));
-
- if (CONSP (down)
- && FIXNUMP (XCAR (down)) && FIXNUMP (XCDR (down)))
- {
- xdiff = XFIXNUM (XCAR (new_down)) - XFIXNUM (XCAR (down));
- ydiff = XFIXNUM (XCDR (new_down)) - XFIXNUM (XCDR (down));
- }
+ xdiff = XFIXNUM (event->x)
+ - XFIXNUM (XCAR (frame_relative_event_pos));
+ ydiff = XFIXNUM (event->y)
+ - XFIXNUM (XCDR (frame_relative_event_pos));
if (! (0 < double_click_fuzz
&& - double_click_fuzz < xdiff
@@ -5725,12 +5722,51 @@ make_lispy_event (struct input_event *event)
a click. But mouse-drag-region completely ignores
this case and it hasn't caused any real problem, so
it's probably OK to ignore it as well. */
- && EQ (Fcar (Fcdr (start_pos)), Fcar (Fcdr (position)))))
+ && (EQ (Fcar (Fcdr (start_pos)),
+ Fcar (Fcdr (position))) /* Same buffer pos */
+ || !EQ (Fcar (start_pos),
+ Fcar (position))))) /* Different window */
{
/* Mouse has moved enough. */
button_down_time = 0;
click_or_drag_modifier = drag_modifier;
}
+ else if (((!EQ (Fcar (start_pos), Fcar (position)))
+ || (!EQ (Fcar (Fcdr (start_pos)),
+ Fcar (Fcdr (position)))))
+ /* Was the down event in a window body? */
+ && FIXNUMP (Fcar (Fcdr (start_pos)))
+ && WINDOW_LIVE_P (Fcar (start_pos))
+ && Ffboundp (Qwindow_edges))
+ /* If the window (etc.) at the mouse position has
+ changed between the down event and the up event,
+ we assume there's been a redisplay between the
+ two events, and we pretend the mouse is still in
+ the old window to prevent a spurious drag event
+ being generated. */
+ {
+ Lisp_Object edges
+ = call4 (Qwindow_edges, Fcar (start_pos), Qt, Qnil, Qt);
+ int new_x = XFIXNUM (Fcar (frame_relative_event_pos));
+ int new_y = XFIXNUM (Fcdr (frame_relative_event_pos));
+
+ /* If the up-event is outside the down-event's
+ window, use coordinates that are within it. */
+ if (new_x < XFIXNUM (Fcar (edges)))
+ new_x = XFIXNUM (Fcar (edges));
+ else if (new_x >= XFIXNUM (Fcar (Fcdr (Fcdr (edges)))))
+ new_x = XFIXNUM (Fcar (Fcdr (Fcdr (edges)))) - 1;
+ if (new_y < XFIXNUM (Fcar (Fcdr (edges))))
+ new_y = XFIXNUM (Fcar (Fcdr (edges)));
+ else if (new_y
+ >= XFIXNUM (Fcar (Fcdr (Fcdr (Fcdr (edges))))))
+ new_y = XFIXNUM (Fcar (Fcdr (Fcdr (Fcdr (edges))))) - 1;
+
+ position = make_lispy_position
+ (XFRAME (event->frame_or_window),
+ make_fixnum (new_x), make_fixnum (new_y),
+ event->timestamp);
+ }
}
/* Don't check is_double; treat this as multiple if the
@@ -11649,6 +11685,7 @@ syms_of_keyboard (void)
DEFSYM (Qmake_frame_visible, "make-frame-visible");
DEFSYM (Qselect_window, "select-window");
DEFSYM (Qselection_request, "selection-request");
+ DEFSYM (Qwindow_edges, "window-edges");
{
int i;
@@ -11665,6 +11702,7 @@ syms_of_keyboard (void)
button_down_location = make_nil_vector (5);
staticpro (&button_down_location);
+ staticpro (&frame_relative_event_pos);
mouse_syms = make_nil_vector (5);
staticpro (&mouse_syms);
wheel_syms = make_nil_vector (ARRAYELTS (lispy_wheel_names));
> martin
--
Alan Mackenzie (Nuremberg, Germany).
- bug#48409: Text runs away before user can copy it, (continued)
- bug#48409: Text runs away before user can copy it, Alan Mackenzie, 2021/05/15
- bug#48409: Text runs away before user can copy it, Juri Linkov, 2021/05/17
- bug#48409: Text runs away before user can copy it, Eli Zaretskii, 2021/05/18
- bug#48409: Text runs away before user can copy it, Alan Mackenzie, 2021/05/18
- bug#48409: Text runs away before user can copy it, Eli Zaretskii, 2021/05/18
- bug#48409: Text runs away before user can copy it, Alan Mackenzie, 2021/05/18
- bug#48409: Text runs away before user can copy it, Eli Zaretskii, 2021/05/19
- bug#48409: Text runs away before user can copy it, Alan Mackenzie, 2021/05/19
- bug#48409: Text runs away before user can copy it, martin rudalics, 2021/05/19
- bug#48409: Text runs away before user can copy it, martin rudalics, 2021/05/20
- bug#48409: Text runs away before user can copy it,
Alan Mackenzie <=
- bug#48409: Text runs away before user can copy it, martin rudalics, 2021/05/22
- bug#48409: Text runs away before user can copy it, Alan Mackenzie, 2021/05/22
- bug#48409: Text runs away before user can copy it, martin rudalics, 2021/05/22
- bug#48409: Text runs away before user can copy it, Eli Zaretskii, 2021/05/22
- bug#48409: Text runs away before user can copy it, martin rudalics, 2021/05/22
- bug#48409: Text runs away before user can copy it, Alan Mackenzie, 2021/05/30
- bug#48409: Text runs away before user can copy it, martin rudalics, 2021/05/31
- bug#48409: Text runs away before user can copy it, Alan Mackenzie, 2021/05/31