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; struct wlr_foreign_toplevel_handle_v1_minimized_event *event = data;
// view_minimize(view, event->minimized); // view_minimize(view, event->minimized);
diyac_view_set_mimimize(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) 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, // view_maximize(view, event->maximized ? VIEW_AXIS_BOTH : VIEW_AXIS_NONE,
// /*store_natural_geometry*/ true); // /*store_natural_geometry*/ true);
diyac_view_set_maximize(view, event->maximized); 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) 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; struct wlr_foreign_toplevel_handle_v1_fullscreen_event *event = data;
// view_set_fullscreen(view, event->fullscreen); // view_set_fullscreen(view, event->fullscreen);
diyac_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) 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. */ /* In a multi-seat world we would select seat based on event->seat here. */
// desktop_focus_view(view, /*raise*/ true); // desktop_focus_view(view, /*raise*/ true);
diyac_focus_view(view, true); diyac_focus_view(view, true);
wlr_log(WLR_INFO, "foreign: request activate");
} }
static void static void

112
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); 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; 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); wlr_xdg_surface_schedule_configure(view->xdg_toplevel->base);
return false; 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_view *root = diyac_get_root_view(view);
struct diyac_server *server = view->server; struct diyac_server *server = view->server;
struct wlr_box usable = {0}; struct wlr_box usable = {0};
@ -211,57 +216,47 @@ bool diyac_view_update_geometry(struct diyac_view *view, bool grabbed)
{ {
diyac_output_usable_area(view->output, &usable); 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) 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); if(view->requested.fullscreen)
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)
{
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); diyac_view_configure(view, usable);
updated = true; view->state.fullscreen = view->requested.fullscreen;
} return 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 else
{ {
view->pending_size = view->original;
}
}
if (view->requested.maximized != view->state.maximized)
{
wlr_xdg_toplevel_set_maximized(view->xdg_toplevel, view->requested.maximized);
if (view->toplevel.handle)
{
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, // if (wlr_output_layout_intersects(view->server->output_layout,
// view->output->wlr_output, &view->current)) // view->output->wlr_output, &view->current))
//{ //{
@ -306,17 +301,17 @@ bool diyac_view_update_geometry(struct diyac_view *view, bool grabbed)
geometry.y = usable.y + usable.height - server->grab_y; geometry.y = usable.y + usable.height - server->grab_y;
} }
} }
view->state = view->requested;
if (!wlr_box_equal(&geometry, &view->original) || !view->requested.maximized) 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_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_scene_node_set_position(&view->scene_tree->node, geometry.x, geometry.y);
// wlr_xdg_toplevel_set_size(view->xdg_toplevel, geometry.width, geometry.height); // wlr_xdg_toplevel_set_size(view->xdg_toplevel, geometry.width, geometry.height);
diyac_view_configure(view, geometry); diyac_view_configure(view, geometry);
updated = true; return true;
} }
} //
view->state = view->requested; return false;
return updated;
} }
void diyac_get_children_views(struct diyac_view *view, struct wl_array *children) 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) void diyac_view_set_mimimize(struct diyac_view *view, bool activated)
{ {
// view->requested.minimized = activated; wlr_log(WLR_INFO, " request minimize");
// TODO implement 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); wlr_xdg_surface_schedule_configure(view->xdg_toplevel->base);
view->state.minimized = view->requested.minimized;
}
} }
void diyac_view_update_title(struct diyac_view *view) void diyac_view_update_title(struct diyac_view *view)