Ignore dead keys

Submit form on "Enter" within text input.

Convert "Enter" to "\n" in textarea.
This commit is contained in:
Karl Seguin
2025-06-11 19:37:26 +08:00
parent effd07d8c0
commit 3a4bd00020

View File

@@ -647,26 +647,38 @@ pub const Page = struct {
}; };
} }
fn _keydownCallback(page: *Page, event: *parser.Event) !void { fn _keydownCallback(self: *Page, event: *parser.Event) !void {
const kbe: *parser.KeyboardEvent = @ptrCast(event);
const target = (try parser.eventTarget(event)) orelse return; const target = (try parser.eventTarget(event)) orelse return;
const node = parser.eventTargetToNode(target); const node = parser.eventTargetToNode(target);
const tag = (try parser.nodeHTMLGetTagType(node)) orelse return; const tag = (try parser.nodeHTMLGetTagType(node)) orelse return;
const kbe: *parser.KeyboardEvent = @ptrCast(event);
var new_key = try parser.keyboardEventGetKey(kbe);
if (std.mem.eql(u8, new_key, "Dead")) {
return;
}
switch (tag) { switch (tag) {
.input => { .input => {
const element: *parser.Element = @ptrCast(node); const element: *parser.Element = @ptrCast(node);
const input_type = (try parser.elementGetAttribute(element, "type")) orelse "text"; const input_type = (try parser.elementGetAttribute(element, "type")) orelse "text";
if (std.mem.eql(u8, input_type, "text")) { if (std.mem.eql(u8, input_type, "text")) {
if (std.mem.eql(u8, new_key, "Enter")) {
const form = (try self.formForElement(element)) orelse return;
return self.submitForm(@ptrCast(form), null);
}
const value = try parser.inputGetValue(@ptrCast(element)); const value = try parser.inputGetValue(@ptrCast(element));
const new_key = try parser.keyboardEventGetKey(kbe); const new_value = try std.mem.concat(self.arena, u8, &.{ value, new_key });
const new_value = try std.mem.concat(page.arena, u8, &.{ value, new_key });
try parser.inputSetValue(@ptrCast(element), new_value); try parser.inputSetValue(@ptrCast(element), new_value);
} }
}, },
.textarea => { .textarea => {
const value = try parser.textareaGetValue(@ptrCast(node)); const value = try parser.textareaGetValue(@ptrCast(node));
const new_key = try parser.keyboardEventGetKey(kbe); if (std.mem.eql(u8, new_key, "Enter")) {
const new_value = try std.mem.concat(page.arena, u8, &.{ value, new_key }); new_key = "\n";
}
const new_value = try std.mem.concat(self.arena, u8, &.{ value, new_key });
try parser.textareaSetValue(@ptrCast(node), new_value); try parser.textareaSetValue(@ptrCast(node), new_value);
}, },
else => {}, else => {},
@@ -734,7 +746,6 @@ pub const Page = struct {
} else { } else {
action = try URL.concatQueryString(transfer_arena, action, buf.items); action = try URL.concatQueryString(transfer_arena, action, buf.items);
} }
try self.navigateFromWebAPI(action, opts); try self.navigateFromWebAPI(action, opts);
} }