Files
CydandClaude Fable 5 db7745fcd0 sda4: commit the Glaze developer hard-drive dump
Un-ignored: the dev drive is the ground truth the restoration and
emulator work constantly reference (DPL3/LIBDPL + VRENDER i860 renderer
source, BT/RP live+dev game trees, VGL_LABS pod boot, scene/audio
content). Kept in-repo for the pod-owner community.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 19:41:15 -05:00

618 lines
14 KiB
Objective-C

;**
;** BRIEF -- Basic Reconfigurable Interactive Editing Facility
;**
;** Written by Dave Nanian and Michael Strickman.
;**
;**
;** keys.m:
;**
;** This macro allows basic reconfiguration of the key assignments
;** for the commands provided with BRIEF. It displays a menu containing
;** a list of commands, and an adjacent window containing the key
;** assignment(s) for the currently highlighted command. By selecting
;** a command, the user can move into the window, and add or delete
;** key assignments with Ins and Del.
;**
;** The macro uses the Dialog Manager for the menu it displays. The
;** key assignments are changed by modifying and/or adding (assign_to_key)
;** calls to keyboard.h. If no keyboard.h can be found, the macro can
;** be used as an online quick reference card, to find the key sequence
;** associated with each command. If a non-zero parameter is supplied,
;** the macro inserts the key assignments into the current buffer, instead
;** of keyboard.h.
;**
;** Revision history:
;** -----------------
;**
#include "dialog.h"
;**
;** keys:
;**
;** This macro sets up the buffers needed: one for the command menu,
;** one for the key assignment display, and one for keyboard.h. It then
;** calls the Dialog Manager to process commands, and when the user
;** finishes, it writes keyboard.h and registers a macro to recompile
;** startup, if necessary.
;**
(macro keys
(
(extern add_to_path
search_path
)
(int menu_buf
key_buf
include_buf
menu_win
key_win
orig_keyboard
old_buffer
key_parm
)
(string search_text
include_file
bpath
message_str
)
(global search_text
menu_buf
key_buf
include_buf
menu_win
key_win
orig_keyboard
key_parm
bpath
include_file
)
(= old_buffer (inq_buffer))
(= orig_keyboard (inq_keyboard))
(= include_file (add_to_path _dialog_dir "commands.mnu"))
(if (! (exist include_file))
(
(error "Unable to locate help files (commands.mnu).")
(return)
)
)
(= menu_buf (create_buffer "Commands" include_file 1))
(set_buffer menu_buf)
(= search_text (read))
(= bpath (inq_environment "BPATH"))
(if (== (substr bpath 1 1) ";")
(= bpath (substr bpath 2))
)
(if (== (substr bpath 1 1) ".")
(= bpath (substr bpath (+ (index bpath ";") 1)))
)
(if (== bpath "")
(= bpath "/brief/macros")
)
(= include_file (search_path bpath "keyboard.h"))
(= key_parm 0)
(get_parm 0 key_parm)
(if (! key_parm)
(= include_buf (if (== include_file "") 0 (create_buffer "Macro"
include_file 1)))
;else
(
(= key_parm old_buffer)
(= include_buf 0)
)
)
(= key_buf (create_buffer "Assignments" NULL 1))
(create_window 41 21 72 1 (if (|| include_buf key_parm) ", Del to delete, Ins to add" "Current Key Assignments"))
(= key_win (inq_window))
(attach_buffer key_buf)
(set_buffer key_buf)
(refresh)
(if (|| include_buf key_parm)
(sprintf message_str ", , %c, Enter, Ins, or Esc" 26)
;else
(= message_str ", , Enter, or Esc")
)
(_process_menu 7 1 38 1 NULL message_str NULL menu_buf "_keys_menu" 1)
(set_window key_win)
(delete_window)
(if include_buf
(
(set_buffer include_buf)
(if (inq_modified)
(
(if (&& (get_parm NULL message_str "Save changes permanently [yn]? " 1)
(index "nN" message_str))
(message "Changes only effective for this editing session.")
;else
(
(message "") ; Clear cancelled message if there.
(register_macro 5 "_keys_exit")
(write_buffer)
(message "Changes saved.")
)
)
)
)
(if (!= old_buffer include_buf)
(delete_buffer include_buf)
)
)
)
(set_buffer old_buffer)
(delete_buffer menu_buf)
(delete_buffer key_buf)
(call_registered_macro 1)
)
)
;**
;** _keys_menu:
;**
;** This macro is the action routine for the command menu. It handles
;** initialization, changing the menu selection, choosing a menu item,
;** and terminating the menu. All other menu events are irrelevant.
;**
(macro _keys_menu
(
(int event_type
text_found
old_keyboard
)
(string button_text
assign_text
)
(global text_found
button_text
)
(get_parm 0 event_type)
(switch event_type
DIALOG_INIT
(
(extern _dialog_menu_pick)
(= menu_win (inq_window))
(get_parm 2 button_text)
(_keys_menu DIALOG_ALTER_MENU NULL button_text)
(assign_to_key "<Right>" "_dialog_menu_pick")
(if (|| include_buf key_parm)
(
(assign_to_key "<Ins>" "_keys_insert")
(if key_parm
(assign_to_key "<Enter>" "_keys_insert")
)
)
)
(if include_buf
(message "Select item with Enter, add assignment with Ins.")
;else
(message " and  to view key assignments.")
)
)
DIALOG_ALTER_MENU
(
(_keys_menu_message)
(get_parm 2 button_text)
(= button_text
(substr button_text (+ (index button_text ";") 1)))
(sprintf search_text "(assign_to_key \"%%s\" \"%s\"" button_text)
(set_buffer key_buf)
(= old_keyboard (inq_keyboard))
(keyboard_push orig_keyboard)
(= assign_text (inq_assignment button_text 1))
(if (== assign_text "")
(= assign_text (+ (_get_command_str) button_text))
)
(while (! (inq_position))
(delete_line)
)
(insert assign_text)
(top_of_buffer)
(translate "\\<-also\\>" "\n" 1)
(translate "{\\<-and\\>}|{\\<-or\\>\\<*\\>}" "" 1)
(set_buffer menu_buf)
(keyboard_pop 1)
)
DIALOG_PICK_MENU
(
(if (! include_buf)
(
(error "Unable to find macro source; can't reconfigure.")
(return 1)
)
)
(set_window key_win)
(keyboard_push)
(if (strlen (ltrim (read)))
(drop_anchor 3)
)
(_keys_message)
(assign_to_key "<Up>" "_keys_up")
(assign_to_key "<Down>" "_keys_down")
(assign_to_key "<Ins>" "_keys_insert")
(assign_to_key "<Del>" "_keys_delete")
(assign_to_key "<Alt-d>" "_keys_delete")
(assign_to_key "<Esc>" "exit")
(assign_to_key "<F10>" "exit")
(assign_to_key "<Left>" "exit")
(refresh)
(process)
(keyboard_pop)
(raise_anchor)
(set_window menu_win)
(_keys_menu_message)
)
DIALOG_TERM
(
(message "Returning to editing session...")
(assign_to_key "<Ins>" "nothing")
(assign_to_key "<Right>" "nothing")
(assign_to_key "<Enter>" "_dialog_menu_pick")
)
)
(return 1)
)
)
;**
;** _keys_up:
;**
;** When the user presses the up arrow in the Assignments window,
;** this macro is called. If the user isn't at the top of the buffer,
;** it moves the mark up one line.
;**
(macro _keys_up
(
(int line)
(inq_position line)
(if (> line 1)
(
(move_rel -1 0)
(raise_anchor)
(drop_anchor 3)
)
)
)
)
;**
;** _keys_down:
;**
;** Likewise, when the user presses the down arrow in the Assignments
;** window, this macro is called. If the user isn't at the bottom of the
;** buffer, it moves the mark down one line.
;**
(macro _keys_down
(
(move_rel 1 0)
(if (! (inq_position))
(
(raise_anchor)
(drop_anchor 3)
)
;else
(move_rel -1 0)
)
)
)
;**
;** _keys_insert:
;**
;** This one does all the work. If the user wants to add a key
;** assignment, it asks for the new assignment, gets rid of the old
;** assignment (both in the Assignment window and in the keyboard.h
;** file), and inserts the new assign_to_key statement at the bottom
;** of the first macro in keyboard.h (the keyboard macro), or in the
;** current buffer, depending on the parameter passed to keys.
;**
(macro _keys_insert
(
(int key_value
old_win
old_buffer
found
i
abort_insert
)
(string key_string
insert_string
cur_key
)
(= old_win (inq_window))
(= old_buffer (inq_buffer))
(set_window key_win)
(message "Type the key sequence; press Enter to end.")
(while (== (= key_value (read_char)) -1))
(insert "\n")
(up)
(while (!= (& key_value 0xff) 0x0d)
(
(= cur_key (int_to_key key_value))
(insert cur_key)
(+= key_string cur_key)
(message "Continue; press Enter to end, Esc to cancel." key_string)
(if (== (++ i) 5)
(break)
)
(while (== (= key_value (read_char)) -1))
(if (== key_value 0x11b) ; Escape was pressed.
(
(= abort_insert 1)
(break)
)
)
)
)
(delete_line)
(beginning_of_line)
(if abort_insert
(message "Keystroke cancelled.")
;else
(
(if (== key_string "")
(= key_string "<Enter>")
)
(message "Processing assignment...")
(keyboard_push orig_keyboard)
(assign_to_key key_string button_text)
(keyboard_pop 1)
(save_position)
(top_of_buffer)
(= found (search_fwd key_string 0 NULL 0))
(restore_position)
(set_buffer old_buffer)
(if found
(error "Key sequence already assigned.")
;else
(
(sprintf insert_string "(assign_to_key \"%s\"" key_string)
(if include_buf
(
(set_buffer include_buf)
(top_of_buffer)
(if (search_fwd insert_string 0)
(
(delete_line)
(beginning_of_line)
)
)
)
)
(+= insert_string " \"")
(+= insert_string button_text)
(if include_buf
(
(if (search_fwd "<\\c[ \t]+)\n)")
(
(insert (+ (+ "\t\t" insert_string) "\")\n"))
(up)
(sprintf insert_string "Assigned %s to %%s." button_text)
(message insert_string key_string)
)
;else
(error "Unable to locate end of macro.")
)
)
;else
(
(if key_parm
(
(set_buffer key_parm)
(insert (+ insert_string "\")\n"))
)
)
(message "String inserted in current buffer.")
)
)
(set_buffer key_buf)
(insert (+ key_string "\n"))
(raise_anchor)
(if (== (read) "\n")
(delete_line)
)
(up)
(drop_anchor 3)
)
)
)
)
(set_buffer old_buffer)
(set_window old_win)
)
)
;**
;** _keys_delete:
;**
;** This macro is called when the user deletes a key assignment.
;** It assigns the key sequence to "nothing" in the original keyboard,
;** and deletes the text from the Assignments window and the keyboard.h
;** file (if it is there).
;**
(macro _keys_delete
(
(string key_string
search_str
command_str
)
(= key_string (trim (read)))
(= command_str (_get_command_str))
(if (!= (substr key_string 1 (strlen command_str)) command_str)
(
(keyboard_push orig_keyboard)
(assign_to_key key_string "nothing")
(set_buffer include_buf)
(message "Locating old assignment...")
(top_of_buffer)
(sprintf search_str search_text key_string)
(if (search_fwd search_str 0 0)
(
(delete_line)
(beginning_of_line)
)
;else
(if (search_fwd "<\\c[ \t]+)\n)")
(
(sprintf search_str "\t\t(assign_to_key \"%s\" \"nothing\")\n" key_string)
(insert search_str)
(up)
)
;else
(error "Unable to locate end of macro.")
)
)
(set_buffer key_buf)
(set_window key_win)
(delete_block)
(if (inq_position)
(up)
)
(if (strlen (ltrim (read)))
(drop_anchor 3)
)
(keyboard_pop 1)
(_keys_message)
)
)
)
)
;**
;** _keys_exit:
;**
;** This macro is called when the user exits, if there have been
;** any modifications to keyboard.h. It recompiles the startup macro,
;** so the assignments will be in effect next time BRIEF is run.
;**
(macro _keys_exit
(
(int old_buffer)
(string command_string)
(= old_buffer (inq_buffer))
(if (= include_buf (create_buffer "Macros" include_file 1))
(
(set_buffer include_buf)
(message "Recompiling startup macro...")
(if (inq_modified)
(write_buffer)
)
(sprintf command_string "cm %s >&temp.$b$" (add_to_path bpath "startup"))
(if (dos command_string)
(
(int i)
(pause_on_error 1)
(error "Compile failed; run \"cm startup\". Press a key.")
)
;else
(message "Reconfiguration complete.")
)
(del "temp.$b$")
)
;else
(error "Unable to locate %s." include_file)
)
(set_buffer old_buffer)
)
)
;**
;** _keys_message, _keys_menu_message:
;**
;** These macros simply display the appropriate message when
;** they are called.
;**
(macro _keys_message
(message "Press Ins to add assignment, Del to delete.")
)
(macro _keys_menu_message
(
(if include_buf
(message "Select item with Enter, add assignment with Ins.")
;else
(message " and  to view key assignments.")
)
)
)
;**
;** _get_command_str:
;**
;** Gets the key sequence that is used for the execute_macro
;** primitive. If multiple assignments exist, only the first one
;** is used.
;**
(macro _get_command_str
(
(string command_str
)
(int command_len
)
(keyboard_push orig_keyboard)
(= command_str (inq_assignment "execute_macro" 1))
(keyboard_pop 1)
(if (= command_len (index command_str "<-and>"))
(= command_str (substr command_str 1 (- command_len 1)))
)
(if (= command_len (index command_str "<-also>"))
(= command_str (substr command_str 1 (- command_len 1)))
)
(returns (+ command_str " "))
)
)