我刚刚从 Firefox 16 升级到 Firefox 17.0.1,我的 Firefox 窗口丢失了最大化按钮。该maximize-window
命令也不执行任何操作。在 Firefox 中切换到全屏模式会使其菜单和工具栏消失,但窗口装饰仍然存在,并且窗口大小保持不变。另外,我无法将窗口大小调整为 18x108 以外的任何大小。所有这些都适用于 Firefox 16。
我正在运行 Debian squeeze,以及 Firefox 二进制文件http://mozilla.org。我的窗口管理器是 Sawfish 1.3.5。如果我使用 Fvwm 运行 X 会话,我可以最大化 Firefox,因此 Firefox 17 正在做 Sawfish 不喜欢的事情,但是什么呢?
答案1
你似乎遇到了锯鳐的虫子:
https://bugs.launchpad.net/ubuntu/+source/sawfish/+bug/1083260
PS:用 ubuntu 仓库测试 sawfish 是个坏主意,甚至无法登录关联。
答案2
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
)。
作为萧约翰发现, 这是Ubuntu 错误 #1083260这是与 Firefox 17 相关后已修复与一个邮件列表中的讨论。
现在,您可以在您的 中找到一个解决方法.sawfishrc
,至少可以让 Firefox 17 正常工作。
鉴于最大值 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))))))