為什麼我不能在 Sawfish 下調整或最大化 Firefox 17 的大小?
我剛剛從 Firefox 16 升級到 Firefox 17.0.1,我的 Firefox 視窗失去了最大化按鈕。該
maximize-window
命令也不執行任何操作。在 Firefox 中切換到全屏模式會使其菜單和工具欄消失,但視窗裝飾仍然存在,視窗大小保持不變。此外,我無法將視窗大小調整為 18x108 以外的任何內容。所有這些都適用於 Firefox 16。我正在使用來自http://mozilla.org的 Firefox 二進製文件執行 Debian 擠壓。我的視窗管理器是 Sawfish 1.3.5。如果我使用 Fvwm 執行 X 會話,我可以最大化 Firefox,所以 Firefox 17 正在做一些 Sawfish 不喜歡的事情,但是什麼?
window-maximizable-p
如果視窗的最大尺寸提示小於顯示,則返回 false。最大大小提示是作為對消息的響應返回的結構中的max_width
和max_height
值。XSizeHints``WM_SIZE_HINTS
Firefox 17 聲明了最大高度和寬度,值為 0x40000000。在 Sawfish 中,該
window-size-hints
函式將這些值報告為 0。碰巧的是,Sawfish 的 Lisp 實現在整數值上使用 2 個標記位,這在 32 位機器上留下 30 位,在 64 位機器上留下 62 位。所以 2 30的值被默默地截斷為 0。我查看了 C 程式碼,以及它的編寫方式,即使在 64 位機器上也會發生這種截斷(因為 32 位
XSizeHints
成員首先移動,然後提升為long
)。正如John Siu 所發現的,這是Ubuntu 錯誤 #1083260,在與 Firefox 17相關並在郵件列表中進行了討論後,該錯誤已得到修復。
現在有一個解決方法,您可以將
.sawfishrc
.鑑於最大值 0 沒有意義,可以在 Lisp 中過濾此值並在它似乎為 0 時刪除提示。這僅解決了最大大小提示的問題,即 2 30的倍數,但僅此而已這裡足夠好。
警告:程式碼非常糟糕——sawfish 不喜歡修補僅子程序的模組(如果沒有
rep
命名空間,你將無法做很多事情——包括(require 'rep)
)。(let ((struct (get-structure 'sawfish.wm.windows.subrs))) (unless (structure-bound-p struct 'window-size-hints-before-max-truncation-fix) (let ((old-window-size-hints (eval 'window-size-hints struct))) (structure-define struct 'window-size-hints-before-max-truncation-fix old-window-size-hints) (structure-set struct 'window-size-hints (lambda (#!rest args) (let* ((hints (apply old-window-size-hints args)) (cell (cons nil hints))) (mapc (lambda (key) (let ((cell (assq key hints))) (if (zerop (cdr cell)) (setq hints (delq cell hints))))) '(max-height max-width)) hints))))))
您似乎遇到了鋸魚的錯誤:
https://bugs.launchpad.net/ubuntu/+source/sawfish/+bug/1083260
PS:用ubuntu repo測試sawfish是個壞主意,甚至無法登錄連結。