4 votos

Hay una forma de control de monitor doble posición relativa de la terminal?

Tengo un extraño para mi oficina en casa que me permite cambiar de un pupitre a una sala de escritorio. El único problema es que cuando yo posiciones alternas, mi ordenador portátil del monitor externo cambia de lado. (Cuando está de pie es a la izquierda de mi laptop, cuando se sienta que está a la derecha). Por el momento, cada vez que puedo pasar de sentado a de pie, o vise-versa tengo que ir a System Preferences -> Displays -> Arrangement y reorganizar. Lo que me encantaría es una especie de comando de terminal que se mueve el 2º monitor relativa a la primera. No importa cuánto tiempo el comando es ya sólo puedo alias.

4voto

up_the_irons Puntos 231

Escribí un pequeño programa en C para lograr esto, ya que esto no puede ser hecho en cualquier otro modo de manera eficaz.

Usted 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;
} 

Guardar en un archivo llamado main.m, a continuación, ejecute:

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

Ejemplo (desde Github):

suponiendo que tenemos dos monitores conectados, tanto en 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

2voto

Risse Puntos 23

Por desgracia, esto no puede ser hecho. Esto es controlado por el Buscador, y no hay una variable accesible por Terminal.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X