99 lines
2.2 KiB
Go
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
|
|
}
|