⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 edstruct.c

📁 clips源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
 * window descriptions. Ask the redisplay to do all the hard work. Bound to * "C-X C-Z". */globle int shrinkwind(  void *theEnv,  int f,  int n){        register WINDOW *adjwp;        register LINE   *lp;        register int    i;        if (n < 0)                return (enlargewind(theEnv,f, -n));        if (wheadp->w_wndp == NULL) {                mlwrite("Only one window");                return (FALSE);        }        if ((adjwp=curwp->w_wndp) == NULL) {                adjwp = wheadp;                while (adjwp->w_wndp != curwp)                        adjwp = adjwp->w_wndp;        }        if (curwp->w_ntrows <= (char) n) {                mlwrite("Impossible change");                return (FALSE);        }        if (curwp->w_wndp == adjwp) {           /* Grow below.          */                lp = adjwp->w_linep;                for (i=0; i<n && lback(lp)!=adjwp->w_bufp->b_linep; ++i)                        lp = lback(lp);                adjwp->w_linep  = lp;                adjwp->w_toprow -= (char) n;        } else {                                /* Grow above.          */                lp = curwp->w_linep;                for (i=0; i<n && lp!=curbp->b_linep; ++i)                        lp = lforw(lp);                curwp->w_linep  = lp;                curwp->w_toprow += (char) n;        }        curwp->w_ntrows -= (char) n;        adjwp->w_ntrows += (char) n;        curwp->w_flag |= WFMODE|WFHARD;        adjwp->w_flag |= WFMODE|WFHARD;        return (TRUE);}/* * Pick a window for a pop-up. Split the screen if there is only one window. * Pick the uppermost window that isn't the current window. An LRU algorithm * might be better. Return a pointer, or NULL on error. */globle WINDOW  *wpopup(  void *theEnv){        register WINDOW *wp;        if (wheadp->w_wndp == NULL              /* Only 1 window        */        && splitwind(theEnv,FALSE, 0) == FALSE)        /* and it won't split   */                return (NULL);        wp = wheadp;                            /* Find window to use   */        while (wp!=NULL && wp==curwp)                wp = wp->w_wndp;        return (wp);}/* ========================================================================== *                        DISPLAY MANAGEMENT FUNCTIONS * ========================================================================== *//* * The functions in this section handle redisplay. There are two halves, the * ones that update the virtual display screen, and the ones that make the * physical display screen the same as the virtual display screen. These * functions use hints that are left in the windows by the commands. * * REVISION HISTORY: * * ?    Steve Wilhite, 1-Dec-85 *      - massive cleanup on code. */#define WFDEBUG 0                       /* Window flag debug. *//* * Initialize the data structures used by the display code. The edge vectors * used to access the screens are set up. The operating system's terminal I/O * channel is set up. All the other things get initialized at compile time. * The original window has "WFCHG" set, so that it will get completely * redrawn on the first call to "update". */globle void vtinit(  void *theEnv){    register int i;    register VIDEO *vp;    (*term.t_open)();    vscreen = (VIDEO **) genalloc(theEnv,(unsigned) term.t_nrow*sizeof(VIDEO *));    if (vscreen == NULL)        exit(1);    pscreen = (VIDEO **) genalloc(theEnv,(unsigned) term.t_nrow*sizeof(VIDEO *));    if (pscreen == NULL)        exit(1);    for (i = 0; i < term.t_nrow; ++i)        {        vp = (VIDEO *) genalloc(theEnv,(unsigned) sizeof(VIDEO)+term.t_ncol);        if (vp == NULL)            exit(1);        vscreen[i] = vp;        vp = (VIDEO *) genalloc(theEnv,(unsigned) sizeof(VIDEO)+term.t_ncol);        if (vp == NULL)            exit(1);        pscreen[i] = vp;        }}/* * Clean up the virtual terminal system, in anticipation for a return to the * operating system. Move down to the last line and clear it out (the next * system prompt will be written in the line). Shut down the channel to the * terminal. */globle void vttidy(){    movecursor(term.t_nrow, 0);    (*term.t_eeol)();    (*term.t_close)();}/* * Set the virtual cursor to the specified row and column on the virtual * screen. There is no checking for nonsense values; this might be a good * idea during the early stages. */globle void vtmove(int row,int col){    vtrow = row;    vtcol = col;}/* * Write a character to the virtual screen. The virtual row and column are * updated. If the line is too long put a "$" in the last column. This routine * only puts printing characters into the virtual terminal buffers. Only * column overflow is checked. */globle void vtputc(    int c){    register VIDEO      *vp;    vp = vscreen[vtrow];    if (vtcol >= term.t_ncol)        vp->v_text[term.t_ncol - 1] = '$';    else if (c == '\t')        {        do            {            vtputc(' ');            }        while ((vtcol&0x07) != 0);        }    else if (c < 0x20 || c == 0x7F)        {        vtputc('^');        vtputc(c ^ 0x40);        }    else        vp->v_text[vtcol++] = (char) c;}/* * Erase from the end of the software cursor to the end of the line on which * the software cursor is located. */globle void vteeol(){    register VIDEO      *vp;    vp = vscreen[vtrow];    while (vtcol < term.t_ncol)        vp->v_text[vtcol++] = ' ';}/* * Make sure that the display is right. This is a three part process. First, * scan through all of the windows looking for dirty ones. Check the framing, * and refresh the screen. Second, make sure that "currow" and "curcol" are * correct for the current window. Third, make the virtual and physical * screens the same. */globle void update(){    register LINE *lp;    register WINDOW *wp;    register VIDEO *vp1;    register VIDEO *vp2;    register int i;    register int j;    register int c;    wp = wheadp;    while (wp != NULL)        {        /* Look at any window with update flags set on. */        if (wp->w_flag != 0)            {            /* If not force reframe, check the framing. */            if ((wp->w_flag & WFFORCE) == 0)                {                lp = wp->w_linep;                for (i = 0; i < wp->w_ntrows; ++i)                    {                    if (lp == wp->w_dotp)                        goto out;                    if (lp == wp->w_bufp->b_linep)                        break;                    lp = lforw(lp);                    }                }            /* Not acceptable, better compute a new value for the line at the             * top of the window. Then set the "WFHARD" flag to force full             * redraw.             */            i = wp->w_force;            if (i > 0)                {                --i;                if (i >= wp->w_ntrows)                  i = wp->w_ntrows-1;                }            else if (i < 0)                {                i += wp->w_ntrows;                if (i < 0)                    i = 0;                }            else                i = wp->w_ntrows/2;            lp = wp->w_dotp;            while (i != 0 && lback(lp) != wp->w_bufp->b_linep)                {                --i;                lp = lback(lp);                }            wp->w_linep = lp;            wp->w_flag |= WFHARD;       /* Force full. */out:            /* Try to use reduced update. Mode line update has its own special             * flag. The fast update is used if the only thing to do is within             * the line editing.             */            lp = wp->w_linep;            i = wp->w_toprow;            if ((wp->w_flag & ~WFMODE) == WFEDIT)                {                while (lp != wp->w_dotp)                    {                    ++i;                    lp = lforw(lp);                    }                vscreen[i]->v_flag |= VFCHG;                vtmove(i, 0);                for (j = 0; j < llength(lp); ++j)                    vtputc(lgetc(lp, j));                vteeol();                }             else if ((wp->w_flag & (WFEDIT | WFHARD)) != 0)                {                while (i < wp->w_toprow+wp->w_ntrows)                    {                    vscreen[i]->v_flag |= VFCHG;                    vtmove(i, 0);                    if (lp != wp->w_bufp->b_linep)                        {                        for (j = 0; j < llength(lp); ++j)                            vtputc(lgetc(lp, j));                        lp = lforw(lp);                        }                    vteeol();                    ++i;                    }                }#if ~WFDEBUG            if ((wp->w_flag&WFMODE) != 0)                modeline(wp);            wp->w_flag  = 0;            wp->w_force = 0;#endif            }#if WFDEBUG        modeline(wp);        wp->w_flag =  0;        wp->w_force = 0;#endif        wp = wp->w_wndp;        }    /* Always recompute the row and column number of the hardware cursor. This     * is the only update for simple moves.     */    lp = curwp->w_linep;    currow = curwp->w_toprow;    while (lp != curwp->w_dotp)        {        ++currow;        lp = lforw(lp);        }    curcol = 0;    i = 0;    while (i < curwp->w_doto)        {        c = lgetc(lp, i++);        if (c == '\t')            curcol |= 0x07;        else if (c < 0x20 || c == 0x7F)            ++curcol;        ++curcol;        }/*sprintf(prompt,"Currow: %d  curcol: %d w_toprow: %d", currow, getccol(FALSE),curwp->w_toprow);mlwrite(prompt);*/    if (curcol >= term.t_ncol)          /* Long line. */        curcol = term.t_ncol-1;    /* Special hacking if the screen is garbage. Clear the hardware screen,     * and update your copy to agree with it. Set all the virtual screen     * change bits, to force a full update.     */    if (sgarbf != FALSE)        {        for (i = 0; i < term.t_nrow; ++i)            {            vscreen[i]->v_flag |= VFCHG;            vp1 = pscreen[i];            for (j = 0; j < term.t_ncol; ++j)                vp1->v_text[j] = ' ';            }        movecursor(0, 0);               /* Erase the screen. */        (*term.t_eeop)();        sgarbf = FALSE;                 /* Erase-page clears */        mpresf = FALSE;                 /* the message area. */        }    /* Make sure that the physical and virtual displays agree. Unlike before,     * the "updateline" code is only called with a line that has been updated     * for sure.     */    for (i = 0; i < term.t_nrow; ++i)        {        vp1 = vscreen[i];        if ((vp1->v_flag&VFCHG) != 0)            {            vp1->v_flag &= ~VFCHG;            vp2 = pscreen[i];            updateline(i, &vp1->v_text[0], &vp2->v_text[0]);            }        }    /* Finally, update the hardware cursor and flush out buffers. */    movecursor(currow, curcol);    (*term.t_flush)();}/* * Update a single line. This does not know how to use insert or delete * character sequences; we are using VT52 functionality. Update the physical * row and column variables. It does try an exploit erase to end of line. The * RAINBOW version of this routine uses fast video. */globle void updateline(    int row,    char vline[],    char pline[]){    register char *cp1;    register char *cp2;    register char *cp3;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -