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 -> 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 cuánto tiempo dure el comando, ya que solo puedo crear un alias.
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
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
JMY1000
osascript