Subversion Repositories HelenOS-historic

Rev

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

Rev 1485 Rev 1486
Line 75... Line 75...
75
    /* Text support in window */
75
    /* Text support in window */
76
    unsigned int rows, cols;
76
    unsigned int rows, cols;
77
    /* Style for text printing */
77
    /* Style for text printing */
78
    int bgcolor, fgcolor;
78
    int bgcolor, fgcolor;
79
    /* Auto-cursor position */
79
    /* Auto-cursor position */
80
    int cursor_active, cur_x, cur_y;
80
    int cursor_active, cur_col, cur_row;
81
} viewport_t;
81
} viewport_t;
82
 
82
 
83
#define MAX_VIEWPORTS 128
83
#define MAX_VIEWPORTS 128
84
static viewport_t viewports[128];
84
static viewport_t viewports[128];
85
 
85
 
Line 195... Line 195...
195
               &screen.fbaddress[POINTPOS(viewports[vp].x,viewports[vp].y)],
195
               &screen.fbaddress[POINTPOS(viewports[vp].x,viewports[vp].y)],
196
               screen.pixelbytes * viewports[vp].width);
196
               screen.pixelbytes * viewports[vp].width);
197
    }  
197
    }  
198
}
198
}
199
 
199
 
200
/** Optimized scroll for windows that cover whole lines */
-
 
201
//static void scroll_optim(int vp, int rows)
-
 
202
//{
-
 
203
    /* TODO */
-
 
204
//}
-
 
205
 
-
 
206
/** Scroll port up/down
200
/** Scroll port up/down
207
 *
201
 *
208
 * @param vp Viewport to scroll
202
 * @param vp Viewport to scroll
209
 * @param rows Positive number - scroll up, negative - scroll down
203
 * @param rows Positive number - scroll up, negative - scroll down
210
 */
204
 */
Line 320... Line 314...
320
            break;
314
            break;
321
    }
315
    }
322
    if (i == MAX_VIEWPORTS)
316
    if (i == MAX_VIEWPORTS)
323
        return ELIMIT;
317
        return ELIMIT;
324
 
318
 
325
    viewports[i].initialized = 1;
319
    if (width ==0 || height == 0 ||
-
 
320
        x+width > screen.xres || y+height > screen.yres)
-
 
321
        return EINVAL;
-
 
322
    if (width < FONT_SCANLINES || height < COL_WIDTH)
-
 
323
        return EINVAL;
-
 
324
 
326
    viewports[i].x = x;
325
    viewports[i].x = x;
327
    viewports[i].y = y;
326
    viewports[i].y = y;
328
    viewports[i].width = width;
327
    viewports[i].width = width;
329
    viewports[i].height = height;
328
    viewports[i].height = height;
330
   
329
   
Line 332... Line 331...
332
    viewports[i].cols = width / COL_WIDTH;
331
    viewports[i].cols = width / COL_WIDTH;
333
 
332
 
334
    viewports[i].bgcolor = DEFAULT_BGCOLOR;
333
    viewports[i].bgcolor = DEFAULT_BGCOLOR;
335
    viewports[i].fgcolor = DEFAULT_FGCOLOR;
334
    viewports[i].fgcolor = DEFAULT_FGCOLOR;
336
   
335
   
-
 
336
    viewports[i].initialized = 1;
-
 
337
 
337
    return i;
338
    return i;
338
}
339
}
339
 
340
 
340
 
341
 
341
/** Initialize framebuffer as a chardev output device
342
/** Initialize framebuffer as a chardev output device
Line 412... Line 413...
412
    screen_init(fb_addr, fb_width, fb_height, fb_bpp, fb_scanline);
413
    screen_init(fb_addr, fb_width, fb_height, fb_bpp, fb_scanline);
413
 
414
 
414
    return 0;
415
    return 0;
415
}
416
}
416
 
417
 
-
 
418
static void draw_char(int vp, char c, unsigned int col, unsigned int row)
-
 
419
{
-
 
420
    viewport_t *vport = &viewports[vp];
-
 
421
 
-
 
422
    if (vport->cursor_active && (vport->cur_col != col || vport->cur_row != row))
-
 
423
        invert_char(vp, vport->cur_col,vport->cur_row);
-
 
424
   
-
 
425
    draw_glyph(vp, c, col, row);
-
 
426
   
-
 
427
    if (vport->cursor_active) {
-
 
428
        vport->cur_col++;
-
 
429
        if (vport->cur_col>= vport->cols) {
-
 
430
            vport->cur_col = 0;
-
 
431
            vport->cur_row++;
-
 
432
            if (vport->cur_row >= vport->rows)
-
 
433
                vport->cur_row--;
-
 
434
        }
-
 
435
        invert_char(vp, vport->cur_col,vport->cur_row);
-
 
436
    }
-
 
437
}
-
 
438
 
417
void client_connection(ipc_callid_t iid, ipc_call_t *icall)
439
void client_connection(ipc_callid_t iid, ipc_call_t *icall)
418
{
440
{
419
    ipc_callid_t callid;
441
    ipc_callid_t callid;
420
    ipc_call_t call;
442
    ipc_call_t call;
421
    int retval;
443
    int retval;
422
    int i;
444
    int i;
423
    unsigned int row,col;
445
    unsigned int row,col;
424
    char c;
446
    char c;
-
 
447
 
425
    int vp = 0;
448
    int vp = 0;
-
 
449
    viewport_t *vport = &viewports[0];
426
 
450
 
427
    if (client_connected) {
451
    if (client_connected) {
428
        ipc_answer_fast(iid, ELIMIT, 0,0);
452
        ipc_answer_fast(iid, ELIMIT, 0,0);
429
        return;
453
        return;
430
    }
454
    }
-
 
455
    client_connected = 1;
431
    ipc_answer_fast(iid, 0, 0, 0); /* Accept connection */
456
    ipc_answer_fast(iid, 0, 0, 0); /* Accept connection */
432
 
457
 
433
    while (1) {
458
    while (1) {
434
        callid = async_get_call(&call);
459
        callid = async_get_call(&call);
435
        switch (IPC_GET_METHOD(call)) {
460
        switch (IPC_GET_METHOD(call)) {
436
        case IPC_M_PHONE_HUNGUP:
461
        case IPC_M_PHONE_HUNGUP:
437
            client_connected = 0;
462
            client_connected = 0;
438
            /* cleanup other viewports */
463
            /* cleanup other viewports */
439
            for (i=1; i < MAX_VIEWPORTS; i++)
464
            for (i=1; i < MAX_VIEWPORTS; i++)
440
                viewports[i].initialized = 0;
465
                vport->initialized = 0;
441
            ipc_answer_fast(callid,0,0,0);
466
            ipc_answer_fast(callid,0,0,0);
442
            return; /* Exit thread */
467
            return; /* Exit thread */
443
        case FB_PUTCHAR:
468
        case FB_PUTCHAR:
444
            c = IPC_GET_ARG1(call);
469
            c = IPC_GET_ARG1(call);
445
            row = IPC_GET_ARG2(call);
470
            row = IPC_GET_ARG2(call);
446
            col = IPC_GET_ARG3(call);
471
            col = IPC_GET_ARG3(call);
447
            if (row >= viewports[vp].rows || col >= viewports[vp].cols) {
472
            if (row >= vport->rows || col >= vport->cols) {
448
                retval = EINVAL;
473
                retval = EINVAL;
449
                break;
474
                break;
450
            }
475
            }
451
            ipc_answer_fast(callid,0,0,0);
476
            ipc_answer_fast(callid,0,0,0);
-
 
477
 
452
            draw_glyph(vp,c, row, col);
478
            draw_char(vp, c, row, col);
453
            continue; /* msg already answered */
479
            continue; /* msg already answered */
454
        case FB_CLEAR:
480
        case FB_CLEAR:
455
            clear_port(vp);
481
            clear_port(vp);
-
 
482
            if (vport->cursor_active)
-
 
483
                invert_char(vp, vport->cur_col,vport->cur_row);
456
            retval = 0;
484
            retval = 0;
457
            break;
485
            break;
458
/*      case FB_CURSOR_GOTO: */
486
        case FB_CURSOR_GOTO:
-
 
487
            row = IPC_GET_ARG1(call);
-
 
488
            col = IPC_GET_ARG2(call);
-
 
489
            if (row >= vport->rows || col >= vport->cols) {
-
 
490
                retval = EINVAL;
-
 
491
                break;
-
 
492
            }
459
/*          retval = 0; */
493
            retval = 0;
-
 
494
            if (viewports[vp].cursor_active) {
-
 
495
                invert_char(vp, vport->cur_col,vport->cur_row);
-
 
496
                invert_char(vp, col, row);
-
 
497
            }
-
 
498
            vport->cur_col = col;
-
 
499
            vport->cur_row = row;
460
/*          break; */
500
            break;
461
/*      case FB_CURSOR_VISIBILITY: */
501
        case FB_CURSOR_VISIBILITY:
-
 
502
            i = IPC_GET_ARG1(call);
462
/*          retval = 0; */
503
            retval = 0;
-
 
504
            if ((i && vport->cursor_active) || (!i && !vport->cursor_active))
463
/*          break; */
505
                break;
-
 
506
 
-
 
507
            vport->cursor_active = i;
-
 
508
            invert_char(vp, vport->cur_col,vport->cur_row);
-
 
509
            break;
464
        case FB_GET_CSIZE:
510
        case FB_GET_CSIZE:
465
            ipc_answer_fast(callid, 0, viewports[vp].rows, viewports[vp].cols);
511
            ipc_answer_fast(callid, 0, vport->rows, vport->cols);
-
 
512
            continue;
-
 
513
        case FB_SCROLL:
-
 
514
            i = IPC_GET_ARG1(call);
-
 
515
            if (i > vport->rows || i < (- (int)vport->rows)) {
-
 
516
                retval = EINVAL;
-
 
517
                break;
-
 
518
            }
-
 
519
            if (vport->cursor_active)
-
 
520
                invert_char(vp, vport->cur_col,vport->cur_row);
-
 
521
            scroll_port(vp, i);
-
 
522
            if (vport->cursor_active)
-
 
523
                invert_char(vp, vport->cur_col,vport->cur_row);
-
 
524
            retval = 0;
-
 
525
            break;
-
 
526
        case FB_VIEWPORT_SWITCH:
-
 
527
            i = IPC_GET_ARG1(call);
-
 
528
            if (i < 0 || i >= MAX_VIEWPORTS) {
-
 
529
                retval = EINVAL;
-
 
530
                break;
-
 
531
            }
-
 
532
            if (! viewports[i].initialized ) {
-
 
533
                retval = EADDRNOTAVAIL;
-
 
534
                break;
-
 
535
            }
-
 
536
            vp = i;
-
 
537
            vport = &viewports[vp];
-
 
538
            retval = 0;
-
 
539
            break;
-
 
540
        case FB_VIEWPORT_CREATE:
-
 
541
            retval = viewport_create(IPC_GET_ARG1(call) >> 16,
-
 
542
                         IPC_GET_ARG1(call) & 0xffff,
-
 
543
                         IPC_GET_ARG2(call) >> 16,
-
 
544
                         IPC_GET_ARG2(call) & 0xffff);
-
 
545
            break;
-
 
546
        case FB_VIEWPORT_DELETE:
-
 
547
            i = IPC_GET_ARG1(call);
-
 
548
            if (i < 0 || i >= MAX_VIEWPORTS) {
-
 
549
                retval = EINVAL;
-
 
550
                break;
-
 
551
            }
-
 
552
            if (! viewports[i].initialized ) {
-
 
553
                retval = EADDRNOTAVAIL;
-
 
554
                break;
-
 
555
            }
-
 
556
            viewports[i].initialized = 0;
-
 
557
            retval = 0;
-
 
558
            break;
-
 
559
        case FB_SET_STYLE:
-
 
560
            vport->fgcolor = IPC_GET_ARG1(call);
-
 
561
            vport->bgcolor = IPC_GET_ARG2(call);
-
 
562
            retval = 0;
-
 
563
            break;
-
 
564
        case FB_GET_RESOLUTION:
-
 
565
            ipc_answer_fast(callid, 0, screen.xres,screen.yres);
466
            continue;
566
            continue;
467
        default:
567
        default:
468
            retval = ENOENT;
568
            retval = ENOENT;
469
        }
569
        }
470
        retval = ENOENT;
-
 
471
        ipc_answer_fast(callid,retval,0,0);
570
        ipc_answer_fast(callid,retval,0,0);
472
    }
571
    }
473
}
572
}
474
 
573
 
475
int main(int argc, char *argv[])
574
int main(int argc, char *argv[])