daemon 模式下awesome-tray只有不到一半长度,无法自动调整

@manateelazycat awesome-tray 很好用,但是在daemon 模式下awesome-tray只有不到一半长度。

安装

brew install emacs-plus@28 --with-xwidgets

版本 :

GNU Emacs 28.0.50 (build 1, x86_64-apple-darwin20.3.0, NS appkit-2022.30 Version 11.2.2 (Build 20D80)) of 2021-02-28

最小配置: init-mini.el

    ;;; init-mini.el --- mini config for test -*- lexical-binding: t no-byte-compile: t -*-
    ;;; Commentary:
    ;;; Code:

    ;; appearence
    (column-number-mode)
    (line-number-mode)
    (tool-bar-mode -1)
    (scroll-bar-mode -1)
    (tooltip-mode -1)

    ;; ---------------------- Load const, env and path ------------------------------
    ;; add init-*.el to load-path
    (add-to-list 'load-path (expand-file-name "core/" user-emacs-directory))

    ;; const viriable
    (require 'init-const)

    ;; add submodules to load-path
    (defun add-subdirs-to-load-path (dir)
      "Recursive add `DIR` to `load-path'."
      (let ((default-directory (file-name-as-directory dir)))
        (add-to-list 'load-path dir)
        (normal-top-level-add-subdirs-to-load-path)))
    (add-subdirs-to-load-path (expand-file-name "module/" user-emacs-directory))

    ;; ---------------------- Test module -----------------------------

    (require 'awesome-tray)
    (awesome-tray-mode 1)

    (provide 'init-mini)
    ;;; init-mini.el ends here

复现:

不使用daemon,一切正常,并且 make-frame 新建的frame 也可以自动调整


emacs -Q --load init-mini.el`

# 使用daemon,则通过`emacsclient --create-frame`创建的frame,
# tray的长度只到屏幕的一半,无法自动调整。
emacs -Q --daemon --load init-mini.el
emacsclient -n -q -a ''  -c init-mini.el

因为awesome-tray要根据当前的 frame 计算宽度来动态调整右边的padding值。 主要的函数是 awesome-tray-get-frame-width , 我猜测是Daemon没有Frame的原因。

我建议你对 awesome-tray-get-frame-width 函数进行 advice.

我看了下那个方程,

(defun awesome-tray-get-frame-width ()
  "Only calculating a main Frame width, to avoid wrong width when new frame, such as `snails'."
  (with-selected-frame (car (last (frame-list)))
    (frame-width)))

我发现我是错的,即便不用daemon模式,新建的第二个frame的tray位置也取决于第一个frame的frame width,后续新建的frame tray都和第一个frame width宽度强相关。第一个frame resize了,后续的tray 位置都会跟着变,以至于不停的偏移和闪烁。

我看注释的意思,用(last (frame-list))你是想规避临时新建的类似 posframe的窗口影响,但是这就把后续的frame tray都绑在第一个 frame width上了。

# 不使用daemon,第一个frame一切正常,
# 后续的 tray 都和第一个 frame width 绑定,不是独立的。
emacs -Q --load init-mini.el

至于daemon,那是另外一个问题。

@manateelazycat ,你估计从来不用第二个Main frame,所以一个的时候没有任何问题。。

是啊,我只用一个,但是多个的时候也没想好怎么解决。