为什么我无法在 Sawfish 下调整 Firefox 17 的大小或最大化?

为什么我无法在 Sawfish 下调整 Firefox 17 的大小或最大化?

我刚刚从 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_heightXSizeHintsWM_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))))))

相关内容