mirror of
https://github.com/ArthurSonzogni/FTXUI.git
synced 2025-12-16 01:48:56 +08:00
Compare commits
2 Commits
HarryPehko
...
ce9964131d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ce9964131d | ||
|
|
2715503516 |
@@ -144,6 +144,7 @@ add_library(component
|
|||||||
src/ftxui/component/resizable_split.cpp
|
src/ftxui/component/resizable_split.cpp
|
||||||
src/ftxui/component/screen_interactive.cpp
|
src/ftxui/component/screen_interactive.cpp
|
||||||
src/ftxui/component/slider.cpp
|
src/ftxui/component/slider.cpp
|
||||||
|
src/ftxui/component/terminal_id.cpp
|
||||||
src/ftxui/component/terminal_input_parser.cpp
|
src/ftxui/component/terminal_input_parser.cpp
|
||||||
src/ftxui/component/terminal_input_parser.hpp
|
src/ftxui/component/terminal_input_parser.hpp
|
||||||
src/ftxui/component/util.cpp
|
src/ftxui/component/util.cpp
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ example(slider_direction)
|
|||||||
example(slider_rgb)
|
example(slider_rgb)
|
||||||
example(tab_horizontal)
|
example(tab_horizontal)
|
||||||
example(tab_vertical)
|
example(tab_vertical)
|
||||||
|
example(terminal_id)
|
||||||
example(textarea)
|
example(textarea)
|
||||||
example(toggle)
|
example(toggle)
|
||||||
example(window)
|
example(window)
|
||||||
|
|||||||
33
examples/component/terminal_id.cpp
Normal file
33
examples/component/terminal_id.cpp
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
// Copyright 2025 Arthur Sonzogni. All rights reserved.
|
||||||
|
// Use of this source code is governed by the MIT license that can be found in
|
||||||
|
// the LICENSE file.
|
||||||
|
|
||||||
|
#include "ftxui/component/component.hpp" // for Renderer
|
||||||
|
#include "ftxui/component/screen_interactive.hpp" // for ScreenInteractive
|
||||||
|
#include "ftxui/dom/elements.hpp" // for text, hbox, separator, Element, operator|, vbox, border
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
using namespace ftxui;
|
||||||
|
|
||||||
|
std::string terminal_id = "UNKNOWN";
|
||||||
|
|
||||||
|
auto screen =
|
||||||
|
ScreenInteractive::TerminalOutput();
|
||||||
|
|
||||||
|
screen.OnTerminalIDUpdate([&terminal_id] (
|
||||||
|
TerminalID const& terminal_id_update)
|
||||||
|
{
|
||||||
|
std::stringstream stream;
|
||||||
|
stream << terminal_id_update;
|
||||||
|
terminal_id = stream.str();
|
||||||
|
});
|
||||||
|
|
||||||
|
auto renderer = Renderer([&]
|
||||||
|
{
|
||||||
|
return vbox({
|
||||||
|
text("Terminal id " + terminal_id),
|
||||||
|
}) | border;
|
||||||
|
});
|
||||||
|
|
||||||
|
screen.Loop(renderer);
|
||||||
|
}
|
||||||
@@ -4,8 +4,9 @@
|
|||||||
#ifndef FTXUI_COMPONENT_EVENT_HPP
|
#ifndef FTXUI_COMPONENT_EVENT_HPP
|
||||||
#define FTXUI_COMPONENT_EVENT_HPP
|
#define FTXUI_COMPONENT_EVENT_HPP
|
||||||
|
|
||||||
#include <ftxui/component/mouse.hpp> // for Mouse
|
#include <ftxui/component/mouse.hpp> // for Mouse
|
||||||
#include <string> // for string, operator==
|
#include <ftxui/component/terminal_id.hpp> // for TerminalID
|
||||||
|
#include <string> // for string, operator==
|
||||||
|
|
||||||
namespace ftxui {
|
namespace ftxui {
|
||||||
|
|
||||||
@@ -35,6 +36,7 @@ struct Event {
|
|||||||
static Event Mouse(std::string, Mouse mouse);
|
static Event Mouse(std::string, Mouse mouse);
|
||||||
static Event CursorPosition(std::string, int x, int y); // Internal
|
static Event CursorPosition(std::string, int x, int y); // Internal
|
||||||
static Event CursorShape(std::string, int shape); // Internal
|
static Event CursorShape(std::string, int shape); // Internal
|
||||||
|
static Event TerminalID(std::string input, enum TerminalID terminal_id); // Internal
|
||||||
|
|
||||||
// --- Arrow ---
|
// --- Arrow ---
|
||||||
static const Event ArrowLeft;
|
static const Event ArrowLeft;
|
||||||
@@ -117,6 +119,9 @@ struct Event {
|
|||||||
bool is_cursor_shape() const { return type_ == Type::CursorShape; }
|
bool is_cursor_shape() const { return type_ == Type::CursorShape; }
|
||||||
int cursor_shape() const { return data_.cursor_shape; }
|
int cursor_shape() const { return data_.cursor_shape; }
|
||||||
|
|
||||||
|
bool is_terminal_id() const { return type_ == Type::TerminalID; }
|
||||||
|
enum TerminalID terminal_id() const { return data_.terminal_id; }
|
||||||
|
|
||||||
// Debug
|
// Debug
|
||||||
std::string DebugString() const;
|
std::string DebugString() const;
|
||||||
|
|
||||||
@@ -132,6 +137,7 @@ struct Event {
|
|||||||
Mouse,
|
Mouse,
|
||||||
CursorPosition,
|
CursorPosition,
|
||||||
CursorShape,
|
CursorShape,
|
||||||
|
TerminalID
|
||||||
};
|
};
|
||||||
Type type_ = Type::Unknown;
|
Type type_ = Type::Unknown;
|
||||||
|
|
||||||
@@ -144,6 +150,7 @@ struct Event {
|
|||||||
struct Mouse mouse;
|
struct Mouse mouse;
|
||||||
struct Cursor cursor;
|
struct Cursor cursor;
|
||||||
int cursor_shape;
|
int cursor_shape;
|
||||||
|
enum TerminalID terminal_id;
|
||||||
} data_ = {};
|
} data_ = {};
|
||||||
|
|
||||||
std::string input_;
|
std::string input_;
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
#include <memory> // for shared_ptr
|
#include <memory> // for shared_ptr
|
||||||
#include <string> // for string
|
#include <string> // for string
|
||||||
#include <thread> // for thread
|
#include <thread> // for thread
|
||||||
|
#include <list>
|
||||||
|
|
||||||
#include "ftxui/component/animation.hpp" // for TimePoint
|
#include "ftxui/component/animation.hpp" // for TimePoint
|
||||||
#include "ftxui/component/captured_mouse.hpp" // for CapturedMouse
|
#include "ftxui/component/captured_mouse.hpp" // for CapturedMouse
|
||||||
@@ -24,6 +25,8 @@ class Loop;
|
|||||||
struct Event;
|
struct Event;
|
||||||
|
|
||||||
using Component = std::shared_ptr<ComponentBase>;
|
using Component = std::shared_ptr<ComponentBase>;
|
||||||
|
using TerminalIDUpdateCallback = std::function<void (const TerminalID &)>;
|
||||||
|
|
||||||
class ScreenInteractivePrivate;
|
class ScreenInteractivePrivate;
|
||||||
|
|
||||||
/// @brief ScreenInteractive is a `Screen` that can handle events, run a main
|
/// @brief ScreenInteractive is a `Screen` that can handle events, run a main
|
||||||
@@ -72,6 +75,10 @@ class ScreenInteractive : public Screen {
|
|||||||
void ForceHandleCtrlC(bool force);
|
void ForceHandleCtrlC(bool force);
|
||||||
void ForceHandleCtrlZ(bool force);
|
void ForceHandleCtrlZ(bool force);
|
||||||
|
|
||||||
|
TerminalID TerminalId() const;
|
||||||
|
|
||||||
|
void OnTerminalIDUpdate(const TerminalIDUpdateCallback& callback);
|
||||||
|
|
||||||
// Selection API.
|
// Selection API.
|
||||||
std::string GetSelection();
|
std::string GetSelection();
|
||||||
void SelectionChange(std::function<void()> callback);
|
void SelectionChange(std::function<void()> callback);
|
||||||
@@ -156,6 +163,11 @@ class ScreenInteractive : public Screen {
|
|||||||
std::unique_ptr<Selection> selection_;
|
std::unique_ptr<Selection> selection_;
|
||||||
std::function<void()> selection_on_change_;
|
std::function<void()> selection_on_change_;
|
||||||
|
|
||||||
|
TerminalID m_terminal_id = TerminalID::Unknown;
|
||||||
|
|
||||||
|
using TerminalIDUpdateCallbackContainer = std::list<TerminalIDUpdateCallback>;
|
||||||
|
TerminalIDUpdateCallbackContainer terminal_id_callback_;
|
||||||
|
|
||||||
friend class Loop;
|
friend class Loop;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|||||||
35
include/ftxui/component/terminal_id.hpp
Normal file
35
include/ftxui/component/terminal_id.hpp
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
// Copyright 2025 Arthur Sonzogni. All rights reserved.
|
||||||
|
// Use of this source code is governed by the MIT license that can be found in
|
||||||
|
// the LICENSE file.
|
||||||
|
|
||||||
|
#ifndef FTXUI_COMPONENT_TERMINAL_ID_HPP
|
||||||
|
#define FTXUI_COMPONENT_TERMINAL_ID_HPP
|
||||||
|
|
||||||
|
#include <ostream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace ftxui {
|
||||||
|
|
||||||
|
/// @brief The TerminalID enum class represents different types of terminal
|
||||||
|
/// emulators that FTXUI can detect. It is used to identify the terminal
|
||||||
|
/// emulator in use, which can affect how FTXUI renders its output and handles
|
||||||
|
/// input events.
|
||||||
|
/// @ingroup component
|
||||||
|
enum class TerminalID {
|
||||||
|
Unknown,
|
||||||
|
// --
|
||||||
|
|
||||||
|
Konsole,
|
||||||
|
LinuxVC,
|
||||||
|
Urxvt,
|
||||||
|
Vte,
|
||||||
|
Xterm,
|
||||||
|
};
|
||||||
|
|
||||||
|
std::ostream& operator<<(
|
||||||
|
std::ostream& os,
|
||||||
|
TerminalID terminal_id);
|
||||||
|
|
||||||
|
} // namespace ftxui
|
||||||
|
|
||||||
|
#endif /* end of include guard: FTXUI_COMPONENT_TERMINAL_ID_HPP */
|
||||||
@@ -87,6 +87,16 @@ Event Event::CursorPosition(std::string input, int x, int y) {
|
|||||||
return event;
|
return event;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @internal
|
||||||
|
// static
|
||||||
|
Event Event::TerminalID(std::string input, enum TerminalID terminal_id) {
|
||||||
|
Event event;
|
||||||
|
event.input_ = std::move(input);
|
||||||
|
event.type_ = Type::TerminalID;
|
||||||
|
event.data_.terminal_id = terminal_id;
|
||||||
|
return event;
|
||||||
|
}
|
||||||
|
|
||||||
/// @brief Return a string representation of the event.
|
/// @brief Return a string representation of the event.
|
||||||
std::string Event::DebugString() const {
|
std::string Event::DebugString() const {
|
||||||
static std::map<Event, const char*> event_to_string = {
|
static std::map<Event, const char*> event_to_string = {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
// Copyright 2022 Arthur Sonzogni. All rights reserved.
|
// Copyright 2022 Arthur Sonzogni. All rights reserved.
|
||||||
// Use of this source code is governed by the MIT license that can be found in
|
// Use of this source code is governed by the MIT license that can be found in
|
||||||
// the LICENSE file.
|
// the LICENSE file.
|
||||||
|
#include <iostream>
|
||||||
#include "ftxui/component/loop.hpp"
|
#include "ftxui/component/loop.hpp"
|
||||||
|
|
||||||
#include <utility> // for move
|
#include <utility> // for move
|
||||||
|
|||||||
@@ -321,6 +321,8 @@ std::string DeviceStatusReport(DSRMode ps) {
|
|||||||
return CSI + std::to_string(int(ps)) + "n";
|
return CSI + std::to_string(int(ps)) + "n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const std::string TerminalIdReport = "\x1b[0c";
|
||||||
|
|
||||||
class CapturedMouseImpl : public CapturedMouseInterface {
|
class CapturedMouseImpl : public CapturedMouseInterface {
|
||||||
public:
|
public:
|
||||||
explicit CapturedMouseImpl(std::function<void(void)> callback)
|
explicit CapturedMouseImpl(std::function<void(void)> callback)
|
||||||
@@ -381,10 +383,10 @@ ScreenInteractive ScreenInteractive::Fullscreen() {
|
|||||||
ScreenInteractive ScreenInteractive::FullscreenPrimaryScreen() {
|
ScreenInteractive ScreenInteractive::FullscreenPrimaryScreen() {
|
||||||
auto terminal = Terminal::Size();
|
auto terminal = Terminal::Size();
|
||||||
return {
|
return {
|
||||||
Dimension::Fullscreen,
|
Dimension::Fullscreen,
|
||||||
terminal.dimx,
|
terminal.dimx,
|
||||||
terminal.dimy,
|
terminal.dimy,
|
||||||
/*use_alternative_screen=*/false,
|
/*use_alternative_screen=*/false,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -409,7 +411,7 @@ ScreenInteractive ScreenInteractive::TerminalOutput() {
|
|||||||
return {
|
return {
|
||||||
Dimension::TerminalOutput,
|
Dimension::TerminalOutput,
|
||||||
terminal.dimx,
|
terminal.dimx,
|
||||||
terminal.dimy, // Best guess.
|
terminal.dimy, // Best guess.
|
||||||
/*use_alternative_screen=*/false,
|
/*use_alternative_screen=*/false,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -421,8 +423,8 @@ ScreenInteractive ScreenInteractive::FitComponent() {
|
|||||||
auto terminal = Terminal::Size();
|
auto terminal = Terminal::Size();
|
||||||
return {
|
return {
|
||||||
Dimension::FitComponent,
|
Dimension::FitComponent,
|
||||||
terminal.dimx, // Best guess.
|
terminal.dimx, // Best guess.
|
||||||
terminal.dimy, // Best guess.
|
terminal.dimy, // Best guess.
|
||||||
false,
|
false,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -724,6 +726,9 @@ void ScreenInteractive::Install() {
|
|||||||
enable({DECMode::kMouseSgrExtMode});
|
enable({DECMode::kMouseSgrExtMode});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Report the Terminal ID.
|
||||||
|
std::cout << TerminalIdReport;
|
||||||
|
|
||||||
// After installing the new configuration, flush it to the terminal to
|
// After installing the new configuration, flush it to the terminal to
|
||||||
// ensure it is fully applied:
|
// ensure it is fully applied:
|
||||||
Flush();
|
Flush();
|
||||||
@@ -794,6 +799,17 @@ void ScreenInteractive::HandleTask(Component component, Task& task) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (arg.is_terminal_id()) {
|
||||||
|
m_terminal_id = arg.terminal_id();
|
||||||
|
|
||||||
|
for(auto & callback : terminal_id_callback_) {
|
||||||
|
if (callback) {
|
||||||
|
callback(m_terminal_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (arg.is_mouse()) {
|
if (arg.is_mouse()) {
|
||||||
arg.mouse().x -= cursor_x_;
|
arg.mouse().x -= cursor_x_;
|
||||||
arg.mouse().y -= cursor_y_;
|
arg.mouse().y -= cursor_y_;
|
||||||
@@ -1084,4 +1100,13 @@ bool ScreenInteractive::SelectionData::operator!=(
|
|||||||
return !(*this == other);
|
return !(*this == other);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TerminalID ScreenInteractive::TerminalId() const {
|
||||||
|
return m_terminal_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenInteractive::OnTerminalIDUpdate(
|
||||||
|
const TerminalIDUpdateCallback& callback) {
|
||||||
|
terminal_id_callback_.push_back(callback);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace ftxui.
|
} // namespace ftxui.
|
||||||
|
|||||||
@@ -207,6 +207,7 @@ TEST(ScreenInteractive, FixedSizeInitialFrame) {
|
|||||||
"\x1B[?1003h" // Enable mouse motion tracking.
|
"\x1B[?1003h" // Enable mouse motion tracking.
|
||||||
"\x1B[?1015h" // Enable mouse wheel tracking.
|
"\x1B[?1015h" // Enable mouse wheel tracking.
|
||||||
"\x1B[?1006h" // Enable SGR mouse tracking.
|
"\x1B[?1006h" // Enable SGR mouse tracking.
|
||||||
|
"\x1B[0c" // Query terminal ID.
|
||||||
"\0" // Flush stdout.
|
"\0" // Flush stdout.
|
||||||
|
|
||||||
// Reset the screen.
|
// Reset the screen.
|
||||||
|
|||||||
41
src/ftxui/component/terminal_id.cpp
Normal file
41
src/ftxui/component/terminal_id.cpp
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
// Copyright 2025 Arthur Sonzogni. All rights reserved.
|
||||||
|
// Use of this source code is governed by the MIT license that can be found in
|
||||||
|
// the LICENSE file.
|
||||||
|
|
||||||
|
#include "ftxui/component/terminal_id.hpp"
|
||||||
|
|
||||||
|
namespace ftxui
|
||||||
|
{
|
||||||
|
|
||||||
|
std::ostream& operator<<(std::ostream& os, TerminalID terminal_id) {
|
||||||
|
switch (terminal_id) {
|
||||||
|
case TerminalID::Unknown: {
|
||||||
|
os << "Unknown";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TerminalID::Urxvt: {
|
||||||
|
os << "Urxvt";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TerminalID::LinuxVC: {
|
||||||
|
os << "LinuxVC";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TerminalID::Konsole: {
|
||||||
|
os << "Konsole";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TerminalID::Vte: {
|
||||||
|
os << "Vte";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TerminalID::Xterm: {
|
||||||
|
os << "Xterm";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace ftxui
|
||||||
@@ -161,6 +161,11 @@ void TerminalInputParser::Send(TerminalInputParser::Output output) {
|
|||||||
out_->Send(Event::CursorShape(std::move(pending_), output.cursor_shape));
|
out_->Send(Event::CursorShape(std::move(pending_), output.cursor_shape));
|
||||||
pending_.clear();
|
pending_.clear();
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
case TERMINAL_ID:
|
||||||
|
out_->Send(Event::TerminalID(std::move(pending_), output.terminal_id));
|
||||||
|
pending_.clear();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
// NOT_REACHED().
|
// NOT_REACHED().
|
||||||
}
|
}
|
||||||
@@ -374,6 +379,8 @@ TerminalInputParser::Output TerminalInputParser::ParseCSI() {
|
|||||||
return ParseMouse(altered, false, std::move(arguments));
|
return ParseMouse(altered, false, std::move(arguments));
|
||||||
case 'R':
|
case 'R':
|
||||||
return ParseCursorPosition(std::move(arguments));
|
return ParseCursorPosition(std::move(arguments));
|
||||||
|
case 'c':
|
||||||
|
return ParseTerminalID(std::move(arguments));
|
||||||
default:
|
default:
|
||||||
return SPECIAL;
|
return SPECIAL;
|
||||||
}
|
}
|
||||||
@@ -461,4 +468,22 @@ TerminalInputParser::Output TerminalInputParser::ParseCursorPosition(
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TerminalInputParser::Output TerminalInputParser::ParseTerminalID(
|
||||||
|
std::vector<int> arguments) {
|
||||||
|
if (arguments.empty()) {
|
||||||
|
return TerminalID::Unknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (arguments[0]) {
|
||||||
|
case 1:
|
||||||
|
return TerminalID::Xterm;
|
||||||
|
case 6:
|
||||||
|
return TerminalID::LinuxVC;
|
||||||
|
case 62:
|
||||||
|
return TerminalID::Konsole;
|
||||||
|
default:
|
||||||
|
return TerminalID::Unknown;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace ftxui
|
} // namespace ftxui
|
||||||
|
|||||||
@@ -7,9 +7,10 @@
|
|||||||
#include <string> // for string
|
#include <string> // for string
|
||||||
#include <vector> // for vector
|
#include <vector> // for vector
|
||||||
|
|
||||||
#include "ftxui/component/mouse.hpp" // for Mouse
|
#include "ftxui/component/mouse.hpp" // for Mouse
|
||||||
#include "ftxui/component/receiver.hpp" // for Sender
|
#include "ftxui/component/terminal_id.hpp" // for TerminalId
|
||||||
#include "ftxui/component/task.hpp" // for Task
|
#include "ftxui/component/receiver.hpp" // for Sender
|
||||||
|
#include "ftxui/component/task.hpp" // for Task
|
||||||
|
|
||||||
namespace ftxui {
|
namespace ftxui {
|
||||||
struct Event;
|
struct Event;
|
||||||
@@ -33,6 +34,7 @@ class TerminalInputParser {
|
|||||||
CURSOR_POSITION,
|
CURSOR_POSITION,
|
||||||
CURSOR_SHAPE,
|
CURSOR_SHAPE,
|
||||||
SPECIAL,
|
SPECIAL,
|
||||||
|
TERMINAL_ID
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CursorPosition {
|
struct CursorPosition {
|
||||||
@@ -46,10 +48,14 @@ class TerminalInputParser {
|
|||||||
Mouse mouse;
|
Mouse mouse;
|
||||||
CursorPosition cursor{};
|
CursorPosition cursor{};
|
||||||
int cursor_shape;
|
int cursor_shape;
|
||||||
|
TerminalID terminal_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
Output(Type t) // NOLINT
|
Output(Type t) // NOLINT
|
||||||
: type(t) {}
|
: type(t) {}
|
||||||
|
|
||||||
|
Output(TerminalID terminal_id) // NOLINT
|
||||||
|
: type(TERMINAL_ID), terminal_id(terminal_id) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
void Send(Output output);
|
void Send(Output output);
|
||||||
@@ -61,6 +67,7 @@ class TerminalInputParser {
|
|||||||
Output ParseOSC();
|
Output ParseOSC();
|
||||||
Output ParseMouse(bool altered, bool pressed, std::vector<int> arguments);
|
Output ParseMouse(bool altered, bool pressed, std::vector<int> arguments);
|
||||||
Output ParseCursorPosition(std::vector<int> arguments);
|
Output ParseCursorPosition(std::vector<int> arguments);
|
||||||
|
Output ParseTerminalID(std::vector<int> arguments);
|
||||||
|
|
||||||
Sender<Task> out_;
|
Sender<Task> out_;
|
||||||
int position_ = -1;
|
int position_ = -1;
|
||||||
|
|||||||
@@ -510,5 +510,27 @@ TEST(Event, DeviceControlString) {
|
|||||||
EXPECT_FALSE(event_receiver->Receive(&received));
|
EXPECT_FALSE(event_receiver->Receive(&received));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(Event, TerminalID) {
|
||||||
|
// Test terminal id for KDE konsole
|
||||||
|
auto event_receiver = MakeReceiver<Task>();
|
||||||
|
{
|
||||||
|
auto parser = TerminalInputParser(event_receiver->MakeSender());
|
||||||
|
parser.Add('\x1B');
|
||||||
|
parser.Add('[');
|
||||||
|
parser.Add('?');
|
||||||
|
parser.Add('6');
|
||||||
|
parser.Add('2');
|
||||||
|
parser.Add(';');
|
||||||
|
parser.Add('2');
|
||||||
|
parser.Add('c');
|
||||||
|
}
|
||||||
|
|
||||||
|
Task received;
|
||||||
|
EXPECT_TRUE(event_receiver->Receive(&received));
|
||||||
|
EXPECT_TRUE(std::get<Event>(received).is_terminal_id());
|
||||||
|
EXPECT_EQ(TerminalID::Konsole, std::get<Event>(received).terminal_id());
|
||||||
|
EXPECT_FALSE(event_receiver->Receive(&received));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace ftxui
|
} // namespace ftxui
|
||||||
// NOLINTEND
|
// NOLINTEND
|
||||||
|
|||||||
Reference in New Issue
Block a user