ui: convert API to support multiple video objects
authorDavid Herrmann <dh.herrmann@googlemail.com>
Sat, 11 Aug 2012 12:09:44 +0000 (14:09 +0200)
committerDavid Herrmann <dh.herrmann@googlemail.com>
Sat, 11 Aug 2012 12:09:44 +0000 (14:09 +0200)
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 <dh.herrmann@googlemail.com>
src/main.c
src/ui.c
src/ui.h

index 66cb37d..9d06084 100644 (file)
@@ -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;
index f3e6019..8c4ae50 100644 (file)
--- 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;
+               }
+       }
+}
index 1b4021d..4b35fcd 100644 (file)
--- 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 */