¿Hay alguna forma de controlar la posición relativa del monitor dual desde la terminal?

Tengo una configuración extraña para mi oficina en casa que me permite cambiar de un escritorio de pie a un escritorio para sentarse. El único problema es que cuando alterno posiciones, el monitor externo de mi computadora portátil cambia de lado. (Cuando estoy de pie, está a la izquierda de mi computadora portátil, cuando estoy sentado, está a la derecha). Por el momento, cada vez que paso de estar sentado a estar de pie, o viceversa, tengo que entrar System Preferences -> Displays -> Arrangementy reorganizarlos. Lo que me encantaría es algún tipo de comando de terminal que mueva el segundo monitor en relación con el primero. No importa cuánto tiempo dure el comando, ya que solo puedo crear un alias.

Podría ser posible usar un script de GUI de Applescript y luego llamarlo desde la línea de comando usandoosascript

Respuestas (2)

Escribí un pequeño programa en C para lograr esto, ya que no se puede hacer de otra manera de manera efectiva.

Necesitará Xcode instalado para compilarlo.

https://github.com/stnvh/cgorigin


#import <Foundation/Foundation.h>
#import <ApplicationServices/ApplicationServices.h>

#define MAX_DISPLAYS 10

static CGDisplayCount dispCount = MAX_DISPLAYS;
static CGDirectDisplayID dispOnline[MAX_DISPLAYS];

int main(int argc, const char * argv[]) {
    CGDisplayCount dispOnlineCount;
    CGDisplayErr errActive = CGGetOnlineDisplayList(dispCount, dispOnline, &dispOnlineCount);

    CGDisplayConfigRef configRef;
    CGError err = CGBeginDisplayConfiguration(&configRef);

    if(!argv[1]) {
        printf("usage: [-l | --list] [[-o | --origin] x y index] \n");
        return 1;
    }

    for(int i = 0; i < dispOnlineCount; i++) {
        if(dispOnline[i]) {
            int dispWidth = CGDisplayPixelsWide(dispOnline[i]);
            int dispHeight = CGDisplayPixelsHigh(dispOnline[i]);
            CGPoint dispOrigin = CGDisplayBounds(dispOnline[i]).origin;

            if(strcmp(argv[1], "--list") == 0 || strcmp(argv[1], "-l") == 0) {
                printf("display %d: %dx%d %ldx%ld\n", i, dispWidth, dispHeight, (long)dispOrigin.x, (long)dispOrigin.y);
            }

            if(strcmp(argv[1], "--origin") == 0 || strcmp(argv[1], "-o") == 0) {
                int posX = dispOrigin.x;
                int posY = dispOrigin.y;
                int dispInd = 1;

                if(argv[2]) {
                    posX = strtol(argv[2], NULL, 0);
                }
                if(argv[3]) {
                    posY = strtol(argv[3], NULL, 0);
                }
                if(argv[4]) {
                    long _dispInd = strtol(argv[4], NULL, 0);

                    if(_dispInd < dispOnlineCount) {
                        dispInd = _dispInd;
                    }
                }

                if(dispInd == i) {
                    err = CGConfigureDisplayOrigin(configRef, dispOnline[i], posX, posY);
                }
            }
        }
    }

    err = CGCompleteDisplayConfiguration(configRef, kCGConfigurePermanently);
    if(err != 0) NSLog(@"Error with applying configuration: %d\n", err);

    return 1;
} 

Guarde en un archivo llamado main.m, luego ejecute:

clang -Wall -framework Foundation -framework ApplicationServices main.m -o cgorigin

Ejemplo (de Github):

suponiendo que tenemos dos monitores conectados, ambos a 1920x1080

cgorigin --origin -1920 0 # positions the second monitor to the left of the main display

cgorigin --origin 0 0 # positions the second monitor to the right of the main display

cgorigin --origin -1920 1080 0 # positions the first monitor below the second display

¡Impresionante! Mirando esto...

Escribí una herramienta de terminal gratuita llamada displayplacer que te permite describir tu diseño y volver a aplicar ese mismo diseño. Le permitirá configurar perfiles para cambiar la resolución, rotación y posicionamiento de sus monitores.

Por ejemplo, es mi perfil de configuración de 4 monitores. Tengo este comando vinculado a una tecla de acceso rápido usando BetterTouchTool.displayplacer "id:A46D2F5E-487B-CC69-C588-ECFD519016E5 res:3840x2160 hz:60 color_depth:8 scaling:off origin:(0,0) degree:0" "id:F466F621-B5FA-04A0-0800-CFA6C258DECD res:1440x900 color_depth:4 scaling:on origin:(-1440,1437) degree:0" "id:4C405A05-8798-553B-3550-F93E7A7722BB res:1440x2560 color_depth:8 scaling:off origin:(3840,-363) degree:270" "id:18173D22-3EC6-E735-EEB4-B003BF681F30 res:1920x1200 color_depth:8 scaling:off origin:(960,-1200) degree:0"

También está disponible a través de Homebrewbrew tap jakehilborn/jakehilborn && brew install displayplacer