tv xdpytools: init

This commit is contained in:
tv 2021-02-07 21:52:37 +01:00
parent 1ff4a60b8d
commit a94d2ce6c7
3 changed files with 91 additions and 0 deletions

View File

@ -0,0 +1,31 @@
{ lib, pkgs }:
let
install = name: { path }: /* sh */ ''
(
mkdir -p $out/bin
touch $out/bin/${name}
chmod +x $out/bin/${name}
exec >$out/bin/${name}
echo '#! ${pkgs.dash}/bin/dash'
echo export PATH=${lib.makeBinPath path}
sed 1d ${./src + "/${name}"}
)
'';
in
pkgs.runCommand "xdpytools" {}
(toString
(lib.mapAttrsToList install {
xdpychvt.path = [
"$out"
"/run/wrappers/'$LOGNAME'"
"/run/wrappers"
];
xdpysel.path = [
"$out"
pkgs.findutils
pkgs.jq
];
}))

View File

@ -0,0 +1,11 @@
#! /bin/sh
# usage: xdpychvt {prev,next}
# Changes to the VT based on the selected X display.
#
# This allows switching between X servers when display names and VT numbers
# correlate. A more sophisticated tool would try to determine the correct VT
# by e.g. looking at /proc, but this might not possible when e.g. using
# security.hideProcessInformation.
#
chvt "$(xdpysel "$1")"

View File

@ -0,0 +1,49 @@
#! /bin/sh
# usage: xdpysel {prev,next}
# Print the number of the selected X display.
find /tmp/.X11-unix -mindepth 1 -maxdepth 1 |
jq -Rrs --arg command "$1" '
(
split("\n") |
map(
select(.!="") |
match("^.*/X([0-9]+)$").captures[0].string |
tonumber
)
)
as $all_displays |
(
env.DISPLAY |
match("^:([0-9]+)(?:[.][0-9]+)?$").captures[0].string |
tonumber
)
as $current_display |
($all_displays | length) as $all_displays_count |
($all_displays|index($current_display))
as $current_index |
(($current_index + 1) % $all_displays_count)
as $next_index |
(($all_displays_count + $current_index - 1) % $all_displays_count)
as $prev_index |
$all_displays[$prev_index] as $prev_display |
$all_displays[$next_index] as $next_display |
{
prev: $prev_display,
next: $next_display,
}[$command]
as $result |
if $result | type == "number" then
$result
else
"xdpysel: bad argument: \($command)\n" | halt_error(-1)
end
'