mirror of
https://github.com/microsoft/PowerToys.git
synced 2025-01-13 00:01:45 +08:00
51 lines
1.0 KiB
C++
51 lines
1.0 KiB
C++
#pragma once
|
|
#include <deque>
|
|
#include <thread>
|
|
#include <mutex>
|
|
#include <condition_variable>
|
|
#include <chrono>
|
|
#include "shortcut_guide.h"
|
|
|
|
struct KeyEvent
|
|
{
|
|
bool key_down;
|
|
unsigned vk_code;
|
|
};
|
|
|
|
class TargetState
|
|
{
|
|
public:
|
|
TargetState(int ms_delay);
|
|
bool signal_event(unsigned vk_code, bool key_down);
|
|
void was_hidden();
|
|
void exit();
|
|
void set_delay(int ms_delay);
|
|
|
|
void toggle_force_shown();
|
|
bool active() const;
|
|
|
|
private:
|
|
KeyEvent next();
|
|
void handle_hidden();
|
|
void handle_timeout();
|
|
void handle_shown(const bool forced);
|
|
void thread_proc();
|
|
std::recursive_mutex mutex;
|
|
std::condition_variable_any cv;
|
|
std::chrono::system_clock::time_point winkey_timestamp, signal_timestamp;
|
|
std::chrono::milliseconds delay;
|
|
std::deque<KeyEvent> events;
|
|
enum State
|
|
{
|
|
Hidden,
|
|
Timeout,
|
|
Shown,
|
|
ForceShown,
|
|
Exiting
|
|
};
|
|
std::atomic<State> state = Hidden;
|
|
|
|
bool nonwin_key_was_pressed_during_shown = false;
|
|
std::thread thread;
|
|
};
|