all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: martin rudalics <rudalics@gmx.at>
To: Dmitry Gutov <dgutov@yandex.ru>, tumashu <tumashu@163.com>
Cc: "emacs-devel@gnu.org" <emacs-devel@gnu.org>
Subject: Re: Emacs's set-frame-size can not work well with gnome-shell?
Date: Fri, 31 Jan 2020 16:44:07 +0100	[thread overview]
Message-ID: <44010781-43f0-3bc3-06ed-475c526dee36@gmx.at> (raw)
In-Reply-To: <414ade05-1ae6-75c2-9af1-e1eee42799a0@yandex.ru>

[-- Attachment #1: Type: text/plain, Size: 1439 bytes --]

 > Considering scaling was only a problem for GTK, that doesn't sound
 > like success. Anyway, resizing normal undecorated frames in GTK seems
 > to work just as well now. Resizing child frame (with scaling on) is
 > still broken (but looks a bit different, no jumping around, at least).

Presumably resizing child frames is still broken with scaling off too.

 > With GTK build frame resizing also doesn't honor non-pixelwise
 > resizing. When frame-resize-pixelwise is nil, resizing routinely eats
 > into internal borders (right and bottom ones).

Right.  I'll attach a patch that fixes it.  Maybe we'll have to
investigate the size hints issue next.  The whole emacsgtkfixed.c stuff
(which I do not understand) troubles me considerably.  Could you try
building with GTK 2?

 >>  > - tumashu's child frame moving test scenario is still slow.
 >>  >
 >>  > E.g.
 >>  >
 >>  >    (benchmark 1 `(set-frame-position ,test-frame 50 50))
 >>  >    => 0.5s
 >>
 >> Nothing changed in this regard.  But here
 >>
 >> (benchmark 1 `(x-set-frame-size-and-position ,test-frame nil nil 50 50))
 >>
 >> => 0.100523s
 >
 > Seems like a possible improvement, but still much slower than set-frame-position with the GTK build.

Neither of these benchmarks seems meaningful in the first place.  What
would it measure?  Maybe tumashu can check with a version that uses
'x-set-frame-size-and-position' whether it's still too slow on non-GTK
builds.

martin

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: mouse+xfns.diff --]
[-- Type: text/x-patch; name="mouse+xfns.diff", Size: 41255 bytes --]

diff --git a/lisp/mouse.el b/lisp/mouse.el
index e58a2e6da1..9a0e2b28e4 100644
--- a/lisp/mouse.el
+++ b/lisp/mouse.el
@@ -552,7 +552,7 @@ mouse-drag-mode-line
              (not (eq (window-frame minibuffer-window) frame))))
       ;; Drag frame when the window is on the bottom of its frame and
       ;; there is no minibuffer window below.
-      (mouse-drag-frame start-event 'move)))))
+      (mouse-drag-frame-move start-event)))))
 
 (defun mouse-drag-header-line (start-event)
   "Change the height of a window by dragging on its header line.
@@ -569,7 +569,7 @@ mouse-drag-header-line
         (mouse-drag-line start-event 'header)
       (let ((frame (window-frame window)))
         (when (frame-parameter frame 'drag-with-header-line)
-          (mouse-drag-frame start-event 'move))))))
+          (mouse-drag-frame-move start-event))))))
 
 (defun mouse-drag-vertical-line (start-event)
   "Change the width of a window by dragging on a vertical line.
@@ -577,46 +577,7 @@ mouse-drag-vertical-line
   (interactive "e")
   (mouse-drag-line start-event 'vertical))
 \f
-(defun mouse-resize-frame (frame x-diff y-diff &optional x-move y-move)
-  "Helper function for `mouse-drag-frame'."
-  (let* ((frame-x-y (frame-position frame))
-         (frame-x (car frame-x-y))
-         (frame-y (cdr frame-x-y))
-         alist)
-    (if (> x-diff 0)
-        (when x-move
-          (setq x-diff (min x-diff frame-x))
-          (setq x-move (- frame-x x-diff)))
-      (let* ((min-width (frame-windows-min-size frame t nil t))
-             (min-diff (max 0 (- (frame-inner-width frame) min-width))))
-        (setq x-diff (max x-diff (- min-diff)))
-        (when x-move
-          (setq x-move (+ frame-x (- x-diff))))))
-
-    (if (> y-diff 0)
-        (when y-move
-          (setq y-diff (min y-diff frame-y))
-          (setq y-move (- frame-y y-diff)))
-      (let* ((min-height (frame-windows-min-size frame nil nil t))
-             (min-diff (max 0 (- (frame-inner-height frame) min-height))))
-        (setq y-diff (max y-diff (- min-diff)))
-        (when y-move
-          (setq y-move (+ frame-y (- y-diff))))))
-
-    (unless (zerop x-diff)
-      (when x-move
-        (push `(left . ,x-move) alist))
-      (push `(width . (text-pixels . ,(+ (frame-text-width frame) x-diff)))
-            alist))
-    (unless (zerop y-diff)
-      (when y-move
-        (push `(top . ,y-move) alist))
-      (push `(height . (text-pixels . ,(+ (frame-text-height frame) y-diff)))
-            alist))
-    (when alist
-      (modify-frame-parameters frame alist))))
-
-(defun mouse-drag-frame (start-event part)
+(defun mouse-drag-frame-resize (start-event part)
   "Drag a frame or one of its edges with the mouse.
 START-EVENT is the starting mouse event of the drag action.  Its
 position window denotes the frame that will be dragged.
@@ -635,9 +596,168 @@ mouse-drag-frame
          (frame (if (window-live-p window)
                     (window-frame window)
                   window))
-         (width (frame-native-width frame))
-         (height (frame-native-height frame))
-         ;; PARENT is the parent frame of FRAME or, if FRAME is a
+	 ;; Initial "first" frame position and size.  While dragging we
+	 ;; base all calculations against that size and position.
+	 (first-pos (frame-position frame))
+	 (first-left (car first-pos))
+         (x-left first-left)
+         (first-top (cdr first-pos))
+         (x-top first-top)
+	 (first-width (frame-text-width frame))
+         (x-width first-width)
+	 (first-height (frame-text-height frame))
+         (x-height first-height)
+	 ;; Don't let FRAME become less large than the size needed to
+	 ;; fit all of its windows.
+	 (min-text-width
+	  (+ (frame-windows-min-size frame t nil t)
+	     (- (frame-inner-width frame) first-width)))
+	 (min-text-height
+	  (+ (frame-windows-min-size frame nil nil t)
+	     (- (frame-inner-height frame) first-height)))
+	 ;; PARENT is the parent frame of FRAME or, if FRAME is a
+         ;; top-level frame, FRAME's workarea.
+         (parent (frame-parent frame))
+         (parent-edges
+          (if parent
+              (frame-edges parent)
+            (let* ((attributes
+                    (car (display-monitor-attributes-list)))
+                   (workarea (assq 'workarea attributes)))
+              (and workarea
+                   `(,(nth 1 workarea) ,(nth 2 workarea)
+                     ,(+ (nth 1 workarea) (nth 3 workarea))
+                     ,(+ (nth 2 workarea) (nth 4 workarea)))))))
+         (parent-left (and parent-edges (nth 0 parent-edges)))
+         (parent-top (and parent-edges (nth 1 parent-edges)))
+         (parent-right (and parent-edges (nth 2 parent-edges)))
+         (parent-bottom (and parent-edges (nth 3 parent-edges)))
+	 ;; Drag types.  drag-left/drag-right and drag-top/drag-bottom
+	 ;; are mutually exclusive.
+	 (drag-left (memq part '(bottom-left left top-left)))
+	 (drag-top (memq part '(top-left top top-right)))
+	 (drag-right (memq part '(top-right right bottom-right)))
+	 (drag-bottom (memq part '(bottom-right bottom bottom-left)))
+	 ;; Initial "first" mouse position.  While dragging we base all
+	 ;; calculations against that position.
+	 (first-x-y (mouse-absolute-pixel-position))
+         (first-x (car first-x-y))
+         (first-y (cdr first-x-y))
+         (exitfun nil)
+         (move
+          (lambda (event)
+            (interactive "e")
+            (when (consp event)
+              (let* ((last-x-y (mouse-absolute-pixel-position))
+		     (last-x (car last-x-y))
+		     (last-y (cdr last-x-y))
+		     (left (- last-x first-x))
+		     (top (- last-y first-y))
+		     alist)
+                ;; We never want to warp the mouse position here.  When
+                ;; moving the mouse leftward or upward, then with a wide
+                ;; border the calculated left or top position of the
+                ;; frame could drop to a value less than zero depending
+                ;; on where precisely the mouse within the border.  We
+                ;; guard against this by never allowing the frame to
+                ;; move to a position less than zero here.  No such
+                ;; precautions are used for the right and bottom borders
+                ;; so with a large internal border parts of that border
+                ;; may disappear.
+                (if (fboundp 'x-set-frame-size-and-position)
+                    (progn
+                      (when (and drag-left (>= last-x parent-left)
+                                 (>= (- first-width left) min-text-width))
+		        (setq x-left (max (+ first-left left) 0))
+		        (setq x-width (- first-width left)))
+	              (when (and drag-top (>= last-y parent-top)
+                                 (>= (- first-height top) min-text-height))
+		        (setq x-top (max 0 (+ first-top top)))
+		        (setq x-height (- first-height top)))
+	              (when (and drag-right (<= last-x parent-right)
+                                 (>= (+ first-width left) min-text-width))
+		        (setq x-width (+ first-width left)))
+	              (when (and drag-bottom (<= last-y parent-bottom)
+                                 (>= (+ first-height top) min-text-height))
+		        (setq x-height (+ first-height top)))
+                      (x-set-frame-size-and-position
+                       frame x-width x-height x-left x-top))
+                  (when (and drag-left (>= last-x parent-left)
+                             (>= (- first-width left) min-text-width))
+		    (push `(left . ,(max (+ first-left left) 0)) alist)
+		    (push `(width . (text-pixels . ,(- first-width left)))
+                          alist))
+	          (when (and drag-top (>= last-y parent-top)
+                             (>= (- first-height top) min-text-height))
+		    (push `(top . ,(max 0 (+ first-top top))) alist)
+		    (push `(height . (text-pixels . ,(- first-height top)))
+                          alist))
+	          (when (and drag-right (<= last-x parent-right)
+                             (>= (+ first-width left) min-text-width))
+		    (push `(width . (text-pixels . ,(+ first-width left)))
+                          alist))
+	          (when (and drag-bottom (<= last-y parent-bottom)
+                             (>= (+ first-height top) min-text-height))
+		    (push `(height . (text-pixels . ,(+ first-height top)))
+                          alist))
+	          (modify-frame-parameters frame alist))))))
+         (old-track-mouse track-mouse))
+    ;; Start tracking.  The special value 'dragging' signals the
+    ;; display engine to freeze the mouse pointer shape for as long
+    ;; as we drag.
+    (setq track-mouse 'dragging)
+    ;; Loop reading events and sampling the position of the mouse.
+    (setq exitfun
+          (set-transient-map
+           (let ((map (make-sparse-keymap)))
+             (define-key map [switch-frame] #'ignore)
+             (define-key map [select-window] #'ignore)
+             (define-key map [scroll-bar-movement] #'ignore)
+             (define-key map [mouse-movement] move)
+             ;; Swallow drag-mouse-1 events to avoid selecting some other window.
+             (define-key map [drag-mouse-1]
+               (lambda () (interactive) (funcall exitfun)))
+             ;; Some of the events will of course end up looked up
+             ;; with a mode-line, header-line or vertical-line prefix ...
+             (define-key map [mode-line] map)
+             (define-key map [header-line] map)
+             (define-key map [vertical-line] map)
+             ;; ... and some maybe even with a right- or bottom-divider
+             ;; prefix.
+             (define-key map [right-divider] map)
+             (define-key map [bottom-divider] map)
+             map)
+           t (lambda () (setq track-mouse old-track-mouse))))))
+
+(defun mouse-drag-frame-move (start-event)
+  "Drag a frame or one of its edges with the mouse.
+START-EVENT is the starting mouse event of the drag action.  Its
+position window denotes the frame that will be dragged.
+
+PART specifies the part that has been dragged and must be one of
+the symbols `left', `top', `right', `bottom', `top-left',
+`top-right', `bottom-left', `bottom-right' to drag an internal
+border or edge.  If PART equals `move', this means to move the
+frame with the mouse."
+  ;; Give temporary modes such as isearch a chance to turn off.
+  (run-hooks 'mouse-leave-buffer-hook)
+  (let* ((echo-keystrokes 0)
+	 (start (event-start start-event))
+         (window (posn-window start))
+         ;; FRAME is the frame to drag.
+         (frame (if (window-live-p window)
+                    (window-frame window)
+                  window))
+         (native-width (frame-native-width frame))
+         (native-height (frame-native-height frame))
+	 ;; Initial "first" frame position and size.  While dragging we
+	 ;; base all calculations against that size and position.
+	 (first-pos (frame-position frame))
+	 (first-left (car first-pos))
+	 (first-top (cdr first-pos))
+	 (first-width (frame-text-width frame))
+	 (first-height (frame-text-height frame))
+	 ;; PARENT is the parent frame of FRAME or, if FRAME is a
          ;; top-level frame, FRAME's workarea.
          (parent (frame-parent frame))
          (parent-edges
@@ -654,19 +774,16 @@ mouse-drag-frame
          (parent-top (and parent-edges (nth 1 parent-edges)))
          (parent-right (and parent-edges (nth 2 parent-edges)))
          (parent-bottom (and parent-edges (nth 3 parent-edges)))
-         ;; `pos-x' and `pos-y' record the x- and y-coordinates of the
-	 ;; last sampled mouse position.  Note that we sample absolute
-	 ;; mouse positions to avoid that moving the mouse from one
-	 ;; frame into another gets into our way.  `last-x' and `last-y'
-	 ;; records the x- and y-coordinates of the previously sampled
-	 ;; position.  The differences between `last-x' and `pos-x' as
-	 ;; well as `last-y' and `pos-y' determine the amount the mouse
-	 ;; has been dragged between the last two samples.
-         pos-x-y pos-x pos-y
-         (last-x-y (mouse-absolute-pixel-position))
-         (last-x (car last-x-y))
-         (last-y (cdr last-x-y))
-         ;; `snap-x' and `snap-y' record the x- and y-coordinates of the
+	 ;; Initial "first" mouse position.  While dragging we base all
+	 ;; calculations against that position.
+	 (first-x-y (mouse-absolute-pixel-position))
+         (first-x (car first-x-y))
+         (first-y (cdr first-x-y))
+         ;; `snap-width' (maybe also a yet to be provided `snap-height')
+         ;; could become floats to handle proportionality wrt PARENT.
+         ;; We don't do any checks on this parameter so far.
+         (snap-width (frame-parameter frame 'snap-width))
+	 ;; `snap-x' and `snap-y' record the x- and y-coordinates of the
          ;; mouse position when FRAME snapped.  As soon as the
          ;; difference between `pos-x' and `snap-x' (or `pos-y' and
          ;; `snap-y') exceeds the value of FRAME's `snap-width'
@@ -678,176 +795,144 @@ mouse-drag-frame
           (lambda (event)
             (interactive "e")
             (when (consp event)
-              (setq pos-x-y (mouse-absolute-pixel-position))
-              (setq pos-x (car pos-x-y))
-              (setq pos-y (cdr pos-x-y))
-              (cond
-               ((eq part 'left)
-                (mouse-resize-frame frame (- last-x pos-x) 0 t))
-               ((eq part 'top)
-                (mouse-resize-frame frame 0 (- last-y pos-y) nil t))
-               ((eq part 'right)
-                (mouse-resize-frame frame (- pos-x last-x) 0))
-               ((eq part 'bottom)
-                (mouse-resize-frame frame 0 (- pos-y last-y)))
-               ((eq part 'top-left)
-                (mouse-resize-frame
-                 frame (- last-x pos-x) (- last-y pos-y) t t))
-               ((eq part 'top-right)
-                (mouse-resize-frame
-                 frame (- pos-x last-x) (- last-y pos-y) nil t))
-               ((eq part 'bottom-left)
-                (mouse-resize-frame
-                 frame (- last-x pos-x) (- pos-y last-y) t))
-               ((eq part 'bottom-right)
-                (mouse-resize-frame
-                 frame (- pos-x last-x) (- pos-y last-y)))
-               ((eq part 'move)
-                (let* ((old-position (frame-position frame))
-                       (old-left (car old-position))
-                       (old-top (cdr old-position))
-                       (left (+ old-left (- pos-x last-x)))
-                       (top (+ old-top (- pos-y last-y)))
-                       right bottom
-                       ;; `snap-width' (maybe also a yet to be provided
-                       ;; `snap-height') could become floats to handle
-                       ;; proportionality wrt PARENT.  We don't do any
-                       ;; checks on this parameter so far.
-                       (snap-width (frame-parameter frame 'snap-width)))
-                  ;; Docking and constraining.
-                  (when (and (numberp snap-width) parent-edges)
+              (let* ((last-x-y (mouse-absolute-pixel-position))
+		     (last-x (car last-x-y))
+		     (last-y (cdr last-x-y))
+		     (left (- last-x first-x))
+		     (top (- last-y first-y))
+                     right bottom)
+		(setq left (+ first-left left))
+		(setq top (+ first-top top))
+                ;; Docking and constraining.
+                (when (and (numberp snap-width) parent-edges)
+                  (cond
+                   ;; Docking at the left parent edge.
+                   ((< last-x first-x)
                     (cond
-                     ;; Docking at the left parent edge.
-                     ((< pos-x last-x)
-                      (cond
-                       ((and (> left parent-left)
-                             (<= (- left parent-left) snap-width))
-                        ;; Snap when the mouse moved leftward and
-                        ;; FRAME's left edge would end up within
-                        ;; `snap-width' pixels from PARENT's left edge.
-                        (setq snap-x pos-x)
-                        (setq left parent-left))
-                       ((and (<= left parent-left)
-                             (<= (- parent-left left) snap-width)
-                             snap-x (<= (- snap-x pos-x) snap-width))
-                        ;; Stay snapped when the mouse moved leftward
-                        ;; but not more than `snap-width' pixels from
-                        ;; the time FRAME snapped.
-                        (setq left parent-left))
-                       (t
-                        ;; Unsnap when the mouse moved more than
-                        ;; `snap-width' pixels leftward from the time
-                        ;; FRAME snapped.
-                        (setq snap-x nil))))
-                     ((> pos-x last-x)
-                      (setq right (+ left width))
-                      (cond
-                       ((and (< right parent-right)
-                             (<= (- parent-right right) snap-width))
-                        ;; Snap when the mouse moved rightward and
-                        ;; FRAME's right edge would end up within
-                        ;; `snap-width' pixels from PARENT's right edge.
-                        (setq snap-x pos-x)
-                        (setq left (- parent-right width)))
-                       ((and (>= right parent-right)
-                             (<= (- right parent-right) snap-width)
-                             snap-x (<= (- pos-x snap-x) snap-width))
-                        ;; Stay snapped when the mouse moved rightward
-                        ;; but not more more than `snap-width' pixels
-                        ;; from the time FRAME snapped.
-                        (setq left (- parent-right width)))
-                       (t
-                        ;; Unsnap when the mouse moved rightward more
-                        ;; than `snap-width' pixels from the time FRAME
-                        ;; snapped.
-                        (setq snap-x nil)))))
-
+                     ((and (> left parent-left)
+                           (<= (- left parent-left) snap-width))
+                      ;; Snap when the mouse moved leftward and FRAME's
+                      ;; left edge would end up within `snap-width'
+                      ;; pixels from PARENT's left edge.
+                      (setq snap-x last-x)
+                      (setq left parent-left))
+                     ((and (<= left parent-left)
+                           (<= (- parent-left left) snap-width)
+                           snap-x (<= (- snap-x last-x) snap-width))
+                      ;; Stay snapped when the mouse moved leftward but
+                      ;; not more than `snap-width' pixels from the time
+                      ;; FRAME snapped.
+                      (setq left parent-left))
+                     (t
+                      ;; Unsnap when the mouse moved more than
+                      ;; `snap-width' pixels leftward from the time
+                      ;; FRAME snapped.
+                      (setq snap-x nil))))
+                   ((> last-x first-x)
+                    (setq right (+ left native-width))
                     (cond
-                     ((< pos-y last-y)
-                      (cond
-                       ((and (> top parent-top)
-                             (<= (- top parent-top) snap-width))
-                        ;; Snap when the mouse moved upward and FRAME's
-                        ;; top edge would end up within `snap-width'
-                        ;; pixels from PARENT's top edge.
-                        (setq snap-y pos-y)
-                        (setq top parent-top))
-                       ((and (<= top parent-top)
-                             (<= (- parent-top top) snap-width)
-                             snap-y (<= (- snap-y pos-y) snap-width))
-                        ;; Stay snapped when the mouse moved upward but
-                        ;; not more more than `snap-width' pixels from
-                        ;; the time FRAME snapped.
-                        (setq top parent-top))
-                       (t
-                        ;; Unsnap when the mouse moved upward more than
-                        ;; `snap-width' pixels from the time FRAME
-                        ;; snapped.
-                        (setq snap-y nil))))
-                     ((> pos-y last-y)
-                      (setq bottom (+ top height))
-                      (cond
-                       ((and (< bottom parent-bottom)
-                             (<= (- parent-bottom bottom) snap-width))
-                        ;; Snap when the mouse moved downward and
-                        ;; FRAME's bottom edge would end up within
-                        ;; `snap-width' pixels from PARENT's bottom
-                        ;; edge.
-                        (setq snap-y pos-y)
-                        (setq top (- parent-bottom height)))
-                       ((and (>= bottom parent-bottom)
-                             (<= (- bottom parent-bottom) snap-width)
-                             snap-y (<= (- pos-y snap-y) snap-width))
-                        ;; Stay snapped when the mouse moved downward
-                        ;; but not more more than `snap-width' pixels
-                        ;; from the time FRAME snapped.
-                        (setq top (- parent-bottom height)))
-                       (t
-                        ;; Unsnap when the mouse moved downward more
-                        ;; than `snap-width' pixels from the time FRAME
-                        ;; snapped.
-                        (setq snap-y nil))))))
-
-                  ;; If requested, constrain FRAME's draggable areas to
-                  ;; PARENT's edges.  The `top-visible' parameter should
-                  ;; be set when FRAME has a draggable header-line.  If
-                  ;; set to a number, it ascertains that the top of
-                  ;; FRAME is always constrained to the top of PARENT
-                  ;; and that at least as many pixels of FRAME as
-                  ;; specified by that number are visible on each of the
-                  ;; three remaining sides of PARENT.
-                  ;;
-                  ;; The `bottom-visible' parameter should be set when
-                  ;; FRAME has a draggable mode-line.  If set to a
-                  ;; number, it ascertains that the bottom of FRAME is
-                  ;; always constrained to the bottom of PARENT and that
-                  ;; at least as many pixels of FRAME as specified by
-                  ;; that number are visible on each of the three
-                  ;; remaining sides of PARENT.
-                  (let ((par (frame-parameter frame 'top-visible))
-                        bottom-visible)
-                    (unless par
-                      (setq par (frame-parameter frame 'bottom-visible))
-                      (setq bottom-visible t))
-                    (when (and (numberp par) parent-edges)
-                      (setq left
-                            (max (min (- parent-right par) left)
-                                 (+ (- parent-left width) par)))
-                      (setq top
-                            (if bottom-visible
-                                (min (max top (- parent-top (- height par)))
-                                     (- parent-bottom height))
-                              (min (max top parent-top)
-                                   (- parent-bottom par))))))
-
-                  ;; Use `modify-frame-parameters' since `left' and
-                  ;; `top' may want to move FRAME out of its PARENT.
-                  (modify-frame-parameters
-                   frame
-                   `((left . (+ ,left)) (top . (+ ,top)))))))
-              (setq last-x pos-x)
-              (setq last-y pos-y))))
-         (old-track-mouse track-mouse))
+                     ((and (< right parent-right)
+                           (<= (- parent-right right) snap-width))
+                      ;; Snap when the mouse moved rightward and FRAME's
+                      ;; right edge would end up within `snap-width'
+                      ;; pixels from PARENT's right edge.
+                      (setq snap-x last-x)
+                      (setq left (- parent-right native-width)))
+                     ((and (>= right parent-right)
+                           (<= (- right parent-right) snap-width)
+                           snap-x (<= (- last-x snap-x) snap-width))
+                      ;; Stay snapped when the mouse moved rightward but
+                      ;; not more more than `snap-width' pixels from the
+                      ;; time FRAME snapped.
+                      (setq left (- parent-right native-width)))
+                     (t
+                      ;; Unsnap when the mouse moved rightward more than
+                      ;; `snap-width' pixels from the time FRAME
+                      ;; snapped.
+                      (setq snap-x nil)))))
+                  (cond
+                   ((< last-y first-y)
+                    (cond
+                     ((and (> top parent-top)
+                           (<= (- top parent-top) snap-width))
+                      ;; Snap when the mouse moved upward and FRAME's
+                      ;; top edge would end up within `snap-width'
+                      ;; pixels from PARENT's top edge.
+                      (setq snap-y last-y)
+                      (setq top parent-top))
+                     ((and (<= top parent-top)
+                           (<= (- parent-top top) snap-width)
+                           snap-y (<= (- snap-y last-y) snap-width))
+                      ;; Stay snapped when the mouse moved upward but
+                      ;; not more more than `snap-width' pixels from the
+                      ;; time FRAME snapped.
+                      (setq top parent-top))
+                     (t
+                      ;; Unsnap when the mouse moved upward more than
+                      ;; `snap-width' pixels from the time FRAME
+                      ;; snapped.
+                      (setq snap-y nil))))
+                   ((> last-y first-y)
+                    (setq bottom (+ top native-height))
+                    (cond
+                     ((and (< bottom parent-bottom)
+                           (<= (- parent-bottom bottom) snap-width))
+                      ;; Snap when the mouse moved downward and FRAME's
+                      ;; bottom edge would end up within `snap-width'
+                      ;; pixels from PARENT's bottom edge.
+                      (setq snap-y last-y)
+                      (setq top (- parent-bottom native-height)))
+                     ((and (>= bottom parent-bottom)
+                           (<= (- bottom parent-bottom) snap-width)
+                           snap-y (<= (- last-y snap-y) snap-width))
+                      ;; Stay snapped when the mouse moved downward but
+                      ;; not more more than `snap-width' pixels from the
+                      ;; time FRAME snapped.
+                      (setq top (- parent-bottom native-height)))
+                     (t
+                      ;; Unsnap when the mouse moved downward more than
+                      ;; `snap-width' pixels from the time FRAME
+                      ;; snapped.
+                      (setq snap-y nil))))))
+
+                ;; If requested, constrain FRAME's draggable areas to
+                ;; PARENT's edges.  The `top-visible' parameter should
+                ;; be set when FRAME has a draggable header-line.  If
+                ;; set to a number, it ascertains that the top of FRAME
+                ;; is always constrained to the top of PARENT and that
+                ;; at least as many pixels of FRAME as specified by that
+                ;; number are visible on each of the three remaining
+                ;; sides of PARENT.
+                ;;
+                ;; The `bottom-visible' parameter should be set when
+                ;; FRAME has a draggable mode-line.  If set to a number,
+                ;; it ascertains that the bottom of FRAME is always
+                ;; constrained to the bottom of PARENT and that at least
+                ;; as many pixels of FRAME as specified by that number
+                ;; are visible on each of the three remaining sides of
+                ;; PARENT.
+                (let ((par (frame-parameter frame 'top-visible))
+                      bottom-visible)
+                  (unless par
+                    (setq par (frame-parameter frame 'bottom-visible))
+                    (setq bottom-visible t))
+                  (when (and (numberp par) parent-edges)
+                    (setq left
+                          (max (min (- parent-right par) left)
+                               (+ (- parent-left native-width) par)))
+                    (setq top
+                          (if bottom-visible
+                              (min (max top (- parent-top (- native-height par)))
+                                   (- parent-bottom native-height))
+                            (min (max top parent-top)
+                                 (- parent-bottom par))))))
+                (if (fboundp 'x-set-frame-size-and-position)
+                    (x-set-frame-size-and-position
+                     frame first-width first-height left top)
+                  ;; Use `modify-frame-parameters' since `left' and `top'
+                  ;; may want to move FRAME out of its PARENT.
+                  (modify-frame-parameters frame `((left . (+ ,left)) (top . (+ ,top)))))))))
+	 (old-track-mouse track-mouse))
     ;; Start tracking.  The special value 'dragging' signals the
     ;; display engine to freeze the mouse pointer shape for as long
     ;; as we drag.
@@ -879,49 +964,49 @@ mouse-drag-left-edge
   "Drag left edge of a frame with the mouse.
 START-EVENT is the starting mouse event of the drag action."
   (interactive "e")
-  (mouse-drag-frame start-event 'left))
+  (mouse-drag-frame-resize start-event 'left))
 
 (defun mouse-drag-top-left-corner (start-event)
   "Drag top left corner of a frame with the mouse.
 START-EVENT is the starting mouse event of the drag action."
   (interactive "e")
-  (mouse-drag-frame start-event 'top-left))
+  (mouse-drag-frame-resize start-event 'top-left))
 
 (defun mouse-drag-top-edge (start-event)
   "Drag top edge of a frame with the mouse.
 START-EVENT is the starting mouse event of the drag action."
   (interactive "e")
-  (mouse-drag-frame start-event 'top))
+  (mouse-drag-frame-resize start-event 'top))
 
 (defun mouse-drag-top-right-corner (start-event)
   "Drag top right corner of a frame with the mouse.
 START-EVENT is the starting mouse event of the drag action."
   (interactive "e")
-  (mouse-drag-frame start-event 'top-right))
+  (mouse-drag-frame-resize start-event 'top-right))
 
 (defun mouse-drag-right-edge (start-event)
   "Drag right edge of a frame with the mouse.
 START-EVENT is the starting mouse event of the drag action."
   (interactive "e")
-  (mouse-drag-frame start-event 'right))
+  (mouse-drag-frame-resize start-event 'right))
 
 (defun mouse-drag-bottom-right-corner (start-event)
   "Drag bottom right corner of a frame with the mouse.
 START-EVENT is the starting mouse event of the drag action."
   (interactive "e")
-  (mouse-drag-frame start-event 'bottom-right))
+  (mouse-drag-frame-resize start-event 'bottom-right))
 
 (defun mouse-drag-bottom-edge (start-event)
   "Drag bottom edge of a frame with the mouse.
 START-EVENT is the starting mouse event of the drag action."
   (interactive "e")
-  (mouse-drag-frame start-event 'bottom))
+  (mouse-drag-frame-resize start-event 'bottom))
 
 (defun mouse-drag-bottom-left-corner (start-event)
   "Drag bottom left corner of a frame with the mouse.
 START-EVENT is the starting mouse event of the drag action."
   (interactive "e")
-  (mouse-drag-frame start-event 'bottom-left))
+  (mouse-drag-frame-resize start-event 'bottom-left))
 
 (defcustom mouse-select-region-move-to-beginning nil
   "Effect of selecting a region extending backward from double click.
diff --git a/src/xfns.c b/src/xfns.c
index 276ea1c393..d8387f66bf 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -4203,6 +4203,231 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
  return unbind_to (count, frame);
 }
 
+
+static void
+x_set_frame_size_and_position (struct frame *f, int width, int height, int left, int top)
+{
+  int unit_width = FRAME_COLUMN_WIDTH (f);
+  int unit_height = FRAME_LINE_HEIGHT (f);
+  int old_pixel_width = FRAME_PIXEL_WIDTH (f);
+  int old_pixel_height = FRAME_PIXEL_HEIGHT (f);
+  int old_cols = FRAME_COLS (f);
+  int old_lines = FRAME_LINES (f);
+  int new_pixel_width = FRAME_TEXT_TO_PIXEL_WIDTH (f, width);
+  int new_pixel_height = FRAME_TEXT_TO_PIXEL_HEIGHT (f, height);
+  struct window *r = XWINDOW (FRAME_ROOT_WINDOW (f));
+  int old_windows_width = WINDOW_PIXEL_WIDTH (r);
+  int old_windows_height
+    = (WINDOW_PIXEL_HEIGHT (r)
+       + ((FRAME_HAS_MINIBUF_P (f) && !FRAME_MINIBUF_ONLY_P (f))
+	  ? WINDOW_PIXEL_HEIGHT (XWINDOW (FRAME_MINIBUF_WINDOW (f)))
+	  : 0));
+  int new_windows_width, new_windows_height;
+  int new_cols, new_lines;
+  Lisp_Object frame;
+  bool old_frame_resize_pixelwise = frame_resize_pixelwise;
+#ifdef USE_GTK
+  int scale = xg_get_scale (f);
+#endif
+
+  XSETFRAME (frame, f);
+
+  frame_size_history_add
+    (f, Qx_set_frame_size_and_position_1, new_pixel_width,
+     new_pixel_height, Qnil);
+
+  new_windows_width = new_pixel_width - 2 * FRAME_INTERNAL_BORDER_WIDTH (f);
+  new_windows_height = (new_pixel_height
+			- FRAME_TOP_MARGIN_HEIGHT (f)
+			- 2 * FRAME_INTERNAL_BORDER_WIDTH (f));
+  new_cols = width / unit_width;
+  new_lines = height / unit_height;
+
+  if (FRAME_WINDOW_P (f) && f->can_set_window_size)
+    {
+      block_input ();
+
+#ifdef USE_GTK
+      GdkWindow *window = gtk_widget_get_window (FRAME_GTK_OUTER_WIDGET (f));
+
+      frame_resize_pixelwise = true;
+      x_wm_set_size_hint (f, 0, true);
+      frame_resize_pixelwise = old_frame_resize_pixelwise;
+      gdk_window_move_resize
+	(window, left / scale, top / scale, new_pixel_width / scale,
+	 new_pixel_height / scale);
+      SET_FRAME_GARBAGED (f);
+      cancel_mouse_face (f);
+
+      if (FRAME_VISIBLE_P (f))
+	{
+	  /* Must call this to flush out events */
+	  (void)gtk_events_pending ();
+	  gdk_flush ();
+	  x_wait_for_event (f, ConfigureNotify);
+	}
+      else
+	{
+	  change_frame_size (f, new_pixel_width, new_pixel_height,
+			     false, true, false, true);
+	  x_sync (f);
+	}
+#else
+      f->win_gravity = NorthWestGravity;
+      frame_resize_pixelwise = true;
+      x_wm_set_size_hint (f, 0, true);
+      frame_resize_pixelwise = old_frame_resize_pixelwise;
+
+      XMoveResizeWindow (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f),
+			 left, top, new_pixel_width,
+			 new_pixel_height + FRAME_MENUBAR_HEIGHT (f));
+
+      SET_FRAME_GARBAGED (f);
+
+      if (FRAME_VISIBLE_P (f))
+	x_wait_for_event (f, ConfigureNotify);
+      else
+	{
+	  change_frame_size (f,new_pixel_width, new_pixel_height,
+			     false, true, false, true);
+	  x_sync (f);
+	}
+
+      x_clear_under_internal_border (f);
+#endif
+
+      mark_window_cursors_off (XWINDOW (f->root_window));
+
+      cancel_mouse_face (f);
+
+      unblock_input ();
+
+      do_pending_window_change (false);
+
+      f->resized_p = true;
+
+      block_input ();
+    }
+
+  if (new_windows_width != old_windows_width)
+    {
+      resize_frame_windows (f, new_windows_width, true);
+      if (WINDOWP (f->tab_bar_window))
+	{
+	  XWINDOW (f->tab_bar_window)->pixel_width = new_windows_width;
+	  XWINDOW (f->tab_bar_window)->total_cols
+	    = new_windows_width / unit_width;
+	}
+
+#if defined (HAVE_WINDOW_SYSTEM) && ! defined (HAVE_EXT_TOOL_BAR)
+      if (WINDOWP (f->tool_bar_window))
+	{
+	  XWINDOW (f->tool_bar_window)->pixel_width = new_windows_width;
+	  XWINDOW (f->tool_bar_window)->total_cols
+	    = new_windows_width / unit_width;
+	}
+#endif
+    }
+  else if (new_cols != old_cols)
+    call2 (Qwindow__pixel_to_total, frame, Qt);
+
+  if (new_windows_height != old_windows_height
+      || WINDOW_TOP_PIXEL_EDGE (r) != FRAME_TOP_MARGIN_HEIGHT (f))
+    resize_frame_windows (f, new_windows_height, false);
+  else if (new_lines != old_lines)
+    call2 (Qwindow__pixel_to_total, frame, Qnil);
+
+  frame_size_history_add
+    (f, Qx_set_frame_size_and_position_3, width, height, Qnil);
+
+  /* Assign new sizes.  */
+  FRAME_TEXT_WIDTH (f) = width;
+  FRAME_TEXT_HEIGHT (f) = height;
+  FRAME_PIXEL_WIDTH (f) = new_pixel_width;
+  FRAME_PIXEL_HEIGHT (f) = new_pixel_height;
+  SET_FRAME_COLS (f, new_cols);
+  SET_FRAME_LINES (f, new_lines);
+  SET_FRAME_COLS (f, new_cols);
+  SET_FRAME_LINES (f, new_lines);
+
+  {
+    struct window *w = XWINDOW (FRAME_SELECTED_WINDOW (f));
+    int text_area_x, text_area_y, text_area_width, text_area_height;
+
+    window_box (w, TEXT_AREA, &text_area_x, &text_area_y, &text_area_width,
+		&text_area_height);
+    if (w->cursor.x >= text_area_x + text_area_width)
+      w->cursor.hpos = w->cursor.x = 0;
+    if (w->cursor.y >= text_area_y + text_area_height)
+      w->cursor.vpos = w->cursor.y = 0;
+  }
+
+  /* Sanitize window sizes.  */
+  sanitize_window_sizes (Qt);
+  sanitize_window_sizes (Qnil);
+
+  adjust_frame_glyphs (f);
+  calculate_costs (f);
+  SET_FRAME_GARBAGED (f);
+
+  /* A frame was "resized" if one of its pixelsizes changed, even if its
+     X window wasn't resized at all.  */
+  f->resized_p = (new_pixel_width != old_pixel_width
+		  || new_pixel_height != old_pixel_height);
+
+  unblock_input ();
+}
+
+
+DEFUN ("x-set-frame-size-and-position", Fx_set_frame_size_and_position,
+       Sx_set_frame_size_and_position, 0, 5, 0,
+       doc: /* Set position of FRAME to (LEFT, TOP) and size to (WIDTH, HEIGHT).
+FRAME must be a live frame and defaults to the selected one.  The
+remaining values must be either nil (which means to not change the
+respective size or position) or specify a pixel value.  */)
+  (Lisp_Object frame, Lisp_Object width, Lisp_Object height,
+   Lisp_Object left, Lisp_Object top)
+{
+  struct frame *f = decode_live_frame (frame);
+  int text_width, text_height, outer_left, outer_top;
+
+  if (EQ (width, Qnil))
+    text_width = FRAME_TEXT_WIDTH (f);
+  else
+    {
+      CHECK_TYPE_RANGED_INTEGER (int, width);
+      text_width = XFIXNUM (width);
+    }
+
+  if (EQ (height, Qnil))
+    text_height = FRAME_TEXT_HEIGHT (f);
+  else
+    {
+      CHECK_TYPE_RANGED_INTEGER (int, height);
+      text_height = XFIXNUM (height);
+    }
+
+  if (EQ (left, Qnil))
+    outer_left = f->left_pos;
+  else
+    {
+      CHECK_TYPE_RANGED_INTEGER (int, left);
+      outer_left = XFIXNUM (left);
+    }
+
+  if (EQ (top, Qnil))
+    outer_top = f->top_pos;
+  else
+    {
+      CHECK_TYPE_RANGED_INTEGER (int, top);
+      outer_top = XFIXNUM (top);
+    }
+
+  x_set_frame_size_and_position
+    (f, text_width, text_height, outer_left, outer_top);
+
+  return Qnil;
+}
 \f
 DEFUN ("xw-color-defined-p", Fxw_color_defined_p, Sxw_color_defined_p, 1, 2, 0,
        doc: /* Internal function called by `color-defined-p'.
@@ -7810,6 +8035,9 @@ syms_of_xfns (void)
   DEFSYM (Qfont_parameter, "font-parameter");
   DEFSYM (Qmono, "mono");
   DEFSYM (Qassq_delete_all, "assq-delete-all");
+  DEFSYM (Qx_set_frame_size_and_position_1, "x-set-frame-size-and-position-1");
+  DEFSYM (Qx_set_frame_size_and_position_2, "x-set-frame-size-and-position-2");
+  DEFSYM (Qx_set_frame_size_and_position_3, "x-set-frame-size-and-position-3");
 
 #ifdef USE_CAIRO
   DEFSYM (Qpdf, "pdf");
@@ -8065,6 +8293,7 @@ syms_of_xfns (void)
   defsubr (&Sx_set_mouse_absolute_pixel_position);
   defsubr (&Sx_wm_set_size_hint);
   defsubr (&Sx_create_frame);
+  defsubr (&Sx_set_frame_size_and_position);
   defsubr (&Sx_open_connection);
   defsubr (&Sx_close_connection);
   defsubr (&Sx_display_list);

  reply	other threads:[~2020-01-31 15:44 UTC|newest]

Thread overview: 197+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-01-10  2:34 Emacs's set-frame-size can not work well with gnome-shell? tumashu
2020-01-10  9:56 ` martin rudalics
2020-01-11  1:29   ` tumashu
2020-01-11  7:50     ` martin rudalics
2020-01-11  9:56       ` Dmitry Gutov
2020-01-11 10:19         ` martin rudalics
2020-01-11 10:21           ` Dmitry Gutov
2020-01-11 10:35             ` martin rudalics
2020-01-11 11:21               ` Dmitry Gutov
2020-01-11 13:45                 ` martin rudalics
2020-01-14  2:09                   ` Dmitry Gutov
2020-01-14 15:50                     ` martin rudalics
2020-01-15  1:31                       ` Dmitry Gutov
2020-01-15  8:08                         ` martin rudalics
2020-01-15 23:53                           ` Dmitry Gutov
2020-01-16  8:03                             ` martin rudalics
2020-01-16  8:15                               ` Dmitry Gutov
2020-01-16  9:18                                 ` martin rudalics
2020-01-16  9:27                                   ` Dmitry Gutov
2020-01-16  9:44                                     ` martin rudalics
2020-01-16 10:12                                       ` Dmitry Gutov
2020-01-16 10:22                                         ` martin rudalics
2020-01-16 15:03                                           ` Dmitry Gutov
2020-01-16 18:33                                             ` martin rudalics
     [not found]                                               ` <15405719-d58d-44db-f1df-ad3bb272b2fc@yandex.ru>
     [not found]                                                 ` <aba0683f-466c-76cf-9024-e18bfc9fdc94@gmx.at>
2020-01-18  2:05                                                   ` Dmitry Gutov
2020-01-18  2:29                                                     ` Dmitry Gutov
2020-01-18  8:34                                                       ` martin rudalics
2020-01-18 12:27                                                         ` Dmitry Gutov
2020-01-18 13:48                                                           ` martin rudalics
2020-01-19  2:45                                                             ` Dmitry Gutov
2020-01-19  8:52                                                               ` martin rudalics
2020-01-20 14:14                                                                 ` Dmitry Gutov
2020-01-20 15:57                                                                   ` martin rudalics
2020-01-20 22:20                                                                     ` Dmitry Gutov
2020-01-21  8:29                                                                       ` martin rudalics
2020-01-21 11:36                                                                         ` Dmitry Gutov
2020-01-21 16:11                                                                           ` martin rudalics
2020-01-21 21:33                                                                             ` Dmitry Gutov
2020-01-22  9:07                                                                               ` martin rudalics
2020-01-22 10:57                                                                                 ` Dmitry Gutov
2020-01-18  8:32                                                     ` martin rudalics
2020-01-20 13:37                                                       ` Dmitry Gutov
2020-01-20 15:57                                                         ` martin rudalics
2020-01-20 23:02                                                           ` Dmitry Gutov
2020-01-21  8:29                                                             ` martin rudalics
2020-01-21 12:11                                                               ` Dmitry Gutov
2020-01-21 16:12                                                                 ` martin rudalics
2020-01-21 22:26                                                                   ` Dmitry Gutov
2020-01-22  9:08                                                                     ` martin rudalics
2020-01-22 11:35                                                                       ` Dmitry Gutov
2020-01-22 13:18                                                                         ` tumashu
2020-01-22 13:32                                                                           ` Dmitry Gutov
2020-01-22 16:19                                                                             ` Eli Zaretskii
2020-01-22 17:36                                                                             ` martin rudalics
2020-01-22 21:15                                                                               ` Dmitry Gutov
2020-01-25  8:41                                                                                 ` martin rudalics
2020-01-25 10:09                                                                                   ` Dmitry Gutov
2020-01-25 12:10                                                                                     ` martin rudalics
2020-01-26 11:59                                                                                       ` Dmitry Gutov
2020-01-26 17:38                                                                                         ` martin rudalics
2020-01-26 20:50                                                                                           ` Dmitry Gutov
2020-01-28  9:46                                                                                             ` martin rudalics
2020-01-28 15:19                                                                                               ` Dmitry Gutov
2020-01-28 16:20                                                                                                 ` martin rudalics
2020-01-30  2:14                                                                                                   ` Dmitry Gutov
2020-01-27 19:17                                                                                           ` martin rudalics
2020-01-27 21:15                                                                                             ` Dmitry Gutov
2020-01-28  9:47                                                                                               ` martin rudalics
2020-01-30  2:10                                                                                                 ` Dmitry Gutov
2020-01-30  9:38                                                                                                   ` martin rudalics
2020-01-30 17:21                                                                                                     ` martin rudalics
2020-01-30 18:15                                                                                                       ` Dmitry Gutov
2020-01-30 18:41                                                                                                         ` martin rudalics
2020-01-31  1:22                                                                                                           ` Dmitry Gutov
2020-01-31  9:29                                                                                                             ` martin rudalics
2020-01-31 11:52                                                                                                               ` Dmitry Gutov
2020-01-31 15:44                                                                                                                 ` martin rudalics [this message]
2020-01-31 22:22                                                                                                                   ` Dmitry Gutov
2020-02-01  9:35                                                                                                                     ` martin rudalics
2020-02-05  1:39                                                                                                                       ` Dmitry Gutov
2020-02-05  9:15                                                                                                                         ` martin rudalics
2020-02-10  7:06                                                                                                                           ` Dmitry Gutov
2020-02-10 17:53                                                                                                                             ` martin rudalics
2020-02-10 22:40                                                                                                                               ` Dmitry Gutov
2020-02-10  7:22                                                                                                                           ` Dmitry Gutov
2020-02-10 17:54                                                                                                                             ` martin rudalics
2020-02-10 22:49                                                                                                                               ` Dmitry Gutov
2020-02-13 18:42                                                                                                                                 ` martin rudalics
2020-02-13 23:48                                                                                                                                   ` Dmitry Gutov
2020-02-14  8:48                                                                                                                                     ` martin rudalics
2020-02-15 22:31                                                                                                                                       ` Dmitry Gutov
2020-02-16 10:01                                                                                                                                         ` martin rudalics
2020-02-16 20:47                                                                                                                                           ` Dmitry Gutov
2020-02-17 18:20                                                                                                                                             ` martin rudalics
2020-02-21 11:03                                                                                                                                               ` Dmitry Gutov
2020-02-21 11:13                                                                                                                                                 ` Dmitry Gutov
2020-02-21 16:08                                                                                                                                                   ` martin rudalics
2020-02-24  0:11                                                                                                                                                     ` Dmitry Gutov
2020-02-26 17:30                                                                                                                                                       ` martin rudalics
2020-02-28 16:32                                                                                                                                                         ` martin rudalics
2020-03-03 13:50                                                                                                                                                           ` Dmitry Gutov
2020-03-03 14:40                                                                                                                                                             ` martin rudalics
2020-03-03 18:27                                                                                                                                                               ` Dmitry Gutov
2020-03-04 17:29                                                                                                                                                                 ` martin rudalics
2020-03-06 23:38                                                                                                                                                                   ` Dmitry Gutov
2020-03-07  0:07                                                                                                                                                                   ` Dmitry Gutov
2020-03-06 23:03                                                                                                                                                         ` Dmitry Gutov
2020-02-16 23:01                                                                                                                                           ` Dmitry Gutov
2020-02-17 18:21                                                                                                                                             ` martin rudalics
2020-02-21 14:18                                                                                                                                               ` Dmitry Gutov
2020-02-21 16:08                                                                                                                                                 ` martin rudalics
2020-02-23  9:22                                                                                                                                                   ` Dmitry Gutov
2020-02-26 17:30                                                                                                                                                     ` martin rudalics
2020-03-06 23:32                                                                                                                                                       ` Dmitry Gutov
2020-03-09  9:03                                                                                                                                                         ` martin rudalics
2020-03-12  0:22                                                                                                                                                           ` Dmitry Gutov
2020-03-12  8:23                                                                                                                                                             ` martin rudalics
2020-03-13 16:57                                                                                                                                                               ` Dmitry Gutov
2020-03-13 17:46                                                                                                                                                                 ` martin rudalics
2020-03-16 19:51                                                                                                                                                                   ` Dmitry Gutov
2020-03-17  9:38                                                                                                                                                                     ` martin rudalics
2020-03-17 11:22                                                                                                                                                                       ` Dmitry Gutov
2020-03-31 17:04                                                                                                                                                                         ` martin rudalics
2020-04-03 11:09                                                                                                                                                                           ` Eli Zaretskii
2020-04-03 15:08                                                                                                                                                                             ` martin rudalics
2020-04-03 16:08                                                                                                                                                                               ` martin rudalics
2020-04-03 19:07                                                                                                                                                                               ` Dmitry Gutov
2020-04-04  8:51                                                                                                                                                                               ` Eli Zaretskii
2020-04-04  9:02                                                                                                                                                                                 ` martin rudalics
2020-04-04  9:30                                                                                                                                                                                   ` Eli Zaretskii
2020-04-06  9:03                                                                                                                                                                                     ` martin rudalics
2020-04-06 13:26                                                                                                                                                                                       ` Eli Zaretskii
2020-04-07  8:32                                                                                                                                                                                         ` martin rudalics
2020-04-07 14:04                                                                                                                                                                                           ` Eli Zaretskii
2020-04-06 18:36                                                                                                                                                                                       ` Dmitry Gutov
2020-04-07  8:33                                                                                                                                                                                         ` martin rudalics
2020-04-07 13:19                                                                                                                                                                                           ` Dmitry Gutov
2020-04-12  6:44                                                                                                                                                                           ` Andreas Schwab
2020-04-12  7:23                                                                                                                                                                             ` Eli Zaretskii
2020-04-12  7:37                                                                                                                                                                               ` Andreas Schwab
2020-04-12  8:03                                                                                                                                                                             ` martin rudalics
2020-04-06 22:51                                                                                                                                                               ` Dmitry Gutov
2020-04-07  8:33                                                                                                                                                                 ` martin rudalics
2020-04-07 14:25                                                                                                                                                                   ` Dmitry Gutov
2020-04-07 14:39                                                                                                                                                                     ` Robert Pluim
2020-04-07 14:50                                                                                                                                                                       ` Dmitry Gutov
2020-04-07 15:37                                                                                                                                                                         ` Robert Pluim
2020-04-07 19:25                                                                                                                                                                           ` Dmitry Gutov
2020-04-08  7:59                                                                                                                                                                             ` Robert Pluim
2020-04-08 10:37                                                                                                                                                                               ` Dmitry Gutov
2020-04-08 12:12                                                                                                                                                                                 ` Robert Pluim
2020-04-08  8:31                                                                                                                                                                   ` Support
2020-04-08  8:45                                                                                                                                                                     ` martin rudalics
2020-04-08  9:03                                                                                                                                                                       ` Adrián Medraño Calvo
2020-04-08  9:25                                                                                                                                                                         ` martin rudalics
2020-02-14  9:52                                                                                                                                     ` martin rudalics
2020-02-15 22:49                                                                                                                                       ` Dmitry Gutov
2020-02-16 10:01                                                                                                                                         ` martin rudalics
2020-01-27 23:20                                                                                           ` Dmitry Gutov
2020-01-27 23:32                                                                                             ` Dmitry Gutov
2020-01-28  9:48                                                                                               ` martin rudalics
2020-01-28 15:39                                                                                                 ` Dmitry Gutov
2020-01-28 16:20                                                                                                   ` martin rudalics
2020-01-28  9:48                                                                                             ` martin rudalics
2020-01-28 15:51                                                                                               ` Dmitry Gutov
2020-01-22 17:35                                                                         ` martin rudalics
2020-01-22 22:40                                                                           ` tumashu
2020-01-25  8:41                                                                             ` martin rudalics
2020-01-25 10:17                                                                               ` Dmitry Gutov
2020-01-25 10:29                                                                                 ` Eli Zaretskii
2020-01-25 10:52                                                                                   ` Dmitry Gutov
2020-01-25 12:11                                                                                 ` martin rudalics
2020-01-25 23:01                                                                                   ` Dmitry Gutov
2020-01-26  8:43                                                                                     ` martin rudalics
2020-01-26 11:02                                                                                       ` Dmitry Gutov
2020-01-26 15:32                                                                                         ` martin rudalics
2020-01-26 21:35                                                                                           ` Dmitry Gutov
2020-01-28  9:46                                                                                             ` martin rudalics
2020-01-30  2:23                                                                                               ` Dmitry Gutov
2020-01-30  9:38                                                                                                 ` martin rudalics
2020-01-30 17:32                                                                                                   ` Dmitry Gutov
2020-01-30 18:04                                                                                                     ` martin rudalics
2020-01-30 17:42                                                                                                   ` Dmitry Gutov
2020-01-30 18:04                                                                                                     ` martin rudalics
2020-01-26 11:03                                                                                   ` Dmitry Gutov
2020-01-23  0:21                                                                           ` Dmitry Gutov
2020-01-23  0:39                                                                             ` tumashu
2020-01-25  8:42                                                                             ` martin rudalics
2020-01-16  0:04                       ` Dmitry Gutov
2020-01-16  8:04                         ` martin rudalics
2020-01-16  8:25                           ` Dmitry Gutov
2020-01-11 10:36       ` tumashu
2020-01-11 13:45         ` martin rudalics
  -- strict thread matches above, loose matches on Subject: below --
2020-01-22  8:04 tumashu
2020-01-22  9:09 ` martin rudalics
2020-01-22 10:03   ` tumashu
2020-01-22 17:33     ` martin rudalics
2020-01-22 15:55 ` Eli Zaretskii

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=44010781-43f0-3bc3-06ed-475c526dee36@gmx.at \
    --to=rudalics@gmx.at \
    --cc=dgutov@yandex.ru \
    --cc=emacs-devel@gnu.org \
    --cc=tumashu@163.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.