Compare commits

..

No commits in common. "383d64558e091556534879cc68da745aea49383c" and "4cd474411fe97cfd9a09471755f1e7dcd916db37" have entirely different histories.

2 changed files with 3 additions and 279 deletions

View file

@ -68,8 +68,8 @@ hc keybind XF86AudioLowerVolume spawn amixer set Master 5%- unmute
hc keybind XF86AudioRaiseVolume spawn amixer set Master 5%+ unmute hc keybind XF86AudioRaiseVolume spawn amixer set Master 5%+ unmute
hc keybind XF86AudioMute spawn amixer set Master togglemute hc keybind XF86AudioMute spawn amixer set Master togglemute
hc keybind XF86AudioMicMute spawn amixer set Capture togglemute hc keybind XF86AudioMicMute spawn amixer set Capture togglemute
hc keybind XF86MonBrightnessDown spawn ~/dotfiles/scripts/backlight.py -5% hc keybind XF86MonBrightnessDown spawn xbacklight -5
hc keybind XF86MonBrightnessUp spawn ~/dotfiles/scripts/backlight.py +5% hc keybind XF86MonBrightnessUp spawn xbacklight +5
hc keybind Print spawn scrot ~/Pictures/screenshots/ hc keybind Print spawn scrot ~/Pictures/screenshots/
# basic movement in tiling and floating mode # basic movement in tiling and floating mode
@ -175,10 +175,7 @@ hc attr theme.background_color '#141414'
hc set window_gap 0 hc set window_gap 0
hc set frame_padding 0 hc set frame_padding 0
hc set smart_window_surroundings off hc set smart_window_surroundings off
# When set to "off" hlwm will also display the 10px frame_gap when hc set smart_frame_surroundings on
# only one window is displayed. Otherwise the frame gap will be
# disabled.
hc set smart_frame_surroundings off
hc set mouse_recenter_gap 0 hc set mouse_recenter_gap 0
# rules # rules

View file

@ -1,273 +0,0 @@
#!/usr/bin/env python3
##############################################################################
# backlight.py -- A script for setting the backlight brightness using sysfs. #
# 2021 © Marcel Kapfer <opensource@mmk2410.org> #
# Licensed unter the MIT/Expat License #
# #
# It is expected that the running user has permission to change the relevant #
# sysfs file. See https://wiki.archlinux.org/title/Backlight#ACPI and the #
# related "Discussion" wiki page on how to grant users the necessary right #
##############################################################################
import sys
SYS_DIR = "/sys/class/backlight/"
GRAPHICS_CARD = "intel_backlight"
ACTUAL_BRIGHTNESS_FILE = "/actual_brightness"
MAX_BRIGHTNESS_FILE = "/max_brightness"
BRIGHTNESS_FILE = "/brightness"
def __read_file_as_int(path: str, function: str) -> int:
"""Read the value at the given `path` as integer.
It is expected that the value in te file can be casted to an integer.
Parameters
----------
path : str
Path to the file to read.
function : str
Information about the reason for writing the file. Used only for better error messages.
Returns
-------
int
Value read at the file at `path`.
"""
try:
with open(path, "r") as f:
value = f.readline()
except FileNotFoundError:
print("[ERROR] Could not read {}. File {} not found.".format(function, path))
sys.exit(2)
except PermissionError:
print("[ERROR] Could not read {}. Permission to read {} denied.".format(function, path))
sys.exit(3)
except IsADirectoryError:
print("[ERROR] Could not read {}. {} is a directory.".format(function, path))
sys.exit(4)
try:
value = int(value.strip())
except ValueError:
print("[ERROR] Could not parse {}.".format(function))
sys.exit(1)
return value
def __write_int_as_file(path: str, value: int, function: str) -> None:
"""Write the given integer `value` to the given `path`.
This functions *overwrites* the file at `path`.
Parameters
----------
path : str
Path to the file to write.
value : int
Value to write the file at `path`.
function : str
Information about the reason for writing the file. Used only for better error messages.
"""
try:
with open(path, "w") as f:
print(value, file=f)
except FileNotFoundError:
print("[ERROR] Could not write {}. File {} not found".format(function, path))
sys.exit(2)
except PermissionError:
print("[ERROR] Could not write {}. Permission to write {} denied.".format(function, path))
sys.exit(3)
except IsADirectoryError:
print("[ERROR] Could not write {}. {} is a directory.".format(function, path))
sys.exit(4)
def actual_brightness() -> int:
"""Get actual brightness value using sysfs.
Read the actual brightness value from the corresponding file in sysfs.
Returns
-------
int
Actual brightness value.
"""
path = SYS_DIR + GRAPHICS_CARD + ACTUAL_BRIGHTNESS_FILE
return __read_file_as_int(path, "actual brightness")
def max_brightness() -> int:
"""Get maximum brightness value using sysfs.
Read the maximum brightness value from the corresponding file in sysfs.
Returns
-------
int
Maximum brightness value.
"""
path = SYS_DIR + GRAPHICS_CARD + MAX_BRIGHTNESS_FILE
return __read_file_as_int(path, "maximal brightness")
def set_brightness(value: int) -> None:
"""Set a new brightness value using sysfs.
Set the given brightness `value` by writing the the corresponding file in sysfs.
Parameters
----------
value:
New brightness value.
"""
path = SYS_DIR + GRAPHICS_CARD + BRIGHTNESS_FILE
__write_int_as_file(path, value, "brightness")
def safe_set_brightness(new_brightness: int, max_brightness_value: int) -> None:
"""Set new brightness with obaying safety.
Set a new brightness value using `set_brightness` by checking the value for some pitfalls.
At the lower end the functions does not allow a brightness value lower than 5% of the maximum brightness.
At the upper end the functions does not allow a brightness value higher than 100% of the maximum brightness.
Parameters
----------
new_brightness : int
Value to set as brightness.
max_brightness_value : int
Maximum brightness value.
"""
min_brightness_value = int(0.05 * max_brightness_value)
if new_brightness < min_brightness_value:
new_brightness = min_brightness_value
elif new_brightness > max_brightness_value:
new_brightness = max_brightness_value
set_brightness(new_brightness)
def calc_brightness(value: float, actual_brightness_value: int, max_brightness_value: int, function: str) -> int:
"""Calculate brightness value based on actual and maximal brightness.
The function calculates a brightness value using the `function` string and the `value` as a percentage.
If `function` is empty the new brightness is the the `value` percentage of the maximum brightness.
If `function` is + or - then the `value` percentage of the maximum brightness is added/subtracted from the actual brightness.
Parameters
----------
value : float
The wanted change as a percentage.
actual_brightness_value : int
Value of the actual brightness.
max_brightness_value : int
Value of the maximum brightness.
function : str
Either "+" for addition to actual brightness, "-" for substraction of actual brightness or "" for relative to maximum brightness.
Returns
-------
int
Calculated brightness value.
"""
if function == "+":
new_brightness = actual_brightness_value + int(value * max_brightness_value)
elif function == "-":
new_brightness = actual_brightness_value - int(value * max_brightness_value)
else:
new_brightness = int(value * max_brightness_value)
return new_brightness
def parse_arg(arg: str) -> (int, str):
"""Parse argument and return value and modifier.
It is expected that the passed argument is the unaltered CLI argument of the form [+/-]NUMBER%.
The function will check the format and raise a `ValueError` if it is not compatible.
Parameters
----------
arg : str
String to parse
Returns
-------
int
Parsed value
mod
Parsed modifier, either +, - or an empty string.
Raises
------
ValueError
If given argument has not the required format.
"""
if len(arg) < 2 or len(arg) > 5:
raise ValueError("Wrong format. Expected lenght between 2 and 5 characters")
if arg[-1] != "%":
raise ValueError("Wrong format. Expected '%' at the end.")
mod = arg[0]
number_start_index = 0
if mod == "+" or mod == "-":
number_start_index = 1
else:
try:
int(mod)
except ValueError:
raise ValueError("Wrong format. Modifier neither +/- nor value of type integer.")
# Set modifier to empty string to return a halfway meaningful value.
mod = ""
try:
value = 0.01 * int(arg[number_start_index:-1])
except ValueError:
raise ValueError("Wrong format. Supplied value not a integer.")
return value, mod
def print_help() -> None:
"""Print help on using this script."""
print("Usage:")
print("backlight.py [+/-]NUMBER%")
print(" +: Increase brightness by NUMBER%")
print(" -: Decrease brightness by NUMBER%")
print(" : Set brightness to NUMBER%")
def main():
"""Main entry point."""
if len(sys.argv) != 2:
print("[ERROR] Unexpected amount of arguments.")
print_help()
sys.exit(5)
try:
value, mod = parse_arg(sys.argv[1])
except ValueError:
print("[ERROR] Malformed argument.")
print_help()
sys.exit(6)
actual_brightness_value = actual_brightness()
max_brightness_value = max_brightness()
new_brightness = calc_brightness(value, actual_brightness_value, max_brightness_value, mod)
safe_set_brightness(new_brightness, max_brightness_value)
if __name__ == "__main__":
main()