{"id":13683070,"url":"https://github.com/digitaltrails/vdu_controls","last_synced_at":"2025-04-30T12:33:16.113Z","repository":{"id":37879820,"uuid":"402229935","full_name":"digitaltrails/vdu_controls","owner":"digitaltrails","description":"VDU controls - a control panel for monitor brightness/contrast/...","archived":false,"fork":false,"pushed_at":"2024-11-08T01:29:19.000Z","size":9327,"stargazers_count":117,"open_issues_count":7,"forks_count":4,"subscribers_count":4,"default_branch":"master","last_synced_at":"2024-11-08T02:30:17.154Z","etag":null,"topics":["bh1750","ddc","ddcutil","gui","gy-30","gy-302","linux","mccs","python","qt5"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/digitaltrails.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-09-01T23:28:15.000Z","updated_at":"2024-11-08T01:29:23.000Z","dependencies_parsed_at":"2023-11-11T20:30:49.854Z","dependency_job_id":"5f6ed7a8-ebc8-4759-af41-07bc290224e2","html_url":"https://github.com/digitaltrails/vdu_controls","commit_stats":null,"previous_names":[],"tags_count":55,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitaltrails%2Fvdu_controls","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitaltrails%2Fvdu_controls/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitaltrails%2Fvdu_controls/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitaltrails%2Fvdu_controls/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/digitaltrails","download_url":"https://codeload.github.com/digitaltrails/vdu_controls/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224211911,"owners_count":17274342,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bh1750","ddc","ddcutil","gui","gy-30","gy-302","linux","mccs","python","qt5"],"created_at":"2024-08-02T13:01:59.439Z","updated_at":"2025-04-30T12:33:16.102Z","avatar_url":"https://github.com/digitaltrails.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"vdu_controls - a DDC control panel for monitors\n===============================================\n\nA control panel for external monitors (*Visual Display Units*).\n\n\u003e **KDE 6** introduced energy saving brighness dimming after 5 minutes of idle\n\u003e time.  This may interfere with changes made via **vdu_controls**, including\n\u003e *scheduled-presets* and *ambient-light-control*.  The relevant KDE 6 options can \n\u003e be found under ***System Settings -\u003e System -\u003e Energy Saving***.\n\n\u003e **vdu_controls version 2.0** adds manual ambient-light-level input.  This allows all connected VDU's\n\u003e to be simultatiniously adjusted by moving one slider.  This is an alternative\n\u003e to fully automatic control via hardware lux-metering.  When the ambient-light-level\n\u003e is changed, each VDU us adjusted according to its own custom light-level/brighness\n\u003e profile defined under ***Settings-\u003eLight-Metering***. This new option is enabled\n\u003e by default, but can be disabled by unchecking  ***Settings-\u003eLux options enabled***.\n\u003e\n\u003e  ![Custom](screen-shots/ambient-slider-example.png) \n\u003e\n\u003e The second major change in 2.0 is actually far more wide-reaching, but much less visibile.\n\u003e The  internal DDC/VDU interface has been rewritten to optionally use the\n\u003e D-Bus [ddcutil-service](https://github.com/digitaltrails/ddcutil-service) instead\n\u003e of the **ddcutil** command. The new **ddcutil-service** is a daemon I've written to\n\u003e interface with **libddcutil**. The service is faster and more reliable making for \n\u003e a smoother control experience. The service is able to detect and forward DPMS \n\u003e connection-events so vdu_controls can automatically respond to changes in VDU \n\u003e connection status, such as hot-plugging, power on/off, or reconnects due to return\n\u003e from PC-hibernation.\n\u003e \n\u003e Should the ddcutil-service be unavailable, the DDC/VDU interface reverts to using \n\u003e the ddcutil command.\n\u003e \n\u003e Prebuilt vdu_control OpenSUSE and AUR packages optionally recommand ddcutil-service. \n\u003e Depending packaging settings, the service may be automatically installed when you\n\u003e install vdu_controls. \n\u003e \n\u003e OpenSUSE Tumbleweed RPM:\n\u003e \n\u003e    https://software.opensuse.org/package/ddcutil-service\n\u003e \n\u003e AUR (Arch Linux User Repository):\n\u003e \n\u003e    https://aur.archlinux.org/packages/ddcutil-service\n\u003e\n\u003e If your distro lacks a packaged version of the service, you could manually\n\u003e build and install it from source. It's a single C file and will build against \n\u003e any libddcutil from 1.4 onward.  It needn't  be installed as root, it can be started\n\u003e manually from the command line or installed as a single user D-Bus daemon.\n\u003e For install/build details, see:\n\u003e \n\u003e    https://github.com/digitaltrails/ddcutil-service\n\u003e \n\u003e The service can be installed for on demand access via the D-BUS daemon. It can also\n\u003e run manually from the command line.  Once the service is running, any new \n\u003e instance of vdu_controls should automatically find and connect to the service.\n\u003e When using the service, the bottom line of vdu_controls **About Dialog** will\n\u003e list **ddcutil-interface** as **1.0.0 (QtDBus client)**.  Use of the service can\n\u003e be manually toggled via `vdu_controls-\u003eSettins-\u003edbus client enabled`.\n\u003e \n\u003e The service may also be accessed from generic D-Bus clients such as d-feet \n\u003e dbus-send and busctl.\n\u003e \n\nDescription\n-----------\n\n``vdu_controls`` is a virtual control panel for externally connected VDUs.  The application detects \nDVI, DP, HDMI, or USB connected VDUs.  It provides controls for settings such as brightness and contrast.\n\nThe application interacts with VDUs via the VESA *Display Data Channel* (*DDC*) *Virtual Control Panel*  (*VCP*) \ncommands set.  DDC VCP interactions are mediated by the ``ddcutil`` command line utility.  ``Ddcutil`` provides\na robust interface that is tolerant of the vagaries of the many OEM DDC implementations.\n\nBy default ``vdu_controls`` offers a subset of controls including brightness, contrast and audio controls.  Additional\ncontrols can be enabled via the ``Settings`` dialog.  \n\n``vdu_controls`` may optionally run as an entry in the system tray of KDE, Deepin, GNOME, and Xfce (and possibly\nothers). The UI attempts to adapt to the quirks of the different tray implementations.\n\nNamed ``Preset`` configurations can be saved for later recall. For example, a user could create\npresets for night, day, photography, movies, and so forth.  Presets may be automatically triggered\naccording to solar elevation, and can be further constrained by local weather conditions (as\nreported by [https://wttr.in](https://wttr.in)).  Presets may also be activated by UNIX signals.\n\nFrom any application window, use `F1` to access help, and `F10` to access the context-menu.   The \ncontext menu is also available via the right-mouse button in the main-window, the hamburger-menu item \non the bottom right of the main window, and the right-mouse button on the system-tray icon. The \ncontext-menu provides `ALT-key` shortcuts for all menu items (subject to sufficient letters being\navailable to support all user defined Presets).\n\n_Version 1.10_ introduces options for using lux readings from a hardware lux meter (or in some \ncases a webcam).  When lux metering is enabled, ``vdu_controls`` can vary brightness according \nto customisable  lux/VDU-brightness profiles. See [Lux Metering](./Lux-metering.md) for more details.\n\nThe UI's look-and-feel dynamically adjusts to the desktop theme and desktop environment: light-theme,\ndark-theme, KDE, Deepin, GNOME, and others.  Both X11 and Wayland are supported.\n\n![Default](screen-shots/Screenshot_Large-330.png)  ![Custom](screen-shots/Screenshot_Small-227.png) \n![Custom](screen-shots/Screenshot_tray-200.png) ![Custom](screen-shots/Screenshot_settings-300.png)\n![Custom](screen-shots/presets.png) ![Custom](screen-shots/lux-profiles.png)\n\nDoes adjusting a VDU affect its lifespan or health?\n---------------------------------------------------\n\nRepeatably altering VDU settings might affect VDU lifespan.  Possible reasons \ninclude the consumption of NVRAM write cycles, stressing the VDU power-supply, \nor increasing the LED panel burn-in.  \n\nHow many writes VDU NVRAM can accommodate is unknown, it is likely to vary by model\nand vintage. VDUs from past decades are likely to have NVRAM that can accommodate\n10,000 to 100,000+ writes depending on the technology employed. For a ten year lifespan\nthis might indicate a sustainable limit of only 2.7 writes per day or 27 writes per \nday respectively.\nSome modern types of NVRAM have upper limits that are for practical purposes unlimited, but\nthe level of uptake of such technologies by the manufacturers is unknown (brighter\nback-lights, along with scene and gaming options, would appear to require increased\ndurability).\n\nA vintage-2010 VDU, that has been used for four years of intensive testing of \nvdu_controls, now shows signs of of the NVRAM having bad blocks.  After loss of \npower the VDU will sometimes revert to its factory defaults, but not always, which \nsuggests the NVRAM is being cycled through and only some of it is bad.  This experience\nmay indicate a write limit of at least 100,000 for a VDU of this vintage. I've \nsubsequently implemented the ___initialization-preset___ feature as a fallback \nfor failed NVRAM, so the problem with this VDU is, for the most part, eliminated.\n\nAll that said, ``vdu_controls`` does include a number of features that can be used \nto reduce the frequency of writes to VDU NVRAM:\n\n#### Inbuilt mitigations:\n\n + Slider and spin-box controls only update the VDU when adjustments become slow or stop (when no change occurs in 0.5 seconds).\n + Preset restoration only updates the VDU values that differ from its current values.\n + Transitioning effects and transition controls have been disabled by default and are \n   deprecated for version 2.1.0 onward.\n + Automatic ambient brightness adjustment only triggers a change when the proposed brightness differs from the current brightness by at least 10%.\n\n#### Electable mitigations:\n\n + Choose to restore pre-prepared ‘presets’ instead of dragging sliders.\n + Refrain from adding transitions to presets.\n + If using the ambient-light brightness response curves, tune the settings and curves to avoid frequent small changes.\n + If using a light-meter, disengage metered automatic adjustment when faced with rapidly fluctuating levels of ambient brightness.\n + Consider adjusting the ambient lighting instead of the VDU.\n\n#### Monitoring to assist with making adjustments:\n\n  + Hovering over a VDU name in the main window reveals a popup that includes\n    the number of VCP (NVRAM) writes. \n  + The bottom of the About-dialog shows the same numbers. They update dynamically.\n\n#### Other concerns\n\nGoing beyond the standard DDC features by experimenting with undocumented-features \nor undocumented-values has the potential to make **irreversible** changes.\nConsider the potential cost in time and money before trying anything speculative.\n\nThe power-supplies in some older VDUs may buzz/squeel audibly when the brightness is\nturned way down. This may not be a major issue, in normal circumstances\nolder VDUs are often not usable below 85-90% brightness.\n\nGetting Started\n---------------\n\n\u003e The long term affects of repeatably rewriting a VDUs setting are not well understood, but some\n\u003e concerns have been expressed. See [below](https://github.com/digitaltrails/vdu_controls?tab=readme-ov-file#does-adjusting-a-vdu-affect-its-lifespan-or-health)\n\u003e for further details.\n\nTo get started with ``vdu_controls``, you only need to download the ``vdu_controls.py`` python script and\ncheck that the dependencies described below are in place.  Alternatively, should you wish to install ``vdu_controls`` \nfor all users, RPMs are available for **OpenSUSE**, **Fedora**, and there is an  **archlinux** AUR package\nwhich also works in **Manjaro**.  See the *Install* section below. \n\n\u003e Development is **trunk-based**.  It is my intention that the trunk should \n\u003e always be usable as a daily-driver.  That being said, a download of trunk is likely to \n\u003e be less stable than downloading one of the formal [releases](https://github.com/digitaltrails/vdu_controls/releases) \n\u003e or installing one of the packages that are available in various distros.\n\nDependencies\n------------\n\nAll the following runtime dependencies are likely to be pre-packaged on any modern Linux distribution \n(``vdu_controls`` was originally developed on OpenSUSE Tumbleweed).\n\n* **ddcutil \u003e= 1.2, \u003e= 1.4 recommended**: the command line utility that interfaces to VDUs via DDC over i2c-dev or USB. (If \n  anyone requires support for versions of ddcutil prior to v1.2 please contact me directly.)\n* **i2c-dev**: the i2c-dev kernel module normally shipped with all Linux distributions and required by [ddcutil](https://www.ddcutil.com)\n* **python \u003e=3.8**: ``vdu_controls`` is written in python and may depend on some features present only in 3.8 onward.\n* **python \u003e=3.8 QtPy**: the python GUI library used by ``vdu_controls``.\n\nIt's best to confirm that ``ddcutil`` is functioning before using ``vdu_controls``:\n\n* See [https://www.ddcutil.com/config/](https://www.ddcutil.com/config/) for instructions on configuring ``ddcutil``\n  (including some extra steps for Nvidia GPU users).\n* See [https://www.ddcutil.com/i2c_permissions/](https://www.ddcutil.com/i2c_permissions/) for instructions on setting \n  and testing the required permissions.  \n* Fo some VDUs, DDC/CI over Display-Port to Display-Port connections may work when others \n  connections don't (mainly with some Nvidia GPUs).\n\nAs of ddcutil 1.4, installing a pre-packaged ddcutil will most likely set the correct udev rules to \ngrant users access to the required devices.  If you are using an earlier ddcutil, it may be necessary to follow \nall the steps detailed in the links above.  \n\nInstalling\n----------\n\nAs previously stated, the ``vdu_vontrols.py`` script is only file required beyond the prerequisites. There\nare also **OpenSUSE** RPMs available at: [https://software.opensuse.org/package/vdu_controls](https://software.opensuse.org/package/vdu_controls),\nsome unoffical **Fedora** RPMs available at: [build.opensuse.org](https://build.opensuse.org/projects/home:mchnz/packages/vdu_controls/repositories/Fedora_37/binaries)\nand an **archlinux** (**manjaro** compatible) **AUR** package at: [https://aur.archlinux.org/packages/vdu_controls](https://aur.archlinux.org/packages/vdu_controls)\n\nThat makes three options for \"installation\": \n\n1. The script can be run without installation by using a python interpreter, for example:\n   ```\n   % python3 vdu_controls.py\n   ```\n2. The script can be self installed as desktop application in the current user's desktop menu \n   as *Applications-\u003eSettings-\u003eVDU Controls* by running:\n   ```\n    % python3 vdu_controls.py --install\n   ```\n      Depending on which desktop you're running menu changes may require logout before they become visible.\n3. A system-wide installation using a distribution's packaging system which will install all of:\n\n   ```\n   /usr/bin/vdu_controls\n   /usr/share/applications/vdu_controls.desktop\n   /usr/share/licenses/vdu_controls/LICENSE.md\n   /usr/share/vdu_controls/icons/*\n   /usr/share/vdu_controls/sample-scripts/*\n   /usr/share/vdu_controls/translations/*\n   /usr/share/man/man1/vdu_controls.1.gz\n   ```\n\nPlease note the first two options only install ``vdu-controls`` for the current user.  The script and desktop-file \ninstalled for a single user could be modified and copied into /usr or /usr/local hierarchies should you \nwish to do so.  If using the first two options, you might want to follow up by manually downloading\nsome of the other items such as the [starter set of icons](icons) for use when creating Presets.\n\nExecuting the program\n---------------------\n\n* If installed from rpm, **VDU Controls** should be in everyone's application menu under **Settings**. \n  The ``vdu_controls`` command will also be in everyone's ``PATH`` and will be able to be run from the command\n  line, for example:\n     ```\n     % vdu_controls --show brightness --show contrast --show audio-volume\n     ```\n* If installed by the current user via the ``--install`` option, **VDU Controls** should be in\n  the current user's application menu under **Settings**. The ``vdu_controls`` command will be in ``$HOME/bin``.\n  If ``$HOME/bin`` is on the user's ``PATH``, ``vdu_controls`` will be also able to be run from the command\n  line in the same manner as above.\n* If the script has not been installed, it can still be run on the command line via the python interpreter, \n  for example:\\\n  ``% python3 vdu_controls.py --no-splash --system-tray --show brightness --show contrast``\n\nHelp\n----\n\nDetailed help can be accessed by using the right mouse-button to bring up a context-menu.  Access to the context-menu\nis available in the application-window and in the system-tray icon.\n\nBoth brief help and detailed help can also be accessed via the command line:\n```\n% python3 vdu_controls.py --help\n% python3 vdu_controls.py --detailed-help\n% python3 vdu_controls.py --detailed-help | pandoc --from markdown --to html \u003e vdu_controls_help.html\n# or if installed as an executable:\n% vdu_controls --help\n% vdu_controls --detailed-help\n% vdu_controls --detailed-help | pandoc --from markdown --to html \u003e vdu_controls_help.html\n```\n\nWhether run from the desktop application-menu or run from the command line, ``vdu-controls`` behaviour can be altered\nin a number of ways:\n\n* The `Settings` item in the context-menu.\n* Command line options.\n* Configurations files in `$HOME/.config/vdu_controls/`\n\nSee the context-menu or the  [man page](https://htmlpreview.github.io/?https://raw.githubusercontent.com/digitaltrails/vdu_controls/master/docs/_build/man/vdu_controls.1.html)\n for details.\n\nVDU controls and optimisations can be specified in the global or VDU-specific config-files.\n\nBugs and Suggestions\n--------------------\nIf you encounter a bug or issue, or wish to make a suggestion, you're most welcome to raise \nit on the [issues page](https://github.com/digitaltrails/vdu_controls/issues).\n\nDevelopment\n-----------\n\nI've set up the ``vdu_controls`` source as a typical Python development, but there is only one real source\nfile, ``vdu_controls.py``, so the file hierarchy is rather over the top.  A standard python distributable \ncan be built by issuing the following commands at the top of the project hierarchy:\n```\n% python3 -m pip install build\n% python3 -m build\n...\n% ls -1 dist/\ntotal 268\nvdu_controls_digitaltrails-1.0.0-py3-none-any.whl\nvdu_controls-digitaltrails-1.0.0.tar.gz\n```\n\nThe source includes configuration files for the \n[Sphinx Python Documentation Generator](https://www.sphinx-doc.org/en/master/index.html). \nThe following commands will extract documentation from ``vdu_controls.py``:\n```\n% cd docs\n% make man\n% make html\n```\nI prefer [Pandoc](https://pandoc.org/)'s HTML generation. There is a util script that generates the\nSphinx outputs and then pandoc for the html:\n```\n% ./util/make-man\n```\n\nMy IDE for this project is [PyCharm Community Edition](https://www.jetbrains.com/pycharm/).\n\nCoverage testing is assisted by [Coverage.py](https://coverage.readthedocs.io/) and [Vulture](https://pypi.org/project/vulture/).\nType checking is assisted by [Mypy](https://mypy.readthedocs.io/).\n\nMy development Linux desktop is [OpenSUSE Tumbleweed](https://get.opensuse.org/tumbleweed/). The python3\ninterpreter and python3 libraries are from the standard Tumbleweed repositories. \n\nAcknowledgements\n----------------\n\n* Sanford Rockowitz ([rockowitz](https://github.com/rockowitz)), for the robust [ddcutil](https://github.com/rockowitz/ddcutil) utility and all the friendly help and assistance.\n* Mark Wagie ([yochananmarqos](https://github.com/yochananmarqos)), for Gnome related suggestions and AUR port.\n* Denilson Sá Maia ([denilsonsa](https://github.com/denilsonsa)), for many suggestions, assistance, and contributions.\n* Matthew Coleman ([crashmatt](https://github.com/crashmatt)), Mark Lowne ([lowne](https://github.com/lowne)), [usr3](https://github.com/usr3),\n  Mateo Bohorquez G. ([Milor123](https://github.com/Milor123)), Andrew Sun ([apsun](https://github.com/apsun)), \n  Extent ([Extent421](https://github.com/Extent421))\n  for contributing fixes to code and documentation.\n* [Jakeler](https://github.com/Jakeler), [kupiqu](https://github.com/kupiqu), Mateo Bohorquez ([Milor123](https://github.com/Milor123)), Johan Grande ([nahoj](https://github.com/nahoj)), \n  [0xCUBE](https://github.com/0xCUB3), [RokeJulianLockhart](https://github.com/RokeJulianLockhart), [abil76](https://github.com/abil76), Andrew Sun ([apsun](https://github.com/apsun))\n  for contributing suggestions for enhancements. \n* Malcolm Lewis ([malcolmlewis](https://github.com/malcolmlewis)) for assistance with the OpenSUSE Open Build Service submissions.\n* Christopher Laws ([claws](https://github.com/claws)) for the [BH1750 library](https://github.com/claws/BH1750) \n  and [example build](https://github.com/claws/BH1750#example) (lux-metering).\n* Plus others who have supplied feedback and suggestions.\n\nAuthor\n------\n\nMichael Hamilton\n\nVersion History\n---------------\n\n* 2.3.0\n  * Fix the doze function, this improves the responsiveness of all slider controls.\n  * Fix an infinite loop if menu-\u003equit is used when the \"Failed to obtain capabilities\" dialog is showing.\n  * The Settings-Dialog has been reorganized to make it scrollable.\n  * When lux options are enabled, the tray will show the icon for current light-level (if no preset is active). \n  * Renamed two light-light levels more appropriately (room becomes subdued, rise-set becomes twilight).\n  * Support a user-defined ddcutil-emulator executable for controlling laptop-panels \n    or other non-DDC-capable displays. A template sample emulator written in bash is included \n    as a DIY starter (sample-scripts/laptop-ddcutil-emulator.bash).\n  * Add smart-uses-xcb option to control the use of XWayland for the smart positioning of windows (defaults to yes).\n  * Fix title-bars on sub-windows in COSMIC. \n  * The About Dialog now includes some desktop and platform information.\n  \n* 2.2.0\n  * Add a vdu-name option for assigning meaningful/user-friendly names to each VDU.\n  * Implement an order-by-name option that orders lists and tabs by VDU name.\n  * Hovering over a settings-dialog tab-name or save-button reveals the settings-filename as a tooltip. \n  * If smart-window is enabled in a Wayland desktop, automatically use XWayland. (Wayland\n    doesn't allow an application to precisely place it's own windows!)\n  * Altering the smart-window option now requires a restart (due to the Wayland/XWayland changes).\n  * The smart-window option save/restore of main-window has been made more consistent.\n  * The COSMIC desktop is treated as GNOME-like (the system-tray right-mouse menu includes a \"control-panel\" menu-item).  \n\n* 2.1,4\n  * Provide a setting for enabling dbus-events - ddcutil-service DPMS and hotplug detection. \n  * Default the dbus-event setting to off, which is less troublesome for some VDUs/GPUs/drivers.\n\n* 2.1.3\n  * Fix the error-dialog option \"Ignore-VDU\" when ddcutil cannot communicate with a VDU.  \n  * Avoid abrupt u-turns in automatic brightness, don't reassess the lux level while making an adjustment.\n  * Update the EDID-parser to accept the command line output from ddcutil 2.2 (for those not using ddcutil-service).\n\n* 2.1.2\n  * Replace the Preset-scheduler with an implementation that remains accurate after PC-sleep/hibernation.\n  * Fix the day-rollover which was scheduling for the wrong day if triggered at 12:59:59. \n  * When performing a set-vcp, don't increment the NVRAM write count if the VDU doesn't respond.\n  * When reconfiguring VDU controllers, discard pending VDU VCP changes from previous controllers. \n  * Eliminate a potential for deadlock when handling change-events from ddcutil-service.\n  * Better handle ddcutil-service unexpected event types (don't raise an error dialog).\n  * The main window height will now automatically resize to accommodate the number of controls present.\n  * Toggling lux brightness-interpolation now immediately updates the profile-plot to reflect the change.\n  * Fix the Lux Dialog, it was turning off interpolation when first constructed.\n  \n* 2.1.1\n  * Removed --dbus-signals-enabled. DBus signals are now always enabled when --dbus-client\n    is enabled.\n  * Fix the active Preset icon display which was sometimes incorrect after DPMS-sleep or errors. \n  * Fix a code regression when handling non-DDC-capable VDUs (fix status=-3020 exception).\n  * The About-Dialog now includes counts of per-VDU set_vcp/NVRAM-writes.\n  * Hovering over a VDU-name in the main-window reveals the write count for that VDU.\n  * Minor changes to reduce unnecessary work and improve log messages.\n\n* 2.1.0\n  * Preset _transitions_ have been deprecated.  All presets are now restored instantly no \n    matter how they have been set to transition.  The Preset-Dialog controls for assigning\n    transitions have been hidden.   __All  transition related code may be removed in a future \n    version, please contact me or comment on issue #93 if you prefer transitions to be retained.__\n  * Transitions and related controls can be re-enabled by disabling `protect-nvram` in the _Settings-Dialog_. \n  * To avoid unnecessary updates, preset restoration now queries the VDU's existing\n    values. This may slow down preset restoration.\n  * Lux-metered auto adjustment has been defaulted to 10 minute intervals (up from 5).\n  * Color-Preset (VCP code 0x14) has been added to the list of standard controls.\n  * Added a VDU  ___Initializer-Preset___ feature to provide a replacement for dead NVRAM.\n    This also provides a way to restore settings not persisted in VDU NVRAM.  A VDU's initializer-preset is \n    automatically run if the target VDU is present at startup or is subsequently detected.\n    Any preset that has a name that matches a VDU model and serial-number will be treated\n    as an Initializer-Preset. \n  * The ___Preset-Dialog___ now includes a tool-button  to the right of the preset-name entry \n    that will create a VDU specific ___Initializer-Preset___.\n  \n* 2.0.4\n  * The About-Dialog now refreshes the ddcutil version info on each invocation. \n  * Increased dbus timeout to 10 seconds (in case numerous VDUs or errors slow down VDU detection).\n  * Dynamically enable a scroll-area when the main-panel exceeds the available screen height.\n  \n* 2.0.3\n  * Reduce the number of writes to VDU NVRAM by sliders, spinners, and ambient brightness adjustments.\n    * Slider and spin-box controls now only update the VDU when adjustments become slow or stop (when \n      the control value remains constant for 0.5 seconds).\n    * Spin-Boxes now select the entire text on focus in (enables easier overtyping and decreases VDU updates).\n    * Ambient lighting initiated changes in brightness of up to 20% are applied without any transitional \n      steps (plus the existing code ignores updates of less than 10%). \n    * Set the default ambient-light brightness adjustment-interval to 5 minutes.\n  * React to DPMS awake signal from ddcutil-service by re-assessing ambient brightness.\n  * Simplified locking and conformed to a locking hierarchy/protocol to avoid potential deadlocks.\n\n* 2.0.2\n  * Added a *refresh* annotation suffix for use with VCP-codes which cause multiple changes.\n  * Make manual adjustment of the ambient Light Level more accurate and responsive.\n  * Updates are sent to the VDU as sliders are dragged (rather than only on release).\n  * Fix exception on monitors that return invalid/unexpected combo-box VCP values.\n  * Fix exception on monitors with blank VCP value descriptions.\n  * When refresh is pressed, only auto adjust ambient brightness if auto-brightness is enabled.\n  * Don't automatically refresh on error, eliminate popup dialog loops.\n  * Eliminate deadlocks when exceptions occur.\n  * Cleanup the initialisation of the ddcutil-service connection.\n  * Add more caveats and limitations to the documentation.\n  * Fix manual ambient light slider when light meter is uninitialized.\n  * Promote Simple-Non-Continuous values whose metadata exceeds one-byte to two-byte Complex-NC.\n  \n* 2.0.1\n  * Fix D-Bus client code for python versions prior to 3.11.\n  * Fix infinite-loop when altering an existing FIFO lux-meter in the Lux-Dialog.\n  * Fix the refresh of the LuxDialog meter-readout/plot when changing to a new meter.\n  * Apply context-aware defaults to the LuxDialog device file-chooser. \n  * Improve/fix the handling of displays/laptop-displays that may be detected but lack proper DDC.\n  * Force the file-picker to always show devices and FIFOs - it wasn't showing then on some desktops.\n\n* 2.0.0\n  * Added an optional D-Bus interface to ddcutil for up to 10x faster response times.\n  * Added an immediate-lighting-check button and corresponding context-menu item (when lux-metering is enabled).\n  * Added an ambient-light-control for manual lux input, one slider to adjust brightness on all displays.\n  * Added more preset icons.\n\n* 1.20.0\n  * Added options monochrome-tray and mono-light-tray to enable a monochrome tray-icon (dark and light).\n  * Optional $HOME/.config/vdu_controls/tray_icon.svg overrides the normal tray icon.\n  * Improved the adjustment of icon/window dimensions by scaling them in respect to the user's default-font height.\n  * Remove adjust-for-dpi in favour of the the above which automatically accounts for DPI.\n  * When a Preset is transitioning slowly (i.e. not immediately), the UI controls can be used to stop the transition.\n  * Considerable internal refactoring of option handling.\n\n* 1.12.0\n  * Added an F10_key context menu shortcut to all application windows (KDE accessibility standard).\n  * Set icon and pixmap sizes appropriately for Normal and High DPI (controlled by adjust-for-dpi) (issue #63).\n  * Icon/device-chooser-dialog: init-time reduced from 30 to 5 seconds for users with large home folders (issue #61).\n  * Improvements/Fixes to the vlux_meter.py sample-script and the related vdu_controls FIFO reader.\n  * Improved visibility of the app-icon's preset-transitioning indicator and auto-lux indicator.\n  * Increased contrast for generated text preset-abbreviation icons.\n  * Encode translations in plain text rather than escaped XML (for easier editing).\n\n* 1.11.1\n  * Fix Preset text size in tray icon.\n  * Fix occasional concurrency lockup issue in lux_metering.\n  * Update the Settings Dialog when a new VDU becomes available.\n  * Light-metering: show both a lux-auto indicator (an orange \"LED\") AND the current preset (if any) in the app icon.\n  * Fix first time use crash (issue #60).\n  * Allow % in config files by turning off ConfigParser interpolation (issue #60).\n* 1.11.0\n  * Made vdu_controls ddcutil-2.0-ready.\n  * Added support for ddcutil versions earlier than 1.3 (issue #43, #53).\n  * Main-Window: added a hide-on-focus-out option to minimize the main window on focus out (issue #57).\n  * Main-Window: changed the layout to display brightness and contrast as the first two controls for each VDU.\n  * Main-Window: added jump to clicked value to sliders (issue #59).\n  * Main-Window: added a smart-main-window option to make main window placement and geometry preservation optional.\n  * Main-Window: the main window can now be raised above the other sub-windows (gnome issue only).\n  * Main-Window and Context Menu: added alt-key keyboard shortcuts (issue #13).\n  * Context-Menu: added an indicator mark suffix to the currently active Preset (if any) (issue #55).\n  * Context-Menu: made changes to Preset ordering propagate to the menu without requiring an application restart.\n  * Tray-Icon: made the app icon un-themed so that overlaid active Preset text/icon is more visible (issue #55).\n  * Settings-Dialog: added a Reset button to makes it possible to un-ignore a VDU (issue #51).\n  * Settings-Dialog: added tool-tips to main config-settings, made them consistent with command line help (issue #52).\n  * Preset-Dialog: combined the Activate and Edit buttons into one button (simpler and more intuitive).\n  * Preset Dialog: made the dialog bold the text button of the currently active Preset (if any).\n  * Preset Dialog: added code to detect and and warn of unsaved changes.\n  * Preset Dialog: made the dialog lock out any scheduled or automatic VDU changes while a Preset is being edited.\n  * Preset-Dialog: supplied a starter set of Prest icons - a selection of KDE breeze5-icons (issue #56).\n  * Popup-Messages: made message box popups resizable for increased readability.\n  * Command-line: made config-settings and command-line arguments consistent, command line has precedence (issue #52).\n  * Command-line: fixed --sleep-multiplier so that it is actually applied (issue #54).\n  * Prevented potential crashes in the event of utf-8 decoding errors for EDIDs and capabilities (issue #49).\n  * Added logging of stack traces for some errors if debugging is set to on (issue #49).\n  * Improved the handling of ddcutil not found (issue #48).\n  * Refactored to improve maintainability and run-time efficiency (issue #52).\n  * Added Deepin 23 pyqt library compatibility.\n  * Numerous minor enhancements and fixes.\n  * An alpha release of vlux_meter.py, a system-tray webcam lux-meter, has been included in the sample scripts folder.\n* 1.10.2\n  * Fix Preset non-zero transition-step-seconds, so it works properly.\n  * Changing log-to-syslog or log-debug-enabled no longer requires a restart.\n  * Fix Lux Auto menu icon when starting with Auto disabled.\n  * Use the progress bar area on the main panel for status messages.\n  * Make auto brightness behave more predictably by removing unnecessary constraints on interpolation.\n  * Improve auto-lux/preset tray icon interaction - better reflect actions and current state.\n* 1.10.1\n  * Restore lux meter displayed-value when restoring LuxDialog window.\n  * Minor fixes to reduce and improve displayed and logged messages.\n  * Rollup release prior to downtime for ToTK\n* 1.10.0\n  * Added hardware lux metering options (GY30/BH1750+Arduino, UNIX-fifo, or executable-script).\n  * Added lux-to-brightness profiles per VDU.\n  * Added sample scripts for using a webcam to produce approximate lux values.\n  * Added an option to transition smoothly on UNIX signal.\n  * Replaced the transition combo-box with a button+checkboxes.\n  * Added drag-to-change, click-to-delete, to the elevation chart component.\n  * Added a setting to quickly disable weather and another for elevation-scheduling.\n  * Cleanup of thread handling - clarification of GUI/non-GUI thread operations.\n  * Reduced logging and eliminated popup dialogs when monitors are suspended or powered off.\n* 1.9.2\n  * Optional _Smooth Transitions_ for presets:\n    * The Presets Dialog now includes an option to set a Preset to _Transition Smoothly_.\n    * The tray, main panel, and Preset Dialog indicate when a smooth transition is in progress.\n    * Transitions are performed by a non-GUI thread, the GUI remains accessible during smooth transitions.\n    * A smooth transition can be interrupted by moving the controls being transitioned or invoking a preset.\n* 1.9.1\n  * The text input to right of slider controls has been replaced with a SpinBox with up/down arrows.\n  * The main panel progress-bar spinner will now also display during preset-activation (in addition to displaying during refresh).\n  * Refresh and preset controls now lock during refresh and preset-activation (to prevent conflicting actions).\n  * The context menu and hamburger menu are now available during refresh (a subset of actions is available, such as help and about).\n  * The VDU `EDID` 128/256 byte identifier is now used internally to ensure the controls operate on the correct monitor.\n  * Build changes for submission to _OpenSUSE_  _Development_ and _Factory_ by @malcolmlewis.\n  * The thread handling and error handling has been cleaned up.\n* 1.9.0\n  * Bug fixes and speedy performance improvements:\n    * Speed up initialization and refresh by combining multiple ddcutil `getvcp` requests.\n    * Stop executing a `getvcp` precheck before each `setvcp`. \n    * Fix repeat-initialisation bug in _Context-Menu Refresh_.\n    * Fix _Settings Dialog_ text field validation, some errors were invisibly ignored.\n    * Fix _Settings Dialog_ _Settings Enable VCP Codes_, they had stopped working.\n    * Fix the monitor specific sleep multipliers, they were not always being used.\n    * Treat all monitor detection situations as needing time to stabilise (helps in disconnect situations).\n    * Fix event handling so that tablet+pen input works on the main window.\n    * Default to a sleep-multiplier of 1.0 to support a wider range of monitors out of the box.\n  * V1.9.0 drops support for converting from v1.6.* config and preset files. To convert \n    from v1.6.* and earlier versions, follow these steps to download and run v1.8.3:\n    ```\n     % wget https://github.com/digitaltrails/vdu_controls/blob/v1.8.3/vdu_controls.py\n     % python3 vdu_controls.py\n    ```\n    Alternatively, start fresh by moving or removing the old configs from `$HOME/.config/vdu_controls`.\n* 1.8.3\n  * Fix for a crash when the network is down and the weather site cannot be contacted. \n* 1.8.2\n  * Solar elevation weather requirements.\n  * Locale language support and sample AI generated translations.\n* 1.8.0\n  * Presets can be scheduled to activate according to solar elevation at a given latitude and longitude.\n* 1.7.2\n  * Better handle monitors being powered off: on set-value errors, check what's connected. \n  * The display ordering of presets can now be manually altered in the Presets dialog.\n  * Do not exit if no controllable monitor is found.\n* 1.7.1\n  * Refactoring in 1.7 broke the signal handling - incorporate fix from Mark Lowne. \n* 1.7.0\n  * Presets can now optionally have icons which display in the menu and overlay the tray icon.\n  * The Preset-management dialog now includes an icon selection button.\n* 1.6.11\n  * Display current preset in window and tray title and detect if a preset is in use at startup.\n* 1.6.10, 1.6.9\n  * Cope better with invalid slider values caused by a monitor being too slow/busy when responding.\n  * Wait for monitor detection to stabilise at session restoration (at login time).\n* 1.6.8\n  * Fix preset restore/save bug introduced in 1.6.7\n* 1.6.7\n  * Gnome system tray behaviour made consistent with gnome - when in gnome do as the gnomens do.\n* 1.6.5\n  * Widen handling of pare exceptions for VDU capabilities - catch more exceptions.\n* 1.6.4\n  * Wait for system tray to become available (for autostart Plasma Wayland).\n  * Enable HiDPI icons (for the bottom toolbar) - fix blurred toolbar icons on up-scaled desktops.\n* 1.6.3\n  * Added a hamburger menu as an obvious alternate path to the context menu.\n  * Minor cosmetic UI changes.\n* 1.6.2\n  * Added a Feature Values: min..max override to optionally restrict brightness and other sliders.\n* 1.6.1\n  * Alterations for Wayland compatibility (cosmetic)\n* 1.6.0\n  * Let other processes trigger vdu_controls preset changes and settings refreshes via UNIX/Linux signals.\n* 1.5.2\n  * ``vdu-controls`` is now feature complete in respect to my own requirements.\n  * Raise popup dialogs to the top (in case Qt renders them behind existing windows).\n  * Documentation tweaks.\n* 1.5.1\n  * New grey-scale reference chart for assistance with brightness and contrast adjustment.\n  * About/help/settings/presets dialogs are now singletons, only one of each can be visible.\n* 1.5.0\n  * New presets feature: easily switch between named presets such as *Night*, *Day*, *Overcast*, *Sunny*, \n    *Photography*, and *Video*.\n  * ``Presets`` context-menu item for access to the new ``preset management widget``.\n  * Context menu shortcuts for quickly accessing presets.\n  * INI preset file format for ease of editing.\n* 1.4.2\n  * Fix increasing indentation of multiline capabilities text on each config file save.\n  * Prune the VDU settings-editor control-list to only show controls supported by the VDU.\n  * Use grid layout in the ``settings`` editor.\n* 1.4.1\n  * Internal code cleanups after switching to INI config files (no functional changes).\n  * Updated the help.\n* 1.4.0\n  * Added global and VDU-specific INI style configuration files in `$HOME/.conf/vdu_controls/`.\n  * Added a GUI settings-editor as a `settings` menu-item in the context-menu.\n* 1.3.1\n  * A minor enhancement to ease installation on Ubuntu, create ``$HOME/bin`` if it doesn't exist. \n* 1.3.0\n  * Add a CUSTOM::Sleep_Multiplier VDU config-file option to allow VDU specific sleep multipliers.\n    This can be used to prevent the slowest VDU from dragging down response time for all connected VDUs.\n  * Added a main UI right-mouse action that makes the context menu available in the UI window.\n  * Added a help option to context menu, it displays a formatted version of the ``--detailed-help`` text.\n  * Added a ``--detailed-help`` command line option to extract the help from the script (in Markdown format).\n* 1.2.2\n  * Generalise and simplify the error handling changes initiated in v1.2.1.\n* 1.2.1\n  * Catch ddcutil error exit and offer to try a slower --sleep-multiplier\n* 1.2\n  * Better handle out of range values.\n  * Enable audio-mute,audio-treble,audio-bass,audio-mic-volume.\n  * Allow ddcutil to be anywhere on the user's PATH.\n  * Improve parsing to ignore laptop non-MCCS displays when present with external monitors. \n  * Improve the documentation.\n  * Add an --about command line option and an \"about\" tray option.\n* 1.0\n  * Initial Release\n\nLicense\n-------\n\nThis project is licensed under the **GNU General Public License Version 3** - see the [LICENSE.md](LICENSE.md) file \nfor details\n\n**vdu_controls Copyright (C) 2021 Michael Hamilton**\n\nThis program is free software: you can redistribute it and/or modify it\nunder the terms of the GNU General Public License as published by the\nFree Software Foundation, version 3.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\nor FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\nmore details.\n\nYou should have received a copy of the GNU General Public License along\nwith this program. If not, see \u003chttps://www.gnu.org/licenses/\u003e.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdigitaltrails%2Fvdu_controls","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdigitaltrails%2Fvdu_controls","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdigitaltrails%2Fvdu_controls/lists"}