From 66936a194c008810506ebc4e639762696635ae69 Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Sat, 11 Aug 2012 14:09:44 +0200 Subject: [PATCH] ui: convert API to support multiple video objects Internally, the UI subsystem already supports multiple video objects. However, the public API didn't expose that, yet. This changes the API to allow adding and removing video objects from the UI. Signed-off-by: David Herrmann --- src/main.c | 5 ++++- src/ui.c | 30 ++++++++++++++++++++++++++---- src/ui.h | 3 ++- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/main.c b/src/main.c index 66cb37d..9d06084 100644 --- a/src/main.c +++ b/src/main.c @@ -181,13 +181,15 @@ static void seat_add_video(struct kmscon_seat *seat, } } - ret = kmscon_ui_new(&seat->ui, seat->app->eloop, seat->video, + ret = kmscon_ui_new(&seat->ui, seat->app->eloop, seat->input); if (ret) { log_error("cannot create UI object"); goto err_video; } + kmscon_ui_add_video(seat->ui, seat->video); + seat->vdev = dev; log_debug("new graphics device on seat %s", seat->sname); return; @@ -205,6 +207,7 @@ static void seat_rm_video(struct kmscon_seat *seat, log_debug("free graphics device on seat %s", seat->sname); + kmscon_ui_remove_video(seat->ui, seat->video); kmscon_ui_free(seat->ui); seat->ui = NULL; seat->vdev = NULL; diff --git a/src/ui.c b/src/ui.c index f3e6019..8c4ae50 100644 --- a/src/ui.c +++ b/src/ui.c @@ -165,13 +165,12 @@ static void terminal_event(struct kmscon_terminal *term, int kmscon_ui_new(struct kmscon_ui **out, struct ev_eloop *eloop, - struct uterm_video *video, struct uterm_input *input) { struct kmscon_ui *ui; int ret; - if (!out || !eloop || !video || !input) + if (!out || !eloop || !input) return -EINVAL; ui = malloc(sizeof(*ui)); @@ -186,8 +185,6 @@ int kmscon_ui_new(struct kmscon_ui **out, if (ret) goto err_free; - video_new(ui, video); - ret = uterm_input_register_cb(ui->input, input_event, ui); if (ret) goto err_video; @@ -223,3 +220,28 @@ void kmscon_ui_free(struct kmscon_ui *ui) ev_eloop_unref(ui->eloop); free(ui); } + +void kmscon_ui_add_video(struct kmscon_ui *ui, struct uterm_video *video) +{ + if (!ui || !video) + return; + + video_new(ui, video); +} + +void kmscon_ui_remove_video(struct kmscon_ui *ui, struct uterm_video *video) +{ + struct ui_video *vid; + struct kmscon_dlist *iter; + + if (!ui || !video) + return; + + kmscon_dlist_for_each(iter, &ui->video_list) { + vid = kmscon_dlist_entry(iter, struct ui_video, list); + if (vid->video == video) { + video_free(vid); + return; + } + } +} diff --git a/src/ui.h b/src/ui.h index 1b4021d..4b35fcd 100644 --- a/src/ui.h +++ b/src/ui.h @@ -41,8 +41,9 @@ struct kmscon_ui; int kmscon_ui_new(struct kmscon_ui **out, struct ev_eloop *eloop, - struct uterm_video *video, struct uterm_input *input); void kmscon_ui_free(struct kmscon_ui *ui); +void kmscon_ui_add_video(struct kmscon_ui *ui, struct uterm_video *video); +void kmscon_ui_remove_video(struct kmscon_ui *ui, struct uterm_video *video); #endif /* KMSCON_UI_H */