The GUI Tools

VIOS comes with four development tools in the spirit of a Smalltalk environment, built on the display server described in The GUI:

Tool Window Shortcut What it is for
Browser 20 Ctrl+Shift+B modules, their words, facts and dependencies; edit and accept source
Workspace 21 Ctrl+Shift+W a scratch text where you evaluate selections (do it, print it, inspect it)
Inspector 22 Ctrl+Shift+I the data stack, memory, tasks, handles and system state
Manager 23 Ctrl+Shift+M boot slots and module packages, behind a confirmation dialog

The ESP does all the navigation, scrolling and editing inside the tool windows. The CPU only fills the panes and acts on what you choose. The tools' engine (kernel/vios_tools.c) runs from the REPL's idle hook: it acts when the console is waiting for input, exactly as if you had typed the command there. While a program runs in the foreground, the tool windows still scroll and edit, but your choices (an accept, a refresh) are carried out only when the program returns to the prompt.

Opening the tools

  • Keyboard. Ctrl+Shift+B, Ctrl+Shift+W, Ctrl+Shift+I and Ctrl+Shift+M open the Browser, Workspace, Inspector and Manager from anywhere. A tool that is already open is brought to the front instead.
  • World menu. In the Smalltalk style, F10 opens the World menu with the four tools. In the Turbo Vision style the same four commands are the entries of the menu bar along the top: F10 runs the first (Browser), Alt+B, Alt+W, Alt+I, Alt+M run the others.
  • Command palette. Ctrl+K (or Ctrl+Shift+P) and type part of the name.
  • From Forth. TOOL ( n -- ) opens or focuses tool n: 0 Browser, 1 Workspace, 2 Inspector, 3 Manager. -1 TOOL closes all of them.
0 TOOL                                   \ the Browser
-1 TOOL                                  \ close every tool window

Close a tool with Ctrl+W (or Alt+F3) while it has the focus. Inside every tool, Tab and Shift+Tab move between panes, Ctrl+Tab and Ctrl+Shift+Tab change tabs, Ctrl+R refreshes the contents and Shift+F10 opens the tool's own menu (the pane menu). Keys that a tool window does not use are dropped rather than passed to the console.

The tools' accelerators are global: Ctrl+Shift+B/W/I/M and Ctrl+R are taken by the window manager in every window, including your own.

Browser and Workspace in the Turbo Vision style
Browser and Workspace in the Turbo Vision style
F10 opens the world menu: the four tools and their shortcuts
F10 opens the world menu: the four tools and their shortcuts
The command palette (Ctrl+K) finds any command by name
The command palette (Ctrl+K) finds any command by name
Ctrl+K, type a few letters, Enter: the Inspector opens; F6 then cycles through the windows
Ctrl+K, type a few letters, Enter: the Inspector opens; F6 then cycles through the windows

The Browser

The Browser has three list panes along the top, a code pane below them and a status line at the bottom.

The Browser showing the DEMO module
The Browser showing the DEMO module
  • Modules pane (left): (all) (every word in the dictionary), (core) (words that belong to no module), then each module, marked with * when it is active. Moving the selection updates the other panes at once.
  • Words pane (middle): the words of the selected module. Typing a letter jumps to the next word starting with it.
  • Info pane (right). For a module: version, crc (of the source), the number of words and token bytes, one needs NAME ok or needs NAME stale line per dependency (stale when the dependency's source changed since), and a used by NAME line for every module that depends on this one. For a word: its kind (primitive, colon, constant, variable, defer, native) and xt, its token and direct code sizes, its module and, for constants and variables, its value.
  • Code pane: the exact source of the selected module, or the retained source of the selected word. It is an ordinary editable text view.
  • Status line: what the selection is and what you can do, for example DEMO: active Ctrl+S accept Shift+F10 menu.

Accept (Ctrl+S in the code pane). What happens depends on what is shown:

  • A module. The code pane's text becomes the module's new source: it is streamed into the workbench draft, compiled and tested in isolation (stage), then activated, the same revision-checked steps as F5 and F6 in the text workbench. On success the status line says DEMO active; words 52% code 31% map 20%, showing how full the dictionary, the code space and the source map are. Every accept keeps the replaced version's code until the next restart, so when any of them passes 80 % the line names the fullest one instead, for example DEMO active; code 84%: save, restart. On failure it says not accepted: and the reason, and the live module is not touched. After an accept the words and info panes show the new version at once; the code pane keeps your text.

Adding a word to a module and accepting it with Ctrl+S - A single word. The text (at most 255 bytes) is evaluated, so the word is redefined, the way a Smalltalk method accept works. For a word that belongs to a module the status line warns that this redefines it outside its module: the module's source is unchanged.

Pane menu (Shift+F10):

Item Effect
Accept as Ctrl+S
Save to SD save the module's active source as its package on the SD card (DEMO: saved to SD). Edits you have not accepted are not saved. When it fails, the status line says not saved: and the reason, for example while the text workbench holds a modified draft of another module
Revert reload the selected module's live source into the code pane, dropping your edits
Refresh (Ctrl+R) re-read the module list and the selected module
The Browser's pane menu
The Browser's pane menu

The panes are separated by one-pixel divider lines, vertical between the lists and horizontal above the code pane.

A word selected in the Browser: its exact source and its facts (kind, execution token, code sizes, module)
A word selected in the Browser: its exact source and its facts (kind, execution token, code sizes, module)

The Workspace

The Workspace is a text view for trying things out. It opens with a reminder:

\ Ctrl+D do it, Ctrl+P print it, Ctrl+I inspect it
3 4 + .

Select some text (Shift with the arrow keys, or Ctrl+A for everything) and press a key; with nothing selected the key works on the caret's line, which it selects first. The selection may be up to 255 bytes. Evaluation uses the same data stack as the console.

Key Name Effect
Ctrl+D do it evaluate; anything printed goes to the Console window
Ctrl+P print it evaluate and insert the output (its first 40 printable characters) after the selection, selected; if nothing was printed, the values the evaluation left on the stack, which stay there
Ctrl+I inspect it evaluate, then show the stack in the Inspector (opened if needed)

On an error the message is inserted after the selection, selected, so one Backspace removes it: NO-SUCH-WORD error: unknown word: NO-SUCH-WORD.

The Workspace after print it
The Workspace after print it
Typing in the Workspace and printing the result
Typing in the Workspace and printing the result

The Inspector

The Inspector has five tabs over a table and a read-only detail pane. Change tabs with Ctrl+Tab, or Left/Right while the tabs have the focus. The contents are a snapshot: press Ctrl+R to refresh.

Tab Table Detail pane
Stack the data stack, top first: position, hex and decimal SEE of the selected value when it is an execution token
Memory 16 rows of 8 bytes: the address and the bytes in hex (-- where nothing can be read)
Tasks id, name and state of every task the TASKS report
Handles the handles report
System the RESOURCES report, then the display server's epoch, error count and frame count and how many times the ESP restarted

Memory paging. The memory table never ends: moving Up from the first row shows 8 bytes earlier, Down from the last row 8 bytes later, PgUp and PgDn at the edges move by 64 bytes. To jump somewhere, put the address on the stack (for example in the Workspace) and choose Go to address from the pane menu.

Pane menu (Shift+F10): Refresh, Go to address (the top of the data stack becomes the memory view's start), Kill task (on the Tasks tab: asks for confirmation, then TASK-KILLs the selected task; Enter on a task does the same).

The Inspector after *inspect it* in the Workspace: the data stack, top first
The Inspector after *inspect it* in the Workspace: the data stack, top first
The Memory tab: 16 rows of 8 bytes from the address on the stack; Up, Down, PgUp and PgDn page through memory
The Memory tab: 16 rows of 8 bytes from the address on the stack; Up, Down, PgUp and PgDn page through memory
The Tasks tab: two background tasks, with the TASKS report below
The Tasks tab: two background tasks, with the TASKS report below
The System tab: engine, dictionary and code use, display-server status (on the host build the engine is C; the board shows DIRECT)
The System tab: engine, dictionary and code use, display-server status (on the host build the engine is C; the board shows DIRECT)
Ctrl+Tab walks the Inspector tabs: Stack, Memory, Tasks, Handles, System
Ctrl+Tab walks the Inspector tabs: Stack, Memory, Tasks, Handles, System

The Manager

The Manager has two tabs.

  • Boot: three actions, Trial the candidate slot, Confirm the running slot and Revert to the confirmed slot, with the boot status and manifest in the detail pane (see Modules and Persistence). Enter on an action asks for confirmation first.
  • Modules: every module with its version and whether it is active. Enter asks to save the selected module to SD; Rollback in the pane menu asks to roll back its latest activation.

The result (done, or failed: and the reason) appears in the detail pane.

The confirmation is a modal Confirm dialog (window 24) with Yes and No buttons. It dims the rest of the screen and keeps the focus until you answer. No has the focus, so Enter on its own cancels; Tab (or Shift+Tab) moves to Yes, then Enter or Space confirms. Esc also cancels.

Pane menu (Shift+F10): Refresh, Save to SD, Rollback.

A Manager action waiting for confirmation
A Manager action waiting for confirmation
The Manager's Boot tab: the boot-slot actions, with the BOOT-STATUS and BOOT-MANIFEST reports below
The Manager's Boot tab: the boot-slot actions, with the BOOT-STATUS and BOOT-MANIFEST reports below
The Manager's Modules tab: active modules, their versions and state
The Manager's Modules tab: active modules, their versions and state

Keyboard reference

Keys are resolved on the ESP in this order: an open menu or palette, the keyboard pointer, move/resize mode, the menu keys, the command palette, command accelerators, window keys, the focused widget, and finally (if nothing used the key and the window allows it) the CPU's keyboard input.

Display and windows

Key Action
Ctrl+Alt+F1 switch between the GUI desktop and the full-screen text console
F1 console and text workbench: switch between them
F6 / Shift+F6 bring the window at the back to the front and focus it / send the focused window to the back and focus the new top one
F5 zoom the focused window to almost the whole screen, or restore it
Ctrl+F5 move/resize mode (see below)
Ctrl+W, Alt+F3 ask to close the focused window (the program decides)
Esc in a modal dialog: ask to close it
Ctrl+F12 keyboard pointer on or off (see below)
Key Action
F10 Smalltalk: open the world menu. Turbo Vision: open the first menu-bar entry
Alt+letter Turbo Vision: open the menu-bar entry with that mnemonic
Shift+F10 open the focused window's pop-up (pane) menu, else the world menu
Ctrl+K, Ctrl+Shift+P command palette
accelerators as defined by the commands, e.g. Ctrl+Shift+B, Ctrl+R
in a menu: Up / Down previous / next item (separators are skipped)
in a menu: Enter, mnemonic letter choose the item
in a menu: Right / Left open the submenu (menu bar: next entry) / close it (menu bar: previous entry)
in a menu: Esc close one level
in the palette: letters, Backspace filter the commands (letters in order), remove a letter

Move/resize mode (Ctrl+F5) and keyboard pointer (Ctrl+F12)

Key Move/resize mode Keyboard pointer
arrows move the window by 8 pixels move the pointer by 8 pixels
Shift+arrows shrink or grow the window by one cell move the pointer by 1 pixel
Enter keep the new geometry (reported as a WIN event) click
Space click
Esc restore the old geometry leave pointer mode
other keys ignored while the mode lasts
F6 cycles the windows, F5 zooms one, Ctrl+F5 then arrows move it and Shift+arrows resize it
F6 cycles the windows, F5 zooms one, Ctrl+F5 then arrows move it and Shift+arrows resize it

Widgets

Widget Keys
any Tab / Shift+Tab: next / previous widget of the window, in creation order. Ctrl+Tab / Ctrl+Shift+Tab: next / previous tab of the window's tabs widget
Button Space or Enter: press
Check box Space: toggle
Radio button Space: select. Up / Down: select the previous / next radio of the group
Input field Left, Right, Home, End move; Backspace, Delete; printable characters insert; Enter: activate
List, table Up, Down, PgUp, PgDn, Home, End; a letter jumps to the next row starting with it; Enter: activate. Tree lists: Right / Left expand / collapse. Pager lists: moving past the first or last row asks the program for more
Tabs Left / Right: previous / next tab

Text views (Browser code pane, Workspace, detail panes)

Key Action
arrows, PgUp, PgDn move the caret (Up/Down keep the column)
Home / End start / end of the line
Ctrl+Home / Ctrl+End start / end of the text
Shift + any of the above extend the selection
Ctrl+A select all
Ctrl+C / Ctrl+X / Ctrl+V copy / cut / paste (an ESP clipboard of 1 KB, shared by all text views)
Enter, Backspace, Delete, printable characters edit (not in read-only views)
Ctrl+[ / Ctrl+] indent / de-indent the selected lines by two spaces
Ctrl+S accept (Browser)
Ctrl+D / Ctrl+P / Ctrl+I do it / print it / inspect it (Workspace)
Tab leave the view (there is no tab character)

Tools

Key Action
Ctrl+Shift+B / W / I / M open or focus the Browser / Workspace / Inspector / Manager
Ctrl+R refresh the focused tool
Enter Inspector Tasks tab: kill the task. Manager: run the action or save the module (after confirmation)
Esc, Enter on No cancel a confirmation

Text workbench

Key Action
Tab switch the focus between the browser and the editor
Up / Down browser: move the selection. Editor: previous / next line
Left / Right browser: from modules to their words / back to the modules. Editor: move the caret
Home, PgUp / End, PgDn browser: first / last entry. Editor: start / end of the line
Enter browser: edit the selected module (or the selected word's module). Editor: new line
Backspace, Delete, printable characters edit the source
Ctrl+Space widen the editor to 80 columns and back
F5 / F6 / F7 / F8 stage and test / activate / save to SD / undo the last edit
F10 close the workbench
F1 switch to the console

The text workbench

Before the windowed tools, VIOS had a text workbench: a full-screen module browser, inspector and source editor on the 80 x 60 text screen. It is still there, and it is also what the Browser's accept uses underneath. Under the GUI it opens as a full-screen window (window 26) above the desktop and owns the keyboard while open, so F5, F6 and F10 mean stage, activate and close there, not zoom, next window and menu.

Open it with WB-OPEN at the console or with F1 from the console; F10 closes it and F1 goes back to the console, keeping the draft. The screen has the browser on the left (modules, or the words of one module), the inspector at the top right (the selected word or module, the data stack and BASE, dictionary use) and the source editor below it, with the draft's state (MODIFIED/CLEAN, STAGED, ACTIVE, SAVED, size and revision) and the last error along the bottom. There is one draft of up to 4096 bytes and one undo step. Kernel words are read-only; choosing a module word edits its module.

The WB- names are console commands, not dictionary words: type each on a line of its own, with its arguments after it; they cannot be compiled into a definition. Most print a WB-STATUS line describing the draft. Every editing command takes the draft's current revision and refuses a stale one, so two clients (the keyboard and the host harness, say) cannot overwrite each other. This session creates, tests, activates and saves a module:

WB-NEW HELLO 1 0

The status line now says revision 2. Insert : SEVEN 7 ; and a line feed (given in hex) at offset 0, which makes it revision 3, and read it back:

WB-PATCH 2 0 0 3A20534556454E2037203B0A
WB-SOURCE 0 12

Stage (compile and test in isolation), activate, and use it:

WB-STAGE 3
WB-ACTIVATE 3
SEVEN .

Save the active module to the SD card:

WB-SAVE 3
Command Arguments Effect
WB-OPEN / WB-CLOSE open / close the workbench (the draft stays)
WB-STATUS print the draft's state
WB-NEW module version discard start an empty draft (discard 1 drops a modified one)
WB-EDIT module discard load an active module's source
WB-PATCH revision offset remove hex replace bytes (at most 80 new bytes, - for none)
WB-META revision version test set the version and test word (- for none)
WB-UNDO revision undo the last edit (F8)
WB-STAGE / WB-ACTIVATE / WB-SAVE revision F5 / F6 / F7
WB-SOURCE offset count print up to 80 bytes of the draft in hex
WB-BROWSE MODULES or WORDS [module] list modules or words
WB-SELECT MODULE name or WORD index select in the browser
WB-KEY code modifiers press a key (256..267: Up, Down, Left, Right, Home, End, Delete, F5, F6, F7, F8, F10)
WB-VIEW row count print screen rows in hex
WB-ZOOM / WB-ZOOM? 0 or 1 wide editor on or off / show it
WB-CONSOLE, WB-CONSOLE?, WB-CONSOLE-CLEAR show the console, show its state, clear it
WB-REPAINT, WB-REDRAW repaint; full recovery after raw VDU/MODE use
WB-FLUSH, WB-FLUSH-FENCED, WB-COMPOSE, WB-RENDER-STATS painting diagnostics

The screen is painted by the deferred word WB-PAINT, which runs at the idle boundary with a temporary stack and a budget of 4096 instructions. If you replace it and your painter fails, painting stops but the draft is safe; put the default back with:

' WB-PAINT-DEFAULT IS WB-PAINT

(followed by WB-REDRAW on the board).

Console and editor

The REPL is the Console window on the desktop (74 x 28 cells, scrolling through 58 lines). Its last row reminds you of the keys: VIOS console F1: editor Up/Down: history. F1 switches between the console and the text workbench, Ctrl+Alt+F1 between the desktop and a full-screen text console with the same contents. See The Console and REPL for line editing and history.