* session is locked/input is inhibited; it will simply do nothing.
*/
void desktop_focus_view(struct view *view, bool raise);
+
+/**
+ * desktop_focus_view_or_surface() - like desktop_focus_view() but can
+ * also focus other (e.g. xwayland-unmanaged) surfaces
+ */
+void desktop_focus_view_or_surface(struct seat *seat, struct view *view,
+ struct wlr_surface *surface, bool raise);
+
void desktop_arrange_all_views(struct server *server);
void desktop_focus_output(struct output *output);
struct view *desktop_topmost_focusable_view(struct server *server);
#include "workspaces.h"
#include "xwayland.h"
+#if HAVE_XWAYLAND
+#include <wlr/xwayland.h>
+#endif
+
void
desktop_arrange_all_views(struct server *server)
{
}
}
+/* TODO: focus layer-shell surfaces also? */
+void
+desktop_focus_view_or_surface(struct seat *seat, struct view *view,
+ struct wlr_surface *surface, bool raise)
+{
+ assert(view || surface);
+ if (view) {
+ desktop_focus_view(view, raise);
+#if HAVE_XWAYLAND
+ } else if (wlr_surface_is_xwayland_surface(surface)) {
+ struct wlr_xwayland_surface *xsurface =
+ wlr_xwayland_surface_from_wlr_surface(surface);
+ if (xsurface && wlr_xwayland_or_surface_wants_focus(xsurface)) {
+ seat_focus_surface(seat, surface);
+ }
+#endif
+ }
+}
+
static struct wl_list *
get_prev_item(struct wl_list *item)
{
dnd_icons_move(seat, seat->cursor->x, seat->cursor->y);
}
- if (ctx.view && rc.focus_follow_mouse) {
- desktop_focus_view(ctx.view, rc.raise_on_focus);
+ if ((ctx.view || ctx.surface) && rc.focus_follow_mouse) {
+ desktop_focus_view_or_surface(seat, ctx.view, ctx.surface,
+ rc.raise_on_focus);
}
struct mousebind *mousebind;
/* Focus surface under cursor if it isn't already focused */
struct cursor_context ctx = get_cursor_context(server);
- if (ctx.view && rc.focus_follow_mouse
+ if ((ctx.view || ctx.surface) && rc.focus_follow_mouse
&& !rc.focus_follow_mouse_requires_movement
&& !server->osd_state.cycle_view) {
/* Prevents changing keyboard focus during A-Tab */
- desktop_focus_view(ctx.view, rc.raise_on_focus);
+ desktop_focus_view_or_surface(&server->seat, ctx.view,
+ ctx.surface, rc.raise_on_focus);
}
cursor_update_common(server, &ctx, msec(&now),
return;
}
- /* Handle _press_ on a layer surface */
+ /*
+ * On press, set focus to a non-view surface that wants it.
+ * Action processing does not run for these surfaces and thus
+ * the Focus action (used for normal views) does not work.
+ */
if (ctx.type == LAB_SSD_LAYER_SURFACE) {
struct wlr_layer_surface_v1 *layer =
wlr_layer_surface_v1_from_wlr_surface(ctx.surface);
if (layer && layer->current.keyboard_interactive) {
seat_set_focus_layer(seat, layer);
}
+#ifdef HAVE_XWAYLAND
+ } else if (ctx.type == LAB_SSD_UNMANAGED) {
+ desktop_focus_view_or_surface(seat, NULL, ctx.surface,
+ /*raise*/ false);
+#endif
}
/*