/osx-display-positioner

Command line tool for adjusting display positions in OS X

Primary LanguageCGNU General Public License v2.0GPL-2.0

osx-display-positioner

Command line tool for adjusting display positions in OS X.

Componenets

displaypositioner

displaymonitor

Motivation

Working on an install that involves 3 mac pros each driving 6 screens. We noticed that the machine periodically loses the screen position settings. The displaypositioner app was written to identify the issue and fix the screen positions if needed.

In our specific example, it appears the low level bug prevented the errant screen from being placed in the correct location. We were somewhat lucky enough that a system restart seemed to fix the screen positions again. After this finding, the displaywatcher python tool was created. This tool uses the displaypositioner app to see if the monitors have lost position. If they are, it will restart the machine up to 3 times and send out email notifications alerting the admins of the issue.

displaypositioner

Overview

The need for this project originated out of an install where the mac pro kept forgetting and remembering a specified display layout. This tool allows you to save the current display settings to config file, then later compare the display settings to that config file, and if you like apply changes to restore your old display layout.

Compiling:

Written as an easy to compile C program, but xcode project included anyway. To compile via gcc:

gcc -w -o displaypositioner main.c -framework IOKit -framework ApplicationServices

Usage:

The settings are stored in: ~/Library/Application\ Support/display.positioner.config

usage: DisplayPositioner -l (list display information)
       DisplayPositioner -a (apply settings from file)
       DisplayPositioner -c (compare current configuration to config file, apply changes if needed)
       DisplayPositioner -t (test current configruations to config file, make no changes)
       DisplayPositioner -p (programatic test, return str of "true" if displays match config or "false" otherwise)
       DisplayPositioner -s (save current configuration to config file)

#####-l : List current display settings

#  Display_ID   Display_ID   Resolution   Display_Origin   _____Display_Bounds_____    Rotation   Details
5  0x1a493445   441005125    1920x1200        0     0          0     0  1920  1200     0          [main]
4  0x1a493444   441005124    1920x1200    -1920     0      -1920     0     0  1200     0          

#####-a : Apply the display settings from file to the current displays if the DisplayIDs match.

441005125 - setting display to origin 	0 	0
441005124 - setting display to origin 	-1920 	0

#####-c : Compare the display settings to the config file. If DisplayIDs match but origins do not, update display settings. Note: it is intelligent when it decides to update display settings, but it will update all displays.

Monitor values differ, updating.
441005125 - setting display to origin 	0 	0
441005124 - setting display to origin 	-1920 	0

#####-t : Identical to Compare, but won't actually make changes.

Monitor values differ, would update.
Display_ID  Config_Origin  Display_Origin
441005124   -1920     0    -1920  -579

#####-p : Identical to test, but returns a simple true or false (string) if the monitors match the config settings

true

#####-s : Saves current display settings to the config file.

Stored 2 display settings to config.

displaywatcher

This is a python tool that will query the displaypositioner to see if the display is out of sync. If it is, it will retempt a reboot upto X times. It can notify via email on restarts/errors, etc.

More documentation pending, but a short description

  • enable local root ssh login (used for restart command)
  • copy config.yaml.example to config.yaml
  • update the config.yaml file, that means the following fields
    • main binary path (set it to the path of the binary)

    • location of the reboot file (set where you want to log)

    • all email fields

The delay is to give the OS enough time to initialize the displays.

! Be sure to save the your display configurations using "displaypositioner -s"