更改分辨率会导致应用程序悬空

更改分辨率会导致应用程序悬空

我正在 MacBookPro(2012,视网膜显示屏之前的最新版本)上使用外接显示器。

无需连接外接显示器,我的 MacBook 的分辨率为 1440x900,使用体验很好。

在家里,我连接到具有相同分辨率的外部显示器(和镜像显示器)——生活很美好。
然而,当我来到学校并在实验室(和镜像显示器)中设置自己时,我连接到一个最大分辨率为 1280x900 的外部显示器,如下面的屏幕截图所示

屏幕分辨率截图

问题在于,随着分辨率宽度的损失,所有放大(左上角有绿色按钮)以占据全屏的应用程序往往认为它们仍然可以占据 1440 像素的宽度。这会导致这些应用程序被外部显示器切断:

在此处输入图片描述

现在,我不得不循环浏览所有应用程序的所有打开窗口,以将它们调整到适合此外接显示器的大小。此外,当我回家时,我必须重复此过程以适应 1440x900 分辨率。

有什么方法可以避免所有这些手动调整大小的操作(可能是自动的,或者甚至是当检测到分辨率变化时由 applescript 来帮我完成这些操作)?

我使用的是 Mac OS X 10.7.5 (Lion),如果有关系的话

答案1

我不确定是否有办法直接解决您的问题,例如让应用程序在镜像时知道较小屏幕的真实尺寸。

但是,我使用了两个实用程序(遗憾的是不是免费的)的组合来管理两个办公室和家之间的移动(每个办公室和家都使用不同的显示器组合连接到我的 MacBook Pro)。

他们是:

安排 (由 Trifle Apps 提供

停留 (作者:Corderless Dog

因此,Arrange 可以更快地将窗口移动到精确位置(键盘快捷键、热点角或视觉网格,随您选择),并且支持多显示器;Stay 将根据每个配置保存这些安排。因此,一旦它了解到显示器 X 意味着窗口 A 和 B 都是特定大小,它就会在下次记住,如果它们在显示器 Y 上不同,它会在您插入该显示器时更改它们。

它们都有免费试用版,所以你可以试一试,看看它们是否有帮助。很抱歉不能提供免费解决方案!

更新

我现在使用 Spectacle (作者:Eric Czarny) 而不是 Arrange。它是捐赠软件,而且在我看来更稳定。它不如 Arrange 复杂,但可以满足我的所有需求。

答案2

Stay 不是免费的,并且不能一直处理所有应用程序(它有缺陷)

一些帮助,我能够想出这个可以完美完成这项工作的 applescript:

property blacklist : {"Finder", "Preview", "Console", "AppleScript Editor", "Spotify", "TaskCoach"}
property buttonApps : {"LyX", "Eclipse"}
property buttonMaps : {{name:"LyX", Button:1, pname:"lyx"}, {name:"Eclipse", Button:2, pname:"eclipse"}}

tell application "Finder" to set theBounds to bounds of window of desktop

tell application "System Events"
    set bids to bundle identifier of processes where background only is false
end tell

repeat with bid in bids
    tell application id bid
        if name is not in blacklist then
            set appName to name as string
            if name is "Terminal" then
                set newBounds to {0, 0, (item 3 of theBounds) - 10, item 4 of theBounds}
                repeat with theWindow in windows
                    if visible of theWindow is true then
                        say appName
                        set bounds of theWindow to newBounds
                    end if
                end repeat
            else if name is not in buttonApps then
                repeat with theWindow in windows
                    if visible of theWindow is true then
                        set bounds of theWindow to theBounds
                    end if
                end repeat
            else if name is in buttonApps then
                -- get the buttonNumber
                repeat with buttonApp in buttonMaps
                    if (name of buttonApp as string) is appName then
                        set theButton to Button of buttonApp
                    end if
                end repeat
                tell application "System Events"
                    repeat with theProcess in (processes where bundle identifier is bid)
                        try
                            tell theProcess to tell window 1 to click button theButton
                        end try
                    end repeat
                end tell
            end if
        end if
    end tell
end repeat

相关内容