From 408288f79eda4ee1e675939f4be4a2dcb280b3e6 Mon Sep 17 00:00:00 2001 From: Lucas Oskorep Date: Mon, 29 Jun 2026 21:35:13 -0400 Subject: [PATCH] feat: add readme and clean up comments and code quality. Also update metadata so that it reads better in settings --- README.md | 47 ++++++++++++++++++++++++++++++++++++++++++ attachments/panel.png | Bin 0 -> 18854 bytes justfile | 3 +++ metadata.json | 5 +---- src/constants.ts | 4 ---- src/displays.ts | 23 +++++---------------- src/indicator.ts | 1 - src/keybindings.ts | 9 ++------ stylesheet.css | 4 ---- 9 files changed, 58 insertions(+), 38 deletions(-) create mode 100644 README.md create mode 100644 attachments/panel.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..4b2990f --- /dev/null +++ b/README.md @@ -0,0 +1,47 @@ +# DDC Brightness Control + +This project aims to be a simple and easy to use DDC brightness control plugin for Gnome + +![img.png](attachments/panel.png) + +## Features + +- Brightness control via panel +- Adjustable keybindings for brightness controls + - Active screen detection + - By default, keybinding is alt+shift+f1/f2 for down/up on the active display +- Display linking if you want to adjust all displays at once + +## Planned Features? + +- Would be nice to get this added to the system status menu at some point isntead of its own dot +- Support for direct i2c or better ddc controllers (not ddcutil) +- You tell me + +## Installation + +(Examples use arch, but all packages should be available on other distros as well) + +Be sure to have [ddcutil](https://www.ddcutil.com/) installed it is a hard requirement for now + +Also, if installing from source install just which is the chosen command runner for this project + +```bash +sudo pacman -Syu ddcutil just +``` + +Add your user to the i2c group so it can use i2c without root and reboot/login+out + +```bash +sudo usermod -aG i2c $USER +reboot +``` + +Now install the extension from version control +(until we get to the gnome extension store) + +```bash + +``` + + diff --git a/attachments/panel.png b/attachments/panel.png new file mode 100644 index 0000000000000000000000000000000000000000..1f5c27df64c329d5c939795dfcc13a281ecbd06e GIT binary patch literal 18854 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 Pfz(xXRLUONy!t-?xLW8w literal 0 HcmV?d00001 diff --git a/justfile b/justfile index 73741a7..fc4b1e1 100644 --- a/justfile +++ b/justfile @@ -38,5 +38,8 @@ live-debug: lint: pnpm run lint +lint-fix: + pnpm run lint --fix + clean: pnpm run clean diff --git a/metadata.json b/metadata.json index 721b7a0..8da039f 100644 --- a/metadata.json +++ b/metadata.json @@ -1,12 +1,9 @@ { - "name": "ddc-brightness-control", + "name": "DDC Brightness Controller", "description": "Control display brightness via DDC/CI using ddcutil. Bind keyboard shortcuts or use the panel menu to adjust monitor brightness.", "uuid": "ddcbrightness@lucaso.io", "settings-schema": "org.gnome.shell.extensions.ddcbrightness", "shell-version": [ - "47", - "48", - "49", "50" ] } diff --git a/src/constants.ts b/src/constants.ts index 4272320..9799eb1 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -4,10 +4,6 @@ export const SCHEMA_ID = 'org.gnome.shell.extensions.ddcbrightness'; /** VCP feature code used when none is configured (10 = brightness). */ export const DEFAULT_VCP_CODE = '10'; -/** - * Scales the mandatory I2C delays ddcutil inserts around DDC/CI transactions. - * Lower = faster but less tolerant of flaky monitors. Tune per hardware. - */ export const DDCUTIL_SLEEP_MULTIPLIER = '0.5'; /** Prefix for all console logging from this extension. */ diff --git a/src/displays.ts b/src/displays.ts index 8294790..13b3570 100644 --- a/src/displays.ts +++ b/src/displays.ts @@ -1,10 +1,9 @@ import Gio from 'gi://Gio'; import St from 'gi://St'; import * as Slider from 'resource:///org/gnome/shell/ui/slider.js'; -import { DEFAULT_VCP_CODE, LOG_PREFIX } from './constants.js'; +import {DEFAULT_VCP_CODE, LOG_PREFIX} from './constants.js'; import * as Ddcutil from './ddcutil.js'; -/** A detected display plus the UI refs and runtime state attached to it. */ export interface DisplayInfo { bus: string; name: string; @@ -13,30 +12,18 @@ export interface DisplayInfo { currentValue: number; slider: Slider.Slider | null; valueLabel: St.Label | null; - // Reconciliation state for writes: `sentValue` is the value of the most - // recent write handed to ddcutil; `inFlight` is true while that write runs. sentValue: number; inFlight: boolean; reading: boolean; updatingFromCode: boolean; } -/** - * Owns the set of detected displays and all brightness operations on them - * (detection, monitor mapping, reads, and writes via ddcutil). - * - * Writes use a reconciliation model rather than debouncing: `currentValue` is - * the user's target and at most one write per display is ever in flight. When a - * write finishes, if the target has since moved we immediately send the latest - * value — so intermediate values are coalesced and we never queue stale writes. - */ export class DisplayController { private _settings: Gio.Settings; private _displays: DisplayInfo[] = []; private _detectComplete = false; private _disposed = false; - /** Invoked after detection finishes so the UI can rebuild itself. */ onDetectComplete: (() => void) | null = null; constructor(settings: Gio.Settings) { @@ -55,18 +42,15 @@ export class DisplayController { return this._settings.get_string('vcp-code') || DEFAULT_VCP_CODE; } - /** Clear all state back to the pre-detection condition. */ reset(): void { this._displays = []; this._detectComplete = false; } - /** Stop issuing further writes. Call before disposal. */ cleanup(): void { this._disposed = true; } - /** Detect displays, map them to monitors, then read their brightness. */ detect(): void { Ddcutil.detectDisplays((parsed) => { this._displays = parsed.map((p) => ({ @@ -117,7 +101,10 @@ export class DisplayController { return global.display.get_primary_monitor(); } - /** The display to act on for global actions, honoring "link displays". */ + /** + * The display to act on for global actions, honoring "link displays". + * This should grab the display that the active window is part of for adjusting when not linked + */ getActiveDisplay(): DisplayInfo | null { if (this._settings.get_boolean('link-displays')) { return this._displays[0] ?? null; diff --git a/src/indicator.ts b/src/indicator.ts index c2c3146..b814ce5 100644 --- a/src/indicator.ts +++ b/src/indicator.ts @@ -42,7 +42,6 @@ export class BrightnessIndicator { this.rebuildMenu(); } - /** The underlying panel button, for adding to the status area. */ get button(): PanelMenu.Button { return this._button; } diff --git a/src/keybindings.ts b/src/keybindings.ts index 92fb199..e6af6d9 100644 --- a/src/keybindings.ts +++ b/src/keybindings.ts @@ -3,16 +3,11 @@ import Meta from 'gi://Meta'; import Shell from 'gi://Shell'; import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -/** Map of settings key -> callback to run when the shortcut fires. */ export type KeybindingActions = Record void>; -/** - * Registers the extension's keyboard shortcuts with the window manager and - * keeps them in sync as their settings change. - */ export class KeybindingManager { - private _settings: Gio.Settings; - private _actions: KeybindingActions; + private readonly _settings: Gio.Settings; + private readonly _actions: KeybindingActions; private _bindings: Map = new Map(); constructor(settings: Gio.Settings, actions: KeybindingActions) { diff --git a/stylesheet.css b/stylesheet.css index 9b9ddeb..ddb3922 100644 --- a/stylesheet.css +++ b/stylesheet.css @@ -1,8 +1,5 @@ -/* DDC Brightness Control styling */ - .ddc-brightness-slider-box { padding: 8px 12px; - spacing: 8px; } .ddc-brightness-value-label { @@ -13,7 +10,6 @@ text-align: right; } -/* Custom slider */ .slider { height: 24px; border-radius: 12px;