Emacs xwidget with pdf.js

你是不是误解了?主页说的master branch是xwwp这个repo本身的branch,不是emacs master branch。

确实是我误解了:sweat_smile::sweat_smile:

真没想到 Xwidget 在 Mac 上的浏览效果这么好,很流畅,播放视频也流畅,速度很快。目前遇到的问题是没法激活Emacs-rime 输入法,但是激活系统中的 Rime 输入法是可以正常输入。

整体体验跟系统的Safari很接近了,不过手势没法使用。

Mac 上用的就是 NSView (Cocoa AppKit) and WKWebView (Safari WebKit) https://lists.gnu.org/archive/html/emacs-devel/2017-11/msg00672.html

最初的branch GitHub - veshboo/emacs: Emacs xwidget webkit support for macOS X Cocoa 还有 isearch emacs/xwidget.el at 2ce2c8b76a1ccd0aae660685bd952e4bccef20d1 · veshboo/emacs · GitHub

merged 到 Emacs master 好像删掉了 也是注入js的方式

别考虑直接使用emacs-rime了,应该是不行的。eaf,emacs-webkit都不行,把输入框里面的内容复制出来在Emacs里编辑,编辑完再复制回去是个大家都能接受的方案。

看来要用xwidget的话,输入法得使用sis+系统输入法的方案了。

我最近也遇到了一点问题,想写个 pdf-mode 但是发现用 dynamic module 里 Gtk 绘制出来的 与 Emacs 是平行,窗口不归 Emacs 管。这个该怎么设置呢?

这样的话webkit里面的文本编辑就没办法利用emacs的编辑功能了。@aqua0210

难怪显示效果跟 Safari 一模一样 :smiley:

浏览器中其实我用不到什么编辑的功能,主要还是浏览网页内容为主。Macbook 上还是会用触摸板的,现在这个效果已经很满意了。如果要编辑内容还是可以到Org-mode里面去进行。

(setq webkit-own-window nil) ?

I was also able to add experimental support for opening an non-embedded, dedicated webkit window. In principle this allows running emacs-webkit on a tty as webkit popus up its own window (of course one needs a graphical session to be running, i.e. $DISPLAY needs to be set). In testing this, I’ve found there will always be behavior out of Emacs’ control due to the window being at the mercy of the window manager, so things like focusing end up wonky and harder to control. To try this out: (setq webkit-own-window t) .

emacs-webkit 的代码我也看了,但是那个部分的代码非常简单

if (env->is_not_nil (env, args[1]))
      {
        c->container = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        //gtk_window_set_default_size
        //  (GTK_WINDOW(c->container),
        //   (n > 2) ? env->extract_integer (env, args[2]) : 400
        //   (n > 3) ? env->extract_integer (env, args[3]) : 600);

        g_signal_connect (G_OBJECT (c->container), "destroy",
                          G_CALLBACK(window_destroy), c);

        gtk_container_add (GTK_CONTAINER(c->container), GTK_WIDGET (c->view));
        gtk_widget_show_all(c->container);
      }

应该是另一个分支吧

else
    {
      GtkFixed *fixed = find_focused_fixed_widget ();
      if (fixed == NULL)
        {
          const char *err_msg = "webkit-module-no-focused-fixed-widget";
          env->non_local_exit_signal
            (env, env->intern (env, err_msg),
             env->make_string (env, err_msg, strlen (err_msg)));
          return Qnil;
        }
      webview_change_container (c, fixed);
      gtk_widget_show_all (GTK_WIDGET (c->view));
    }

找emacs窗口里的fixed widget作为container,这样就可以让Gtk绘制出来的嵌在emacs buffer里而不是显示在一个平行的窗口里

好像是这样,我试一下

你好,现在又遇到一个问题了。

观察 emacs-webkit 发现它是仅在一个 buffer 下显示的,但是如果创建一个 GtkLabel 并在找到的 Emacs fixed container 上添加、显示,发现在所有的 Emacs buffer 下都会显示这个 GtkLabel.

*scratch* buffer 同样也会显示

(defun webkit--adjust-size (frame)
  (ignore frame)
  (dolist (buffer webkit--buffers)
    (when (buffer-live-p buffer)
      (with-current-buffer buffer
        (let* ((windows (get-buffer-window-list buffer 'nomini t)))
          (if (not windows)
              (webkit--hide webkit--id)
            (let* ((show-window (if (memq (selected-window) windows)
                                    (selected-window)
                                  (car windows)))
                   (hide-windows (remq show-window windows))
                   (show-frame (window-frame show-window)))
              (webkit--move-to-x-or-pgtk-frame show-frame)
              (pcase-let ((`(,left ,top ,right ,bottom)
                           (window-inside-pixel-edges show-window)))
                (webkit--show webkit--id)
                (webkit--resize webkit--id left top
                                (- right left) (- bottom top)))
              (dolist (window hide-windows)
                (switch-to-prev-buffer window)))))))))

印象里是和这个函数有关系,根据widget对应的buffer的状态来决定是否要显示这个widget。不过太久了有点记不清了

感谢,确实是这个来保证的!