Changeset 00bb6965 in mainline for uspace/console
- 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
- Location:
- uspace/console
- Files:
-
- 2 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(); -
uspace/console/gcons.c
rdff0a94 r00bb6965 75 75 76 76 /** List of pixmaps identifying these icons */ 77 static int ic_pixmaps[CONS_LAST] = {-1, -1,-1,-1,-1,-1};77 static int ic_pixmaps[CONS_LAST] = {-1, -1, -1, -1, -1, -1}; 78 78 static int animation = -1; 79 79 … … 120 120 vp_switch(cstatus_vp[consnum]); 121 121 if (ic_pixmaps[state] != -1) 122 async_msg_2(fbphone, FB_VP_DRAW_PIXMAP, cstatus_vp[consnum], ic_pixmaps[state]); 123 124 if (state != CONS_DISCONNECTED && state != CONS_KERNEL && state != CONS_DISCONNECTED_SEL) { 125 snprintf(data, 5, "%d", consnum+1); 126 for (i=0;data[i];i++) 127 tran_putch(data[i], 1, 2+i); 122 async_msg_2(fbphone, FB_VP_DRAW_PIXMAP, cstatus_vp[consnum], 123 ic_pixmaps[state]); 124 125 if (state != CONS_DISCONNECTED && state != CONS_KERNEL && state != 126 CONS_DISCONNECTED_SEL) { 127 snprintf(data, 5, "%d", consnum + 1); 128 for (i=0; data[i]; i++) 129 tran_putch(data[i], 1, 2 + i); 128 130 } 129 131 } … … 138 140 139 141 if (active_console == KERNEL_CONSOLE) { 140 for (i =0; i < CONSOLE_COUNT; i++)142 for (i = 0; i < CONSOLE_COUNT; i++) 141 143 redraw_state(i); 142 144 if (animation != -1) … … 167 169 return; 168 170 169 if (consnum == active_console || console_state[consnum] == CONS_HAS_DATA) 171 if (consnum == active_console || console_state[consnum] == 172 CONS_HAS_DATA) 170 173 return; 171 174 … … 258 261 static int gcons_find_conbut(int x, int y) 259 262 { 260 int status_start = STATUS_START + (xres -800) / 2;;261 262 if (y < STATUS_TOP || y >= STATUS_TOP +STATUS_HEIGHT)263 int status_start = STATUS_START + (xres - 800) / 2;; 264 265 if (y < STATUS_TOP || y >= STATUS_TOP + STATUS_HEIGHT) 263 266 return -1; 264 267 … … 266 269 return -1; 267 270 268 if (x >= status_start + (STATUS_WIDTH +STATUS_SPACE)*CONSOLE_COUNT)271 if (x >= status_start + (STATUS_WIDTH + STATUS_SPACE) * CONSOLE_COUNT) 269 272 return -1; 270 273 if (((x - status_start) % (STATUS_WIDTH+STATUS_SPACE)) < STATUS_SPACE) 271 274 return -1; 272 275 273 return (x -status_start) / (STATUS_WIDTH+STATUS_SPACE);276 return (x - status_start) / (STATUS_WIDTH+STATUS_SPACE); 274 277 } 275 278 … … 315 318 316 319 /* Create area */ 317 shm = mmap(NULL, size, PROTO_READ | PROTO_WRITE, MAP_SHARED | MAP_ANONYMOUS, 0, 0); 320 shm = mmap(NULL, size, PROTO_READ | PROTO_WRITE, MAP_SHARED | 321 MAP_ANONYMOUS, 0, 0); 318 322 if (shm == MAP_FAILED) 319 323 return; … … 321 325 memcpy(shm, logo, size); 322 326 /* Send area */ 323 rc = async_req_2(fbphone, FB_PREPARE_SHM, (ipcarg_t)shm, 0, NULL, NULL); 327 rc = async_req_2(fbphone, FB_PREPARE_SHM, (ipcarg_t) shm, 0, NULL, 328 NULL); 324 329 if (rc) 325 330 goto exit; 326 rc = async_req_3(fbphone, IPC_M_AS_AREA_SEND, (ipcarg_t)shm, 0, PROTO_READ, NULL, NULL, NULL); 331 rc = async_req_3(fbphone, IPC_M_AS_AREA_SEND, (ipcarg_t) shm, 0, 332 PROTO_READ, NULL, NULL, NULL); 327 333 if (rc) 328 334 goto drop; … … 352 358 set_style(MAIN_COLOR, MAIN_COLOR); 353 359 clear(); 354 draw_pixmap(_binary_helenos_ppm_start, (size_t)&_binary_helenos_ppm_size, xres-66, 2); 355 draw_pixmap(_binary_nameic_ppm_start, (size_t)&_binary_nameic_ppm_size, 5, 17); 356 357 for (i=0;i < CONSOLE_COUNT; i++) 360 draw_pixmap(_binary_helenos_ppm_start, (size_t) 361 &_binary_helenos_ppm_size, xres - 66, 2); 362 draw_pixmap(_binary_nameic_ppm_start, (size_t) 363 &_binary_nameic_ppm_size, 5, 17); 364 365 for (i=0;i < CONSOLE_COUNT; i++) 358 366 redraw_state(i); 359 367 vp_switch(console_vp); … … 373 381 374 382 /* Create area */ 375 shm = mmap(NULL, size, PROTO_READ | PROTO_WRITE, MAP_SHARED | MAP_ANONYMOUS, 0, 0); 383 shm = mmap(NULL, size, PROTO_READ | PROTO_WRITE, MAP_SHARED | 384 MAP_ANONYMOUS, 0, 0); 376 385 if (shm == MAP_FAILED) 377 386 return -1; … … 379 388 memcpy(shm, data, size); 380 389 /* Send area */ 381 rc = async_req_2(fbphone, FB_PREPARE_SHM, (ipcarg_t)shm, 0, NULL, NULL); 390 rc = async_req_2(fbphone, FB_PREPARE_SHM, (ipcarg_t) shm, 0, NULL, 391 NULL); 382 392 if (rc) 383 393 goto exit; 384 rc = async_req_3(fbphone, IPC_M_AS_AREA_SEND, (ipcarg_t)shm, 0, PROTO_READ, NULL, NULL, NULL); 394 rc = async_req_3(fbphone, IPC_M_AS_AREA_SEND, (ipcarg_t) shm, 0, 395 PROTO_READ, NULL, NULL, NULL); 385 396 if (rc) 386 397 goto drop; … … 409 420 extern char _binary_anim_4_ppm_start[0]; 410 421 extern int _binary_anim_4_ppm_size; 422 411 423 static void make_anim(void) 412 424 { … … 414 426 int pm; 415 427 416 an = async_req(fbphone, FB_ANIM_CREATE, cstatus_vp[KERNEL_CONSOLE], NULL); 428 an = async_req(fbphone, FB_ANIM_CREATE, cstatus_vp[KERNEL_CONSOLE], 429 NULL); 417 430 if (an < 0) 418 431 return; 419 432 420 pm = make_pixmap(_binary_anim_1_ppm_start, (int)&_binary_anim_1_ppm_size); 433 pm = make_pixmap(_binary_anim_1_ppm_start, (int) 434 &_binary_anim_1_ppm_size); 421 435 async_msg_2(fbphone, FB_ANIM_ADDPIXMAP, an, pm); 422 436 423 pm = make_pixmap(_binary_anim_2_ppm_start, (int)&_binary_anim_2_ppm_size); 437 pm = make_pixmap(_binary_anim_2_ppm_start, (int) 438 &_binary_anim_2_ppm_size); 424 439 async_msg_2(fbphone, FB_ANIM_ADDPIXMAP, an, pm); 425 440 426 pm = make_pixmap(_binary_anim_3_ppm_start, (int)&_binary_anim_3_ppm_size); 441 pm = make_pixmap(_binary_anim_3_ppm_start, (int) 442 &_binary_anim_3_ppm_size); 427 443 async_msg_2(fbphone, FB_ANIM_ADDPIXMAP, an, pm); 428 444 429 pm = make_pixmap(_binary_anim_4_ppm_start, (int)&_binary_anim_4_ppm_size); 445 pm = make_pixmap(_binary_anim_4_ppm_start, (int) 446 &_binary_anim_4_ppm_size); 430 447 async_msg_2(fbphone, FB_ANIM_ADDPIXMAP, an, pm); 431 448 … … 443 460 extern char _binary_cons_kernel_ppm_start[0]; 444 461 extern int _binary_cons_kernel_ppm_size; 462 445 463 /** Initialize nice graphical console environment */ 446 464 void gcons_init(int phone) … … 461 479 /* create console viewport */ 462 480 /* Align width & height to character size */ 463 console_vp = vp_create(CONSOLE_MARGIN, CONSOLE_TOP, 464 ALIGN_DOWN(xres-2*CONSOLE_MARGIN, 8),465 ALIGN_DOWN(yres-(CONSOLE_TOP+CONSOLE_MARGIN),16));481 console_vp = vp_create(CONSOLE_MARGIN, CONSOLE_TOP, ALIGN_DOWN(xres - 482 2 * CONSOLE_MARGIN, 8), ALIGN_DOWN(yres - (CONSOLE_TOP + 483 CONSOLE_MARGIN), 16)); 466 484 if (console_vp < 0) 467 485 return; 468 486 469 487 /* Create status buttons */ 470 status_start += (xres-800) / 2; 471 for (i=0; i < CONSOLE_COUNT; i++) { 472 cstatus_vp[i] = vp_create(status_start+CONSOLE_MARGIN+i*(STATUS_WIDTH+STATUS_SPACE), 473 STATUS_TOP, STATUS_WIDTH, STATUS_HEIGHT); 488 status_start += (xres - 800) / 2; 489 for (i = 0; i < CONSOLE_COUNT; i++) { 490 cstatus_vp[i] = vp_create(status_start + CONSOLE_MARGIN + i * 491 (STATUS_WIDTH + STATUS_SPACE), STATUS_TOP, 492 STATUS_WIDTH, STATUS_HEIGHT); 474 493 if (cstatus_vp[i] < 0) 475 494 return; … … 479 498 480 499 /* Initialize icons */ 481 ic_pixmaps[CONS_SELECTED] = make_pixmap(_binary_cons_selected_ppm_start, 482 (int)&_binary_cons_selected_ppm_size); 483 ic_pixmaps[CONS_IDLE] = make_pixmap(_binary_cons_idle_ppm_start, 484 (int)&_binary_cons_idle_ppm_size); 485 ic_pixmaps[CONS_HAS_DATA] = make_pixmap(_binary_cons_has_data_ppm_start, 486 (int)&_binary_cons_has_data_ppm_size); 487 ic_pixmaps[CONS_DISCONNECTED] = make_pixmap(_binary_cons_idle_ppm_start, 488 (int)&_binary_cons_idle_ppm_size); 500 ic_pixmaps[CONS_SELECTED] = 501 make_pixmap(_binary_cons_selected_ppm_start, (int) 502 &_binary_cons_selected_ppm_size); 503 ic_pixmaps[CONS_IDLE] = make_pixmap(_binary_cons_idle_ppm_start, (int) 504 &_binary_cons_idle_ppm_size); 505 ic_pixmaps[CONS_HAS_DATA] = 506 make_pixmap(_binary_cons_has_data_ppm_start, (int) 507 &_binary_cons_has_data_ppm_size); 508 ic_pixmaps[CONS_DISCONNECTED] = 509 make_pixmap(_binary_cons_idle_ppm_start, (int) 510 &_binary_cons_idle_ppm_size); 489 511 ic_pixmaps[CONS_KERNEL] = make_pixmap(_binary_cons_kernel_ppm_start, 490 (int)&_binary_cons_kernel_ppm_size);512 (int) &_binary_cons_kernel_ppm_size); 491 513 ic_pixmaps[CONS_DISCONNECTED_SEL] = ic_pixmaps[CONS_SELECTED]; 492 514
Note:
See TracChangeset
for help on using the changeset viewer.