diff --git a/foreign.c b/foreign.c index 8014027..b5378be 100644 --- a/foreign.c +++ b/foreign.c @@ -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 diff --git a/view.c b/view.c index 47d2e67..2417b42 100644 --- a/view.c +++ b/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)