static void monitor_event(struct uterm_monitor *mon, struct uterm_monitor_event *ev, void *data) { int ret; if (ev->type == UTERM_MONITOR_NEW_SEAT) { if (strcmp(ev->seat_name, "seat0")) return; ret = uterm_input_new(&input, eloop, input_conf.xkb_model, input_conf.xkb_layout, input_conf.xkb_variant, input_conf.xkb_options, 0, 0); if (ret) return; ret = uterm_input_register_cb(input, input_arrived, NULL); if (ret) return; uterm_input_wake_up(input); } else if (ev->type == UTERM_MONITOR_FREE_SEAT) { uterm_input_unregister_cb(input, input_arrived, NULL); uterm_input_unref(input); } else if (ev->type == UTERM_MONITOR_NEW_DEV) { if (ev->dev_type == UTERM_MONITOR_INPUT) uterm_input_add_dev(input, ev->dev_node); } else if (ev->type == UTERM_MONITOR_FREE_DEV) { if (ev->dev_type == UTERM_MONITOR_INPUT) uterm_input_remove_dev(input, ev->dev_node); } }
int uterm_vt_allocate(struct uterm_vt_master *vtm, struct uterm_vt **out, const char *seat, struct uterm_input *input, uterm_vt_cb cb, void *data) { struct uterm_vt *vt; int ret; if (!vtm || !out) return -EINVAL; if (!seat) seat = "seat0"; vt = malloc(sizeof(*vt)); if (!vt) return -ENOMEM; memset(vt, 0, sizeof(*vt)); vt->ref = 1; vt->vtm = vtm; vt->cb = cb; vt->data = data; vt->real_fd = -1; vt->real_num = -1; vt->real_saved_num = -1; ret = ev_eloop_register_signal_cb(vtm->eloop, SIGUSR1, vt_sigusr1, vt); if (ret) goto err_free; ret = ev_eloop_register_signal_cb(vtm->eloop, SIGUSR2, vt_sigusr2, vt); if (ret) goto err_sig1; if (!strcmp(seat, "seat0") && vtm->vt_support) { vt->mode = UTERM_VT_REAL; ret = real_open(vt); if (ret) goto err_sig2; } else { vt->mode = UTERM_VT_FAKE; vt->input = input; ret = uterm_input_register_cb(vt->input, vt_input, vt); if (ret) goto err_sig2; ret = ev_eloop_register_idle_cb(vtm->eloop, vt_idle_event, vt); if (ret) goto err_input; uterm_input_ref(vt->input); uterm_input_wake_up(vt->input); } kmscon_dlist_link(&vtm->vts, &vt->list); *out = vt; return 0; err_input: uterm_input_unregister_cb(vt->input, vt_input, vt); err_sig2: ev_eloop_unregister_signal_cb(vtm->eloop, SIGUSR2, vt_sigusr2, vt); err_sig1: ev_eloop_unregister_signal_cb(vtm->eloop, SIGUSR1, vt_sigusr1, vt); err_free: free(vt); return ret; }