TextInput: remove pending_focused_surface
This state doesn't need to exist, just get the focus from the Seat.
This commit is contained in:
parent
55ed16efd1
commit
49defcfb7a
@ -196,10 +196,8 @@ fn handleNewInputMethod(
|
||||
|
||||
log.debug("new input method on seat {s}", .{relay.seat.wlr_seat.name});
|
||||
|
||||
const text_input = relay.getFocusableTextInput() orelse return;
|
||||
if (text_input.pending_focused_surface) |surface| {
|
||||
text_input.wlr_text_input.sendEnter(surface);
|
||||
text_input.setPendingFocusedSurface(null);
|
||||
if (seat.focused.surface()) |surface| {
|
||||
relay.setSurfaceFocus(surface);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -102,11 +102,9 @@ fn handleInputMethodDestroy(
|
||||
|
||||
self.input_method = null;
|
||||
|
||||
const text_input = self.getFocusedTextInput() orelse return;
|
||||
if (text_input.wlr_text_input.focused_surface) |surface| {
|
||||
text_input.setPendingFocusedSurface(surface);
|
||||
if (self.getFocusedTextInput()) |text_input| {
|
||||
text_input.wlr_text_input.sendLeave();
|
||||
}
|
||||
text_input.wlr_text_input.sendLeave();
|
||||
}
|
||||
|
||||
fn handleInputMethodGrabKeyboard(
|
||||
@ -133,14 +131,6 @@ fn handleInputMethodGrabKeyboardDestroy(
|
||||
}
|
||||
}
|
||||
|
||||
pub fn getFocusableTextInput(self: *Self) ?*TextInput {
|
||||
var it = self.text_inputs.first;
|
||||
return while (it) |node| : (it = node.next) {
|
||||
const text_input = &node.data;
|
||||
if (text_input.pending_focused_surface != null) break text_input;
|
||||
} else null;
|
||||
}
|
||||
|
||||
pub fn getFocusedTextInput(self: *Self) ?*TextInput {
|
||||
var it = self.text_inputs.first;
|
||||
return while (it) |node| : (it = node.next) {
|
||||
@ -194,13 +184,7 @@ pub fn setSurfaceFocus(self: *Self, wlr_surface: ?*wlr.Surface) void {
|
||||
var it = self.text_inputs.first;
|
||||
while (it) |node| : (it = node.next) {
|
||||
const text_input = &node.data;
|
||||
if (text_input.pending_focused_surface) |surface| {
|
||||
assert(text_input.wlr_text_input.focused_surface == null);
|
||||
if (wlr_surface != surface) {
|
||||
text_input.setPendingFocusedSurface(null);
|
||||
}
|
||||
} else if (text_input.wlr_text_input.focused_surface) |surface| {
|
||||
assert(text_input.pending_focused_surface == null);
|
||||
if (text_input.wlr_text_input.focused_surface) |surface| {
|
||||
if (wlr_surface != surface) {
|
||||
text_input.relay.disableTextInput(text_input);
|
||||
text_input.wlr_text_input.sendLeave();
|
||||
@ -221,8 +205,6 @@ pub fn setSurfaceFocus(self: *Self, wlr_surface: ?*wlr.Surface) void {
|
||||
if (new_text_input) |text_input| {
|
||||
if (self.input_method != null) {
|
||||
text_input.wlr_text_input.sendEnter(wlr_surface.?);
|
||||
} else {
|
||||
text_input.setPendingFocusedSurface(wlr_surface.?);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -53,6 +53,16 @@ pub const FocusTarget = union(enum) {
|
||||
layer: *LayerSurface,
|
||||
lock_surface: *LockSurface,
|
||||
none: void,
|
||||
|
||||
pub fn surface(target: FocusTarget) ?*wlr.Surface {
|
||||
return switch (target) {
|
||||
.view => |view| view.rootSurface(),
|
||||
.xwayland_override_redirect => |xwayland_or| xwayland_or.xwayland_surface.surface,
|
||||
.layer => |layer| layer.wlr_layer_surface.surface,
|
||||
.lock_surface => |lock_surface| lock_surface.wlr_lock_surface.surface,
|
||||
.none => null,
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
wlr_seat: *wlr.Seat,
|
||||
@ -216,14 +226,7 @@ pub fn setFocusRaw(self: *Self, new_focus: FocusTarget) void {
|
||||
// If the target is already focused, do nothing
|
||||
if (std.meta.eql(new_focus, self.focused)) return;
|
||||
|
||||
// Obtain the target surface
|
||||
const target_surface = switch (new_focus) {
|
||||
.view => |target_view| target_view.rootSurface(),
|
||||
.xwayland_override_redirect => |target_or| target_or.xwayland_surface.surface,
|
||||
.layer => |target_layer| target_layer.wlr_layer_surface.surface,
|
||||
.lock_surface => |lock_surface| lock_surface.wlr_lock_surface.surface,
|
||||
.none => null,
|
||||
};
|
||||
const target_surface = new_focus.surface();
|
||||
|
||||
// First clear the current focus
|
||||
switch (self.focused) {
|
||||
|
@ -32,10 +32,6 @@ const log = std.log.scoped(.text_input);
|
||||
relay: *InputRelay,
|
||||
wlr_text_input: *wlr.TextInputV3,
|
||||
|
||||
/// Surface stored for when text-input can't receive an enter event immediately
|
||||
/// after getting focus. Cleared once text-input receive the enter event.
|
||||
pending_focused_surface: ?*wlr.Surface = null,
|
||||
|
||||
enable: wl.Listener(*wlr.TextInputV3) =
|
||||
wl.Listener(*wlr.TextInputV3).init(handleEnable),
|
||||
commit: wl.Listener(*wlr.TextInputV3) =
|
||||
@ -45,9 +41,6 @@ disable: wl.Listener(*wlr.TextInputV3) =
|
||||
destroy: wl.Listener(*wlr.TextInputV3) =
|
||||
wl.Listener(*wlr.TextInputV3).init(handleDestroy),
|
||||
|
||||
pending_focused_surface_destroy: wl.Listener(*wlr.Surface) =
|
||||
wl.Listener(*wlr.Surface).init(handlePendingFocusedSurfaceDestroy),
|
||||
|
||||
pub fn init(self: *Self, relay: *InputRelay, wlr_text_input: *wlr.TextInputV3) void {
|
||||
self.* = .{
|
||||
.relay = relay,
|
||||
@ -104,8 +97,6 @@ fn handleDestroy(listener: *wl.Listener(*wlr.TextInputV3), _: *wlr.TextInputV3)
|
||||
|
||||
if (self.wlr_text_input.current_enabled) self.relay.disableTextInput(self);
|
||||
|
||||
node.data.setPendingFocusedSurface(null);
|
||||
|
||||
self.enable.link.remove();
|
||||
self.commit.link.remove();
|
||||
self.disable.link.remove();
|
||||
@ -114,18 +105,3 @@ fn handleDestroy(listener: *wl.Listener(*wlr.TextInputV3), _: *wlr.TextInputV3)
|
||||
self.relay.text_inputs.remove(node);
|
||||
util.gpa.destroy(node);
|
||||
}
|
||||
|
||||
fn handlePendingFocusedSurfaceDestroy(listener: *wl.Listener(*wlr.Surface), surface: *wlr.Surface) void {
|
||||
const self = @fieldParentPtr(Self, "pending_focused_surface_destroy", listener);
|
||||
assert(self.pending_focused_surface == surface);
|
||||
self.pending_focused_surface = null;
|
||||
self.pending_focused_surface_destroy.link.remove();
|
||||
}
|
||||
|
||||
pub fn setPendingFocusedSurface(self: *Self, wlr_surface: ?*wlr.Surface) void {
|
||||
if (self.pending_focused_surface != null) self.pending_focused_surface_destroy.link.remove();
|
||||
self.pending_focused_surface = wlr_surface;
|
||||
if (self.pending_focused_surface) |surface| {
|
||||
surface.events.destroy.add(&self.pending_focused_surface_destroy);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user