###############################################################################
# BRLTTY - A background process providing access to the console screen (when in
#          text mode) for a blind person using a refreshable braille display.
#
# Copyright (C) 1995-2023 by The BRLTTY Developers.
#
# BRLTTY comes with ABSOLUTELY NO WARRANTY.
#
# This is free software, placed under the terms of the
# GNU Lesser General Public License, as published by the Free Software
# Foundation; either version 2.1 of the License, or (at your option) any
# later version. Please see the file LICENSE-LGPL for details.
#
# Web Page: http://brltty.app/
#
# This software is maintained by Dave Mielke <dave@mielke.cc>.
###############################################################################

note The three keys along the front edge of the top are: Dot7, Space, Dot8.
note Behind them is a six-dot braille keyboard.
note * From left to right, they are: Dot3, Dot2, Dot1, Dot4, Dot5, Dot6.
note * There's a gap the width of the spacebar between the Dot1 and Dot4 keys.
note Behind the braille keyboard is the row of cursor routing keys,
note * and behind it are the braille cells.
note To the left of the braille cells are the MoveUp and MoveDown keys,
note * and to their right are the PanLeft and PanRight keys.
note * MoveUp is behind MoveDown, and PanLeft is behind PanRight.
note * The Move and Pan key pairs can be swapped via the internal Settings menu.

map Space SPACE
map Dot1 DOT1
map Dot2 DOT2
map Dot3 DOT3
map Dot4 DOT4
map Dot5 DOT5
map Dot6 DOT6
map Dot7 DOT7
map Dot8 DOT8

bind Dot7 KEY_BACKSPACE
bind Dot8 KEY_ENTER

bind MoveUp LNUP
bind MoveDown LNDN

bind PanLeft FWINLT
bind PanRight FWINRT

bind RoutingKey ROUTE

include ../menu.kti
