Subversion Repositories shark

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

/*
 * Project: S.Ha.R.K.
 *
 * Coordinators:
 *   Giorgio Buttazzo    <giorgio@sssup.it>
 *   Paolo Gai           <pj@gandalf.sssup.it>
 *
 * Authors     :
 *   Paolo Gai           <pj@gandalf.sssup.it>
 *   Massimiliano Giorgi <massy@gandalf.sssup.it>
 *   Luca Abeni          <luca@gandalf.sssup.it>
 *   (see the web pages for full authors list)
 *
 * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
 *
 * http://www.sssup.it
 * http://retis.sssup.it
 * http://shark.sssup.it
 */


/**
 ------------
 CVS :        $Id: crtwin.c,v 1.1 2003-03-24 10:54:16 pj Exp $

 File:        $File$
 Revision:    $Revision: 1.1 $
 Last update: $Date: 2003-03-24 10:54:16 $
 ------------

 Author:        Gerardo Lamastra
 Date:  9/5/96

 File:  CrtWin.C
 Revision:      1.1g

 Text windowing functions for S.Ha.R.K.

**/


/*
 * Copyright (C) 2000 Paolo Gai
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * 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.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */


//#include <string.h>
//#include <cons.h>

#include <kernel/kern.h>
#include <ll/string.h>
#include <drivers/keyb.h>
#include <drivers/keycode.h>
#include <drivers/crtwin.h>

#define CUPS1   201        /* Definizione caratteri per */
#define LOR1    205        /* La cornice delle varie    */
#define CUPD1   187        /* Finestre                  */
#define LVR1    186
#define CDWS1   200
#define CDWD1   188

#define CUPS2   218
#define LOR2    196
#define CUPD2   191
#define LVR2    179
#define CDWS2   192
#define CDWD2   217

void win_init(WIN *w, int x, int y, int dx, int dy)
{
    w->x = x;
    w->y = y;
    w->dx = dx;
    w->dy = dy;

    w->px = 0;
    w->py = 0;
}

void win_clear(WIN *w)
{
    _clear(' ',WHITE,w->x+1,w->y+1,w->x+w->dx-1,w->y+w->dy-1);
}

void win_scroll(WIN *w)
{
    _scroll(WHITE,w->x+1,w->y+1,w->x+w->dx-1,w->y+w->dy-1);
}

void win_frame(WIN *w,BYTE bcol,BYTE fcol,char *title,BYTE type)
{
    unsigned char var,var2,len;
    register int i;
    char cus,lv,cud,lo,cds,cdd,cl = ((bcol << 4) | fcol);
    len = strlen(title);
    switch(type) {
               case 1 : cus = CUPS1; lv = LVR1;   cud = CUPD1;
                        lo = LOR1;   cds = CDWS1; cdd = CDWD1;
                        break;
               case 2 : cus = CUPS2; lv = LVR2;   cud = CUPD2;
                        lo = LOR2;   cds = CDWS2; cdd = CDWD2;
                        break;
               default : cus = lv = cud = lo = cds = cdd = 32;
                         break;
    }
    for (i = w->x+1; i < w->x+w->dx; i++) {
        putc_xy(i,w->y,cl,lo);
        putc_xy(i,w->y+w->dy,cl,lo);
    }
    putc_xy(w->x+w->dx,w->y,cl,cud);
    putc_xy(w->x,w->y,cl,cus);
   
    if (title != NULL) {
        var2 = w->x+(w->dx/2) - len/2 - 1;
        var = 0;
        putc_xy(var2,w->y,cl,'[');
        puts_xy(var2+1,w->y,cl,title);
        putc_xy(var2+len+1,w->y,cl,']');
    }
   
    for (i = w->y+1; i < w->y+w->dy; i++) {
        putc_xy(w->x,i,cl,lv);
        putc_xy(w->x+w->dx,i,cl,lv);
    }
    putc_xy(w->x,w->y+w->dy,cl,cds);
    putc_xy(w->x+w->dx,w->y+w->dy,cl,cdd);
}

void win_puts(WIN *w1, char *s)
{
    unsigned pos;
    char c;
    static unsigned short scan_x,x,y;
    WIN w;

    w = *w1;
    x = w.px + w.x + 1;
    y = w.py + w.y + 1;
   
    pos = 2*(y*80 + x);
    while (*s != '\0') {
        c = *s++;
        switch (c) {
            case '\t' : x += 8;
                        if (x >= w.x+w.dx) {
                            x = w.x+1;
                            if (y == w.y+w.dy-1) win_scroll(&w);
                            else y++;
                        } else {
                            scan_x = w.x+1;
                            while ((scan_x+8) < x) scan_x += 8;
                            x = scan_x;
                        }
                        pos = 2*(x + 80*y);
                        break;
            case '\n' : y += (x - w.x - 1) / w.dx + 1;
                        x = w.x + 1;
                        while (y > (w.y+w.dy-1)) {
                            win_scroll(&w);
                            y--;
                        }
                        pos = 2*(x + 80*y);
                        break;
            case '\b' : putc_xy(x-1,y,WHITE,' ');
                        break;
            default   : putc_xy(x,y,WHITE,c);
                        pos += 2;
                        x++;
                        if (x >= w.x + w.dx) {
                            x = w.x+1;
                            if (y >= (w.y + w.dy - 1)) win_scroll(&w);
                            else y++;
                            pos = 2*(x + 80*y);
                        }
        }
    }
    if (x > (w.x+w.dx-1)) {
        y += (x - w.x - 1) / w.dx;
        x = (x - w.x - 1) % w.dx + w.x + 1;
        while (y >= (w.y+w.dy)) {
            win_scroll(&w);
            y--;
        }
    }
    w1->px = x - w.x - 1;
    w1->py = y - w.y - 1;
}

int win_gets(WIN *w, char *s,int len)
{
    int strpos = 0,lungh = 0;
    int x,y,tx,ty,i;
    BYTE flag = FALSE;
    KEY_EVT c;
   
    x = w->px + w->x + 1;
    y = w->py + w->y + 1;
    s[0] = 0;
    place(x,y);

    while (!flag) {
        keyb_getcode(&c,BLOCK);
        if (isScanCode(c) && (c.scan == LEFT_KEY) && (strpos > 0)) {
            strpos--;
            x--;
            if (x <= w->x) {
                x = w->x + w->dx - 1;
                y--;
                if (y <= w->y) y = w->y + 1;
            }
            place(x,y);
        }
        else if (isScanCode(c) && (c.scan == RIGHT_KEY) && s[strpos] != 0) {
            strpos++;
            x++;
            if (x >= (w->x + w->dx)) {
                x = w->x + 1;
                y++;
                if (y >= (w->y + w->dy)) {
                    y--;
                    win_scroll(w);
                }
            }
            place(x,y);
        }
        switch (c.ascii) {
            case ENTER :
                if (!isScanCode(c)) flag = TRUE;
                break;
            case BACKSPACE :
                if (!isScanCode(c) && (strpos > 0)) {
                    strpos--;
                    x--;
                    if (x <= w->x) {
                        x = w->x + w->dx - 1;
                        y --;
                        if (y <= w->y) y = w->y + 1;
                    }
                    tx = x; ty = y;
                    i = strpos;
                    while (s[i] != 0) {
                        s[i] = s[i+1];
                        putc_xy(tx,ty,WHITE,s[i]);
                        i++;
                        tx++;
                        if (tx >= w->x + w->dx) {
                            tx = w->x + 1;
                            ty++;
                        }
                    }
                    lungh--;
                }
                place(x,y);
                break;
            case DELETE :
                if (s[strpos] != 0) lungh--;
                tx = x; ty = y;
                i = strpos;
                while (s[i] != 0) {
                    s[i] = s[i+1];
                    putc_xy(tx,ty,WHITE,s[i]);
                    i++;
                    tx++;
                    if (tx >= w->x + w->dx) {
                        tx = w->x;
                        ty++;
                    }
                }
                place(x,y);
                break;
            default :
                if (!isScanCode(c)) {
                    i = lungh;
                    while (i > strpos) {
                        s[i] = s[i-1];
                        i--;
                    }
                    s[lungh+1] = 0;
                    s[strpos] = c.ascii;
                    strpos++;
                    lungh++;
                    if (lungh == (len - 1)) flag = TRUE;
                    tx = x;
                    ty = y;
                    i = strpos - 1;
                    while (s[i] != 0) {
                        putc_xy(tx,ty,WHITE,s[i]);
                        tx++;
                        i++;
                        if (tx >= (w->x + w->dx)) {
                            tx = w->x + 1;
                            ty++;
                            if (ty >= (w->y + w->dy)) {
                                ty--;
                                y--;
                                win_scroll(w);
                            }
                        }
                    }
                    x++;
                    if (x >= (w->x + w->dx)) {
                        x = w->x + 1;
                        y++;
                    }
                }
                place(x,y);
                break;
        }

    }
    w->px = 0;
    w->py = y - w->y;
    if (w->py >= w->dy - 1) {
        w->py--;
        win_scroll(w);
    }
    return(lungh);
}

static void cons_end(void *arg)
{
    set_active_page(0);
    set_visual_page(0);
}

static void cons_change(KEY_EVT *k)
{
  /* MG */
  //k.scan -= KEY_1;
  set_visual_page(k->scan-KEY_1);
}
           
void screen_init(void)
{
    KEY_EVT k;
    int i;

    k.flag = ALTR_BIT;
    for (i = 0; i < 8; i++) {
        k.ascii = '1' + i;
        k.scan = KEY_1 + i;
        keyb_hook(k,cons_change);
    }
    sys_atrunlevel(cons_end,NULL,RUNLEVEL_AFTER_EXIT);
}