/trunk/uspace/srv/fb/serial_console.c |
---|
243,6 → 243,54 |
} |
} |
int lastcol = 0; |
int lastrow = 0; |
#define FB_WRITE_BUF_SIZE 256 |
static char fb_write_buf[FB_WRITE_BUF_SIZE]; |
static void fb_write(ipc_callid_t rid, ipc_call_t *request) |
{ |
int row, col; |
ipc_callid_t callid; |
size_t len; |
size_t i; |
row = IPC_GET_ARG1(*request); |
col = IPC_GET_ARG2(*request); |
if ((col >= scr_width) || (row >= scr_height)) { |
ipc_answer_0(callid, EINVAL); |
ipc_answer_0(rid, EINVAL); |
return; |
} |
if (!ipc_data_write_receive(&callid, &len)) { |
ipc_answer_0(callid, EINVAL); |
ipc_answer_0(rid, EINVAL); |
return; |
} |
if (len > FB_WRITE_BUF_SIZE) |
len = FB_WRITE_BUF_SIZE; |
if (len >= scr_width - col) |
len = scr_width - col; |
(void) ipc_data_write_finalize(callid, fb_write_buf, len); |
if ((lastcol != col) || (lastrow != row)) |
serial_goto(row, col); |
for (i = 0; i < len; i++) { |
(*putc_function)(fb_write_buf[i]); |
} |
lastcol = col + len; |
lastrow = row; |
ipc_answer_1(rid, EOK, len); |
} |
/** |
* Main function of the thread serving client connections. |
*/ |
255,8 → 303,6 |
size_t intersize = 0; |
char c; |
int lastcol = 0; |
int lastrow = 0; |
int newcol; |
int newrow; |
int fgcolor; |
317,6 → 363,11 |
(*putc_function)(c); |
retval = 0; |
break; |
case FB_WRITE: |
fb_write(callid, &call); |
/* Message already answered */ |
continue; |
case FB_CURSOR_GOTO: |
newrow = IPC_GET_ARG1(call); |
newcol = IPC_GET_ARG2(call); |
/trunk/uspace/srv/fb/fb.c |
---|
1472,6 → 1472,46 |
return rgb_from_idx(&vport->attr, fg_color, bg_color, flags); |
} |
#define FB_WRITE_BUF_SIZE 256 |
static char fb_write_buf[FB_WRITE_BUF_SIZE]; |
static void fb_write(viewport_t *vport, ipc_callid_t rid, ipc_call_t *request) |
{ |
int row, col; |
ipc_callid_t callid; |
size_t len; |
size_t i; |
row = IPC_GET_ARG1(*request); |
col = IPC_GET_ARG2(*request); |
if ((col >= vport->cols) || (row >= vport->rows)) { |
ipc_answer_0(callid, EINVAL); |
ipc_answer_0(rid, EINVAL); |
return; |
} |
if (!ipc_data_write_receive(&callid, &len)) { |
ipc_answer_0(callid, EINVAL); |
ipc_answer_0(rid, EINVAL); |
return; |
} |
if (len > FB_WRITE_BUF_SIZE) |
len = FB_WRITE_BUF_SIZE; |
if (len >= vport->cols - col) |
len = vport->cols - col; |
(void) ipc_data_write_finalize(callid, fb_write_buf, len); |
for (i = 0; i < len; i++) { |
draw_char(vport, fb_write_buf[i], col++, row); |
} |
ipc_answer_1(rid, EOK, len); |
} |
/** Function for handling connections to FB |
* |
*/ |
1546,6 → 1586,11 |
/* Message already answered */ |
continue; |
case FB_WRITE: |
fb_write(vport, callid, &call); |
/* Message already answered */ |
continue; |
case FB_CLEAR: |
vport_clear(vport); |
cursor_show(vport); |
/trunk/uspace/srv/fb/ega.c |
---|
359,7 → 359,7 |
break; |
default: |
retval = ENOENT; |
retval = EINVAL; |
} |
ipc_answer_0(callid, retval); |
} |