# `QuakeServer.Keys`
[🔗](https://github.com/jaman/quake_server/blob/v0.1.0/lib/quake_server/keys.ex#L1)

FTE's key numbers (`keynum_t`), key names and modifiers, and the QuakeC key codes the
client and menu programs use for them, as FTE's `keys.c` and `pr_clcmd.c` number,
name and translate them.

    QuakeServer.Keys.string_to_keynum("ctrl+w")
    #=> {119, 4}
    QuakeServer.Keys.keynum_to_string(QuakeServer.Keys.keynum(:uparrow), 0)
    #=> "UPARROW"
    QuakeServer.Keys.to_qc(QuakeServer.Keys.keynum(:mouse1))
    #=> 512

A key number below 128 is the key's ASCII code (letters lower case). A modifier is a
bit set of `shift` (1), `alt` (2) and `ctrl` (4); with `altbindmap` (8) set, the low
bits name a bind map instead. `string_to_keynum/1` gives `:all` as the modifier when
the name has no modifier prefix (every modifier state); a `std_` or `std+` prefix
means no modifier (0).

# `keynum`

```elixir
@type keynum() :: integer()
```

# `modifier`

```elixir
@type modifier() :: 0..15 | :all
```

# `from_qc`

```elixir
@spec from_qc(integer()) :: keynum()
```

The key number for QuakeC key code `code` (FTE's `MP_TranslateQCtoFTECodes`).

# `keynum`

```elixir
@spec keynum(atom()) :: keynum()
```

The number of FTE key `name` (an atom of `keynum_t` without its `K_`, lower case).

# `keynum_to_string`

```elixir
@spec keynum_to_string(keynum(), integer()) :: String.t()
```

The name of key number `keynum` with `modifier` written before it (`Ctrl+`, `Alt+`,
`Shift+` in that order; a bind map is not written), as FTE's `Key_KeynumToString`.

# `max`

```elixir
@spec max() :: pos_integer()
```

One past the highest key number (FTE's `K_MAX`).

# `string_to_keynum`

```elixir
@spec string_to_keynum(String.t()) :: {keynum(), modifier()}
```

The key number and modifier a key name such as `"w"`, `"MOUSE1"`, `"K_ENTER"`,
`"ctrl+shift+a"` or `"std_f1"` names, or `{-1, modifier}` when it names no key
(FTE's `Key_StringToKeynum`).

# `to_qc`

```elixir
@spec to_qc(keynum()) :: integer()
```

The QuakeC key code for key number `keynum` (FTE's `MP_TranslateFTEtoQCCodes`).

---

*Consult [api-reference.md](api-reference.md) for complete listing*
