Changeset 00bb6965 in mainline for uspace/console/console.c
- Timestamp:
- 2006-12-11T23:17:58Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- df496c5
- Parents:
- dff0a94
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/console/console.c
rdff0a94 r00bb6965 71 71 typedef struct { 72 72 keybuffer_t keybuffer; /**< Buffer for incoming keys. */ 73 FIFO_CREATE_STATIC(keyrequests, ipc_callid_t , MAX_KEYREQUESTS_BUFFERED); /**< Buffer for unsatisfied request for keys. */ 73 /** Buffer for unsatisfied request for keys. */ 74 FIFO_CREATE_STATIC(keyrequests, ipc_callid_t, 75 MAX_KEYREQUESTS_BUFFERED); 74 76 int keyrequest_counter; /**< Number of requests in buffer. */ 75 77 int client_phone; /**< Phone to connected client. */ 76 int used; /**< 1 if this virtual console is connected to some client.*/ 77 screenbuffer_t screenbuffer; /**< Screenbuffer for saving screen contents and related settings. */ 78 int used; /**< 1 if this virtual console is 79 * connected to some client.*/ 80 screenbuffer_t screenbuffer; /**< Screenbuffer for saving screen 81 * contents and related settings. */ 78 82 } connection_t; 79 83 80 static connection_t connections[CONSOLE_COUNT]; /**< Array of data for virtual consoles */ 81 static keyfield_t *interbuffer = NULL; /**< Pointer to memory shared with framebufer used for faster virt. console switching */ 82 83 static int kernel_pixmap = -1; /**< Number of fb pixmap, where kernel console is stored */ 84 static connection_t connections[CONSOLE_COUNT]; /**< Array of data for virtual 85 * consoles */ 86 static keyfield_t *interbuffer = NULL; /**< Pointer to memory shared 87 * with framebufer used for 88 * faster virtual console 89 *switching */ 90 91 static int kernel_pixmap = -1; /**< Number of fb pixmap, where kernel 92 * console is stored */ 84 93 85 94 … … 116 125 static void set_style(style_t *style) 117 126 { 118 async_msg_2(fb_info.phone, FB_SET_STYLE, style->fg_color, style->bg_color); 127 async_msg_2(fb_info.phone, FB_SET_STYLE, style->fg_color, 128 style->bg_color); 119 129 } 120 130 … … 138 148 139 149 switch (key) { 140 case '\n': 141 scr->position_y += 1; 142 scr->position_x = 0; 143 break; 144 case '\r': 145 break; 146 case '\t': 147 scr->position_x += 8; 148 scr->position_x -= scr->position_x % 8; 149 break; 150 case '\b': 151 if (scr->position_x == 0) 152 break; 153 154 scr->position_x--; 155 156 if (console == active_console) 157 prtchr(' ', scr->position_y, scr->position_x); 158 159 screenbuffer_putchar(scr, ' '); 160 161 break; 162 default: 163 if (console == active_console) 164 prtchr(key, scr->position_y, scr->position_x); 165 166 screenbuffer_putchar(scr, key); 167 scr->position_x++; 150 case '\n': 151 scr->position_y += 1; 152 scr->position_x = 0; 153 break; 154 case '\r': 155 break; 156 case '\t': 157 scr->position_x += 8; 158 scr->position_x -= scr->position_x % 8; 159 break; 160 case '\b': 161 if (scr->position_x == 0) 162 break; 163 scr->position_x--; 164 if (console == active_console) 165 prtchr(' ', scr->position_y, scr->position_x); 166 screenbuffer_putchar(scr, ' '); 167 break; 168 default: 169 if (console == active_console) 170 prtchr(key, scr->position_y, scr->position_x); 171 172 screenbuffer_putchar(scr, key); 173 scr->position_x++; 168 174 } 169 175 … … 258 264 for (i = 0; i < conn->screenbuffer.size_x; i++) 259 265 for (j = 0; j < conn->screenbuffer.size_y; j++) 260 interbuffer[i + j*conn->screenbuffer.size_x] = *get_field_at(&(conn->screenbuffer),i, j); 266 interbuffer[i + j * conn->screenbuffer.size_x] 267 = *get_field_at(&(conn->screenbuffer), 268 i, j); 261 269 /* This call can preempt, but we are already at the end */ 262 rc = async_req_2(fb_info.phone, FB_DRAW_TEXT_DATA, 0, 0, NULL, NULL); 270 rc = async_req_2(fb_info.phone, FB_DRAW_TEXT_DATA, 0, 0, NULL, 271 NULL); 263 272 }; 264 273 … … 270 279 for (j = 0; j < conn->screenbuffer.size_y; j++) 271 280 for (i = 0; i < conn->screenbuffer.size_x; i++) { 272 field = get_field_at(&(conn->screenbuffer),i, j); 281 field = get_field_at(&(conn->screenbuffer), i, 282 j); 273 283 if (!style_same(*style, field->style)) 274 284 set_style(&field->style); 275 285 style = &field->style; 276 if ((field->character == ' ') && (style_same(field->style, conn->screenbuffer.style))) 286 if ((field->character == ' ') && 287 (style_same(field->style, 288 conn->screenbuffer.style))) 277 289 continue; 278 290 … … 281 293 } 282 294 283 curs_goto(conn->screenbuffer.position_y, conn->screenbuffer.position_x); 295 curs_goto(conn->screenbuffer.position_y, 296 conn->screenbuffer.position_x); 284 297 curs_visibility(conn->screenbuffer.is_cursor_visible); 285 298 … … 311 324 break; 312 325 case KBD_MS_MOVE: 313 gcons_mouse_move(IPC_GET_ARG1(call), IPC_GET_ARG2(call)); 326 gcons_mouse_move(IPC_GET_ARG1(call), 327 IPC_GET_ARG2(call)); 314 328 retval = 0; 315 329 break; … … 322 336 323 337 conn = &connections[active_console]; 324 // if ((c >= KBD_KEY_F1) && (c < KBD_KEY_F1 + CONSOLE_COUNT)) { 338 /* 339 * if ((c >= KBD_KEY_F1) && (c < KBD_KEY_F1 + 340 * CONSOLE_COUNT)) { 341 */ 325 342 if ((c >= 0x101) && (c < 0x101 + CONSOLE_COUNT)) { 326 343 if (c == 0x112) … … 334 351 if (conn->keyrequest_counter > 0) { 335 352 conn->keyrequest_counter--; 336 ipc_answer_fast(fifo_pop(conn->keyrequests), 0, c, 0); 353 ipc_answer_fast(fifo_pop(conn->keyrequests), 0, 354 c, 0); 337 355 break; 338 356 } … … 386 404 while (conn->keyrequest_counter > 0) { 387 405 conn->keyrequest_counter--; 388 ipc_answer_fast(fifo_pop(conn->keyrequests), ENOENT, 0, 0); 406 ipc_answer_fast(fifo_pop(conn->keyrequests), 407 ENOENT, 0, 0); 389 408 break; 390 409 } … … 405 424 break; 406 425 case CONSOLE_GOTO: 407 408 screenbuffer_goto(&conn->screenbuffer,IPC_GET_ARG2(call), IPC_GET_ARG1(call));426 screenbuffer_goto(&conn->screenbuffer, 427 IPC_GET_ARG2(call), IPC_GET_ARG1(call)); 409 428 if (consnum == active_console) 410 curs_goto(IPC_GET_ARG1(call),IPC_GET_ARG2(call)); 411 412 break; 413 429 curs_goto(IPC_GET_ARG1(call), 430 IPC_GET_ARG2(call)); 431 break; 414 432 case CONSOLE_GETSIZE: 415 433 arg1 = fb_info.rows; … … 418 436 case CONSOLE_FLUSH: 419 437 if (consnum == active_console) 420 async_req_2(fb_info.phone, FB_FLUSH, 0, 0, NULL, NULL); 438 async_req_2(fb_info.phone, FB_FLUSH, 0, 0, 439 NULL, NULL); 421 440 break; 422 441 case CONSOLE_SET_STYLE: 423 424 442 arg1 = IPC_GET_ARG1(call); 425 443 arg2 = IPC_GET_ARG2(call); … … 427 445 if (consnum == active_console) 428 446 set_style_col(arg1, arg2); 429 430 447 break; 431 448 case CONSOLE_CURSOR_VISIBILITY: … … 438 455 if (keybuffer_empty(&conn->keybuffer)) { 439 456 /* buffer is empty -> store request */ 440 if (conn->keyrequest_counter < MAX_KEYREQUESTS_BUFFERED) { 457 if (conn->keyrequest_counter < 458 MAX_KEYREQUESTS_BUFFERED) { 441 459 fifo_push(conn->keyrequests, callid); 442 460 conn->keyrequest_counter++; 443 461 } else { 444 /* no key available and too many requests => fail */ 462 /* 463 * No key available and too many 464 * requests => fail. 465 */ 445 466 ipc_answer_fast(callid, ELIMIT, 0, 0); 446 467 } 447 468 continue; 448 }; 449 keybuffer_pop(&conn->keybuffer, (int *)&arg1); 450 469 } 470 keybuffer_pop(&conn->keybuffer, (int *) &arg1); 451 471 break; 452 472 } … … 465 485 /* Connect to keyboard driver */ 466 486 467 while ((kbd_phone = ipc_connect_me_to(PHONE_NS, SERVICE_KEYBOARD, 0)) < 0) { 487 while ((kbd_phone = ipc_connect_me_to(PHONE_NS, SERVICE_KEYBOARD, 0)) 488 < 0) { 468 489 usleep(10000); 469 }; 470 471 if (ipc_connect_to_me(kbd_phone, SERVICE_CONSOLE, 0, &phonehash) != 0) { 490 } 491 492 if (ipc_connect_to_me(kbd_phone, SERVICE_CONSOLE, 0, &phonehash) != 0) 493 { 472 494 return -1; 473 } ;495 } 474 496 async_new_connection(phonehash, 0, NULL, keyboard_events); 475 497 476 498 /* Connect to framebuffer driver */ 477 499 478 while ((fb_info.phone = ipc_connect_me_to(PHONE_NS, SERVICE_VIDEO, 0)) < 0) { 500 while ((fb_info.phone = ipc_connect_me_to(PHONE_NS, SERVICE_VIDEO, 0)) 501 < 0) { 479 502 usleep(10000); 480 503 } … … 490 513 async_msg_2(fb_info.phone, FB_VIEWPORT_DB, (sysarg_t)-1, 1); 491 514 492 async_req_2(fb_info.phone, FB_GET_CSIZE, 0, 0, &(fb_info.rows), &(fb_info.cols)); 515 async_req_2(fb_info.phone, FB_GET_CSIZE, 0, 0, &(fb_info.rows), 516 &(fb_info.cols)); 493 517 set_style_col(DEFAULT_FOREGROUND, DEFAULT_BACKGROUND); 494 518 clrscr(); … … 499 523 keybuffer_init(&(connections[i].keybuffer)); 500 524 501 connections[i].keyrequests.head = connections[i].keyrequests.tail = 0; 525 connections[i].keyrequests.head = 526 connections[i].keyrequests.tail = 0; 502 527 connections[i].keyrequests.items = MAX_KEYREQUESTS_BUFFERED; 503 528 connections[i].keyrequest_counter = 0; 504 529 505 if (screenbuffer_init(&(connections[i].screenbuffer), fb_info.cols, fb_info.rows ) == NULL) { 530 if (screenbuffer_init(&(connections[i].screenbuffer), 531 fb_info.cols, fb_info.rows) == NULL) { 506 532 /*FIXME: handle error */ 507 533 return -1; … … 510 536 connections[KERNEL_CONSOLE].used = 1; 511 537 512 if ((interbuffer = mmap(NULL, sizeof(keyfield_t) * fb_info.cols * fb_info.rows , PROTO_READ|PROTO_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, 0 ,0 )) != NULL) { 513 if (async_req_3(fb_info.phone, IPC_M_AS_AREA_SEND, (ipcarg_t)interbuffer, 0, AS_AREA_READ, NULL, NULL, NULL) != 0) { 514 munmap(interbuffer, sizeof(keyfield_t) * fb_info.cols * fb_info.rows); 538 if ((interbuffer = mmap(NULL, sizeof(keyfield_t) * fb_info.cols * 539 fb_info.rows, PROTO_READ | PROTO_WRITE, MAP_ANONYMOUS | 540 MAP_PRIVATE, 0, 0)) != NULL) { 541 if (async_req_3(fb_info.phone, IPC_M_AS_AREA_SEND, (ipcarg_t) 542 interbuffer, 0, AS_AREA_READ, NULL, NULL, NULL) != 0) { 543 munmap(interbuffer, sizeof(keyfield_t) * fb_info.cols 544 * fb_info.rows); 515 545 interbuffer = NULL; 516 546 } … … 523 553 if (ipc_connect_to_me(PHONE_NS, SERVICE_CONSOLE, 0, &phonehash) != 0) { 524 554 return -1; 525 } ;555 } 526 556 527 557 async_manager();
Note:
See TracChangeset
for help on using the changeset viewer.