]> git.eshelyaron.com Git - emacs.git/commitdiff
Make xwidget motion commands hscroll the window of wide widgets
authorPo Lu <luangruo@yahoo.com>
Thu, 30 Dec 2021 07:04:18 +0000 (15:04 +0800)
committerPo Lu <luangruo@yahoo.com>
Thu, 30 Dec 2021 07:05:39 +0000 (15:05 +0800)
* lisp/xwidget.el (xwidget-info): New function declaration.
(xwidget-webkit-scroll-forward):
(xwidget-webkit-scroll-backward): Hscroll the window if the
widget is wider than the text area.  (bug#52885)

* src/xwidget.c (xwidget_scroll, xwidget_motion_notify): Apply
clip offsets to coordinates.

lisp/xwidget.el
src/xwidget.c

index ce9839ebd345f97ae088615bd578794a0b4d5127..12ee5975040b96eceac358295cceb28af77d1ae3 100644 (file)
@@ -60,6 +60,7 @@
 (declare-function xwidget-webkit-set-cookie-storage-file "xwidget.c" (xwidget file))
 (declare-function xwidget-live-p "xwidget.c" (xwidget))
 (declare-function xwidget-webkit-stop-loading "xwidget.c" (xwidget))
+(declare-function xwidget-info "xwidget.c" (xwidget))
 
 (defgroup xwidget nil
   "Displaying native widgets in Emacs buffers."
@@ -347,23 +348,36 @@ If N is omitted or nil, scroll down by one line."
 
 (defun xwidget-webkit-scroll-forward (&optional n)
   "Scroll webkit horizontally by N chars.
-The width of char is calculated with `window-font-width'.
-If N is omitted or nil, scroll forwards by one char."
+If the widget is larger than the window, hscroll by N columns
+instead.  The width of char is calculated with
+`window-font-width'.  If N is omitted or nil, scroll forwards by
+one char."
   (interactive "p" xwidget-webkit-mode)
-  (xwidget-webkit-execute-script
-   (xwidget-webkit-current-session)
-   (format "window.scrollBy(%d, 0);"
-           (* n (window-font-width)))))
+  (let ((session (xwidget-webkit-current-session)))
+    (if (> (- (aref (xwidget-info session) 2)
+              (window-text-width nil t))
+           (window-font-width))
+        (set-window-hscroll nil (+ (window-hscroll) n))
+      (xwidget-webkit-execute-script session
+                                     (format "window.scrollBy(%d, 0);"
+                                             (* n (window-font-width)))))))
 
 (defun xwidget-webkit-scroll-backward (&optional n)
   "Scroll webkit back by N chars.
-The width of char is calculated with `window-font-width'.
-If N is omitted or nil, scroll backwards by one char."
+If the widget is larger than the window, hscroll backwards by N
+columns instead.  The width of char is calculated with
+`window-font-width'.  If N is omitted or nil, scroll backwards by
+one char."
   (interactive "p" xwidget-webkit-mode)
-  (xwidget-webkit-execute-script
-   (xwidget-webkit-current-session)
-   (format "window.scrollBy(-%d, 0);"
-           (* n (window-font-width)))))
+  (let ((session (xwidget-webkit-current-session)))
+    (if (and (> (- (aref (xwidget-info session) 2)
+                   (window-text-width nil t))
+                (window-font-width))
+             (> (window-hscroll) 0))
+        (set-window-hscroll nil (- (window-hscroll) n))
+      (xwidget-webkit-execute-script session
+                                     (format "window.scrollBy(%-d, 0);"
+                                             (* n (window-font-width)))))))
 
 (defun xwidget-webkit-scroll-top ()
   "Scroll webkit to the very top."
index 5aeb2beae2dced68d4305122fb58d97ad487b177..49e15a0955c631f40e7a669a0ea87d795ec3dca9 100644 (file)
@@ -1156,7 +1156,8 @@ xwidget_motion_notify (struct xwidget_view *view,
   record_osr_embedder (view);
 
   target = find_widget_at_pos (model->widgetwindow_osr,
-                              lrint (x), lrint (y),
+                              lrint (x + view->clip_left),
+                              lrint (y + view->clip_top),
                               &target_x, &target_y);
 
   if (!target)
@@ -1198,7 +1199,8 @@ xwidget_scroll (struct xwidget_view *view, double x, double y,
   record_osr_embedder (view);
 
   target = find_widget_at_pos (model->widgetwindow_osr,
-                              lrint (x), lrint (y),
+                              lrint (x + view->clip_left),
+                              lrint (y + view->clip_top),
                               &target_x, &target_y);
 
   if (!target)