#### Describe your PR, what does it fix/add?
Fix lag spikes when pressing more than 6 keys at the same time.
#### Is there anything you want to mention? (unchecked code, possible bugs, found problems, breaking compatibility, etc.)
Debugging process:
<details>
This is triggered by typing some applications, like CopyQ or XWayland.
Typing in Firefox doesn't lead to lag, however it itself does lag
handling these events.
Profiling CopyQ shows that paths leading to
`QtWaylandClient::QWaylandInputDevice::Keyboard::keyboard` take over
80% of processing time of an otherwise idle program.
Looking at output of 'wev' even when it's not focused shows same events
received over and over again.
```
[14: wl_keyboard] repeat_info: rate: 25 keys/sec; delay: 300 ms
[14: wl_keyboard] keymap: format: 1 (xkb v1), size: 64754
```
Looking at what passes through CInputManager::onKeyboardKey() ->
CSeatManager::setKeyboard() shows Hyprland 'switching' between endpoints
of the same keyboard, one of them being named like the other but with
'-1' suffix.
</details>
Tested changing layouts in Fcitx5 and with following config.
```
input:kb_layout = us,cz
input:kb_variant = ,qwerty
input:kb_options = grp:alt_shift_toggle
```
Also tested changing 'input:repeat_delay' while running.
Curiously, now these events appear in the output of 'wev' only once.
Changing layouts still seems to work fine though.
#### Is it ready for merging, or does it need work?
Ready for merging.
* deco: reduce local temporars and function calls
profiling shows this is a high used function, reduce the amount of
function calls and local temporar copies and also check if we even need
to add extents at all in the loop.
* popup: optimize bfhelper in popups
pass nodes as const reference and reserve the size of the children node
vector help reduce the reallocations.
* procotol: make compositor bfhelper use const ref
use const ref for nodes and reserve second nodes vector size to reduce
amount of reallocation needed.
to safely use wl_container_of with a class the class has to be no
virtual functions, no inheritance, and uniform access control (e.g all
public)
work around this by putting this into a destroywrapper struct.
ensure the correct type is passed to std::clamp and std::max int64_t is
different on 64bit compared to 32bit, also in presentationtime
tv_sec is __time_t and on 32bit its a 32bit type so right shift count >= width
of type. so only bit shift on 64bit. and avoid potential nullptr deref
in the for loops, check for .end() before *it <= endID.
* Revert "sessionLock: fix the check for locking a locked session (#6843)"
This reverts commit 9ff83f4aa9.
* sessionLock: remove early check for session beeing locked
It is checked in the `onNewSessionLock` handler, which also respects the
`misc:allow_session_lock_restore` option.