Как рассчитать положение с правой стороны экрана, чтобы все окно всегда отображалось на экране

В настоящее время я использую Applescript для расчета размера и положения окна слева направо, что отлично работает. Вот пример, когда я пытаюсь расположить окно как «Левую половину экрана».

tell application "System Events"
    tell application process "Xcode"
        activate
        tell window 1 to set size to {(1600) / 2, 814}
        tell window 1 to set position to {0, 0}
    end tell
end tell

Я пытаюсь работать над позиционированием окна «Правая половина экрана» (технически я могу рассчитать это, установив X = screenWidth/2, но проблема в том, что окно приложения Xcode некоторая часть экрана не видна user, где, как если бы я вычислял его справа, я могу убедиться, что все окно отображается на экране для пользователя.

Фактический результат: https://share.cleanshot.com/COYgKD

Ожидаемый результат: https://share.cleanshot.com/BIELCA

Цель: показать правую половину окна, чтобы все окно было видно пользователю на экране.

Любая помощь приветствуется

Каковы значения screenWidth, положение и размер окна на изображениях?

Willeke 20.11.2022 15:11

Как насчет x = screenWidth - windowWidth?

Willeke 20.11.2022 15:13

Каковы размеры вашего дисплея в пикселях? Ваше хромированное окно, очевидно, занимает больше половины экрана. Кроме того, вы не можете расположить окно над строкой меню так идеально, что вы должны учитывать это при своих вертикальных расчетах. Кроме того, на дисплеях Retina вам может потребоваться уменьшить вдвое используемые числа. Наконец, почему у вас есть это внутри двух блоков Tell?

Mockman 20.11.2022 15:53
1
3
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы получить размеры вашего экрана:

tell application id "com.apple.finder" to set ¬
        [null, null, screenW, screenH] to the ¬
        bounds of the desktop's window

Я считаю, что XCode поддерживает сценарии, поэтому нет необходимости вызывать системные события, чтобы получить или установить его размер и положение. Однако окна приложений с поддержкой сценариев предлагают это с помощью свойства bounds, как и desktop's window выше:

tell application id "com.apple.Xcode" to tell ¬
    window 1 to tell (a reference to its bounds)
    set [X, Y, W, H] to its contents
    set |𝚫𝓍| to W - screenW
    
    set its contents to [X - |𝚫𝓍|, Y, W - |𝚫𝓍|, H]
end tell

Это выровняет окно по правому краю экрана, даже если оно уже полностью видно на вашем экране. Чтобы он влиял на перемещение только в том случае, если это требуется, вставьте такое условие, что |𝚫𝓍| > 0.


The following is a functionally identical version of the last code block, but utilising statements that are formulated in a more explicit manner:

tell application id "com.apple.Xcode" to tell ¬
    the front window to if (it exists) then
    set [X, Y, W, H] to the bounds
    set |𝚫𝓍| to W - screenW
    set the bounds to [X - |𝚫𝓍|, Y, W - |𝚫𝓍|, H]
end tell

I added a check to make sure the front window (which is identical to and equivalent terminology for window 1) exists, so in cases where there are no windows, the script won't throw an error.

Here, the bounds property is explicitly accessed by value whenever we need to retrieve or set its value, compared to the version above where the property was being accessed by reference. In this situation, there's no tangible difference between the two methods.

из того, что я понимаю, используйте содержимое для скриптовых приложений и для не скриптового использования размера/позиции? @cjk

user4150758 21.11.2022 19:52

Нет, дело не в их скриптовости, дело в иерархии объектов. size и position — это свойства объектов класса window, которые являются дочерними элементами элементов process системных событий, что имело место в исходном сценарии. Это относится ко всем приложениям, поскольку он обходит любой интерфейс с поддержкой сценариев и просто взламывает пользовательский интерфейс для управления элементами на экране. Тем не менее, для приложений, которые поддерживают сценарии, сценарии гораздо лучше. Объекты класса window, принадлежащие родительскому элементу application (как в моем скрипте), имеют свойство bounds.

CJK 22.11.2022 06:29
contents не имеет к этому никакого отношения, но относится к тому, как я использую (a reference to...), который извлекает ссылку (или указатель) на свойство bounds, а не оценивает его сразу. Вызов contents вызывает разыменование свойства и возвращает его значение (когда оно читается) или возвращает указатель вставки (когда мы хотим установить для свойства новое значение). Возможно, мне не стоило писать решение так непрозрачно. Я добавлю версию, которая функционально идентична, но более ясна в том, как она работает.
CJK 22.11.2022 06:33

Другие вопросы по теме