From a91cc6d56e7ee500aa3aef32aa45fd7ddb93c76d Mon Sep 17 00:00:00 2001 From: Vincent Bernat Date: Wed, 7 Jul 2021 06:34:19 +0200 Subject: [PATCH] i3-companion: reload xsettingsd and update wallpaper on XRandR changes --- bin/i3-companion | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/bin/i3-companion b/bin/i3-companion index e8a4e95..9ccd748 100755 --- a/bin/i3-companion +++ b/bin/i3-companion @@ -13,6 +13,8 @@ import os import sys import re import asyncio +import shlex +import subprocess from i3ipc.aio import Connection from i3ipc import Event @@ -184,6 +186,34 @@ async def quake_console(i3, event): await i3.command(command) +output_update_running = None +async def output_update(i3, event): + """React to a XRandR change.""" + global output_update_running + if output_update_running is not None: + output_update_running.cancel() + + logger.debug("schedule XRandR change") + output_update_running = asyncio.get_event_loop().call_later( + 1, output_update_now) + + +def output_update_now(): + """Execute actions to react to XRandR change.""" + global output_update_running + output_update_running = None + + logger.info("XRandR change detected") + cmds = ( + "systemctl --user reload --no-block xsettingsd.service", + "systemctl --user start --no-block wallpaper.service", + ) + for cmd in cmds: + proc = subprocess.run(shlex.split(cmd)) + if proc.returncode != 0: + logger.warning(f"{cmd} exited with {proc.returncode}") + + async def main(options): i3 = await Connection().connect() @@ -199,13 +229,11 @@ async def main(options): # Create/display a quake console i3.on(Event.TICK, quake_console) - # Log output event - i3.on(Event.OUTPUT, - lambda _, event: logger.info(f"Output event: {event.ipc_data}")) + # React to XRandR changes + i3.on(Event.OUTPUT, output_update) await i3.main() - if __name__ == "__main__": options = parse_args() setup_logging(options)