commit 833ab4443ea2edf77b849098720883263e5a2d2a Author: Seán C McCord Date: Mon Nov 7 13:45:56 2022 -0500 initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b4e441f --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/waybar-kb diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..81e0613 --- /dev/null +++ b/go.mod @@ -0,0 +1,12 @@ +module git.cycore.io/scm/waybar-kb + +go 1.19 + +require github.com/joshuarubin/go-sway v1.2.0 + +require ( + github.com/joshuarubin/lifecycle v1.0.0 // indirect + go.uber.org/atomic v1.3.2 // indirect + go.uber.org/multierr v1.1.0 // indirect + golang.org/x/sync v0.0.0-20190412183630-56d357773e84 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..371b613 --- /dev/null +++ b/go.sum @@ -0,0 +1,17 @@ +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/joshuarubin/go-sway v1.2.0 h1:t3eqW504//uj9PDwFf0+IVfkD+WoOGaDX5gYIe0BHyM= +github.com/joshuarubin/go-sway v1.2.0/go.mod h1:qcDd6f25vJ0++wICwA1BainIcRC67p2Mb4lsrZ0k3/k= +github.com/joshuarubin/lifecycle v1.0.0 h1:N/lPEC8f+dBZ1Tn99vShqp36LwB+LI7XNAiNadZeLUQ= +github.com/joshuarubin/lifecycle v1.0.0/go.mod h1:sRy++ATvR9Ee21tkRdFkQeywAWvDsue66V70K0Dnl54= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +go.uber.org/atomic v1.3.2 h1:2Oa65PReHzfn29GpvgsYwloV9AVFHPDk8tYxt2c2tr4= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84 h1:IqXQ59gzdXv58Jmm2xn0tSOR9i6HqroaOFRQ3wR/dJQ= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= diff --git a/main.go b/main.go new file mode 100644 index 0000000..161e55b --- /dev/null +++ b/main.go @@ -0,0 +1,99 @@ +package main + +import ( + "context" + "flag" + "fmt" + "log" + "os" + "os/signal" + "strings" + + "github.com/joshuarubin/go-sway" +) + +var ( + keyboard string + toggle bool + englishLayout string + englishVariant string + + neoLayout = "de" + neoVariant = "neo" +) + +func init() { + flag.StringVar(&keyboard, "k", "12771:4864:Wooting_Wooting60HE", "ID of keyboard, as reported by swaymsg get_inputs") + flag.StringVar(&englishLayout, "englishLayout", "us-mini", "layout id of English language") + flag.StringVar(&englishVariant, "englishVariant", "altgr-intl", "layout variant of the English language") + flag.BoolVar(&toggle, "t", false, "toggle keyboard layout") +} + +func main() { + flag.Parse() + + ctx, cancel := signal.NotifyContext(context.Background(), os.Kill, os.Interrupt) + defer cancel() + + c, err := sway.New(ctx) + if err != nil { + log.Fatalln("failed to connect to sway:", err) + } + + inputs, err := c.GetInputs(ctx) + if err != nil { + log.Fatalln("failed to get list of inputs from sway:", err) + } + + var kb sway.Input + + for _, i := range inputs { + if i.Identifier == keyboard { + kb = i + } + } + + if kb.Identifier == "" { + log.Fatalf("keyboard ID %s not found", keyboard) + } + + layout := "en" + + if strings.Contains(*kb.XKBActiveLayoutName, "Neo") { + layout = "neo" + } + + if toggle { + if layout == "neo" { + if err := setLayout(ctx, c, englishLayout, englishVariant); err != nil { + log.Fatalln("failed to set english layout:", err) + } + + layout = "en" + } else { + if err := setLayout(ctx, c, neoLayout, neoVariant); err != nil { + log.Fatalln("failed to set neo layout:", err) + } + + layout = "neo" + } + } + + fmt.Println(layout) +} + +func setLayout(ctx context.Context, c sway.Client, layout string, variant string) error { + if _, err := c.RunCommand(ctx, fmt.Sprintf("input %s xkb_variant \"\"", keyboard)); err != nil { + return fmt.Errorf("failed to reset keyboard variant: %w", err ) + } + + if _, err := c.RunCommand(ctx, fmt.Sprintf("input %s xkb_layout %s", keyboard, layout)); err != nil { + return fmt.Errorf("failed to set English layout: %w", err) + } + + if _, err := c.RunCommand(ctx, fmt.Sprintf("input %s xkb_variant %s", keyboard, variant)); err != nil { + return fmt.Errorf("failed to set %s variant: %w", keyboard, err) + } + + return nil +}