Changes in uspace/lib/gui/terminal.c [3f06dae:5d94b16c] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/gui/terminal.c
r3f06dae r5d94b16c 77 77 static void term_set_rgb_color(con_srv_t *, pixel_t, pixel_t); 78 78 static void term_set_cursor_visibility(con_srv_t *, bool); 79 static int term_get_event(con_srv_t *, cons_event_t *);79 static int term_get_event(con_srv_t *, kbd_event_t *); 80 80 81 81 static con_ops_t con_ops = { … … 196 196 uint16_t glyph = fb_font_glyph(field->ch); 197 197 198 // FIXME: This font drawing routine is shamelessly 199 // suboptimal. It should be optimized for 200 // aligned memory transfers, etc. 201 198 202 for (unsigned int y = 0; y < FONT_SCANLINES; y++) { 199 pixel_t *dst = pixelmap_pixel_at( 200 surface_pixmap_access(surface), bx, by + y); 201 pixel_t *dst_max = pixelmap_pixel_at( 202 surface_pixmap_access(surface), bx + FONT_WIDTH - 1, by + y); 203 if (!dst || !dst_max) continue; 204 int count = FONT_WIDTH; 205 while (count-- != 0) { 206 *dst++ = (fb_font[glyph][y] & (1 << count)) ? fgcolor : bgcolor; 203 for (unsigned int x = 0; x < FONT_WIDTH; x++) { 204 pixel_t pixel = 205 (fb_font[glyph][y] & (1 << (7 - x))) ? fgcolor : bgcolor; 206 surface_put_pixel(surface, bx + x, by + y, pixel); 207 207 } 208 208 } 209 surface_add_damaged_region(surface, bx, by, FONT_WIDTH, FONT_SCANLINES);210 209 } 211 210 … … 420 419 if (pos < size) { 421 420 link_t *link = prodcons_consume(&term->input_pc); 422 cons_event_t *event = list_get_instance(link, cons_event_t, link);421 kbd_event_t *event = list_get_instance(link, kbd_event_t, link); 423 422 424 423 /* Accept key presses of printable chars only. */ 425 if (event->type == CEV_KEY && event->ev.key.type == KEY_PRESS && 426 event->ev.key.c != 0) { 424 if ((event->type == KEY_PRESS) && (event->c != 0)) { 427 425 wchar_t tmp[2] = { 428 event-> ev.key.c,426 event->c, 429 427 0 430 428 }; … … 580 578 } 581 579 582 static int term_get_event(con_srv_t *srv, cons_event_t *event)580 static int term_get_event(con_srv_t *srv, kbd_event_t *event) 583 581 { 584 582 terminal_t *term = srv_to_terminal(srv); 585 583 link_t *link = prodcons_consume(&term->input_pc); 586 cons_event_t *ev = list_get_instance(link, cons_event_t, link);587 588 *event = * ev;589 free( ev);584 kbd_event_t *kevent = list_get_instance(link, kbd_event_t, link); 585 586 *event = *kevent; 587 free(kevent); 590 588 return EOK; 591 589 } … … 635 633 } 636 634 637 static void terminal_queue_cons_event(terminal_t *term, cons_event_t *ev) 638 { 635 static void terminal_handle_keyboard_event(widget_t *widget, 636 kbd_event_t kbd_event) 637 { 638 terminal_t *term = (terminal_t *) widget; 639 639 640 /* Got key press/release event */ 640 cons_event_t *event =641 ( cons_event_t *) malloc(sizeof(cons_event_t));641 kbd_event_t *event = 642 (kbd_event_t *) malloc(sizeof(kbd_event_t)); 642 643 if (event == NULL) 643 644 return; 644 645 645 *event = *ev;646 646 link_initialize(&event->link); 647 event->type = kbd_event.type; 648 event->key = kbd_event.key; 649 event->mods = kbd_event.mods; 650 event->c = kbd_event.c; 647 651 648 652 prodcons_produce(&term->input_pc, &event->link); 649 653 } 650 654 651 /* Got key press/release event */ 652 static void terminal_handle_keyboard_event(widget_t *widget, 653 kbd_event_t kbd_event) 654 { 655 terminal_t *term = (terminal_t *) widget; 656 cons_event_t event; 657 658 event.type = CEV_KEY; 659 event.ev.key = kbd_event; 660 661 terminal_queue_cons_event(term, &event); 662 } 663 664 static void terminal_handle_position_event(widget_t *widget, pos_event_t pos_event) 665 { 666 cons_event_t event; 667 terminal_t *term = (terminal_t *) widget; 668 sysarg_t sx = term->widget.hpos; 669 sysarg_t sy = term->widget.vpos; 670 671 if (pos_event.type == POS_PRESS) { 672 event.type = CEV_POS; 673 event.ev.pos.type = pos_event.type; 674 event.ev.pos.pos_id = pos_event.pos_id; 675 event.ev.pos.btn_num = pos_event.btn_num; 676 677 event.ev.pos.hpos = (pos_event.hpos - sx) / FONT_WIDTH; 678 event.ev.pos.vpos = (pos_event.vpos - sy) / FONT_SCANLINES; 679 terminal_queue_cons_event(term, &event); 680 } 655 static void terminal_handle_position_event(widget_t *widget, pos_event_t event) 656 { 657 /* 658 * Mouse events are ignored so far. 659 * There is no consumer for it. 660 */ 681 661 } 682 662
Note:
See TracChangeset
for help on using the changeset viewer.