Под иксами все просто:
int result;
auto display = XkbOpenDisplay( getenv( "DISPLAY" ), NULL, NULL, NULL, NULL, &result );
auto keyboard = XkbAllocKeyboard();
XkbGetNames( display, XkbGroupNamesMask, keyboard );
XkbStateRec state;
XkbGetState( display, XkbUseCoreKbd, &state );
keyboard->names->groups[state.group];
А как под Wayland? Можно ли под ним вообще как-то универсально получать информацию о раскладке, не зависимо от DM?