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 }