dnd: fix focus at end of dnd operation

By default, leave keyboard-focus with the surface that originally had it
at the end of a dnd operation.  This is consistent with the default
behaviour of openbox and mutter.

If the 'focus/followMouse' option is enabled, then focus on the surface
under the cursor at the end of the dnd operation.

Fixes: issue #976
This commit is contained in:
Johan Malm 2023-07-10 16:56:02 +01:00 committed by Johan Malm
parent 40aba9e542
commit 598044aa6b

View file

@ -7,6 +7,7 @@
#include "cursor.h" #include "cursor.h"
#include "dnd.h" #include "dnd.h"
#include "labwc.h" /* for struct seat */ #include "labwc.h" /* for struct seat */
#include "view.h"
/* Internal DnD icon handlers */ /* Internal DnD icon handlers */
static void static void
@ -138,15 +139,28 @@ handle_drag_destroy(struct wl_listener *listener, void *data)
wlr_scene_node_set_enabled(&seat->drag.icons->node, false); wlr_scene_node_set_enabled(&seat->drag.icons->node, false);
/* /*
* Keyboard focus is not changed during drag, so we need to refocus the * The default focus behaviour at the end of a dnd operation is that the
* current surface under the cursor. * window that originally had keyboard-focus retains that focus. This is
* consistent with the default behaviour of openbox and mutter.
*
* However, if the 'focus/followMouse' option is enabled we need to
* refocus the current surface under the cursor because keyboard focus
* is not changed during drag.
*/ */
if (!rc.focus_follow_mouse) {
return;
}
struct cursor_context ctx = get_cursor_context(seat->server); struct cursor_context ctx = get_cursor_context(seat->server);
if (!ctx.surface) { if (!ctx.surface) {
return; return;
} }
seat_focus_surface(seat, NULL); seat_focus_surface(seat, NULL);
seat_focus_surface(seat, ctx.surface); seat_focus_surface(seat, ctx.surface);
if (ctx.view && rc.raise_on_focus) {
view_move_to_front(ctx.view);
}
} }
/* Public API */ /* Public API */