Rev 1498 | Rev 1501 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1498 | Rev 1500 | ||
|---|---|---|---|
| Line 74... | Line 74... | ||
| 74 | unsigned int rows, cols; |
74 | unsigned int rows, cols; |
| 75 | /* Style for text printing */ |
75 | /* Style for text printing */ |
| 76 | int bgcolor, fgcolor; |
76 | int bgcolor, fgcolor; |
| 77 | /* Auto-cursor position */ |
77 | /* Auto-cursor position */ |
| 78 | int cursor_active, cur_col, cur_row; |
78 | int cursor_active, cur_col, cur_row; |
| - | 79 | int cursor_shown; |
|
| 79 | } viewport_t; |
80 | } viewport_t; |
| 80 | 81 | ||
| 81 | #define MAX_VIEWPORTS 128 |
82 | #define MAX_VIEWPORTS 128 |
| 82 | static viewport_t viewports[128]; |
83 | static viewport_t viewports[128]; |
| 83 | 84 | ||
| Line 393... | Line 394... | ||
| 393 | viewport_create(0,0,xres,yres); |
394 | viewport_create(0,0,xres,yres); |
| 394 | 395 | ||
| 395 | clear_port(0); |
396 | clear_port(0); |
| 396 | } |
397 | } |
| 397 | 398 | ||
| - | 399 | static void cursor_hide(int vp) |
|
| - | 400 | { |
|
| - | 401 | viewport_t *vport = &viewports[vp]; |
|
| - | 402 | ||
| - | 403 | if (vport->cursor_active && vport->cursor_shown) { |
|
| - | 404 | invert_char(vp, vport->cur_row, vport->cur_col); |
|
| - | 405 | vport->cursor_shown = 0; |
|
| - | 406 | } |
|
| - | 407 | } |
|
| - | 408 | ||
| - | 409 | static void cursor_print(int vp) |
|
| - | 410 | { |
|
| - | 411 | viewport_t *vport = &viewports[vp]; |
|
| - | 412 | ||
| - | 413 | /* Do not check for cursor_shown */ |
|
| - | 414 | if (vport->cursor_active) { |
|
| - | 415 | invert_char(vp, vport->cur_row, vport->cur_col); |
|
| - | 416 | vport->cursor_shown = 1; |
|
| - | 417 | } |
|
| - | 418 | } |
|
| - | 419 | ||
| - | 420 | static void cursor_blink(int vp) |
|
| - | 421 | { |
|
| - | 422 | viewport_t *vport = &viewports[vp]; |
|
| - | 423 | ||
| - | 424 | if (vport->cursor_shown) |
|
| - | 425 | cursor_hide(vp); |
|
| - | 426 | else |
|
| - | 427 | cursor_print(vp); |
|
| - | 428 | } |
|
| - | 429 | ||
| 398 | /** Draw character at given position relative to viewport |
430 | /** Draw character at given position relative to viewport |
| 399 | * |
431 | * |
| 400 | * @param vp Viewport identification |
432 | * @param vp Viewport identification |
| 401 | * @param c Character to print |
433 | * @param c Character to print |
| 402 | * @param row Screen position relative to viewport |
434 | * @param row Screen position relative to viewport |
| Line 404... | Line 436... | ||
| 404 | */ |
436 | */ |
| 405 | static void draw_char(int vp, char c, unsigned int row, unsigned int col) |
437 | static void draw_char(int vp, char c, unsigned int row, unsigned int col) |
| 406 | { |
438 | { |
| 407 | viewport_t *vport = &viewports[vp]; |
439 | viewport_t *vport = &viewports[vp]; |
| 408 | 440 | ||
| - | 441 | /* Optimize - do not hide cursor if we are going to overwrite it */ |
|
| - | 442 | if (vport->cursor_active && vport->cursor_shown && |
|
| 409 | if (vport->cursor_active && (vport->cur_col != col || vport->cur_row != row)) |
443 | (vport->cur_col != col || vport->cur_row != row)) |
| 410 | invert_char(vp, vport->cur_row, vport->cur_col); |
444 | invert_char(vp, vport->cur_row, vport->cur_col); |
| 411 | 445 | ||
| 412 | draw_glyph(vp, c, col * COL_WIDTH, row * FONT_SCANLINES); |
446 | draw_glyph(vp, c, col * COL_WIDTH, row * FONT_SCANLINES); |
| 413 | 447 | ||
| 414 | vport->cur_col = col; |
448 | vport->cur_col = col; |
| Line 419... | Line 453... | ||
| 419 | vport->cur_col = 0; |
453 | vport->cur_col = 0; |
| 420 | vport->cur_row++; |
454 | vport->cur_row++; |
| 421 | if (vport->cur_row >= vport->rows) |
455 | if (vport->cur_row >= vport->rows) |
| 422 | vport->cur_row--; |
456 | vport->cur_row--; |
| 423 | } |
457 | } |
| 424 | if (vport->cursor_active) |
458 | cursor_print(vp); |
| 425 | invert_char(vp, vport->cur_row, vport->cur_col); |
- | |
| 426 | } |
459 | } |
| 427 | 460 | ||
| 428 | /** Function for handling connections to FB |
461 | /** Function for handling connections to FB |
| 429 | * |
462 | * |
| 430 | */ |
463 | */ |
| Line 446... | Line 479... | ||
| 446 | } |
479 | } |
| 447 | client_connected = 1; |
480 | client_connected = 1; |
| 448 | ipc_answer_fast(iid, 0, 0, 0); /* Accept connection */ |
481 | ipc_answer_fast(iid, 0, 0, 0); /* Accept connection */ |
| 449 | 482 | ||
| 450 | while (1) { |
483 | while (1) { |
| 451 | callid = async_get_call(&call); |
484 | callid = async_get_call_timeout(&call,250000); |
| - | 485 | if (!callid) { |
|
| - | 486 | cursor_blink(vp); |
|
| - | 487 | continue; |
|
| - | 488 | } |
|
| 452 | switch (IPC_GET_METHOD(call)) { |
489 | switch (IPC_GET_METHOD(call)) { |
| 453 | case IPC_M_PHONE_HUNGUP: |
490 | case IPC_M_PHONE_HUNGUP: |
| 454 | client_connected = 0; |
491 | client_connected = 0; |
| 455 | /* cleanup other viewports */ |
492 | /* cleanup other viewports */ |
| 456 | for (i=1; i < MAX_VIEWPORTS; i++) |
493 | for (i=1; i < MAX_VIEWPORTS; i++) |
| Line 469... | Line 506... | ||
| 469 | 506 | ||
| 470 | draw_char(vp, c, row, col); |
507 | draw_char(vp, c, row, col); |
| 471 | continue; /* msg already answered */ |
508 | continue; /* msg already answered */ |
| 472 | case FB_CLEAR: |
509 | case FB_CLEAR: |
| 473 | clear_port(vp); |
510 | clear_port(vp); |
| 474 | if (vport->cursor_active) |
511 | cursor_print(vp); |
| 475 | invert_char(vp, vport->cur_row, vport->cur_col); |
- | |
| 476 | retval = 0; |
512 | retval = 0; |
| 477 | break; |
513 | break; |
| 478 | case FB_CURSOR_GOTO: |
514 | case FB_CURSOR_GOTO: |
| 479 | row = IPC_GET_ARG1(call); |
515 | row = IPC_GET_ARG1(call); |
| 480 | col = IPC_GET_ARG2(call); |
516 | col = IPC_GET_ARG2(call); |
| 481 | if (row >= vport->rows || col >= vport->cols) { |
517 | if (row >= vport->rows || col >= vport->cols) { |
| 482 | retval = EINVAL; |
518 | retval = EINVAL; |
| 483 | break; |
519 | break; |
| 484 | } |
520 | } |
| 485 | retval = 0; |
521 | retval = 0; |
| 486 | if (viewports[vp].cursor_active) { |
- | |
| 487 | invert_char(vp, vport->cur_row, vport->cur_col); |
- | |
| 488 | invert_char(vp, row, col); |
522 | cursor_hide(vp); |
| 489 | } |
- | |
| 490 | vport->cur_col = col; |
523 | vport->cur_col = col; |
| 491 | vport->cur_row = row; |
524 | vport->cur_row = row; |
| - | 525 | cursor_print(vp); |
|
| 492 | break; |
526 | break; |
| 493 | case FB_CURSOR_VISIBILITY: |
527 | case FB_CURSOR_VISIBILITY: |
| - | 528 | cursor_hide(vp); |
|
| 494 | i = IPC_GET_ARG1(call); |
529 | vport->cursor_active = IPC_GET_ARG1(call); |
| - | 530 | cursor_print(vp); |
|
| 495 | retval = 0; |
531 | retval = 0; |
| 496 | if ((i && vport->cursor_active) || (!i && !vport->cursor_active)) |
- | |
| 497 | break; |
- | |
| 498 | - | ||
| 499 | vport->cursor_active = i; |
- | |
| 500 | invert_char(vp, vport->cur_row, vport->cur_col); |
- | |
| 501 | break; |
532 | break; |
| 502 | case FB_GET_CSIZE: |
533 | case FB_GET_CSIZE: |
| 503 | ipc_answer_fast(callid, 0, vport->rows, vport->cols); |
534 | ipc_answer_fast(callid, 0, vport->rows, vport->cols); |
| 504 | continue; |
535 | continue; |
| 505 | case FB_SCROLL: |
536 | case FB_SCROLL: |
| 506 | i = IPC_GET_ARG1(call); |
537 | i = IPC_GET_ARG1(call); |
| 507 | if (i > vport->rows || i < (- (int)vport->rows)) { |
538 | if (i > vport->rows || i < (- (int)vport->rows)) { |
| 508 | retval = EINVAL; |
539 | retval = EINVAL; |
| 509 | break; |
540 | break; |
| 510 | } |
541 | } |
| 511 | if (vport->cursor_active) |
542 | cursor_hide(vp); |
| 512 | invert_char(vp, vport->cur_row, vport->cur_col); |
- | |
| 513 | scroll_port(vp, i); |
543 | scroll_port(vp, i); |
| 514 | if (vport->cursor_active) |
544 | cursor_print(vp); |
| 515 | invert_char(vp, vport->cur_row, vport->cur_col); |
- | |
| 516 | retval = 0; |
545 | retval = 0; |
| 517 | break; |
546 | break; |
| 518 | case FB_VIEWPORT_SWITCH: |
547 | case FB_VIEWPORT_SWITCH: |
| 519 | i = IPC_GET_ARG1(call); |
548 | i = IPC_GET_ARG1(call); |
| 520 | if (i < 0 || i >= MAX_VIEWPORTS) { |
549 | if (i < 0 || i >= MAX_VIEWPORTS) { |
| Line 523... | Line 552... | ||
| 523 | } |
552 | } |
| 524 | if (! viewports[i].initialized ) { |
553 | if (! viewports[i].initialized ) { |
| 525 | retval = EADDRNOTAVAIL; |
554 | retval = EADDRNOTAVAIL; |
| 526 | break; |
555 | break; |
| 527 | } |
556 | } |
| - | 557 | cursor_hide(vp); |
|
| 528 | vp = i; |
558 | vp = i; |
| 529 | vport = &viewports[vp]; |
559 | vport = &viewports[vp]; |
| - | 560 | cursor_print(vp); |
|
| 530 | retval = 0; |
561 | retval = 0; |
| 531 | break; |
562 | break; |
| 532 | case FB_VIEWPORT_CREATE: |
563 | case FB_VIEWPORT_CREATE: |
| 533 | retval = viewport_create(IPC_GET_ARG1(call) >> 16, |
564 | retval = viewport_create(IPC_GET_ARG1(call) >> 16, |
| 534 | IPC_GET_ARG1(call) & 0xffff, |
565 | IPC_GET_ARG1(call) & 0xffff, |