|
| 1 | +#umonitor |
| 2 | +Manage monitor configuration automatically |
| 3 | + |
| 4 | +The goal of this project is to implement*desktop environment independent* dynamic monitor |
| 5 | +management. Dynamic monitor management means that the positions and resolutions |
| 6 | +of the monitors will automatically be updated whenever monitors are |
| 7 | +hotplugged. This program is written in Cython using XCB to directly communicate with the X11 server. This program is targeted at users who are using a window manager on a laptop who hotplug monitors frequently. |
| 8 | + |
| 9 | +#Installation |
| 10 | +Run`python setup.py install`. Then running`umonitor` should work. |
| 11 | + |
| 12 | +For Arch Linux users there is an AUR package[here](https://aur.archlinux.org/packages/python-umonitor-git/). |
| 13 | + |
| 14 | +#Usage |
| 15 | + |
| 16 | +* Setup your monitor resolutions and positions using`xrandr` or related tools (`arandr` is a good one). |
| 17 | +* Run`umonitor --save <profile_name>`. |
| 18 | +* Run`umonitor --listen --daemonize` to daemonize the program and begin automatically applying monitor setup. |
| 19 | + |
| 20 | +The configuration file is stored in`~/.config/umon/umon.conf`. You can load a |
| 21 | +profile manually by executing`umonitor --load <profile_name>`. Profiles can be deleted`umonitor --delete <profile_name>`. |
| 22 | + |
| 23 | +`umonitor` runs all scripts automatically in`~/.config/umon` after a profile has been loaded. |
| 24 | + |
| 25 | +Example scenario: You are working on a laptop. You want to save just the monitor |
| 26 | +configuration of just the laptop screen into the profile name called 'home'. At |
| 27 | +home you plug in an external monitor, and you want to save that configuration as |
| 28 | +'docked'. |
| 29 | + |
| 30 | +``` |
| 31 | +# With only the laptop screen (no external monitors) |
| 32 | +$ umonitor --save home |
| 33 | +Profile home saved! |
| 34 | +
|
| 35 | +# Plug in external monitor |
| 36 | +
|
| 37 | +# Setup your desired configuration |
| 38 | +$ xrandr --output HDMI-1 --mode 1920x1080 --pos 1600x0 |
| 39 | +$ xrandr --output eDP1 --mode 1600x900 --pos 0x0 |
| 40 | +
|
| 41 | +# Save the current configuration into a profile |
| 42 | +$ umonitor --save docked |
| 43 | +Profile docked saved! |
| 44 | +
|
| 45 | +# Begin autodetecting changes in monitor |
| 46 | +$ umonitor --listen |
| 47 | +home |
| 48 | +docked* |
| 49 | +--------------------------------- |
| 50 | +# Monitor is unplugged |
| 51 | +home* |
| 52 | +docked |
| 53 | +--------------------------------- |
| 54 | +``` |
| 55 | + |
| 56 | +Program help can also be viewed through`umonitor --help`. |
| 57 | + |
| 58 | +If you would like to auto start this program, you can add the program to your .xinitrc: |
| 59 | +``` |
| 60 | +$ cat ~/.xinitrc |
| 61 | +#!/bin/sh |
| 62 | +... |
| 63 | +... |
| 64 | +... |
| 65 | +umonitor --listen --daemonize |
| 66 | +exec i3 # your window manager of choice |
| 67 | +``` |
| 68 | + |
| 69 | +#Features |
| 70 | +Give me some feedback! |
| 71 | + |
| 72 | +* What is saved and applied dynamically: |
| 73 | +* Monitor vendor name + model number |
| 74 | +* Crtc x and y position |
| 75 | +* Resolution and refresh rate |
| 76 | +* Primary output |
| 77 | +* Rotation |
| 78 | +* Valgrind clean |
| 79 | + |
| 80 | +Bugs: |
| 81 | +* Tell me! Run umonitor with the`--verbose` flag to get debugging output |
| 82 | + |
| 83 | +I'm open for any feature requests! |
| 84 | + |
| 85 | +#About |
| 86 | +This is a Python rewrite of my earlier program[umonitor](https://github.com/rliou92/umonitor), which was written in C. A higher level language such as Python allows quicker development times and easier maintenance. |
| 87 | + |
| 88 | +#Credits |
| 89 | +I borrowed the edid parsing code from[eds](https://github.com/compnerd/eds). |