aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/system/xhost.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/system/xhost.go')
-rw-r--r--internal/system/xhost.go38
1 files changed, 38 insertions, 0 deletions
diff --git a/internal/system/xhost.go b/internal/system/xhost.go
new file mode 100644
index 00000000..27e60c2b
--- /dev/null
+++ b/internal/system/xhost.go
@@ -0,0 +1,38 @@
+package system
+
+import (
+ "hakurei.app/hst"
+ "hakurei.app/internal/system/xcb"
+)
+
+// ChangeHosts inserts the target user into X11 hosts and deletes it once its [Enablement] is no longer satisfied.
+func (sys *I) ChangeHosts(username string) *I {
+ sys.ops = append(sys.ops, xhostOp(username))
+ return sys
+}
+
+// xhostOp implements [I.ChangeHosts].
+type xhostOp string
+
+func (x xhostOp) Type() hst.Enablement { return hst.EX11 }
+
+func (x xhostOp) apply(sys *I) error {
+ sys.msg.Verbosef("inserting entry %s to X11", x)
+ return newOpError("xhost",
+ sys.xcbChangeHosts(xcb.HostModeInsert, xcb.FamilyServerInterpreted, "localuser\x00"+string(x)), false)
+}
+
+func (x xhostOp) revert(sys *I, ec *Criteria) error {
+ if ec.hasType(x.Type()) {
+ sys.msg.Verbosef("deleting entry %s from X11", x)
+ return newOpError("xhost",
+ sys.xcbChangeHosts(xcb.HostModeDelete, xcb.FamilyServerInterpreted, "localuser\x00"+string(x)), true)
+ } else {
+ sys.msg.Verbosef("skipping entry %s in X11", x)
+ return nil
+ }
+}
+
+func (x xhostOp) Is(o Op) bool { target, ok := o.(xhostOp); return ok && x == target }
+func (x xhostOp) Path() string { return "/tmp/.X11-unix" }
+func (x xhostOp) String() string { return string("SI:localuser:" + x) }