diff --git a/include/labwc.h b/include/labwc.h index 132390a2..3f1dea66 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -170,6 +170,7 @@ struct view_impl { const char *(*get_string_prop)(struct view *view, const char *prop); void (*map)(struct view *view); void (*move)(struct view *view, double x, double y); + void (*set_activated)(struct view *view, bool activated); void (*set_fullscreen)(struct view *view, bool fullscreen); void (*unmap)(struct view *view); void (*maximize)(struct view *view, bool maximize); @@ -317,6 +318,7 @@ void view_child_init(struct view_child *child, struct view *view, void view_child_finish(struct view_child *child); void subsurface_create(struct view *view, struct wlr_subsurface *wlr_subsurface); +void view_set_activated(struct view *view, bool activated); 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, bool minimized); diff --git a/src/view.c b/src/view.c index 530753a9..3a9c4a33 100644 --- a/src/view.c +++ b/src/view.c @@ -4,6 +4,18 @@ #include "labwc.h" #include "ssd.h" +void +view_set_activated(struct view *view, bool activated) +{ + if (view->impl->set_activated) { + view->impl->set_activated(view, activated); + } + if (view->toplevel_handle) { + wlr_foreign_toplevel_handle_v1_set_activated( + view->toplevel_handle, activated); + } +} + void view_move_resize(struct view *view, struct wlr_box geo) { diff --git a/src/xdg.c b/src/xdg.c index 080cee42..202f285d 100644 --- a/src/xdg.c +++ b/src/xdg.c @@ -226,6 +226,15 @@ xdg_toplevel_view_maximize(struct view *view, bool maximized) wlr_xdg_toplevel_set_maximized(view->xdg_surface, maximized); } +static void +xdg_toplevel_view_set_activated(struct view *view, bool activated) +{ + struct wlr_xdg_surface *surface = view->xdg_surface; + if (surface->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL) { + wlr_xdg_toplevel_set_activated(surface, activated); + } +} + static void xdg_toplevel_view_set_fullscreen(struct view *view, bool fullscreen) { @@ -356,6 +365,7 @@ static const struct view_impl xdg_toplevel_view_impl = { .get_string_prop = xdg_toplevel_view_get_string_prop, .map = xdg_toplevel_view_map, .move = xdg_toplevel_view_move, + .set_activated = xdg_toplevel_view_set_activated, .set_fullscreen = xdg_toplevel_view_set_fullscreen, .unmap = xdg_toplevel_view_unmap, .maximize = xdg_toplevel_view_maximize, diff --git a/src/xwayland.c b/src/xwayland.c index edb81eee..eb730c6e 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -227,6 +227,19 @@ maximize(struct view *view, bool maximized) wlr_xwayland_surface_set_maximized(view->xwayland_surface, maximized); } +static void +set_activated(struct view *view, bool activated) +{ + struct wlr_xwayland_surface *surface = view->xwayland_surface; + + if (activated && surface->minimized) { + wlr_xwayland_surface_set_minimized(surface, false); + } + + wlr_xwayland_surface_activate(surface, activated); + wlr_xwayland_surface_restack(surface, NULL, XCB_STACK_MODE_ABOVE); +} + static void set_fullscreen(struct view *view, bool fullscreen) { @@ -240,6 +253,7 @@ static const struct view_impl xwl_view_impl = { .get_string_prop = get_string_prop, .map = map, .move = move, + .set_activated = set_activated, .set_fullscreen = set_fullscreen, .unmap = unmap, .maximize = maximize