home *** CD-ROM | disk | FTP | other *** search
Text File | 1990-09-27 | 29.8 KB | 1,229 lines |
- # $Header: P:/source/ppee/macros/keys.pev 1.76 15 Aug 1990 12:02:48 ericj $
-
- ##############################################################################
- #
- # Sage Software - POLYTRON Division
- # 1700 NW 167th Place
- # Beaverton, OR 97006
- #
- # Copyright 1990, Sage Software, Inc.
- #
- # Permission is hereby granted for licensed users of Sage Professional
- # Editor and PolyAwk to copy and modify this source code for their own
- # personal use. These derivative works may be distributed only to other
- # licensed Sage Professional Editor and PolyAwk users. All other usage
- # is prohibited without express written permission from Sage Software.
- #
- ##############################################################################
-
- #### $Workfile: keys.pel $: Key binding code
- #
- #
-
- ## keyboard status keys:
-
- global KB_SHIFTR = 0x01
- global KB_SHIFTL = 0x02
- global KB_CTRL = 0x04
- global KB_ALT = 0x08
- global KB_SCROLL_LOCK = 0x10
- global KB_NUM_LOCK = 0x20
- global KB_CAPS_LOCK = 0x40
- global KB_INSERT = 0x80
-
- ## the following codes ambiguously define the equivalent
- ## keys on the two auxiliary "cursor" keypads:
-
- global SCANCODE_HOME = 0x47
- global SCANCODE_UP = 0x48
- global SCANCODE_PGUP = 0x49
- global SCANCODE_LEFT = 0x4b
- global SCANCODE_CENTER = 0x4c
- global SCANCODE_RIGHT = 0x4d
- global SCANCODE_END = 0x4f
- global SCANCODE_DOWN = 0x50
- global SCANCODE_PGDN = 0x51
- global SCANCODE_CTRL_HOME = 0x47
- global SCANCODE_CTRL_UP = 0x8d
- global SCANCODE_CTRL_PGUP = 0x84
- global SCANCODE_CTRL_LEFT = 0x73
- global SCANCODE_CTRL_CENTER = 0x8f
- global SCANCODE_CTRL_RIGHT = 0x74
- global SCANCODE_CTRL_END = 0x75
- global SCANCODE_CTRL_DOWN = 0x91
- global SCANCODE_CTRL_PGDN = 0x76
-
- global SCANCODE_ESC = 0x01
-
- ## other useful keycodes:
- global KEYCODE_ESC = 0x011b
- global KEYCODE_TAB = 0x0f09
- global KEYCODE_END = 0x4f00
- global KEYCODE_ENTER = 0x1c0d
- global KEYCODE_KEYPAD_ENTER = 0xe00d
- global KEYCODE_CTRL_AT = 0x0300 # Ctrl-@ (== ctrl-2), ascii byte is 0
-
- ## useful ascii codes:
- global ASCII_BACKSPACE = 8
- global ASCII_TAB = 9
- global ASCII_CR = 13
- global ASCII_ESC = 27
-
- local key_names # key code--name equivalences
-
- local EOF = -1 # value returned upon EOF
-
-
- ### program a key to playback a recorded sequence
- #
- local learning # semaphore for recursive calls to learn_key
- local learned_key # array of key->playback string associations
-
- global function learn_key(){ #PUBLIC #VOID
- local learn_name # name of key being learned
- local key
- local binding
-
- # a recursive call to this function ends the recording process
- if ( learning ) {
- process_end()
- return
- }
-
- # prompt for the key to learn and get the name
- begin_dialog()
- notify( "Press key to be recorded" )
- key = getKey()
- end_dialog()
-
- if ( key == EOF ) {
- message( "Canceled." )
- return
- }
-
- # get the name of the key to learn
- learn_name = key_name( key )
-
- # make sure it is alright to overwrite the previous binding
- binding = keymap_binding( learn_name )
- if ( binding ) {
- binding = sprintf( "%s is bound to %s; redefine?", learn_name, binding )
- if ( tolower( confirm( binding, "YyNn" )) != "y" ) {
- message( "Canceled." )
- return
- }
- }
- assign_key( learn_name, "learn_key" ) # terminator
-
- begin_dialog()
- notify( "Recording key sequence for %s...press %s again to terminate", \
- learn_name, learn_name )
- while ( !keyboard_input_pending ) {
- # idle
- }
- end_dialog()
-
- # enable recording
- record( 1 )
- learning = 1 # recursion flag
- process_begin()
-
- # we continue here after the process_end, which will happen during
- # the next recursive call to learn_key().
-
- learning = 0
-
- # create a key binding for the learned sequence
- learned_key[ key ] = record( 0 )
- assign_key( learn_name, "playback_learn_key" )
-
- notify( "Reprogrammed %s Key", learn_name )
- }
-
- global function playback_learn_key(){
- playback( learned_key[ current_key ])
- }
-
-
- ### print statistics about keys as they are entered
- #
-
- global function print_keys(){
- local key
-
- key_names_init()
- begin_dialog()
- notify( "Press keys to be printed..." )
-
- while(( key = getKey()) != EOF ){
- notify( "Keycodes: 0x%04x #%05u (%03u) \"%s\"", \
- key, \
- key, \
- and( key, 255 ), \
- key_name( key ))
- # ambiguous_ascii( key ) ? "(ambiguous)" : "" )
- }
-
- message( "" )
- end_dialog()
- }
-
-
- ### read a key and print its binding
- #
-
- global function print_bindings(){
- local seq, key
-
- key_names_init()
- begin_dialog()
- notify( "Press keys to be looked-up..." )
-
- while(( key = getKey()) != EOF ){
- seq = key_encoding( key, 1 )
-
- notify( "0x%04x #%05u (%03u) \"%s\" is bound to %s",\
- key, \
- key, \
- and( key, 255 ), \
- key_name( key ), \
- keymap_binding( seq ))
- # ambiguous_ascii( key ) ? " (ambiguous)" : "",
- }
-
- message( "" )
- end_dialog()
- }
-
- ### read a key and insert the corresponding "#"-sequence
- #
-
- global function insert_keys(){
- local key
- local str
- local priorWindow = current_window
-
- key_names_init()
- begin_dialog()
- notify( "Press keys to be converted and inserted..." )
-
- while(( key = getKey()) != EOF ){
- if(( str = key_encoding( key ))){
- if (priorWindow)
- current_window = priorWindow
- insert_string( str )
- raise_window( dialog_window )
- display_update()
- } else {
- break
- }
- }
-
- # remove temp dialog window if we created one above
- message( "" )
- end_dialog()
- }
-
- ### Read keys from the keyboard and insert them into the buffer if
- # they represent valid ASCII characters.
- #
- # See also: insert_quoted_key() # singluar
-
- global function insert_quoted_keys(){
- local key
- local ascii
- local priorWindow = current_window
-
- key_names_init()
- begin_dialog()
- notify( "Press ASCII keys to be inserted..." )
-
- while(( key = getKey()) != EOF ){
- ascii = and( key, 255 )
- if ( (ascii == 0 && key != KEYCODE_CTRL_AT) ||
- (ascii == 0xe0 && key != ascii) ){
- warning( "non-ASCII key ignored" )
- } else {
- if (priorWindow)
- current_window = priorWindow
- if (ascii == 9)
- insert_string( "\t" );
- else
- insert_key( ascii )
- raise_window( dialog_window )
- display_update()
- }
- }
-
- # remove temp dialog window if we created one above
- message( "" )
- end_dialog()
- }
-
- ### Read the next key from the keyboard and insert it into the buffer if
- # it represents a valid ASCII character.
- #
- # See also: insert_quoted_keys() # plural
-
- global function insert_quoted_key(){
- local key, ascii
- local priorWindow = current_window
-
- key_names_init()
- begin_dialog()
- notify( "Press ASCII key to be inserted..." )
-
- if (( key = getKey()) != EOF ) {
- ascii = and( key, 255 )
- if ( (ascii == 0 && key != KEYCODE_CTRL_AT) ||
- (ascii == 0xe0 && key != ascii) ){
- warning( "non-ASCII key ignored" )
- } else {
- if (priorWindow)
- current_window = priorWindow
- if (ascii == 9)
- insert_string( "\t" );
- else
- insert_key( ascii )
- message( "" )
- }
- }
-
- # remove temp dialog window if we created one above
- end_dialog()
- }
-
-
- ### convert a keycode to a "#"-sequence
- #
-
- global function key_encoding( key, distinguish ){
- local ascii = and( key, 255 )
- local value, p = "n"
-
- key_names_init()
-
- if( ascii == 0 \
- || ascii == 0xE0 \
- || distinguish \
- || ( ambiguous_ascii( key ) \
- && (( p = prompt( "Distinguish alternate " key_name( ascii ) \
- " characters? ", p )) ~ "[yY]" ))){
- value = key
- } else
- value = ascii
-
- if( p )
- return sprintf( "#%u", value )
- else
- return ""
- }
-
- ## determine if an ascii code is represented by multiple keys
- #
- global function ambiguous_ascii( key ){
- key_names_init()
- return and( key, 255 ) in key_names
- }
-
-
- ### returns the name of a key given a key code
- #
-
- global function key_name( keycode ){
- local ascii
-
- key_names_init()
-
- # strip off the leading '#' if necessary
- if ( keycode ~ /^#/ ) {
- keycode = substr( keycode, 2 )
- }
-
- if ( keycode in key_names )
- return "<" key_names[ keycode ] ">"
-
- ascii = and( keycode, 0x00FF )
-
- if ( 0+ascii && ascii in key_names )
- return "<" key_names[ ascii ] ">"
-
- if ( ascii >= 32 )
- return chr( ascii )
- else
- return "#" keycode
- }
-
- local function key_names_init() {
-
- if ( 03849 in key_names )
- return
-
- message( "[Initializing key names...]" )
-
- ## key sequences on main keyboard with ASCII codes:
-
- key_names[ 0 ] = "NUL"
- key_names[ 07681 ] = "Ctrl-A" # ASCII code 1
- key_names[ 12290 ] = "Ctrl-B" # ASCII code 2
- key_names[ 11779 ] = "Ctrl-C" # ASCII code 3
- key_names[ 08196 ] = "Ctrl-D" # ASCII code 4
- key_names[ 04613 ] = "Ctrl-E" # ASCII code 5
- key_names[ 08454 ] = "Ctrl-F" # ASCII code 6
- key_names[ 08711 ] = "Ctrl-G" # ASCII code 7
- key_names[ 08968 ] = "Ctrl-H" # ASCII code 8
- key_names[ 03592 ] = "Bksp" # ASCII code 8
- key_names[ 05897 ] = "Ctrl-I" # ASCII code 9
- key_names[ 03849 ] = "Tab" # ASCII code 9
- key_names[ 09226 ] = "Ctrl-J" # ASCII code 10
- key_names[ 07178 ] = "Ctrl-Enter" # ASCII code 10
- key_names[ 09483 ] = "Ctrl-K" # ASCII code 11
- key_names[ 09740 ] = "Ctrl-L" # ASCII code 12
- key_names[ 12813 ] = "Ctrl-M" # ASCII code 13
- key_names[ 07181 ] = "Enter" # ASCII code 13
- key_names[ 12558 ] = "Ctrl-N" # ASCII code 14
- key_names[ 06159 ] = "Ctrl-O" # ASCII code 15
- key_names[ 06416 ] = "Ctrl-P" # ASCII code 16
- key_names[ 04113 ] = "Ctrl-Q" # ASCII code 17
- key_names[ 04882 ] = "Ctrl-R" # ASCII code 18
- key_names[ 07955 ] = "Ctrl-S" # ASCII code 19
- key_names[ 05140 ] = "Ctrl-T" # ASCII code 20
- key_names[ 05653 ] = "Ctrl-U" # ASCII code 21
- key_names[ 12054 ] = "Ctrl-V" # ASCII code 22
- key_names[ 04375 ] = "Ctrl-W" # ASCII code 23
- key_names[ 11544 ] = "Ctrl-X" # ASCII code 24
- key_names[ 05401 ] = "Ctrl-Y" # ASCII code 25
- key_names[ 11290 ] = "Ctrl-Z" # ASCII code 26
- key_names[ 06683 ] = "Ctrl-[" # ASCII code 27
- key_names[ 00283 ] = "Esc" # ASCII code 27
- key_names[ 11036 ] = "Ctrl-\\" # ASCII code 28
- key_names[ 06941 ] = "Ctrl-]" # ASCII code 29
- key_names[ 01822 ] = "Ctrl-^" # ASCII code 30
- key_names[ 03103 ] = "Ctrl-Minus" # ASCII code 31
- key_names[ 14624 ] = "Space" # ASCII code 32
- key_names[ 03711 ] = "Ctrl-Bksp" # ASCII code 127
-
- ## keys on main keyboard without ASCII codes:
-
- key_names[ 03840 ] = "Shift-Tab"
- key_names[ 37888 ] = "Ctrl-Tab"
- key_names[ 00768 ] = "Ctrl-@"
- key_names[ 00256 ] = "Alt-Esc"
- key_names[ 10496 ] = "Alt-`"
- key_names[ 33280 ] = "Alt-Minus"
- key_names[ 33536 ] = "Alt-="
- key_names[ 11008 ] = "Alt-\\"
- key_names[ 03584 ] = "Alt-Bksp"
- key_names[ 42240 ] = "Alt-Tab"
- key_names[ 06656 ] = "Alt-["
- key_names[ 06912 ] = "Alt-]"
- key_names[ 07168 ] = "Alt-Enter"
- key_names[ 09984 ] = "Alt-;"
- key_names[ 10240 ] = "Alt-'"
- key_names[ 13056 ] = "Alt-,"
- key_names[ 13312 ] = "Alt-."
- key_names[ 13568 ] = "Alt-/"
-
- ## numeric keypad keys:
-
- key_names[ 57391 ] = "Keypad-/"
- key_names[ 14122 ] = "Keypad-*"
- key_names[ 18989 ] = "Keypad-Minus"
- key_names[ 20011 ] = "Keypad-+"
- key_names[ 57357 ] = "Keypad-Enter"
-
- key_names[ 21040 ] = "Keypad-0"
- key_names[ 20273 ] = "Keypad-1"
- key_names[ 20530 ] = "Keypad-2"
- key_names[ 20787 ] = "Keypad-3"
- key_names[ 19252 ] = "Keypad-4"
- key_names[ 19509 ] = "Keypad-5"
- key_names[ 19766 ] = "Keypad-6"
- key_names[ 18231 ] = "Keypad-7"
- key_names[ 18488 ] = "Keypad-8"
- key_names[ 18745 ] = "Keypad-9"
- key_names[ 21294 ] = "Keypad-."
-
- key_names[ 20992 ] = "Keypad-Ins"
- key_names[ 21248 ] = "Keypad-Del"
- key_names[ 18176 ] = "Keypad-Home"
- key_names[ 20224 ] = "Keypad-End"
- key_names[ 18688 ] = "Keypad-PgUp"
- key_names[ 20736 ] = "Keypad-PgDn"
- key_names[ 18432 ] = "Keypad-Up"
- key_names[ 20480 ] = "Keypad-Down"
- key_names[ 19200 ] = "Keypad-Left"
- key_names[ 19712 ] = "Keypad-Right"
- key_names[ 19456 ] = "Keypad-Center"
-
- # note: unshifted keypad keys with num-lock off are equivalent
- # to shifted keypad keys with num-lock on, and vice versa.
- # Therefore, it is necessary to refer to the key by name
- # rather than by using the "Shift-" prefix. For example,
- # instead of "Shift-Keypad-Up" one would use either
- # "Keypad-8" or "Keypad-Up" depending on how one wants to
- # treat num-lock.
-
- key_names[ 38144 ] = "Ctrl-Keypad-/"
- key_names[ 38400 ] = "Ctrl-Keypad-*"
- key_names[ 36352 ] = "Ctrl-Keypad-Minus"
- key_names[ 36864 ] = "Ctrl-Keypad-+"
- key_names[ 57354 ] = "Ctrl-Keypad-Enter"
-
- key_names[ 37376 ] = "Ctrl-Keypad-Ins"
- key_names[ 37632 ] = "Ctrl-Keypad-Del"
- key_names[ 30464 ] = "Ctrl-Keypad-Home"
- key_names[ 29952 ] = "Ctrl-Keypad-End"
- key_names[ 33792 ] = "Ctrl-Keypad-PgUp"
- key_names[ 30208 ] = "Ctrl-Keypad-PgDn"
- key_names[ 36096 ] = "Ctrl-Keypad-Up"
- key_names[ 37120 ] = "Ctrl-Keypad-Down"
- key_names[ 29440 ] = "Ctrl-Keypad-Left"
- key_names[ 29696 ] = "Ctrl-Keypad-Right"
- key_names[ 36608 ] = "Ctrl-Keypad-Center"
-
- key_names[ 41984 ] = "Alt-Keypad-/"
- key_names[ 14080 ] = "Alt-Keypad-*"
- key_names[ 18944 ] = "Alt-Keypad-Minus"
- key_names[ 19968 ] = "Alt-Keypad-+"
- key_names[ 42496 ] = "Alt-Keypad-Enter"
-
- ## keys on the auxiliary (non-numeric) keypad;
- ## these are not available on non-extended keyboards:
-
- key_names[ 21216 ] = "Ins"
- key_names[ 21472 ] = "Del"
- key_names[ 18400 ] = "Home"
- key_names[ 20448 ] = "End"
- key_names[ 18912 ] = "PgUp"
- key_names[ 20960 ] = "PgDn"
- key_names[ 18656 ] = "Up"
- key_names[ 20704 ] = "Down"
- key_names[ 19424 ] = "Left"
- key_names[ 19936 ] = "Right"
-
- # note: shift staus is ignored on auxiliary keypad
-
- key_names[ 37600 ] = "Ctrl-Ins"
- key_names[ 37856 ] = "Ctrl-Del"
- key_names[ 30688 ] = "Ctrl-Home"
- key_names[ 30176 ] = "Ctrl-End"
- key_names[ 34016 ] = "Ctrl-PgUp"
- key_names[ 30432 ] = "Ctrl-PgDn"
- key_names[ 36320 ] = "Ctrl-Up"
- key_names[ 37344 ] = "Ctrl-Down"
- key_names[ 29664 ] = "Ctrl-Left"
- key_names[ 29920 ] = "Ctrl-Right"
-
- key_names[ 41472 ] = "Alt-Ins"
- key_names[ 41728 ] = "Alt-Del"
- key_names[ 38656 ] = "Alt-Home"
- key_names[ 40704 ] = "Alt-End"
- key_names[ 39168 ] = "Alt-PgUp"
- key_names[ 41216 ] = "Alt-PgDn"
- key_names[ 38912 ] = "Alt-Up"
- key_names[ 40960 ] = "Alt-Down"
- key_names[ 39680 ] = "Alt-Left"
- key_names[ 40192 ] = "Alt-Right"
-
- # Alt key combinations on the main keyboard:
-
- key_names[ 07680 ] = "Alt-A"
- key_names[ 12288 ] = "Alt-B"
- key_names[ 11776 ] = "Alt-C"
- key_names[ 08192 ] = "Alt-D"
- key_names[ 04608 ] = "Alt-E"
- key_names[ 08448 ] = "Alt-F"
- key_names[ 08704 ] = "Alt-G"
- key_names[ 08960 ] = "Alt-H"
- key_names[ 05888 ] = "Alt-I"
- key_names[ 09216 ] = "Alt-J"
- key_names[ 09472 ] = "Alt-K"
- key_names[ 09728 ] = "Alt-L"
- key_names[ 12800 ] = "Alt-M"
- key_names[ 12544 ] = "Alt-N"
- key_names[ 06144 ] = "Alt-O"
- key_names[ 06400 ] = "Alt-P"
- key_names[ 04096 ] = "Alt-Q"
- key_names[ 04864 ] = "Alt-R"
- key_names[ 07936 ] = "Alt-S"
- key_names[ 05120 ] = "Alt-T"
- key_names[ 05632 ] = "Alt-U"
- key_names[ 12032 ] = "Alt-V"
- key_names[ 04352 ] = "Alt-W"
- key_names[ 11520 ] = "Alt-X"
- key_names[ 05376 ] = "Alt-Y"
- key_names[ 11264 ] = "Alt-Z"
-
- key_names[ 30720 ] = "Alt-1"
- key_names[ 30976 ] = "Alt-2"
- key_names[ 31232 ] = "Alt-3"
- key_names[ 31488 ] = "Alt-4"
- key_names[ 31744 ] = "Alt-5"
- key_names[ 32000 ] = "Alt-6"
- key_names[ 32256 ] = "Alt-7"
- key_names[ 32512 ] = "Alt-8"
- key_names[ 32768 ] = "Alt-9"
- key_names[ 33024 ] = "Alt-0"
-
- # Function key combinations:
-
- key_names[ 15104 ] = "F1"
- key_names[ 15360 ] = "F2"
- key_names[ 15616 ] = "F3"
- key_names[ 15872 ] = "F4"
- key_names[ 16128 ] = "F5"
- key_names[ 16384 ] = "F6"
- key_names[ 16640 ] = "F7"
- key_names[ 16896 ] = "F8"
- key_names[ 17152 ] = "F9"
- key_names[ 17408 ] = "F10"
- key_names[ 34048 ] = "F11"
- key_names[ 34304 ] = "F12"
-
- key_names[ 21504 ] = "Shift-F1"
- key_names[ 21760 ] = "Shift-F2"
- key_names[ 22016 ] = "Shift-F3"
- key_names[ 22272 ] = "Shift-F4"
- key_names[ 22528 ] = "Shift-F5"
- key_names[ 22784 ] = "Shift-F6"
- key_names[ 23040 ] = "Shift-F7"
- key_names[ 23296 ] = "Shift-F8"
- key_names[ 23552 ] = "Shift-F9"
- key_names[ 23808 ] = "Shift-F10"
- key_names[ 34560 ] = "Shift-F11"
- key_names[ 34816 ] = "Shift-F12"
-
- key_names[ 24064 ] = "Ctrl-F1"
- key_names[ 24320 ] = "Ctrl-F2"
- key_names[ 24576 ] = "Ctrl-F3"
- key_names[ 24832 ] = "Ctrl-F4"
- key_names[ 25088 ] = "Ctrl-F5"
- key_names[ 25344 ] = "Ctrl-F6"
- key_names[ 25600 ] = "Ctrl-F7"
- key_names[ 25856 ] = "Ctrl-F8"
- key_names[ 26112 ] = "Ctrl-F9"
- key_names[ 26368 ] = "Ctrl-F10"
- key_names[ 35072 ] = "Ctrl-F11"
- key_names[ 35328 ] = "Ctrl-F12"
-
- key_names[ 26624 ] = "Alt-F1"
- key_names[ 26880 ] = "Alt-F2"
- key_names[ 27136 ] = "Alt-F3"
- key_names[ 27392 ] = "Alt-F4"
- key_names[ 27648 ] = "Alt-F5"
- key_names[ 27904 ] = "Alt-F6"
- key_names[ 28160 ] = "Alt-F7"
- key_names[ 28416 ] = "Alt-F8"
- key_names[ 28672 ] = "Alt-F9"
- key_names[ 28928 ] = "Alt-F10"
- key_names[ 35584 ] = "Alt-F11"
- key_names[ 35840 ] = "Alt-F12"
-
- key_names[ 61440 ] = "Mouse-Left-Press"
- key_names[ 61696 ] = "Mouse-Right-Press"
- key_names[ 61952 ] = "Mouse-Middle-Press"
- key_names[ 62208 ] = "Mouse-Left-Release"
- key_names[ 62464 ] = "Mouse-Right-Release"
- key_names[ 62720 ] = "Mouse-Middle-Release"
- key_names[ 62976 ] = "Mouse-Left-Click"
- key_names[ 63232 ] = "Mouse-Right-Click"
- key_names[ 63488 ] = "Mouse-Middle-Click"
- key_names[ 63744 ] = "Mouse-Left-Double-Click"
- key_names[ 64000 ] = "Mouse-Right-Double-Click"
- key_names[ 63256 ] = "Mouse-Middle-Double-Click"
-
- message( "" )
- }
-
- ## Return a keycode from the keyboard, waiting until a key is actually pressed.
- # Escape prompts the user to return either the escape keycode or EOF.
-
- local function getKey(){
- local ch, resp
-
-
- while ( !keyboard_input_pending ) {
- # idle
- }
- ch = getkey()
-
- if ( ch == KEYCODE_ESC &&
- tolower(confirm( "Terminate key sequence? ", "YyNn\r" )) != "n")
- return EOF
-
- return ch;
- }
-
- #----------------------------------------------------------------------
-
- ### view or edit the current key bindings
- #
-
- local startingKeymap;
- local bindingKeymap;
- local bindingListBuffer;
- local bindingDispBuffer;
- local bindingListWindow;
- local bindingDispWindow;
- local lastBindingLine;
- local bindingsInitialized = 0;
- local windowHeight;
- local rightmost_column = 30;
- local currentFunction = "";
- local keyBindings[];
- local deletedKeys[];
- local insertedKeys[];
-
-
- local function binding_init() {
- local txtfile;
- local buffOff;
- local len;
- local str;
- local cw = current_buffer;
- local size;
- local eol_str;
-
-
- key_names_init();
-
- init_menu_colors();
-
- # search sageedit path for the help menu file
- if ( !(txtfile = locate_sageedit_file(SAGEEDIT_FILE_BINDINGS))) {
- txtfile = editor_path( SAGEEDIT_FILE_BINDINGS );
- }
-
- eol_str = default_buffer_eol_string;
- default_buffer_eol_string = "\r\n";
- current_buffer = \
- bindingListBuffer = \
- create_buffer( txtfile, txtfile, BUFFER_SYSTEM + BUFFER_NO_UNDO );
- default_buffer_eol_string = eol_str;
- size = buffer_size;
- current_buffer = cw;
- if (!size) {
- # couldn't find the help information
- notify( "Cannot find binding information in: %s", txtfile );
- delete_buffer( bindingListBuffer );
- return FALSE;
- }
-
- bindingDispBuffer = create_buffer( "Binding", "", BUFFER_SYSTEM + BUFFER_NO_UNDO);
-
- current_buffer = cw;
- message( "" );
-
- return TRUE;
- }
-
-
-
- global function keys() {
- local x0 = 8
- local y0 = 3
- local width = rightmost_column
- local cw = current_window;
- local cb = current_buffer;
- local isDiag = dialog_window+0;
- local i;
-
-
- windowHeight = display_height - y0 -y0;
-
- if (!bindingsInitialized) {
- if (!binding_init())
- return;
- } else bindingsInitialized = 1;
-
- init_menu_colors();
-
- toggle_dialog( 1 );
-
- lastBindingLine = 0;
- startingKeymap = current_keymap;
- bindingKeymap = create_keymap( empty_keymap );
- push_keymap( bindingKeymap );
-
- #
- # create the display window and shadow which will contain the function names
- #
- current_window = bindingDispWindow = \
- create_factory_window( x0+width+2, y0, width, windowHeight,
- WINDOW_SYSTEM + WINDOW_BORDER );
- color_border = BAR_COLOR;
- color_text = BAR_COLOR;
- initBindingAttributes();
- attach_window_buffer( bindingDispWindow, bindingDispBuffer );
-
-
- #
- # create the list window and shadow which will contain the list of keys
- # binding items
- #
- current_window = bindingListWindow = \
- create_factory_window( x0, y0, width, windowHeight,
- WINDOW_SYSTEM + WINDOW_SB_RIGHT + WINDOW_BORDER );
- color_border = BAR_COLOR;
- color_text = BAR_COLOR;
- attach_window_buffer( bindingListWindow, bindingListBuffer );
- initBindingAttributes();
-
- highlight_screen( x0+width, y0+1, 1, windowHeight, SHADOW_COLOR );
- highlight_screen( x0+1, y0+windowHeight, width, 1, SHADOW_COLOR );
-
- x0 += width;
- highlight_screen( x0+2+width, y0+1, 1, windowHeight, SHADOW_COLOR );
- highlight_screen( x0+3, y0+windowHeight, width, 1, SHADOW_COLOR );
-
- current_window = bindingListWindow;
-
- delete( keyBindings );
- delete( deletedKeys );
- delete( insertedKeys );
-
- goto_buffer_top();
- drop_anchor( LINE_SELECTION );
- updateBindItem();
-
- assign_key( "<Esc>", "process_end" );
- assign_key( "<Home>", "bindHome" );
- assign_key( "<End>", "bindEnd" );
- assign_key( "<Up>", "bindUp 1" );
- assign_key( "<Down>", "bindDown 1" );
- assign_key( "<PgUp>", "bindPageUp" );
- assign_key( "<PgDn>", "bindPageDown" );
- assign_key( "<Tab>", "bindToggleWindow" );
- assign_key( "<Left>", "bindToggleWindow 1" );
- assign_key( "<Right>", "bindToggleWindow 0" );
- assign_key( "#61440", "bindLeftPress" );
- assign_key( "#62976", "bindLeftPress" );
- assign_key( "#62208", "bindLeftRelease" );
- assign_key( "<Alt-H>", "display_help_item keys" );
- assign_key( "<Del>", "bindDelete" );
- assign_key( "<Ins>", "bindIns" );
-
-
- current_window = bindingDispWindow;
- bindToggleWindow( 1 );
- process_begin();
- pop_keymap();
-
-
- assign_current_window( cw );
- current_buffer = cb;
-
- delete_keymap( bindingKeymap );
- delete_window( bindingListWindow );
- delete_window( bindingDispWindow );
- current_key = 0;
- display_redraw();
- message( "" );
-
- saveKeys();
-
- toggle_dialog( isDiag );
- }
-
-
-
-
- #
- # initialize the attribute and window names for the binding windows
- # win == 1 setting display window, win == 2 setting list window
- #
- local function initBindingAttributes() {
- color_highlight = HBAR_COLOR;
- visible_virtual_lines = "";
- visible_virtual_spaces = "";
- visible_end_buffer = "";
- }
-
-
- function showBindingItem( lineNum ) {
- local cw = current_window;
- local ln;
- local i;
- local arr;
- local msg_lvl;
-
-
- if (current_window == bindingDispWindow)
- return;
-
- delete( keyBindings );
-
- goto_bol();
- current_column = rightmost_column;
- ln = read_buffer();
- goto_bol();
-
- current_window = bindingDispWindow;
-
- goto_buffer_top();
- while (delete_line())
- continue;
- goto_bol();
-
- if ((ln != "") && (!keyboard_input_pending)) {
- msg_lvl = message_level;
- message_level = 2;
- currentFunction = ln;
- ln = function_binding( function_id( ln ), startingKeymap );
- message_level = msg_lvl;
- split( ln, arr, " " ) + 1;
- for (i in arr) {
- ln = keyAssignmentName( arr[i] );
- insert_string( ln );
- keyBindings[ ln ] = arr[i];
- if (i+1 in arr)
- insert_newline();
- }
- }
-
- goto_buffer_top()
- if (cw)
- current_window = cw;
- }
-
-
- local function keyAssignmentName( str ){
- local keyarr;
- local i;
- local ln = "";
-
- split( str, keyarr, "#" )
- for (i in keyarr) {
- if (keyarr[i])
- ln = ln key_name( atoi(keyarr[i]) );
- }
- delete( keyarr );
- return ln;
- }
-
-
- global function bindLeftPress() {
- local xy_win;
- local mpos;
-
- xy_win = window_containing( mouse_event_x, mouse_event_y );
-
- if (xy_win == bindingDispWindow) {
- bindToggleWindow( 0 );
- return;
- } else if (xy_win == bindingListWindow) {
- bindToggleWindow( 1 );
- mpos = mouse_position(1);
- if ( !and(mpos,MOUSE_W+MOUSE_S+MOUSE_N) ){
- raise_anchor();
- setHighlightedScrolling( 1 );
- left_press( 1 );
- setHighlightedScrolling( 0 );
- }
- updateBindItem();
- }
-
- if ( !region_type() )
- drop_anchor( LINE_SELECTION );
- }
-
-
- function bindToggleWindow( left ){
- if (current_window == bindingDispWindow) {
- message( " , \x1a=window, <Esc>, <Ins>, <Alt-H>=HELP" );
- if (argcount() && !(left+0))
- return;
- raise_anchor();
- display_update();
- current_window = bindingListWindow;
- } else {
- message( " , \x1b=window, <Esc>, <Ins>, <Del> <Alt-H>=HELP" );
- if (argcount() && left+0)
- return;
- current_window = bindingDispWindow;
- drop_anchor( LINE_SELECTION );
- }
-
-
- }
-
-
-
- global function bindLeftRelease(){
- updateBindItem();
- }
-
- global function bindHome() {
- raise_anchor()
- current_line = 1;
- drop_anchor( LINE_SELECTION )
- updateBindItem();
- }
-
- global function bindEnd() {
- raise_anchor()
- current_line = 65535;
- drop_anchor( LINE_SELECTION )
- updateBindItem();
- }
-
- global function bindPageUp( lines ) {
- bindUp( windowHeight )
- }
-
- global function bindPageDown( lines ) {
- bindDown( windowHeight )
- }
-
-
- global function bindDown( lines ) {
- if ( down( lines )) {
- raise_anchor()
- drop_anchor( LINE_SELECTION )
- }
- updateBindItem();
- }
-
-
- global function bindUp( lines ){
- if ( up( lines )) {
- raise_anchor()
- drop_anchor( LINE_SELECTION )
- }
- updateBindItem();
- }
-
-
- global function bindDelete(){
- local ln;
- local kn;
-
- if (current_window == bindingDispWindow) {
- goto_bol();
- kn = read_buffer();
- ln = keyBindings[ kn ];
- if (ln) {
- current_keymap = startingKeymap;
- assign_key( ln, "beep" );
- current_keymap = bindingKeymap;
-
- if (ln in insertedKeys)
- delete( insertedKeys[ ln ] );
- else
- deletedKeys[ kn ] = ln;
-
-
- delete_line();
- if (read_buffer() == "")
- backspace();
- }
- goto_bol();
- } else
- beep();
- }
-
-
- local function waitForKey(){
- local ch;
- while ((ch = getkey()) == -1)
- continue;
- return ch;
- }
-
- global function bindIns(){
- local ch;
- local ln = "";
- local kn;
- local switchWindows = (current_window == bindingListWindow);
-
- if (switchWindows)
- bindToggleWindow( 0 );
-
- raise_anchor();
- insert_newline();
- up();
- drop_anchor( LINE_SELECTION );
- display_update();
-
- message( " <ESC>=discard, <CR>=accept " );
-
- ch = waitForKey();
-
- while( (ch != KEYCODE_ENTER ) \
- && (ch != KEYCODE_KEYPAD_ENTER ) \
- && (ch != KEYCODE_ESC)) {
- kn = key_name( ch );
- insert_string( kn );
- ln = ln "#" ch;
- display_update();
- ch = waitForKey();
- }
-
- if ( (ch == KEYCODE_ENTER) || (ch == KEYCODE_KEYPAD_ENTER) ) {
- if ( !function_id( currentFunction )){
- warning( "Assignment to nonexistent function: " currentFunction );
- if (!pause_on_error)
- ch = waitForKey();
- goto_bol();
- delete_line();
- display_update();
- } else {
- current_keymap = startingKeymap;
- assign_key( ln, currentFunction );
- current_keymap = bindingKeymap;
- goto_bol();
- kn = read_buffer();
- keyBindings[ kn ] = ln;
-
- if (kn in deletedKeys)
- delete( deletedKeys[ kn ] );
- insertedKeys[ ln ] = currentFunction;
- }
- } else {
- delete_line();
- goto_bol();
- if (read_buffer() == "") {
- backspace();
- }
- }
- goto_bol();
-
- if (switchWindows)
- bindToggleWindow( 1 );
-
- }
-
-
-
- local function updateBindItem() {
- local cb = current_buffer;
-
- if (keyboard_input_pending == 0) {
- if (lastBindingLine != current_line) {
- showBindingItem( current_line );
- lastBindingLine = current_line;
- }
- }
- }
-
-
-
-
- local function saveKeys(){
- local fn;
- local i;
- local found = FALSE;
- local cb = current_buffer;
- local changeString = ""
- local searchFlag = 0x0034 # ignore case | regex | forward
- local keyname
-
-
- for (i in insertedKeys) {
- found = TRUE;
- break;
- }
-
- for (i in deletedKeys) {
- found = TRUE;
- break;
- }
-
-
- if (found) {
- # search sageedit path for the config file
- if ( !(fn = locate_sageedit_file(SAGEEDIT_FILE_CONFIG))) {
- fn = editor_path( SAGEEDIT_FILE_CONFIG )
- }
-
- i = confirm( "Save changes to " fn " [yn]? ", "yYnN" );
- if (toupper( i ) != "Y")
- return;
-
- current_buffer = create_buffer( "", fn,BUFFER_SYSTEM + BUFFER_NO_UNDO );
-
-
- #
- # clean out conflicting options
- #
- if ( emulation_mode ) {
- while ( search( \
- "^[ /t]*(native|brief|vi|wordstar|epsilon|msword)>", \
- searchFlag ) ) {
- delete_line()
- goto_buffer_top()
- }
- }
-
- insert_string( emulation_mode "\n" );
-
- search( "$STATE$", SEARCH_FORWARD );
-
- for (i in deletedKeys) {
- if ( match( i, /#/ )) {
- keyname = i
- } else {
- keyname = "#" i
- }
- changeString = changeString keyname "\nassign_key " \
- deletedKeys[i] " \"beep\"\n";
- }
- insert_string( changeString );
- changeString = ""
-
- for (i in insertedKeys)
- changeString = changeString "#" keyAssignmentName(i) "\n"\
- "assign_key " i " " insertedKeys[i] "\n" ;
- insert_string( changeString );
-
- write_buffer();
- delete_buffer();
- current_buffer = cb;
- }
- }
-
- ## display names of keys bound to a specified function
- #
- global function function_binding_key( functionName ) {
- local fid
- local list, arry, keynum, i
- local element, delimiter, msg
-
- key_names_init()
-
- # prompt for function name if not specified
- if ( !functionName ) {
- functionName = prompt_history(
- "XMACRO",
- "Enter function name: ",
- "")
- }
-
- # invoke function_binding to get list of keys in #number form
- if (( fid = function_id( functionName ))) {
- list = function_binding( fid )
-
- # look up key name corresponding to each #number
- split( list, arry, "#" )
- for ( i in arry ) {
- element = arry[i]
- delimiter = (element ~ / $/) ? "; " : ""
- if (( keynum = 0+arry[i] )) {
- if ( keynum in key_names ) {
- element = key_names[ keynum ]
- } else if ( keynum > 31 && keynum < 256 ) {
- element = chr( keynum )
- } else {
- element = "#" keynum
- }
- msg = msg "<" element ">" delimiter
- }
- }
-
- # display the list
- notify( "\"%s\" keys: %s", functionName, msg )
- }
- }
-
-