From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Moritz Maxeiner Newsgroups: gmane.emacs.devel Subject: Re: Moving point after character when clicking latter half of it Date: Fri, 21 Jul 2023 21:04:40 +0200 Message-ID: <4848824.31r3eYUQgx@anduin> References: <2255158.iZASKD2KPV@silef> <3242369.aeNJFYEL58@anduin> <835y6o5hav.fsf@gnu.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="nextPart4501105.LvFx2qVVIh" Content-Transfer-Encoding: 7Bit Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="5594"; mail-complaints-to="usenet@ciao.gmane.io" Cc: emacs-devel@gnu.org To: Eli Zaretskii , luangruo@yahoo.com Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Fri Jul 21 21:05:18 2023 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qMvRF-0001C4-DA for ged-emacs-devel@m.gmane-mx.org; Fri, 21 Jul 2023 21:05:17 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qMvQq-0004xv-0U; Fri, 21 Jul 2023 15:04:52 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qMvQo-0004xh-HP for emacs-devel@gnu.org; Fri, 21 Jul 2023 15:04:50 -0400 Original-Received: from nephos.ucw.sh ([138.201.61.214] helo=mail.ucw.sh) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qMvQm-0007zs-9Z; Fri, 21 Jul 2023 15:04:50 -0400 Original-Received: from localhost (localhost [127.0.0.1]) by mail.ucw.sh (Postfix) with ESMTP id 9D3B49D785; Fri, 21 Jul 2023 21:04:41 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at mail.ucw.sh Original-Received: from mail.ucw.sh ([127.0.0.1]) by localhost (mail.ucw.sh [127.0.0.1]) (amavisd-new, port 10025) with ESMTP id LO-q8FG9GxWE; Fri, 21 Jul 2023 21:04:40 +0200 (CEST) Original-Received: from anduin.localnet (p200300d2974533e7a317027c38435a16.dip0.t-ipconnect.de [IPv6:2003:d2:9745:33e7:a317:27c:3843:5a16]) (Authenticated sender: mm@ucw.sh) by mail.ucw.sh (Postfix) with ESMTPSA; Fri, 21 Jul 2023 21:04:40 +0200 (CEST) In-Reply-To: <835y6o5hav.fsf@gnu.org> Received-SPF: pass client-ip=138.201.61.214; envelope-from=mm@ucw.sh; helo=mail.ucw.sh X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.devel:308003 Archived-At: This is a multi-part message in MIME format. --nextPart4501105.LvFx2qVVIh Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" On Thursday 13 July 2023 10:47:36 CEST Eli Zaretskii wrote: > > From: Moritz Maxeiner > > Cc: emacs-devel@gnu.org > > Date: Wed, 12 Jul 2023 21:58:44 +0200 > > > > +@defvar mouse-prefer-closest-glyph > > This is a user option, so please use @defopt, not @defvar. > > Also, please use some smaller (preferably, default) value for > fill-column, as the text you posted uses too long lines. > > > +If you set this variable to non-@code{nil}, whenever you click or drag > > the mouse, +instead of the point being always set in front of the clicked > > glyph, the point +horizontally closest to the mouse position will be > > used. > > +So if you click in the left half of a glyph, point is set in front of it, > > +but if you click in the right half, point is set after it. > > There's too much of passive voice here. I think the alternative > wording proposed by Po Lu is better. > > > ++++ > > +** New user option 'mouse-prefer-closest-glyph'. > > +When enabled, clicking or dragging with the mouse will put the point > > +in front of the glyph with the closest x coordinate to the mouse pointer. > > ^^^^^^^^^^^^^^^^^^^^ > "to the click or start of the drag" > > > +In other words, if the mouse pointer is in the right half of a glyph, > > +point will be put after that glyph, while if the mouse pointer is in the > > +left half of a glyph, point will be put in front of that glyph. > > Point is buffer position, whereas "glyph" is something on display. So > this should say something like "point will be put after the buffer > position corresponding to that glyph". > > Also, please state explicitly that the default of this feature is OFF. > > I understand that the details of the code are still under discussion, > but I thought I'd post these comments anyway. > > Thanks. Thank you both for your continued feedback. I haven't had time to work on this in a bit, but I think the patch now includes all your latest suggestions (sorry if I overlooked something). --nextPart4501105.LvFx2qVVIh Content-Disposition: attachment; filename="emacs-29-move_it_in_display_line_to-nextglyphafterhalf-poc-0.7.patch" Content-Transfer-Encoding: 7Bit Content-Type: text/x-patch; charset="utf-8"; name="emacs-29-move_it_in_display_line_to-nextglyphafterhalf-poc-0.7.patch" diff --git a/doc/lispref/commands.texi b/doc/lispref/commands.texi index cd1745614eb..d1b8f9c494c 100644 --- a/doc/lispref/commands.texi +++ b/doc/lispref/commands.texi @@ -2751,6 +2751,16 @@ If @var{whole} is non-@code{nil}, the @var{x} coordinate is relative to the entire window area including scroll bars, margins and fringes. @end defun +@defopt mouse-prefer-closest-glyph +If this variable is non-@code{nil}, the @code{posn-point} of a mouse +position list will be set to the position of the glyph whose left most +position is closest to the mouse pointer, as opposed to the position of +the glyph underneath the mouse pointer itself. For example, if +@code{posn-at-x-y} is called with @var{x} set to @code{9}, which is +contained within a character of width 10 positioned at column 0, the +point saved within the mouse position list will be after that character. +@end defopt + @node Accessing Scroll @subsection Accessing Scroll Bar Events @cindex scroll bar events, data in diff --git a/etc/NEWS b/etc/NEWS index 9e6f0c16bcd..348152cb7be 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -952,6 +952,17 @@ wheel reports. Unlike 'pixel-scroll-mode', this mode scrolls the display pixel-by-pixel, as opposed to only animating line-by-line scrolls. ++++ +** New user option 'mouse-prefer-closest-glyph'. +When enabled, clicking or dragging with the mouse will put the point +in front of the buffer position corresponding to the glyph with the +closest x coordinate to the click or start of the drag. +In other words, if the mouse pointer is in the right half of a glyph, +point will be put after the buffer position corresponding to that glyph, +whereas if the mouse pointer is in the left half of a glyph, point +will be put in front the buffer position corresponding to that glyph. +This new option defaults to off. + ** Terminal Emacs --- diff --git a/lisp/cus-start.el b/lisp/cus-start.el index 054683d7cf6..2ed904f178f 100644 --- a/lisp/cus-start.el +++ b/lisp/cus-start.el @@ -231,6 +231,7 @@ Leaving \"Default\" unchecked is equivalent with specifying a default of (inverse-video display boolean) (visible-bell display boolean) (no-redraw-on-reenter display boolean) + (mouse-prefer-closest-glyph display boolean) ;; doc.c (text-quoting-style display diff --git a/src/dispnew.c b/src/dispnew.c index 65d9cf9b4e1..143dda412e9 100644 --- a/src/dispnew.c +++ b/src/dispnew.c @@ -5611,6 +5611,15 @@ buffer_posn_from_coords (struct window *w, int *x, int *y, struct display_pos *p argument is ZV to prevent move_it_in_display_line from matching based on buffer positions. */ move_it_in_display_line (&it, ZV, to_x, MOVE_TO_X); + if (mouse_prefer_closest_glyph) + { + int next_x = it.current_x + it.pixel_width; + int before_dx = to_x - it.current_x; + int after_dx = next_x - to_x; + if (before_dx > after_dx) + move_it_in_display_line (&it, ZV, next_x, MOVE_TO_X); + } + bidi_unshelve_cache (itdata, 0); Fset_buffer (old_current_buffer); @@ -6788,6 +6797,15 @@ predicates which report frame's specific UI-related capabilities. */); DEFVAR_BOOL ("cursor-in-echo-area", cursor_in_echo_area, doc: /* Non-nil means put cursor in minibuffer, at end of any message there. */); + DEFVAR_BOOL ("mouse-prefer-closest-glyph", mouse_prefer_closest_glyph, + doc: /* Non-nil means mouse position lists are reported relative +to the glyph closest to their coordinates. + + When non-nil, mouse position lists will be reported with their +`posn-point' set to the position of the glyph closest to the mouse +pointer, instead of the glyph immediately under. */); + mouse_prefer_closest_glyph = false; + DEFVAR_LISP ("glyph-table", Vglyph_table, doc: /* Table defining how to output a glyph code to the frame. If not nil, this is a vector indexed by glyph code to define the glyph. diff --git a/src/xdisp.c b/src/xdisp.c index 763af7d3bc8..1d71bb02641 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -2723,6 +2723,7 @@ remember_mouse_glyph (struct frame *f, int gx, int gy, NativeRectangle *rect) enum window_part part; enum glyph_row_area area; int x, y, width, height; + int original_gx; if (mouse_fine_grained_tracking) { @@ -2733,6 +2734,8 @@ remember_mouse_glyph (struct frame *f, int gx, int gy, NativeRectangle *rect) /* Try to determine frame pixel position and size of the glyph under frame pixel coordinates X/Y on frame F. */ + original_gx = gx; + if (window_resize_pixelwise) { width = height = 1; @@ -2948,6 +2951,15 @@ remember_mouse_glyph (struct frame *f, int gx, int gy, NativeRectangle *rect) gy += WINDOW_TOP_EDGE_Y (w); store_rect: + if (mouse_prefer_closest_glyph) + { + int half_width = width / 2; + width = half_width; + + int bisection = gx + half_width; + if (original_gx > bisection) + gx = bisection; + } STORE_NATIVE_RECT (*rect, gx, gy, width, height); /* Visible feedback for debugging. */ @@ -37345,7 +37357,10 @@ may be more familiar to users. */); DEFVAR_BOOL ("mouse-fine-grained-tracking", mouse_fine_grained_tracking, doc: /* Non-nil for pixel-wise mouse-movement. When nil, mouse-movement events will not be generated as long as the -mouse stays within the extent of a single glyph (except for images). */); +mouse stays within the extent of a single glyph (except for images). +When nil and mouse-prefer-closest-glyph is non-nil, mouse-movement +events will instead not be generated as long as the mouse stays within +the extent of a single left/right half glyph (except for images). */); mouse_fine_grained_tracking = false; DEFVAR_BOOL ("tab-bar--dragging-in-progress", tab_bar__dragging_in_progress, --nextPart4501105.LvFx2qVVIh--