Subversion Repositories HelenOS

Rev

Rev 4348 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4348 Rev 4691
Line 41... Line 41...
41
#include <ipc/ipc.h>
41
#include <ipc/ipc.h>
42
#include <async.h>
42
#include <async.h>
43
#include <ipc/fb.h>
43
#include <ipc/fb.h>
44
#include <bool.h>
44
#include <bool.h>
45
#include <errno.h>
45
#include <errno.h>
46
#include <console/color.h>
46
#include <io/color.h>
47
#include <console/style.h>
47
#include <io/style.h>
-
 
48
#include <string.h>
48
 
49
 
49
#include "../console/screenbuffer.h"
50
#include "../console/screenbuffer.h"
50
#include "main.h"
51
#include "main.h"
51
#include "serial_console.h"
52
#include "serial_console.h"
52
 
53
 
Line 126... Line 127...
126
        (*putc_function)('?');
127
        (*putc_function)('?');
127
    }
128
    }
128
 
129
 
129
}
130
}
130
 
131
 
131
void serial_goto(const unsigned int row, const unsigned int col)
132
void serial_goto(const unsigned int col, const unsigned int row)
132
{
133
{
133
    if ((row > scr_height) || (col > scr_width))
134
    if ((col > scr_width) || (row > scr_height))
134
        return;
135
        return;
135
   
136
   
136
    char control[MAX_CONTROL];
137
    char control[MAX_CONTROL];
137
    snprintf(control, MAX_CONTROL, "\033[%u;%uf", row + 1, col + 1);
138
    snprintf(control, MAX_CONTROL, "\033[%u;%uf", row + 1, col + 1);
138
    serial_puts(control);
139
    serial_puts(control);
Line 151... Line 152...
151
}
152
}
152
 
153
 
153
void serial_scroll(int i)
154
void serial_scroll(int i)
154
{
155
{
155
    if (i > 0) {
156
    if (i > 0) {
156
        serial_goto(scr_height - 1, 0);
157
        serial_goto(0, scr_height - 1);
157
        while (i--)
158
        while (i--)
158
            serial_puts("\033D");
159
            serial_puts("\033D");
159
    } else if (i < 0) {
160
    } else if (i < 0) {
160
        serial_goto(0, 0);
161
        serial_goto(0, 0);
161
        while (i++)
162
        while (i++)
Line 233... Line 234...
233
static void serial_set_rgb(uint32_t fgcolor, uint32_t bgcolor)
234
static void serial_set_rgb(uint32_t fgcolor, uint32_t bgcolor)
234
{
235
{
235
    if (fgcolor < bgcolor)
236
    if (fgcolor < bgcolor)
236
        serial_sgr(SGR_REVERSE_OFF);
237
        serial_sgr(SGR_REVERSE_OFF);
237
    else
238
    else
238
        serial_sgr(SGR_REVERSE);   
239
        serial_sgr(SGR_REVERSE);
239
}
240
}
240
 
241
 
241
static void serial_set_attrs(const attrs_t *a)
242
static void serial_set_attrs(const attrs_t *a)
242
{
243
{
243
    switch (a->t) {
244
    switch (a->t) {
-
 
245
    case at_style:
244
    case at_style: serial_set_style(a->a.s.style); break;
246
        serial_set_style(a->a.s.style);
-
 
247
        break;
-
 
248
    case at_rgb:
245
    case at_rgb: serial_set_rgb(a->a.r.fg_color, a->a.r.bg_color); break;
249
        serial_set_rgb(a->a.r.fg_color, a->a.r.bg_color);
-
 
250
        break;
-
 
251
    case at_idx:
246
    case at_idx: serial_set_idx(a->a.i.fg_color,
252
        serial_set_idx(a->a.i.fg_color,
247
        a->a.i.bg_color, a->a.i.flags); break;
253
            a->a.i.bg_color, a->a.i.flags);
-
 
254
        break;
248
    default: break;
255
    default:
-
 
256
        break;
249
    }
257
    }
250
}
258
}
251
 
259
 
252
/** Draw text data to viewport.
260
/** Draw text data to viewport.
253
 *
261
 *
Line 263... Line 271...
263
{
271
{
264
    unsigned int i, j;
272
    unsigned int i, j;
265
    keyfield_t *field;
273
    keyfield_t *field;
266
    attrs_t *a0, *a1;
274
    attrs_t *a0, *a1;
267
 
275
 
268
    serial_goto(y, x);
276
    serial_goto(x, y);
269
    a0 = &data[0].attrs;
277
    a0 = &data[0].attrs;
270
    serial_set_attrs(a0);
278
    serial_set_attrs(a0);
271
 
279
 
272
    for (j = 0; j < h; j++) {
280
    for (j = 0; j < h; j++) {
273
        if (j > 0 && w != scr_width)
281
        if (j > 0 && w != scr_width)
274
            serial_goto(y, x);
282
            serial_goto(x, j);
275
 
283
 
276
        for (i = 0; i < w; i++) {
284
        for (i = 0; i < w; i++) {
277
            field = &data[j * w + i];
285
            field = &data[j * w + i];
278
 
286
 
279
            a1 = &field->attrs;
287
            a1 = &field->attrs;
Line 352... Line 360...
352
            if (col + w > scr_width || row + h > scr_height) {
360
            if (col + w > scr_width || row + h > scr_height) {
353
                retval = EINVAL;
361
                retval = EINVAL;
354
                break;
362
                break;
355
            }
363
            }
356
            draw_text_data(interbuf, col, row, w, h);
364
            draw_text_data(interbuf, col, row, w, h);
357
            lastrow = row + h - 1;
-
 
358
            lastcol = col + w;
365
            lastcol = col + w;
-
 
366
            lastrow = row + h - 1;
359
            retval = 0;
367
            retval = 0;
360
            break;
368
            break;
361
        case FB_PUTCHAR:
369
        case FB_PUTCHAR:
362
            c = IPC_GET_ARG1(call);
370
            c = IPC_GET_ARG1(call);
363
            row = IPC_GET_ARG2(call);
371
            col = IPC_GET_ARG2(call);
364
            col = IPC_GET_ARG3(call);
372
            row = IPC_GET_ARG3(call);
365
            if ((lastcol != col) || (lastrow != row))
373
            if ((lastcol != col) || (lastrow != row))
366
                serial_goto(row, col);
374
                serial_goto(col, row);
367
            lastcol = col + 1;
375
            lastcol = col + 1;
368
            lastrow = row;
376
            lastrow = row;
369
            serial_putchar(c);
377
            serial_putchar(c);
370
            retval = 0;
378
            retval = 0;
371
            break;
379
            break;
372
        case FB_CURSOR_GOTO:
380
        case FB_CURSOR_GOTO:
373
            row = IPC_GET_ARG1(call);
381
            col = IPC_GET_ARG1(call);
374
            col = IPC_GET_ARG2(call);
382
            row = IPC_GET_ARG2(call);
375
            serial_goto(row, col);
383
            serial_goto(col, row);
376
            lastrow = row;
-
 
377
            lastcol = col;
384
            lastcol = col;
-
 
385
            lastrow = row;
378
            retval = 0;
386
            retval = 0;
379
            break;
387
            break;
380
        case FB_GET_CSIZE:
388
        case FB_GET_CSIZE:
381
            ipc_answer_2(callid, EOK, scr_height, scr_width);
389
            ipc_answer_2(callid, EOK, scr_width, scr_height);
-
 
390
            continue;
-
 
391
        case FB_GET_COLOR_CAP:
-
 
392
            ipc_answer_1(callid, EOK, color ? FB_CCAP_INDEXED :
-
 
393
                FB_CCAP_STYLE);
382
            continue;
394
            continue;
383
        case FB_CLEAR:
395
        case FB_CLEAR:
384
            serial_clrscr();
396
            serial_clrscr();
385
            retval = 0;
397
            retval = 0;
386
            break;
398
            break;
Line 414... Line 426...
414
            if ((i > scr_height) || (i < -scr_height)) {
426
            if ((i > scr_height) || (i < -scr_height)) {
415
                retval = EINVAL;
427
                retval = EINVAL;
416
                break;
428
                break;
417
            }
429
            }
418
            serial_scroll(i);
430
            serial_scroll(i);
419
            serial_goto(lastrow, lastcol);
431
            serial_goto(lastcol, lastrow);
420
            retval = 0;
432
            retval = 0;
421
            break;
433
            break;
422
        case FB_CURSOR_VISIBILITY:
434
        case FB_CURSOR_VISIBILITY:
423
            if(IPC_GET_ARG1(call))
435
            if(IPC_GET_ARG1(call))
424
                serial_cursor_enable();
436
                serial_cursor_enable();
Line 443... Line 455...
443
        }
455
        }
444
        ipc_answer_0(callid, retval);
456
        ipc_answer_0(callid, retval);
445
    }
457
    }
446
}
458
}
447
 
459
 
448
/**
460
/**
449
 * @}
461
 * @}
450
 */
462
 */