Changeset 47d060d in mainline for uspace/srv/hid/remcons/remcons.c


Ignore:
Timestamp:
2024-10-04T19:23:16Z (7 days ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
c7ecd290
Parents:
5132379
Message:

Implement telnet window size option

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/hid/remcons/remcons.c

    r5132379 r47d060d  
    144144};
    145145
     146static void remcons_telnet_ws_update(void *, unsigned, unsigned);
     147
     148static telnet_cb_t remcons_telnet_cb = {
     149        .ws_update = remcons_telnet_ws_update
     150};
     151
    146152static loc_srv_t *remcons_srv;
    147153static bool no_ctl;
     
    260266
    261267        if (remcons->enable_ctl) {
    262                 *cols = 80;
    263                 *rows = 25;
     268                *cols = remcons->vt->cols;
     269                *rows = remcons->vt->rows;
    264270        } else {
    265271                *cols = 100;
     
    352358{
    353359        remcons_event_t *event = malloc(sizeof(remcons_event_t));
    354         assert(event);
     360        if (event == NULL) {
     361                fprintf(stderr, "Out of memory.\n");
     362                return NULL;
     363        }
    355364
    356365        link_initialize(&event->link);
    357         event->kbd.type = type;
    358         event->kbd.mods = mods;
    359         event->kbd.key = key;
    360         event->kbd.c = c;
     366        event->cev.type = CEV_KEY;
     367        event->cev.ev.key.type = type;
     368        event->cev.ev.key.mods = mods;
     369        event->cev.ev.key.key = key;
     370        event->cev.ev.key.c = c;
     371
     372        return event;
     373}
     374
     375/** Creates new console resize event.
     376 */
     377static remcons_event_t *new_resize_event(void)
     378{
     379        remcons_event_t *event = malloc(sizeof(remcons_event_t));
     380        if (event == NULL) {
     381                fprintf(stderr, "Out of memory.\n");
     382                return NULL;
     383        }
     384
     385        link_initialize(&event->link);
     386        event->cev.type = CEV_RESIZE;
    361387
    362388        return event;
     
    385411        remcons_event_t *tmp = list_get_instance(link, remcons_event_t, link);
    386412
    387         event->type = CEV_KEY;
    388         event->ev.key = tmp->kbd;
    389 
     413        *event = tmp->cev;
    390414        free(tmp);
    391415
     
    590614
    591615        remcons_event_t *down = new_kbd_event(KEY_PRESS, mods, key, c);
     616        if (down == NULL)
     617                return;
     618
    592619        remcons_event_t *up = new_kbd_event(KEY_RELEASE, mods, key, c);
    593         assert(down);
    594         assert(up);
     620        if (up == NULL) {
     621                free(down);
     622                return;
     623        }
     624
    595625        list_append(&down->link, &remcons->in_events);
    596626        list_append(&up->link, &remcons->in_events);
     627}
     628
     629/** Window size update callback.
     630 *
     631 * @param arg Argument (remcons_t *)
     632 * @param cols New number of columns
     633 * @param rows New number of rows
     634 */
     635static void remcons_telnet_ws_update(void *arg, unsigned cols, unsigned rows)
     636{
     637        remcons_t *remcons = (remcons_t *)arg;
     638
     639        vt100_resize(remcons->vt, cols, rows);
     640        telnet_user_resize(remcons->user, cols, rows);
     641
     642        remcons_event_t *resize = new_resize_event();
     643        if (resize == NULL)
     644                return;
     645
     646        list_append(&resize->link, &remcons->in_events);
    597647}
    598648
     
    605655{
    606656        char_attrs_t attrs;
    607         remcons_t *remcons = calloc(1, sizeof(remcons_t));
    608         assert(remcons != NULL); // XXX
    609         telnet_user_t *user = telnet_user_create(conn);
    610         assert(user);
     657        remcons_t *remcons = NULL;
     658        telnet_user_t *user = NULL;
     659
     660        remcons = calloc(1, sizeof(remcons_t));
     661        if (remcons == NULL) {
     662                fprintf(stderr, "Out of memory.\n");
     663                goto error;
     664        }
     665
     666        user = telnet_user_create(conn, &remcons_telnet_cb,
     667            (void *)remcons);
     668        if (user == NULL) {
     669                fprintf(stderr, "Out of memory.\n");
     670                goto error;
     671        }
    611672
    612673        remcons->enable_ctl = !no_ctl;
     
    626687
    627688        remcons->vt = vt100_create((void *)remcons, 80, 25, &remcons_vt_cb);
    628         assert(remcons->vt != NULL); // XXX
     689        if (remcons->vt == NULL) {
     690                fprintf(stderr, "Error creating VT100 driver instance.\n");
     691                goto error;
     692        }
     693
    629694        remcons->vt->enable_rgb = remcons->enable_rgb;
    630695
     
    649714                telnet_user_error(user, "Unable to register %s with loc: %s.",
    650715                    user->service_name, str_error(rc));
    651                 return;
     716                goto error;
    652717        }
    653718
     
    656721
    657722        fid_t spawn_fibril = fibril_create(spawn_task_fibril, user);
    658         assert(spawn_fibril);
     723        if (spawn_fibril == 0) {
     724                fprintf(stderr, "Failed creating fibril.\n");
     725                goto error;
     726        }
    659727        fibril_add_ready(spawn_fibril);
    660728
     
    685753        telnet_user_log(user, "Destroying...");
    686754        telnet_user_destroy(user);
     755        return;
     756error:
     757        if (user != NULL && user->service_id != 0)
     758                loc_service_unregister(remcons_srv, user->service_id);
     759        if (user != NULL)
     760                free(user);
     761        if (remcons != NULL && remcons->vt != NULL)
     762                vt100_destroy(remcons->vt);
     763        if (remcons != NULL)
     764                free(remcons);
    687765}
    688766
Note: See TracChangeset for help on using the changeset viewer.