J'ai une configuration étrange pour mon bureau à domicile qui me permet de passer d'un bureau debout à un bureau assis. Le seul problème est que lorsque je change de position, le moniteur externe de mon ordinateur portable change de côté. (Quand je suis debout, il est sur la gauche de mon ordinateur portable, quand je suis assis, il est sur la droite). Pour le moment, chaque fois que je passe de la position assise à debout, ou vice versa, je dois aller dans Préférences Système -> Affichage -> Agencement
et les réorganiser. Ce que j'aimerais, c'est un genre de commande terminal qui déplace le 2e moniteur par rapport au premier. Peu importe la longueur de la commande car je peux simplement lui donner un alias.
Réponses
Trop de publicités?J'ai écrit un petit programme C pour accomplir cela, car cela ne peut être fait de manière efficace autrement.
Vous aurez besoin de Xcode installé pour le compiler.
https://github.com/stnvh/cgorigin
#import
#import
#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;
}
Enregistrez dans un fichier appelé main.m
, puis exécutez :
clang -Wall -framework Foundation -framework ApplicationServices main.m -o cgorigin
Exemple (de Github) :
en supposant que nous avons deux moniteurs connectés, tous deux à 1920x1080
cgorigin --origin -1920 0 # positionne le deuxième moniteur à gauche de l'affichage principal
cgorigin --origin 0 0 # positionne le deuxième moniteur à droite de l'affichage principal
cgorigin --origin -1920 1080 0 # positionne le premier moniteur en dessous du deuxième affichage
J'ai écrit un outil terminal gratuit appelé displayplacer qui vous permet de décrire votre mise en page et de réappliquer cette même mise en page. Cela vous permettra de configurer des profils pour modifier la résolution, la rotation et le positionnement de vos moniteurs.
Par exemple, voici mon profil de configuration à 4 moniteurs. J'ai lié cette commande à un raccourci clavier en utilisant 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"
Il est également disponible via Homebrew brew tap jakehilborn/jakehilborn && brew install displayplacer