📄 prmt1.c
字号:
/* prmt1.c: Primitive functions: screen handling, windows */#include "vt.h"#include "prmt.h"extern int curs_loc;#define CURS_ELSEWHERE 2extern 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);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -