Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 537 → Rev 538

/shark/trunk/drivers/cons/include/drivers/crtwin.h
0,0 → 1,105
/*
* 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.h,v 1.1 2004-03-29 18:31:40 mauro Exp $
 
File: $File$
Revision: $Revision: 1.1 $
Last update: $Date: 2004-03-29 18:31:40 $
------------
 
Author: Giuseppe Lipari
Date: 2/7/96
 
File: CrtWin.H
Revision: 1.0
 
 
**/
 
/*
* 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
*
*/
 
#ifndef __CRTWIN_H__
#define __CRTWIN_H__
 
#ifdef __cplusplus
extern "C" {
#endif
 
typedef struct {
/* Window location & size */
int x,y,dx,dy;
/* Cursor position inside the window */
int px,py;
} WIN;
 
/*
The window layout is depicted here
(x,y) (x+dx,y)
************************
*(0,0) *
* *
* *
* (dx-1,dy-1)*
************************
(x+dx,y+dy)
 
Inside the window relative coords are used!
*/
 
#define SINGLE_FRAME 1
#define DOUBLE_FRAME 2
#define NO_FRAME 0
 
void win_init(WIN *w,int x, int y, int dx, int dy);
void win_frame(WIN *w,BYTE bcol,BYTE fcol,char *title,BYTE type);
void win_scroll(WIN *w);
void win_clear(WIN *w);
void win_puts(WIN *w, char *s);
int win_gets(WIN *w, char *s,int l);
 
//void cons_init(void);
 
#ifdef __cplusplus
};
#endif
 
#endif
/shark/trunk/drivers/cons/crtwin.c
0,0 → 1,355
/*
* 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 2004-03-29 18:31:40 mauro Exp $
 
File: $File$
Revision: $Revision: 1.1 $
Last update: $Date: 2004-03-29 18:31:40 $
------------
 
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/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)
{
//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);
}*/
/shark/trunk/drivers/cons/makefile
11,7 → 11,9
 
OBJS_PATH = $(BASE)/drivers/cons
 
OBJS = cons1.o cons2.o message.o cprintf.o
OBJS = cons1.o cons2.o message.o cprintf.o crtwin.o
 
OTHERINCL += -I$(BASE)/drivers/cons/include
 
include $(BASE)/config/lib.mk