Changeset 3900 for neercs


Ignore:
Timestamp:
Nov 13, 2009, 10:11:05 PM (11 years ago)
Author:
Pascal Terjan
Message:
  • Fix vertical scrolling with arrows
File:
1 edited

Legend:

Unmodified
Added
Removed
  • neercs/trunk/src/term.c

    r3899 r3900  
    9292    unsigned char const *buffer = (unsigned char const*)data;
    9393    unsigned int i, j, k,skip, dummy = 0;
    94     unsigned int width, height;
    95     uint32_t savedattr, scrolled = 0;
     94    unsigned int width, height, top, bottom;
     95    uint32_t savedattr;
    9696    int x = 0, y = 0, save_x = 0, save_y = 0;
    9797
     
    100100    x = caca_get_cursor_x(sc->cv);
    101101    y = caca_get_cursor_y(sc->cv);
     102    top = 1;
     103    bottom = height;
    102104
    103105    if(!sc->init)
     
    438440                //x = width;
    439441                break;
     442            case 'L': /* IL - Insert line */
     443                {
     444                    unsigned int nb_lines = argc ? argv[0] : 1;
     445                    debug("IL %d %d", argc, nb_lines);
     446                    for(j = bottom - 1; j >= (unsigned int)y + nb_lines; j--)
     447                    {
     448                        for(k = 0; k < width; k++)
     449                        {
     450                            caca_put_char(sc->cv, k, j, caca_get_char(sc->cv, k, j - nb_lines));
     451                            caca_put_attr(sc->cv, k, j, caca_get_attr(sc->cv, k, j - nb_lines));
     452                         }
     453                        caca_draw_line(sc->cv, 0, j - nb_lines, width, j - nb_lines, ' ');
     454                    }
     455                }
     456                break;
    440457            case 'P': /* DCH (0x50) - Delete Character */
    441458                if(!argc || argv[0] == 0)
     
    470487                y = (argc > 0 && argv[0] > 0) ? argv[0] - 1 : 0;
    471488                break;
    472             case 'r': /* SS  (0x72) - Scroll Screen FIXME */
    473                 debug("SCROLL scrolled=%d argv=%s", scrolled, argv);
    474                 if(scrolled) break;
    475                 if((argv[0]==0 && argv[1]==0)  || scrolled) break;
    476                 for(j = argv[0]-1; j < argv[1]-1; j++)
    477                 {
    478                     for(k = 0; k < width; k++)
    479                     {
    480                         caca_put_char(sc->cv, k, j, caca_get_char(sc->cv, k, j+1));
    481                         caca_put_attr(sc->cv, k, j, caca_get_attr(sc->cv, k, j+1));
    482                     }
    483                 }
    484                 caca_draw_line(sc->cv, 0, argv[1]-1, width, argv[1]-1, ' ');
    485                 scrolled = 1;
     489            case 'r': /* FIXME */
     490                if(argc == 2) /* DCSTBM - Set top and bottom margin */
     491                {
     492                    debug("DCSTBM %d %d", argv[0], argv[1]);
     493                    top = argv[0];
     494                    bottom = argv[1];
     495                }
     496                else
     497                    debug("ansi import: command r with %d params", argc);
    486498                break;
    487499            case 'h': /* SM (0x68) - FIXME */
     
    609621
    610622        /* Scroll or grow vertically */
    611         if((unsigned int)y >= height)
    612         {
    613             int lines = (y - height) + 1;
     623        if((unsigned int)y >= bottom)
     624        {
     625            int lines = (y - bottom) + 1;
    614626
    615627            savedattr = caca_get_attr(sc->cv, -1, -1);
    616628
    617             for(j = 0; j + lines < height; j++)
     629            for(j = top - 1; j + lines < bottom; j++)
    618630            {
    619631                for(k = 0; k < width; k++)
     
    624636            }
    625637            caca_set_attr(sc->cv, sc->clearattr);
    626             caca_fill_box(sc->cv, 0, height - lines,
    627                                    width - 1, height - 1, ' ');
     638            caca_fill_box(sc->cv, 0, bottom - lines,
     639                                   width - 1, bottom - 1, ' ');
    628640            y -= lines;
    629641            caca_set_attr(sc->cv, savedattr);
Note: See TracChangeset for help on using the changeset viewer.