diff --git a/rootston/desktop.c b/rootston/desktop.c index 7a780cb9..0eb63dc4 100644 --- a/rootston/desktop.c +++ b/rootston/desktop.c @@ -53,6 +53,10 @@ static void view_update_output(const struct roots_view *view, } void view_move(struct roots_view *view, double x, double y) { + if (view->x == x && view->y == y) { + return; + } + struct wlr_box before; view_get_box(view, &before); if (view->move) { @@ -61,6 +65,7 @@ void view_move(struct roots_view *view, double x, double y) { view->x = x; view->y = y; } + view_update_output(view, &before); } void view_activate(struct roots_view *view, bool activate) { diff --git a/rootston/output.c b/rootston/output.c index d62c0b0d..bf684f2f 100644 --- a/rootston/output.c +++ b/rootston/output.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -194,11 +195,26 @@ static void output_frame_notify(struct wl_listener *listener, void *data) { wlr_renderer_begin(server->renderer, wlr_output); if (output->fullscreen_view != NULL) { + // Make sure the view is centered on screen + const struct wlr_box *output_box = + wlr_output_layout_get_box(desktop->layout, wlr_output); + struct wlr_box view_box; + view_get_box(output->fullscreen_view, &view_box); + double view_x = (double)(output_box->width - view_box.width) / 2 + + output_box->x; + double view_y = (double)(output_box->height - view_box.height) / 2 + + output_box->y; + view_move(output->fullscreen_view, view_x, view_y); + if (has_standalone_surface(output->fullscreen_view)) { wlr_output_set_fullscreen_surface(wlr_output, output->fullscreen_view->wlr_surface); } else { wlr_output_set_fullscreen_surface(wlr_output, NULL); + + glClearColor(0, 0, 0, 0); + glClear(GL_COLOR_BUFFER_BIT); + render_view(output->fullscreen_view, desktop, wlr_output, &now); } wlr_renderer_end(server->renderer);