[fix] restore Windows remote keyboard shortcuts and input recovery

This commit is contained in:
dijunkun
2026-10-09 03:43:14 +08:00
parent 3cfe7cbb80
commit 06e23007ed
10 changed files with 626 additions and 312 deletions
@@ -0,0 +1,75 @@
/*
* @Author: DI JUNKUN
* @Date: 2026-10-09
* Copyright (c) 2026 by DI JUNKUN, All Rights Reserved.
*/
#ifndef _CAPTURED_KEYBOARD_QUEUE_H_
#define _CAPTURED_KEYBOARD_QUEUE_H_
#include <array>
#include <cstddef>
#include <mutex>
#include <vector>
#include "keyboard_state.h"
namespace crossdesk {
class CapturedKeyboardQueue {
public:
struct Batch {
std::vector<KeyboardInput> events;
bool resync = false;
PressedKeys pressed;
};
void Push(const KeyboardInput& input) {
std::lock_guard lock(mutex_);
if (input.is_down)
pressed_[input.key_code] =
{input.key_code, input.scan_code, input.extended};
else
pressed_.erase(input.key_code);
if (resync_) return;
if (count_ == kCapacity) {
// The event history is incomplete. Retain the authoritative state,
// including releases, rather than dropping arbitrary key edges.
count_ = 0;
resync_ = true;
return;
}
events_[count_++] = input;
}
Batch Drain() {
std::lock_guard lock(mutex_);
Batch batch;
batch.resync = resync_;
if (resync_) batch.pressed = pressed_;
else batch.events.assign(events_.begin(), events_.begin() + count_);
count_ = 0;
resync_ = false;
return batch;
}
void Clear() {
std::lock_guard lock(mutex_);
count_ = 0;
resync_ = false;
pressed_.clear();
}
private:
static constexpr size_t kCapacity = 512;
std::mutex mutex_;
std::array<KeyboardInput, kCapacity> events_{};
size_t count_ = 0;
bool resync_ = false;
PressedKeys pressed_;
};
} // namespace crossdesk
#endif