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

4

Tengo una configuración extraña para la oficina de mi hogar que me permite cambiar de un escritorio de pie a un escritorio sentado. El único problema es que cuando alterno posiciones, el monitor externo de mi computadora portátil cambia de lado. (Cuando está parado, está a la izquierda de mi computadora portátil, cuando estoy sentado está a la derecha). En este momento, cada vez que voy de sentado a estar de pie, o viceversa, tengo que ir a System Preferences -> Displays -> Arrangement y 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 el tiempo que dure el comando, ya que solo puedo darle un alias.

    
pregunta Zack 07.05.2016 - 06:03

1 respuesta

4

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

Necesitarás Xcode instalado para compilarlo.

enlace

#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):

  

asumiendo 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

    
respondido por el Stan Hutcheon 12.05.2016 - 16:17

Lea otras preguntas en las etiquetas