📄 prmt1.c
字号:
head 2.1;access;symbols;locks; strict;comment @ * @;2.1date 95.10.24.15.46.14; author tsurace; state Release;branches;next 1.1;1.1date 95.10.12.19.38.35; author tsurace; state Beta;branches;next ;desc@Primitives - windows, screen@2.1log@Roll.@text@/* prmt1.c: Primitive functions: screen handling, windows */
/* $Id: prmt1.c 1.1 1995/10/12 19:38:35 tsurace Beta tsurace $ */
#include "vt.h"
#include "prmt.h"
extern int curs_loc;
#define CURS_ELSEWHERE 2
extern Estate *gen_read;
extern Dframe suspend_frame;
extern int rows;
/* Screen handling primitives */
PDECL(pr_write)
{
for (; argc--; argv++) {
Tcheckgen(argv->type != F_SPTR);
if (Sinbounds(*argv))
vtwrite(Scstr(*argv));
}
}
PDECL(pr_cmove)
{
Tcheck2(F_INT, F_INT);
cmove(Int1, Int2);
bflushfunc();
}
PDECL(pr_scroll)
{
Tcheck2(F_INT, F_INT);
scroll(Int1, Int2);
bflushfunc();
}
PDECL(pr_scr_fwd)
{
Tcheck1(F_INT);
scr_fwd(Int);
bflushfunc();
}
PDECL(pr_scr_rev)
{
Tcheck2(F_INT, F_INT);
scr_rev(Int);
bflushfunc();
}
PDECL(pr_clrscr)
{
clrscr();
}
PDECL(pr_clreol)
{
clreol();
}
PDECL(pr_bold)
{
bold(Dftrue(Dp));
}
PDECL(pr_curs_reset)
{
curs_loc = CURS_ELSEWHERE;
}
/* Window primitives */
PDECL(pr_split)
{
Tcheck2(F_WIN, F_INT);
if (Int2 >= Un1->Wtop + 2 && Int2 <= Un1->Wbot - 2)
Dset_elem(*rf, F_WIN, Dunode, split_window(Un1, Int2));
Set_err_null("Argument out of range");
}
PDECL(pr_close)
{
Tcheck2(F_WIN, F_INT);
Dset_int(*rf, 0);
Int2 = Int2 ? Int2 : Un1->prev->dummy ? 1 : -1;
if ((!Un1->prev->dummy || Int2 > 0) && (!Un1->next->dummy || Int2 < 0))
close_window(Un1, Int2);
else
rf->Dval = -1;
Set_err_neg("Cannot close window in given direction");
}
PDECL(pr_resize)
{
int bot;
Tcheck2(F_WIN, F_INT);
bot = Un1->next->dummy ? rows - 2 : Un1->next->Wbot - 2;
if (Int2 <= bot && Int2 >= Un1->Wtop + 2) {
resize_window(Un1, Int2);
Dset_int(*rf, 0);
} else
Dset_int(*rf, -1);
Set_err_neg("Argument out of range");
}
PDECL(pr_set_termread)
{
Tcheckgen(T1 != F_WIN || T2 != F_FPTR && T2 != F_NULL);
Un1->Wtermread = T2 == F_FPTR ? Dp2.Dfunc : NULL;
}
PDECL(pr_set_obj)
{
Dframe **objptr;
Tcheckgen(T1 != F_WIN && T1 != F_RMT);
objptr = (T1 == F_WIN) ? &Un1->Wobj : &Un1->Robj;
if (*objptr)
deref_frame(*objptr);
else
*objptr = New(Dframe);
**objptr = Dp2;
ref_frame(*objptr);
}
PDECL(pr_obj)
{
Dframe *obj;
Tcheckgen(T != F_WIN && T != F_RMT);
obj = (T == F_WIN) ? Un->Wobj : Un->Robj;
if (obj)
*rf = *obj;
}
PDECL(pr_echo)
{
Unode *win = Cur_win;
if (argc && argv[0].type == F_WIN) {
win = argv[0].Dunode;
argv++;
argc--;
}
while (argc--) {
Tcheckgen(argv->type != F_SPTR);
output(win, Soastr(*argv));
argv++;
}
}
PDECL(pr_display)
{
Tcheckgen(T1 != F_WIN || T2 != F_RMT && T2 != F_NULL);
if (T2 == F_RMT && Un2->Rwin) {
Dset_int(*rf, (Un2->Rwin == Un1) ? 0 : -1);
Set_err_neg("Remote already displayed");
return;
}
vtc_errflag = 0;
if (Un1->Wrmt)
Un1->Wrmt->Rwin = NULL;
Un1->Wrmt = (T2 == F_RMT) ? Un2 : NULL;
if (T2 == F_RMT)
Un2->Rwin = Un1;
update_echo_mode();
Dset_int(*rf, 0);
}
PDECL(pr_read)
{
Estate *image;
Tcheckgen(argc > 1 || argc == 1 && T != F_WIN && T != F_RMT);
image = suspend(argc);
add_ioqueue(!argc ? &gen_read : T == F_WIN ? &Un->Wrstack
: &Un->Rrstack, image);
*rf = suspend_frame;
}
PDECL(pr_reread)
{
Estate *image, **queue;
Tcheckgen(argc > 1 || argc == 1 && T != F_WIN && T != F_RMT);
image = suspend(argc);
queue = !argc ? &gen_read : T == F_WIN ? &Un->Wrstack : &Un->Rrstack;
image->next = *queue;
*queue = image;
*rf = suspend_frame;
}
PDECL(pr_pass)
{
Istr *is;
Tcheckgen(T1 != F_WIN && T1 != F_RMT || T2 != F_SPTR);
is = Dp2.Dspos ? istr_c(Socstr(Dp2)) : istr_rs(Dp2.Distr->rs);
if (T1 == F_WIN)
give_window(Un1, is);
else
give_remote(Un1, is, 0);
}
PDECL(pr_win_top)
{
Tcheck1(F_WIN);
Dset_int(*rf, Un->Wtop);
}
PDECL(pr_win_bottom)
{
Tcheck1(F_WIN);
Dset_int(*rf, Un->Wbot);
}
PDECL(pr_win_col)
{
Tcheck1(F_WIN);
Dset_int(*rf, Un->Wcol);
}
PDECL(pr_win_rmt)
{
Tcheck1(F_WIN);
if (Un->Wrmt)
Dset_elem(*rf, F_RMT, Dunode, Un->Wrmt);
}
PDECL(pr_win_termread)
{
Tcheck1(F_WIN);
if (Un->Wtermread)
Dset_elem(*rf, F_FPTR, Dfunc, Un->Wtermread);
}
@1.1log@Initial revision@text@d2 1a2 1/* $Id$ */@
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -