CEF Linux SendKeyEvent Ctrl+A produces empty DOM key/code

1 week ago 10
ARTICLE AD BOX

I am using CEF on Linux (OSR/windowless) with an SDL2 input bridge.

I want to send a native Ctrl+A shortcut to a focused editor using
CefBrowserHost::SendKeyEvent (not a JavaScript selection workaround, which does work).


Current approach

I send 4 events in this order:

Ctrl down

A down

A up

Ctrl up

void App::SendCtrlA() { if (!client_ || !client_->GetBrowser() || !client_->GetBrowser()->GetHost()) return; CefRefPtr<CefBrowserHost> host = client_->GetBrowser()->GetHost(); CefKeyEvent ev; memset(&ev, 0, sizeof(ev)); ev.type = KEYEVENT_RAWKEYDOWN; ev.windows_key_code = 17; ev.native_key_code = 17; ev.modifiers = EVENTFLAG_CONTROL_DOWN; ev.focus_on_editable_field = true; host->SendKeyEvent(ev); memset(&ev, 0, sizeof(ev)); ev.type = KEYEVENT_RAWKEYDOWN; ev.windows_key_code = 65; ev.native_key_code = 65; ev.modifiers = EVENTFLAG_CONTROL_DOWN; ev.character = 1; ev.unmodified_character = 'a'; ev.focus_on_editable_field = true; host->SendKeyEvent(ev); memset(&ev, 0, sizeof(ev)); ev.type = KEYEVENT_KEYUP; ev.windows_key_code = 65; ev.native_key_code = 65; ev.modifiers = EVENTFLAG_CONTROL_DOWN; ev.focus_on_editable_field = true; host->SendKeyEvent(ev); memset(&ev, 0, sizeof(ev)); ev.type = KEYEVENT_KEYUP; ev.windows_key_code = 17; ev.native_key_code = 17; ev.focus_on_editable_field = true; host->SendKeyEvent(ev); }

I also log what I send, and the events are definitely passed to SendKeyEvent().


JS logger in the page

document.addEventListener('keydown', function(e){ console.log( '[GSNDBG] kd' + ' key=' + JSON.stringify(e.key) + ' code=' + JSON.stringify(e.code) + ' ctrl=' + e.ctrlKey + ' shift=' + e.shiftKey + ' alt=' + e.altKey + ' meta=' + e.metaKey + ' keyCode=' + e.keyCode + ' which=' + e.which + ' target=' + (e.target && e.target.tagName) ); }, true);

Observed result

[GSNDBG] kd key="\u0000" code="" ctrl=false shift=false alt=false meta=false keyCode=0 which=0 target=DIV

Problem

The event reaches the page

But the DOM KeyboardEvent is effectively empty

ctrlKey is false

Ctrl+A does not trigger select-all


Questions

On Linux, what is the correct way to populate CefKeyEvent for a shortcut like Ctrl+A?

Specifically, what should native_key_code and event.type be?

Is there a standard or recommended way to translate SDL2 key data into valid CEF / Chromium shortcut events?

Read Entire Article