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: Sat, 22 Jul 2023 17:28:34 +0200 Message-ID: <5699684.DvuYhMxLoT@anduin> References: <2255158.iZASKD2KPV@silef> <5697547.DvuYhMxLoT@anduin> <83mszo85yv.fsf@gnu.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="nextPart5960159.lOV4Wx5bFT" Content-Transfer-Encoding: 7Bit Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="17016"; mail-complaints-to="usenet@ciao.gmane.io" Cc: luangruo@yahoo.com, emacs-devel@gnu.org To: Eli Zaretskii Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Sat Jul 22 17:29: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 1qNEXm-0004DQ-Fk for ged-emacs-devel@m.gmane-mx.org; Sat, 22 Jul 2023 17:29:18 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qNEXB-0005ZV-JR; Sat, 22 Jul 2023 11:28:41 -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 1qNEXA-0005ZM-M7 for emacs-devel@gnu.org; Sat, 22 Jul 2023 11:28:40 -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 1qNEX8-0002zV-Di; Sat, 22 Jul 2023 11:28:40 -0400 Original-Received: from localhost (localhost [127.0.0.1]) by mail.ucw.sh (Postfix) with ESMTP id 950859DC5A; Sat, 22 Jul 2023 17:28:35 +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 q45fHAUcbBqy; Sat, 22 Jul 2023 17:28:34 +0200 (CEST) Original-Received: from anduin.localnet (p200300d2973a7589d8aa0020bac588c6.dip0.t-ipconnect.de [IPv6:2003:d2:973a:7589:d8aa:20:bac5:88c6]) (Authenticated sender: mm@ucw.sh) by mail.ucw.sh (Postfix) with ESMTPSA; Sat, 22 Jul 2023 17:28:34 +0200 (CEST) In-Reply-To: <83mszo85yv.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:308020 Archived-At: This is a multi-part message in MIME format. --nextPart5960159.lOV4Wx5bFT Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" On Saturday 22 July 2023 14:51:20 CEST Eli Zaretskii wrote: > > From: Moritz Maxeiner > > Cc: emacs-devel@gnu.org > > Date: Sat, 22 Jul 2023 12:07:27 +0200 > > > > On Saturday 22 July 2023 07:41:53 CEST Eli Zaretskii wrote: > > > > From: Po Lu > > > > Cc: Eli Zaretskii , emacs-devel@gnu.org > > > > Date: Sat, 22 Jul 2023 07:57:53 +0800 > > > > > > > > Moritz Maxeiner writes: > > > > > +This new option defaults to off. > > > > > > > > I think this sentence is redundant. > > > > > > It isn't. But a better wording would be > > > > > > By default this is disabled. > > > > Done. Though I am concerned that capitalizing "x coordinate" to "X > > coordinate" will lead to confusion, as capitalized X seems to usually > > refer to the X window system within NEWS. In this instance, it's not > > supposed to be referring to that, instead it's referring to the x of the > > (x,y) coordinate pair. > > Thanks. So now, to make it ready to go, please produce the patch in > the "git format-patch" format, or at least add to the patch a > ChangeLog-style commit log message describing the changes with their > file names and function names. You can find the instructions for that > in CONTRIBUTE, and a lot of examples in "git log". Sure, I hope the attached patch meets the requirements. I wasn't 100% on some of the rules so I tried emulating what I saw in git log. --nextPart5960159.lOV4Wx5bFT Content-Disposition: attachment; filename="0001-Implement-new-option-mouse-prefer-closest-glyph.patch" Content-Transfer-Encoding: 7Bit Content-Type: text/x-patch; charset="utf-8"; name="0001-Implement-new-option-mouse-prefer-closest-glyph.patch" >From f4efae2e7a089a784cd074080fcd211e0ca9ddb5 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Sat, 22 Jul 2023 16:55:07 +0200 Subject: [PATCH] Implement new option mouse-prefer-closest-glyph * doc/lispref/commands.texi (Accessing Mouse): Update documentation to say what the new option does when enabled. * etc/NEWS: Announce the new option. * lisp/cus-start.el (standard): New user custom `mouse-prefer-closest-glyph'. * src/dispnew.c (mouse_prefer_closest_glyph): New global variable. (buffer_posn_from_coords): * src/xdispc.c (remember_mouse_glyph): Respect `mouse_prefer_closest_glyph'. (mouse_fine_grained_tracking): Update documentation to include `mouse_prefer_closest_glyph' effects. --- doc/lispref/commands.texi | 10 ++++++++++ etc/NEWS | 11 +++++++++++ lisp/cus-start.el | 1 + src/dispnew.c | 18 ++++++++++++++++++ src/xdisp.c | 17 ++++++++++++++++- 5 files changed, 56 insertions(+), 1 deletion(-) 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..3c127aa9bd7 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. +By default this is disabled. + ** 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, -- 2.41.0 --nextPart5960159.lOV4Wx5bFT--