Subversion Repositories HelenOS

Rev

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

Rev 3844 Rev 3905
Line 295... Line 295...
295
static void keyboard_events(ipc_callid_t iid, ipc_call_t *icall)
295
static void keyboard_events(ipc_callid_t iid, ipc_call_t *icall)
296
{
296
{
297
    ipc_callid_t callid;
297
    ipc_callid_t callid;
298
    ipc_call_t call;
298
    ipc_call_t call;
299
    int retval;
299
    int retval;
300
    int c;
300
    kbd_event_t ev;
301
    connection_t *conn;
301
    connection_t *conn;
302
    int newcon;
302
    int newcon;
303
   
303
   
304
    /* Ignore parameters, the connection is alread opened */
304
    /* Ignore parameters, the connection is alread opened */
305
    while (1) {
305
    while (1) {
Line 317... Line 317...
317
        case KBD_MS_MOVE:
317
        case KBD_MS_MOVE:
318
            gcons_mouse_move(IPC_GET_ARG1(call),
318
            gcons_mouse_move(IPC_GET_ARG1(call),
319
                IPC_GET_ARG2(call));
319
                IPC_GET_ARG2(call));
320
            retval = 0;
320
            retval = 0;
321
            break;
321
            break;
322
        case KBD_PUSHCHAR:
322
        case KBD_EVENT:
323
            /* got key from keyboard driver */
323
            /* Got event from keyboard driver. */
324
            retval = 0;
324
            retval = 0;
-
 
325
            ev.type = IPC_GET_ARG1(call);
-
 
326
            ev.key = IPC_GET_ARG2(call);
-
 
327
            ev.mods = IPC_GET_ARG3(call);
325
            c = IPC_GET_ARG1(call);
328
            ev.c = IPC_GET_ARG4(call);
-
 
329
           
326
            /* switch to another virtual console */
330
            /* switch to another virtual console */
327
           
331
           
328
            conn = &connections[active_console];
332
            conn = &connections[active_console];
329
/*
333
 
330
 *          if ((c >= KBD_KEY_F1) && (c < KBD_KEY_F1 +
334
            if ((ev.key >= 0x101) && (ev.key < 0x101 +
331
 *              CONSOLE_COUNT)) {
335
                CONSOLE_COUNT)) {
332
 */
-
 
333
            if ((c >= 0x101) && (c < 0x101 + CONSOLE_COUNT)) {
-
 
334
                if (c == 0x112)
336
                if (ev.key == 0x112)
335
                    change_console(KERNEL_CONSOLE);
337
                    change_console(KERNEL_CONSOLE);
336
                else
338
                else
337
                    change_console(c - 0x101);
339
                    change_console(ev.key - 0x101);
338
                break;
340
                break;
339
            }
341
            }
340
           
342
           
341
            /* if client is awaiting key, send it */
343
            /* if client is awaiting key, send it */
342
            if (conn->keyrequest_counter > 0) {    
344
            if (conn->keyrequest_counter > 0) {    
343
                conn->keyrequest_counter--;
345
                conn->keyrequest_counter--;
344
                ipc_answer_1(fifo_pop(conn->keyrequests), EOK,
346
                ipc_answer_4(fifo_pop(conn->keyrequests), EOK,
345
                    c);
347
                    ev.type, ev.key, ev.mods, ev.c);
346
                break;
348
                break;
347
            }
349
            }
348
           
350
 
349
            keybuffer_push(&conn->keybuffer, c);
351
            keybuffer_push(&conn->keybuffer, &ev);
350
            retval = 0;
352
            retval = 0;
351
           
353
 
352
            break;
354
            break;
353
        default:
355
        default:
354
            retval = ENOENT;
356
            retval = ENOENT;
355
        }
357
        }
356
        ipc_answer_0(callid, retval);
358
        ipc_answer_0(callid, retval);
Line 361... Line 363...
361
static void client_connection(ipc_callid_t iid, ipc_call_t *icall)
363
static void client_connection(ipc_callid_t iid, ipc_call_t *icall)
362
{
364
{
363
    ipc_callid_t callid;
365
    ipc_callid_t callid;
364
    ipc_call_t call;
366
    ipc_call_t call;
365
    int consnum;
367
    int consnum;
366
    ipcarg_t arg1, arg2, arg3;
368
    ipcarg_t arg1, arg2, arg3, arg4;
367
    connection_t *conn;
369
    connection_t *conn;
368
   
370
   
369
    if ((consnum = find_free_connection()) == -1) {
371
    if ((consnum = find_free_connection()) == -1) {
370
        ipc_answer_0(iid, ELIMIT);
372
        ipc_answer_0(iid, ELIMIT);
371
        return;
373
        return;
Line 386... Line 388...
386
        callid = async_get_call(&call);
388
        callid = async_get_call(&call);
387
        async_serialize_start();
389
        async_serialize_start();
388
       
390
       
389
        arg1 = 0;
391
        arg1 = 0;
390
        arg2 = 0;
392
        arg2 = 0;
-
 
393
        arg3 = 0;
-
 
394
        arg4 = 0;
-
 
395
 
391
        switch (IPC_GET_METHOD(call)) {
396
        switch (IPC_GET_METHOD(call)) {
392
        case IPC_M_PHONE_HUNGUP:
397
        case IPC_M_PHONE_HUNGUP:
393
            gcons_notify_disconnect(consnum);
398
            gcons_notify_disconnect(consnum);
394
           
399
           
395
            /* Answer all pending requests */
400
            /* Answer all pending requests */
Line 456... Line 461...
456
            arg1 = IPC_GET_ARG1(call);
461
            arg1 = IPC_GET_ARG1(call);
457
            conn->screenbuffer.is_cursor_visible = arg1;
462
            conn->screenbuffer.is_cursor_visible = arg1;
458
            if (consnum == active_console)
463
            if (consnum == active_console)
459
                curs_visibility(arg1);
464
                curs_visibility(arg1);
460
            break;
465
            break;
461
        case CONSOLE_GETCHAR:
466
        case CONSOLE_GETKEY:
462
            if (keybuffer_empty(&conn->keybuffer)) {
467
            if (keybuffer_empty(&conn->keybuffer)) {
463
                /* buffer is empty -> store request */
468
                /* buffer is empty -> store request */
464
                if (conn->keyrequest_counter <
469
                if (conn->keyrequest_counter <
465
                    MAX_KEYREQUESTS_BUFFERED) {
470
                    MAX_KEYREQUESTS_BUFFERED) {
466
                    fifo_push(conn->keyrequests, callid);
471
                    fifo_push(conn->keyrequests, callid);
Line 472... Line 477...
472
                    */
477
                    */
473
                    ipc_answer_0(callid, ELIMIT);
478
                    ipc_answer_0(callid, ELIMIT);
474
                }
479
                }
475
                continue;
480
                continue;
476
            }
481
            }
477
            int ch;
482
            kbd_event_t ev;
478
            keybuffer_pop(&conn->keybuffer, &ch);
483
            keybuffer_pop(&conn->keybuffer, &ev);
-
 
484
            arg1 = ev.type;
-
 
485
            arg2 = ev.key;
-
 
486
            arg3 = ev.mods;
479
            arg1 = ch;
487
            arg4 = ev.c;
480
            break;
488
            break;
481
        }
489
        }
482
        ipc_answer_2(callid, EOK, arg1, arg2);
490
        ipc_answer_4(callid, EOK, arg1, arg2, arg3, arg4);
483
    }
491
    }
484
}
492
}
485
 
493
 
486
static void interrupt_received(ipc_callid_t callid, ipc_call_t *call)
494
static void interrupt_received(ipc_callid_t callid, ipc_call_t *call)
487
{
495
{