Synchronet v3.19b-Win32 (install) has been released (Jan-2022).

You can donate to the Synchronet project using PayPal.

This is an old revision of the document!


UIFC

Background

UIFC (User InterFaCe) is the text mode full-screen user interface library used by SCFG, echocfg, and others. It was originally inspired by the text mode user interface for NetWare 2.x server management utilities for DOS (e.g. SYSCON), and was written from scratch by Digital Man.

Implementations

Over the years, a few different implementations have been ported/written.

uifc.c

The original DOS 16-bit implementation, initialized using uifcini(). This implementation is no longer supported and may have problems due to the size of integers.

uifc32.c

The 32-bit port of the DOS version, initialized using uifcini32(). This is the best supported version and is reccomended for effectively every use.

uifcx.c

The command-line version using standard I/O, initialized using uifcinix(). This version is a “last resort” type of implementation. Many features don't work as intended and it can be difficult to navigate the menus. it is intended to work though.

Javascript

The Javascript implementation that can be utilized with jsexec.js.

Interfaces

Input

Mouse

In most environments, UIFC applications support mouse input:

  • Left-click to select a menu option
  • Left-click outside of active window to move backwards
  • Right-click to move backwards/exit
  • Left-click [■] to move backwards/exit
  • Left-click [?] for a context-sensitive help screen
  • Left-click to scroll down one page
  • Left-click to scroll up one page

Keyboard

Operation Keys
Move selection bar Up and Down arrows, Home (^B), End (^E), Page-up (^U), Page-down (^D)
Select item Enter
Edit item F2
Insert item Insert or +
Delete item Delete or -
Exit ESC or Backspace (^H)
Copy item ^C or Ctrl-Insert or F5
Cut item ^X or Shift-Delete
Paste item ^V or Shift-Insert or F6

Development Documentation

C Interface

Javascript Interface

See JavaScript Object Reference

When using uifc.list, you can pass the WIN_SAV option, along with a context object to preserve the menu selection index.

The context object is created as follows:

var ctx = new uifc.list.CTX(
  0, // current
  0, // bar
  0, // left
  0, // top
  0 // width
);

UIFC List Window Flags

Flag Description C JS
WIN_ORG Original menu, destroy valid screen area Y Y
WIN_SAV Save existing text and replace when finished (use with context object) Y Y
WIN_ACT Menu remains active after a selection Y Y
WIN_INSACT Remains active after insert key Y Y
WIN_DELACT Remains active after delete key Y Y
WIN_CHE Stay active after escape if changes Y Y
WIN_EXTKEYS Return on any keypress. Return value is -2 - keyvalue Y Y
WIN_POP Exit the list as though ESC was pressed. For use after WIN_EXTKEYS or WIN_DYN Y -
WIN_SEL Exit the list as though ENTER was pressed. For use after WIN_EXTKEYS or WIN_DYN Y -
WIN_ESC Screen is active when escape is hit Y Y
WIN_EDITACT Remain active after edit key - Y
WIN_L2R Center the window based on width Y Y
WIN_T2B Center the window based on height Y Y
WIN_RHT Place window against right side of screen Y Y
WIN_MID Place window in middle of screen Y Y
WIN_BOT Place window against bottom of screen Y Y
WIN_FIXEDHEIGHT Use light_height from uifc struct Y Y
WIN_NOBRDR Do not draw a border around the window Y Y
WIN_IMM Draw window and return immediately Y Y
WIN_INACT Draw window inactive, intended for use with WIN_IMM Y -
WIN_DYN Dynamic window, return at least every second Y Y
WIN_REDRAW Force redraw on dynamic window Y Y
WIN_NODRAW Force not to redraw on dynamic window Y Y
WIN_INS Allow user to use insert key Y Y
WIN_DEL Allows use to use delete key Y Y
WIN_COPY Allows F5 to Get/Copy a menu item Y Y
WIN_PASTE Allows F6 to Put/Paste a menu item Y Y
WIN_XTR Add extra line at end for inserting at end Y Y
WIN_CUT Allow Ctrl-X/Cut a Menu Item Y Y
WIN_EDIT Allow F2 to edit a menu item Y Y
WIN_PASTEXTR Allow paste into extra (blank) item Y -
WIN_GET Alias for WIN_COPY Y -
WIN_PUT Alias for WIN_PASTE Y -
WIN_HLP Parse Help Codes Y -
WIN_PACK Pack text in window (no padding) Y Y
WIN_FAT Do not pad outside borders Y Y
WIN_UNGETMOUSE If the mouse is clicked outside window, put mouse even back into even queue Y Y

UIFC Input Keyboard Modes

Flag Description C JS
K_NONE No special behavior Y Y
K_UPPER Converts all letters to upper case Y Y
K_UPRLWR Upper/lower case automatically Y Y
K_NUMBER Allow numbers only Y Y
K_WRAP Allows word wrap Y Y
K_MSG Allows ANSI, Ctrl-N, Ctrl-A, Ctrl-G Y Y
K_SPIN Spinning cursor Y Y
K_LINE Input line (inverse color) Y Y
K_EDIT Edit string passwd Y Y
K_CHAT In chat multi-chat Y Y
K_NOCRLF Don't print CRLF after string input Y Y
K_ALPHA Only allow alphabetic characters Y Y
K_SCANNING UPC Scanner is active, return on '%' Y Y
K_LOWPRIO Low-priority input Y Y
K_NOEXASC No extended ASCII allowed Y Y
K_E71DETECT Detect E-7-1 terminal type Y Y
K_AUTODEL Auto-delete text (used with K_EDIT) Y Y
K_COLD Possible cold key mode Y Y
K_NOECHO Don't echo input Y Y
K_TAB Treat TAB as CR Y Y
K_LEFTEXIT Allow exit from getstr() with backspace Y Y
K_USEOFFSET Use console.getstr_offset with getstr() Y Y
K_NOSPIN Do not honor user's spinning cursor Y Y
K_ANSI_CPR ANSI Cursor Position Report expected Y Y
K_TRIM Trim white-space from both ends of str Y Y
K_CTRLKEYS No control-key handling in inkey() Y Y
K_TABEXIT Exit on TAB or BACKTAB Y Y
K_DECIMAL Allow floating point numbers only Y Y
K_DEUCEEXIT Return on up/down/F2 Y Y
K_MOUSEEXIT Returns when mouse is clicked outside of input area (not window) Y Y
K_PASSWORD Do not display text while editing Y -
K_FIND Don't set the “changes” flag Y -

UIFC List Return Input Masks

Use these masks to check for specific inputs.

Mask Description
MSK_ON Use when checking input (see example)
MSK_OFF Use when checking input (see example)
MSK_INS Insert key pressed, or ENTER pressed on empty entry
MSK_DEL Delete key pressed
MSK_COPY Item copied (Ctrl-C)
MSK_CUT Item cut (Ctrl-X)
MSK_PASTE Item pasted (Ctrl-V)
MSK_EDIT

Example Javascript Usage:

if ((selection & MSK_ON) == MSK_DEL) {
    // delete key pressed
    selection &= MSK_OFF;
}