fpc/rtl/unix/terminfo.pp

761 lines
26 KiB
ObjectPascal

{
$Id$
This file is part of the Free Pascal run time library.
Copyright (c) 1999-2000 by Florian Klaempfl
member of the Free Pascal development team
TermInfo interface unit for linux
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
unit TermInfo;
interface
{$linklib ncurses}
{$linklib c}
{$packrecords c}
const curseslib = 'ncurses';
const
{ boolean values }
auto_left_margin = 0;
auto_right_margin = 1;
no_esc_ctlc = 2;
ceol_standout_glitch = 3;
eat_newline_glitch = 4;
erase_overstrike = 5;
generic_type = 6;
hard_copy = 7;
has_meta_key = 8;
has_status_line = 9;
insert_null_glitch = 10;
memory_above = 11;
memory_below = 12;
move_insert_mode = 13;
move_standout_mode = 14;
over_strike = 15;
status_line_esc_ok = 16;
dest_tabs_magic_smso = 17;
tilde_glitch = 18;
transparent_underline = 19;
xon_xoff = 20;
needs_xon_xoff = 21;
prtr_silent = 22;
hard_cursor = 23;
non_rev_rmcup = 24;
no_pad_char = 25;
non_dest_scroll_region = 26;
can_change = 27;
back_color_erase = 28;
hue_lightness_saturation = 29;
col_addr_glitch = 30;
cr_cancels_micro_mode = 31;
has_print_wheel = 32;
row_addr_glitch = 33;
semi_auto_right_margin = 34;
cpi_changes_res = 35;
lpi_changes_res = 36;
{ numbers ... }
columns = 0;
init_tabs = 1;
lines = 2;
lines_of_memory = 3;
magic_cookie_glitch = 4;
padding_baud_rate = 5;
virtual_terminal = 6;
width_status_line = 7;
num_labels = 8;
label_height = 9;
label_width = 10;
max_attributes = 11;
maximum_windows = 12;
max_colors = 13;
max_pairs = 14;
no_color_video = 15;
buffer_capacity = 16;
dot_vert_spacing = 17;
dot_horz_spacing = 18;
max_micro_address = 19;
max_micro_jump = 20;
micro_char_size = 21;
micro_line_size = 22;
number_of_pins = 23;
output_res_char = 24;
output_res_line = 25;
output_res_horz_inch = 26;
output_res_vert_inch = 27;
print_rate = 28;
wide_char_size = 29;
buttons = 30;
bit_image_entwining = 31;
bit_image_type = 32;
{ strings }
back_tab = 0;
bell = 1;
carriage_return = 2;
change_scroll_region = 3;
clear_all_tabs = 4;
clear_screen = 5;
clr_eol = 6;
clr_eos = 7;
column_address = 8;
command_character = 9;
cursor_address = 10;
cursor_down = 11;
cursor_home = 12;
cursor_invisible = 13;
cursor_left = 14;
cursor_mem_address = 15;
cursor_normal = 16;
cursor_right = 17;
cursor_to_ll = 18;
cursor_up = 19;
cursor_visible = 20;
delete_character = 21;
delete_line = 22;
dis_status_line = 23;
down_half_line = 24;
enter_alt_charset_mode = 25;
enter_blink_mode = 26;
enter_bold_mode = 27;
enter_ca_mode = 28;
enter_delete_mode = 29;
enter_dim_mode = 30;
enter_insert_mode = 31;
enter_secure_mode = 32;
enter_protected_mode = 33;
enter_reverse_mode = 34;
enter_standout_mode = 35;
enter_underline_mode = 36;
erase_chars = 37;
exit_alt_charset_mode = 38;
exit_attribute_mode = 39;
exit_ca_mode = 40;
exit_delete_mode = 41;
exit_insert_mode = 42;
exit_standout_mode = 43;
exit_underline_mode = 44;
flash_screen = 45;
form_feed = 46;
from_status_line = 47;
init_1string = 48;
init_2string = 49;
init_3string = 50;
init_file = 51;
insert_character = 52;
insert_line = 53;
insert_padding = 54;
key_backspace = 55;
key_catab = 56;
key_clear = 57;
key_ctab = 58;
key_dc = 59;
key_dl = 60;
key_down = 61;
key_eic = 62;
key_eol = 63;
key_eos = 64;
key_f0 = 65;
key_f1 = 66;
key_f10 = 67;
key_f2 = 68;
key_f3 = 69;
key_f4 = 70;
key_f5 = 71;
key_f6 = 72;
key_f7 = 73;
key_f8 = 74;
key_f9 = 75;
key_home = 76;
key_ic = 77;
key_il = 78;
key_left = 79;
key_ll = 80;
key_npage = 81;
key_ppage = 82;
key_right = 83;
key_sf = 84;
key_sr = 85;
key_stab = 86;
key_up = 87;
keypad_local = 88;
keypad_xmit = 89;
lab_f0 = 90;
lab_f1 = 91;
lab_f10 = 92;
lab_f2 = 93;
lab_f3 = 94;
lab_f4 = 95;
lab_f5 = 96;
lab_f6 = 97;
lab_f7 = 98;
lab_f8 = 99;
lab_f9 = 100;
meta_off = 101;
meta_on = 102;
newline = 103;
pad_char = 104;
parm_dch = 105;
parm_delete_line = 106;
parm_down_cursor = 107;
parm_ich = 108;
parm_index = 109;
parm_insert_line = 110;
parm_left_cursor = 111;
parm_right_cursor = 112;
parm_rindex = 113;
parm_up_cursor = 114;
pkey_key = 115;
pkey_local = 116;
pkey_xmit = 117;
print_screen = 118;
prtr_off = 119;
prtr_on = 120;
repeat_char = 121;
reset_1string = 122;
reset_2string = 123;
reset_3string = 124;
reset_file = 125;
restore_cursor = 126;
row_address = 127;
save_cursor = 128;
scroll_forward = 129;
scroll_reverse = 130;
set_attributes = 131;
set_tab = 132;
set_window = 133;
tab = 134;
to_status_line = 135;
underline_char = 136;
up_half_line = 137;
init_prog = 138;
key_a1 = 139;
key_a3 = 140;
key_b2 = 141;
key_c1 = 142;
key_c3 = 143;
prtr_non = 144;
char_padding = 145;
acs_chars = 146;
plab_norm = 147;
key_btab = 148;
enter_xon_mode = 149;
exit_xon_mode = 150;
enter_am_mode = 151;
exit_am_mode = 152;
xon_character = 153;
xoff_character = 154;
ena_acs = 155;
label_on = 156;
label_off = 157;
key_beg = 158;
key_cancel = 159;
key_close = 160;
key_command = 161;
key_copy = 162;
key_create = 163;
key_end = 164;
key_enter = 165;
key_exit = 166;
key_find = 167;
key_help = 168;
key_mark = 169;
key_message = 170;
key_move = 171;
key_next = 172;
key_open = 173;
key_options = 174;
key_previous = 175;
key_print = 176;
key_redo = 177;
key_reference = 178;
key_refresh = 179;
key_replace = 180;
key_restart = 181;
key_resume = 182;
key_save = 183;
key_suspend = 184;
key_undo = 185;
key_sbeg = 186;
key_scancel = 187;
key_scommand = 188;
key_scopy = 189;
key_screate = 190;
key_sdc = 191;
key_sdl = 192;
key_select = 193;
key_send = 194;
key_seol = 195;
key_sexit = 196;
key_sfind = 197;
key_shelp = 198;
key_shome = 199;
key_sic = 200;
key_sleft = 201;
key_smessage = 202;
key_smove = 203;
key_snext = 204;
key_soptions = 205;
key_sprevious = 206;
key_sprint = 207;
key_sredo = 208;
key_sreplace = 209;
key_sright = 210;
key_srsume = 211;
key_ssave = 212;
key_ssuspend = 213;
key_sundo = 214;
req_for_input = 215;
key_f11 = 216;
key_f12 = 217;
key_f13 = 218;
key_f14 = 219;
key_f15 = 220;
key_f16 = 221;
key_f17 = 222;
key_f18 = 223;
key_f19 = 224;
key_f20 = 225;
key_f21 = 226;
key_f22 = 227;
key_f23 = 228;
key_f24 = 229;
key_f25 = 230;
key_f26 = 231;
key_f27 = 232;
key_f28 = 233;
key_f29 = 234;
key_f30 = 235;
key_f31 = 236;
key_f32 = 237;
key_f33 = 238;
key_f34 = 239;
key_f35 = 240;
key_f36 = 241;
key_f37 = 242;
key_f38 = 243;
key_f39 = 244;
key_f40 = 245;
key_f41 = 246;
key_f42 = 247;
key_f43 = 248;
key_f44 = 249;
key_f45 = 250;
key_f46 = 251;
key_f47 = 252;
key_f48 = 253;
key_f49 = 254;
key_f50 = 255;
key_f51 = 256;
key_f52 = 257;
key_f53 = 258;
key_f54 = 259;
key_f55 = 260;
key_f56 = 261;
key_f57 = 262;
key_f58 = 263;
key_f59 = 264;
key_f60 = 265;
key_f61 = 266;
key_f62 = 267;
key_f63 = 268;
clr_bol = 269;
clear_margins = 270;
set_left_margin = 271;
set_right_margin = 272;
label_format = 273;
set_clock = 274;
display_clock = 275;
remove_clock = 276;
create_window = 277;
goto_window = 278;
hangup = 279;
dial_phone = 280;
quick_dial = 281;
tone = 282;
pulse = 283;
flash_hook = 284;
fixed_pause = 285;
wait_tone = 286;
user0 = 287;
user1 = 288;
user2 = 289;
user3 = 290;
user4 = 291;
user5 = 292;
user6 = 293;
user7 = 294;
user8 = 295;
user9 = 296;
orig_pair = 297;
orig_colors = 298;
initialize_color = 299;
initialize_pair = 300;
set_color_pair = 301;
set_foreground = 302;
set_background = 303;
change_char_pitch = 304;
change_line_pitch = 305;
change_res_horz = 306;
change_res_vert = 307;
define_char = 308;
enter_doublewide_mode = 309;
enter_draft_quality = 310;
enter_italics_mode = 311;
enter_leftward_mode = 312;
enter_micro_mode = 313;
enter_near_letter_quality = 314;
enter_normal_quality = 315;
enter_shadow_mode = 316;
enter_subscript_mode = 317;
enter_superscript_mode = 318;
enter_upward_mode = 319;
exit_doublewide_mode = 320;
exit_italics_mode = 321;
exit_leftward_mode = 322;
exit_micro_mode = 323;
exit_shadow_mode = 324;
exit_subscript_mode = 325;
exit_superscript_mode = 326;
exit_upward_mode = 327;
micro_column_address = 328;
micro_down = 329;
micro_left = 330;
micro_right = 331;
micro_row_address = 332;
micro_up = 333;
order_of_pins = 334;
parm_down_micro = 335;
parm_left_micro = 336;
parm_right_micro = 337;
parm_up_micro = 338;
select_char_set = 339;
set_bottom_margin = 340;
set_bottom_margin_parm = 341;
set_left_margin_parm = 342;
set_right_margin_parm = 343;
set_top_margin = 344;
set_top_margin_parm = 345;
start_bit_image = 346;
start_char_set_def = 347;
stop_bit_image = 348;
stop_char_set_def = 349;
subscript_characters = 350;
superscript_characters = 351;
these_cause_cr = 352;
zero_motion = 353;
char_set_names = 354;
key_mouse = 355;
mouse_info = 356;
req_mouse_pos = 357;
get_mouse = 358;
set_a_foreground = 359;
set_a_background = 360;
pkey_plab = 361;
device_type = 362;
code_set_init = 363;
set0_des_seq = 364;
set1_des_seq = 365;
set2_des_seq = 366;
set3_des_seq = 367;
set_lr_margin = 368;
set_tb_margin = 369;
bit_image_repeat = 370;
bit_image_newline = 371;
bit_image_carriage_return = 372;
color_names = 373;
define_bit_image_region = 374;
end_bit_image_region = 375;
set_color_band = 376;
set_page_length = 377;
display_pc_char = 378;
enter_pc_charset_mode = 379;
exit_pc_charset_mode = 380;
enter_scancode_mode = 381;
exit_scancode_mode = 382;
pc_term_options = 383;
scancode_escape = 384;
alt_scancode_esc = 385;
enter_horizontal_hl_mode = 386;
enter_left_hl_mode = 387;
enter_low_hl_mode = 388;
enter_right_hl_mode = 389;
enter_top_hl_mode = 390;
enter_vertical_hl_mode = 391;
{ older synonyms for some booleans }
beehive_glitch = no_esc_ctlc;
teleray_glitch = dest_tabs_magic_smso;
micro_col_size = micro_char_size;
{ internal }
termcap_init2 = 392;
termcap_reset = 393;
magic_cookie_glitch_ul = 33;
backspaces_with_bs = 37;
crt_no_scrolling = 38;
no_correctly_working_cr = 39;
carriage_return_delay = 34;
new_line_delay = 35;
linefeed_if_not_lf = 394;
backspace_if_not_bs = 395;
gnu_has_meta_key = 40;
linefeed_is_newline = 41;
backspace_delay = 36;
horizontal_tab_delay = 37;
number_of_function_keys = 38;
other_non_function_keys = 396;
arrow_key_map = 397;
has_hardware_tabs = 42;
return_does_clr_eol = 43;
acs_ulcorner = 398;
acs_llcorner = 399;
acs_urcorner = 400;
acs_lrcorner = 401;
acs_ltee = 402;
acs_rtee = 403;
acs_btee = 404;
acs_ttee = 405;
acs_hline = 406;
acs_vline = 407;
acs_plus = 408;
memory_lock = 409;
memory_unlock = 410;
box_chars_1 = 411;
const
NCCS = 32;
BoolCount = 44;
NumCount = 39;
StrCount = 412;
type
TCFlag_t = Longint;
Speed_t = Longint;
TermIOS = record
c_iflag, c_oflag, c_cflag, c_lflag: TCFlag_t;
c_line: Byte;
c_cc: array [0..NCCS-1] of Char;
c_ispeed, c_ospeed: Speed_t;
Pad: word;
end;
TT_BoolArray = array [0..BoolCount - 1] of Boolean;
TT_WordArray = array [0..NumCount - 1] of Word;
TT_PCharArray = array [0..StrCount - 1] of PChar;
TermType4 = record
Term_Names: PChar;
Str_Table: PChar;
Booleans: TT_BoolArray;
Numbers: TT_WordArray;
Strings: TT_PCharArray;
end;
Terminal_ptr4 = ^Terminal4;
Terminal4 = record
TType: TermType4;
FileDes: Word;
Ottyb, Nttyb: Termios;
Pad: longint;
end;
TermType5 = record
Term_Names: PChar;
Str_Table: PChar;
Booleans: ^TT_BoolArray;
Numbers: ^TT_WordArray;
Strings: ^TT_PCharArray;
end;
Terminal_ptr5 = ^Terminal5;
Terminal5 = record
TType: TermType5;
FileDes: Word;
Ottyb, Nttyb: Termios;
Pad: longint;
end;
TerminalCommon_ptr1 = ^TerminalCommon1;
TerminalCommon1 = record
Term_Names: PChar;
Str_Table: PChar;
end;
TerminalCommon_ptr2 = ^TerminalCommon2;
TerminalCommon2 = record
FileDes: Word;
Ottyb, Nttyb: Termios;
Pad: longint;
end;
WriterFunc = function (P: PChar): Longint;
var
{$ifndef darwin}
cur_term : TerminalCommon_ptr1; cvar; external;
{$else darwin}
cur_term : TerminalCommon_ptr1; external curseslib name '_cur_term';
{$endif darwin}
cur_term_booleans: ^TT_BoolArray;
cur_term_numbers: ^TT_WordArray;
cur_term_strings: ^TT_PCharArray;
cur_term_common: TerminalCommon_ptr2;
const
cur_term_valid : boolean = false;
{ Note: the following two procedures expect a pointer to a full terminfo }
{ structure, not just to the common parts. However, since this structure }
{ differs for different versions of ncurses,it's impossible to give a }
{ general declaration here which is correct (JM) }
function set_curterm(term: TerminalCommon_ptr1): TerminalCommon_ptr1;cdecl;
function del_curterm(term: TerminalCommon_ptr1): Longint;
{ sets whether to use environment variables for LINES and COLUMNS }
procedure use_env(B: Longint);cdecl;
function putp(Ndx: Longint): Longint;
{ this function must be called before any terminal properties are accessed }
function setupterm(Term: PChar; fd: Longint; var ErrCode: Longint): Longint;
{ reinitialize lib }
function restartterm(Term: PChar; fd: Longint; var ErrCode: Longint): Longint;cdecl;
{function tgetent(P1, P2: PChar): Longint;
function tgetflag(P: PChar): Longint;
function tgetnum(P: PChar): Longint;
function tgoto(P: PChar; L1, L2: Longint): PChar;
function tgetstr(P: PChar; var R: PChar): PChar;
function tigetflag(P: PChar): Longint;
function tigetnum(P: PChar): Longint;
function tigetstr(P: PChar): PChar;
function tparm(P: PChar, ...): PChar;
function tparam(const char *, char *, int, ...): PChar;}
function tputs(Ndx: Word; L1: Longint; F: WriterFunc): Longint;
implementation
uses
baseUnix;
function putp(Ndx: Longint): Longint;
var
P: PChar;
begin
if not assigned(cur_term) then
RunError(219);
P := cur_term_strings^[Ndx];
putp := fpWrite(cur_term_common^.filedes, P^, StrLen(P));
end;
function tputs(Ndx: Word; L1: Longint; F: WriterFunc): Longint;
var
P: PChar;
begin
if not assigned(cur_term) then
RunError(219);
{ L1 := L1; why was this here ?? PM }
P := cur_term_strings^[Ndx];
tputs := F(P);
end;
function set_curterm(term: TerminalCommon_ptr1): TerminalCommon_ptr1; cdecl; external curseslib;
procedure use_env(B: Longint); cdecl; external curseslib;
function restartterm(Term: PChar; fd: Longint; var ErrCode: Longint): Longint; cdecl; external curseslib;
function setuptermC(Term: PChar; fd: Longint; var ErrCode: Longint): Longint; cdecl; external curseslib name 'setupterm';
function setupterm(Term: PChar; fd: Longint; var ErrCode: Longint): Longint;
var
versioncheck: longint;
begin
setupterm := setuptermC(term,fd,errcode);
if not assigned(cur_term) then
exit;
cur_term_valid := true;
versioncheck := 0;
repeat
if (Terminal_ptr4(cur_term)^.ttype.Booleans[versioncheck] in [false,true]) then
inc(versioncheck)
else versioncheck := -1;
until (versioncheck = BoolCount) or
(versioncheck = -1);
if versioncheck = BoolCount then
{ version 4.x }
begin
cur_term_booleans := @Terminal_ptr4(cur_term)^.ttype.Booleans;
cur_term_numbers := @Terminal_ptr4(cur_term)^.ttype.Numbers;
cur_term_strings := @Terminal_ptr4(cur_term)^.ttype.Strings;
cur_term_common := pointer(@Terminal_ptr4(cur_term)^.FileDes);
end
else
{ assume 5.x or higher }
begin
cur_term_booleans := Terminal_ptr5(cur_term)^.ttype.Booleans;
cur_term_numbers := Terminal_ptr5(cur_term)^.ttype.Numbers;
cur_term_strings := Terminal_ptr5(cur_term)^.ttype.Strings;
cur_term_common := pointer(@Terminal_ptr5(cur_term)^.FileDes);
end;
end;
function del_curtermC(term: TerminalCommon_ptr1): Longint; cdecl; external curseslib name 'del_curterm';
function del_curterm(term: TerminalCommon_ptr1): Longint;
var
reset_cur_term : boolean;
begin
if term=cur_term then
begin
cur_term_booleans := nil;
cur_term_numbers := nil;
cur_term_strings := nil;
cur_term_common := nil;
reset_cur_term := true;
end
else
reset_cur_term := false;
del_curterm := del_curtermC(term);
if reset_cur_term then
cur_term_valid := false;
end;
{function tgetent(P1, P2: PChar): Longint; cdecl; external;
function tgetflag(P: PChar): Longint; cdecl; external;
function tgetnum(P: PChar): Longint; cdecl; external;
function tgoto(P: PChar; L1, L2: Longint): PChar; cdecl; external;
function tgetstr(P: PChar; var R: PChar): PChar; cdecl; external;
function tigetflag(P: PChar): Longint; cdecl; external;
function tigetnum(P: PChar): Longint; cdecl; external;
function tigetstr(P: PChar): PChar; cdecl; external;
function tparm(P: PChar; ...): PChar; cdecl; external;
function tparam(const char *, char *, int, ...): PChar; cdecl; external;}
end.
{
$Log$
Revision 1.5 2004-02-06 22:35:50 jonas
+ some darwin support, doesn't work yet because of imported variables
problem
Revision 1.4 2003/09/14 20:15:01 marco
* Unix reform stage two. Remove all calls from Unix that exist in Baseunix.
Revision 1.3 2002/09/07 16:01:28 peter
* old logs removed and tabs fixed
}