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[]) |