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<"ClipboardMode">(
24 di::enumerator<"System", System>, di::enumerator<"SystemWriteLocalRead", SystemWriteLocalRead>,
25 di::enumerator<"SystemWriteNoRead", SystemWriteNoRead>, di::enumerator<"Local", Local>,
26 di::enumerator<"LocalWriteNoRead", LocalWriteNoRead>, di::enumerator<"Disabled", Disabled>);
27}
28
33class Clipboard {
34public:
35 constexpr static auto request_timeout = di::chrono::Seconds(1);
36
37 struct Identifier {
38 u64 session_id { 0 };
39 u64 tab_id { 0 };
40 u64 pane_id { 0 };
41
42 auto operator==(Identifier const&) const -> bool = default;
43 auto operator<=>(Identifier const&) const = default;
44 };
45
51
52 explicit Clipboard(ClipboardMode mode, Feature features);
53
54 [[nodiscard]] auto set_clipboard(terminal::SelectionType type, di::Vector<byte> data,
55 dius::SteadyClock::TimePoint reception = dius::SteadyClock::now()) -> bool;
56 [[nodiscard]] auto request_clipboard(terminal::SelectionType type, Identifier const& identifier,
57 dius::SteadyClock::TimePoint reception = dius::SteadyClock::now()) -> bool;
58 void got_clipboard_response(terminal::SelectionType type, di::Vector<byte> data,
59 dius::SteadyClock::TimePoint reception = dius::SteadyClock::now());
60 [[nodiscard]] auto get_replies(dius::SteadyClock::TimePoint reception = dius::SteadyClock::now())
61 -> di::Vector<Reply>;
62
63private:
64 void expire(dius::SteadyClock::TimePoint reception);
65
66 enum class ClipboardReadAction {
67 Ignore,
68 ReadLocal,
69 ReadSystem,
70 RequestSystemReadLocal,
71 };
72
73 enum class ClipboardWriteAction {
74 Ignore,
75 WriteLocal,
76 WriteSystem,
77 };
78
79 auto action_for_clipboard_read(terminal::SelectionType type) -> ClipboardReadAction;
80 auto action_for_clipboard_write(terminal::SelectionType type) -> ClipboardWriteAction;
81
82 struct Request {
83 dius::SteadyClock::TimePoint reception;
84 Identifier identifier;
85
86 auto operator==(Request const&) const -> bool = default;
87 auto operator<=>(Request const&) const = default;
88 };
89
90 struct SelectionState {
91 di::Vector<byte> data;
92 di::PriorityQueue<Request, di::Vector<Request>, di::CompareBackwards> requests;
93 bool system_working { false };
94 };
95
97 Feature m_features { Feature::None };
98 di::Array<SelectionState, usize(terminal::SelectionType::Max)> m_state;
99 di::Vector<Reply> m_replies;
100};
101}
Clipboard(ClipboardMode mode, Feature features)
Definition clipboard.cpp:8
static constexpr auto request_timeout
Definition clipboard.h:35
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:8
@ Clipboard
Supports setting the clipboard (OSC 52).
Definition features.h:21
@ None
Definition features.h:9
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:37
auto operator==(Identifier const &) const -> bool=default
u64 pane_id
Definition clipboard.h:40
u64 session_id
Definition clipboard.h:38
u64 tab_id
Definition clipboard.h:39
auto operator<=>(Identifier const &) const =default
Definition clipboard.h:46
Identifier identifier
Definition clipboard.h:47
di::Vector< byte > data
Definition clipboard.h:49
terminal::SelectionType type
Definition clipboard.h:48