mirror of
https://github.com/kunkundi/crossdesk.git
synced 2026-10-18 01:46:47 +08:00
[fix] restore Windows remote keyboard shortcuts and input recovery
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user