feat: handle minimize event on views
This commit is contained in:
parent
b0a3ce65e7
commit
4c289d28da
@ -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
208
view.c
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user