Программное изменение поворота дисплея в Mac OS с помощью Xcode

Я пытаюсь написать небольшой инструмент командной строки Objective-C, который регулирует поворот данного дисплея.

К сожалению, я не могу найти ссылку в документации Apple, в которой рассказывается, как изменить вращение (помимо его получения). Я думаю, что это нужно сделать с помощью CGDisplayModeRef, но я не могу понять, как это сделать. Любая помощь будет оценена по достоинству!


person Nicolas    schedule 25.06.2013    source источник


Ответы (2)


Извлечено из https://github.com/CdLbB/fb-rotate - кажется, IOKit может сделать работа, хотя поведение кажется мне немного странным. В двух словах:

io_service_t service = CGDisplayIOServicePort(myDisplayID); //IOKit Handle (get myDisplayID yourself)
IOOptionBits options = (0x00000400 | (kIOScaleRotate90)  << 16) //Some undocumented hex'ing
IOServiceRequestProbe(service, options); //Set rotation to display

Не забудьте поставить ссылку на IOKit.

person Nicolas    schedule 26.06.2013
comment
В OS X 10.10 я смог использовать программу для поворота внутреннего дисплея и установки основного дисплея на другой монитор, но не мог повернуть другой монитор, даже если он был установлен в качестве основного. - person Michael Scott Cuthbert; 04.01.2015
comment
Можно ли поворачивать на углы, отличные от 0, 90, 180, 270? - person Harry; 21.10.2016
comment
@Harry Если вы посмотрите на холст (для рисования), вы можете свободно вращать его, но сам дисплей ограничен этими четырьмя определенными углами. Константы: kIOScaleRotate0, kIOScaleRotate90, kIOScaleRotate180 и kIOScaleRotate270. - person Andreas; 28.02.2018

Взломал достаточно хорошее решение, используя applescript, который работает на OS El Capitan (10.11.6), поэтому YMMV. Это легко запустить с помощью Quicksilver напрямую или с помощью триггера Quicksilver, и это занимает примерно столько же времени, сколько требуется для физического поворота и настройки монитора. Надеюсь, это поможет кому-то!

Этот яблочный скрипт переключает целевой дисплей «DELL U2414H» в портретный режим с поворотом на 270 градусов. Обратите внимание, что строка «DELL U2414H» взята из заголовка окна, представляющего указанный дисплей в разделе «Системные настройки» > «Дисплеи». Не уверен, что произойдет, если он запустится, когда есть два дисплея одной марки и модели — не стесняйтесь сообщать о результатах. Легкими потенциальными улучшениями было бы заставить его проверять состояние и переключаться между двумя наиболее часто используемыми ориентациями, но нехватка времени и документации означала, что это было достаточно хорошо для моего варианта использования как есть. ¯\_(ツ)_/¯

tell application "System Preferences"
    activate
end tell

tell application "System Events"
    delay 1
    click UI element "Displays" of scroll area 1 of window "System Preferences" of application process "System Preferences"

    delay 1
    click window "DELL U2414H" of application process "System Preferences"

    delay 1
    click pop up button 2 of tab group 1 of window "DELL U2414H" of application process "System Preferences"

    -- select 270° for portrait, for landscape replace 4 with "Standard" (with quotes)
    delay 1
    click menu item 4 of menu 1 of pop up button 2 of tab group 1 of window "DELL U2414H" of application process "System Preferences"

    -- click the "Confirm" button, not necessary for "Standard" orientation
    delay 5
    click UI element "Confirm" of sheet 1 of window "DELL U2414H" of application process "System Preferences"
end tell

tell application "System Preferences"
    quit
end tell
person codeanpeace    schedule 11.12.2018