Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 1496 → Rev 1497

/uspace/trunk/console/console.c
40,7 → 40,7
#include <libadt/fifo.h>
#include <screenbuffer.h>
 
#define CONSOLE_COUNT 8
#define CONSOLE_COUNT 12
#define MAX_KEYREQUESTS_BUFFERED 32
 
#define NAME "CONSOLE"
89,6 → 89,60
return CONSOLE_COUNT;
}
 
/** Check key and process special keys.
*
* */
static void write_char(int console, char key)
{
screenbuffer_t *scr = &(connections[console].screenbuffer);
switch (key) {
case '\n':
scr->position_y += 1;
scr->position_x = 0;
break;
case '\r':
break;
case '\t':
scr->position_x += 8;
scr->position_x -= scr->position_x % 8;
break;
case '\b':
if (scr->position_x == 0)
break;
 
scr->position_x--;
 
if (console == active_console) {
ipc_call_async_3(fb_info.phone, FB_PUTCHAR, ' ', scr->position_y, scr->position_x, NULL, NULL);
}
screenbuffer_putchar(scr, ' ');
break;
default:
if (console == active_console) {
ipc_call_async_3(fb_info.phone, FB_PUTCHAR, key, scr->position_y, scr->position_x, NULL, NULL);
}
screenbuffer_putchar(scr, key);
scr->position_x++;
}
scr->position_y += (scr->position_x >= scr->size_x);
if (scr->position_y >= scr->size_y) {
scr->position_y = scr->size_y - 1;
screenbuffer_clear_line(scr, scr->top_line++);
ipc_call_async(fb_info.phone, FB_SCROLL, 1, NULL, NULL);
}
scr->position_x = scr->position_x % scr->size_x;
scr->position_y = scr->position_y % scr->size_y;
}
 
 
/* Handler for keyboard */
static void keyboard_events(ipc_callid_t iid, ipc_call_t *icall)
{
118,12 → 172,14
// if ((c >= KBD_KEY_F1) && (c < KBD_KEY_F1 + CONSOLE_COUNT)) {
if ((c >= '1') && (c < '1' + CONSOLE_COUNT)) {
/*FIXME: draw another console content from buffer */
 
if (c - KBD_KEY_F1 == active_console)
break;
active_console = c - '1';
conn = &connections[active_console];
 
ipc_call_async(fb_info.phone, FB_CURSOR_VISIBILITY, 0, NULL, NULL);
ipc_call_async_2(fb_info.phone, FB_CLEAR, 0, 0, NULL, NULL);
for (i = 0; i < conn->screenbuffer.size_x; i++)
for (j = 0; j < conn->screenbuffer.size_y; j++) {
d = get_field_at(&(conn->screenbuffer),i, j)->character;
166,11 → 222,11
ipc_answer_fast(iid,ELIMIT,0,0);
return;
}
 
connections[consnum].used = 1;
connections[consnum].client_phone = IPC_GET_ARG3(call);
screenbuffer_clear(&(connections[consnum].screenbuffer));
 
/* Accept the connection */
ipc_answer_fast(iid,0,0,0);
182,14 → 238,7
ipc_answer_fast(callid, 0,0,0);
return;
case CONSOLE_PUTCHAR:
/* Send message to fb */
if (consnum == active_console) {
ipc_call_async_3(fb_info.phone, FB_PUTCHAR, IPC_GET_ARG2(call), connections[consnum].screenbuffer.position_y, \
connections[consnum].screenbuffer.position_x, NULL, NULL);
}
screenbuffer_putchar(&(connections[consnum].screenbuffer), IPC_GET_ARG2(call));
write_char(consnum, IPC_GET_ARG1(call));
break;
case CONSOLE_CLEAR:
/* Send message to fb */
270,6 → 319,7
}
}
 
if (ipc_connect_to_me(PHONE_NS, SERVICE_CONSOLE, 0, &phonehash) != 0) {
return -1;
};
/uspace/trunk/console/screenbuffer.c
43,17 → 43,6
field->character = c;
field->style = scr->style;
scr->position_x++;
if (scr->position_x == scr->size_x) {
scr->position_x = 0;
scr->position_y++;
if (scr->position_y == scr->size_y) {
/* scroll */
scr->position_y--;
screenbuffer_clear_line(scr, scr->top_line++);
}
}
return 1;
}
 
65,11 → 54,11
scr->size_x = size_x;
scr->size_y = size_y;
scr->position_y = 0;
scr->position_x = 0;
scr->style.fg_color = DEFAULT_FOREGROUND_COLOR;
scr->style.bg_color = DEFAULT_BACKGROUND_COLOR;
scr->top_line = 0;
screenbuffer_clear(scr);
return scr;
}
 
77,7 → 66,7
{
unsigned int i;
for (i = 0; i < scr->size_x * scr->size_y; i++) {
for (i = 0; i < (scr->size_x * scr->size_y); i++) {
scr->buffer[i].character = ' ';
scr->buffer[i].style = scr->style;
}
113,6 → 102,6
void screenbuffer_goto(screenbuffer_t *scr, unsigned int x, unsigned int y)
{
scr->position_x = x % scr->size_x;
scr->position_y = (y + scr->top_line) % scr->size_y;
scr->position_y = y % scr->size_y;
}
 
/uspace/trunk/libc/generic/io/stream.c
77,7 → 77,7
ipcarg_t r0,r1;
 
for (i = 0; i < count; i++)
ipc_call_sync_2(console_phone, CONSOLE_PUTCHAR, 0, ((const char *)buf)[i], &r0, &r1);
ipc_call_async_2(console_phone, CONSOLE_PUTCHAR, ((const char *)buf)[i], 0, NULL, NULL);
return count;
}