diff --git a/main.c b/main.c index b09b5e3b..ebc35a20 100644 --- a/main.c +++ b/main.c @@ -146,20 +146,22 @@ main(int argc, char *const *argv) if ((term = term_init(&conf, fdm, wayl, argc, argv)) == NULL) goto out; - while (true) { - wl_display_flush(term->wl->display); /* TODO: figure out how to get rid of this */ + while (tll_length(wayl->terms) > 0) { + wl_display_flush(wayl->display); /* TODO: figure out how to get rid of this */ if (!fdm_poll(fdm)) break; } - if (term->quit) - ret = EXIT_SUCCESS; + ret = tll_length(wayl->terms) == 0 ? EXIT_SUCCESS : EXIT_FAILURE; out: shm_fini(); - int child_ret = term_destroy(term); + int child_ret = EXIT_SUCCESS; + tll_foreach(wayl->terms, it) + child_ret = term_destroy(it->item); + wayl_destroy(wayl); fdm_destroy(fdm); config_free(conf); diff --git a/terminal.c b/terminal.c index 301319ff..d889cfca 100644 --- a/terminal.c +++ b/terminal.c @@ -472,7 +472,7 @@ term_init(const struct config *conf, struct fdm *fdm, struct wayland *wayl, goto err; } - wayl->term = term; + tll_push_back(wayl->terms, term); return term; err: diff --git a/wayland.c b/wayland.c index 2fcf2340..ded823a5 100644 --- a/wayland.c +++ b/wayland.c @@ -123,8 +123,8 @@ output_scale(void *data, struct wl_output *wl_output, int32_t factor) mon->scale = factor; - struct terminal *term = mon->wayl->term; - if (term != NULL) { + tll_foreach(mon->wayl->terms, it) { + struct terminal *term = it->item; render_resize(term, term->width / term->scale, term->height / term->scale); wayl_reload_cursor_theme(mon->wayl, term); } @@ -394,7 +394,7 @@ fdm_wayl(struct fdm *fdm, int fd, int events, void *data) return false; } - return event_count != -1 && !wayl->term->quit; + return event_count != -1; } static bool @@ -763,14 +763,24 @@ wayl_update_cursor_surface(struct wayland *wayl, struct terminal *term) struct terminal * wayl_terminal_from_surface(struct wayland *wayl, struct wl_surface *surface) { - assert(surface == wayl->term->window->surface); - return wayl->term; + tll_foreach(wayl->terms, it) { + if (it->item->window->surface == surface) + return it->item; + } + + assert(false); + return NULL; } struct terminal * wayl_terminal_from_xdg_toplevel(struct wayland *wayl, struct xdg_toplevel *toplevel) { - assert(toplevel == wayl->term->window->xdg_toplevel); - return wayl->term; + tll_foreach(wayl->terms, it) { + if (it->item->window->xdg_toplevel == toplevel) + return it->item; + } + + assert(false); + return NULL; } diff --git a/wayland.h b/wayland.h index a8aba13c..9ac094f8 100644 --- a/wayland.h +++ b/wayland.h @@ -145,8 +145,7 @@ struct wayland { bool have_argb8888; tll(struct monitor) monitors; /* All available outputs */ - /* TODO: turn into a list to support multiple windows */ - struct terminal *term; + tll(struct terminal *) terms; struct terminal *focused; struct terminal *moused; };