diff --git a/include/labwc.h b/include/labwc.h index 580fe0ff..bf33ff3a 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -225,6 +225,7 @@ struct view { struct wlr_foreign_toplevel_handle_v1 *toplevel_handle; struct wl_listener toplevel_handle_request_maximize; + struct wl_listener toplevel_handle_request_minimize; struct wl_listener map; struct wl_listener unmap; @@ -296,8 +297,7 @@ void subsurface_create(struct view *view, struct wlr_subsurface *wlr_subsurface) void view_move_resize(struct view *view, struct wlr_box geo); void view_move(struct view *view, double x, double y); -void view_minimize(struct view *view); -void view_unminimize(struct view *view); +void view_minimize(struct view *view, bool minimized); /* view_wlr_output - return the output that a view is mostly on */ struct wlr_output *view_wlr_output(struct view *view); void view_center(struct view *view); diff --git a/src/cursor.c b/src/cursor.c index 99772b76..fe50d19a 100644 --- a/src/cursor.c +++ b/src/cursor.c @@ -337,7 +337,7 @@ cursor_button(struct wl_listener *listener, void *data) view->impl->close(view); break; case LAB_SSD_BUTTON_ICONIFY: - view_minimize(view); + view_minimize(view, true); break; case LAB_SSD_PART_TITLE: interactive_begin(view, LAB_INPUT_STATE_MOVE, 0); diff --git a/src/desktop.c b/src/desktop.c index 1b0e3b7f..a727bb4c 100644 --- a/src/desktop.c +++ b/src/desktop.c @@ -98,7 +98,7 @@ desktop_focus_view(struct seat *seat, struct view *view) } if (view->minimized) { /* this will unmap and then focus */ - view_unminimize(view); + view_minimize(view, false); return; } else if (view->mapped) { struct wlr_surface *prev_surface; diff --git a/src/foreign.c b/src/foreign.c index 2f8934fe..82eb28e8 100644 --- a/src/foreign.c +++ b/src/foreign.c @@ -1,12 +1,20 @@ #include "labwc.h" +static void +handle_toplevel_handle_request_minimize(struct wl_listener *listener, void *data) +{ + struct view *view = wl_container_of(listener, view, + toplevel_handle_request_minimize); + struct wlr_foreign_toplevel_handle_v1_minimized_event *event = data; + view_minimize(view, event->minimized); +} + static void handle_toplevel_handle_request_maximize(struct wl_listener *listener, void *data) { struct view *view = wl_container_of(listener, view, toplevel_handle_request_maximize); struct wlr_foreign_toplevel_handle_v1_maximized_event *event = data; - printf("max=%d\n", event->maximized); view_maximize(view, event->maximized); } @@ -23,4 +31,8 @@ foreign_toplevel_handle_create(struct view *view) handle_toplevel_handle_request_maximize; wl_signal_add(&view->toplevel_handle->events.request_maximize, &view->toplevel_handle_request_maximize); + view->toplevel_handle_request_minimize.notify = + handle_toplevel_handle_request_minimize; + wl_signal_add(&view->toplevel_handle->events.request_minimize, + &view->toplevel_handle_request_minimize); } diff --git a/src/view.c b/src/view.c index a076a310..0b71c743 100644 --- a/src/view.c +++ b/src/view.c @@ -16,23 +16,21 @@ view_move(struct view *view, double x, double y) } void -view_minimize(struct view *view) +view_minimize(struct view *view, bool minimized) { - if (view->minimized == true) { + if (view->minimized == minimized) { return; } - view->minimized = true; - view->impl->unmap(view); -} - -void -view_unminimize(struct view *view) -{ - if (view->minimized == false) { - return; + if (view->toplevel_handle) { + wlr_foreign_toplevel_handle_v1_set_minimized(view->toplevel_handle, + minimized); + } + view->minimized = minimized; + if (minimized) { + view->impl->unmap(view); + } else { + view->impl->map(view); } - view->minimized = false; - view->impl->map(view); } /* view_wlr_output - return the output that a view is mostly on */