aboutsummaryrefslogtreecommitdiffhomepage
path: root/hyprctl/hyprctl.bash
blob: 62d9d7230be10ba3bf290962445d7869c0282626 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
_hyprctl_cmd_3 () {
    hyprctl monitors | grep Monitor | awk '{ print $2 }'
}

_hyprctl_cmd_2 () {
    hyprpm list | grep "Plugin" | awk '{print $4}'
}

_hyprctl_cmd_0 () {
    hyprctl devices | sed -n '/Keyboard at/{n; s/^\s\+//; p}'
}

_hyprctl_cmd_1 () {
    hyprctl clients | grep class | awk '{print $2}'
}

_hyprctl () {
    if [[ $(type -t _get_comp_words_by_ref) != function ]]; then
        echo _get_comp_words_by_ref: function not defined.  Make sure the bash-completions system package is installed
        return 1
    fi

    local words cword
    _get_comp_words_by_ref -n "$COMP_WORDBREAKS" words cword

    local -a literals=("focusmonitor" "exit" "global" "forceallowsinput" "::=" "movecursortocorner" "movewindowpixel" "activeworkspace" "monitors" "movecurrentworkspacetomonitor" "togglespecialworkspace" "all" "animationstyle" "closewindow" "setprop" "clients" "denywindowfromgroup" "create" "moveoutofgroup" "headless" "activebordercolor" "rollinglog" "wayland" "movewindoworgroup" "setcursor" "fakefullscreen" "moveactive" "prev" "hyprpaper" "alpha" "inactivebordercolor" "-i" "--instance" "togglefloating" "settiled" "swapwindow" "dimaround" "setignoregrouplock" "layouts" "0" "forcenoborder" "notify" "binds" "focuswindow" "seterror" "1" "systeminfo" "exec" "cyclenext" "nomaxsize" "reload" "rounding" "layers" "setfloating" "5" "lockactivegroup" "movetoworkspace" "swapactiveworkspaces" "changegroupactive" "forcenodim" "0" "configerrors" "4" "forceopaque" "forcenoshadow" "workspaces" "1" "swapnext" "minsize" "alphaoverride" "toggleopaque" "decorations" "alterzorder" "bordersize" "-1" "focuscurrentorlast" "workspacerules" "splitratio" "remove" "renameworkspace" "movetoworkspacesilent" "killactive" "pass" "getoption" "switchxkblayout" "2" "auto" "pin" "version" "nofocus" "togglegroup" "workspace" "lockgroups" "-r" "movewindow" "cursorpos" "focusworkspaceoncurrentmonitor" "execr" "windowdancecompat" "globalshortcuts" "3" "keyword" "movefocus" "movecursor" "instances" "dpms" "x11" "moveintogroup" "resizewindowpixel" "kill" "moveworkspacetomonitor" "forceopaqueoverriden" "dispatch" "-j" "forcenoblur" "devices" "disable" "-b" "activewindow" "fullscreen" "keepaspectratio" "output" "plugin" "alphainactiveoverride" "alphainactive" "resizeactive" "centerwindow" "splash" "focusurgentorlast" "submap" "next" "movegroupwindow" "forcenoanims" "forcerendererreload" "maxsize" "dismissnotify")

    declare -A literal_transitions
    literal_transitions[0]="([44]=31 [115]=3 [46]=3 [84]=21 [83]=3 [117]=11 [50]=3 [52]=3 [118]=3 [7]=3 [8]=28 [121]=25 [14]=7 [88]=3 [15]=3 [122]=24 [61]=3 [93]=11 [21]=3 [24]=3 [65]=3 [95]=3 [28]=3 [99]=3 [127]=3 [101]=30 [71]=18 [104]=3 [38]=3 [109]=3 [76]=3 [113]=11 [112]=27 [41]=1 [42]=3 [135]=2)"
    literal_transitions[6]="([86]=3 [19]=3 [106]=3 [22]=3)"
    literal_transitions[7]="([124]=3 [63]=8 [64]=8 [49]=8 [98]=8 [30]=3 [29]=3 [51]=2 [3]=8 [68]=3 [69]=8 [120]=8 [12]=3 [73]=2 [36]=8 [132]=8 [89]=8 [59]=8 [111]=8 [40]=8 [20]=3 [123]=8 [134]=3 [114]=8)"
    literal_transitions[8]="([39]=3 [45]=3)"
    literal_transitions[9]="([4]=10)"
    literal_transitions[10]="([32]=11 [31]=11)"
    literal_transitions[12]="([27]=3 [130]=3)"
    literal_transitions[15]="([4]=4)"
    literal_transitions[16]="([4]=17)"
    literal_transitions[17]="([60]=3)"
    literal_transitions[18]="([62]=3 [85]=3 [100]=3 [66]=3 [74]=3 [54]=3)"
    literal_transitions[20]="([4]=13)"
    literal_transitions[25]="([17]=6 [78]=26)"
    literal_transitions[27]="([0]=3 [1]=3 [47]=3 [48]=3 [2]=3 [80]=3 [81]=3 [82]=3 [5]=3 [6]=3 [53]=3 [55]=3 [10]=3 [9]=3 [56]=3 [119]=3 [13]=3 [87]=3 [16]=3 [57]=3 [18]=3 [58]=3 [90]=3 [94]=3 [96]=3 [91]=3 [23]=3 [92]=3 [25]=3 [26]=3 [67]=3 [97]=3 [125]=3 [126]=3 [33]=3 [70]=3 [102]=3 [34]=3 [103]=3 [72]=3 [35]=3 [128]=3 [129]=3 [75]=3 [37]=3 [105]=3 [107]=3 [108]=3 [77]=3 [110]=3 [131]=3 [43]=3 [133]=3 [79]=3)"
    literal_transitions[28]="([11]=3)"
    literal_transitions[29]="([42]=3 [115]=3 [44]=31 [50]=3 [83]=3 [84]=21 [52]=3 [118]=3 [7]=3 [8]=28 [121]=25 [14]=7 [88]=3 [15]=3 [122]=24 [61]=3 [21]=3 [24]=3 [65]=3 [95]=3 [28]=3 [99]=3 [127]=3 [101]=30 [71]=18 [104]=3 [38]=3 [109]=3 [76]=3 [112]=27 [41]=1 [46]=3 [135]=2)"
    literal_transitions[31]="([116]=3)"
    literal_transitions[32]="([4]=22)"

    declare -A match_anything_transitions
    match_anything_transitions=([0]=29 [4]=5 [23]=15 [2]=3 [18]=19 [28]=9 [31]=9 [24]=3 [29]=29 [13]=14 [14]=32 [1]=2 [22]=23 [19]=20 [5]=16 [12]=3 [30]=3 [3]=9 [21]=12 [26]=3)
    declare -A subword_transitions

    local state=0
    local word_index=1
    while [[ $word_index -lt $cword ]]; do
        local word=${words[$word_index]}

        if [[ -v "literal_transitions[$state]" ]]; then
            declare -A state_transitions
            eval "state_transitions=${literal_transitions[$state]}"

            local word_matched=0
            for literal_id in $(seq 0 $((${#literals[@]} - 1))); do
                if [[ ${literals[$literal_id]} = "$word" ]]; then
                    if [[ -v "state_transitions[$literal_id]" ]]; then
                        state=${state_transitions[$literal_id]}
                        word_index=$((word_index + 1))
                        word_matched=1
                        break
                    fi
                fi
            done
            if [[ $word_matched -ne 0 ]]; then
                continue
            fi
        fi

        if [[ -v "match_anything_transitions[$state]" ]]; then
            state=${match_anything_transitions[$state]}
            word_index=$((word_index + 1))
            continue
        fi

        return 1
    done


    local prefix="${words[$cword]}"

    local shortest_suffix="$word"
    for ((i=0; i < ${#COMP_WORDBREAKS}; i++)); do
        local char="${COMP_WORDBREAKS:$i:1}"
        local candidate="${word##*$char}"
        if [[ ${#candidate} -lt ${#shortest_suffix} ]]; then
            shortest_suffix=$candidate
        fi
    done
    local superfluous_prefix=""
    if [[ "$shortest_suffix" != "$word" ]]; then
        local superfluous_prefix=${word%$shortest_suffix}
    fi

    if [[ -v "literal_transitions[$state]" ]]; then
        local state_transitions_initializer=${literal_transitions[$state]}
        declare -A state_transitions
        eval "state_transitions=$state_transitions_initializer"

        for literal_id in "${!state_transitions[@]}"; do
            local literal="${literals[$literal_id]}"
            if [[ $literal = "${prefix}"* ]]; then
                local completion=${literal#"$superfluous_prefix"}
                COMPREPLY+=("$completion ")
            fi
        done
    fi
    declare -A commands
    commands=([4]=0 [13]=2 [22]=3 [18]=1)
    if [[ -v "commands[$state]" ]]; then
        local command_id=${commands[$state]}
        local completions=()
        mapfile -t completions < <(_hyprctl_cmd_${command_id} "$prefix" | cut -f1)
        for item in "${completions[@]}"; do
            if [[ $item = "${prefix}"* ]]; then
                COMPREPLY+=("$item")
            fi
        done
    fi


    return 0
}

complete -o nospace -F _hyprctl hyprctl