diff --git a/src/xdg.c b/src/xdg.c index 11785d15..665fab12 100644 --- a/src/xdg.c +++ b/src/xdg.c @@ -178,6 +178,9 @@ static void handle_request_maximize(struct wl_listener *listener, void *data) { struct view *view = wl_container_of(listener, view, request_maximize); + if (!view->mapped && !view->output) { + view->output = output_nearest_to_cursor(view->server); + } view_maximize(view, xdg_toplevel_from_view(view)->requested.maximized, /*store_natural_geometry*/ true); } @@ -186,6 +189,9 @@ static void handle_request_fullscreen(struct wl_listener *listener, void *data) { struct view *view = wl_container_of(listener, view, request_fullscreen); + if (!view->mapped && !view->output) { + view->output = output_nearest_to_cursor(view->server); + } struct wlr_xdg_toplevel *xdg_toplevel = xdg_toplevel_from_view(view); struct output *output = output_from_wlr_output(view->server, xdg_toplevel->requested.fullscreen_output); @@ -317,6 +323,9 @@ xdg_toplevel_view_map(struct view *view) return; } view->mapped = true; + if (!view->output) { + view->output = output_nearest_to_cursor(view->server); + } struct wlr_xdg_surface *xdg_surface = xdg_surface_from_view(view); view->surface = xdg_surface->surface; wlr_scene_node_set_enabled(&view->scene_tree->node, true); diff --git a/src/xwayland.c b/src/xwayland.c index 07c91f65..4b7c2958 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -74,7 +74,7 @@ xwayland_surface_from_view(struct view *view) } static void -ensure_initial_geometry(struct view *view) +ensure_initial_geometry_and_output(struct view *view) { if (wlr_box_empty(&view->current)) { struct wlr_xwayland_surface *xwayland_surface = @@ -91,6 +91,13 @@ ensure_initial_geometry(struct view *view) view->pending = view->current; } } + if (!view->output) { + /* + * Just use the cursor output since we don't know yet + * whether the surface position is meaningful. + */ + view->output = output_nearest_to_cursor(view->server); + } } static bool @@ -286,8 +293,8 @@ static void handle_request_maximize(struct wl_listener *listener, void *data) { struct view *view = wl_container_of(listener, view, request_maximize); - if (!view->been_mapped) { - ensure_initial_geometry(view); + if (!view->mapped) { + ensure_initial_geometry_and_output(view); /* * Set decorations early to avoid changing geometry * after maximize (reduces visual glitches). @@ -303,8 +310,8 @@ handle_request_fullscreen(struct wl_listener *listener, void *data) { struct view *view = wl_container_of(listener, view, request_fullscreen); bool fullscreen = xwayland_surface_from_view(view)->fullscreen; - if (!view->been_mapped) { - ensure_initial_geometry(view); + if (!view->mapped) { + ensure_initial_geometry_and_output(view); } view_set_fullscreen(view, fullscreen, NULL); } @@ -417,7 +424,7 @@ xwayland_view_map(struct view *view) return; } view->mapped = true; - ensure_initial_geometry(view); + ensure_initial_geometry_and_output(view); wlr_scene_node_set_enabled(&view->scene_tree->node, true); struct wlr_xwayland_surface *xwayland_surface = xwayland_surface_from_view(view);