feat: handle minimize event on views

This commit is contained in:
DL 2025-06-11 12:01:15 +02:00
parent b0a3ce65e7
commit 4c289d28da
2 changed files with 111 additions and 101 deletions

View File

@ -8,7 +8,6 @@ static void handle_request_minimize(struct wl_listener *listener, void *data)
struct wlr_foreign_toplevel_handle_v1_minimized_event *event = data;
// view_minimize(view, event->minimized);
diyac_view_set_mimimize(view, event->minimized);
wlr_log(WLR_INFO, "foreign: request minimize");
}
static void handle_request_maximize(struct wl_listener *listener, void *data)
@ -18,7 +17,6 @@ static void handle_request_maximize(struct wl_listener *listener, void *data)
// view_maximize(view, event->maximized ? VIEW_AXIS_BOTH : VIEW_AXIS_NONE,
// /*store_natural_geometry*/ true);
diyac_view_set_maximize(view, event->maximized);
wlr_log(WLR_INFO, "foreign: request maximize");
}
static void handle_request_fullscreen(struct wl_listener *listener, void *data)
@ -27,7 +25,6 @@ static void handle_request_fullscreen(struct wl_listener *listener, void *data)
struct wlr_foreign_toplevel_handle_v1_fullscreen_event *event = data;
// view_set_fullscreen(view, event->fullscreen);
diyac_view_set_fullscreen(view, event->fullscreen);
wlr_log(WLR_INFO, "foreign: request fullscreen");
}
static void handle_request_activate(struct wl_listener *listener, void *data)
@ -37,7 +34,6 @@ static void handle_request_activate(struct wl_listener *listener, void *data)
/* In a multi-seat world we would select seat based on event->seat here. */
// desktop_focus_view(view, /*raise*/ true);
diyac_focus_view(view, true);
wlr_log(WLR_INFO, "foreign: request activate");
}
static void

208
view.c
View File

@ -163,7 +163,7 @@ struct diyac_view *diyac_topmost_focusable_view(struct diyac_server *server)
}
view = diyac_view_from_node(node);
if (view->mapped /*&& view_is_focusable_from(view, prev)*/)
if (view->mapped && view->scene_tree->node.enabled)
{
return view;
}
@ -200,6 +200,11 @@ bool diyac_view_update_geometry(struct diyac_view *view, bool grabbed)
wlr_xdg_surface_schedule_configure(view->xdg_toplevel->base);
return false;
}
if(view->state.minimized)
{
// If the view is minimized, we don't update its geometry
return false;
}
struct diyac_view *root = diyac_get_root_view(view);
struct diyac_server *server = view->server;
struct wlr_box usable = {0};
@ -211,112 +216,102 @@ bool diyac_view_update_geometry(struct diyac_view *view, bool grabbed)
{
diyac_output_usable_area(view->output, &usable);
}
// invalidate old state if change state
if (view->state.fullscreen && !view->requested.fullscreen)
if (view->state.fullscreen != view->requested.fullscreen)
{
wlr_xdg_toplevel_set_fullscreen(view->xdg_toplevel, false);
wlr_xdg_toplevel_set_fullscreen(view->xdg_toplevel, view->requested.fullscreen);
wlr_scene_node_set_enabled(&view->output->scenes.top->node, !view->requested.fullscreen);
if (view->toplevel.handle)
{
wlr_foreign_toplevel_handle_v1_set_fullscreen(view->toplevel.handle, false);
wlr_foreign_toplevel_handle_v1_set_fullscreen(view->toplevel.handle, view->requested.fullscreen);
}
wlr_scene_node_set_enabled(&view->output->scenes.top->node, true);
view->state.fullscreen = false;
view->pending_size = view->original;
}
if (view->state.maximized && !view->requested.maximized)
{
wlr_xdg_toplevel_set_maximized(view->xdg_toplevel, false);
if (view->toplevel.handle)
if(view->requested.fullscreen)
{
wlr_foreign_toplevel_handle_v1_set_maximized(view->toplevel.handle, false);
}
view->pending_size = view->original;
view->state.maximized = false;
}
bool updated = false;
if (view->requested.minimized)
{
// TODO implement minimize
return false;
}
else if (!view->state.fullscreen && view->requested.fullscreen)
{
wlr_xdg_toplevel_set_fullscreen(view->xdg_toplevel, true);
wlr_scene_node_set_enabled(&view->output->scenes.top->node, false);
if (view->toplevel.handle)
{
wlr_foreign_toplevel_handle_v1_set_fullscreen(view->toplevel.handle, true);
}
diyac_view_configure(view, usable);
updated = true;
}
else if (view->requested.maximized)
{
wlr_xdg_toplevel_set_maximized(view->xdg_toplevel, true);
if (view->toplevel.handle)
{
wlr_foreign_toplevel_handle_v1_set_maximized(view->toplevel.handle, true);
}
diyac_view_configure(view, usable);
updated = true;
}
else
{
// if (wlr_output_layout_intersects(view->server->output_layout,
// view->output->wlr_output, &view->current))
//{
/**Normal state, recalculate current geometry*/
struct wlr_box geometry = view->pending_size;
// Only adjust position only when not in fullscreen mode
if(!grabbed)
{
if (geometry.x > (usable.x + usable.width))
{
geometry.x = (usable.x + usable.width) - (geometry.width / 2);
}
if (geometry.y > (usable.y + usable.height))
{
geometry.y = (usable.y + usable.height) - (geometry.height / 2);
}
if (geometry.x < usable.x)
{
geometry.x = usable.x;
}
if (geometry.y < usable.y)
{
geometry.y = usable.y;
}
diyac_view_configure(view, usable);
view->state.fullscreen = view->requested.fullscreen;
return true;
}
else
{
if (server->seat.cursor->x <= usable.x)
{
geometry.x = usable.x - server->grab_x;
}
if (server->seat.cursor->y <= usable.y)
{
geometry.y = usable.y;
}
if (server->seat.cursor->x >= usable.x + usable.width)
{
geometry.x = usable.x + usable.width - server->grab_x;
}
if (server->seat.cursor->y >= usable.y + usable.height)
{
geometry.y = usable.y + usable.height - server->grab_y;
}
view->pending_size = view->original;
}
if (!wlr_box_equal(&geometry, &view->original) || !view->requested.maximized)
}
if (view->requested.maximized != view->state.maximized)
{
wlr_xdg_toplevel_set_maximized(view->xdg_toplevel, view->requested.maximized);
if (view->toplevel.handle)
{
wlr_log(WLR_DEBUG, "diyac_view_update_geometry: updating geometry: %d %d %d %d", geometry.x, geometry.y, geometry.width, geometry.height);
// wlr_scene_node_set_position(&view->scene_tree->node, geometry.x, geometry.y);
// wlr_xdg_toplevel_set_size(view->xdg_toplevel, geometry.width, geometry.height);
diyac_view_configure(view, geometry);
updated = true;
wlr_foreign_toplevel_handle_v1_set_maximized(view->toplevel.handle, view->requested.maximized);
}
if(view->requested.maximized)
{
diyac_view_configure(view, usable);
view->state.maximized = view->requested.maximized;
return true;
}
else
{
view->pending_size = view->original;
}
}
// if (wlr_output_layout_intersects(view->server->output_layout,
// view->output->wlr_output, &view->current))
//{
/**Normal state, recalculate current geometry*/
struct wlr_box geometry = view->pending_size;
// Only adjust position only when not in fullscreen mode
if(!grabbed)
{
if (geometry.x > (usable.x + usable.width))
{
geometry.x = (usable.x + usable.width) - (geometry.width / 2);
}
if (geometry.y > (usable.y + usable.height))
{
geometry.y = (usable.y + usable.height) - (geometry.height / 2);
}
if (geometry.x < usable.x)
{
geometry.x = usable.x;
}
if (geometry.y < usable.y)
{
geometry.y = usable.y;
}
}
else
{
if (server->seat.cursor->x <= usable.x)
{
geometry.x = usable.x - server->grab_x;
}
if (server->seat.cursor->y <= usable.y)
{
geometry.y = usable.y;
}
if (server->seat.cursor->x >= usable.x + usable.width)
{
geometry.x = usable.x + usable.width - server->grab_x;
}
if (server->seat.cursor->y >= usable.y + usable.height)
{
geometry.y = usable.y + usable.height - server->grab_y;
}
}
view->state = view->requested;
return updated;
if (!wlr_box_equal(&geometry, &view->original) || !view->requested.maximized)
{
wlr_log(WLR_DEBUG, "diyac_view_update_geometry: updating geometry: %d %d %d %d", geometry.x, geometry.y, geometry.width, geometry.height);
// wlr_scene_node_set_position(&view->scene_tree->node, geometry.x, geometry.y);
// wlr_xdg_toplevel_set_size(view->xdg_toplevel, geometry.width, geometry.height);
diyac_view_configure(view, geometry);
return true;
}
//
return false;
}
void diyac_get_children_views(struct diyac_view *view, struct wl_array *children)
@ -384,9 +379,28 @@ void diyac_view_set_fullscreen(struct diyac_view *view, bool activated)
}
void diyac_view_set_mimimize(struct diyac_view *view, bool activated)
{
// view->requested.minimized = activated;
// TODO implement minimize
wlr_xdg_surface_schedule_configure(view->xdg_toplevel->base);
wlr_log(WLR_INFO, " request minimize");
view->requested.minimized = activated;
//diyac_view_update_geometry(view, false);
if (view->state.minimized != view->requested.minimized)
{
wlr_log(WLR_INFO, "diyac_view_update_geometry: request minimize");
wlr_scene_node_set_enabled(&view->scene_tree->node, !view->requested.minimized);
if(!activated)
{
diyac_focus_view(view, true);
}
else
{
diyac_focus_topmost_view(view->server, true);
}
if(view->toplevel.handle)
{
wlr_foreign_toplevel_handle_v1_set_minimized(view->toplevel.handle, view->requested.minimized);
}
wlr_xdg_surface_schedule_configure(view->xdg_toplevel->base);
view->state.minimized = view->requested.minimized;
}
}
void diyac_view_update_title(struct diyac_view *view)