ttx 0.1.0
Loading...
Searching...
No Matches
clipboard.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/container/queue/priority_queue.h"
4#include "di/function/compare_backwards.h"
5#include "di/reflect/prelude.h"
6#include "dius/steady_clock.h"
7#include "ttx/features.h"
9
10namespace ttx {
20
21constexpr auto tag_invoke(di::Tag<di::reflect>, di::InPlaceType<ClipboardMode>) {
22 using enum ClipboardMode;
23 return di::make_enumerators<
24 "ClipboardMode",
25 "This mode controls how ttx interacts with applications which request to read or write to the clipboard">(
26 di::enumerator<"system", System, "Attempt to read and write the system clipboard">,
27 di::enumerator<"system-write-local-read", SystemWriteLocalRead,
28 "Write to system clipboard but read from internal clipboard">,
29 di::enumerator<"system-write-no-read", SystemWriteNoRead,
30 "Write to system clipboard but disallow reading clipboard">,
31 di::enumerator<"local", Local, "Read and write to internal clipboard">,
32 di::enumerator<"local-write-no-read", LocalWriteNoRead,
33 "Write to internal clipboard but disallow reading clipboard">,
34 di::enumerator<"disabled", Disabled, "Disallow read/writing the clipboard">);
35}
36
41class Clipboard {
42public:
43 constexpr static auto request_timeout = di::chrono::Seconds(1);
44
45 struct Identifier {
46 u64 session_id { 0 };
47 u64 tab_id { 0 };
48 u64 pane_id { 0 };
49
50 auto operator==(Identifier const&) const -> bool = default;
51 auto operator<=>(Identifier const&) const = default;
52 };
53
59
60 explicit Clipboard(ClipboardMode mode, Feature features);
61
62 [[nodiscard]] auto set_clipboard(terminal::SelectionType type, di::Vector<byte> data,
63 dius::SteadyClock::TimePoint reception = dius::SteadyClock::now()) -> bool;
64 [[nodiscard]] auto request_clipboard(terminal::SelectionType type, Identifier const& identifier,
65 dius::SteadyClock::TimePoint reception = dius::SteadyClock::now()) -> bool;
66 void got_clipboard_response(terminal::SelectionType type, di::Vector<byte> data,
67 dius::SteadyClock::TimePoint reception = dius::SteadyClock::now());
68 [[nodiscard]] auto get_replies(dius::SteadyClock::TimePoint reception = dius::SteadyClock::now())
69 -> di::Vector<Reply>;
70
71 [[nodiscard]] auto mode() const { return m_mode; }
72 void set_mode(ClipboardMode mode) { m_mode = mode; }
73
74private:
75 void expire(dius::SteadyClock::TimePoint reception);
76
77 enum class ClipboardReadAction {
78 Ignore,
79 ReadLocal,
80 ReadSystem,
81 RequestSystemReadLocal,
82 };
83
84 enum class ClipboardWriteAction {
85 Ignore,
86 WriteLocal,
87 WriteSystem,
88 };
89
90 auto action_for_clipboard_read(terminal::SelectionType type) -> ClipboardReadAction;
91 auto action_for_clipboard_write(terminal::SelectionType type) -> ClipboardWriteAction;
92
93 struct Request {
94 dius::SteadyClock::TimePoint reception;
95 Identifier identifier;
96
97 auto operator==(Request const&) const -> bool = default;
98 auto operator<=>(Request const&) const = default;
99 };
100
101 struct SelectionState {
102 di::Vector<byte> data;
103 di::PriorityQueue<Request, di::Vector<Request>, di::CompareBackwards> requests;
104 bool system_working { true };
105 };
106
108 Feature m_features { Feature::None };
109 di::Array<SelectionState, usize(terminal::SelectionType::Max)> m_state;
110 di::Vector<Reply> m_replies;
111};
112}
Clipboard(ClipboardMode mode, Feature features)
Definition clipboard.cpp:8
auto mode() const
Definition clipboard.h:71
static constexpr auto request_timeout
Definition clipboard.h:43
void set_mode(ClipboardMode mode)
Definition clipboard.h:72
void got_clipboard_response(terminal::SelectionType type, di::Vector< byte > data, dius::SteadyClock::TimePoint reception=dius::SteadyClock::now())
Definition clipboard.cpp:72
auto get_replies(dius::SteadyClock::TimePoint reception=dius::SteadyClock::now()) -> di::Vector< Reply >
Definition clipboard.cpp:100
auto request_clipboard(terminal::SelectionType type, Identifier const &identifier, dius::SteadyClock::TimePoint reception=dius::SteadyClock::now()) -> bool
Definition clipboard.cpp:33
auto set_clipboard(terminal::SelectionType type, di::Vector< byte > data, dius::SteadyClock::TimePoint reception=dius::SteadyClock::now()) -> bool
Definition clipboard.cpp:10
SelectionType
Represents the type of selection being modifed by an OSC 52 sequence.
Definition osc_52.h:8
@ Max
Definition osc_52.h:20
@ Selection
Primary selection clipboard.
Definition osc_52.h:10
Definition clipboard.h:10
constexpr auto tag_invoke(di::Tag< di::reflect >, di::InPlaceType< ClipboardMode >)
Definition clipboard.h:21
Feature
Definition features.h:9
@ None
Definition features.h:10
ClipboardMode
Clipboard modes.
Definition clipboard.h:12
@ Local
Read and write to internal clipboard.
Definition clipboard.h:16
@ SystemWriteLocalRead
Write to system clipboard but read from internal clipboard.
Definition clipboard.h:14
@ System
Attempt to read and write the system clipboard.
Definition clipboard.h:13
@ Disabled
Disallow read/writing the clipboard.
Definition clipboard.h:18
@ SystemWriteNoRead
Write to system clipboard but disallow reading clipboard.
Definition clipboard.h:15
@ LocalWriteNoRead
Write to internal clipboard but disallow reading clipboard.
Definition clipboard.h:17
Definition clipboard.h:45
auto operator==(Identifier const &) const -> bool=default
u64 pane_id
Definition clipboard.h:48
u64 session_id
Definition clipboard.h:46
u64 tab_id
Definition clipboard.h:47
auto operator<=>(Identifier const &) const =default
Definition clipboard.h:54
Identifier identifier
Definition clipboard.h:55
di::Vector< byte > data
Definition clipboard.h:57
terminal::SelectionType type
Definition clipboard.h:56