waybar-kb/main.go
2022-11-07 13:45:56 -05:00

99 lines
2.2 KiB
Go

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
}