###############################################################################
# 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>.
###############################################################################

# Key subtable for HandyTech braille dot keys

bind B1 HOME
bind B2 TOP_LEFT
bind B3 BACK
bind B4 LNUP
bind B5 LNDN
bind B1+B4 PRPGRPH
bind B1+B5 NXPGRPH
bind B2+B4 PRPROMPT
bind B2+B5 NXPROMPT
bind B3+B4 PRSEARCH
bind B3+B5 NXSEARCH
bind B4+B5 LEARN
bind B6+B4 ATTRUP
bind B6+B5 ATTRDN
bind B7+B4 WINUP
bind B7+B5 WINDN
bind B8+B4 PRDIFLN
bind B8+B5 NXDIFLN
bind B8 HELP
bind B8+B1 CSRTRK
bind B8+B2 CSRVIS
bind B8+B3 ATTRVIS
bind B8+B6 FREEZE
bind B8+B7 TUNES
bind B7 SIXDOTS
bind B7+B1 PREFMENU
bind B7+B2 PREFLOAD
bind B7+B3 PREFSAVE
bind B7+B6 INFO
bind B6 DISPMD
bind B6+B1 SKPIDLNS
bind B6+B2 SKPBLNKWINS
bind B6+B3 SLIDEWIN

bind B2+B3+B5+B6 TIME

bind B1+RoutingKey SETLEFT
bind B2+RoutingKey DESCCHAR
bind B3+RoutingKey CLIP_ADD
bind B4+RoutingKey CLIP_NEW
bind B5+RoutingKey COPY_RECT
bind B6+RoutingKey COPY_LINE
bind B7+RoutingKey SETMARK
bind B8+RoutingKey GOTOMARK

