emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

feature/android 53023eba94b: Merge remote-tracking branch 'origin/master


From: Po Lu
Subject: feature/android 53023eba94b: Merge remote-tracking branch 'origin/master' into feature/android
Date: Mon, 17 Jul 2023 08:44:32 -0400 (EDT)

branch: feature/android
commit 53023eba94bd159b3f327ac6216c3463f59c2d7a
Merge: 85e39e86b0b ac566bcdee3
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Merge remote-tracking branch 'origin/master' into feature/android
---
 doc/misc/eshell.texi |  2 ++
 lisp/files.el        |  2 ++
 lisp/net/dns.el      |  2 +-
 src/window.h         | 11 +++++++++--
 src/xdisp.c          |  5 +++--
 src/xfns.c           | 42 ++++++++++++++++++++++++++++++++----------
 src/xterm.c          | 30 ++++++++++++++++++++++++++----
 7 files changed, 75 insertions(+), 19 deletions(-)

diff --git a/doc/misc/eshell.texi b/doc/misc/eshell.texi
index 099bf3e9809..9b9268ae4ea 100644
--- a/doc/misc/eshell.texi
+++ b/doc/misc/eshell.texi
@@ -1092,6 +1092,8 @@ the alias.  This lets you selectively use an alias's 
arguments, so
 @kbd{alias mcd 'mkdir $1 && cd $1'} would cause @kbd{mcd foo} to
 create and switch to a directory called @samp{foo}.
 
+@end table
+
 @node Remote Access
 @section Remote Access
 @cmindex remote access
diff --git a/lisp/files.el b/lisp/files.el
index 2f9456e6605..572913e95ee 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -2094,6 +2094,8 @@ Emacs treats buffers whose names begin with a space as 
internal buffers.
 To avoid confusion when visiting a file whose name begins with a space,
 this function prepends a \"|\" to the final result if necessary."
   (let* ((lastname (file-name-nondirectory (directory-file-name filename)))
+         (lastname (if (string= lastname "") ; FILENAME is a root directory
+                       filename lastname))
          (lastname (cond
                     ((not (and uniquify-trailing-separator-p
                                (file-directory-p filename)))
diff --git a/lisp/net/dns.el b/lisp/net/dns.el
index 1e320a2124a..42e7fb415d3 100644
--- a/lisp/net/dns.el
+++ b/lisp/net/dns.el
@@ -212,7 +212,7 @@ If TCP-P, the first two bytes of the packet will be the 
length field."
                 spec))
         (push (list 'authoritative-p (if (zerop (logand byte (ash 1 2)))
                                          nil t)) spec)
-        (push (list 'truncated-p (if (zerop (logand byte (ash 1 2))) nil t))
+        (push (list 'truncated-p (if (zerop (logand byte (ash 1 1))) nil t))
               spec)
         (push (list 'recursion-desired-p
                     (if (zerop (logand byte (ash 1 0))) nil t)) spec))
diff --git a/src/window.h b/src/window.h
index 5a620c958de..2a86d27d1d4 100644
--- a/src/window.h
+++ b/src/window.h
@@ -1133,9 +1133,11 @@ void set_window_buffer (Lisp_Object window, Lisp_Object 
buffer,
 
 extern Lisp_Object echo_area_window;
 
-/* Non-zero if we should redraw the mode lines on the next redisplay.
+/* Non-zero if we should redraw the mode line*s* on the next redisplay.
    Usually set to a unique small integer so we can track the main causes of
-   full redisplays in `redisplay--mode-lines-cause'.  */
+   full redisplays in `redisplay--mode-lines-cause'.
+   Here "mode lines" includes other elements not coming from the buffer's
+   text, such as header-lines, tab lines, frame names, menu-bars, ....  */
 
 extern int update_mode_lines;
 
@@ -1153,6 +1155,11 @@ extern int windows_or_buffers_changed;
 extern void wset_redisplay (struct window *w);
 extern void fset_redisplay (struct frame *f);
 extern void bset_redisplay (struct buffer *b);
+
+/* Routines to indicate that the mode-lines might need to be redisplayed.
+   Just as for `update_mode_lines`, this includes other elements not coming
+   from the buffer's text, such as header-lines, tab lines, frame names,
+   menu-bars, ....   */
 extern void bset_update_mode_line (struct buffer *b);
 extern void wset_update_mode_line (struct window *w);
 /* Call this to tell redisplay to look for other windows than selected-window
diff --git a/src/xdisp.c b/src/xdisp.c
index d09116b3fb5..79689e6cae1 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -16610,8 +16610,9 @@ redisplay_internal (void)
   enum {MAX_GARBAGED_FRAME_RETRIES = 2 };
   int garbaged_frame_retries = 0;
 
-  /* True means redisplay has to consider all windows on all
-     frames.  False, only selected_window is considered.  */
+  /* False means that only the selected_window needs to be updated.
+     True means that other windows may need to be updated as well,
+     so we need to consult `needs_no_update` for all windows.  */
   bool consider_all_windows_p;
 
   /* True means redisplay has to redisplay the miniwindow.  */
diff --git a/src/xfns.c b/src/xfns.c
index 12aef228c3a..704f7a3f892 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -4036,7 +4036,7 @@ setup_xi_event_mask (struct frame *f)
   selected->mask = ((unsigned char *) selected) + sizeof *selected;
   selected->mask_len = l;
   selected->deviceid = XIAllMasterDevices;
-#endif
+#endif /* !HAVE_XINPUT2_1 */
 
   mask.mask = m = alloca (l);
   memset (m, 0, l);
@@ -4056,7 +4056,19 @@ setup_xi_event_mask (struct frame *f)
   XISetMask (m, XI_FocusOut);
   XISetMask (m, XI_KeyPress);
   XISetMask (m, XI_KeyRelease);
-#endif
+#endif /* !USE_GTK */
+#if defined HAVE_XINPUT2_4
+  if (FRAME_DISPLAY_INFO (f)->xi2_version >= 4)
+    {
+      /* Select for gesture events.  Since this configuration doesn't
+        use GTK 3, Emacs is the only code that can change the XI
+        event mask, and can safely select for gesture events on
+        master pointers only.  */
+      XISetMask (m, XI_GesturePinchBegin);
+      XISetMask (m, XI_GesturePinchUpdate);
+      XISetMask (m, XI_GesturePinchEnd);
+    }
+#endif /* HAVE_XINPUT2_4 */
   XISelectEvents (FRAME_X_DISPLAY (f),
                  FRAME_X_WINDOW (f),
                  &mask, 1);
@@ -4065,7 +4077,7 @@ setup_xi_event_mask (struct frame *f)
      to get the event mask from the X server.  */
 #ifndef HAVE_XINPUT2_1
   memcpy (selected->mask, m, l);
-#endif
+#endif /* !HAVE_XINPUT2_1 */
 
   memset (m, 0, l);
 #endif /* !HAVE_GTK3 */
@@ -4080,35 +4092,45 @@ setup_xi_event_mask (struct frame *f)
                  FRAME_OUTER_WINDOW (f),
                  &mask, 1);
   memset (m, 0, l);
-#endif
+#endif /* USE_X_TOOLKIT */
 
 #ifdef HAVE_XINPUT2_2
   if (FRAME_DISPLAY_INFO (f)->xi2_version >= 2)
     {
+      /* Select for touch events from all devices.
+
+         Emacs will only process touch events originating
+         from slave devices, as master pointers may also
+         represent dependent touch devices.  */
       mask.deviceid = XIAllDevices;
 
       XISetMask (m, XI_TouchBegin);
       XISetMask (m, XI_TouchUpdate);
       XISetMask (m, XI_TouchEnd);
-#ifdef HAVE_XINPUT2_4
+
+#if defined HAVE_XINPUT2_4 && defined USE_GTK3
       if (FRAME_DISPLAY_INFO (f)->xi2_version >= 4)
        {
+         /* Now select for gesture events from all pointer devices.
+            Emacs will only handle gesture events from the master
+            pointer, but cannot afford to overwrite the event mask
+            set by GDK.  */
+
          XISetMask (m, XI_GesturePinchBegin);
          XISetMask (m, XI_GesturePinchUpdate);
          XISetMask (m, XI_GesturePinchEnd);
        }
-#endif
+#endif /* HAVE_XINPUT2_4 && USE_GTK3 */
 
-      XISelectEvents (FRAME_X_DISPLAY (f),
-                     FRAME_X_WINDOW (f),
+      XISelectEvents (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
                      &mask, 1);
     }
-#endif
+#endif /* HAVE_XINPUT2_2 */
 
 #ifndef HAVE_XINPUT2_1
   FRAME_X_OUTPUT (f)->xi_masks = selected;
   FRAME_X_OUTPUT (f)->num_xi_masks = 1;
-#endif
+#endif /* HAVE_XINPUT2_1 */
 
   unblock_input ();
 }
diff --git a/src/xterm.c b/src/xterm.c
index 5e2d7c05c26..75e5b07f2c0 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -24295,7 +24295,13 @@ handle_one_xevent (struct x_display_info *dpyinfo,
              x_display_set_last_user_time (dpyinfo, xev->time,
                                            xev->send_event, true);
 
-             if (!device)
+             /* Don't process touch sequences from this device if
+                it's a master pointer.  Touch sequences aren't
+                canceled by the X server if a slave device is
+                detached, and master pointers may also represent
+                dependent touch devices.  */
+
+             if (!device || device->use == XIMasterPointer)
                goto XI_OTHER;
 
              if (xi_find_touch_point (device, xev->detail))
@@ -24463,12 +24469,22 @@ handle_one_xevent (struct x_display_info *dpyinfo,
              x_display_set_last_user_time (dpyinfo, xev->time,
                                            xev->send_event, true);
 
+             /* Don't process touch sequences from this device if
+                it's a master pointer.  Touch sequences aren't
+                canceled by the X server if a slave device is
+                detached, and master pointers may also represent
+                dependent touch devices.  */
+
              if (!device)
                goto XI_OTHER;
 
              touchpoint = xi_find_touch_point (device, xev->detail);
 
-             if (!touchpoint)
+             if (!touchpoint
+                 /* Don't send this event if nothing has changed
+                    either.  */
+                 || (touchpoint->x == (int) xev->event_x
+                     && touchpoint->y == (int) xev->event_y))
                goto XI_OTHER;
 
              touchpoint->x = xev->event_x;
@@ -24511,7 +24527,13 @@ handle_one_xevent (struct x_display_info *dpyinfo,
              x_display_set_last_user_time (dpyinfo, xev->time,
                                            xev->send_event, true);
 
-             if (!device)
+             /* Don't process touch sequences from this device if
+                it's a master pointer.  Touch sequences aren't
+                canceled by the X server if a slave device is
+                detached, and master pointers may also represent
+                dependent touch devices.  */
+
+             if (!device || device->use == XIMasterPointer)
                goto XI_OTHER;
 
              unlinked_p = xi_unlink_touch_point (xev->detail, device);
@@ -24579,7 +24601,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
              x_display_set_last_user_time (dpyinfo, pev->time,
                                            pev->send_event, true);
 
-             if (!device)
+             if (!device || device->use != XIMasterPointer)
                goto XI_OTHER;
 
 #ifdef HAVE_XWIDGETS



reply via email to

[Prev in Thread] Current Thread [Next in Thread]