Subversion Repositories HelenOS-historic

Rev

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

Rev 1515 Rev 1547
Line 44... Line 44...
44
#include "font-8x16.h"
44
#include "font-8x16.h"
45
#include "helenos.xbm"
45
#include "helenos.xbm"
46
#include "fb.h"
46
#include "fb.h"
47
#include "main.h"
47
#include "main.h"
48
#include "../console/screenbuffer.h"
48
#include "../console/screenbuffer.h"
-
 
49
#include "ppm.h"
49
 
50
 
50
#define DEFAULT_BGCOLOR                0x000080
51
#define DEFAULT_BGCOLOR                0x000080
51
#define DEFAULT_FGCOLOR                0xffff00
52
#define DEFAULT_FGCOLOR                0xffff00
52
 
53
 
53
/***************************************************************/
54
/***************************************************************/
Line 472... Line 473...
472
        draw_glyph(vp, data[i].character, col * COL_WIDTH, row * FONT_SCANLINES, data[i].style);
473
        draw_glyph(vp, data[i].character, col * COL_WIDTH, row * FONT_SCANLINES, data[i].style);
473
    }
474
    }
474
    cursor_print(vp);
475
    cursor_print(vp);
475
}
476
}
476
 
477
 
-
 
478
static int shm_handle(ipc_callid_t callid, ipc_call_t *call, int vp)
-
 
479
{
-
 
480
    static keyfield_t *interbuffer = NULL;
-
 
481
    static size_t intersize = 0;
-
 
482
 
-
 
483
    static char *pixmap = NULL;
-
 
484
    static ipcarg_t pixmap_id = 0;
-
 
485
    static size_t pixmap_size;
-
 
486
 
-
 
487
    int handled = 1;
-
 
488
    int retval = 0;
-
 
489
    viewport_t *vport = &viewports[vp];
-
 
490
    unsigned int x,y;
-
 
491
 
-
 
492
    switch (IPC_GET_METHOD(*call)) {
-
 
493
    case IPC_M_AS_AREA_SEND:
-
 
494
        /* We accept one area for data interchange */
-
 
495
        if (IPC_GET_ARG1(*call) == pixmap_id) {
-
 
496
            void *dest = as_get_mappable_page(IPC_GET_ARG2(*call));
-
 
497
            pixmap_size = IPC_GET_ARG2(*call);
-
 
498
            if (!ipc_answer_fast(callid, 0, (sysarg_t)dest, 0))
-
 
499
                pixmap = dest;
-
 
500
            else
-
 
501
                pixmap_id = 0;
-
 
502
            if (pixmap[0] != 'P')
-
 
503
                while (1)
-
 
504
                    ;
-
 
505
            return 1;
-
 
506
        } else {
-
 
507
            intersize = IPC_GET_ARG2(*call);
-
 
508
            receive_comm_area(callid,call,(void **)&interbuffer);
-
 
509
        }
-
 
510
        return 1;
-
 
511
    case FB_PREPARE_SHM:
-
 
512
        if (pixmap_id)
-
 
513
            retval = EBUSY;
-
 
514
        else
-
 
515
            pixmap_id = IPC_GET_ARG1(*call);
-
 
516
        break;
-
 
517
       
-
 
518
    case FB_DROP_SHM:
-
 
519
        if (pixmap) {
-
 
520
            as_area_destroy(pixmap);
-
 
521
            pixmap = NULL;
-
 
522
        }
-
 
523
        pixmap_id = 0;
-
 
524
        break;
-
 
525
       
-
 
526
    case FB_DRAW_PPM:
-
 
527
        if (!pixmap) {
-
 
528
            retval = EINVAL;
-
 
529
            break;
-
 
530
        }
-
 
531
        x = IPC_GET_ARG1(*call);
-
 
532
        y = IPC_GET_ARG2(*call);
-
 
533
        if (x > vport->width || y > vport->height) {
-
 
534
            retval = EINVAL;
-
 
535
            break;
-
 
536
        }
-
 
537
       
-
 
538
        draw_ppm(pixmap, pixmap_size, IPC_GET_ARG1(*call), IPC_GET_ARG2(*call),
-
 
539
             vport->width - x, vport->height - y, putpixel, vp);
-
 
540
        break;
-
 
541
    case FB_DRAW_TEXT_DATA:
-
 
542
        if (!interbuffer) {
-
 
543
            retval = EINVAL;
-
 
544
            break;
-
 
545
        }
-
 
546
        if (intersize < vport->cols*vport->rows*sizeof(*interbuffer)) {
-
 
547
            retval = EINVAL;
-
 
548
            break;
-
 
549
        }
-
 
550
        draw_text_data(vp, interbuffer);
-
 
551
        break;
-
 
552
    default:
-
 
553
        handled = 0;
-
 
554
    }
-
 
555
   
-
 
556
    if (handled)
-
 
557
        ipc_answer_fast(callid, retval, 0, 0);
-
 
558
    return handled;
-
 
559
}
477
 
560
 
478
/** Function for handling connections to FB
561
/** Function for handling connections to FB
479
 *
562
 *
480
 */
563
 */
481
static void fb_client_connection(ipc_callid_t iid, ipc_call_t *icall)
564
static void fb_client_connection(ipc_callid_t iid, ipc_call_t *icall)
Line 484... Line 567...
484
    ipc_call_t call;
567
    ipc_call_t call;
485
    int retval;
568
    int retval;
486
    int i;
569
    int i;
487
    unsigned int row,col;
570
    unsigned int row,col;
488
    char c;
571
    char c;
489
    keyfield_t *interbuffer = NULL;
-
 
490
    size_t intersize = 0;
-
 
491
 
572
 
492
    int vp = 0;
573
    int vp = 0;
493
    viewport_t *vport = &viewports[0];
574
    viewport_t *vport = &viewports[0];
494
 
575
 
495
    if (client_connected) {
576
    if (client_connected) {
Line 503... Line 584...
503
        callid = async_get_call_timeout(&call,250000);
584
        callid = async_get_call_timeout(&call,250000);
504
        if (!callid) {
585
        if (!callid) {
505
            cursor_blink(vp);
586
            cursor_blink(vp);
506
            continue;
587
            continue;
507
        }
588
        }
-
 
589
        if (shm_handle(callid, &call, vp))
-
 
590
            continue;
-
 
591
 
508
        switch (IPC_GET_METHOD(call)) {
592
        switch (IPC_GET_METHOD(call)) {
509
        case IPC_M_PHONE_HUNGUP:
593
        case IPC_M_PHONE_HUNGUP:
510
            client_connected = 0;
594
            client_connected = 0;
511
            /* cleanup other viewports */
595
            /* cleanup other viewports */
512
            for (i=1; i < MAX_VIEWPORTS; i++)
596
            for (i=1; i < MAX_VIEWPORTS; i++)
513
                vport->initialized = 0;
597
                vport->initialized = 0;
514
            ipc_answer_fast(callid,0,0,0);
598
            ipc_answer_fast(callid,0,0,0);
515
            return; /* Exit thread */
599
            return; /* Exit thread */
516
        case IPC_M_AS_AREA_SEND:
-
 
517
            /* We accept one area for data interchange */
-
 
518
            intersize = IPC_GET_ARG2(call);
-
 
519
            receive_comm_area(callid,&call,(void **)&interbuffer,
-
 
520
                      sizeof(*interbuffer)*viewports[0].cols*viewports[0].rows);
-
 
521
            continue;
-
 
522
 
600
 
523
        case FB_DRAW_TEXT_DATA:
-
 
524
            if (!interbuffer) {
-
 
525
                retval = EINVAL;
-
 
526
                break;
-
 
527
            }
-
 
528
            if (intersize < vport->cols*vport->rows*sizeof(*interbuffer)) {
-
 
529
                retval = EINVAL;
-
 
530
                break;
-
 
531
            }
-
 
532
            draw_text_data(vp, interbuffer);
-
 
533
            retval = 0;
-
 
534
            break;
-
 
535
        case FB_PUTCHAR:
601
        case FB_PUTCHAR:
536
            c = IPC_GET_ARG1(call);
602
            c = IPC_GET_ARG1(call);
537
            row = IPC_GET_ARG2(call);
603
            row = IPC_GET_ARG2(call);
538
            col = IPC_GET_ARG3(call);
604
            col = IPC_GET_ARG3(call);
539
            if (row >= vport->rows || col >= vport->cols) {
605
            if (row >= vport->rows || col >= vport->cols) {