summaryrefslogtreecommitdiffstats
path: root/pkgs/simple/xdpytools
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/simple/xdpytools')
-rw-r--r--pkgs/simple/xdpytools/default.nix31
-rwxr-xr-xpkgs/simple/xdpytools/src/xdpychvt11
-rwxr-xr-xpkgs/simple/xdpytools/src/xdpysel49
3 files changed, 91 insertions, 0 deletions
diff --git a/pkgs/simple/xdpytools/default.nix b/pkgs/simple/xdpytools/default.nix
new file mode 100644
index 0000000..7d1ee07
--- /dev/null
+++ b/pkgs/simple/xdpytools/default.nix
@@ -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
+ ];
+ }))
diff --git a/pkgs/simple/xdpytools/src/xdpychvt b/pkgs/simple/xdpytools/src/xdpychvt
new file mode 100755
index 0000000..84c1907
--- /dev/null
+++ b/pkgs/simple/xdpytools/src/xdpychvt
@@ -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")"
diff --git a/pkgs/simple/xdpytools/src/xdpysel b/pkgs/simple/xdpytools/src/xdpysel
new file mode 100755
index 0000000..e080155
--- /dev/null
+++ b/pkgs/simple/xdpytools/src/xdpysel
@@ -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
+'