Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/gui/terminal.c

    r3f06dae r5d94b16c  
    7777static void term_set_rgb_color(con_srv_t *, pixel_t, pixel_t);
    7878static void term_set_cursor_visibility(con_srv_t *, bool);
    79 static int term_get_event(con_srv_t *, cons_event_t *);
     79static int term_get_event(con_srv_t *, kbd_event_t *);
    8080
    8181static con_ops_t con_ops = {
     
    196196        uint16_t glyph = fb_font_glyph(field->ch);
    197197       
     198        // FIXME: This font drawing routine is shamelessly
     199        //        suboptimal. It should be optimized for
     200        //        aligned memory transfers, etc.
     201       
    198202        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);
    207207                }
    208208        }
    209         surface_add_damaged_region(surface, bx, by, FONT_WIDTH, FONT_SCANLINES);
    210209}
    211210
     
    420419                if (pos < size) {
    421420                        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);
    423422                       
    424423                        /* 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)) {
    427425                                wchar_t tmp[2] = {
    428                                         event->ev.key.c,
     426                                        event->c,
    429427                                        0
    430428                                };
     
    580578}
    581579
    582 static int term_get_event(con_srv_t *srv, cons_event_t *event)
     580static int term_get_event(con_srv_t *srv, kbd_event_t *event)
    583581{
    584582        terminal_t *term = srv_to_terminal(srv);
    585583        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);
    590588        return EOK;
    591589}
     
    635633}
    636634
    637 static void terminal_queue_cons_event(terminal_t *term, cons_event_t *ev)
    638 {
     635static void terminal_handle_keyboard_event(widget_t *widget,
     636    kbd_event_t kbd_event)
     637{
     638        terminal_t *term = (terminal_t *) widget;
     639       
    639640        /* 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));
    642643        if (event == NULL)
    643644                return;
    644645       
    645         *event = *ev;
    646646        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;
    647651       
    648652        prodcons_produce(&term->input_pc, &event->link);
    649653}
    650654
    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         }
     655static 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         */
    681661}
    682662
Note: See TracChangeset for help on using the changeset viewer.