diff --git a/CMakeLists.txt b/CMakeLists.txt index afdb9f2..538dbbe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,6 +14,8 @@ find_package(Qt6 6.2 REQUIRED COMPONENTS Widgets Sql) qt_standard_project_setup() +add_subdirectory(third_party/KodoTerm) + add_executable(orbithub src/main.cpp src/profile_dialog.cpp @@ -38,5 +40,6 @@ add_executable(orbithub ) target_link_libraries(orbithub PRIVATE Qt6::Widgets Qt6::Sql) +target_link_libraries(orbithub PRIVATE KodoTerm::KodoTerm) install(TARGETS orbithub RUNTIME DESTINATION bin) diff --git a/src/main.cpp b/src/main.cpp index cf983f5..54f57af 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,6 +4,8 @@ int main(int argc, char* argv[]) { + Q_INIT_RESOURCE(KodoTermThemes); + QApplication app(argc, argv); ProfilesWindow window; diff --git a/src/session_tab.cpp b/src/session_tab.cpp index ea2bbd2..ba4313d 100644 --- a/src/session_tab.cpp +++ b/src/session_tab.cpp @@ -3,6 +3,8 @@ #include "session_backend_factory.h" #include "terminal_view.h" +#include + #include #include #include @@ -16,21 +18,44 @@ #include #include #include +#include #include #include +#include #include #include #include +namespace { +TerminalTheme themeForName(const QString& themeName) +{ + if (themeName.compare(QStringLiteral("Light"), Qt::CaseInsensitive) == 0) { + return TerminalTheme::loadKonsoleTheme( + QStringLiteral(":/KodoTermThemes/konsole/BlackOnWhite.colorscheme")); + } + + if (themeName.compare(QStringLiteral("Solarized Dark"), Qt::CaseInsensitive) == 0) { + return TerminalTheme::loadKonsoleTheme( + QStringLiteral(":/KodoTermThemes/konsole/Solarized.colorscheme")); + } + + return TerminalTheme::loadKonsoleTheme( + QStringLiteral(":/KodoTermThemes/konsole/Breeze.colorscheme")); +} +} + SessionTab::SessionTab(const Profile& profile, QWidget* parent) : QWidget(parent), m_profile(profile), - m_backendThread(new QThread(this)), + m_backendThread(nullptr), m_backend(nullptr), + m_useKodoTermForSsh(profile.protocol.compare(QStringLiteral("SSH"), Qt::CaseInsensitive) + == 0), m_state(SessionState::Disconnected), m_statusLabel(nullptr), m_errorLabel(nullptr), + m_sshTerminal(nullptr), m_terminalOutput(nullptr), m_eventLog(nullptr), m_connectButton(nullptr), @@ -49,81 +74,111 @@ SessionTab::SessionTab(const Profile& profile, QWidget* parent) setupUi(); - std::unique_ptr backend = createSessionBackend(m_profile); - m_backend = backend.release(); - m_backend->moveToThread(m_backendThread); + if (m_useKodoTermForSsh) { + connect(m_sshTerminal, + &KodoTerm::finished, + this, + [this](int exitCode, int) { + if (m_state == SessionState::Disconnected) { + return; + } - connect(m_backendThread, &QThread::finished, m_backend, &QObject::deleteLater); - connect(this, - &SessionTab::requestConnect, - m_backend, - &SessionBackend::connectSession, - Qt::QueuedConnection); - connect(this, - &SessionTab::requestDisconnect, - m_backend, - &SessionBackend::disconnectSession, - Qt::QueuedConnection); - connect(this, - &SessionTab::requestReconnect, - m_backend, - &SessionBackend::reconnectSession, - Qt::QueuedConnection); - connect(this, - &SessionTab::requestInput, - m_backend, - &SessionBackend::sendInput, - Qt::QueuedConnection); - connect(this, - &SessionTab::requestHostKeyConfirmation, - m_backend, - &SessionBackend::confirmHostKey, - Qt::QueuedConnection); - connect(this, - &SessionTab::requestTerminalSize, - m_backend, - &SessionBackend::updateTerminalSize, - Qt::QueuedConnection); + if (exitCode == 0) { + setState(SessionState::Disconnected, + QStringLiteral("SSH session ended.")); + } else { + m_lastError = QStringLiteral("ssh exited with code %1").arg(exitCode); + m_errorLabel->setText(QStringLiteral("Last Error: %1").arg(m_lastError)); + setState(SessionState::Failed, + QStringLiteral("SSH session exited unexpectedly.")); + } + }); + connect(m_sshTerminal, + &KodoTerm::cwdChanged, + this, + [this](const QString& cwd) { + if (!cwd.trimmed().isEmpty()) { + appendEvent(QStringLiteral("Remote cwd: %1").arg(cwd)); + } + }); + } else { + m_backendThread = new QThread(this); - connect(m_backend, - &SessionBackend::stateChanged, - this, - &SessionTab::onBackendStateChanged, - Qt::QueuedConnection); - connect(m_backend, - &SessionBackend::eventLogged, - this, - &SessionTab::onBackendEventLogged, - Qt::QueuedConnection); - connect(m_backend, - &SessionBackend::connectionError, - this, - &SessionTab::onBackendConnectionError, - Qt::QueuedConnection); - connect(m_backend, - &SessionBackend::outputReceived, - this, - &SessionTab::onBackendOutputReceived, - Qt::QueuedConnection); - connect(m_backend, - &SessionBackend::hostKeyConfirmationRequested, - this, - &SessionTab::onBackendHostKeyConfirmationRequested, - Qt::QueuedConnection); + std::unique_ptr backend = createSessionBackend(m_profile); + m_backend = backend.release(); + m_backend->moveToThread(m_backendThread); - m_backendThread->start(); + connect(m_backendThread, &QThread::finished, m_backend, &QObject::deleteLater); + connect(this, + &SessionTab::requestConnect, + m_backend, + &SessionBackend::connectSession, + Qt::QueuedConnection); + connect(this, + &SessionTab::requestDisconnect, + m_backend, + &SessionBackend::disconnectSession, + Qt::QueuedConnection); + connect(this, + &SessionTab::requestReconnect, + m_backend, + &SessionBackend::reconnectSession, + Qt::QueuedConnection); + connect(this, + &SessionTab::requestInput, + m_backend, + &SessionBackend::sendInput, + Qt::QueuedConnection); + connect(this, + &SessionTab::requestHostKeyConfirmation, + m_backend, + &SessionBackend::confirmHostKey, + Qt::QueuedConnection); + connect(this, + &SessionTab::requestTerminalSize, + m_backend, + &SessionBackend::updateTerminalSize, + Qt::QueuedConnection); + + connect(m_backend, + &SessionBackend::stateChanged, + this, + &SessionTab::onBackendStateChanged, + Qt::QueuedConnection); + connect(m_backend, + &SessionBackend::eventLogged, + this, + &SessionTab::onBackendEventLogged, + Qt::QueuedConnection); + connect(m_backend, + &SessionBackend::connectionError, + this, + &SessionTab::onBackendConnectionError, + Qt::QueuedConnection); + connect(m_backend, + &SessionBackend::outputReceived, + this, + &SessionTab::onBackendOutputReceived, + Qt::QueuedConnection); + connect(m_backend, + &SessionBackend::hostKeyConfirmationRequested, + this, + &SessionTab::onBackendHostKeyConfirmationRequested, + Qt::QueuedConnection); + + m_backendThread->start(); + } setState(SessionState::Disconnected, QStringLiteral("Ready to connect.")); } SessionTab::~SessionTab() { - if (m_backend != nullptr && m_backendThread->isRunning()) { + if (m_backend != nullptr && m_backendThread != nullptr && m_backendThread->isRunning()) { QMetaObject::invokeMethod(m_backend, "disconnectSession", Qt::BlockingQueuedConnection); + m_backendThread->quit(); + m_backendThread->wait(2000); } - - m_backendThread->quit(); - m_backendThread->wait(2000); } QString SessionTab::tabTitle() const @@ -142,11 +197,28 @@ void SessionTab::onConnectClicked() return; } + m_lastConnectOptions = options.value(); + + if (m_useKodoTermForSsh) { + if (!startSshTerminal(options.value())) { + return; + } + return; + } + emit requestConnect(options.value()); } void SessionTab::onDisconnectClicked() { + if (m_useKodoTermForSsh) { + if (m_sshTerminal != nullptr) { + m_sshTerminal->kill(); + } + setState(SessionState::Disconnected, QStringLiteral("Session disconnected.")); + return; + } + emit requestDisconnect(); } @@ -161,6 +233,18 @@ void SessionTab::onReconnectClicked() return; } + m_lastConnectOptions = options.value(); + + if (m_useKodoTermForSsh) { + if (m_sshTerminal != nullptr) { + m_sshTerminal->kill(); + } + QTimer::singleShot(50, + this, + [this, options]() { startSshTerminal(options.value()); }); + return; + } + emit requestReconnect(options.value()); } @@ -176,12 +260,19 @@ void SessionTab::onCopyErrorClicked() void SessionTab::onClearTerminalClicked() { - m_terminalOutput->clear(); - if (m_state == SessionState::Connected) { - // Ask the remote shell to repaint a prompt after local clear. - emit requestInput(QStringLiteral("\x0c")); + if (m_useKodoTermForSsh && m_sshTerminal != nullptr) { + m_sshTerminal->clearScrollback(); + m_sshTerminal->setFocus(); + return; + } + + if (m_terminalOutput != nullptr) { + m_terminalOutput->clear(); + if (m_state == SessionState::Connected) { + emit requestInput(QStringLiteral("\x0c")); + } + m_terminalOutput->setFocus(); } - m_terminalOutput->setFocus(); } void SessionTab::onBackendStateChanged(SessionState state, const QString& message) @@ -203,7 +294,7 @@ void SessionTab::onBackendConnectionError(const QString& displayMessage, const Q void SessionTab::onBackendOutputReceived(const QString& text) { - if (text.isEmpty()) { + if (text.isEmpty() || m_terminalOutput == nullptr) { return; } @@ -276,7 +367,9 @@ void SessionTab::setupUi() auto* terminalHeader = new QHBoxLayout(); auto* terminalLabel = new QLabel(QStringLiteral("SSH Terminal"), this); m_themeSelector = new QComboBox(this); - m_themeSelector->addItems(TerminalView::themeNames()); + m_themeSelector->addItems({QStringLiteral("Dark"), + QStringLiteral("Light"), + QStringLiteral("Solarized Dark")}); m_themeSelector->setCurrentText(QStringLiteral("Dark")); m_clearTerminalButton = new QPushButton(QStringLiteral("Clear"), this); terminalHeader->addWidget(terminalLabel); @@ -285,13 +378,36 @@ void SessionTab::setupUi() terminalHeader->addWidget(m_themeSelector); terminalHeader->addWidget(m_clearTerminalButton); - m_terminalOutput = new TerminalView(this); - QFont terminalFont(QStringLiteral("Monospace")); - terminalFont.setStyleHint(QFont::TypeWriter); - m_terminalOutput->setFont(terminalFont); - m_terminalOutput->setMinimumHeight(260); - m_terminalOutput->setPlaceholderText( - QStringLiteral("Connect, then type directly here to interact with the SSH session.")); + if (m_useKodoTermForSsh) { + m_sshTerminal = new KodoTerm(this); + QFont terminalFont(QStringLiteral("Monospace")); + terminalFont.setStyleHint(QFont::TypeWriter); + + KodoTermConfig config = m_sshTerminal->getConfig(); + config.font = terminalFont; + config.maxScrollback = 12000; + m_sshTerminal->setConfig(config); + + applyTerminalTheme(m_themeSelector->currentText()); + + rootLayout->addLayout(detailsHeader); + rootLayout->addWidget(m_detailsPanel); + rootLayout->addLayout(terminalHeader); + rootLayout->addWidget(m_sshTerminal, 1); + } else { + m_terminalOutput = new TerminalView(this); + QFont terminalFont(QStringLiteral("Monospace")); + terminalFont.setStyleHint(QFont::TypeWriter); + m_terminalOutput->setFont(terminalFont); + m_terminalOutput->setMinimumHeight(260); + m_terminalOutput->setPlaceholderText( + QStringLiteral("Connect, then type directly here to interact with the SSH session.")); + + rootLayout->addLayout(detailsHeader); + rootLayout->addWidget(m_detailsPanel); + rootLayout->addLayout(terminalHeader); + rootLayout->addWidget(m_terminalOutput, 1); + } auto* eventsHeader = new QHBoxLayout(); m_toggleEventsButton = new QToolButton(this); @@ -312,10 +428,6 @@ void SessionTab::setupUi() eventsLayout->addWidget(eventTitle); eventsLayout->addWidget(m_eventLog); - rootLayout->addLayout(detailsHeader); - rootLayout->addWidget(m_detailsPanel); - rootLayout->addLayout(terminalHeader); - rootLayout->addWidget(m_terminalOutput, 1); rootLayout->addLayout(eventsHeader); rootLayout->addWidget(m_eventsPanel); @@ -345,18 +457,22 @@ void SessionTab::setupUi() &QPushButton::clicked, this, &SessionTab::onClearTerminalClicked); - connect(m_terminalOutput, - &TerminalView::inputGenerated, - this, - [this](const QString& input) { emit requestInput(input); }); - connect(m_terminalOutput, - &TerminalView::terminalSizeChanged, - this, - [this](int columns, int rows) { emit requestTerminalSize(columns, rows); }); + + if (m_terminalOutput != nullptr) { + connect(m_terminalOutput, + &TerminalView::inputGenerated, + this, + [this](const QString& input) { emit requestInput(input); }); + connect(m_terminalOutput, + &TerminalView::terminalSizeChanged, + this, + [this](int columns, int rows) { emit requestTerminalSize(columns, rows); }); + } + connect(m_themeSelector, &QComboBox::currentTextChanged, - m_terminalOutput, - &TerminalView::setThemeName); + this, + [this](const QString& themeName) { applyTerminalTheme(themeName); }); } std::optional SessionTab::buildConnectOptions() @@ -368,6 +484,12 @@ std::optional SessionTab::buildConnectOptions() return options; } + if (m_useKodoTermForSsh + && m_profile.authMode.compare(QStringLiteral("Password"), Qt::CaseInsensitive) == 0) { + // Password is entered directly in terminal prompt. + return options; + } + if (m_profile.authMode.compare(QStringLiteral("Password"), Qt::CaseInsensitive) == 0) { bool accepted = false; const QString password = QInputDialog::getText(this, @@ -506,8 +628,16 @@ void SessionTab::refreshActionButtons() || m_state == SessionState::Disconnected); m_copyErrorButton->setEnabled(!m_lastError.isEmpty()); - m_terminalOutput->setEnabled(isConnected); - m_terminalOutput->setFocus(); + if (m_useKodoTermForSsh && m_sshTerminal != nullptr) { + m_sshTerminal->setEnabled(true); + m_sshTerminal->setFocus(); + return; + } + + if (m_terminalOutput != nullptr) { + m_terminalOutput->setEnabled(isConnected); + m_terminalOutput->setFocus(); + } } void SessionTab::setPanelExpanded(QToolButton* button, @@ -527,3 +657,97 @@ void SessionTab::setPanelExpanded(QToolButton* button, button->setText(expanded ? QStringLiteral("Hide %1").arg(name) : QStringLiteral("Show %1").arg(name)); } + +bool SessionTab::startSshTerminal(const SessionConnectOptions& options) +{ + if (m_sshTerminal == nullptr) { + return false; + } + + QStringList args; + args << QStringLiteral("-tt") << QStringLiteral("-p") << QString::number(m_profile.port) + << QStringLiteral("-o") << QStringLiteral("ConnectTimeout=12") << QStringLiteral("-o") + << QStringLiteral("ServerAliveInterval=20") << QStringLiteral("-o") + << QStringLiteral("ServerAliveCountMax=2"); + + const QString policy = options.knownHostsPolicy.trimmed().isEmpty() + ? m_profile.knownHostsPolicy.trimmed() + : options.knownHostsPolicy.trimmed(); + + if (policy.compare(QStringLiteral("Ignore"), Qt::CaseInsensitive) == 0) { +#ifdef Q_OS_WIN + const QString knownHostsNullDevice = QStringLiteral("NUL"); +#else + const QString knownHostsNullDevice = QStringLiteral("/dev/null"); +#endif + args << QStringLiteral("-o") << QStringLiteral("StrictHostKeyChecking=no") + << QStringLiteral("-o") + << QStringLiteral("UserKnownHostsFile=%1").arg(knownHostsNullDevice); + } else if (policy.compare(QStringLiteral("Accept New"), Qt::CaseInsensitive) == 0) { + args << QStringLiteral("-o") << QStringLiteral("StrictHostKeyChecking=accept-new"); + } else if (policy.compare(QStringLiteral("Ask"), Qt::CaseInsensitive) == 0) { + args << QStringLiteral("-o") << QStringLiteral("StrictHostKeyChecking=ask"); + } else { + args << QStringLiteral("-o") << QStringLiteral("StrictHostKeyChecking=yes"); + } + + if (m_profile.authMode.compare(QStringLiteral("Private Key"), Qt::CaseInsensitive) == 0) { + QString keyPath = options.privateKeyPath.trimmed(); + if (keyPath.isEmpty()) { + keyPath = m_profile.privateKeyPath.trimmed(); + } + + if (keyPath.isEmpty()) { + m_lastError = QStringLiteral("Private key path is required."); + m_errorLabel->setText(QStringLiteral("Last Error: %1").arg(m_lastError)); + setState(SessionState::Failed, m_lastError); + return false; + } + + args << QStringLiteral("-i") << keyPath; + } + + const QString target = m_profile.username.trimmed().isEmpty() + ? m_profile.host.trimmed() + : QStringLiteral("%1@%2").arg(m_profile.username.trimmed(), m_profile.host.trimmed()); + args << target; + + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + if (!env.contains(QStringLiteral("TERM"))) { + env.insert(QStringLiteral("TERM"), QStringLiteral("xterm-256color")); + } + if (!env.contains(QStringLiteral("COLORTERM"))) { + env.insert(QStringLiteral("COLORTERM"), QStringLiteral("truecolor")); + } + + m_sshTerminal->setProgram(QStringLiteral("ssh")); + m_sshTerminal->setArguments(args); + m_sshTerminal->setProcessEnvironment(env); + + appendEvent(QStringLiteral("Launching SSH terminal session.")); + setState(SessionState::Connecting, QStringLiteral("Starting SSH terminal...")); + + if (!m_sshTerminal->start()) { + m_lastError = QStringLiteral("Failed to start embedded SSH terminal process."); + m_errorLabel->setText(QStringLiteral("Last Error: %1").arg(m_lastError)); + setState(SessionState::Failed, QStringLiteral("Failed to start SSH terminal.")); + return false; + } + + setState(SessionState::Connected, QStringLiteral("SSH session established.")); + return true; +} + +void SessionTab::applyTerminalTheme(const QString& themeName) +{ + if (m_useKodoTermForSsh) { + if (m_sshTerminal != nullptr) { + m_sshTerminal->setTheme(themeForName(themeName)); + } + return; + } + + if (m_terminalOutput != nullptr) { + m_terminalOutput->setThemeName(themeName); + } +} diff --git a/src/session_tab.h b/src/session_tab.h index ec7b790..67d1025 100644 --- a/src/session_tab.h +++ b/src/session_tab.h @@ -17,6 +17,7 @@ class QThread; class SessionBackend; class TerminalView; class QToolButton; +class KodoTerm; class SessionTab : public QWidget { @@ -54,11 +55,14 @@ private: Profile m_profile; QThread* m_backendThread; SessionBackend* m_backend; + bool m_useKodoTermForSsh; SessionState m_state; QString m_lastError; + SessionConnectOptions m_lastConnectOptions; QLabel* m_statusLabel; QLabel* m_errorLabel; + KodoTerm* m_sshTerminal; TerminalView* m_terminalOutput; QPlainTextEdit* m_eventLog; QPushButton* m_connectButton; @@ -80,6 +84,8 @@ private: QString stateSuffix() const; void refreshActionButtons(); void setPanelExpanded(QToolButton* button, QWidget* panel, const QString& name, bool expanded); + bool startSshTerminal(const SessionConnectOptions& options); + void applyTerminalTheme(const QString& themeName); }; #endif diff --git a/src/terminal_view.h b/src/terminal_view.h index 18c7e94..20b6340 100644 --- a/src/terminal_view.h +++ b/src/terminal_view.h @@ -40,6 +40,7 @@ private: ThemePalette m_palette; QString m_pendingEscape; + QString m_rawHistory; bool m_bold; bool m_hasFgColor; bool m_hasBgColor; @@ -56,6 +57,7 @@ private: void handleSgrSequence(const QString& params); void appendTextChunk(const QString& text); QColor paletteColor(bool background, int index, bool bright) const; + void processData(const QString& data, bool storeInHistory); int terminalColumns() const; int terminalRows() const; void emitTerminalSize(); diff --git a/third_party/KodoTerm/CMakeLists.txt b/third_party/KodoTerm/CMakeLists.txt new file mode 100644 index 0000000..0e234da --- /dev/null +++ b/third_party/KodoTerm/CMakeLists.txt @@ -0,0 +1,61 @@ +# SPDX-License-Identifier: MIT + +cmake_minimum_required(VERSION 3.21) +project(KodoTermVendor LANGUAGES C CXX) + +find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets) + +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) + +set(LIBVTERM_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/../libvterm") + +file(GLOB VTERM_SOURCES CONFIGURE_DEPENDS + "${LIBVTERM_SOURCE_DIR}/src/*.c" +) + +add_library(vterm STATIC ${VTERM_SOURCES}) +target_include_directories(vterm PUBLIC + "${LIBVTERM_SOURCE_DIR}/include" + "${LIBVTERM_SOURCE_DIR}/src" +) + +set(KODOTERM_SOURCES + src/KodoTerm.cpp + src/KodoTermConfig.cpp + src/PtyProcess.cpp + src/PtyProcess.h + include/KodoTerm/KodoTerm.hpp + include/KodoTerm/KodoTermConfig.hpp + KodoTermThemes.qrc +) + +if(UNIX) + list(APPEND KODOTERM_SOURCES + src/PtyProcess_unix.cpp + src/PtyProcess_unix.h + ) +elseif(WIN32) + list(APPEND KODOTERM_SOURCES + src/PtyProcess_win.cpp + src/PtyProcess_win.h + ) +endif() + +add_library(KodoTerm ${KODOTERM_SOURCES}) +add_library(KodoTerm::KodoTerm ALIAS KodoTerm) + +target_compile_features(KodoTerm PUBLIC cxx_std_20) + +target_include_directories(KodoTerm PRIVATE src) +target_include_directories(KodoTerm PUBLIC + $ + $ +) + +target_link_libraries(KodoTerm PUBLIC + Qt6::Core + Qt6::Gui + Qt6::Widgets + vterm +) diff --git a/third_party/KodoTerm/KodoTermThemes.qrc b/third_party/KodoTerm/KodoTermThemes.qrc new file mode 100644 index 0000000..c486c21 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes.qrc @@ -0,0 +1,470 @@ + + + KodoTermThemes/konsole/BlackOnLightYellow.colorscheme + KodoTermThemes/konsole/BlackOnRandomLight.colorscheme + KodoTermThemes/konsole/BlackOnWhite.colorscheme + KodoTermThemes/konsole/BlueOnBlack.colorscheme + KodoTermThemes/konsole/Breeze.colorscheme + KodoTermThemes/konsole/Campbell.colorscheme + KodoTermThemes/konsole/DarkPastels.colorscheme + KodoTermThemes/konsole/GreenOnBlack.colorscheme + KodoTermThemes/konsole/Linux.colorscheme + KodoTermThemes/konsole/RedOnBlack.colorscheme + KodoTermThemes/konsole/Solarized.colorscheme + KodoTermThemes/konsole/SolarizedLight.colorscheme + KodoTermThemes/konsole/WhiteOnBlack.colorscheme + KodoTermThemes/windowsterminal/0x96f.json + KodoTermThemes/windowsterminal/12-bit Rainbow.json + KodoTermThemes/windowsterminal/3024 Day.json + KodoTermThemes/windowsterminal/3024 Night.json + KodoTermThemes/windowsterminal/Aardvark Blue.json + KodoTermThemes/windowsterminal/Abernathy.json + KodoTermThemes/windowsterminal/Adventure Time.json + KodoTermThemes/windowsterminal/Adventure.json + KodoTermThemes/windowsterminal/Adwaita Dark.json + KodoTermThemes/windowsterminal/Adwaita.json + KodoTermThemes/windowsterminal/Afterglow.json + KodoTermThemes/windowsterminal/Aizen Dark.json + KodoTermThemes/windowsterminal/Aizen Light.json + KodoTermThemes/windowsterminal/Alabaster.json + KodoTermThemes/windowsterminal/Alien Blood.json + KodoTermThemes/windowsterminal/Andromeda.json + KodoTermThemes/windowsterminal/Apple Classic.json + KodoTermThemes/windowsterminal/Apple System Colors Light.json + KodoTermThemes/windowsterminal/Apple System Colors.json + KodoTermThemes/windowsterminal/Arcoiris.json + KodoTermThemes/windowsterminal/Ardoise.json + KodoTermThemes/windowsterminal/Argonaut.json + KodoTermThemes/windowsterminal/Arthur.json + KodoTermThemes/windowsterminal/Atelier Sulphurpool.json + KodoTermThemes/windowsterminal/Atom One Dark.json + KodoTermThemes/windowsterminal/Atom One Light.json + KodoTermThemes/windowsterminal/Atom.json + KodoTermThemes/windowsterminal/Aura.json + KodoTermThemes/windowsterminal/Aurora.json + KodoTermThemes/windowsterminal/Ayu Light.json + KodoTermThemes/windowsterminal/Ayu Mirage.json + KodoTermThemes/windowsterminal/Ayu.json + KodoTermThemes/windowsterminal/Banana Blueberry.json + KodoTermThemes/windowsterminal/Batman.json + KodoTermThemes/windowsterminal/Belafonte Day.json + KodoTermThemes/windowsterminal/Belafonte Night.json + KodoTermThemes/windowsterminal/Birds Of Paradise.json + KodoTermThemes/windowsterminal/Black Metal (Bathory).json + KodoTermThemes/windowsterminal/Black Metal (Burzum).json + KodoTermThemes/windowsterminal/Black Metal (Dark Funeral).json + KodoTermThemes/windowsterminal/Black Metal (Gorgoroth).json + KodoTermThemes/windowsterminal/Black Metal (Immortal).json + KodoTermThemes/windowsterminal/Black Metal (Khold).json + KodoTermThemes/windowsterminal/Black Metal (Marduk).json + KodoTermThemes/windowsterminal/Black Metal (Mayhem).json + KodoTermThemes/windowsterminal/Black Metal (Nile).json + KodoTermThemes/windowsterminal/Black Metal (Venom).json + KodoTermThemes/windowsterminal/Black Metal.json + KodoTermThemes/windowsterminal/Blazer.json + KodoTermThemes/windowsterminal/Blue Berry Pie.json + KodoTermThemes/windowsterminal/Blue Dolphin.json + KodoTermThemes/windowsterminal/Blue Matrix.json + KodoTermThemes/windowsterminal/Bluloco Dark.json + KodoTermThemes/windowsterminal/Bluloco Light.json + KodoTermThemes/windowsterminal/Borland.json + KodoTermThemes/windowsterminal/Box.json + KodoTermThemes/windowsterminal/Breadog.json + KodoTermThemes/windowsterminal/Breeze.json + KodoTermThemes/windowsterminal/Bright Lights.json + KodoTermThemes/windowsterminal/Broadcast.json + KodoTermThemes/windowsterminal/Brogrammer.json + KodoTermThemes/windowsterminal/Builtin Dark.json + KodoTermThemes/windowsterminal/Builtin Light.json + KodoTermThemes/windowsterminal/Builtin Pastel Dark.json + KodoTermThemes/windowsterminal/Builtin Tango Dark.json + KodoTermThemes/windowsterminal/Builtin Tango Light.json + KodoTermThemes/windowsterminal/C64.json + KodoTermThemes/windowsterminal/CGA.json + KodoTermThemes/windowsterminal/CLRS.json + KodoTermThemes/windowsterminal/Calamity.json + KodoTermThemes/windowsterminal/Carbonfox.json + KodoTermThemes/windowsterminal/Catppuccin Frappe.json + KodoTermThemes/windowsterminal/Catppuccin Latte.json + KodoTermThemes/windowsterminal/Catppuccin Macchiato.json + KodoTermThemes/windowsterminal/Catppuccin Mocha.json + KodoTermThemes/windowsterminal/Chalk.json + KodoTermThemes/windowsterminal/Chalkboard.json + KodoTermThemes/windowsterminal/Challenger Deep.json + KodoTermThemes/windowsterminal/Chester.json + KodoTermThemes/windowsterminal/Ciapre.json + KodoTermThemes/windowsterminal/Citruszest.json + KodoTermThemes/windowsterminal/Cobalt Neon.json + KodoTermThemes/windowsterminal/Cobalt Next Dark.json + KodoTermThemes/windowsterminal/Cobalt Next Minimal.json + KodoTermThemes/windowsterminal/Cobalt Next.json + KodoTermThemes/windowsterminal/Cobalt2.json + KodoTermThemes/windowsterminal/Coffee Theme.json + KodoTermThemes/windowsterminal/Crayon Pony Fish.json + KodoTermThemes/windowsterminal/Cursor Dark.json + KodoTermThemes/windowsterminal/Cutie Pro.json + KodoTermThemes/windowsterminal/Cyberdyne.json + KodoTermThemes/windowsterminal/Cyberpunk Scarlet Protocol.json + KodoTermThemes/windowsterminal/Cyberpunk.json + KodoTermThemes/windowsterminal/Dark Modern.json + KodoTermThemes/windowsterminal/Dark Pastel.json + KodoTermThemes/windowsterminal/Dark+.json + KodoTermThemes/windowsterminal/Darkermatrix.json + KodoTermThemes/windowsterminal/Darkmatrix.json + KodoTermThemes/windowsterminal/Darkside.json + KodoTermThemes/windowsterminal/Dawnfox.json + KodoTermThemes/windowsterminal/Dayfox.json + KodoTermThemes/windowsterminal/Deep.json + KodoTermThemes/windowsterminal/Desert.json + KodoTermThemes/windowsterminal/Detuned.json + KodoTermThemes/windowsterminal/Dimidium.json + KodoTermThemes/windowsterminal/Dimmed Monokai.json + KodoTermThemes/windowsterminal/Django Reborn Again.json + KodoTermThemes/windowsterminal/Django Smooth.json + KodoTermThemes/windowsterminal/Django.json + KodoTermThemes/windowsterminal/Doom One.json + KodoTermThemes/windowsterminal/Doom Peacock.json + KodoTermThemes/windowsterminal/Dot Gov.json + KodoTermThemes/windowsterminal/Dracula+.json + KodoTermThemes/windowsterminal/Dracula.json + KodoTermThemes/windowsterminal/Duckbones.json + KodoTermThemes/windowsterminal/Duotone Dark.json + KodoTermThemes/windowsterminal/Duskfox.json + KodoTermThemes/windowsterminal/ENCOM.json + KodoTermThemes/windowsterminal/Earthsong.json + KodoTermThemes/windowsterminal/Electron Highlighter.json + KodoTermThemes/windowsterminal/Elegant.json + KodoTermThemes/windowsterminal/Elemental.json + KodoTermThemes/windowsterminal/Elementary.json + KodoTermThemes/windowsterminal/Embark.json + KodoTermThemes/windowsterminal/Embers Dark.json + KodoTermThemes/windowsterminal/Espresso Libre.json + KodoTermThemes/windowsterminal/Espresso.json + KodoTermThemes/windowsterminal/Everblush.json + KodoTermThemes/windowsterminal/Everforest Dark Hard.json + KodoTermThemes/windowsterminal/Everforest Light Med.json + KodoTermThemes/windowsterminal/Fahrenheit.json + KodoTermThemes/windowsterminal/Fairyfloss.json + KodoTermThemes/windowsterminal/Farmhouse Dark.json + KodoTermThemes/windowsterminal/Farmhouse Light.json + KodoTermThemes/windowsterminal/Fideloper.json + KodoTermThemes/windowsterminal/Firefly Traditional.json + KodoTermThemes/windowsterminal/Firefox Dev.json + KodoTermThemes/windowsterminal/Firewatch.json + KodoTermThemes/windowsterminal/Fish Tank.json + KodoTermThemes/windowsterminal/Flat.json + KodoTermThemes/windowsterminal/Flatland.json + KodoTermThemes/windowsterminal/Flexoki Dark.json + KodoTermThemes/windowsterminal/Flexoki Light.json + KodoTermThemes/windowsterminal/Floraverse.json + KodoTermThemes/windowsterminal/Forest Blue.json + KodoTermThemes/windowsterminal/Framer.json + KodoTermThemes/windowsterminal/Front End Delight.json + KodoTermThemes/windowsterminal/Fun Forrest.json + KodoTermThemes/windowsterminal/Galaxy.json + KodoTermThemes/windowsterminal/Galizur.json + KodoTermThemes/windowsterminal/Ghostty Default Style Dark.json + KodoTermThemes/windowsterminal/GitHub Dark Colorblind.json + KodoTermThemes/windowsterminal/GitHub Dark Default.json + KodoTermThemes/windowsterminal/GitHub Dark Dimmed.json + KodoTermThemes/windowsterminal/GitHub Dark High Contrast.json + KodoTermThemes/windowsterminal/GitHub Dark.json + KodoTermThemes/windowsterminal/GitHub Light Colorblind.json + KodoTermThemes/windowsterminal/GitHub Light Default.json + KodoTermThemes/windowsterminal/GitHub Light High Contrast.json + KodoTermThemes/windowsterminal/GitHub.json + KodoTermThemes/windowsterminal/GitLab Dark Grey.json + KodoTermThemes/windowsterminal/GitLab Dark.json + KodoTermThemes/windowsterminal/GitLab Light.json + KodoTermThemes/windowsterminal/Glacier.json + KodoTermThemes/windowsterminal/Grape.json + KodoTermThemes/windowsterminal/Grass.json + KodoTermThemes/windowsterminal/Grey Green.json + KodoTermThemes/windowsterminal/Gruber Darker.json + KodoTermThemes/windowsterminal/Gruvbox Dark Hard.json + KodoTermThemes/windowsterminal/Gruvbox Dark.json + KodoTermThemes/windowsterminal/Gruvbox Light Hard.json + KodoTermThemes/windowsterminal/Gruvbox Light.json + KodoTermThemes/windowsterminal/Gruvbox Material Dark.json + KodoTermThemes/windowsterminal/Gruvbox Material Light.json + KodoTermThemes/windowsterminal/Gruvbox Material.json + KodoTermThemes/windowsterminal/Guezwhoz.json + KodoTermThemes/windowsterminal/HaX0R Blue.json + KodoTermThemes/windowsterminal/HaX0R Gr33N.json + KodoTermThemes/windowsterminal/HaX0R R3D.json + KodoTermThemes/windowsterminal/Hacktober.json + KodoTermThemes/windowsterminal/Hardcore.json + KodoTermThemes/windowsterminal/Harper.json + KodoTermThemes/windowsterminal/Havn Daggry.json + KodoTermThemes/windowsterminal/Havn Skumring.json + KodoTermThemes/windowsterminal/Heeler.json + KodoTermThemes/windowsterminal/Highway.json + KodoTermThemes/windowsterminal/Hipster Green.json + KodoTermThemes/windowsterminal/Hivacruz.json + KodoTermThemes/windowsterminal/Homebrew.json + KodoTermThemes/windowsterminal/Hopscotch.256.json + KodoTermThemes/windowsterminal/Hopscotch.json + KodoTermThemes/windowsterminal/Horizon Bright.json + KodoTermThemes/windowsterminal/Horizon.json + KodoTermThemes/windowsterminal/Hot Dog Stand (Mustard).json + KodoTermThemes/windowsterminal/Hot Dog Stand.json + KodoTermThemes/windowsterminal/Hurtado.json + KodoTermThemes/windowsterminal/Hybrid.json + KodoTermThemes/windowsterminal/IBM 5153 CGA (Black).json + KodoTermThemes/windowsterminal/IBM 5153 CGA.json + KodoTermThemes/windowsterminal/IC Green PPL.json + KodoTermThemes/windowsterminal/IC Orange PPL.json + KodoTermThemes/windowsterminal/IR Black.json + KodoTermThemes/windowsterminal/IRIX Console.json + KodoTermThemes/windowsterminal/IRIX Terminal.json + KodoTermThemes/windowsterminal/Iceberg Dark.json + KodoTermThemes/windowsterminal/Iceberg Light.json + KodoTermThemes/windowsterminal/Idea.json + KodoTermThemes/windowsterminal/Idle Toes.json + KodoTermThemes/windowsterminal/Jackie Brown.json + KodoTermThemes/windowsterminal/Japanesque.json + KodoTermThemes/windowsterminal/Jellybeans.json + KodoTermThemes/windowsterminal/JetBrains Darcula.json + KodoTermThemes/windowsterminal/Jubi.json + KodoTermThemes/windowsterminal/Kanagawa Dragon.json + KodoTermThemes/windowsterminal/Kanagawa Wave.json + KodoTermThemes/windowsterminal/Kanagawabones.json + KodoTermThemes/windowsterminal/Kibble.json + KodoTermThemes/windowsterminal/Kitty Default.json + KodoTermThemes/windowsterminal/Kitty Low Contrast.json + KodoTermThemes/windowsterminal/Kolorit.json + KodoTermThemes/windowsterminal/Konsolas.json + KodoTermThemes/windowsterminal/Kurokula.json + KodoTermThemes/windowsterminal/Lab Fox.json + KodoTermThemes/windowsterminal/Laser.json + KodoTermThemes/windowsterminal/Later This Evening.json + KodoTermThemes/windowsterminal/Lavandula.json + KodoTermThemes/windowsterminal/Light Owl.json + KodoTermThemes/windowsterminal/Liquid Carbon Transparent.json + KodoTermThemes/windowsterminal/Liquid Carbon.json + KodoTermThemes/windowsterminal/Lovelace.json + KodoTermThemes/windowsterminal/Man Page.json + KodoTermThemes/windowsterminal/Mariana.json + KodoTermThemes/windowsterminal/Material Dark.json + KodoTermThemes/windowsterminal/Material Darker.json + KodoTermThemes/windowsterminal/Material Design Colors.json + KodoTermThemes/windowsterminal/Material Ocean.json + KodoTermThemes/windowsterminal/Material.json + KodoTermThemes/windowsterminal/Mathias.json + KodoTermThemes/windowsterminal/Matrix.json + KodoTermThemes/windowsterminal/Matte Black.json + KodoTermThemes/windowsterminal/Medallion.json + KodoTermThemes/windowsterminal/Melange Dark.json + KodoTermThemes/windowsterminal/Melange Light.json + KodoTermThemes/windowsterminal/Mellifluous.json + KodoTermThemes/windowsterminal/Mellow.json + KodoTermThemes/windowsterminal/Miasma.json + KodoTermThemes/windowsterminal/Midnight In Mojave.json + KodoTermThemes/windowsterminal/Mirage.json + KodoTermThemes/windowsterminal/Misterioso.json + KodoTermThemes/windowsterminal/Molokai.json + KodoTermThemes/windowsterminal/Mona Lisa.json + KodoTermThemes/windowsterminal/Monokai Classic.json + KodoTermThemes/windowsterminal/Monokai Pro Light Sun.json + KodoTermThemes/windowsterminal/Monokai Pro Light.json + KodoTermThemes/windowsterminal/Monokai Pro Machine.json + KodoTermThemes/windowsterminal/Monokai Pro Octagon.json + KodoTermThemes/windowsterminal/Monokai Pro Ristretto.json + KodoTermThemes/windowsterminal/Monokai Pro Spectrum.json + KodoTermThemes/windowsterminal/Monokai Pro.json + KodoTermThemes/windowsterminal/Monokai Remastered.json + KodoTermThemes/windowsterminal/Monokai Soda.json + KodoTermThemes/windowsterminal/Monokai Vivid.json + KodoTermThemes/windowsterminal/Moonfly.json + KodoTermThemes/windowsterminal/N0Tch2K.json + KodoTermThemes/windowsterminal/Neobones Dark.json + KodoTermThemes/windowsterminal/Neobones Light.json + KodoTermThemes/windowsterminal/Neon.json + KodoTermThemes/windowsterminal/Neopolitan.json + KodoTermThemes/windowsterminal/Neutron.json + KodoTermThemes/windowsterminal/Night Lion V1.json + KodoTermThemes/windowsterminal/Night Lion V2.json + KodoTermThemes/windowsterminal/Night Owl.json + KodoTermThemes/windowsterminal/Night Owlish Light.json + KodoTermThemes/windowsterminal/Nightfox.json + KodoTermThemes/windowsterminal/Niji.json + KodoTermThemes/windowsterminal/No Clown Fiesta Light.json + KodoTermThemes/windowsterminal/No Clown Fiesta.json + KodoTermThemes/windowsterminal/Nocturnal Winter.json + KodoTermThemes/windowsterminal/Nord Light.json + KodoTermThemes/windowsterminal/Nord Wave.json + KodoTermThemes/windowsterminal/Nord.json + KodoTermThemes/windowsterminal/Nordfox.json + KodoTermThemes/windowsterminal/Novel.json + KodoTermThemes/windowsterminal/Nvim Dark.json + KodoTermThemes/windowsterminal/Nvim Light.json + KodoTermThemes/windowsterminal/Obsidian.json + KodoTermThemes/windowsterminal/Ocean.json + KodoTermThemes/windowsterminal/Oceanic Material.json + KodoTermThemes/windowsterminal/Oceanic Next.json + KodoTermThemes/windowsterminal/Ollie.json + KodoTermThemes/windowsterminal/One Dark Two.json + KodoTermThemes/windowsterminal/One Double Dark.json + KodoTermThemes/windowsterminal/One Double Light.json + KodoTermThemes/windowsterminal/One Half Dark.json + KodoTermThemes/windowsterminal/One Half Light.json + KodoTermThemes/windowsterminal/Onenord Light.json + KodoTermThemes/windowsterminal/Onenord.json + KodoTermThemes/windowsterminal/Operator Mono Dark.json + KodoTermThemes/windowsterminal/Overnight Slumber.json + KodoTermThemes/windowsterminal/Oxocarbon.json + KodoTermThemes/windowsterminal/Pale Night Hc.json + KodoTermThemes/windowsterminal/Pandora.json + KodoTermThemes/windowsterminal/Paraiso Dark.json + KodoTermThemes/windowsterminal/Paul Millr.json + KodoTermThemes/windowsterminal/Pencil Dark.json + KodoTermThemes/windowsterminal/Pencil Light.json + KodoTermThemes/windowsterminal/Peppermint.json + KodoTermThemes/windowsterminal/Phala Green Dark.json + KodoTermThemes/windowsterminal/Piatto Light.json + KodoTermThemes/windowsterminal/Pnevma.json + KodoTermThemes/windowsterminal/Poimandres Darker.json + KodoTermThemes/windowsterminal/Poimandres Storm.json + KodoTermThemes/windowsterminal/Poimandres White.json + KodoTermThemes/windowsterminal/Poimandres.json + KodoTermThemes/windowsterminal/Popping And Locking.json + KodoTermThemes/windowsterminal/Powershell.json + KodoTermThemes/windowsterminal/Primary.json + KodoTermThemes/windowsterminal/Pro Light.json + KodoTermThemes/windowsterminal/Pro.json + KodoTermThemes/windowsterminal/Purple Rain.json + KodoTermThemes/windowsterminal/Purplepeter.json + KodoTermThemes/windowsterminal/Rapture.json + KodoTermThemes/windowsterminal/Raycast Dark.json + KodoTermThemes/windowsterminal/Raycast Light.json + KodoTermThemes/windowsterminal/Rebecca.json + KodoTermThemes/windowsterminal/Red Alert.json + KodoTermThemes/windowsterminal/Red Planet.json + KodoTermThemes/windowsterminal/Red Sands.json + KodoTermThemes/windowsterminal/Relaxed.json + KodoTermThemes/windowsterminal/Retro Legends.json + KodoTermThemes/windowsterminal/Retro.json + KodoTermThemes/windowsterminal/Rippedcasts.json + KodoTermThemes/windowsterminal/Rose Pine Dawn.json + KodoTermThemes/windowsterminal/Rose Pine Moon.json + KodoTermThemes/windowsterminal/Rose Pine.json + KodoTermThemes/windowsterminal/Rouge 2.json + KodoTermThemes/windowsterminal/Royal.json + KodoTermThemes/windowsterminal/Ryuuko.json + KodoTermThemes/windowsterminal/Sakura.json + KodoTermThemes/windowsterminal/Scarlet Protocol.json + KodoTermThemes/windowsterminal/Sea Shells.json + KodoTermThemes/windowsterminal/Seafoam Pastel.json + KodoTermThemes/windowsterminal/Selenized Black.json + KodoTermThemes/windowsterminal/Selenized Dark.json + KodoTermThemes/windowsterminal/Selenized Light.json + KodoTermThemes/windowsterminal/Seoulbones Dark.json + KodoTermThemes/windowsterminal/Seoulbones Light.json + KodoTermThemes/windowsterminal/Seti.json + KodoTermThemes/windowsterminal/Shades Of Purple.json + KodoTermThemes/windowsterminal/Shaman.json + KodoTermThemes/windowsterminal/Slate.json + KodoTermThemes/windowsterminal/Sleepy Hollow.json + KodoTermThemes/windowsterminal/Smyck.json + KodoTermThemes/windowsterminal/Snazzy Soft.json + KodoTermThemes/windowsterminal/Snazzy.json + KodoTermThemes/windowsterminal/Soft Server.json + KodoTermThemes/windowsterminal/Solarized Darcula.json + KodoTermThemes/windowsterminal/Solarized Dark Higher Contrast.json + KodoTermThemes/windowsterminal/Solarized Dark Patched.json + KodoTermThemes/windowsterminal/Solarized Osaka Night.json + KodoTermThemes/windowsterminal/Sonokai.json + KodoTermThemes/windowsterminal/Spacedust.json + KodoTermThemes/windowsterminal/Spacegray Bright.json + KodoTermThemes/windowsterminal/Spacegray Eighties Dull.json + KodoTermThemes/windowsterminal/Spacegray Eighties.json + KodoTermThemes/windowsterminal/Spacegray.json + KodoTermThemes/windowsterminal/Spiderman.json + KodoTermThemes/windowsterminal/Spring.json + KodoTermThemes/windowsterminal/Square.json + KodoTermThemes/windowsterminal/Squirrelsong Dark.json + KodoTermThemes/windowsterminal/Srcery.json + KodoTermThemes/windowsterminal/Starlight.json + KodoTermThemes/windowsterminal/Sublette.json + KodoTermThemes/windowsterminal/Subliminal.json + KodoTermThemes/windowsterminal/Sugarplum.json + KodoTermThemes/windowsterminal/Sundried.json + KodoTermThemes/windowsterminal/Symfonic.json + KodoTermThemes/windowsterminal/Synthwave Alpha.json + KodoTermThemes/windowsterminal/Synthwave Everything.json + KodoTermThemes/windowsterminal/Synthwave.json + KodoTermThemes/windowsterminal/Tango Adapted.json + KodoTermThemes/windowsterminal/Tango Half Adapted.json + KodoTermThemes/windowsterminal/Tearout.json + KodoTermThemes/windowsterminal/Teerb.json + KodoTermThemes/windowsterminal/Terafox.json + KodoTermThemes/windowsterminal/Terminal Basic Dark.json + KodoTermThemes/windowsterminal/Terminal Basic.json + KodoTermThemes/windowsterminal/Thayer Bright.json + KodoTermThemes/windowsterminal/The Hulk.json + KodoTermThemes/windowsterminal/Tinacious Design Dark.json + KodoTermThemes/windowsterminal/Tinacious Design Light.json + KodoTermThemes/windowsterminal/TokyoNight Day.json + KodoTermThemes/windowsterminal/TokyoNight Moon.json + KodoTermThemes/windowsterminal/TokyoNight Night.json + KodoTermThemes/windowsterminal/TokyoNight Storm.json + KodoTermThemes/windowsterminal/TokyoNight.json + KodoTermThemes/windowsterminal/Tomorrow Night Blue.json + KodoTermThemes/windowsterminal/Tomorrow Night Bright.json + KodoTermThemes/windowsterminal/Tomorrow Night Burns.json + KodoTermThemes/windowsterminal/Tomorrow Night Eighties.json + KodoTermThemes/windowsterminal/Tomorrow Night.json + KodoTermThemes/windowsterminal/Tomorrow.json + KodoTermThemes/windowsterminal/Toy Chest.json + KodoTermThemes/windowsterminal/Treehouse.json + KodoTermThemes/windowsterminal/Twilight.json + KodoTermThemes/windowsterminal/Ubuntu.json + KodoTermThemes/windowsterminal/Ultra Dark.json + KodoTermThemes/windowsterminal/Ultra Violent.json + KodoTermThemes/windowsterminal/Under The Sea.json + KodoTermThemes/windowsterminal/Unikitty.json + KodoTermThemes/windowsterminal/Urple.json + KodoTermThemes/windowsterminal/Vague.json + KodoTermThemes/windowsterminal/Vaughn.json + KodoTermThemes/windowsterminal/Vercel.json + KodoTermThemes/windowsterminal/Vesper.json + KodoTermThemes/windowsterminal/Vibrant Ink.json + KodoTermThemes/windowsterminal/Vimbones.json + KodoTermThemes/windowsterminal/Violet Dark.json + KodoTermThemes/windowsterminal/Violet Light.json + KodoTermThemes/windowsterminal/Violite.json + KodoTermThemes/windowsterminal/Warm Neon.json + KodoTermThemes/windowsterminal/Wez.json + KodoTermThemes/windowsterminal/Whimsy.json + KodoTermThemes/windowsterminal/Wild Cherry.json + KodoTermThemes/windowsterminal/Wilmersdorf.json + KodoTermThemes/windowsterminal/Wombat.json + KodoTermThemes/windowsterminal/Wryan.json + KodoTermThemes/windowsterminal/Xcode Dark hc.json + KodoTermThemes/windowsterminal/Xcode Dark.json + KodoTermThemes/windowsterminal/Xcode Light hc.json + KodoTermThemes/windowsterminal/Xcode Light.json + KodoTermThemes/windowsterminal/Xcode WWDC.json + KodoTermThemes/windowsterminal/Zenbones Dark.json + KodoTermThemes/windowsterminal/Zenbones Light.json + KodoTermThemes/windowsterminal/Zenbones.json + KodoTermThemes/windowsterminal/Zenburn.json + KodoTermThemes/windowsterminal/Zenburned.json + KodoTermThemes/windowsterminal/Zenwritten Dark.json + KodoTermThemes/windowsterminal/Zenwritten Light.json + KodoTermThemes/windowsterminal/branch.json + KodoTermThemes/windowsterminal/iTerm2 Dark Background.json + KodoTermThemes/windowsterminal/iTerm2 Default.json + KodoTermThemes/windowsterminal/iTerm2 Light Background.json + KodoTermThemes/windowsterminal/iTerm2 Pastel Dark Background.json + KodoTermThemes/windowsterminal/iTerm2 Smoooooth.json + KodoTermThemes/windowsterminal/iTerm2 Solarized Dark.json + KodoTermThemes/windowsterminal/iTerm2 Solarized Light.json + KodoTermThemes/windowsterminal/iTerm2 Tango Dark.json + KodoTermThemes/windowsterminal/iTerm2 Tango Light.json + KodoTermThemes/windowsterminal/novmbr.json + KodoTermThemes/windowsterminal/owl.json + KodoTermThemes/windowsterminal/traffic.json + KodoTermThemes/windowsterminal/urban.json + + diff --git a/third_party/KodoTerm/KodoTermThemes/konsole/BlackOnLightYellow.colorscheme b/third_party/KodoTerm/KodoTermThemes/konsole/BlackOnLightYellow.colorscheme new file mode 100644 index 0000000..5150ea1 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/konsole/BlackOnLightYellow.colorscheme @@ -0,0 +1,94 @@ +[Background] +Color=255,255,221 + +[BackgroundIntense] +Color=255,255,221 + +[BackgroundFaint] +Color=255,255,221 + +[Color0] +Color=0,0,0 + +[Color0Intense] +Color=104,104,104 + +[Color0Faint] +Color=192,192,192 + +[Color1] +Color=178,24,24 + +[Color1Intense] +Color=255,84,84 + +[Color1Faint] +Color=224,142,142 + +[Color2] +Color=24,178,24 + +[Color2Intense] +Color=84,255,84 + +[Color2Faint] +Color=142,224,142 + +[Color3] +Color=178,104,24 + +[Color3Intense] +Color=255,255,84 + +[Color3Faint] +Color=224,224,142 + +[Color4] +Color=24,24,178 + +[Color4Intense] +Color=84,84,255 + +[Color4Faint] +Color=142,142,224 + +[Color5] +Color=178,24,178 + +[Color5Intense] +Color=255,84,255 + +[Color5Faint] +Color=224,142,224 + +[Color6] +Color=24,178,178 + +[Color6Intense] +Color=84,255,255 + +[Color6Faint] +Color=142,224,224 + +[Color7] +Color=178,178,178 + +[Color7Intense] +Color=255,255,255 + +[Color7Faint] +Color=142,142,142 + +[Foreground] +Color=0,0,0 + +[ForegroundIntense] +Bold=true +Color=0,0,0 + +[ForegroundFaint] +Color=0,0,0 + +[General] +Description=Black on Light Yellow +Opacity=1 diff --git a/third_party/KodoTerm/KodoTermThemes/konsole/BlackOnRandomLight.colorscheme b/third_party/KodoTerm/KodoTermThemes/konsole/BlackOnRandomLight.colorscheme new file mode 100644 index 0000000..ddfbf13 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/konsole/BlackOnRandomLight.colorscheme @@ -0,0 +1,104 @@ +[Background] +Color=247,247,214 +RandomHueRange=360 +RandomSaturationRange=25 +RandomLightnessRange=10 + +[BackgroundIntense] +Color=255,255,221 +RandomHueRange=360 +RandomSaturationRange=25 +RandomLightnessRange=10 + +[BackgroundFaint] +Color=247,247,214 +RandomHueRange=360 +RandomSaturationRange=25 +RandomLightnessRange=10 + +[Color0] +Color=0,0,0 + +[Color0Intense] +Color=104,104,104 + +[Color0Faint] +Color=192,192,192 + +[Color1] +Color=178,24,24 + +[Color1Intense] +Color=255,84,84 + +[Color1Faint] +Color=224,142,142 + +[Color2] +Color=24,178,24 + +[Color2Intense] +Color=84,255,84 + +[Color2Faint] +Color=142,224,142 + +[Color3] +Color=178,104,24 + +[Color3Intense] +Color=255,255,84 + +[Color3Faint] +Color=224,224,142 + +[Color4] +Color=24,24,178 + +[Color4Intense] +Color=84,84,255 + +[Color4Faint] +Color=142,142,224 + +[Color5] +Color=178,24,178 + +[Color5Intense] +Color=255,84,255 + +[Color5Faint] +Color=224,142,224 + +[Color6] +Color=24,178,178 + +[Color6Intense] +Color=84,255,255 + +[Color6Faint] +Color=142,224,224 + +[Color7] +Color=178,178,178 + +[Color7Intense] +Color=255,255,255 + +[Color7Faint] +Color=142,142,142 + +[Foreground] +Color=0,0,0 + +[ForegroundIntense] +Bold=true +Color=0,0,0 + +[ForegroundFaint] +Color=0,0,0 + +[General] +Description=Black on Random Light +ColorRandomization=true +Opacity=1 diff --git a/third_party/KodoTerm/KodoTermThemes/konsole/BlackOnWhite.colorscheme b/third_party/KodoTerm/KodoTermThemes/konsole/BlackOnWhite.colorscheme new file mode 100644 index 0000000..73cc3c8 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/konsole/BlackOnWhite.colorscheme @@ -0,0 +1,94 @@ +[Background] +Color=255,255,255 + +[BackgroundIntense] +Color=255,255,255 + +[BackgroundFaint] +Color=255,255,255 + +[Color0] +Color=0,0,0 + +[Color0Intense] +Color=104,104,104 + +[Color0Faint] +Color=192,192,192 + +[Color1] +Color=178,24,24 + +[Color1Intense] +Color=255,84,84 + +[Color1Faint] +Color=224,142,142 + +[Color2] +Color=24,178,24 + +[Color2Intense] +Color=84,255,84 + +[Color2Faint] +Color=142,224,142 + +[Color3] +Color=178,104,24 + +[Color3Intense] +Color=255,255,84 + +[Color3Faint] +Color=224,224,142 + +[Color4] +Color=24,24,178 + +[Color4Intense] +Color=84,84,255 + +[Color4Faint] +Color=142,142,224 + +[Color5] +Color=178,24,178 + +[Color5Intense] +Color=255,84,255 + +[Color5Faint] +Color=224,142,224 + +[Color6] +Color=24,178,178 + +[Color6Intense] +Color=84,255,255 + +[Color6Faint] +Color=142,224,224 + +[Color7] +Color=178,178,178 + +[Color7Intense] +Color=255,255,255 + +[Color7Faint] +Color=142,142,142 + +[Foreground] +Color=0,0,0 + +[ForegroundIntense] +Bold=true +Color=0,0,0 + +[ForegroundFaint] +Color=0,0,0 + +[General] +Description=Black on White +Opacity=1 diff --git a/third_party/KodoTerm/KodoTermThemes/konsole/BlueOnBlack.colorscheme b/third_party/KodoTerm/KodoTermThemes/konsole/BlueOnBlack.colorscheme new file mode 100644 index 0000000..55c8837 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/konsole/BlueOnBlack.colorscheme @@ -0,0 +1,94 @@ +[Background] +Color=0,0,0 + +[BackgroundIntense] +Color=0,0,0 + +[BackgroundFaint] +Color=0,0,0 + +[Color0] +Color=0,0,0 + +[Color0Intense] +Color=104,104,104 + +[Color0Faint] +Color=192,192,192 + +[Color1] +Color=250,0,0 + +[Color1Intense] +Color=75,93,255 + +[Color1Faint] +Color=250,0,0 + +[Color2] +Color=24,178,24 + +[Color2Intense] +Color=84,255,84 + +[Color2Faint] +Color=142,224,142 + +[Color3] +Color=178,104,24 + +[Color3Intense] +Color=255,255,84 + +[Color3Faint] +Color=224,224,142 + +[Color4] +Color=125,152,35 + +[Color4Intense] +Color=84,84,255 + +[Color4Faint] +Color=125,152,35 + +[Color5] +Color=225,30,225 + +[Color5Intense] +Color=255,84,255 + +[Color5Faint] +Color=175,29,175 + +[Color6] +Color=0,134,223 + +[Color6Intense] +Color=0,68,255 + +[Color6Faint] +Color=0,98,173 + +[Color7] +Color=255,255,255 + +[Color7Intense] +Color=50,50,50 + +[Color7Faint] +Color=200,200,200 + +[Foreground] +Color=0,119,255 + +[ForegroundIntense] +Bold=true +Color=23,74,240 + +[ForegroundFaint] +Color=0,90,195 + +[General] +Description=Blue on Black +Opacity=1 diff --git a/third_party/KodoTerm/KodoTermThemes/konsole/Breeze.colorscheme b/third_party/KodoTerm/KodoTermThemes/konsole/Breeze.colorscheme new file mode 100644 index 0000000..fac9eff --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/konsole/Breeze.colorscheme @@ -0,0 +1,94 @@ +[Background] +Color=35,38,39 + +[BackgroundFaint] +Color=49,54,59 + +[BackgroundIntense] +Color=0,0,0 + +[Color0] +Color=35,38,39 + +[Color0Faint] +Color=49,54,59 + +[Color0Intense] +Color=127,140,141 + +[Color1] +Color=237,21,21 + +[Color1Faint] +Color=120,50,40 + +[Color1Intense] +Color=192,57,43 + +[Color2] +Color=17,209,22 + +[Color2Faint] +Color=23,162,98 + +[Color2Intense] +Color=28,220,154 + +[Color3] +Color=246,116,0 + +[Color3Faint] +Color=182,86,25 + +[Color3Intense] +Color=253,188,75 + +[Color4] +Color=29,153,243 + +[Color4Faint] +Color=27,102,143 + +[Color4Intense] +Color=61,174,233 + +[Color5] +Color=155,89,182 + +[Color5Faint] +Color=97,74,115 + +[Color5Intense] +Color=142,68,173 + +[Color6] +Color=26,188,156 + +[Color6Faint] +Color=24,108,96 + +[Color6Intense] +Color=22,160,133 + +[Color7] +Color=252,252,252 + +[Color7Faint] +Color=99,104,109 + +[Color7Intense] +Color=255,255,255 + +[Foreground] +Color=252,252,252 + +[ForegroundFaint] +Color=239,240,241 + +[ForegroundIntense] +Color=61,174,233 + +[General] +Description=Breeze +Opacity=1 +Wallpaper= diff --git a/third_party/KodoTerm/KodoTermThemes/konsole/Campbell.colorscheme b/third_party/KodoTerm/KodoTermThemes/konsole/Campbell.colorscheme new file mode 100644 index 0000000..a723a6f --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/konsole/Campbell.colorscheme @@ -0,0 +1,100 @@ +[Background] +Color=12,12,12 + +[BackgroundFaint] +Color=44,44,44 + +[BackgroundIntense] +Color=0,0,0 + +[Color0] +Color=12,12,12 + +[Color0Faint] +Color=44,44,44 + +[Color0Intense] +Color=124,124,124 + +[Color1] +Color=197,15,31 + +[Color1Faint] +Color=150,11,25 + +[Color1Intense] +Color=231,72,86 + +[Color2] +Color=19,161,14 + +[Color2Faint] +Color=16,120,10 + +[Color2Intense] +Color=22,198,12 + +[Color3] +Color=193,156,0 + +[Color3Faint] +Color=150,120,0 + +[Color3Intense] +Color=249,241,165 + +[Color4] +Color=0,55,218 + +[Color4Faint] +Color=0,45,170 + +[Color4Intense] +Color=59,120,255 + +[Color5] +Color=136,23,152 + +[Color5Faint] +Color=106,18,120 + +[Color5Intense] +Color=180,0,158 + +[Color6] +Color=58,150,221 + +[Color6Faint] +Color=47,122,180 + +[Color6Intense] +Color=97,214,214 + +[Color7] +Color=204,204,204 + +[Color7Faint] +Color=170,170,170 + +[Color7Intense] +Color=242,242,242 + +[Foreground] +Color=204,204,204 + +[ForegroundFaint] +Color=170,170,170 + +[ForegroundIntense] +Color=255,255,255 + +[General] +Anchor=0.5,0.5 +Blur=false +ColorRandomization=false +Description=Campbell +FillStyle=Tile +Opacity=1 +Wallpaper= +WallpaperFlipType=NoFlip +WallpaperOpacity=1 diff --git a/third_party/KodoTerm/KodoTermThemes/konsole/DarkPastels.colorscheme b/third_party/KodoTerm/KodoTermThemes/konsole/DarkPastels.colorscheme new file mode 100644 index 0000000..6ae7cb5 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/konsole/DarkPastels.colorscheme @@ -0,0 +1,103 @@ +[Background] +Color=44,44,44 + +[BackgroundIntense] +Bold=true +Color=44,44,44 + +[BackgroundFaint] +Color=44,44,44 + +[Color0] +Color=63,63,63 + +[Color0Intense] +Bold=true +Color=112,144,128 + +[Color0Faint] +Color=52,52,52 + +[Color1] +Color=112,80,80 + +[Color1Intense] +Bold=true +Color=220,163,163 + +[Color1Faint] +Color=102,72,72 + +[Color2] +Color=96,180,138 + +[Color2Intense] +Bold=true +Color=114,213,163 + +[Color2Faint] +Color=87,163,124 + +[Color3] +Color=223,175,143 + +[Color3Intense] +Bold=true +Color=240,223,175 + +[Color3Faint] +Color=170,133,111 + +[Color4] +Color=154,184,215 + +[Color4Intense] +Bold=true +Color=148,191,243 + +[Color4Faint] +Color=117,141,161 + +[Color5] +Color=220,140,195 + +[Color5Intense] +Bold=true +Color=236,147,211 + +[Color5Faint] +Color=154,98,137 + +[Color6] +Color=140,208,211 + +[Color6Intense] +Bold=true +Color=147,224,227 + +[Color6Faint] +Color=107,159,161 + +[Color7] +Color=220,220,204 + +[Color7Intense] +Bold=true +Color=255,255,255 + +[Color7Faint] +Color=149,149,139 + +[Foreground] +Color=220,220,204 + +[ForegroundIntense] +Bold=true +Color=220,220,204 + +[ForegroundFaint] +Color=220,220,204 + +[General] +Description=Dark Pastels +Opacity=1 diff --git a/third_party/KodoTerm/KodoTermThemes/konsole/GreenOnBlack.colorscheme b/third_party/KodoTerm/KodoTermThemes/konsole/GreenOnBlack.colorscheme new file mode 100644 index 0000000..386ffdb --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/konsole/GreenOnBlack.colorscheme @@ -0,0 +1,94 @@ +[Background] +Color=0,0,0 + +[BackgroundIntense] +Color=0,0,0 + +[BackgroundFaint] +Color=0,0,0 + +[Color0] +Color=0,0,0 + +[Color0Intense] +Color=104,104,104 + +[Color0Faint] +Color=24,24,24 + +[Color1] +Color=250,75,75 + +[Color1Intense] +Color=255,84,84 + +[Color1Faint] +Color=101,25,25 + +[Color2] +Color=24,178,24 + +[Color2Intense] +Color=84,255,84 + +[Color2Faint] +Color=0,101,0 + +[Color3] +Color=178,104,24 + +[Color3Intense] +Color=255,255,84 + +[Color3Faint] +Color=101,74,0 + +[Color4] +Color=24,24,178 + +[Color4Intense] +Color=84,84,255 + +[Color4Faint] +Color=0,0,101 + +[Color5] +Color=225,30,225 + +[Color5Intense] +Color=255,84,255 + +[Color5Faint] +Color=95,5,95 + +[Color6] +Color=24,178,178 + +[Color6Intense] +Color=84,255,255 + +[Color6Faint] +Color=0,101,101 + +[Color7] +Color=178,178,178 + +[Color7Intense] +Color=255,255,255 + +[Color7Faint] +Color=101,101,101 + +[Foreground] +Color=24,240,24 + +[ForegroundIntense] +Bold=true +Color=24,240,24 + +[ForegroundFaint] +Color=18,200,18 + +[General] +Description=Green on Black +Opacity=1 diff --git a/third_party/KodoTerm/KodoTermThemes/konsole/Linux.colorscheme b/third_party/KodoTerm/KodoTermThemes/konsole/Linux.colorscheme new file mode 100644 index 0000000..56f672c --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/konsole/Linux.colorscheme @@ -0,0 +1,92 @@ +[Background] +Color=0,0,0 + +[BackgroundIntense] +Color=104,104,104 + +[BackgroundFaint] +Color=0,0,0 + +[Color0] +Color=0,0,0 + +[Color0Intense] +Color=104,104,104 + +[Color0Faint] +Color=24,24,24 + +[Color1] +Color=178,24,24 + +[Color1Intense] +Color=255,84,84 + +[Color1Faint] +Color=101,0,0 + +[Color2] +Color=24,178,24 + +[Color2Intense] +Color=84,255,84 + +[Color2Faint] +Color=0,101,0 + +[Color3] +Color=178,104,24 + +[Color3Intense] +Color=255,255,84 + +[Color3Faint] +Color=101,94,0 + +[Color4] +Color=24,24,178 + +[Color4Intense] +Color=84,84,255 + +[Color4Faint] +Color=0,0,101 + +[Color5] +Color=178,24,178 + +[Color5Intense] +Color=255,84,255 + +[Color5Faint] +Color=101,0,101 + +[Color6] +Color=24,178,178 + +[Color6Intense] +Color=84,255,255 + +[Color6Faint] +Color=0,101,101 + +[Color7] +Color=178,178,178 + +[Color7Intense] +Color=255,255,255 + +[Color7Faint] +Color=101,101,101 + +[Foreground] +Color=178,178,178 + +[ForegroundIntense] +Color=255,255,255 + +[ForegroundFaint] +Color=101,101,101 + +[General] +Description=Linux Colors diff --git a/third_party/KodoTerm/KodoTermThemes/konsole/RedOnBlack.colorscheme b/third_party/KodoTerm/KodoTermThemes/konsole/RedOnBlack.colorscheme new file mode 100644 index 0000000..11db26e --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/konsole/RedOnBlack.colorscheme @@ -0,0 +1,94 @@ +[Background] +Color=0,0,0 + +[BackgroundIntense] +Color=0,0,0 + +[BackgroundFaint] +Color=0,0,0 + +[Color0] +Color=0,0,0 + +[Color0Intense] +Color=104,104,104 + +[Color0Faint] +Color=24,24,24 + +[Color1] +Color=250,142,8 + +[Color1Intense] +Color=255,84,84 + +[Color1Faint] +Color=101,25,0 + +[Color2] +Color=24,178,24 + +[Color2Intense] +Color=84,255,84 + +[Color2Faint] +Color=0,101,0 + +[Color3] +Color=178,104,24 + +[Color3Intense] +Color=255,255,84 + +[Color3Faint] +Color=101,74,0 + +[Color4] +Color=30,71,152 + +[Color4Intense] +Color=84,84,255 + +[Color4Faint] +Color=0,24,102 + +[Color5] +Color=225,30,225 + +[Color5Intense] +Color=255,84,255 + +[Color5Faint] +Color=95,5,95 + +[Color6] +Color=0,134,223 + +[Color6Intense] +Color=255,0,4 + +[Color6Faint] +Color=0,94,163 + +[Color7] +Color=255,255,255 + +[Color7Intense] +Color=50,50,50 + +[Color7Faint] +Color=101,101,101 + +[Foreground] +Color=255,0,0 + +[ForegroundIntense] +Bold=true +Color=24,240,24 + +[ForegroundFaint] +Color=205,0,0 + +[General] +Description=Red on Black +Opacity=1 diff --git a/third_party/KodoTerm/KodoTermThemes/konsole/Solarized.colorscheme b/third_party/KodoTerm/KodoTermThemes/konsole/Solarized.colorscheme new file mode 100644 index 0000000..36529dd --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/konsole/Solarized.colorscheme @@ -0,0 +1,93 @@ +[Color0] +Color=7,54,66 + +[Color0Intense] +Color=0,43,54 + +[Color0Faint] +Color=6,48,59 + +[Color1] +Color=220,50,47 + +[Color1Intense] +Color=203,75,22 + +[Color1Faint] +Color=147,33,31 + +[Color2] +Color=133,153,0 + +[Color2Intense] +Color=88,110,117 + +[Color2Faint] +Color=94,106,0 + +[Color3] +Color=181,137,0 + +[Color3Intense] +Color=101,123,131 + +[Color3Faint] +Color=138,103,0 + +[Color4] +Color=38,139,210 + +[Color4Intense] +Color=131,148,150 + +[Color4Faint] +Color=20,77,115 + +[Color5] +Color=211,54,130 + +[Color5Intense] +Color=108,113,196 + +[Color5Faint] +Color=120,30,75 + +[Color6] +Color=42,161,152 + +[Color6Intense] +Color=147,161,161 + +[Color6Faint] +Color=24,94,88 + +[Color7] +Color=238,232,213 + +[Color7Intense] +Color=253,246,227 + +[Color7Faint] +Color=171,167,154 + +[Background] +Color=0,43,54 + +[BackgroundIntense] +Color=7,54,66 + +[BackgroundFaint] +Color=0,43,54 + +[Foreground] +Color=131,148,150 + +[ForegroundIntense] +Color=147,161,161 + +[ForegroundFaint] +Color=106,119,121 + +[General] +Description=Solarized +Opacity=1 diff --git a/third_party/KodoTerm/KodoTermThemes/konsole/SolarizedLight.colorscheme b/third_party/KodoTerm/KodoTermThemes/konsole/SolarizedLight.colorscheme new file mode 100644 index 0000000..cd19002 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/konsole/SolarizedLight.colorscheme @@ -0,0 +1,93 @@ +[Color0] +Color=7,54,66 + +[Color0Intense] +Color=0,43,54 + +[Color0Faint] +Color=8,65,80 + +[Color1] +Color=220,50,47 + +[Color1Intense] +Color=203,75,22 + +[Color1Faint] +Color=222,81,81 + +[Color2] +Color=133,153,0 + +[Color2Intense] +Color=88,110,117 + +[Color2Faint] +Color=153,168,39 + +[Color3] +Color=181,137,0 + +[Color3Intense] +Color=101,123,131 + +[Color3Faint] +Color=213,170,49 + +[Color4] +Color=38,139,210 + +[Color4Intense] +Color=131,148,150 + +[Color4Faint] +Color=80,173,226 + +[Color5] +Color=211,54,130 + +[Color5Intense] +Color=108,113,196 + +[Color5Faint] +Color=223,92,158 + +[Color6] +Color=42,161,152 + +[Color6Intense] +Color=147,161,161 + +[Color6Faint] +Color=78,211,200 + +[Color7] +Color=238,232,213 + +[Color7Intense] +Color=253,246,227 + +[Color7Faint] +Color=238,232,213 + +[Background] +Color=253,246,227 + +[BackgroundIntense] +Color=238,232,213 + +[BackgroundFaint] +Color=253,246,227 + +[Foreground] +Color=101,123,131 + +[ForegroundIntense] +Color=88,110,117 + +[ForegroundFaint] +Color=141,172,182 + +[General] +Description=Solarized Light +Opacity=1 diff --git a/third_party/KodoTerm/KodoTermThemes/konsole/WhiteOnBlack.colorscheme b/third_party/KodoTerm/KodoTermThemes/konsole/WhiteOnBlack.colorscheme new file mode 100644 index 0000000..c3d801d --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/konsole/WhiteOnBlack.colorscheme @@ -0,0 +1,94 @@ +[Background] +Color=0,0,0 + +[BackgroundIntense] +Color=0,0,0 + +[BackgroundFaint] +Color=0,0,0 + +[Color0] +Color=0,0,0 + +[Color0Intense] +Color=104,104,104 + +[Color0Faint] +Color=24,24,24 + +[Color1] +Color=178,24,24 + +[Color1Intense] +Color=255,84,84 + +[Color1Faint] +Color=101,0,0 + +[Color2] +Color=24,178,24 + +[Color2Intense] +Color=84,255,84 + +[Color2Faint] +Color=0,101,0 + +[Color3] +Color=178,104,24 + +[Color3Intense] +Color=255,255,84 + +[Color3Faint] +Color=101,74,0 + +[Color4] +Color=24,24,178 + +[Color4Intense] +Color=84,84,255 + +[Color4Faint] +Color=0,0,101 + +[Color5] +Color=178,24,178 + +[Color5Intense] +Color=255,84,255 + +[Color5Faint] +Color=95,5,95 + +[Color6] +Color=24,178,178 + +[Color6Intense] +Color=84,255,255 + +[Color6Faint] +Color=24,178,178 + +[Color7] +Color=178,178,178 + +[Color7Intense] +Color=255,255,255 + +[Color7Faint] +Color=101,101,101 + +[Foreground] +Color=255,255,255 + +[ForegroundIntense] +Bold=true +Color=255,255,255 + +[ForegroundFaint] +Color=255,255,255 + +[General] +Description=White on Black +Opacity=1 diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/0x96f.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/0x96f.json new file mode 100644 index 0000000..8508140 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/0x96f.json @@ -0,0 +1,23 @@ +{ + "name": "0x96f", + "black": "#262427", + "red": "#ff666d", + "green": "#b3e03a", + "yellow": "#ffc739", + "blue": "#00cde8", + "purple": "#a392e8", + "cyan": "#9deaf6", + "white": "#fcfcfa", + "brightBlack": "#545452", + "brightRed": "#ff7e83", + "brightGreen": "#bee55e", + "brightYellow": "#ffd05e", + "brightBlue": "#1bd5eb", + "brightPurple": "#b0a3eb", + "brightCyan": "#acedf8", + "brightWhite": "#fcfcfa", + "background": "#262427", + "foreground": "#fcfcfa", + "cursorColor": "#fcfcfa", + "selectionBackground": "#fcfcfa" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/12-bit Rainbow.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/12-bit Rainbow.json new file mode 100644 index 0000000..bd823dc --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/12-bit Rainbow.json @@ -0,0 +1,23 @@ +{ + "name": "12-bit Rainbow", + "black": "#000000", + "red": "#a03050", + "green": "#40d080", + "yellow": "#e09040", + "blue": "#3060b0", + "purple": "#603090", + "cyan": "#0090c0", + "white": "#dbded8", + "brightBlack": "#685656", + "brightRed": "#c06060", + "brightGreen": "#90d050", + "brightYellow": "#e0d000", + "brightBlue": "#00b0c0", + "brightPurple": "#801070", + "brightCyan": "#20b0c0", + "brightWhite": "#ffffff", + "background": "#040404", + "foreground": "#feffff", + "cursorColor": "#e0d000", + "selectionBackground": "#606060" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/3024 Day.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/3024 Day.json new file mode 100644 index 0000000..5cdc93d --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/3024 Day.json @@ -0,0 +1,23 @@ +{ + "name": "3024 Day", + "black": "#090300", + "red": "#db2d20", + "green": "#01a252", + "yellow": "#caba00", + "blue": "#01a0e4", + "purple": "#a16a94", + "cyan": "#8fbece", + "white": "#a5a2a2", + "brightBlack": "#5c5855", + "brightRed": "#dbaec3", + "brightGreen": "#3a3432", + "brightYellow": "#4a4543", + "brightBlue": "#807d7c", + "brightPurple": "#bcbbba", + "brightCyan": "#cdab53", + "brightWhite": "#f7f7f7", + "background": "#f7f7f7", + "foreground": "#4a4543", + "cursorColor": "#4a4543", + "selectionBackground": "#a5a2a2" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/3024 Night.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/3024 Night.json new file mode 100644 index 0000000..3fb2e37 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/3024 Night.json @@ -0,0 +1,23 @@ +{ + "name": "3024 Night", + "black": "#090300", + "red": "#db2d20", + "green": "#01a252", + "yellow": "#fded02", + "blue": "#01a0e4", + "purple": "#a16a94", + "cyan": "#b5e4f4", + "white": "#a5a2a2", + "brightBlack": "#5c5855", + "brightRed": "#e8bbd0", + "brightGreen": "#47413f", + "brightYellow": "#4a4543", + "brightBlue": "#807d7c", + "brightPurple": "#d6d5d4", + "brightCyan": "#cdab53", + "brightWhite": "#f7f7f7", + "background": "#090300", + "foreground": "#a5a2a2", + "cursorColor": "#a5a2a2", + "selectionBackground": "#4a4543" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Aardvark Blue.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Aardvark Blue.json new file mode 100644 index 0000000..94e8aab --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Aardvark Blue.json @@ -0,0 +1,23 @@ +{ + "name": "Aardvark Blue", + "black": "#191919", + "red": "#aa342e", + "green": "#4b8c0f", + "yellow": "#dbba00", + "blue": "#1370d3", + "purple": "#c43ac3", + "cyan": "#008eb0", + "white": "#bebebe", + "brightBlack": "#525252", + "brightRed": "#f05b50", + "brightGreen": "#95dc55", + "brightYellow": "#ffe763", + "brightBlue": "#60a4ec", + "brightPurple": "#e26be2", + "brightCyan": "#60b6cb", + "brightWhite": "#f7f7f7", + "background": "#102040", + "foreground": "#dddddd", + "cursorColor": "#007acc", + "selectionBackground": "#bfdbfe" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Abernathy.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Abernathy.json new file mode 100644 index 0000000..2410d3a --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Abernathy.json @@ -0,0 +1,23 @@ +{ + "name": "Abernathy", + "black": "#000000", + "red": "#cd0000", + "green": "#00cd00", + "yellow": "#cdcd00", + "blue": "#1093f5", + "purple": "#cd00cd", + "cyan": "#00cdcd", + "white": "#faebd7", + "brightBlack": "#404040", + "brightRed": "#ff0000", + "brightGreen": "#00ff00", + "brightYellow": "#ffff00", + "brightBlue": "#11b5f6", + "brightPurple": "#ff00ff", + "brightCyan": "#00ffff", + "brightWhite": "#ffffff", + "background": "#111416", + "foreground": "#eeeeec", + "cursorColor": "#bbbbbb", + "selectionBackground": "#eeeeec" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Adventure Time.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Adventure Time.json new file mode 100644 index 0000000..adca608 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Adventure Time.json @@ -0,0 +1,23 @@ +{ + "name": "Adventure Time", + "black": "#050404", + "red": "#bd0013", + "green": "#4ab118", + "yellow": "#e7741e", + "blue": "#0f4ac6", + "purple": "#665993", + "cyan": "#70a598", + "white": "#f8dcc0", + "brightBlack": "#4e7cbf", + "brightRed": "#fc5f5a", + "brightGreen": "#9eff6e", + "brightYellow": "#efc11a", + "brightBlue": "#1997c6", + "brightPurple": "#9b5953", + "brightCyan": "#c8faf4", + "brightWhite": "#f6f5fb", + "background": "#1f1d45", + "foreground": "#f8dcc0", + "cursorColor": "#efbf38", + "selectionBackground": "#706b4e" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Adventure.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Adventure.json new file mode 100644 index 0000000..cfea255 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Adventure.json @@ -0,0 +1,23 @@ +{ + "name": "Adventure", + "black": "#040404", + "red": "#d84a33", + "green": "#5da602", + "yellow": "#eebb6e", + "blue": "#417ab3", + "purple": "#e5c499", + "cyan": "#bdcfe5", + "white": "#dbded8", + "brightBlack": "#685656", + "brightRed": "#d76b42", + "brightGreen": "#99b52c", + "brightYellow": "#ffb670", + "brightBlue": "#97d7ef", + "brightPurple": "#aa7900", + "brightCyan": "#bdcfe5", + "brightWhite": "#e4d5c7", + "background": "#040404", + "foreground": "#feffff", + "cursorColor": "#feffff", + "selectionBackground": "#606060" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Adwaita Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Adwaita Dark.json new file mode 100644 index 0000000..10a9471 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Adwaita Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Adwaita Dark", + "black": "#241f31", + "red": "#c01c28", + "green": "#2ec27e", + "yellow": "#f5c211", + "blue": "#1e78e4", + "purple": "#9841bb", + "cyan": "#0ab9dc", + "white": "#c0bfbc", + "brightBlack": "#5e5c64", + "brightRed": "#ed333b", + "brightGreen": "#57e389", + "brightYellow": "#f8e45c", + "brightBlue": "#51a1ff", + "brightPurple": "#c061cb", + "brightCyan": "#4fd2fd", + "brightWhite": "#f6f5f4", + "background": "#1d1d20", + "foreground": "#ffffff", + "cursorColor": "#ffffff", + "selectionBackground": "#ffffff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Adwaita.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Adwaita.json new file mode 100644 index 0000000..b82b9ef --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Adwaita.json @@ -0,0 +1,23 @@ +{ + "name": "Adwaita", + "black": "#241f31", + "red": "#c01c28", + "green": "#2ec27e", + "yellow": "#e8b504", + "blue": "#1e78e4", + "purple": "#9841bb", + "cyan": "#0ab9dc", + "white": "#c0bfbc", + "brightBlack": "#5e5c64", + "brightRed": "#ed333b", + "brightGreen": "#4ad67c", + "brightYellow": "#d2be36", + "brightBlue": "#51a1ff", + "brightPurple": "#c061cb", + "brightCyan": "#4fd2fd", + "brightWhite": "#f6f5f4", + "background": "#ffffff", + "foreground": "#000000", + "cursorColor": "#000000", + "selectionBackground": "#c0bfbc" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Afterglow.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Afterglow.json new file mode 100644 index 0000000..e61c10d --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Afterglow.json @@ -0,0 +1,23 @@ +{ + "name": "Afterglow", + "black": "#151515", + "red": "#ac4142", + "green": "#7e8e50", + "yellow": "#e5b567", + "blue": "#6c99bb", + "purple": "#9f4e85", + "cyan": "#7dd6cf", + "white": "#d0d0d0", + "brightBlack": "#505050", + "brightRed": "#ac4142", + "brightGreen": "#7e8e50", + "brightYellow": "#e5b567", + "brightBlue": "#6c99bb", + "brightPurple": "#9f4e85", + "brightCyan": "#7dd6cf", + "brightWhite": "#f5f5f5", + "background": "#212121", + "foreground": "#d0d0d0", + "cursorColor": "#d0d0d0", + "selectionBackground": "#303030" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Aizen Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Aizen Dark.json new file mode 100644 index 0000000..5b30ff7 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Aizen Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Aizen Dark", + "black": "#1a1a1a", + "red": "#f08898", + "green": "#a4e09c", + "yellow": "#f5dea4", + "blue": "#84b4f8", + "purple": "#c8a2f4", + "cyan": "#90dcd0", + "white": "#d0d6f0", + "brightBlack": "#444444", + "brightRed": "#f08898", + "brightGreen": "#a4e09c", + "brightYellow": "#f5dea4", + "brightBlue": "#84b4f8", + "brightPurple": "#c8a2f4", + "brightCyan": "#90dcd0", + "brightWhite": "#ffffff", + "background": "#1a1a1a", + "foreground": "#d0d6f0", + "cursorColor": "#f8b080", + "selectionBackground": "#333333" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Aizen Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Aizen Light.json new file mode 100644 index 0000000..ce2a0c6 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Aizen Light.json @@ -0,0 +1,23 @@ +{ + "name": "Aizen Light", + "black": "#f0f2f6", + "red": "#d00c36", + "green": "#3e9e28", + "yellow": "#dd8c1a", + "blue": "#1c64f2", + "purple": "#8636ec", + "cyan": "#159096", + "white": "#4a4d66", + "brightBlack": "#adb2bc", + "brightRed": "#d00c36", + "brightGreen": "#3e9e28", + "brightYellow": "#dd8c1a", + "brightBlue": "#1c64f2", + "brightPurple": "#8636ec", + "brightCyan": "#159096", + "brightWhite": "#4a4d66", + "background": "#f0f2f6", + "foreground": "#4a4d66", + "cursorColor": "#fc6008", + "selectionBackground": "#bdc2cc" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Alabaster.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Alabaster.json new file mode 100644 index 0000000..60239e9 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Alabaster.json @@ -0,0 +1,23 @@ +{ + "name": "Alabaster", + "black": "#000000", + "red": "#aa3731", + "green": "#448c27", + "yellow": "#cb9000", + "blue": "#325cc0", + "purple": "#7a3e9d", + "cyan": "#0083b2", + "white": "#b7b7b7", + "brightBlack": "#777777", + "brightRed": "#f05050", + "brightGreen": "#60cb00", + "brightYellow": "#f2af50", + "brightBlue": "#007acc", + "brightPurple": "#e64ce6", + "brightCyan": "#00aacb", + "brightWhite": "#f7f7f7", + "background": "#f7f7f7", + "foreground": "#000000", + "cursorColor": "#007acc", + "selectionBackground": "#bfdbfe" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Alien Blood.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Alien Blood.json new file mode 100644 index 0000000..9044b75 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Alien Blood.json @@ -0,0 +1,23 @@ +{ + "name": "Alien Blood", + "black": "#112616", + "red": "#7f2b27", + "green": "#2f7e25", + "yellow": "#717f24", + "blue": "#2f6a7f", + "purple": "#47587f", + "cyan": "#327f77", + "white": "#647d75", + "brightBlack": "#3c4812", + "brightRed": "#e08009", + "brightGreen": "#18e000", + "brightYellow": "#bde000", + "brightBlue": "#00aae0", + "brightPurple": "#0058e0", + "brightCyan": "#00e0c4", + "brightWhite": "#73fa91", + "background": "#0f1610", + "foreground": "#637d75", + "cursorColor": "#73fa91", + "selectionBackground": "#1d4125" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Andromeda.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Andromeda.json new file mode 100644 index 0000000..b380053 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Andromeda.json @@ -0,0 +1,23 @@ +{ + "name": "Andromeda", + "black": "#000000", + "red": "#cd3131", + "green": "#05bc79", + "yellow": "#e5e512", + "blue": "#2472c8", + "purple": "#bc3fbc", + "cyan": "#0fa8cd", + "white": "#e5e5e5", + "brightBlack": "#666666", + "brightRed": "#cd3131", + "brightGreen": "#05bc79", + "brightYellow": "#e5e512", + "brightBlue": "#2472c8", + "brightPurple": "#bc3fbc", + "brightCyan": "#0fa8cd", + "brightWhite": "#e5e5e5", + "background": "#262a33", + "foreground": "#e5e5e5", + "cursorColor": "#f8f8f0", + "selectionBackground": "#5a5c62" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Apple Classic.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Apple Classic.json new file mode 100644 index 0000000..ea0adc4 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Apple Classic.json @@ -0,0 +1,23 @@ +{ + "name": "Apple Classic", + "black": "#000000", + "red": "#c91b00", + "green": "#00c200", + "yellow": "#c7c400", + "blue": "#1c3fe1", + "purple": "#ca30c7", + "cyan": "#00c5c7", + "white": "#c7c7c7", + "brightBlack": "#686868", + "brightRed": "#ff6e67", + "brightGreen": "#5ffa68", + "brightYellow": "#fffc67", + "brightBlue": "#6871ff", + "brightPurple": "#ff77ff", + "brightCyan": "#60fdff", + "brightWhite": "#ffffff", + "background": "#2c2b2b", + "foreground": "#d5a200", + "cursorColor": "#c7c7c7", + "selectionBackground": "#6b5b02" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Apple System Colors Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Apple System Colors Light.json new file mode 100644 index 0000000..0db08c4 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Apple System Colors Light.json @@ -0,0 +1,23 @@ +{ + "name": "Apple System Colors Light", + "black": "#1a1a1a", + "red": "#cc372e", + "green": "#26a439", + "yellow": "#cdac08", + "blue": "#0869cb", + "purple": "#9647bf", + "cyan": "#479ec2", + "white": "#98989d", + "brightBlack": "#464646", + "brightRed": "#ff453a", + "brightGreen": "#32d74b", + "brightYellow": "#e5bc00", + "brightBlue": "#0a84ff", + "brightPurple": "#bf5af2", + "brightCyan": "#69c9f2", + "brightWhite": "#ffffff", + "background": "#feffff", + "foreground": "#000000", + "cursorColor": "#98989d", + "selectionBackground": "#abd8ff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Apple System Colors.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Apple System Colors.json new file mode 100644 index 0000000..67ca60a --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Apple System Colors.json @@ -0,0 +1,23 @@ +{ + "name": "Apple System Colors", + "black": "#1a1a1a", + "red": "#cc372e", + "green": "#26a439", + "yellow": "#cdac08", + "blue": "#0869cb", + "purple": "#9647bf", + "cyan": "#479ec2", + "white": "#98989d", + "brightBlack": "#464646", + "brightRed": "#ff453a", + "brightGreen": "#32d74b", + "brightYellow": "#ffd60a", + "brightBlue": "#0a84ff", + "brightPurple": "#bf5af2", + "brightCyan": "#76d6ff", + "brightWhite": "#ffffff", + "background": "#1e1e1e", + "foreground": "#ffffff", + "cursorColor": "#98989d", + "selectionBackground": "#3f638b" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Arcoiris.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Arcoiris.json new file mode 100644 index 0000000..cd891a8 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Arcoiris.json @@ -0,0 +1,23 @@ +{ + "name": "Arcoiris", + "black": "#333333", + "red": "#da2700", + "green": "#12c258", + "yellow": "#ffc656", + "blue": "#518bfc", + "purple": "#e37bd9", + "cyan": "#63fad5", + "white": "#bab2b2", + "brightBlack": "#777777", + "brightRed": "#ffb9b9", + "brightGreen": "#e3f6aa", + "brightYellow": "#ffddaa", + "brightBlue": "#b3e8f3", + "brightPurple": "#cbbaf9", + "brightCyan": "#bcffc7", + "brightWhite": "#efefef", + "background": "#201f1e", + "foreground": "#eee4d9", + "cursorColor": "#872929", + "selectionBackground": "#25524a" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ardoise.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ardoise.json new file mode 100644 index 0000000..4b19d67 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ardoise.json @@ -0,0 +1,23 @@ +{ + "name": "Ardoise", + "black": "#2c2c2c", + "red": "#d3322d", + "green": "#588b35", + "yellow": "#fca93a", + "blue": "#2465c2", + "purple": "#7332b4", + "cyan": "#64e1b8", + "white": "#f7f7f7", + "brightBlack": "#535353", + "brightRed": "#fa5852", + "brightGreen": "#8dc252", + "brightYellow": "#ffea51", + "brightBlue": "#6ab5f8", + "brightPurple": "#be68ca", + "brightCyan": "#89ffdb", + "brightWhite": "#fefefe", + "background": "#1e1e1e", + "foreground": "#eaeaea", + "cursorColor": "#f7f7f7", + "selectionBackground": "#46515e" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Argonaut.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Argonaut.json new file mode 100644 index 0000000..f25618d --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Argonaut.json @@ -0,0 +1,23 @@ +{ + "name": "Argonaut", + "black": "#232323", + "red": "#ff000f", + "green": "#8ce10b", + "yellow": "#ffb900", + "blue": "#008df8", + "purple": "#6d43a6", + "cyan": "#00d8eb", + "white": "#ffffff", + "brightBlack": "#444444", + "brightRed": "#ff2740", + "brightGreen": "#abe15b", + "brightYellow": "#ffd242", + "brightBlue": "#0092ff", + "brightPurple": "#9a5feb", + "brightCyan": "#67fff0", + "brightWhite": "#ffffff", + "background": "#0e1019", + "foreground": "#fffaf4", + "cursorColor": "#ff0018", + "selectionBackground": "#002a3b" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Arthur.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Arthur.json new file mode 100644 index 0000000..302401a --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Arthur.json @@ -0,0 +1,23 @@ +{ + "name": "Arthur", + "black": "#3d352a", + "red": "#cd5c5c", + "green": "#86af80", + "yellow": "#e8ae5b", + "blue": "#6495ed", + "purple": "#deb887", + "cyan": "#b0c4de", + "white": "#bbaa99", + "brightBlack": "#554444", + "brightRed": "#cc5533", + "brightGreen": "#88aa22", + "brightYellow": "#ffa75d", + "brightBlue": "#87ceeb", + "brightPurple": "#996600", + "brightCyan": "#b0c4de", + "brightWhite": "#ddccbb", + "background": "#1c1c1c", + "foreground": "#ddeedd", + "cursorColor": "#e2bbef", + "selectionBackground": "#4d4d4d" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Atelier Sulphurpool.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Atelier Sulphurpool.json new file mode 100644 index 0000000..effe240 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Atelier Sulphurpool.json @@ -0,0 +1,23 @@ +{ + "name": "Atelier Sulphurpool", + "black": "#202746", + "red": "#c94922", + "green": "#ac9739", + "yellow": "#c08b30", + "blue": "#3d8fd1", + "purple": "#6679cc", + "cyan": "#22a2c9", + "white": "#979db4", + "brightBlack": "#6b7394", + "brightRed": "#c76b29", + "brightGreen": "#4f587c", + "brightYellow": "#5e6687", + "brightBlue": "#898ea4", + "brightPurple": "#dfe2f1", + "brightCyan": "#9c637a", + "brightWhite": "#f5f7ff", + "background": "#202746", + "foreground": "#979db4", + "cursorColor": "#979db4", + "selectionBackground": "#5e6687" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Atom One Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Atom One Dark.json new file mode 100644 index 0000000..d3224a5 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Atom One Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Atom One Dark", + "black": "#21252b", + "red": "#e06c75", + "green": "#98c379", + "yellow": "#e5c07b", + "blue": "#61afef", + "purple": "#c678dd", + "cyan": "#56b6c2", + "white": "#abb2bf", + "brightBlack": "#767676", + "brightRed": "#e06c75", + "brightGreen": "#98c379", + "brightYellow": "#e5c07b", + "brightBlue": "#61afef", + "brightPurple": "#c678dd", + "brightCyan": "#56b6c2", + "brightWhite": "#abb2bf", + "background": "#21252b", + "foreground": "#abb2bf", + "cursorColor": "#abb2bf", + "selectionBackground": "#323844" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Atom One Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Atom One Light.json new file mode 100644 index 0000000..16d4442 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Atom One Light.json @@ -0,0 +1,23 @@ +{ + "name": "Atom One Light", + "black": "#000000", + "red": "#de3e35", + "green": "#3f953a", + "yellow": "#d2b67c", + "blue": "#2f5af3", + "purple": "#950095", + "cyan": "#3f953a", + "white": "#bbbbbb", + "brightBlack": "#000000", + "brightRed": "#de3e35", + "brightGreen": "#3f953a", + "brightYellow": "#d2b67c", + "brightBlue": "#2f5af3", + "brightPurple": "#a00095", + "brightCyan": "#3f953a", + "brightWhite": "#ffffff", + "background": "#f9f9f9", + "foreground": "#2a2c33", + "cursorColor": "#bbbbbb", + "selectionBackground": "#ededed" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Atom.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Atom.json new file mode 100644 index 0000000..cf4b766 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Atom.json @@ -0,0 +1,23 @@ +{ + "name": "Atom", + "black": "#000000", + "red": "#fd5ff1", + "green": "#87c38a", + "yellow": "#ffd7b1", + "blue": "#85befd", + "purple": "#b9b6fc", + "cyan": "#85befd", + "white": "#e0e0e0", + "brightBlack": "#4c4c4c", + "brightRed": "#fd5ff1", + "brightGreen": "#94fa36", + "brightYellow": "#f5ffa8", + "brightBlue": "#96cbfe", + "brightPurple": "#b9b6fc", + "brightCyan": "#85befd", + "brightWhite": "#e0e0e0", + "background": "#161719", + "foreground": "#c5c8c6", + "cursorColor": "#d0d0d0", + "selectionBackground": "#444444" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Aura.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Aura.json new file mode 100644 index 0000000..6d7bd7a --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Aura.json @@ -0,0 +1,23 @@ +{ + "name": "Aura", + "black": "#110f18", + "red": "#ff6767", + "green": "#61ffca", + "yellow": "#ffca85", + "blue": "#a277ff", + "purple": "#a277ff", + "cyan": "#61ffca", + "white": "#edecee", + "brightBlack": "#4d4d4d", + "brightRed": "#ffca85", + "brightGreen": "#a277ff", + "brightYellow": "#ffca85", + "brightBlue": "#a277ff", + "brightPurple": "#a277ff", + "brightCyan": "#61ffca", + "brightWhite": "#edecee", + "background": "#15141b", + "foreground": "#edecee", + "cursorColor": "#a277ff", + "selectionBackground": "#a277ff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Aurora.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Aurora.json new file mode 100644 index 0000000..73ee68f --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Aurora.json @@ -0,0 +1,23 @@ +{ + "name": "Aurora", + "black": "#23262e", + "red": "#f0266f", + "green": "#8fd46d", + "yellow": "#ffe66d", + "blue": "#102ee4", + "purple": "#ee5d43", + "cyan": "#03d6b8", + "white": "#c74ded", + "brightBlack": "#4f545e", + "brightRed": "#f92672", + "brightGreen": "#8fd46d", + "brightYellow": "#ffe66d", + "brightBlue": "#03d6b8", + "brightPurple": "#ee5d43", + "brightCyan": "#03d6b8", + "brightWhite": "#c74ded", + "background": "#23262e", + "foreground": "#ffca28", + "cursorColor": "#ee5d43", + "selectionBackground": "#292e38" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ayu Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ayu Light.json new file mode 100644 index 0000000..b920959 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ayu Light.json @@ -0,0 +1,23 @@ +{ + "name": "Ayu Light", + "black": "#000000", + "red": "#ea6c6d", + "green": "#6cbf43", + "yellow": "#eca944", + "blue": "#3199e1", + "purple": "#9e75c7", + "cyan": "#46ba94", + "white": "#bababa", + "brightBlack": "#686868", + "brightRed": "#f07171", + "brightGreen": "#86b300", + "brightYellow": "#f2ae49", + "brightBlue": "#399ee6", + "brightPurple": "#a37acc", + "brightCyan": "#4cbf99", + "brightWhite": "#d1d1d1", + "background": "#f8f9fa", + "foreground": "#5c6166", + "cursorColor": "#ffaa33", + "selectionBackground": "#035bd6" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ayu Mirage.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ayu Mirage.json new file mode 100644 index 0000000..3e76217 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ayu Mirage.json @@ -0,0 +1,23 @@ +{ + "name": "Ayu Mirage", + "black": "#171b24", + "red": "#ed8274", + "green": "#87d96c", + "yellow": "#facc6e", + "blue": "#6dcbfa", + "purple": "#dabafa", + "cyan": "#90e1c6", + "white": "#c7c7c7", + "brightBlack": "#686868", + "brightRed": "#f28779", + "brightGreen": "#d5ff80", + "brightYellow": "#ffd173", + "brightBlue": "#73d0ff", + "brightPurple": "#dfbfff", + "brightCyan": "#95e6cb", + "brightWhite": "#ffffff", + "background": "#1f2430", + "foreground": "#cccac2", + "cursorColor": "#ffcc66", + "selectionBackground": "#409fff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ayu.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ayu.json new file mode 100644 index 0000000..778a05b --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ayu.json @@ -0,0 +1,23 @@ +{ + "name": "Ayu", + "black": "#11151c", + "red": "#ea6c73", + "green": "#7fd962", + "yellow": "#f9af4f", + "blue": "#53bdfa", + "purple": "#cda1fa", + "cyan": "#90e1c6", + "white": "#c7c7c7", + "brightBlack": "#686868", + "brightRed": "#f07178", + "brightGreen": "#aad94c", + "brightYellow": "#ffb454", + "brightBlue": "#59c2ff", + "brightPurple": "#d2a6ff", + "brightCyan": "#95e6cb", + "brightWhite": "#ffffff", + "background": "#0b0e14", + "foreground": "#bfbdb6", + "cursorColor": "#e6b450", + "selectionBackground": "#409fff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Banana Blueberry.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Banana Blueberry.json new file mode 100644 index 0000000..f0a7509 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Banana Blueberry.json @@ -0,0 +1,23 @@ +{ + "name": "Banana Blueberry", + "black": "#17141f", + "red": "#ff6b7f", + "green": "#00bd9c", + "yellow": "#e6c62f", + "blue": "#22e8df", + "purple": "#dc396a", + "cyan": "#56b6c2", + "white": "#f1f1f1", + "brightBlack": "#495162", + "brightRed": "#fe9ea1", + "brightGreen": "#98c379", + "brightYellow": "#f9e46b", + "brightBlue": "#91fff4", + "brightPurple": "#da70d6", + "brightCyan": "#bcf3ff", + "brightWhite": "#ffffff", + "background": "#191323", + "foreground": "#cccccc", + "cursorColor": "#e07d13", + "selectionBackground": "#220525" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Batman.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Batman.json new file mode 100644 index 0000000..db9aa2f --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Batman.json @@ -0,0 +1,23 @@ +{ + "name": "Batman", + "black": "#1b1d1e", + "red": "#e6dc44", + "green": "#c8be46", + "yellow": "#f4fd22", + "blue": "#737174", + "purple": "#747271", + "cyan": "#62605f", + "white": "#c6c5bf", + "brightBlack": "#505354", + "brightRed": "#fff78e", + "brightGreen": "#fff27d", + "brightYellow": "#feed6c", + "brightBlue": "#919495", + "brightPurple": "#9a9a9d", + "brightCyan": "#a3a3a6", + "brightWhite": "#dadbd6", + "background": "#1b1d1e", + "foreground": "#6f6f6f", + "cursorColor": "#fcef0c", + "selectionBackground": "#4d504c" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Belafonte Day.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Belafonte Day.json new file mode 100644 index 0000000..dfdb2fe --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Belafonte Day.json @@ -0,0 +1,23 @@ +{ + "name": "Belafonte Day", + "black": "#20111b", + "red": "#be100e", + "green": "#858162", + "yellow": "#d08b30", + "blue": "#426a79", + "purple": "#97522c", + "cyan": "#989a9c", + "white": "#968c83", + "brightBlack": "#5e5252", + "brightRed": "#be100e", + "brightGreen": "#858162", + "brightYellow": "#d08b30", + "brightBlue": "#426a79", + "brightPurple": "#97522c", + "brightCyan": "#989a9c", + "brightWhite": "#d5ccba", + "background": "#d5ccba", + "foreground": "#45373c", + "cursorColor": "#45373c", + "selectionBackground": "#968c83" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Belafonte Night.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Belafonte Night.json new file mode 100644 index 0000000..dced3ec --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Belafonte Night.json @@ -0,0 +1,23 @@ +{ + "name": "Belafonte Night", + "black": "#20111b", + "red": "#be100e", + "green": "#858162", + "yellow": "#eaa549", + "blue": "#426a79", + "purple": "#97522c", + "cyan": "#989a9c", + "white": "#968c83", + "brightBlack": "#5e5252", + "brightRed": "#be100e", + "brightGreen": "#858162", + "brightYellow": "#eaa549", + "brightBlue": "#426a79", + "brightPurple": "#97522c", + "brightCyan": "#989a9c", + "brightWhite": "#d5ccba", + "background": "#20111b", + "foreground": "#968c83", + "cursorColor": "#968c83", + "selectionBackground": "#45373c" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Birds Of Paradise.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Birds Of Paradise.json new file mode 100644 index 0000000..3f6e956 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Birds Of Paradise.json @@ -0,0 +1,23 @@ +{ + "name": "Birds Of Paradise", + "black": "#573d26", + "red": "#be2d26", + "green": "#6ba18a", + "yellow": "#e99d2a", + "blue": "#5a86ad", + "purple": "#ac80a6", + "cyan": "#74a6ad", + "white": "#e0dbb7", + "brightBlack": "#9b6c4a", + "brightRed": "#e84627", + "brightGreen": "#95d8ba", + "brightYellow": "#d0d150", + "brightBlue": "#b8d3ed", + "brightPurple": "#d19ecb", + "brightCyan": "#93cfd7", + "brightWhite": "#fff9d5", + "background": "#2a1f1d", + "foreground": "#e0dbb7", + "cursorColor": "#644a33", + "selectionBackground": "#563c27" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Bathory).json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Bathory).json new file mode 100644 index 0000000..8b5480c --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Bathory).json @@ -0,0 +1,23 @@ +{ + "name": "Black Metal (Bathory)", + "black": "#000000", + "red": "#5f8787", + "green": "#fbcb97", + "yellow": "#e78a53", + "blue": "#888888", + "purple": "#999999", + "cyan": "#aaaaaa", + "white": "#c1c1c1", + "brightBlack": "#404040", + "brightRed": "#5f8787", + "brightGreen": "#fbcb97", + "brightYellow": "#e78a53", + "brightBlue": "#888888", + "brightPurple": "#999999", + "brightCyan": "#aaaaaa", + "brightWhite": "#c1c1c1", + "background": "#000000", + "foreground": "#c1c1c1", + "cursorColor": "#c1c1c1", + "selectionBackground": "#c1c1c1" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Burzum).json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Burzum).json new file mode 100644 index 0000000..102518a --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Burzum).json @@ -0,0 +1,23 @@ +{ + "name": "Black Metal (Burzum)", + "black": "#000000", + "red": "#5f8787", + "green": "#ddeecc", + "yellow": "#99bbaa", + "blue": "#888888", + "purple": "#999999", + "cyan": "#aaaaaa", + "white": "#c1c1c1", + "brightBlack": "#404040", + "brightRed": "#5f8787", + "brightGreen": "#ddeecc", + "brightYellow": "#99bbaa", + "brightBlue": "#888888", + "brightPurple": "#999999", + "brightCyan": "#aaaaaa", + "brightWhite": "#c1c1c1", + "background": "#000000", + "foreground": "#c1c1c1", + "cursorColor": "#c1c1c1", + "selectionBackground": "#c1c1c1" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Dark Funeral).json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Dark Funeral).json new file mode 100644 index 0000000..5f5a209 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Dark Funeral).json @@ -0,0 +1,23 @@ +{ + "name": "Black Metal (Dark Funeral)", + "black": "#000000", + "red": "#5f8787", + "green": "#d0dfee", + "yellow": "#5f81a5", + "blue": "#888888", + "purple": "#999999", + "cyan": "#aaaaaa", + "white": "#c1c1c1", + "brightBlack": "#404040", + "brightRed": "#5f8787", + "brightGreen": "#d0dfee", + "brightYellow": "#5f81a5", + "brightBlue": "#888888", + "brightPurple": "#999999", + "brightCyan": "#aaaaaa", + "brightWhite": "#c1c1c1", + "background": "#000000", + "foreground": "#c1c1c1", + "cursorColor": "#c1c1c1", + "selectionBackground": "#c1c1c1" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Gorgoroth).json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Gorgoroth).json new file mode 100644 index 0000000..e4832f4 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Gorgoroth).json @@ -0,0 +1,23 @@ +{ + "name": "Black Metal (Gorgoroth)", + "black": "#000000", + "red": "#5f8787", + "green": "#9b8d7f", + "yellow": "#8c7f70", + "blue": "#888888", + "purple": "#999999", + "cyan": "#aaaaaa", + "white": "#c1c1c1", + "brightBlack": "#404040", + "brightRed": "#5f8787", + "brightGreen": "#9b8d7f", + "brightYellow": "#8c7f70", + "brightBlue": "#888888", + "brightPurple": "#999999", + "brightCyan": "#aaaaaa", + "brightWhite": "#c1c1c1", + "background": "#000000", + "foreground": "#c1c1c1", + "cursorColor": "#c1c1c1", + "selectionBackground": "#c1c1c1" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Immortal).json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Immortal).json new file mode 100644 index 0000000..2603a2a --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Immortal).json @@ -0,0 +1,23 @@ +{ + "name": "Black Metal (Immortal)", + "black": "#000000", + "red": "#5f8787", + "green": "#7799bb", + "yellow": "#556677", + "blue": "#888888", + "purple": "#999999", + "cyan": "#aaaaaa", + "white": "#c1c1c1", + "brightBlack": "#404040", + "brightRed": "#5f8787", + "brightGreen": "#7799bb", + "brightYellow": "#556677", + "brightBlue": "#888888", + "brightPurple": "#999999", + "brightCyan": "#aaaaaa", + "brightWhite": "#c1c1c1", + "background": "#000000", + "foreground": "#c1c1c1", + "cursorColor": "#c1c1c1", + "selectionBackground": "#c1c1c1" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Khold).json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Khold).json new file mode 100644 index 0000000..28aea17 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Khold).json @@ -0,0 +1,23 @@ +{ + "name": "Black Metal (Khold)", + "black": "#000000", + "red": "#5f8787", + "green": "#eceee3", + "yellow": "#974b46", + "blue": "#888888", + "purple": "#999999", + "cyan": "#aaaaaa", + "white": "#c1c1c1", + "brightBlack": "#404040", + "brightRed": "#5f8787", + "brightGreen": "#eceee3", + "brightYellow": "#974b46", + "brightBlue": "#888888", + "brightPurple": "#999999", + "brightCyan": "#aaaaaa", + "brightWhite": "#c1c1c1", + "background": "#000000", + "foreground": "#c1c1c1", + "cursorColor": "#c1c1c1", + "selectionBackground": "#c1c1c1" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Marduk).json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Marduk).json new file mode 100644 index 0000000..b103075 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Marduk).json @@ -0,0 +1,23 @@ +{ + "name": "Black Metal (Marduk)", + "black": "#000000", + "red": "#5f8787", + "green": "#a5aaa7", + "yellow": "#626b67", + "blue": "#888888", + "purple": "#999999", + "cyan": "#aaaaaa", + "white": "#c1c1c1", + "brightBlack": "#404040", + "brightRed": "#5f8787", + "brightGreen": "#a5aaa7", + "brightYellow": "#626b67", + "brightBlue": "#888888", + "brightPurple": "#999999", + "brightCyan": "#aaaaaa", + "brightWhite": "#c1c1c1", + "background": "#000000", + "foreground": "#c1c1c1", + "cursorColor": "#c1c1c1", + "selectionBackground": "#c1c1c1" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Mayhem).json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Mayhem).json new file mode 100644 index 0000000..b326498 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Mayhem).json @@ -0,0 +1,23 @@ +{ + "name": "Black Metal (Mayhem)", + "black": "#000000", + "red": "#5f8787", + "green": "#f3ecd4", + "yellow": "#eecc6c", + "blue": "#888888", + "purple": "#999999", + "cyan": "#aaaaaa", + "white": "#c1c1c1", + "brightBlack": "#404040", + "brightRed": "#5f8787", + "brightGreen": "#f3ecd4", + "brightYellow": "#eecc6c", + "brightBlue": "#888888", + "brightPurple": "#999999", + "brightCyan": "#aaaaaa", + "brightWhite": "#c1c1c1", + "background": "#000000", + "foreground": "#c1c1c1", + "cursorColor": "#c1c1c1", + "selectionBackground": "#c1c1c1" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Nile).json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Nile).json new file mode 100644 index 0000000..5e28fa5 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Nile).json @@ -0,0 +1,23 @@ +{ + "name": "Black Metal (Nile)", + "black": "#000000", + "red": "#5f8787", + "green": "#aa9988", + "yellow": "#777755", + "blue": "#888888", + "purple": "#999999", + "cyan": "#aaaaaa", + "white": "#c1c1c1", + "brightBlack": "#404040", + "brightRed": "#5f8787", + "brightGreen": "#aa9988", + "brightYellow": "#777755", + "brightBlue": "#888888", + "brightPurple": "#999999", + "brightCyan": "#aaaaaa", + "brightWhite": "#c1c1c1", + "background": "#000000", + "foreground": "#c1c1c1", + "cursorColor": "#c1c1c1", + "selectionBackground": "#c1c1c1" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Venom).json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Venom).json new file mode 100644 index 0000000..40554b2 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal (Venom).json @@ -0,0 +1,23 @@ +{ + "name": "Black Metal (Venom)", + "black": "#000000", + "red": "#5f8787", + "green": "#f8f7f2", + "yellow": "#79241f", + "blue": "#888888", + "purple": "#999999", + "cyan": "#aaaaaa", + "white": "#c1c1c1", + "brightBlack": "#404040", + "brightRed": "#5f8787", + "brightGreen": "#f8f7f2", + "brightYellow": "#79241f", + "brightBlue": "#888888", + "brightPurple": "#999999", + "brightCyan": "#aaaaaa", + "brightWhite": "#c1c1c1", + "background": "#000000", + "foreground": "#c1c1c1", + "cursorColor": "#c1c1c1", + "selectionBackground": "#c1c1c1" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal.json new file mode 100644 index 0000000..844e0a2 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Black Metal.json @@ -0,0 +1,23 @@ +{ + "name": "Black Metal", + "black": "#000000", + "red": "#486e6f", + "green": "#dd9999", + "yellow": "#a06666", + "blue": "#888888", + "purple": "#999999", + "cyan": "#aaaaaa", + "white": "#c1c1c1", + "brightBlack": "#404040", + "brightRed": "#486e6f", + "brightGreen": "#dd9999", + "brightYellow": "#a06666", + "brightBlue": "#888888", + "brightPurple": "#999999", + "brightCyan": "#aaaaaa", + "brightWhite": "#c1c1c1", + "background": "#000000", + "foreground": "#c1c1c1", + "cursorColor": "#c1c1c1", + "selectionBackground": "#c1c1c1" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Blazer.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Blazer.json new file mode 100644 index 0000000..211f290 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Blazer.json @@ -0,0 +1,23 @@ +{ + "name": "Blazer", + "black": "#000000", + "red": "#b87a7a", + "green": "#7ab87a", + "yellow": "#b8b87a", + "blue": "#7a7ab8", + "purple": "#b87ab8", + "cyan": "#7ab8b8", + "white": "#d9d9d9", + "brightBlack": "#4c4c4c", + "brightRed": "#dbbdbd", + "brightGreen": "#bddbbd", + "brightYellow": "#dbdbbd", + "brightBlue": "#bdbddb", + "brightPurple": "#dbbddb", + "brightCyan": "#bddbdb", + "brightWhite": "#ffffff", + "background": "#0d1926", + "foreground": "#d9e6f2", + "cursorColor": "#d9e6f2", + "selectionBackground": "#c1ddff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Blue Berry Pie.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Blue Berry Pie.json new file mode 100644 index 0000000..0e1ab69 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Blue Berry Pie.json @@ -0,0 +1,23 @@ +{ + "name": "Blue Berry Pie", + "black": "#0a4c62", + "red": "#99246e", + "green": "#5cb1b3", + "yellow": "#eab9a8", + "blue": "#90a5bd", + "purple": "#9d54a7", + "cyan": "#7e83cc", + "white": "#f0e8d6", + "brightBlack": "#463c5d", + "brightRed": "#c87272", + "brightGreen": "#0a6c7e", + "brightYellow": "#7a3188", + "brightBlue": "#5f3d63", + "brightPurple": "#bc94b7", + "brightCyan": "#5e6071", + "brightWhite": "#0a6c7e", + "background": "#1c0c28", + "foreground": "#babab9", + "cursorColor": "#fcfad6", + "selectionBackground": "#606060" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Blue Dolphin.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Blue Dolphin.json new file mode 100644 index 0000000..c84dfb5 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Blue Dolphin.json @@ -0,0 +1,23 @@ +{ + "name": "Blue Dolphin", + "black": "#292d3e", + "red": "#ff8288", + "green": "#b4e88d", + "yellow": "#f4d69f", + "blue": "#82aaff", + "purple": "#e9c1ff", + "cyan": "#89ebff", + "white": "#d0d0d0", + "brightBlack": "#9094a4", + "brightRed": "#ff8b92", + "brightGreen": "#ddffa7", + "brightYellow": "#ffe585", + "brightBlue": "#9cc4ff", + "brightPurple": "#ddb0f6", + "brightCyan": "#a3f7ff", + "brightWhite": "#ffffff", + "background": "#006984", + "foreground": "#c5f2ff", + "cursorColor": "#ffcc00", + "selectionBackground": "#2baeca" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Blue Matrix.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Blue Matrix.json new file mode 100644 index 0000000..9c43a2c --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Blue Matrix.json @@ -0,0 +1,23 @@ +{ + "name": "Blue Matrix", + "black": "#101116", + "red": "#ff5680", + "green": "#00ff9c", + "yellow": "#fffc58", + "blue": "#00b0ff", + "purple": "#d57bff", + "cyan": "#76c1ff", + "white": "#c7c7c7", + "brightBlack": "#686868", + "brightRed": "#ff6e67", + "brightGreen": "#5ffa68", + "brightYellow": "#fffc67", + "brightBlue": "#6871ff", + "brightPurple": "#d682ec", + "brightCyan": "#60fdff", + "brightWhite": "#ffffff", + "background": "#101116", + "foreground": "#00a2ff", + "cursorColor": "#76ff9f", + "selectionBackground": "#c1deff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Bluloco Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Bluloco Dark.json new file mode 100644 index 0000000..4f7453f --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Bluloco Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Bluloco Dark", + "black": "#41444d", + "red": "#fc2f52", + "green": "#25a45c", + "yellow": "#ff936a", + "blue": "#3476ff", + "purple": "#7a82da", + "cyan": "#4483aa", + "white": "#cdd4e0", + "brightBlack": "#8f9aae", + "brightRed": "#ff6480", + "brightGreen": "#3fc56b", + "brightYellow": "#f9c859", + "brightBlue": "#10b1fe", + "brightPurple": "#ff78f8", + "brightCyan": "#5fb9bc", + "brightWhite": "#ffffff", + "background": "#282c34", + "foreground": "#b9c0cb", + "cursorColor": "#ffcc00", + "selectionBackground": "#b9c0ca" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Bluloco Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Bluloco Light.json new file mode 100644 index 0000000..50c83d3 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Bluloco Light.json @@ -0,0 +1,23 @@ +{ + "name": "Bluloco Light", + "black": "#373a41", + "red": "#d52753", + "green": "#23974a", + "yellow": "#df631c", + "blue": "#275fe4", + "purple": "#823ff1", + "cyan": "#27618d", + "white": "#babbc2", + "brightBlack": "#676a77", + "brightRed": "#ff6480", + "brightGreen": "#3cbc66", + "brightYellow": "#c5a332", + "brightBlue": "#0099e1", + "brightPurple": "#ce33c0", + "brightCyan": "#6d93bb", + "brightWhite": "#d3d3d3", + "background": "#f9f9f9", + "foreground": "#373a41", + "cursorColor": "#f32759", + "selectionBackground": "#daf0ff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Borland.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Borland.json new file mode 100644 index 0000000..d3864d4 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Borland.json @@ -0,0 +1,23 @@ +{ + "name": "Borland", + "black": "#4f4f4f", + "red": "#ff6c60", + "green": "#a8ff60", + "yellow": "#ffffb6", + "blue": "#96cbfe", + "purple": "#ff73fd", + "cyan": "#c6c5fe", + "white": "#eeeeee", + "brightBlack": "#7c7c7c", + "brightRed": "#ffb6b0", + "brightGreen": "#ceffac", + "brightYellow": "#ffffcc", + "brightBlue": "#b5dcff", + "brightPurple": "#ff9cfe", + "brightCyan": "#dfdffe", + "brightWhite": "#ffffff", + "background": "#0000a4", + "foreground": "#ffff4e", + "cursorColor": "#ffa560", + "selectionBackground": "#a4a4a4" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Box.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Box.json new file mode 100644 index 0000000..083dae3 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Box.json @@ -0,0 +1,23 @@ +{ + "name": "Box", + "black": "#000000", + "red": "#cc0403", + "green": "#19cb00", + "yellow": "#cecb00", + "blue": "#0d73cc", + "purple": "#cb1ed1", + "cyan": "#0dcdcd", + "white": "#dddddd", + "brightBlack": "#767676", + "brightRed": "#f2201f", + "brightGreen": "#23fd00", + "brightYellow": "#fffd00", + "brightBlue": "#1a8fff", + "brightPurple": "#fd28ff", + "brightCyan": "#14ffff", + "brightWhite": "#ffffff", + "background": "#141d2b", + "foreground": "#9fef00", + "cursorColor": "#9fef00", + "selectionBackground": "#a4b1cd" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Breadog.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Breadog.json new file mode 100644 index 0000000..3ccdcee --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Breadog.json @@ -0,0 +1,23 @@ +{ + "name": "Breadog", + "black": "#362c24", + "red": "#b10b00", + "green": "#007232", + "yellow": "#8b4c00", + "blue": "#005cb4", + "purple": "#9b0097", + "cyan": "#006a78", + "white": "#baa99d", + "brightBlack": "#514337", + "brightRed": "#de1100", + "brightGreen": "#008f40", + "brightYellow": "#ae6000", + "brightBlue": "#0074e1", + "brightPurple": "#c300bd", + "brightCyan": "#008697", + "brightWhite": "#eae1da", + "background": "#f1ebe6", + "foreground": "#362c24", + "cursorColor": "#362c24", + "selectionBackground": "#362c24" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Breeze.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Breeze.json new file mode 100644 index 0000000..87326de --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Breeze.json @@ -0,0 +1,23 @@ +{ + "name": "Breeze", + "black": "#31363b", + "red": "#ed1515", + "green": "#11d116", + "yellow": "#f67400", + "blue": "#1d99f3", + "purple": "#9b59b6", + "cyan": "#1abc9c", + "white": "#eff0f1", + "brightBlack": "#7f8c8d", + "brightRed": "#c0392b", + "brightGreen": "#1cdc9a", + "brightYellow": "#fdbc4b", + "brightBlue": "#3daee9", + "brightPurple": "#8e44ad", + "brightCyan": "#16a085", + "brightWhite": "#fcfcfc", + "background": "#31363b", + "foreground": "#eff0f1", + "cursorColor": "#eff0f1", + "selectionBackground": "#eff0f1" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Bright Lights.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Bright Lights.json new file mode 100644 index 0000000..014f1a0 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Bright Lights.json @@ -0,0 +1,23 @@ +{ + "name": "Bright Lights", + "black": "#191919", + "red": "#ff355b", + "green": "#b7e876", + "yellow": "#ffc251", + "blue": "#76d4ff", + "purple": "#ba76e7", + "cyan": "#6cbfb5", + "white": "#c2c8d7", + "brightBlack": "#4c4c4c", + "brightRed": "#ff355b", + "brightGreen": "#b7e876", + "brightYellow": "#ffc251", + "brightBlue": "#76d5ff", + "brightPurple": "#ba76e7", + "brightCyan": "#6cbfb5", + "brightWhite": "#c2c8d7", + "background": "#191919", + "foreground": "#b3c9d7", + "cursorColor": "#f34b00", + "selectionBackground": "#b3c9d7" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Broadcast.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Broadcast.json new file mode 100644 index 0000000..074c3d7 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Broadcast.json @@ -0,0 +1,23 @@ +{ + "name": "Broadcast", + "black": "#000000", + "red": "#da4939", + "green": "#519f50", + "yellow": "#ffd24a", + "blue": "#6d9cbe", + "purple": "#d0d0ff", + "cyan": "#6e9cbe", + "white": "#ffffff", + "brightBlack": "#585858", + "brightRed": "#ff7b6b", + "brightGreen": "#83d182", + "brightYellow": "#ffff7c", + "brightBlue": "#9fcef0", + "brightPurple": "#ffffff", + "brightCyan": "#a0cef0", + "brightWhite": "#ffffff", + "background": "#2b2b2b", + "foreground": "#e6e1dc", + "cursorColor": "#ffffff", + "selectionBackground": "#5a647e" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Brogrammer.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Brogrammer.json new file mode 100644 index 0000000..17c74e5 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Brogrammer.json @@ -0,0 +1,23 @@ +{ + "name": "Brogrammer", + "black": "#1f1f1f", + "red": "#f81118", + "green": "#2dc55e", + "yellow": "#ecba0f", + "blue": "#2a84d2", + "purple": "#4e5ab7", + "cyan": "#1081d6", + "white": "#d6dbe5", + "brightBlack": "#d6dbe5", + "brightRed": "#de352e", + "brightGreen": "#1dd361", + "brightYellow": "#f3bd09", + "brightBlue": "#1081d6", + "brightPurple": "#5350b9", + "brightCyan": "#0f7ddb", + "brightWhite": "#ffffff", + "background": "#131313", + "foreground": "#d6dbe5", + "cursorColor": "#b9b9b9", + "selectionBackground": "#1f1f1f" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Builtin Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Builtin Dark.json new file mode 100644 index 0000000..cb7ff23 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Builtin Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Builtin Dark", + "black": "#000000", + "red": "#bb0000", + "green": "#00bb00", + "yellow": "#bbbb00", + "blue": "#0d0dc8", + "purple": "#bb00bb", + "cyan": "#00bbbb", + "white": "#bbbbbb", + "brightBlack": "#555555", + "brightRed": "#ff5555", + "brightGreen": "#55ff55", + "brightYellow": "#ffff55", + "brightBlue": "#5555ff", + "brightPurple": "#ff55ff", + "brightCyan": "#55ffff", + "brightWhite": "#ffffff", + "background": "#000000", + "foreground": "#bbbbbb", + "cursorColor": "#bbbbbb", + "selectionBackground": "#b5d5ff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Builtin Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Builtin Light.json new file mode 100644 index 0000000..e9247a5 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Builtin Light.json @@ -0,0 +1,23 @@ +{ + "name": "Builtin Light", + "black": "#000000", + "red": "#bb0000", + "green": "#00bb00", + "yellow": "#bbbb00", + "blue": "#0000bb", + "purple": "#bb00bb", + "cyan": "#00bbbb", + "white": "#bbbbbb", + "brightBlack": "#555555", + "brightRed": "#ff5555", + "brightGreen": "#2fd92f", + "brightYellow": "#bfbf15", + "brightBlue": "#5555ff", + "brightPurple": "#ff55ff", + "brightCyan": "#22cccc", + "brightWhite": "#ffffff", + "background": "#ffffff", + "foreground": "#000000", + "cursorColor": "#000000", + "selectionBackground": "#b5d5ff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Builtin Pastel Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Builtin Pastel Dark.json new file mode 100644 index 0000000..28dd8bd --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Builtin Pastel Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Builtin Pastel Dark", + "black": "#4f4f4f", + "red": "#ff6c60", + "green": "#a8ff60", + "yellow": "#ffffb6", + "blue": "#96cbfe", + "purple": "#ff73fd", + "cyan": "#c6c5fe", + "white": "#eeeeee", + "brightBlack": "#7c7c7c", + "brightRed": "#ffb6b0", + "brightGreen": "#ceffac", + "brightYellow": "#ffffcc", + "brightBlue": "#b5dcff", + "brightPurple": "#ff9cfe", + "brightCyan": "#dfdffe", + "brightWhite": "#ffffff", + "background": "#000000", + "foreground": "#bbbbbb", + "cursorColor": "#ffa560", + "selectionBackground": "#363983" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Builtin Tango Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Builtin Tango Dark.json new file mode 100644 index 0000000..53a5321 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Builtin Tango Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Builtin Tango Dark", + "black": "#000000", + "red": "#cc0000", + "green": "#4e9a06", + "yellow": "#c4a000", + "blue": "#3465a4", + "purple": "#75507b", + "cyan": "#06989a", + "white": "#d3d7cf", + "brightBlack": "#555753", + "brightRed": "#ef2929", + "brightGreen": "#8ae234", + "brightYellow": "#fce94f", + "brightBlue": "#729fcf", + "brightPurple": "#ad7fa8", + "brightCyan": "#34e2e2", + "brightWhite": "#eeeeec", + "background": "#000000", + "foreground": "#ffffff", + "cursorColor": "#ffffff", + "selectionBackground": "#b5d5ff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Builtin Tango Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Builtin Tango Light.json new file mode 100644 index 0000000..b13d2ba --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Builtin Tango Light.json @@ -0,0 +1,23 @@ +{ + "name": "Builtin Tango Light", + "black": "#000000", + "red": "#cc0000", + "green": "#4e9a06", + "yellow": "#c4a000", + "blue": "#3465a4", + "purple": "#75507b", + "cyan": "#06989a", + "white": "#b9bdb5", + "brightBlack": "#555753", + "brightRed": "#ef2929", + "brightGreen": "#7dd527", + "brightYellow": "#d6c329", + "brightBlue": "#729fcf", + "brightPurple": "#ad7fa8", + "brightCyan": "#27d5d5", + "brightWhite": "#eeeeec", + "background": "#ffffff", + "foreground": "#000000", + "cursorColor": "#000000", + "selectionBackground": "#b5d5ff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/C64.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/C64.json new file mode 100644 index 0000000..d843aab --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/C64.json @@ -0,0 +1,23 @@ +{ + "name": "C64", + "black": "#090300", + "red": "#a2524c", + "green": "#55a049", + "yellow": "#bfce72", + "blue": "#6657b3", + "purple": "#984ca3", + "cyan": "#67b6bd", + "white": "#ffffff", + "brightBlack": "#000000", + "brightRed": "#a2524c", + "brightGreen": "#55a049", + "brightYellow": "#bfce72", + "brightBlue": "#6657b3", + "brightPurple": "#984ca3", + "brightCyan": "#67b6bd", + "brightWhite": "#f7f7f7", + "background": "#40318d", + "foreground": "#7869c4", + "cursorColor": "#7869c4", + "selectionBackground": "#7869c4" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/CGA.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/CGA.json new file mode 100644 index 0000000..3f07c95 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/CGA.json @@ -0,0 +1,23 @@ +{ + "name": "CGA", + "black": "#000000", + "red": "#aa0000", + "green": "#00aa00", + "yellow": "#aa5500", + "blue": "#0d0db7", + "purple": "#aa00aa", + "cyan": "#00aaaa", + "white": "#aaaaaa", + "brightBlack": "#555555", + "brightRed": "#ff5555", + "brightGreen": "#55ff55", + "brightYellow": "#ffff55", + "brightBlue": "#5555ff", + "brightPurple": "#ff55ff", + "brightCyan": "#55ffff", + "brightWhite": "#ffffff", + "background": "#000000", + "foreground": "#aaaaaa", + "cursorColor": "#b8b8b8", + "selectionBackground": "#c1deff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/CLRS.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/CLRS.json new file mode 100644 index 0000000..0178259 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/CLRS.json @@ -0,0 +1,23 @@ +{ + "name": "CLRS", + "black": "#000000", + "red": "#f8282a", + "green": "#328a5d", + "yellow": "#fa701d", + "blue": "#135cd0", + "purple": "#9f00bd", + "cyan": "#33c3c1", + "white": "#b3b3b3", + "brightBlack": "#555753", + "brightRed": "#fb0416", + "brightGreen": "#2cc631", + "brightYellow": "#e3bd0e", + "brightBlue": "#1670ff", + "brightPurple": "#e900b0", + "brightCyan": "#3ad5ce", + "brightWhite": "#eeeeec", + "background": "#ffffff", + "foreground": "#262626", + "cursorColor": "#62c6ef", + "selectionBackground": "#6fd3fc" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Calamity.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Calamity.json new file mode 100644 index 0000000..2610606 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Calamity.json @@ -0,0 +1,23 @@ +{ + "name": "Calamity", + "black": "#2f2833", + "red": "#fc644d", + "green": "#a5f69c", + "yellow": "#e9d7a5", + "blue": "#3b79c7", + "purple": "#f92672", + "cyan": "#74d3de", + "white": "#d5ced9", + "brightBlack": "#7e6c88", + "brightRed": "#fc644d", + "brightGreen": "#a5f69c", + "brightYellow": "#e9d7a5", + "brightBlue": "#3b79c7", + "brightPurple": "#f92672", + "brightCyan": "#74d3de", + "brightWhite": "#ffffff", + "background": "#2f2833", + "foreground": "#d5ced9", + "cursorColor": "#d5ced9", + "selectionBackground": "#7e6c88" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Carbonfox.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Carbonfox.json new file mode 100644 index 0000000..68160aa --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Carbonfox.json @@ -0,0 +1,23 @@ +{ + "name": "Carbonfox", + "black": "#282828", + "red": "#ee5396", + "green": "#25be6a", + "yellow": "#08bdba", + "blue": "#78a9ff", + "purple": "#be95ff", + "cyan": "#33b1ff", + "white": "#dfdfe0", + "brightBlack": "#484848", + "brightRed": "#f16da6", + "brightGreen": "#46c880", + "brightYellow": "#2dc7c4", + "brightBlue": "#8cb6ff", + "brightPurple": "#c8a5ff", + "brightCyan": "#52bdff", + "brightWhite": "#e4e4e5", + "background": "#161616", + "foreground": "#f2f4f8", + "cursorColor": "#f2f4f8", + "selectionBackground": "#2a2a2a" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Catppuccin Frappe.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Catppuccin Frappe.json new file mode 100644 index 0000000..058891f --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Catppuccin Frappe.json @@ -0,0 +1,23 @@ +{ + "name": "Catppuccin Frappe", + "black": "#51576d", + "red": "#e78284", + "green": "#a6d189", + "yellow": "#e5c890", + "blue": "#8caaee", + "purple": "#f4b8e4", + "cyan": "#81c8be", + "white": "#a5adce", + "brightBlack": "#626880", + "brightRed": "#e67172", + "brightGreen": "#8ec772", + "brightYellow": "#d9ba73", + "brightBlue": "#7b9ef0", + "brightPurple": "#f2a4db", + "brightCyan": "#5abfb5", + "brightWhite": "#b5bfe2", + "background": "#303446", + "foreground": "#c6d0f5", + "cursorColor": "#f2d5cf", + "selectionBackground": "#626880" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Catppuccin Latte.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Catppuccin Latte.json new file mode 100644 index 0000000..8c75f21 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Catppuccin Latte.json @@ -0,0 +1,23 @@ +{ + "name": "Catppuccin Latte", + "black": "#5c5f77", + "red": "#d20f39", + "green": "#40a02b", + "yellow": "#df8e1d", + "blue": "#1e66f5", + "purple": "#ea76cb", + "cyan": "#179299", + "white": "#acb0be", + "brightBlack": "#6c6f85", + "brightRed": "#de293e", + "brightGreen": "#49af3d", + "brightYellow": "#eea02d", + "brightBlue": "#456eff", + "brightPurple": "#fe85d8", + "brightCyan": "#2d9fa8", + "brightWhite": "#bcc0cc", + "background": "#eff1f5", + "foreground": "#4c4f69", + "cursorColor": "#dc8a78", + "selectionBackground": "#acb0be" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Catppuccin Macchiato.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Catppuccin Macchiato.json new file mode 100644 index 0000000..fc3cb56 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Catppuccin Macchiato.json @@ -0,0 +1,23 @@ +{ + "name": "Catppuccin Macchiato", + "black": "#494d64", + "red": "#ed8796", + "green": "#a6da95", + "yellow": "#eed49f", + "blue": "#8aadf4", + "purple": "#f5bde6", + "cyan": "#8bd5ca", + "white": "#a5adcb", + "brightBlack": "#5b6078", + "brightRed": "#ec7486", + "brightGreen": "#8ccf7f", + "brightYellow": "#e1c682", + "brightBlue": "#78a1f6", + "brightPurple": "#f2a9dd", + "brightCyan": "#63cbc0", + "brightWhite": "#b8c0e0", + "background": "#24273a", + "foreground": "#cad3f5", + "cursorColor": "#f4dbd6", + "selectionBackground": "#5b6078" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Catppuccin Mocha.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Catppuccin Mocha.json new file mode 100644 index 0000000..7b7f162 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Catppuccin Mocha.json @@ -0,0 +1,23 @@ +{ + "name": "Catppuccin Mocha", + "black": "#45475a", + "red": "#f38ba8", + "green": "#a6e3a1", + "yellow": "#f9e2af", + "blue": "#89b4fa", + "purple": "#f5c2e7", + "cyan": "#94e2d5", + "white": "#a6adc8", + "brightBlack": "#585b70", + "brightRed": "#f37799", + "brightGreen": "#89d88b", + "brightYellow": "#ebd391", + "brightBlue": "#74a8fc", + "brightPurple": "#f2aede", + "brightCyan": "#6bd7ca", + "brightWhite": "#bac2de", + "background": "#1e1e2e", + "foreground": "#cdd6f4", + "cursorColor": "#f5e0dc", + "selectionBackground": "#585b70" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Chalk.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Chalk.json new file mode 100644 index 0000000..11677c2 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Chalk.json @@ -0,0 +1,23 @@ +{ + "name": "Chalk", + "black": "#7d8b8f", + "red": "#b23a52", + "green": "#789b6a", + "yellow": "#b9ac4a", + "blue": "#2a7fac", + "purple": "#bd4f5a", + "cyan": "#44a799", + "white": "#d2d8d9", + "brightBlack": "#888888", + "brightRed": "#f24840", + "brightGreen": "#80c470", + "brightYellow": "#ffeb62", + "brightBlue": "#4196ff", + "brightPurple": "#fc5275", + "brightCyan": "#53cdbd", + "brightWhite": "#d2d8d9", + "background": "#2b2d2e", + "foreground": "#d2d8d9", + "cursorColor": "#708284", + "selectionBackground": "#e4e8ed" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Chalkboard.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Chalkboard.json new file mode 100644 index 0000000..718b6fd --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Chalkboard.json @@ -0,0 +1,23 @@ +{ + "name": "Chalkboard", + "black": "#000000", + "red": "#c37372", + "green": "#72c373", + "yellow": "#c2c372", + "blue": "#7372c3", + "purple": "#c372c2", + "cyan": "#72c2c3", + "white": "#d9d9d9", + "brightBlack": "#585858", + "brightRed": "#dbaaaa", + "brightGreen": "#aadbaa", + "brightYellow": "#dadbaa", + "brightBlue": "#aaaadb", + "brightPurple": "#dbaada", + "brightCyan": "#aadadb", + "brightWhite": "#ffffff", + "background": "#29262f", + "foreground": "#d9e6f2", + "cursorColor": "#d9e6f2", + "selectionBackground": "#073642" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Challenger Deep.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Challenger Deep.json new file mode 100644 index 0000000..c03aee1 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Challenger Deep.json @@ -0,0 +1,23 @@ +{ + "name": "Challenger Deep", + "black": "#141228", + "red": "#ff5458", + "green": "#62d196", + "yellow": "#ffb378", + "blue": "#65b2ff", + "purple": "#906cff", + "cyan": "#63f2f1", + "white": "#a6b3cc", + "brightBlack": "#565575", + "brightRed": "#ff8080", + "brightGreen": "#95ffa4", + "brightYellow": "#ffe9aa", + "brightBlue": "#91ddff", + "brightPurple": "#c991e1", + "brightCyan": "#aaffe4", + "brightWhite": "#cbe3e7", + "background": "#1e1c31", + "foreground": "#cbe1e7", + "cursorColor": "#fbfcfc", + "selectionBackground": "#cbe1e7" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Chester.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Chester.json new file mode 100644 index 0000000..00547a9 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Chester.json @@ -0,0 +1,23 @@ +{ + "name": "Chester", + "black": "#080200", + "red": "#fa5e5b", + "green": "#16c98d", + "yellow": "#ffc83f", + "blue": "#288ad6", + "purple": "#d34590", + "cyan": "#28ddde", + "white": "#e7e7e7", + "brightBlack": "#6f6b68", + "brightRed": "#fa5e5b", + "brightGreen": "#16c98d", + "brightYellow": "#feef6d", + "brightBlue": "#278ad6", + "brightPurple": "#d34590", + "brightCyan": "#27dede", + "brightWhite": "#ffffff", + "background": "#2c3643", + "foreground": "#ffffff", + "cursorColor": "#b4b1b1", + "selectionBackground": "#67747c" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ciapre.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ciapre.json new file mode 100644 index 0000000..ebafa4d --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ciapre.json @@ -0,0 +1,23 @@ +{ + "name": "Ciapre", + "black": "#181818", + "red": "#8e0d16", + "green": "#48513b", + "yellow": "#cc8b3f", + "blue": "#576d8c", + "purple": "#724d7c", + "cyan": "#5c4f4b", + "white": "#aea47f", + "brightBlack": "#555555", + "brightRed": "#ac3835", + "brightGreen": "#a6a75d", + "brightYellow": "#dcdf7c", + "brightBlue": "#3097c6", + "brightPurple": "#d33061", + "brightCyan": "#f3dbb2", + "brightWhite": "#f4f4f4", + "background": "#191c27", + "foreground": "#aea47a", + "cursorColor": "#92805b", + "selectionBackground": "#172539" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Citruszest.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Citruszest.json new file mode 100644 index 0000000..a2fec36 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Citruszest.json @@ -0,0 +1,23 @@ +{ + "name": "Citruszest", + "black": "#404040", + "red": "#ff5454", + "green": "#00cc7a", + "yellow": "#ffd400", + "blue": "#00bfff", + "purple": "#ff90fe", + "cyan": "#48d1cc", + "white": "#bfbfbf", + "brightBlack": "#808080", + "brightRed": "#ff1a75", + "brightGreen": "#1affa3", + "brightYellow": "#ffff00", + "brightBlue": "#33cfff", + "brightPurple": "#ffb2fe", + "brightCyan": "#00fff2", + "brightWhite": "#f9f9f9", + "background": "#121212", + "foreground": "#bfbfbf", + "cursorColor": "#666666", + "selectionBackground": "#ff8c00" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cobalt Neon.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cobalt Neon.json new file mode 100644 index 0000000..7698c57 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cobalt Neon.json @@ -0,0 +1,23 @@ +{ + "name": "Cobalt Neon", + "black": "#142631", + "red": "#ff2320", + "green": "#3ba5ff", + "yellow": "#e9e75c", + "blue": "#8ff586", + "purple": "#781aa0", + "cyan": "#8ff586", + "white": "#ba46b2", + "brightBlack": "#fff688", + "brightRed": "#d4312e", + "brightGreen": "#8ff586", + "brightYellow": "#e9f06d", + "brightBlue": "#3c7dd2", + "brightPurple": "#8230a7", + "brightCyan": "#6cbc67", + "brightWhite": "#8ff586", + "background": "#142838", + "foreground": "#8ff586", + "cursorColor": "#c4206f", + "selectionBackground": "#094fb1" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cobalt Next Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cobalt Next Dark.json new file mode 100644 index 0000000..5cd18da --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cobalt Next Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Cobalt Next Dark", + "black": "#262f37", + "red": "#f94967", + "green": "#8cc98f", + "yellow": "#ffc64c", + "blue": "#409dd4", + "purple": "#cba3c7", + "cyan": "#37b5b4", + "white": "#d7deea", + "brightBlack": "#62747f", + "brightRed": "#e47e8b", + "brightGreen": "#baddbb", + "brightYellow": "#ffdc91", + "brightBlue": "#7ac0eb", + "brightPurple": "#f3ccef", + "brightCyan": "#84e4e3", + "brightWhite": "#ffffff", + "background": "#0b1c24", + "foreground": "#d7deea", + "cursorColor": "#ffc64c", + "selectionBackground": "#37b5b4" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cobalt Next Minimal.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cobalt Next Minimal.json new file mode 100644 index 0000000..04a5149 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cobalt Next Minimal.json @@ -0,0 +1,23 @@ +{ + "name": "Cobalt Next Minimal", + "black": "#323d47", + "red": "#ff657a", + "green": "#8cc98f", + "yellow": "#ffc64c", + "blue": "#409dd4", + "purple": "#cba3c7", + "cyan": "#37b5b4", + "white": "#d7deea", + "brightBlack": "#62747f", + "brightRed": "#e47e8b", + "brightGreen": "#baddbb", + "brightYellow": "#ffdc91", + "brightBlue": "#7ac0eb", + "brightPurple": "#f3ccef", + "brightCyan": "#84e4e3", + "brightWhite": "#ffffff", + "background": "#0b1c24", + "foreground": "#d7deea", + "cursorColor": "#37b5b4", + "selectionBackground": "#37b5b4" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cobalt Next.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cobalt Next.json new file mode 100644 index 0000000..12f21f2 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cobalt Next.json @@ -0,0 +1,23 @@ +{ + "name": "Cobalt Next", + "black": "#000000", + "red": "#ff527b", + "green": "#8cc98f", + "yellow": "#ffc64c", + "blue": "#409dd4", + "purple": "#cba3c7", + "cyan": "#37b5b4", + "white": "#d7deea", + "brightBlack": "#62747f", + "brightRed": "#e47e8b", + "brightGreen": "#baddbb", + "brightYellow": "#ffdc91", + "brightBlue": "#7ac0eb", + "brightPurple": "#f3ccef", + "brightCyan": "#84e4e3", + "brightWhite": "#ffffff", + "background": "#162c35", + "foreground": "#d7deea", + "cursorColor": "#ffc64c", + "selectionBackground": "#4c5b67" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cobalt2.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cobalt2.json new file mode 100644 index 0000000..b137416 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cobalt2.json @@ -0,0 +1,23 @@ +{ + "name": "Cobalt2", + "black": "#000000", + "red": "#ff0000", + "green": "#38de21", + "yellow": "#ffe50a", + "blue": "#1460d2", + "purple": "#ff005d", + "cyan": "#00bbbb", + "white": "#bbbbbb", + "brightBlack": "#555555", + "brightRed": "#f40e17", + "brightGreen": "#3bd01d", + "brightYellow": "#edc809", + "brightBlue": "#5555ff", + "brightPurple": "#ff55ff", + "brightCyan": "#6ae3fa", + "brightWhite": "#ffffff", + "background": "#132738", + "foreground": "#ffffff", + "cursorColor": "#f0cc09", + "selectionBackground": "#18354f" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Coffee Theme.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Coffee Theme.json new file mode 100644 index 0000000..49696f7 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Coffee Theme.json @@ -0,0 +1,23 @@ +{ + "name": "Coffee Theme", + "black": "#000000", + "red": "#c91b00", + "green": "#00c200", + "yellow": "#adaa00", + "blue": "#0225c7", + "purple": "#ca30c7", + "cyan": "#00b8ba", + "white": "#a1a1a1", + "brightBlack": "#686868", + "brightRed": "#ff6e67", + "brightGreen": "#1fba28", + "brightYellow": "#b2af1b", + "brightBlue": "#6871ff", + "brightPurple": "#f26af2", + "brightCyan": "#20bdbf", + "brightWhite": "#ffffff", + "background": "#f5deb3", + "foreground": "#000000", + "cursorColor": "#a1a1a1", + "selectionBackground": "#c1deff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Crayon Pony Fish.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Crayon Pony Fish.json new file mode 100644 index 0000000..4324bc0 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Crayon Pony Fish.json @@ -0,0 +1,23 @@ +{ + "name": "Crayon Pony Fish", + "black": "#2b1b1d", + "red": "#91002b", + "green": "#579524", + "yellow": "#ab311b", + "blue": "#8c87b0", + "purple": "#692f50", + "cyan": "#e8a866", + "white": "#68525a", + "brightBlack": "#4a383b", + "brightRed": "#c5255d", + "brightGreen": "#8dff57", + "brightYellow": "#c8381d", + "brightBlue": "#cfc9ff", + "brightPurple": "#fc6cba", + "brightCyan": "#ffceaf", + "brightWhite": "#b0949d", + "background": "#150707", + "foreground": "#68525a", + "cursorColor": "#68525a", + "selectionBackground": "#2b1b1d" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cursor Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cursor Dark.json new file mode 100644 index 0000000..26b828e --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cursor Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Cursor Dark", + "black": "#2a2a2a", + "red": "#bf616a", + "green": "#a3be8c", + "yellow": "#ebcb8b", + "blue": "#81a1c1", + "purple": "#b48ead", + "cyan": "#88c0d0", + "white": "#d8dee9", + "brightBlack": "#505050", + "brightRed": "#bf616a", + "brightGreen": "#a3be8c", + "brightYellow": "#ebcb8b", + "brightBlue": "#81a1c1", + "brightPurple": "#b48ead", + "brightCyan": "#88c0d0", + "brightWhite": "#ffffff", + "background": "#141414", + "foreground": "#ffffff", + "cursorColor": "#ffffff", + "selectionBackground": "#303030" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cutie Pro.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cutie Pro.json new file mode 100644 index 0000000..81d60cc --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cutie Pro.json @@ -0,0 +1,23 @@ +{ + "name": "Cutie Pro", + "black": "#000000", + "red": "#f56e7f", + "green": "#bec975", + "yellow": "#f58669", + "blue": "#42d9c5", + "purple": "#d286b7", + "cyan": "#37cb8a", + "white": "#d5c3c3", + "brightBlack": "#88847f", + "brightRed": "#e5a1a3", + "brightGreen": "#e8d6a7", + "brightYellow": "#f1bb79", + "brightBlue": "#80c5de", + "brightPurple": "#b294bb", + "brightCyan": "#9dccbb", + "brightWhite": "#ffffff", + "background": "#181818", + "foreground": "#d5d0c9", + "cursorColor": "#efc4cd", + "selectionBackground": "#363636" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cyberdyne.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cyberdyne.json new file mode 100644 index 0000000..11d7c4b --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cyberdyne.json @@ -0,0 +1,23 @@ +{ + "name": "Cyberdyne", + "black": "#080808", + "red": "#ff8373", + "green": "#00c172", + "yellow": "#d2a700", + "blue": "#0071cf", + "purple": "#ff90fe", + "cyan": "#6bffdd", + "white": "#f1f1f1", + "brightBlack": "#484848", + "brightRed": "#ffc4be", + "brightGreen": "#d6fcba", + "brightYellow": "#fffed5", + "brightBlue": "#c2e3ff", + "brightPurple": "#ffb2fe", + "brightCyan": "#e6e7fe", + "brightWhite": "#ffffff", + "background": "#151144", + "foreground": "#00ff92", + "cursorColor": "#00ff9c", + "selectionBackground": "#454d96" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cyberpunk Scarlet Protocol.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cyberpunk Scarlet Protocol.json new file mode 100644 index 0000000..1035629 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cyberpunk Scarlet Protocol.json @@ -0,0 +1,23 @@ +{ + "name": "Cyberpunk Scarlet Protocol", + "black": "#101116", + "red": "#ff0051", + "green": "#01dc84", + "yellow": "#faf945", + "blue": "#0271b6", + "purple": "#c930c7", + "cyan": "#00c5c7", + "white": "#c7c7c7", + "brightBlack": "#686868", + "brightRed": "#ff6e67", + "brightGreen": "#60fa68", + "brightYellow": "#fffc67", + "brightBlue": "#6871ff", + "brightPurple": "#bd35ec", + "brightCyan": "#60fdff", + "brightWhite": "#ffffff", + "background": "#101116", + "foreground": "#e41951", + "cursorColor": "#76ff9f", + "selectionBackground": "#c1deff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cyberpunk.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cyberpunk.json new file mode 100644 index 0000000..4094ff3 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Cyberpunk.json @@ -0,0 +1,23 @@ +{ + "name": "Cyberpunk", + "black": "#000000", + "red": "#ff7092", + "green": "#00fbac", + "yellow": "#fffa6a", + "blue": "#00bfff", + "purple": "#df95ff", + "cyan": "#86cbfe", + "white": "#ffffff", + "brightBlack": "#595959", + "brightRed": "#ff8aa4", + "brightGreen": "#21f6bc", + "brightYellow": "#fff787", + "brightBlue": "#1bccfd", + "brightPurple": "#e6aefe", + "brightCyan": "#99d6fc", + "brightWhite": "#ffffff", + "background": "#332a57", + "foreground": "#e5e5e5", + "cursorColor": "#21f6bc", + "selectionBackground": "#c1deff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dark Modern.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dark Modern.json new file mode 100644 index 0000000..c66f134 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dark Modern.json @@ -0,0 +1,23 @@ +{ + "name": "Dark Modern", + "black": "#272727", + "red": "#f74949", + "green": "#2ea043", + "yellow": "#9e6a03", + "blue": "#0078d4", + "purple": "#d01273", + "cyan": "#1db4d6", + "white": "#cccccc", + "brightBlack": "#5d5d5d", + "brightRed": "#dc5452", + "brightGreen": "#23d18b", + "brightYellow": "#f5f543", + "brightBlue": "#3b8eea", + "brightPurple": "#d670d6", + "brightCyan": "#29b8db", + "brightWhite": "#e5e5e5", + "background": "#1f1f1f", + "foreground": "#cccccc", + "cursorColor": "#ffffff", + "selectionBackground": "#3a3d41" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dark Pastel.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dark Pastel.json new file mode 100644 index 0000000..ac91bba --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dark Pastel.json @@ -0,0 +1,23 @@ +{ + "name": "Dark Pastel", + "black": "#000000", + "red": "#ff5555", + "green": "#55ff55", + "yellow": "#ffff55", + "blue": "#5555ff", + "purple": "#ff55ff", + "cyan": "#55ffff", + "white": "#bbbbbb", + "brightBlack": "#555555", + "brightRed": "#ff5555", + "brightGreen": "#55ff55", + "brightYellow": "#ffff55", + "brightBlue": "#5555ff", + "brightPurple": "#ff55ff", + "brightCyan": "#55ffff", + "brightWhite": "#ffffff", + "background": "#000000", + "foreground": "#ffffff", + "cursorColor": "#bbbbbb", + "selectionBackground": "#b5d5ff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dark+.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dark+.json new file mode 100644 index 0000000..5bc6c12 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dark+.json @@ -0,0 +1,23 @@ +{ + "name": "Dark+", + "black": "#000000", + "red": "#cd3131", + "green": "#0dbc79", + "yellow": "#e5e510", + "blue": "#2472c8", + "purple": "#bc3fbc", + "cyan": "#11a8cd", + "white": "#e5e5e5", + "brightBlack": "#666666", + "brightRed": "#f14c4c", + "brightGreen": "#23d18b", + "brightYellow": "#f5f543", + "brightBlue": "#3b8eea", + "brightPurple": "#d670d6", + "brightCyan": "#29b8db", + "brightWhite": "#e5e5e5", + "background": "#1e1e1e", + "foreground": "#cccccc", + "cursorColor": "#ffffff", + "selectionBackground": "#3a3d41" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Darkermatrix.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Darkermatrix.json new file mode 100644 index 0000000..daa3daa --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Darkermatrix.json @@ -0,0 +1,23 @@ +{ + "name": "Darkermatrix", + "black": "#091013", + "red": "#1a4831", + "green": "#6fa64c", + "yellow": "#595900", + "blue": "#00cb6b", + "purple": "#4e375a", + "cyan": "#125459", + "white": "#1a4833", + "brightBlack": "#404040", + "brightRed": "#0d452a", + "brightGreen": "#90d762", + "brightYellow": "#e2e500", + "brightBlue": "#00ff87", + "brightPurple": "#4e375a", + "brightCyan": "#176c73", + "brightWhite": "#00381e", + "background": "#070c0e", + "foreground": "#35451a", + "cursorColor": "#444733", + "selectionBackground": "#0f191c" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Darkmatrix.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Darkmatrix.json new file mode 100644 index 0000000..07dd43a --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Darkmatrix.json @@ -0,0 +1,23 @@ +{ + "name": "Darkmatrix", + "black": "#091013", + "red": "#006536", + "green": "#6fa64c", + "yellow": "#7e8000", + "blue": "#2c9a84", + "purple": "#523a60", + "cyan": "#114d53", + "white": "#006536", + "brightBlack": "#404040", + "brightRed": "#00733d", + "brightGreen": "#90d762", + "brightYellow": "#e2e500", + "brightBlue": "#46d8b8", + "brightPurple": "#573d66", + "brightCyan": "#12545a", + "brightWhite": "#006536", + "background": "#070c0e", + "foreground": "#3e5715", + "cursorColor": "#9fa86e", + "selectionBackground": "#0f191c" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Darkside.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Darkside.json new file mode 100644 index 0000000..f0b9cc4 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Darkside.json @@ -0,0 +1,23 @@ +{ + "name": "Darkside", + "black": "#000000", + "red": "#e8341c", + "green": "#68c256", + "yellow": "#f2d42c", + "blue": "#1c98e8", + "purple": "#8e69c9", + "cyan": "#1c98e8", + "white": "#bababa", + "brightBlack": "#4c4c4c", + "brightRed": "#e05a4f", + "brightGreen": "#77b869", + "brightYellow": "#efd64b", + "brightBlue": "#387cd3", + "brightPurple": "#957bbe", + "brightCyan": "#3d97e2", + "brightWhite": "#bababa", + "background": "#222324", + "foreground": "#bababa", + "cursorColor": "#bbbbbb", + "selectionBackground": "#303333" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dawnfox.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dawnfox.json new file mode 100644 index 0000000..93c5b4a --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dawnfox.json @@ -0,0 +1,23 @@ +{ + "name": "Dawnfox", + "black": "#575279", + "red": "#b4637a", + "green": "#618774", + "yellow": "#ea9d34", + "blue": "#286983", + "purple": "#907aa9", + "cyan": "#56949f", + "white": "#b2b6bd", + "brightBlack": "#5f5695", + "brightRed": "#c26d85", + "brightGreen": "#629f81", + "brightYellow": "#eea846", + "brightBlue": "#2d81a3", + "brightPurple": "#9a80b9", + "brightCyan": "#5ca7b4", + "brightWhite": "#e6ebf3", + "background": "#faf4ed", + "foreground": "#575279", + "cursorColor": "#575279", + "selectionBackground": "#d0d8d8" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dayfox.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dayfox.json new file mode 100644 index 0000000..c11812c --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dayfox.json @@ -0,0 +1,23 @@ +{ + "name": "Dayfox", + "black": "#352c24", + "red": "#a5222f", + "green": "#396847", + "yellow": "#ac5402", + "blue": "#2848a9", + "purple": "#6e33ce", + "cyan": "#287980", + "white": "#bfb6ae", + "brightBlack": "#534c45", + "brightRed": "#b3434e", + "brightGreen": "#577f63", + "brightYellow": "#b86e28", + "brightBlue": "#4863b6", + "brightPurple": "#8452d5", + "brightCyan": "#488d93", + "brightWhite": "#f4ece6", + "background": "#f6f2ee", + "foreground": "#3d2b5a", + "cursorColor": "#3d2b5a", + "selectionBackground": "#e7d2be" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Deep.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Deep.json new file mode 100644 index 0000000..3afff2e --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Deep.json @@ -0,0 +1,23 @@ +{ + "name": "Deep", + "black": "#000000", + "red": "#d70005", + "green": "#1cd915", + "yellow": "#d9bd26", + "blue": "#5665ff", + "purple": "#b052da", + "cyan": "#50d2da", + "white": "#e0e0e0", + "brightBlack": "#535353", + "brightRed": "#fb0007", + "brightGreen": "#22ff18", + "brightYellow": "#fedc2b", + "brightBlue": "#9fa9ff", + "brightPurple": "#e09aff", + "brightCyan": "#8df9ff", + "brightWhite": "#ffffff", + "background": "#090909", + "foreground": "#cdcdcd", + "cursorColor": "#d0d0d0", + "selectionBackground": "#780002" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Desert.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Desert.json new file mode 100644 index 0000000..0e2d01a --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Desert.json @@ -0,0 +1,23 @@ +{ + "name": "Desert", + "black": "#4d4d4d", + "red": "#ff2b2b", + "green": "#98fb98", + "yellow": "#f0e68c", + "blue": "#cd853f", + "purple": "#ffdead", + "cyan": "#ffa0a0", + "white": "#f5deb3", + "brightBlack": "#626262", + "brightRed": "#ff5555", + "brightGreen": "#55ff55", + "brightYellow": "#ffff55", + "brightBlue": "#87ceff", + "brightPurple": "#ff55ff", + "brightCyan": "#ffd700", + "brightWhite": "#ffffff", + "background": "#333333", + "foreground": "#ffffff", + "cursorColor": "#00ff00", + "selectionBackground": "#b5d5ff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Detuned.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Detuned.json new file mode 100644 index 0000000..1935837 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Detuned.json @@ -0,0 +1,23 @@ +{ + "name": "Detuned", + "black": "#171717", + "red": "#fe4386", + "green": "#a6e32d", + "yellow": "#e6da73", + "blue": "#0094d9", + "purple": "#9b37ff", + "cyan": "#50b7d9", + "white": "#c7c7c7", + "brightBlack": "#686868", + "brightRed": "#fa80ac", + "brightGreen": "#bde371", + "brightYellow": "#fff27f", + "brightBlue": "#00beff", + "brightPurple": "#be9eff", + "brightCyan": "#5ed7ff", + "brightWhite": "#ffffff", + "background": "#000000", + "foreground": "#c7c7c7", + "cursorColor": "#c7c7c7", + "selectionBackground": "#c1deff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dimidium.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dimidium.json new file mode 100644 index 0000000..5f1857b --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dimidium.json @@ -0,0 +1,23 @@ +{ + "name": "Dimidium", + "black": "#000000", + "red": "#cf494c", + "green": "#60b442", + "yellow": "#db9c11", + "blue": "#0575d8", + "purple": "#af5ed2", + "cyan": "#1db6bb", + "white": "#bab7b6", + "brightBlack": "#817e7e", + "brightRed": "#ff643b", + "brightGreen": "#37e57b", + "brightYellow": "#fccd1a", + "brightBlue": "#688dfd", + "brightPurple": "#ed6fe9", + "brightCyan": "#32e0fb", + "brightWhite": "#dee3e4", + "background": "#141414", + "foreground": "#bab7b6", + "cursorColor": "#37e57b", + "selectionBackground": "#8db8e5" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dimmed Monokai.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dimmed Monokai.json new file mode 100644 index 0000000..01b918c --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dimmed Monokai.json @@ -0,0 +1,23 @@ +{ + "name": "Dimmed Monokai", + "black": "#3a3d43", + "red": "#be3f48", + "green": "#879a3b", + "yellow": "#c5a635", + "blue": "#4f76a1", + "purple": "#855c8d", + "cyan": "#578fa4", + "white": "#b9bcba", + "brightBlack": "#888987", + "brightRed": "#fb001f", + "brightGreen": "#0f722f", + "brightYellow": "#c47033", + "brightBlue": "#186de3", + "brightPurple": "#fb0067", + "brightCyan": "#2e706d", + "brightWhite": "#fdffb9", + "background": "#1f1f1f", + "foreground": "#b9bcba", + "cursorColor": "#f83e19", + "selectionBackground": "#2a2d32" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Django Reborn Again.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Django Reborn Again.json new file mode 100644 index 0000000..b4bd9c2 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Django Reborn Again.json @@ -0,0 +1,23 @@ +{ + "name": "Django Reborn Again", + "black": "#000000", + "red": "#fd6209", + "green": "#41a83e", + "yellow": "#ffe862", + "blue": "#245032", + "purple": "#f8f8f8", + "cyan": "#9df39f", + "white": "#ffffff", + "brightBlack": "#4c4c4c", + "brightRed": "#ff943b", + "brightGreen": "#73da70", + "brightYellow": "#ffff94", + "brightBlue": "#568264", + "brightPurple": "#ffffff", + "brightCyan": "#cfffd1", + "brightWhite": "#ffffff", + "background": "#051f14", + "foreground": "#dadedc", + "cursorColor": "#ffcc00", + "selectionBackground": "#203727" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Django Smooth.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Django Smooth.json new file mode 100644 index 0000000..b6c5250 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Django Smooth.json @@ -0,0 +1,23 @@ +{ + "name": "Django Smooth", + "black": "#000000", + "red": "#fd6209", + "green": "#41a83e", + "yellow": "#ffe862", + "blue": "#989898", + "purple": "#f8f8f8", + "cyan": "#9df39f", + "white": "#e8e8e7", + "brightBlack": "#727272", + "brightRed": "#ff943b", + "brightGreen": "#73da70", + "brightYellow": "#ffff94", + "brightBlue": "#cacaca", + "brightPurple": "#ffffff", + "brightCyan": "#cfffd1", + "brightWhite": "#ffffff", + "background": "#245032", + "foreground": "#f8f8f8", + "cursorColor": "#4c7e5c", + "selectionBackground": "#336442" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Django.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Django.json new file mode 100644 index 0000000..b7be9cd --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Django.json @@ -0,0 +1,23 @@ +{ + "name": "Django", + "black": "#000000", + "red": "#fd6209", + "green": "#41a83e", + "yellow": "#ffe862", + "blue": "#315d3f", + "purple": "#f8f8f8", + "cyan": "#9df39f", + "white": "#ffffff", + "brightBlack": "#585858", + "brightRed": "#ff943b", + "brightGreen": "#73da70", + "brightYellow": "#ffff94", + "brightBlue": "#568264", + "brightPurple": "#ffffff", + "brightCyan": "#cfffd1", + "brightWhite": "#ffffff", + "background": "#0b2f20", + "foreground": "#f8f8f8", + "cursorColor": "#336442", + "selectionBackground": "#245032" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Doom One.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Doom One.json new file mode 100644 index 0000000..d566434 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Doom One.json @@ -0,0 +1,23 @@ +{ + "name": "Doom One", + "black": "#000000", + "red": "#ff6c6b", + "green": "#98be65", + "yellow": "#ecbe7b", + "blue": "#a9a1e1", + "purple": "#c678dd", + "cyan": "#51afef", + "white": "#bbc2cf", + "brightBlack": "#595959", + "brightRed": "#ff6655", + "brightGreen": "#99bb66", + "brightYellow": "#ecbe7b", + "brightBlue": "#a9a1e1", + "brightPurple": "#c678dd", + "brightCyan": "#51afef", + "brightWhite": "#bfbfbf", + "background": "#282c34", + "foreground": "#bbc2cf", + "cursorColor": "#51afef", + "selectionBackground": "#42444b" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Doom Peacock.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Doom Peacock.json new file mode 100644 index 0000000..f5df9af --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Doom Peacock.json @@ -0,0 +1,23 @@ +{ + "name": "Doom Peacock", + "black": "#1c1f24", + "red": "#cb4b16", + "green": "#26a6a6", + "yellow": "#bcd42a", + "blue": "#2a6cc6", + "purple": "#a9a1e1", + "cyan": "#5699af", + "white": "#ede0ce", + "brightBlack": "#51504d", + "brightRed": "#ff5d38", + "brightGreen": "#98be65", + "brightYellow": "#e6f972", + "brightBlue": "#51afef", + "brightPurple": "#c678dd", + "brightCyan": "#46d9ff", + "brightWhite": "#dfdfdf", + "background": "#2b2a27", + "foreground": "#ede0ce", + "cursorColor": "#9c9c9d", + "selectionBackground": "#a60033" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dot Gov.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dot Gov.json new file mode 100644 index 0000000..6e41e12 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dot Gov.json @@ -0,0 +1,23 @@ +{ + "name": "Dot Gov", + "black": "#191919", + "red": "#bf091d", + "green": "#3d9751", + "yellow": "#f6bb34", + "blue": "#17b2e0", + "purple": "#7830b0", + "cyan": "#8bd2ed", + "white": "#ffffff", + "brightBlack": "#595959", + "brightRed": "#bf091d", + "brightGreen": "#3d9751", + "brightYellow": "#f6bb34", + "brightBlue": "#17b2e0", + "brightPurple": "#7830b0", + "brightCyan": "#8bd2ed", + "brightWhite": "#ffffff", + "background": "#262c35", + "foreground": "#ebebeb", + "cursorColor": "#d9002f", + "selectionBackground": "#1a4080" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dracula+.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dracula+.json new file mode 100644 index 0000000..70e088b --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dracula+.json @@ -0,0 +1,23 @@ +{ + "name": "Dracula+", + "black": "#21222c", + "red": "#ff5555", + "green": "#50fa7b", + "yellow": "#ffcb6b", + "blue": "#82aaff", + "purple": "#c792ea", + "cyan": "#8be9fd", + "white": "#f8f8f2", + "brightBlack": "#545454", + "brightRed": "#ff6e6e", + "brightGreen": "#69ff94", + "brightYellow": "#ffcb6b", + "brightBlue": "#d6acff", + "brightPurple": "#ff92df", + "brightCyan": "#a4ffff", + "brightWhite": "#f8f8f2", + "background": "#212121", + "foreground": "#f8f8f2", + "cursorColor": "#eceff4", + "selectionBackground": "#f8f8f2" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dracula.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dracula.json new file mode 100644 index 0000000..e23cab0 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Dracula.json @@ -0,0 +1,23 @@ +{ + "name": "Dracula", + "black": "#21222c", + "red": "#ff5555", + "green": "#50fa7b", + "yellow": "#f1fa8c", + "blue": "#bd93f9", + "purple": "#ff79c6", + "cyan": "#8be9fd", + "white": "#f8f8f2", + "brightBlack": "#6272a4", + "brightRed": "#ff6e6e", + "brightGreen": "#69ff94", + "brightYellow": "#ffffa5", + "brightBlue": "#d6acff", + "brightPurple": "#ff92df", + "brightCyan": "#a4ffff", + "brightWhite": "#ffffff", + "background": "#282a36", + "foreground": "#f8f8f2", + "cursorColor": "#f8f8f2", + "selectionBackground": "#44475a" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Duckbones.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Duckbones.json new file mode 100644 index 0000000..c0a87fd --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Duckbones.json @@ -0,0 +1,23 @@ +{ + "name": "Duckbones", + "black": "#0e101a", + "red": "#e03600", + "green": "#5dcd97", + "yellow": "#e39500", + "blue": "#00a3cb", + "purple": "#795ccc", + "cyan": "#00a3cb", + "white": "#ebefc0", + "brightBlack": "#444860", + "brightRed": "#ff4821", + "brightGreen": "#58db9e", + "brightYellow": "#f6a100", + "brightBlue": "#00b4e0", + "brightPurple": "#b3a1e6", + "brightCyan": "#00b4e0", + "brightWhite": "#b3b692", + "background": "#0e101a", + "foreground": "#ebefc0", + "cursorColor": "#edf2c2", + "selectionBackground": "#37382d" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Duotone Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Duotone Dark.json new file mode 100644 index 0000000..7db63cf --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Duotone Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Duotone Dark", + "black": "#1f1d27", + "red": "#d9393e", + "green": "#2dcd73", + "yellow": "#d9b76e", + "blue": "#ffc284", + "purple": "#de8d40", + "cyan": "#2488ff", + "white": "#b7a1ff", + "brightBlack": "#4e4a60", + "brightRed": "#d9393e", + "brightGreen": "#2dcd73", + "brightYellow": "#d9b76e", + "brightBlue": "#ffc284", + "brightPurple": "#de8d40", + "brightCyan": "#2488ff", + "brightWhite": "#eae5ff", + "background": "#1f1d27", + "foreground": "#b7a1ff", + "cursorColor": "#ff9839", + "selectionBackground": "#353147" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Duskfox.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Duskfox.json new file mode 100644 index 0000000..4d27704 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Duskfox.json @@ -0,0 +1,23 @@ +{ + "name": "Duskfox", + "black": "#393552", + "red": "#eb6f92", + "green": "#a3be8c", + "yellow": "#f6c177", + "blue": "#569fba", + "purple": "#c4a7e7", + "cyan": "#9ccfd8", + "white": "#e0def4", + "brightBlack": "#544d8a", + "brightRed": "#f083a2", + "brightGreen": "#b1d196", + "brightYellow": "#f9cb8c", + "brightBlue": "#65b1cd", + "brightPurple": "#ccb1ed", + "brightCyan": "#a6dae3", + "brightWhite": "#e2e0f7", + "background": "#232136", + "foreground": "#e0def4", + "cursorColor": "#e0def4", + "selectionBackground": "#433c59" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/ENCOM.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/ENCOM.json new file mode 100644 index 0000000..3230b21 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/ENCOM.json @@ -0,0 +1,23 @@ +{ + "name": "ENCOM", + "black": "#000000", + "red": "#9f0000", + "green": "#008b00", + "yellow": "#ffd000", + "blue": "#0081ff", + "purple": "#bc00ca", + "cyan": "#008b8b", + "white": "#bbbbbb", + "brightBlack": "#555555", + "brightRed": "#ff0000", + "brightGreen": "#00ee00", + "brightYellow": "#ffff00", + "brightBlue": "#0000ff", + "brightPurple": "#ff00ff", + "brightCyan": "#00cdcd", + "brightWhite": "#ffffff", + "background": "#000000", + "foreground": "#00a595", + "cursorColor": "#bbbbbb", + "selectionBackground": "#00a48c" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Earthsong.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Earthsong.json new file mode 100644 index 0000000..907cae9 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Earthsong.json @@ -0,0 +1,23 @@ +{ + "name": "Earthsong", + "black": "#121418", + "red": "#c94234", + "green": "#85c54c", + "yellow": "#f5ae2e", + "blue": "#1398b9", + "purple": "#d0633d", + "cyan": "#509552", + "white": "#e5c6aa", + "brightBlack": "#675f54", + "brightRed": "#ff645a", + "brightGreen": "#98e036", + "brightYellow": "#e0d561", + "brightBlue": "#5fdaff", + "brightPurple": "#ff9269", + "brightCyan": "#84f088", + "brightWhite": "#f6f7ec", + "background": "#292520", + "foreground": "#e5c7a9", + "cursorColor": "#f6f7ec", + "selectionBackground": "#121418" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Electron Highlighter.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Electron Highlighter.json new file mode 100644 index 0000000..aae9a2d --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Electron Highlighter.json @@ -0,0 +1,23 @@ +{ + "name": "Electron Highlighter", + "black": "#15161f", + "red": "#ff6c8d", + "green": "#00ffc3", + "yellow": "#ffd7a9", + "blue": "#77abff", + "purple": "#daa4f4", + "cyan": "#00fdff", + "white": "#778faf", + "brightBlack": "#4a6789", + "brightRed": "#ff6c8d", + "brightGreen": "#00ffc3", + "brightYellow": "#ffd7a9", + "brightBlue": "#77abff", + "brightPurple": "#daa4f4", + "brightCyan": "#00fdff", + "brightWhite": "#c3cee2", + "background": "#23283d", + "foreground": "#a5b6d4", + "cursorColor": "#a5b6d4", + "selectionBackground": "#25345a" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Elegant.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Elegant.json new file mode 100644 index 0000000..75625b4 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Elegant.json @@ -0,0 +1,23 @@ +{ + "name": "Elegant", + "black": "#0a1222", + "red": "#ff0257", + "green": "#85cc95", + "yellow": "#ffcb8b", + "blue": "#8dabe1", + "purple": "#c792eb", + "cyan": "#78ccf0", + "white": "#ffffff", + "brightBlack": "#575656", + "brightRed": "#ff0057", + "brightGreen": "#85cc95", + "brightYellow": "#ffcb8b", + "brightBlue": "#8dabe1", + "brightPurple": "#c792eb", + "brightCyan": "#3facef", + "brightWhite": "#ffffff", + "background": "#292b31", + "foreground": "#ced2d6", + "cursorColor": "#00beff", + "selectionBackground": "#d5d5d5" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Elemental.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Elemental.json new file mode 100644 index 0000000..5933071 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Elemental.json @@ -0,0 +1,23 @@ +{ + "name": "Elemental", + "black": "#3c3c30", + "red": "#98290f", + "green": "#479a43", + "yellow": "#7f7111", + "blue": "#497f7d", + "purple": "#7f4e2f", + "cyan": "#387f58", + "white": "#807974", + "brightBlack": "#555445", + "brightRed": "#e0502a", + "brightGreen": "#61e070", + "brightYellow": "#d69927", + "brightBlue": "#79d9d9", + "brightPurple": "#cd7c54", + "brightCyan": "#59d599", + "brightWhite": "#fff1e9", + "background": "#22211d", + "foreground": "#807a74", + "cursorColor": "#facb80", + "selectionBackground": "#413829" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Elementary.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Elementary.json new file mode 100644 index 0000000..e5f2ef7 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Elementary.json @@ -0,0 +1,23 @@ +{ + "name": "Elementary", + "black": "#242424", + "red": "#d71c15", + "green": "#5aa513", + "yellow": "#fdb40c", + "blue": "#134899", + "purple": "#e40038", + "cyan": "#2595e1", + "white": "#efefef", + "brightBlack": "#4b4b4b", + "brightRed": "#fc1c18", + "brightGreen": "#6bc219", + "brightYellow": "#fec80e", + "brightBlue": "#0955ff", + "brightPurple": "#fb0050", + "brightCyan": "#3ea8fc", + "brightWhite": "#8c00ec", + "background": "#181818", + "foreground": "#efefef", + "cursorColor": "#bbbbbb", + "selectionBackground": "#b5d5ff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Embark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Embark.json new file mode 100644 index 0000000..5262c42 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Embark.json @@ -0,0 +1,23 @@ +{ + "name": "Embark", + "black": "#1e1c31", + "red": "#f0719b", + "green": "#a1efd3", + "yellow": "#ffe9aa", + "blue": "#57c7ff", + "purple": "#c792ea", + "cyan": "#87dfeb", + "white": "#f8f8f2", + "brightBlack": "#585273", + "brightRed": "#f02e6e", + "brightGreen": "#2ce592", + "brightYellow": "#ffb378", + "brightBlue": "#1da0e2", + "brightPurple": "#a742ea", + "brightCyan": "#63f2f1", + "brightWhite": "#a6b3cc", + "background": "#1e1c31", + "foreground": "#eeffff", + "cursorColor": "#a1efd3", + "selectionBackground": "#fbfcfc" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Embers Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Embers Dark.json new file mode 100644 index 0000000..7afda30 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Embers Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Embers Dark", + "black": "#16130f", + "red": "#826d57", + "green": "#57826d", + "yellow": "#6d8257", + "blue": "#6d5782", + "purple": "#82576d", + "cyan": "#576d82", + "white": "#a39a90", + "brightBlack": "#5a5047", + "brightRed": "#828257", + "brightGreen": "#464039", + "brightYellow": "#50483f", + "brightBlue": "#8a8075", + "brightPurple": "#beb6ae", + "brightCyan": "#825757", + "brightWhite": "#dbd6d1", + "background": "#16130f", + "foreground": "#a39a90", + "cursorColor": "#a39a90", + "selectionBackground": "#433b32" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Espresso Libre.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Espresso Libre.json new file mode 100644 index 0000000..26e39c0 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Espresso Libre.json @@ -0,0 +1,23 @@ +{ + "name": "Espresso Libre", + "black": "#000000", + "red": "#cc0000", + "green": "#1a921c", + "yellow": "#f0e53a", + "blue": "#0066ff", + "purple": "#c5656b", + "cyan": "#06989a", + "white": "#d3d7cf", + "brightBlack": "#555753", + "brightRed": "#ef2929", + "brightGreen": "#9aff87", + "brightYellow": "#fffb5c", + "brightBlue": "#43a8ed", + "brightPurple": "#ff818a", + "brightCyan": "#34e2e2", + "brightWhite": "#eeeeec", + "background": "#2a211c", + "foreground": "#b8a898", + "cursorColor": "#ffffff", + "selectionBackground": "#c3dcff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Espresso.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Espresso.json new file mode 100644 index 0000000..e1c1d24 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Espresso.json @@ -0,0 +1,23 @@ +{ + "name": "Espresso", + "black": "#353535", + "red": "#d25252", + "green": "#a5c261", + "yellow": "#ffc66d", + "blue": "#6c99bb", + "purple": "#d197d9", + "cyan": "#bed6ff", + "white": "#eeeeec", + "brightBlack": "#606060", + "brightRed": "#f00c0c", + "brightGreen": "#c2e075", + "brightYellow": "#e1e48b", + "brightBlue": "#8ab7d9", + "brightPurple": "#efb5f7", + "brightCyan": "#dcf4ff", + "brightWhite": "#ffffff", + "background": "#323232", + "foreground": "#ffffff", + "cursorColor": "#d6d6d6", + "selectionBackground": "#5b5b5b" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Everblush.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Everblush.json new file mode 100644 index 0000000..ef067ef --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Everblush.json @@ -0,0 +1,23 @@ +{ + "name": "Everblush", + "black": "#232a2d", + "red": "#e57474", + "green": "#8ccf7e", + "yellow": "#e5c76b", + "blue": "#67b0e8", + "purple": "#c47fd5", + "cyan": "#6cbfbf", + "white": "#b3b9b8", + "brightBlack": "#464e50", + "brightRed": "#ef7e7e", + "brightGreen": "#96d988", + "brightYellow": "#f4d67a", + "brightBlue": "#71baf2", + "brightPurple": "#ce89df", + "brightCyan": "#67cbe7", + "brightWhite": "#bdc3c2", + "background": "#141b1e", + "foreground": "#dadada", + "cursorColor": "#dadada", + "selectionBackground": "#141b1e" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Everforest Dark Hard.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Everforest Dark Hard.json new file mode 100644 index 0000000..c8f71c7 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Everforest Dark Hard.json @@ -0,0 +1,23 @@ +{ + "name": "Everforest Dark Hard", + "black": "#7a8478", + "red": "#e67e80", + "green": "#a7c080", + "yellow": "#dbbc7f", + "blue": "#7fbbb3", + "purple": "#d699b6", + "cyan": "#83c092", + "white": "#f2efdf", + "brightBlack": "#a6b0a0", + "brightRed": "#f85552", + "brightGreen": "#8da101", + "brightYellow": "#dfa000", + "brightBlue": "#3a94c5", + "brightPurple": "#df69ba", + "brightCyan": "#35a77c", + "brightWhite": "#fffbef", + "background": "#1e2326", + "foreground": "#d3c6aa", + "cursorColor": "#e69875", + "selectionBackground": "#4c3743" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Everforest Light Med.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Everforest Light Med.json new file mode 100644 index 0000000..8b0f49d --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Everforest Light Med.json @@ -0,0 +1,23 @@ +{ + "name": "Everforest Light Med", + "black": "#7a8478", + "red": "#e67e80", + "green": "#9ab373", + "yellow": "#c1a266", + "blue": "#7fbbb3", + "purple": "#d699b6", + "cyan": "#83c092", + "white": "#b2af9f", + "brightBlack": "#a6b0a0", + "brightRed": "#f85552", + "brightGreen": "#8da101", + "brightYellow": "#dfa000", + "brightBlue": "#3a94c5", + "brightPurple": "#df69ba", + "brightCyan": "#35a77c", + "brightWhite": "#fffbef", + "background": "#efebd4", + "foreground": "#5c6a72", + "cursorColor": "#f57d26", + "selectionBackground": "#eaedc8" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Fahrenheit.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Fahrenheit.json new file mode 100644 index 0000000..ad2364d --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Fahrenheit.json @@ -0,0 +1,23 @@ +{ + "name": "Fahrenheit", + "black": "#1d1d1d", + "red": "#cda074", + "green": "#9e744d", + "yellow": "#fecf75", + "blue": "#7f0e0f", + "purple": "#734c4d", + "cyan": "#979797", + "white": "#ffffce", + "brightBlack": "#404040", + "brightRed": "#fecea0", + "brightGreen": "#cc734d", + "brightYellow": "#fd9f4d", + "brightBlue": "#cb4a05", + "brightPurple": "#4e739f", + "brightCyan": "#fed04d", + "brightWhite": "#ffffff", + "background": "#000000", + "foreground": "#ffffce", + "cursorColor": "#bbbbbb", + "selectionBackground": "#4e739f" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Fairyfloss.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Fairyfloss.json new file mode 100644 index 0000000..0e65bed --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Fairyfloss.json @@ -0,0 +1,23 @@ +{ + "name": "Fairyfloss", + "black": "#040303", + "red": "#f92672", + "green": "#c2ffdf", + "yellow": "#e6c000", + "blue": "#c2ffdf", + "purple": "#ffb8d1", + "cyan": "#c5a3ff", + "white": "#f8f8f0", + "brightBlack": "#6090cb", + "brightRed": "#ff857f", + "brightGreen": "#c2ffdf", + "brightYellow": "#ffea00", + "brightBlue": "#c2ffdf", + "brightPurple": "#ffb8d1", + "brightCyan": "#c5a3ff", + "brightWhite": "#f8f8f0", + "background": "#5a5475", + "foreground": "#f8f8f2", + "cursorColor": "#f8f8f0", + "selectionBackground": "#8077a8" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Farmhouse Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Farmhouse Dark.json new file mode 100644 index 0000000..a5d7036 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Farmhouse Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Farmhouse Dark", + "black": "#1d2027", + "red": "#ba0004", + "green": "#549d00", + "yellow": "#c87300", + "blue": "#0049e6", + "purple": "#9f1b61", + "cyan": "#1fb65c", + "white": "#e8e4e1", + "brightBlack": "#464d54", + "brightRed": "#eb0009", + "brightGreen": "#7ac100", + "brightYellow": "#ea9a00", + "brightBlue": "#006efe", + "brightPurple": "#bf3b7f", + "brightCyan": "#19e062", + "brightWhite": "#f4eef0", + "background": "#1d2027", + "foreground": "#e8e4e1", + "cursorColor": "#006efe", + "selectionBackground": "#4d5658" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Farmhouse Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Farmhouse Light.json new file mode 100644 index 0000000..302e3d7 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Farmhouse Light.json @@ -0,0 +1,23 @@ +{ + "name": "Farmhouse Light", + "black": "#1d2027", + "red": "#8d0003", + "green": "#3a7d00", + "yellow": "#a95600", + "blue": "#092ccd", + "purple": "#820046", + "cyan": "#229256", + "white": "#a8a4a1", + "brightBlack": "#394047", + "brightRed": "#eb0009", + "brightGreen": "#7ac100", + "brightYellow": "#ea9a00", + "brightBlue": "#006efe", + "brightPurple": "#bf3b7f", + "brightCyan": "#00c649", + "brightWhite": "#f4eef0", + "background": "#e8e4e1", + "foreground": "#1d2027", + "cursorColor": "#006efe", + "selectionBackground": "#b3b1aa" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Fideloper.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Fideloper.json new file mode 100644 index 0000000..d4dcaef --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Fideloper.json @@ -0,0 +1,23 @@ +{ + "name": "Fideloper", + "black": "#292f33", + "red": "#cb1e2d", + "green": "#edb8ac", + "yellow": "#b7ab9b", + "blue": "#2e78c2", + "purple": "#c0236f", + "cyan": "#309186", + "white": "#eae3ce", + "brightBlack": "#496068", + "brightRed": "#d4605a", + "brightGreen": "#d4605a", + "brightYellow": "#a86671", + "brightBlue": "#7c85c4", + "brightPurple": "#5c5db2", + "brightCyan": "#819090", + "brightWhite": "#fcf4df", + "background": "#292f33", + "foreground": "#dbdae0", + "cursorColor": "#d4605a", + "selectionBackground": "#efb8ac" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Firefly Traditional.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Firefly Traditional.json new file mode 100644 index 0000000..6f3d6fe --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Firefly Traditional.json @@ -0,0 +1,23 @@ +{ + "name": "Firefly Traditional", + "black": "#000000", + "red": "#c23720", + "green": "#33bc26", + "yellow": "#afad24", + "blue": "#5a63ff", + "purple": "#d53ad2", + "cyan": "#33bbc7", + "white": "#cccccc", + "brightBlack": "#828282", + "brightRed": "#ff3b1e", + "brightGreen": "#2ee720", + "brightYellow": "#ecec16", + "brightBlue": "#838dff", + "brightPurple": "#ff5cfe", + "brightCyan": "#29f0f0", + "brightWhite": "#ebebeb", + "background": "#000000", + "foreground": "#f5f5f5", + "cursorColor": "#00f900", + "selectionBackground": "#cfeac6" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Firefox Dev.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Firefox Dev.json new file mode 100644 index 0000000..5cdf89a --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Firefox Dev.json @@ -0,0 +1,23 @@ +{ + "name": "Firefox Dev", + "black": "#002831", + "red": "#e63853", + "green": "#5eb83c", + "yellow": "#a57706", + "blue": "#359ddf", + "purple": "#d75cff", + "cyan": "#4b73a2", + "white": "#dcdcdc", + "brightBlack": "#26444d", + "brightRed": "#e1003f", + "brightGreen": "#1d9000", + "brightYellow": "#cd9409", + "brightBlue": "#006fc0", + "brightPurple": "#a200da", + "brightCyan": "#005794", + "brightWhite": "#e2e2e2", + "background": "#0e1011", + "foreground": "#7c8fa4", + "cursorColor": "#708284", + "selectionBackground": "#163c61" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Firewatch.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Firewatch.json new file mode 100644 index 0000000..f50387c --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Firewatch.json @@ -0,0 +1,23 @@ +{ + "name": "Firewatch", + "black": "#585f6d", + "red": "#d95360", + "green": "#5ab977", + "yellow": "#dfb563", + "blue": "#4d89c4", + "purple": "#d55119", + "cyan": "#44a8b6", + "white": "#e6e5ff", + "brightBlack": "#585f6d", + "brightRed": "#d95360", + "brightGreen": "#5ab977", + "brightYellow": "#dfb563", + "brightBlue": "#4c89c5", + "brightPurple": "#d55119", + "brightCyan": "#44a8b6", + "brightWhite": "#e6e5ff", + "background": "#1e2027", + "foreground": "#9ba2b2", + "cursorColor": "#f6f7ec", + "selectionBackground": "#2f363e" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Fish Tank.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Fish Tank.json new file mode 100644 index 0000000..00cc9b3 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Fish Tank.json @@ -0,0 +1,23 @@ +{ + "name": "Fish Tank", + "black": "#03073c", + "red": "#c6004a", + "green": "#acf157", + "yellow": "#fecd5e", + "blue": "#525fb8", + "purple": "#986f82", + "cyan": "#968763", + "white": "#ecf0fc", + "brightBlack": "#6c5b30", + "brightRed": "#da4b8a", + "brightGreen": "#dbffa9", + "brightYellow": "#fee6a9", + "brightBlue": "#b2befa", + "brightPurple": "#fda5cd", + "brightCyan": "#a5bd86", + "brightWhite": "#f6ffec", + "background": "#232537", + "foreground": "#ecf0fe", + "cursorColor": "#fecd5e", + "selectionBackground": "#fcf7e9" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Flat.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Flat.json new file mode 100644 index 0000000..214fbe8 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Flat.json @@ -0,0 +1,23 @@ +{ + "name": "Flat", + "black": "#222d3f", + "red": "#a82320", + "green": "#32a548", + "yellow": "#e58d11", + "blue": "#3167ac", + "purple": "#781aa0", + "cyan": "#2c9370", + "white": "#b0b6ba", + "brightBlack": "#475262", + "brightRed": "#d4312e", + "brightGreen": "#2d9440", + "brightYellow": "#e5be0c", + "brightBlue": "#3c7dd2", + "brightPurple": "#8230a7", + "brightCyan": "#35b387", + "brightWhite": "#e7eced", + "background": "#002240", + "foreground": "#2cc55d", + "cursorColor": "#e5be0c", + "selectionBackground": "#792b9c" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Flatland.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Flatland.json new file mode 100644 index 0000000..06e8924 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Flatland.json @@ -0,0 +1,23 @@ +{ + "name": "Flatland", + "black": "#1d1d19", + "red": "#f18339", + "green": "#9fd364", + "yellow": "#f4ef6d", + "blue": "#5096be", + "purple": "#695abc", + "cyan": "#d63865", + "white": "#ffffff", + "brightBlack": "#50504c", + "brightRed": "#d22a24", + "brightGreen": "#a7d42c", + "brightYellow": "#ff8949", + "brightBlue": "#61b9d0", + "brightPurple": "#695abc", + "brightCyan": "#d63865", + "brightWhite": "#ffffff", + "background": "#1d1f21", + "foreground": "#b8dbef", + "cursorColor": "#708284", + "selectionBackground": "#2b2a24" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Flexoki Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Flexoki Dark.json new file mode 100644 index 0000000..09fc04c --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Flexoki Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Flexoki Dark", + "black": "#100f0f", + "red": "#d14d41", + "green": "#879a39", + "yellow": "#d0a215", + "blue": "#4385be", + "purple": "#ce5d97", + "cyan": "#3aa99f", + "white": "#878580", + "brightBlack": "#575653", + "brightRed": "#af3029", + "brightGreen": "#66800b", + "brightYellow": "#ad8301", + "brightBlue": "#205ea6", + "brightPurple": "#a02f6f", + "brightCyan": "#24837b", + "brightWhite": "#cecdc3", + "background": "#100f0f", + "foreground": "#cecdc3", + "cursorColor": "#cecdc3", + "selectionBackground": "#403e3c" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Flexoki Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Flexoki Light.json new file mode 100644 index 0000000..c20f57f --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Flexoki Light.json @@ -0,0 +1,23 @@ +{ + "name": "Flexoki Light", + "black": "#100f0f", + "red": "#af3029", + "green": "#66800b", + "yellow": "#ad8301", + "blue": "#205ea6", + "purple": "#a02f6f", + "cyan": "#24837b", + "white": "#6f6e69", + "brightBlack": "#b7b5ac", + "brightRed": "#d14d41", + "brightGreen": "#879a39", + "brightYellow": "#d0a215", + "brightBlue": "#4385be", + "brightPurple": "#ce5d97", + "brightCyan": "#3aa99f", + "brightWhite": "#cecdc3", + "background": "#fffcf0", + "foreground": "#100f0f", + "cursorColor": "#100f0f", + "selectionBackground": "#cecdc3" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Floraverse.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Floraverse.json new file mode 100644 index 0000000..d1ab507 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Floraverse.json @@ -0,0 +1,23 @@ +{ + "name": "Floraverse", + "black": "#08002e", + "red": "#7e1a46", + "green": "#5d731a", + "yellow": "#cd751c", + "blue": "#1d6da1", + "purple": "#b7077e", + "cyan": "#42a38c", + "white": "#f3e0b8", + "brightBlack": "#4c3866", + "brightRed": "#d02063", + "brightGreen": "#b4ce59", + "brightYellow": "#fac357", + "brightBlue": "#40a4cf", + "brightPurple": "#f12aae", + "brightCyan": "#62caa8", + "brightWhite": "#fff5db", + "background": "#0e0d15", + "foreground": "#dbd1b9", + "cursorColor": "#bbbbbb", + "selectionBackground": "#f3e0b8" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Forest Blue.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Forest Blue.json new file mode 100644 index 0000000..4d9f16b --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Forest Blue.json @@ -0,0 +1,23 @@ +{ + "name": "Forest Blue", + "black": "#333333", + "red": "#f8818e", + "green": "#92d3a2", + "yellow": "#1a8e63", + "blue": "#8ed0ce", + "purple": "#5e468c", + "cyan": "#31658c", + "white": "#e2d8cd", + "brightBlack": "#4a4a4a", + "brightRed": "#fb3d66", + "brightGreen": "#6bb48d", + "brightYellow": "#30c85a", + "brightBlue": "#39a7a2", + "brightPurple": "#7e62b3", + "brightCyan": "#6096bf", + "brightWhite": "#e2d8cd", + "background": "#051519", + "foreground": "#e2d8cd", + "cursorColor": "#9e9ecb", + "selectionBackground": "#4d4d4d" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Framer.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Framer.json new file mode 100644 index 0000000..3dd9bc7 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Framer.json @@ -0,0 +1,23 @@ +{ + "name": "Framer", + "black": "#141414", + "red": "#ff5555", + "green": "#98ec65", + "yellow": "#ffcc33", + "blue": "#00aaff", + "purple": "#aa88ff", + "cyan": "#88ddff", + "white": "#cccccc", + "brightBlack": "#414141", + "brightRed": "#ff8888", + "brightGreen": "#b6f292", + "brightYellow": "#ffd966", + "brightBlue": "#33bbff", + "brightPurple": "#cebbff", + "brightCyan": "#bbecff", + "brightWhite": "#ffffff", + "background": "#111111", + "foreground": "#777777", + "cursorColor": "#fcdc08", + "selectionBackground": "#666666" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Front End Delight.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Front End Delight.json new file mode 100644 index 0000000..c86fe31 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Front End Delight.json @@ -0,0 +1,23 @@ +{ + "name": "Front End Delight", + "black": "#242526", + "red": "#f8511b", + "green": "#565747", + "yellow": "#fa771d", + "blue": "#2c70b7", + "purple": "#f02e4f", + "cyan": "#3ca1a6", + "white": "#adadad", + "brightBlack": "#5fac6d", + "brightRed": "#f74319", + "brightGreen": "#74ec4c", + "brightYellow": "#fdc325", + "brightBlue": "#3393ca", + "brightPurple": "#e75e4f", + "brightCyan": "#4fbce6", + "brightWhite": "#8c735b", + "background": "#1b1c1d", + "foreground": "#adadad", + "cursorColor": "#cdcdcd", + "selectionBackground": "#ea6154" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Fun Forrest.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Fun Forrest.json new file mode 100644 index 0000000..e043a99 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Fun Forrest.json @@ -0,0 +1,23 @@ +{ + "name": "Fun Forrest", + "black": "#000000", + "red": "#d6262b", + "green": "#919c00", + "yellow": "#be8a13", + "blue": "#4699a3", + "purple": "#8d4331", + "cyan": "#da8213", + "white": "#ddc265", + "brightBlack": "#7f6a55", + "brightRed": "#e55a1c", + "brightGreen": "#bfc65a", + "brightYellow": "#ffcb1b", + "brightBlue": "#7cc9cf", + "brightPurple": "#d26349", + "brightCyan": "#e6a96b", + "brightWhite": "#ffeaa3", + "background": "#251200", + "foreground": "#dec165", + "cursorColor": "#e5591c", + "selectionBackground": "#e5591c" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Galaxy.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Galaxy.json new file mode 100644 index 0000000..641ab62 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Galaxy.json @@ -0,0 +1,23 @@ +{ + "name": "Galaxy", + "black": "#000000", + "red": "#f9555f", + "green": "#21b089", + "yellow": "#fef02a", + "blue": "#589df6", + "purple": "#944d95", + "cyan": "#1f9ee7", + "white": "#bbbbbb", + "brightBlack": "#555555", + "brightRed": "#fa8c8f", + "brightGreen": "#35bb9a", + "brightYellow": "#ffff55", + "brightBlue": "#589df6", + "brightPurple": "#e75699", + "brightCyan": "#3979bc", + "brightWhite": "#ffffff", + "background": "#1d2837", + "foreground": "#ffffff", + "cursorColor": "#bbbbbb", + "selectionBackground": "#b5d5ff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Galizur.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Galizur.json new file mode 100644 index 0000000..04ef662 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Galizur.json @@ -0,0 +1,23 @@ +{ + "name": "Galizur", + "black": "#223344", + "red": "#aa1122", + "green": "#33aa11", + "yellow": "#ccaa22", + "blue": "#2255cc", + "purple": "#7755aa", + "cyan": "#22bbdd", + "white": "#8899aa", + "brightBlack": "#556677", + "brightRed": "#ff1133", + "brightGreen": "#33ff11", + "brightYellow": "#ffdd33", + "brightBlue": "#3377ff", + "brightPurple": "#aa77ff", + "brightCyan": "#33ddff", + "brightWhite": "#bbccdd", + "background": "#071317", + "foreground": "#ddeeff", + "cursorColor": "#ddeeff", + "selectionBackground": "#071317" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ghostty Default Style Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ghostty Default Style Dark.json new file mode 100644 index 0000000..20a56e5 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ghostty Default Style Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Ghostty Default Style Dark", + "black": "#1d1f21", + "red": "#cc6566", + "green": "#b6bd68", + "yellow": "#f0c674", + "blue": "#82a2be", + "purple": "#b294bb", + "cyan": "#8abeb7", + "white": "#c4c8c6", + "brightBlack": "#666666", + "brightRed": "#d54e53", + "brightGreen": "#b9ca4b", + "brightYellow": "#e7c547", + "brightBlue": "#7aa6da", + "brightPurple": "#c397d8", + "brightCyan": "#70c0b1", + "brightWhite": "#eaeaea", + "background": "#282c34", + "foreground": "#ffffff", + "cursorColor": "#ffffff", + "selectionBackground": "#ffffff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitHub Dark Colorblind.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitHub Dark Colorblind.json new file mode 100644 index 0000000..e2bff93 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitHub Dark Colorblind.json @@ -0,0 +1,23 @@ +{ + "name": "GitHub Dark Colorblind", + "black": "#484f58", + "red": "#ec8e2c", + "green": "#58a6ff", + "yellow": "#d29922", + "blue": "#58a6ff", + "purple": "#bc8cff", + "cyan": "#39c5cf", + "white": "#b1bac4", + "brightBlack": "#6e7681", + "brightRed": "#fdac54", + "brightGreen": "#79c0ff", + "brightYellow": "#e3b341", + "brightBlue": "#79c0ff", + "brightPurple": "#d2a8ff", + "brightCyan": "#56d4dd", + "brightWhite": "#ffffff", + "background": "#0d1117", + "foreground": "#c9d1d9", + "cursorColor": "#58a6ff", + "selectionBackground": "#c9d1d9" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitHub Dark Default.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitHub Dark Default.json new file mode 100644 index 0000000..ad739f5 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitHub Dark Default.json @@ -0,0 +1,23 @@ +{ + "name": "GitHub Dark Default", + "black": "#484f58", + "red": "#ff7b72", + "green": "#3fb950", + "yellow": "#d29922", + "blue": "#58a6ff", + "purple": "#bc8cff", + "cyan": "#39c5cf", + "white": "#b1bac4", + "brightBlack": "#6e7681", + "brightRed": "#ffa198", + "brightGreen": "#56d364", + "brightYellow": "#e3b341", + "brightBlue": "#79c0ff", + "brightPurple": "#d2a8ff", + "brightCyan": "#56d4dd", + "brightWhite": "#ffffff", + "background": "#0d1117", + "foreground": "#e6edf3", + "cursorColor": "#2f81f7", + "selectionBackground": "#e6edf3" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitHub Dark Dimmed.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitHub Dark Dimmed.json new file mode 100644 index 0000000..5f61935 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitHub Dark Dimmed.json @@ -0,0 +1,23 @@ +{ + "name": "GitHub Dark Dimmed", + "black": "#545d68", + "red": "#f47067", + "green": "#57ab5a", + "yellow": "#c69026", + "blue": "#539bf5", + "purple": "#b083f0", + "cyan": "#39c5cf", + "white": "#909dab", + "brightBlack": "#636e7b", + "brightRed": "#ff938a", + "brightGreen": "#6bc46d", + "brightYellow": "#daaa3f", + "brightBlue": "#6cb6ff", + "brightPurple": "#dcbdfb", + "brightCyan": "#56d4dd", + "brightWhite": "#cdd9e5", + "background": "#22272e", + "foreground": "#adbac7", + "cursorColor": "#539bf5", + "selectionBackground": "#adbac7" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitHub Dark High Contrast.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitHub Dark High Contrast.json new file mode 100644 index 0000000..001efb5 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitHub Dark High Contrast.json @@ -0,0 +1,23 @@ +{ + "name": "GitHub Dark High Contrast", + "black": "#7a828e", + "red": "#ff9492", + "green": "#26cd4d", + "yellow": "#f0b72f", + "blue": "#71b7ff", + "purple": "#cb9eff", + "cyan": "#39c5cf", + "white": "#d9dee3", + "brightBlack": "#9ea7b3", + "brightRed": "#ffb1af", + "brightGreen": "#4ae168", + "brightYellow": "#f7c843", + "brightBlue": "#91cbff", + "brightPurple": "#dbb7ff", + "brightCyan": "#56d4dd", + "brightWhite": "#ffffff", + "background": "#0a0c10", + "foreground": "#f0f3f6", + "cursorColor": "#71b7ff", + "selectionBackground": "#f0f3f6" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitHub Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitHub Dark.json new file mode 100644 index 0000000..9f1dca8 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitHub Dark.json @@ -0,0 +1,23 @@ +{ + "name": "GitHub Dark", + "black": "#000000", + "red": "#f78166", + "green": "#56d364", + "yellow": "#e3b341", + "blue": "#6ca4f8", + "purple": "#db61a2", + "cyan": "#2b7489", + "white": "#ffffff", + "brightBlack": "#4d4d4d", + "brightRed": "#f78166", + "brightGreen": "#56d364", + "brightYellow": "#e3b341", + "brightBlue": "#6ca4f8", + "brightPurple": "#db61a2", + "brightCyan": "#2b7489", + "brightWhite": "#ffffff", + "background": "#101216", + "foreground": "#8b949e", + "cursorColor": "#c9d1d9", + "selectionBackground": "#3b5070" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitHub Light Colorblind.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitHub Light Colorblind.json new file mode 100644 index 0000000..c10cbfc --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitHub Light Colorblind.json @@ -0,0 +1,23 @@ +{ + "name": "GitHub Light Colorblind", + "black": "#24292f", + "red": "#b35900", + "green": "#0550ae", + "yellow": "#4d2d00", + "blue": "#0969da", + "purple": "#8250df", + "cyan": "#1b7c83", + "white": "#6e7781", + "brightBlack": "#57606a", + "brightRed": "#8a4600", + "brightGreen": "#0969da", + "brightYellow": "#633c01", + "brightBlue": "#218bff", + "brightPurple": "#a475f9", + "brightCyan": "#3192aa", + "brightWhite": "#8c959f", + "background": "#ffffff", + "foreground": "#24292f", + "cursorColor": "#0969da", + "selectionBackground": "#24292f" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitHub Light Default.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitHub Light Default.json new file mode 100644 index 0000000..8d5d972 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitHub Light Default.json @@ -0,0 +1,23 @@ +{ + "name": "GitHub Light Default", + "black": "#24292f", + "red": "#cf222e", + "green": "#116329", + "yellow": "#4d2d00", + "blue": "#0969da", + "purple": "#8250df", + "cyan": "#1b7c83", + "white": "#6e7781", + "brightBlack": "#57606a", + "brightRed": "#a40e26", + "brightGreen": "#1a7f37", + "brightYellow": "#633c01", + "brightBlue": "#218bff", + "brightPurple": "#a475f9", + "brightCyan": "#3192aa", + "brightWhite": "#8c959f", + "background": "#ffffff", + "foreground": "#1f2328", + "cursorColor": "#0969da", + "selectionBackground": "#1f2328" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitHub Light High Contrast.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitHub Light High Contrast.json new file mode 100644 index 0000000..84a32ae --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitHub Light High Contrast.json @@ -0,0 +1,23 @@ +{ + "name": "GitHub Light High Contrast", + "black": "#0e1116", + "red": "#a0111f", + "green": "#024c1a", + "yellow": "#3f2200", + "blue": "#0349b4", + "purple": "#622cbc", + "cyan": "#1b7c83", + "white": "#66707b", + "brightBlack": "#4b535d", + "brightRed": "#86061d", + "brightGreen": "#055d20", + "brightYellow": "#4e2c00", + "brightBlue": "#1168e3", + "brightPurple": "#844ae7", + "brightCyan": "#3192aa", + "brightWhite": "#88929d", + "background": "#ffffff", + "foreground": "#0e1116", + "cursorColor": "#0349b4", + "selectionBackground": "#0e1116" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitHub.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitHub.json new file mode 100644 index 0000000..46096bb --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitHub.json @@ -0,0 +1,23 @@ +{ + "name": "GitHub", + "black": "#3e3e3e", + "red": "#970b16", + "green": "#07962a", + "yellow": "#c5bb94", + "blue": "#003e8a", + "purple": "#e94691", + "cyan": "#7cc4df", + "white": "#b2b2b2", + "brightBlack": "#666666", + "brightRed": "#de0000", + "brightGreen": "#7ac895", + "brightYellow": "#d7b600", + "brightBlue": "#2e6cba", + "brightPurple": "#f29592", + "brightCyan": "#00c7cb", + "brightWhite": "#ffffff", + "background": "#f4f4f4", + "foreground": "#3e3e3e", + "cursorColor": "#3f3f3f", + "selectionBackground": "#a9c1e2" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitLab Dark Grey.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitLab Dark Grey.json new file mode 100644 index 0000000..0db4b22 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitLab Dark Grey.json @@ -0,0 +1,23 @@ +{ + "name": "GitLab Dark Grey", + "black": "#000000", + "red": "#f57f6c", + "green": "#52b87a", + "yellow": "#d99530", + "blue": "#7fb6ed", + "purple": "#f88aaf", + "cyan": "#32c5d2", + "white": "#ffffff", + "brightBlack": "#666666", + "brightRed": "#fcb5aa", + "brightGreen": "#91d4a8", + "brightYellow": "#e9be74", + "brightBlue": "#498dd1", + "brightPurple": "#fcacc5", + "brightCyan": "#5edee3", + "brightWhite": "#ffffff", + "background": "#222222", + "foreground": "#ffffff", + "cursorColor": "#ffffff", + "selectionBackground": "#ad95e9" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitLab Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitLab Dark.json new file mode 100644 index 0000000..fef7742 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitLab Dark.json @@ -0,0 +1,23 @@ +{ + "name": "GitLab Dark", + "black": "#000000", + "red": "#f57f6c", + "green": "#52b87a", + "yellow": "#d99530", + "blue": "#7fb6ed", + "purple": "#f88aaf", + "cyan": "#32c5d2", + "white": "#ffffff", + "brightBlack": "#666666", + "brightRed": "#fcb5aa", + "brightGreen": "#91d4a8", + "brightYellow": "#e9be74", + "brightBlue": "#498dd1", + "brightPurple": "#fcacc5", + "brightCyan": "#5edee3", + "brightWhite": "#ffffff", + "background": "#28262b", + "foreground": "#ffffff", + "cursorColor": "#ffffff", + "selectionBackground": "#ad95e9" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitLab Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitLab Light.json new file mode 100644 index 0000000..5879e34 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/GitLab Light.json @@ -0,0 +1,23 @@ +{ + "name": "GitLab Light", + "black": "#303030", + "red": "#a31700", + "green": "#0a7f3d", + "yellow": "#af551d", + "blue": "#006cd8", + "purple": "#583cac", + "cyan": "#00798a", + "white": "#303030", + "brightBlack": "#303030", + "brightRed": "#a31700", + "brightGreen": "#0a7f3d", + "brightYellow": "#af551d", + "brightBlue": "#006cd8", + "brightPurple": "#583cac", + "brightCyan": "#00798a", + "brightWhite": "#303030", + "background": "#fafaff", + "foreground": "#303030", + "cursorColor": "#303030", + "selectionBackground": "#ad95e9" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Glacier.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Glacier.json new file mode 100644 index 0000000..c50d162 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Glacier.json @@ -0,0 +1,23 @@ +{ + "name": "Glacier", + "black": "#2e343c", + "red": "#bd0f2f", + "green": "#35a770", + "yellow": "#fb9435", + "blue": "#1f5872", + "purple": "#bd2523", + "cyan": "#778397", + "white": "#ffffff", + "brightBlack": "#404a55", + "brightRed": "#bd0f2f", + "brightGreen": "#49e998", + "brightYellow": "#fddf6e", + "brightBlue": "#2a8bc1", + "brightPurple": "#ea4727", + "brightCyan": "#a0b6d3", + "brightWhite": "#ffffff", + "background": "#0c1115", + "foreground": "#ffffff", + "cursorColor": "#6c6c6c", + "selectionBackground": "#bd2523" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Grape.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Grape.json new file mode 100644 index 0000000..82e7731 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Grape.json @@ -0,0 +1,23 @@ +{ + "name": "Grape", + "black": "#2d283f", + "red": "#ed2261", + "green": "#1fa91b", + "yellow": "#8ddc20", + "blue": "#487df4", + "purple": "#8d35c9", + "cyan": "#3bdeed", + "white": "#9e9ea0", + "brightBlack": "#59516a", + "brightRed": "#f0729a", + "brightGreen": "#53aa5e", + "brightYellow": "#b2dc87", + "brightBlue": "#a9bcec", + "brightPurple": "#ad81c2", + "brightCyan": "#9de3eb", + "brightWhite": "#a288f7", + "background": "#171423", + "foreground": "#9f9fa1", + "cursorColor": "#a288f7", + "selectionBackground": "#493d70" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Grass.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Grass.json new file mode 100644 index 0000000..cf612b1 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Grass.json @@ -0,0 +1,23 @@ +{ + "name": "Grass", + "black": "#000000", + "red": "#ff5959", + "green": "#00bb00", + "yellow": "#e7b000", + "blue": "#0000a3", + "purple": "#ee59bb", + "cyan": "#00bbbb", + "white": "#bbbbbb", + "brightBlack": "#959595", + "brightRed": "#ff5959", + "brightGreen": "#00bb00", + "brightYellow": "#e7b000", + "brightBlue": "#0000bb", + "brightPurple": "#ff55ff", + "brightCyan": "#55ffff", + "brightWhite": "#ffffff", + "background": "#13773d", + "foreground": "#fff0a5", + "cursorColor": "#d9744c", + "selectionBackground": "#b64926" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Grey Green.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Grey Green.json new file mode 100644 index 0000000..70b4946 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Grey Green.json @@ -0,0 +1,23 @@ +{ + "name": "Grey Green", + "black": "#000000", + "red": "#fe1414", + "green": "#74ff00", + "yellow": "#f1ff01", + "blue": "#00deff", + "purple": "#ff00f0", + "cyan": "#00ffbc", + "white": "#ffffff", + "brightBlack": "#666666", + "brightRed": "#ff3939", + "brightGreen": "#00ff44", + "brightYellow": "#ffd100", + "brightBlue": "#00afff", + "brightPurple": "#ff008a", + "brightCyan": "#00ffd3", + "brightWhite": "#f5ecec", + "background": "#002a1a", + "foreground": "#ffffff", + "cursorColor": "#fff400", + "selectionBackground": "#517e50" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Gruber Darker.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Gruber Darker.json new file mode 100644 index 0000000..df8a5f9 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Gruber Darker.json @@ -0,0 +1,23 @@ +{ + "name": "Gruber Darker", + "black": "#181818", + "red": "#ff0a36", + "green": "#42dc00", + "yellow": "#ffdb00", + "blue": "#92a7cb", + "purple": "#a095cb", + "cyan": "#90aa9e", + "white": "#e4e4e4", + "brightBlack": "#54494e", + "brightRed": "#ff3851", + "brightGreen": "#42dc00", + "brightYellow": "#ffdb00", + "brightBlue": "#92a7cb", + "brightPurple": "#afafda", + "brightCyan": "#90aa9e", + "brightWhite": "#f5f5f5", + "background": "#181818", + "foreground": "#e4e4e4", + "cursorColor": "#ffdb00", + "selectionBackground": "#ffffff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Gruvbox Dark Hard.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Gruvbox Dark Hard.json new file mode 100644 index 0000000..e6f258c --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Gruvbox Dark Hard.json @@ -0,0 +1,23 @@ +{ + "name": "Gruvbox Dark Hard", + "black": "#1d2021", + "red": "#cc241d", + "green": "#98971a", + "yellow": "#d79921", + "blue": "#458588", + "purple": "#b16286", + "cyan": "#689d6a", + "white": "#a89984", + "brightBlack": "#928374", + "brightRed": "#fb4934", + "brightGreen": "#b8bb26", + "brightYellow": "#fabd2f", + "brightBlue": "#83a598", + "brightPurple": "#d3869b", + "brightCyan": "#8ec07c", + "brightWhite": "#ebdbb2", + "background": "#1d2021", + "foreground": "#ebdbb2", + "cursorColor": "#ebdbb2", + "selectionBackground": "#665c54" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Gruvbox Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Gruvbox Dark.json new file mode 100644 index 0000000..0028c14 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Gruvbox Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Gruvbox Dark", + "black": "#282828", + "red": "#cc241d", + "green": "#98971a", + "yellow": "#d79921", + "blue": "#458588", + "purple": "#b16286", + "cyan": "#689d6a", + "white": "#a89984", + "brightBlack": "#928374", + "brightRed": "#fb4934", + "brightGreen": "#b8bb26", + "brightYellow": "#fabd2f", + "brightBlue": "#83a598", + "brightPurple": "#d3869b", + "brightCyan": "#8ec07c", + "brightWhite": "#ebdbb2", + "background": "#282828", + "foreground": "#ebdbb2", + "cursorColor": "#ebdbb2", + "selectionBackground": "#665c54" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Gruvbox Light Hard.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Gruvbox Light Hard.json new file mode 100644 index 0000000..22a76a9 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Gruvbox Light Hard.json @@ -0,0 +1,23 @@ +{ + "name": "Gruvbox Light Hard", + "black": "#f9f5d7", + "red": "#cc241d", + "green": "#98971a", + "yellow": "#d79921", + "blue": "#458588", + "purple": "#b16286", + "cyan": "#689d6a", + "white": "#7c6f64", + "brightBlack": "#928374", + "brightRed": "#9d0006", + "brightGreen": "#79740e", + "brightYellow": "#b57614", + "brightBlue": "#076678", + "brightPurple": "#8f3f71", + "brightCyan": "#427b58", + "brightWhite": "#3c3836", + "background": "#f9f5d7", + "foreground": "#3c3836", + "cursorColor": "#3c3836", + "selectionBackground": "#3c3836" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Gruvbox Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Gruvbox Light.json new file mode 100644 index 0000000..e96b310 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Gruvbox Light.json @@ -0,0 +1,23 @@ +{ + "name": "Gruvbox Light", + "black": "#fbf1c7", + "red": "#cc241d", + "green": "#98971a", + "yellow": "#d79921", + "blue": "#458588", + "purple": "#b16286", + "cyan": "#689d6a", + "white": "#7c6f64", + "brightBlack": "#928374", + "brightRed": "#9d0006", + "brightGreen": "#79740e", + "brightYellow": "#b57614", + "brightBlue": "#076678", + "brightPurple": "#8f3f71", + "brightCyan": "#427b58", + "brightWhite": "#3c3836", + "background": "#fbf1c7", + "foreground": "#3c3836", + "cursorColor": "#3c3836", + "selectionBackground": "#3c3836" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Gruvbox Material Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Gruvbox Material Dark.json new file mode 100644 index 0000000..a0f044e --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Gruvbox Material Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Gruvbox Material Dark", + "black": "#282828", + "red": "#ea6962", + "green": "#a9b665", + "yellow": "#d8a657", + "blue": "#7daea3", + "purple": "#d3869b", + "cyan": "#89b482", + "white": "#d4be98", + "brightBlack": "#7c6f64", + "brightRed": "#ea6962", + "brightGreen": "#a9b665", + "brightYellow": "#d8a657", + "brightBlue": "#7daea3", + "brightPurple": "#d3869b", + "brightCyan": "#89b482", + "brightWhite": "#ddc7a1", + "background": "#282828", + "foreground": "#d4be98", + "cursorColor": "#d4be98", + "selectionBackground": "#d4be98" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Gruvbox Material Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Gruvbox Material Light.json new file mode 100644 index 0000000..7a56ebe --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Gruvbox Material Light.json @@ -0,0 +1,23 @@ +{ + "name": "Gruvbox Material Light", + "black": "#fbf1c7", + "red": "#c14a4a", + "green": "#6c782e", + "yellow": "#b47109", + "blue": "#45707a", + "purple": "#945e80", + "cyan": "#4c7a5d", + "white": "#654735", + "brightBlack": "#a89984", + "brightRed": "#c14a4a", + "brightGreen": "#6c782e", + "brightYellow": "#b47109", + "brightBlue": "#45707a", + "brightPurple": "#945e80", + "brightCyan": "#4c7a5d", + "brightWhite": "#4f3829", + "background": "#fbf1c7", + "foreground": "#654735", + "cursorColor": "#654735", + "selectionBackground": "#654735" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Gruvbox Material.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Gruvbox Material.json new file mode 100644 index 0000000..015d3b2 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Gruvbox Material.json @@ -0,0 +1,23 @@ +{ + "name": "Gruvbox Material", + "black": "#141617", + "red": "#ea6926", + "green": "#c1d041", + "yellow": "#eecf75", + "blue": "#6da3ec", + "purple": "#fd9bc1", + "cyan": "#fe9d6e", + "white": "#ffffff", + "brightBlack": "#4c4c4c", + "brightRed": "#d3573b", + "brightGreen": "#c1d041", + "brightYellow": "#eecf75", + "brightBlue": "#2c86ff", + "brightPurple": "#fd9bc1", + "brightCyan": "#92a5df", + "brightWhite": "#ffffff", + "background": "#1d2021", + "foreground": "#d4be98", + "cursorColor": "#ffffff", + "selectionBackground": "#2b2c3f" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Guezwhoz.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Guezwhoz.json new file mode 100644 index 0000000..055c928 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Guezwhoz.json @@ -0,0 +1,23 @@ +{ + "name": "Guezwhoz", + "black": "#333333", + "red": "#e85181", + "green": "#7ad694", + "yellow": "#b7d074", + "blue": "#5aa0d6", + "purple": "#9a90e0", + "cyan": "#58d6ce", + "white": "#d9d9d9", + "brightBlack": "#808080", + "brightRed": "#e85181", + "brightGreen": "#afd7af", + "brightYellow": "#d1ed85", + "brightBlue": "#64b2ed", + "brightPurple": "#a398ed", + "brightCyan": "#61ede4", + "brightWhite": "#ededed", + "background": "#1d1d1d", + "foreground": "#d9d9d9", + "cursorColor": "#99d4b1", + "selectionBackground": "#245354" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/HaX0R Blue.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/HaX0R Blue.json new file mode 100644 index 0000000..8a3272d --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/HaX0R Blue.json @@ -0,0 +1,23 @@ +{ + "name": "HaX0R Blue", + "black": "#010921", + "red": "#10b6ff", + "green": "#10b6ff", + "yellow": "#10b6ff", + "blue": "#10b6ff", + "purple": "#10b6ff", + "cyan": "#10b6ff", + "white": "#fafafa", + "brightBlack": "#484157", + "brightRed": "#00b3f7", + "brightGreen": "#00b3f7", + "brightYellow": "#00b3f7", + "brightBlue": "#00b3f7", + "brightPurple": "#00b3f7", + "brightCyan": "#00b3f7", + "brightWhite": "#fefefe", + "background": "#010515", + "foreground": "#11b7ff", + "cursorColor": "#10b6ff", + "selectionBackground": "#c1e4ff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/HaX0R Gr33N.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/HaX0R Gr33N.json new file mode 100644 index 0000000..431d9cd --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/HaX0R Gr33N.json @@ -0,0 +1,23 @@ +{ + "name": "HaX0R Gr33N", + "black": "#001f0b", + "red": "#15d00d", + "green": "#15d00d", + "yellow": "#15d00d", + "blue": "#15d00d", + "purple": "#15d00d", + "cyan": "#15d00d", + "white": "#fafafa", + "brightBlack": "#334843", + "brightRed": "#19e20e", + "brightGreen": "#19e20e", + "brightYellow": "#19e20e", + "brightBlue": "#19e20e", + "brightPurple": "#19e20e", + "brightCyan": "#19e20e", + "brightWhite": "#fefefe", + "background": "#020f01", + "foreground": "#16b10e", + "cursorColor": "#15d00d", + "selectionBackground": "#d4ffc1" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/HaX0R R3D.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/HaX0R R3D.json new file mode 100644 index 0000000..7c4324c --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/HaX0R R3D.json @@ -0,0 +1,23 @@ +{ + "name": "HaX0R R3D", + "black": "#1f0000", + "red": "#b00d0d", + "green": "#b00d0d", + "yellow": "#b00d0d", + "blue": "#b00d0d", + "purple": "#b00d0d", + "cyan": "#b00d0d", + "white": "#fafafa", + "brightBlack": "#554040", + "brightRed": "#ff1111", + "brightGreen": "#ff1010", + "brightYellow": "#ff1010", + "brightBlue": "#ff1010", + "brightPurple": "#ff1010", + "brightCyan": "#ff1010", + "brightWhite": "#fefefe", + "background": "#200101", + "foreground": "#b10e0e", + "cursorColor": "#b00d0d", + "selectionBackground": "#ebc1ff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hacktober.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hacktober.json new file mode 100644 index 0000000..40b4ea4 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hacktober.json @@ -0,0 +1,23 @@ +{ + "name": "Hacktober", + "black": "#191918", + "red": "#b34538", + "green": "#587744", + "yellow": "#d08949", + "blue": "#206ec5", + "purple": "#864651", + "cyan": "#ac9166", + "white": "#f1eee7", + "brightBlack": "#464444", + "brightRed": "#b33323", + "brightGreen": "#42824a", + "brightYellow": "#c75a22", + "brightBlue": "#5389c5", + "brightPurple": "#e795a5", + "brightCyan": "#ebc587", + "brightWhite": "#ffffff", + "background": "#141414", + "foreground": "#c9c9c9", + "cursorColor": "#c9c9c9", + "selectionBackground": "#141414" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hardcore.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hardcore.json new file mode 100644 index 0000000..c34f195 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hardcore.json @@ -0,0 +1,23 @@ +{ + "name": "Hardcore", + "black": "#1b1d1e", + "red": "#f92672", + "green": "#a6e22e", + "yellow": "#fd971f", + "blue": "#66d9ef", + "purple": "#9e6ffe", + "cyan": "#5e7175", + "white": "#ccccc6", + "brightBlack": "#505354", + "brightRed": "#ff669d", + "brightGreen": "#beed5f", + "brightYellow": "#e6db74", + "brightBlue": "#66d9ef", + "brightPurple": "#9e6ffe", + "brightCyan": "#a3babf", + "brightWhite": "#f8f8f2", + "background": "#121212", + "foreground": "#a0a0a0", + "cursorColor": "#bbbbbb", + "selectionBackground": "#453b39" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Harper.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Harper.json new file mode 100644 index 0000000..a7edd92 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Harper.json @@ -0,0 +1,23 @@ +{ + "name": "Harper", + "black": "#010101", + "red": "#f8b63f", + "green": "#7fb5e1", + "yellow": "#d6da25", + "blue": "#489e48", + "purple": "#b296c6", + "cyan": "#f5bfd7", + "white": "#a8a49d", + "brightBlack": "#726e6a", + "brightRed": "#f8b63f", + "brightGreen": "#7fb5e1", + "brightYellow": "#d6da25", + "brightBlue": "#489e48", + "brightPurple": "#b296c6", + "brightCyan": "#f5bfd7", + "brightWhite": "#fefbea", + "background": "#010101", + "foreground": "#a8a49d", + "cursorColor": "#a8a49d", + "selectionBackground": "#5a5753" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Havn Daggry.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Havn Daggry.json new file mode 100644 index 0000000..c49451f --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Havn Daggry.json @@ -0,0 +1,23 @@ +{ + "name": "Havn Daggry", + "black": "#1f2842", + "red": "#985248", + "green": "#577159", + "yellow": "#be6b00", + "blue": "#3a577d", + "purple": "#7c5c97", + "cyan": "#925780", + "white": "#b0b5c5", + "brightBlack": "#1f2842", + "brightRed": "#cc4a35", + "brightGreen": "#719679", + "brightYellow": "#f1a527", + "brightBlue": "#6089c0", + "brightPurple": "#7d7396", + "brightCyan": "#aa869d", + "brightWhite": "#d6dbeb", + "background": "#f8f9fb", + "foreground": "#3b4a7a", + "cursorColor": "#226c4f", + "selectionBackground": "#cfe9dd" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Havn Skumring.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Havn Skumring.json new file mode 100644 index 0000000..4d5d912 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Havn Skumring.json @@ -0,0 +1,23 @@ +{ + "name": "Havn Skumring", + "black": "#252c47", + "red": "#ea563e", + "green": "#6ead7b", + "yellow": "#f8b330", + "blue": "#596cf7", + "purple": "#7c719e", + "cyan": "#d588c1", + "white": "#dce0ee", + "brightBlack": "#38425c", + "brightRed": "#d17264", + "brightGreen": "#8c9e8f", + "brightYellow": "#eac58c", + "brightBlue": "#5186cb", + "brightPurple": "#9b7cee", + "brightCyan": "#d17ab6", + "brightWhite": "#fff6e1", + "background": "#111522", + "foreground": "#d6dbeb", + "cursorColor": "#277a6f", + "selectionBackground": "#2b514b" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Heeler.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Heeler.json new file mode 100644 index 0000000..bbae8d0 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Heeler.json @@ -0,0 +1,23 @@ +{ + "name": "Heeler", + "black": "#000000", + "red": "#e44c2e", + "green": "#bdd100", + "yellow": "#f4ce65", + "blue": "#5ba5f2", + "purple": "#ff95c2", + "cyan": "#ff9763", + "white": "#ffffff", + "brightBlack": "#4c4c4c", + "brightRed": "#e44c2e", + "brightGreen": "#bdd100", + "brightYellow": "#f4ce65", + "brightBlue": "#0088ff", + "brightPurple": "#ff95c2", + "brightCyan": "#8da6e4", + "brightWhite": "#ffffff", + "background": "#211f46", + "foreground": "#fdfdfd", + "cursorColor": "#ffffff", + "selectionBackground": "#2b2c41" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Highway.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Highway.json new file mode 100644 index 0000000..56ee196 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Highway.json @@ -0,0 +1,23 @@ +{ + "name": "Highway", + "black": "#000000", + "red": "#d00e18", + "green": "#138034", + "yellow": "#ffcb3e", + "blue": "#006bb3", + "purple": "#783482", + "cyan": "#455271", + "white": "#ededed", + "brightBlack": "#5d504a", + "brightRed": "#f07e18", + "brightGreen": "#b1d130", + "brightYellow": "#fff120", + "brightBlue": "#4fc2fd", + "brightPurple": "#de0071", + "brightCyan": "#5d504a", + "brightWhite": "#ffffff", + "background": "#222225", + "foreground": "#ededed", + "cursorColor": "#e0d9b9", + "selectionBackground": "#384564" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hipster Green.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hipster Green.json new file mode 100644 index 0000000..e719cf4 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hipster Green.json @@ -0,0 +1,23 @@ +{ + "name": "Hipster Green", + "black": "#000000", + "red": "#b6214a", + "green": "#00a600", + "yellow": "#bfbf00", + "blue": "#246eb2", + "purple": "#b200b2", + "cyan": "#00a6b2", + "white": "#bfbfbf", + "brightBlack": "#666666", + "brightRed": "#e50000", + "brightGreen": "#86a93e", + "brightYellow": "#e5e500", + "brightBlue": "#0000ff", + "brightPurple": "#e500e5", + "brightCyan": "#00e5e5", + "brightWhite": "#e5e5e5", + "background": "#100b05", + "foreground": "#84c138", + "cursorColor": "#23ff18", + "selectionBackground": "#083905" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hivacruz.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hivacruz.json new file mode 100644 index 0000000..ddc0ee5 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hivacruz.json @@ -0,0 +1,23 @@ +{ + "name": "Hivacruz", + "black": "#202746", + "red": "#c94922", + "green": "#ac9739", + "yellow": "#c08b30", + "blue": "#3d8fd1", + "purple": "#6679cc", + "cyan": "#22a2c9", + "white": "#979db4", + "brightBlack": "#6b7394", + "brightRed": "#c76b29", + "brightGreen": "#73ad43", + "brightYellow": "#5e6687", + "brightBlue": "#898ea4", + "brightPurple": "#dfe2f1", + "brightCyan": "#9c637a", + "brightWhite": "#f5f7ff", + "background": "#132638", + "foreground": "#ede4e4", + "cursorColor": "#979db4", + "selectionBackground": "#5e6687" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Homebrew.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Homebrew.json new file mode 100644 index 0000000..cc2a34b --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Homebrew.json @@ -0,0 +1,23 @@ +{ + "name": "Homebrew", + "black": "#000000", + "red": "#990000", + "green": "#00a600", + "yellow": "#999900", + "blue": "#0d0dbf", + "purple": "#b200b2", + "cyan": "#00a6b2", + "white": "#bfbfbf", + "brightBlack": "#666666", + "brightRed": "#e50000", + "brightGreen": "#00d900", + "brightYellow": "#e5e500", + "brightBlue": "#0000ff", + "brightPurple": "#e500e5", + "brightCyan": "#00e5e5", + "brightWhite": "#e5e5e5", + "background": "#000000", + "foreground": "#00ff00", + "cursorColor": "#23ff18", + "selectionBackground": "#083905" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hopscotch.256.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hopscotch.256.json new file mode 100644 index 0000000..d9322ab --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hopscotch.256.json @@ -0,0 +1,23 @@ +{ + "name": "Hopscotch.256", + "black": "#322931", + "red": "#dd464c", + "green": "#8fc13e", + "yellow": "#fdcc59", + "blue": "#1290bf", + "purple": "#c85e7c", + "cyan": "#149b93", + "white": "#b9b5b8", + "brightBlack": "#797379", + "brightRed": "#dd464c", + "brightGreen": "#8fc13e", + "brightYellow": "#fdcc59", + "brightBlue": "#1290bf", + "brightPurple": "#c85e7c", + "brightCyan": "#149b93", + "brightWhite": "#ffffff", + "background": "#322931", + "foreground": "#b9b5b8", + "cursorColor": "#b9b5b8", + "selectionBackground": "#5c545b" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hopscotch.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hopscotch.json new file mode 100644 index 0000000..f0f16c7 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hopscotch.json @@ -0,0 +1,23 @@ +{ + "name": "Hopscotch", + "black": "#322931", + "red": "#dd464c", + "green": "#8fc13e", + "yellow": "#fdcc59", + "blue": "#1290bf", + "purple": "#c85e7c", + "cyan": "#149b93", + "white": "#b9b5b8", + "brightBlack": "#797379", + "brightRed": "#fd8b19", + "brightGreen": "#5c545c", + "brightYellow": "#5c545b", + "brightBlue": "#989498", + "brightPurple": "#d5d3d5", + "brightCyan": "#b33508", + "brightWhite": "#ffffff", + "background": "#322931", + "foreground": "#b9b5b8", + "cursorColor": "#b9b5b8", + "selectionBackground": "#5c545b" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Horizon Bright.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Horizon Bright.json new file mode 100644 index 0000000..d82e330 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Horizon Bright.json @@ -0,0 +1,23 @@ +{ + "name": "Horizon Bright", + "black": "#16161d", + "red": "#fc4777", + "green": "#00ca86", + "yellow": "#f2a682", + "blue": "#00bedd", + "purple": "#ff58b1", + "cyan": "#00cdcb", + "white": "#bfafac", + "brightBlack": "#1a1c24", + "brightRed": "#fe5f87", + "brightGreen": "#00d193", + "brightYellow": "#e5a688", + "brightBlue": "#00c9e2", + "brightPurple": "#ff6cba", + "brightCyan": "#00c3c2", + "brightWhite": "#fff2ef", + "background": "#fdf0ed", + "foreground": "#16161d", + "cursorColor": "#d3a89d", + "selectionBackground": "#f9cec3" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Horizon.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Horizon.json new file mode 100644 index 0000000..e28501e --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Horizon.json @@ -0,0 +1,23 @@ +{ + "name": "Horizon", + "black": "#000000", + "red": "#e95678", + "green": "#29d398", + "yellow": "#fab795", + "blue": "#26bbd9", + "purple": "#ee64ac", + "cyan": "#59e1e3", + "white": "#e5e5e5", + "brightBlack": "#666666", + "brightRed": "#ec6a88", + "brightGreen": "#3fdaa4", + "brightYellow": "#fbc3a7", + "brightBlue": "#3fc4de", + "brightPurple": "#f075b5", + "brightCyan": "#6be4e6", + "brightWhite": "#e5e5e5", + "background": "#1c1e26", + "foreground": "#d5d8da", + "cursorColor": "#6c6f93", + "selectionBackground": "#6c6f93" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hot Dog Stand (Mustard).json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hot Dog Stand (Mustard).json new file mode 100644 index 0000000..67ebc12 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hot Dog Stand (Mustard).json @@ -0,0 +1,23 @@ +{ + "name": "Hot Dog Stand (Mustard)", + "black": "#000000", + "red": "#ea3323", + "green": "#ea3323", + "yellow": "#ea3323", + "blue": "#000000", + "purple": "#ea3323", + "cyan": "#000000", + "white": "#b9b9b9", + "brightBlack": "#000000", + "brightRed": "#ea3323", + "brightGreen": "#ea3323", + "brightYellow": "#ea3323", + "brightBlue": "#000000", + "brightPurple": "#ea3323", + "brightCyan": "#000000", + "brightWhite": "#c6c6c6", + "background": "#ffff54", + "foreground": "#000000", + "cursorColor": "#ea3323", + "selectionBackground": "#ea3323" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hot Dog Stand.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hot Dog Stand.json new file mode 100644 index 0000000..4a682c1 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hot Dog Stand.json @@ -0,0 +1,23 @@ +{ + "name": "Hot Dog Stand", + "black": "#000000", + "red": "#ffff54", + "green": "#ffff54", + "yellow": "#ffff54", + "blue": "#000000", + "purple": "#ffff54", + "cyan": "#ffffff", + "white": "#c6c6c6", + "brightBlack": "#000000", + "brightRed": "#ffff54", + "brightGreen": "#ffff54", + "brightYellow": "#ffff54", + "brightBlue": "#000000", + "brightPurple": "#ffff54", + "brightCyan": "#ffffff", + "brightWhite": "#c6c6c6", + "background": "#ea3323", + "foreground": "#ffffff", + "cursorColor": "#ffff54", + "selectionBackground": "#ffff54" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hurtado.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hurtado.json new file mode 100644 index 0000000..e0323b9 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hurtado.json @@ -0,0 +1,23 @@ +{ + "name": "Hurtado", + "black": "#575757", + "red": "#ff1b00", + "green": "#a5e055", + "yellow": "#fbe74a", + "blue": "#496487", + "purple": "#fd5ff1", + "cyan": "#86e9fe", + "white": "#cbcccb", + "brightBlack": "#404040", + "brightRed": "#d51d00", + "brightGreen": "#a5df55", + "brightYellow": "#fbe84a", + "brightBlue": "#89beff", + "brightPurple": "#c001c1", + "brightCyan": "#86eafe", + "brightWhite": "#dbdbdb", + "background": "#000000", + "foreground": "#dbdbdb", + "cursorColor": "#bbbbbb", + "selectionBackground": "#b5d5ff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hybrid.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hybrid.json new file mode 100644 index 0000000..52cf2a5 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Hybrid.json @@ -0,0 +1,23 @@ +{ + "name": "Hybrid", + "black": "#2a2e33", + "red": "#b84d51", + "green": "#b3bf5a", + "yellow": "#e4b55e", + "blue": "#6e90b0", + "purple": "#a17eac", + "cyan": "#7fbfb4", + "white": "#b5b9b6", + "brightBlack": "#434548", + "brightRed": "#8d2e32", + "brightGreen": "#798431", + "brightYellow": "#e58a50", + "brightBlue": "#4b6b88", + "brightPurple": "#6e5079", + "brightCyan": "#4d7b74", + "brightWhite": "#5a626a", + "background": "#161719", + "foreground": "#b7bcba", + "cursorColor": "#b7bcba", + "selectionBackground": "#1e1f22" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/IBM 5153 CGA (Black).json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/IBM 5153 CGA (Black).json new file mode 100644 index 0000000..201666f --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/IBM 5153 CGA (Black).json @@ -0,0 +1,23 @@ +{ + "name": "IBM 5153 CGA (Black)", + "black": "#000000", + "red": "#c40000", + "green": "#00c400", + "yellow": "#c47e00", + "blue": "#0000c4", + "purple": "#c400c4", + "cyan": "#00c4c4", + "white": "#c4c4c4", + "brightBlack": "#4e4e4e", + "brightRed": "#dc4e4e", + "brightGreen": "#4edc4e", + "brightYellow": "#f3f34e", + "brightBlue": "#4e4edc", + "brightPurple": "#f34ef3", + "brightCyan": "#4ef3f3", + "brightWhite": "#ffffff", + "background": "#000000", + "foreground": "#c4c4c4", + "cursorColor": "#c4c4c4", + "selectionBackground": "#c4c4c4" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/IBM 5153 CGA.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/IBM 5153 CGA.json new file mode 100644 index 0000000..103175f --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/IBM 5153 CGA.json @@ -0,0 +1,23 @@ +{ + "name": "IBM 5153 CGA", + "black": "#141414", + "red": "#d03333", + "green": "#1bd01b", + "yellow": "#d08c1b", + "blue": "#1b1bd0", + "purple": "#d01bd0", + "cyan": "#1bd0d0", + "white": "#cecece", + "brightBlack": "#4e4e4e", + "brightRed": "#dc4e4e", + "brightGreen": "#4edc4e", + "brightYellow": "#f3f34e", + "brightBlue": "#4e4edc", + "brightPurple": "#f34ef3", + "brightCyan": "#4ef3f3", + "brightWhite": "#ffffff", + "background": "#141414", + "foreground": "#cecece", + "cursorColor": "#cecece", + "selectionBackground": "#cecece" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/IC Green PPL.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/IC Green PPL.json new file mode 100644 index 0000000..49abf2b --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/IC Green PPL.json @@ -0,0 +1,23 @@ +{ + "name": "IC Green PPL", + "black": "#014401", + "red": "#ff2736", + "green": "#41a638", + "yellow": "#76a831", + "blue": "#2ec3b9", + "purple": "#50a096", + "cyan": "#3ca078", + "white": "#e6fef2", + "brightBlack": "#106910", + "brightRed": "#b4fa5c", + "brightGreen": "#aefb86", + "brightYellow": "#dafa87", + "brightBlue": "#2efaeb", + "brightPurple": "#50fafa", + "brightCyan": "#3cfac8", + "brightWhite": "#e0f1dc", + "background": "#2c2c2c", + "foreground": "#e0f1dc", + "cursorColor": "#47fa6b", + "selectionBackground": "#116b41" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/IC Orange PPL.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/IC Orange PPL.json new file mode 100644 index 0000000..69b50e5 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/IC Orange PPL.json @@ -0,0 +1,23 @@ +{ + "name": "IC Orange PPL", + "black": "#000000", + "red": "#c13900", + "green": "#a4a900", + "yellow": "#caaf00", + "blue": "#bd6d00", + "purple": "#fc5e00", + "cyan": "#f79500", + "white": "#ffc88a", + "brightBlack": "#6a4f2a", + "brightRed": "#ff8c68", + "brightGreen": "#f6ff40", + "brightYellow": "#ffe36e", + "brightBlue": "#ffbe55", + "brightPurple": "#fc874f", + "brightCyan": "#c69752", + "brightWhite": "#fafaff", + "background": "#262626", + "foreground": "#ffcb83", + "cursorColor": "#fc531d", + "selectionBackground": "#c14020" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/IR Black.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/IR Black.json new file mode 100644 index 0000000..91a7d1a --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/IR Black.json @@ -0,0 +1,23 @@ +{ + "name": "IR Black", + "black": "#4f4f4f", + "red": "#fa6c60", + "green": "#a8ff60", + "yellow": "#fffeb7", + "blue": "#96cafe", + "purple": "#fa73fd", + "cyan": "#c6c5fe", + "white": "#efedef", + "brightBlack": "#7b7b7b", + "brightRed": "#fcb6b0", + "brightGreen": "#cfffab", + "brightYellow": "#ffffcc", + "brightBlue": "#b5dcff", + "brightPurple": "#fb9cfe", + "brightCyan": "#e0e0fe", + "brightWhite": "#ffffff", + "background": "#000000", + "foreground": "#f1f1f1", + "cursorColor": "#808080", + "selectionBackground": "#b5d5ff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/IRIX Console.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/IRIX Console.json new file mode 100644 index 0000000..c400496 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/IRIX Console.json @@ -0,0 +1,23 @@ +{ + "name": "IRIX Console", + "black": "#1a1919", + "red": "#d42426", + "green": "#37a327", + "yellow": "#c29d28", + "blue": "#0739e2", + "purple": "#911f9c", + "cyan": "#4497df", + "white": "#cccccc", + "brightBlack": "#767676", + "brightRed": "#f34f59", + "brightGreen": "#45c731", + "brightYellow": "#f9f2a7", + "brightBlue": "#4079ff", + "brightPurple": "#c31ba2", + "brightCyan": "#6ed7d7", + "brightWhite": "#f2f2f2", + "background": "#0c0c0c", + "foreground": "#f2f2f2", + "cursorColor": "#c7c7c7", + "selectionBackground": "#c2deff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/IRIX Terminal.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/IRIX Terminal.json new file mode 100644 index 0000000..5c0b809 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/IRIX Terminal.json @@ -0,0 +1,23 @@ +{ + "name": "IRIX Terminal", + "black": "#1a1919", + "red": "#ff2b1e", + "green": "#57ff3d", + "yellow": "#ffff44", + "blue": "#0004ff", + "purple": "#ff2cff", + "cyan": "#56ffff", + "white": "#ffffff", + "brightBlack": "#ffff44", + "brightRed": "#ffff44", + "brightGreen": "#ffff44", + "brightYellow": "#fffc72", + "brightBlue": "#ffff44", + "brightPurple": "#ffff44", + "brightCyan": "#ffff44", + "brightWhite": "#ffff44", + "background": "#000043", + "foreground": "#f2f2f2", + "cursorColor": "#c7c7c7", + "selectionBackground": "#c2deff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Iceberg Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Iceberg Dark.json new file mode 100644 index 0000000..ecb5fed --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Iceberg Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Iceberg Dark", + "black": "#1e2132", + "red": "#e27878", + "green": "#b4be82", + "yellow": "#e2a478", + "blue": "#84a0c6", + "purple": "#a093c7", + "cyan": "#89b8c2", + "white": "#c6c8d1", + "brightBlack": "#6b7089", + "brightRed": "#e98989", + "brightGreen": "#c0ca8e", + "brightYellow": "#e9b189", + "brightBlue": "#91acd1", + "brightPurple": "#ada0d3", + "brightCyan": "#95c4ce", + "brightWhite": "#d2d4de", + "background": "#161821", + "foreground": "#c6c8d1", + "cursorColor": "#c6c8d1", + "selectionBackground": "#c6c8d1" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Iceberg Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Iceberg Light.json new file mode 100644 index 0000000..f7bb498 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Iceberg Light.json @@ -0,0 +1,23 @@ +{ + "name": "Iceberg Light", + "black": "#dcdfe7", + "red": "#cc517a", + "green": "#668e3d", + "yellow": "#c57339", + "blue": "#2d539e", + "purple": "#7759b4", + "cyan": "#3f83a6", + "white": "#33374c", + "brightBlack": "#8389a3", + "brightRed": "#cc3768", + "brightGreen": "#598030", + "brightYellow": "#b6662d", + "brightBlue": "#22478e", + "brightPurple": "#6845ad", + "brightCyan": "#327698", + "brightWhite": "#262a3f", + "background": "#e8e9ec", + "foreground": "#33374c", + "cursorColor": "#33374c", + "selectionBackground": "#33374c" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Idea.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Idea.json new file mode 100644 index 0000000..2fd4463 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Idea.json @@ -0,0 +1,23 @@ +{ + "name": "Idea", + "black": "#adadad", + "red": "#fc5256", + "green": "#98b61c", + "yellow": "#ccb444", + "blue": "#437ee7", + "purple": "#9d74b0", + "cyan": "#248887", + "white": "#4b4b4b", + "brightBlack": "#ffffff", + "brightRed": "#fc7072", + "brightGreen": "#98b61c", + "brightYellow": "#ffff0b", + "brightBlue": "#6c9ced", + "brightPurple": "#fc7eff", + "brightCyan": "#248887", + "brightWhite": "#181818", + "background": "#202020", + "foreground": "#adadad", + "cursorColor": "#bbbbbb", + "selectionBackground": "#44475a" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Idle Toes.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Idle Toes.json new file mode 100644 index 0000000..b8f4c1d --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Idle Toes.json @@ -0,0 +1,23 @@ +{ + "name": "Idle Toes", + "black": "#323232", + "red": "#d25252", + "green": "#7fe173", + "yellow": "#ffc66d", + "blue": "#4099ff", + "purple": "#f680ff", + "cyan": "#bed6ff", + "white": "#eeeeec", + "brightBlack": "#606060", + "brightRed": "#f07070", + "brightGreen": "#9dff91", + "brightYellow": "#ffe48b", + "brightBlue": "#5eb7f7", + "brightPurple": "#ff9dff", + "brightCyan": "#dcf4ff", + "brightWhite": "#ffffff", + "background": "#323232", + "foreground": "#ffffff", + "cursorColor": "#d6d6d6", + "selectionBackground": "#5b5b5b" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Jackie Brown.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Jackie Brown.json new file mode 100644 index 0000000..1d5d227 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Jackie Brown.json @@ -0,0 +1,23 @@ +{ + "name": "Jackie Brown", + "black": "#2c1d16", + "red": "#ef5734", + "green": "#2baf2b", + "yellow": "#bebf00", + "blue": "#246eb2", + "purple": "#d05ec1", + "cyan": "#00acee", + "white": "#bfbfbf", + "brightBlack": "#666666", + "brightRed": "#e50000", + "brightGreen": "#86a93e", + "brightYellow": "#e5e500", + "brightBlue": "#0000ff", + "brightPurple": "#e500e5", + "brightCyan": "#00e5e5", + "brightWhite": "#e5e5e5", + "background": "#2c1d16", + "foreground": "#ffcc2f", + "cursorColor": "#23ff18", + "selectionBackground": "#af8d21" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Japanesque.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Japanesque.json new file mode 100644 index 0000000..49c98bd --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Japanesque.json @@ -0,0 +1,23 @@ +{ + "name": "Japanesque", + "black": "#343935", + "red": "#cf3f61", + "green": "#7bb75b", + "yellow": "#e9b32a", + "blue": "#4c9ad4", + "purple": "#a57fc4", + "cyan": "#389aad", + "white": "#fafaf6", + "brightBlack": "#595b59", + "brightRed": "#d18fa6", + "brightGreen": "#767f2c", + "brightYellow": "#78592f", + "brightBlue": "#135979", + "brightPurple": "#604291", + "brightCyan": "#76bbca", + "brightWhite": "#b2b5ae", + "background": "#1e1e1e", + "foreground": "#f7f6ec", + "cursorColor": "#edcf4f", + "selectionBackground": "#175877" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Jellybeans.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Jellybeans.json new file mode 100644 index 0000000..3db0c23 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Jellybeans.json @@ -0,0 +1,23 @@ +{ + "name": "Jellybeans", + "black": "#929292", + "red": "#e27373", + "green": "#94b979", + "yellow": "#ffba7b", + "blue": "#97bedc", + "purple": "#e1c0fa", + "cyan": "#00988e", + "white": "#dedede", + "brightBlack": "#bdbdbd", + "brightRed": "#ffa1a1", + "brightGreen": "#bddeab", + "brightYellow": "#ffdca0", + "brightBlue": "#b1d8f6", + "brightPurple": "#fbdaff", + "brightCyan": "#1ab2a8", + "brightWhite": "#ffffff", + "background": "#121212", + "foreground": "#dedede", + "cursorColor": "#ffa560", + "selectionBackground": "#474e91" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/JetBrains Darcula.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/JetBrains Darcula.json new file mode 100644 index 0000000..5a8723b --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/JetBrains Darcula.json @@ -0,0 +1,23 @@ +{ + "name": "JetBrains Darcula", + "black": "#000000", + "red": "#fa5355", + "green": "#126e00", + "yellow": "#c2c300", + "blue": "#4581eb", + "purple": "#fa54ff", + "cyan": "#33c2c1", + "white": "#adadad", + "brightBlack": "#555555", + "brightRed": "#fb7172", + "brightGreen": "#67ff4f", + "brightYellow": "#ffff00", + "brightBlue": "#6d9df1", + "brightPurple": "#fb82ff", + "brightCyan": "#60d3d1", + "brightWhite": "#eeeeee", + "background": "#202020", + "foreground": "#adadad", + "cursorColor": "#ffffff", + "selectionBackground": "#1a3272" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Jubi.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Jubi.json new file mode 100644 index 0000000..2c82045 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Jubi.json @@ -0,0 +1,23 @@ +{ + "name": "Jubi", + "black": "#3b3750", + "red": "#cf7b98", + "green": "#90a94b", + "yellow": "#6ebfc0", + "blue": "#576ea6", + "purple": "#bc4f68", + "cyan": "#75a7d2", + "white": "#c3d3de", + "brightBlack": "#a874ce", + "brightRed": "#de90ab", + "brightGreen": "#bcdd61", + "brightYellow": "#87e9ea", + "brightBlue": "#8c9fcd", + "brightPurple": "#e16c87", + "brightCyan": "#b7c9ef", + "brightWhite": "#d5e5f1", + "background": "#262b33", + "foreground": "#c3d3de", + "cursorColor": "#c3d3de", + "selectionBackground": "#5b5184" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Kanagawa Dragon.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Kanagawa Dragon.json new file mode 100644 index 0000000..97e9416 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Kanagawa Dragon.json @@ -0,0 +1,23 @@ +{ + "name": "Kanagawa Dragon", + "black": "#0d0c0c", + "red": "#c4746e", + "green": "#8a9a7b", + "yellow": "#c4b28a", + "blue": "#8ba4b0", + "purple": "#a292a3", + "cyan": "#8ea4a2", + "white": "#c8c093", + "brightBlack": "#a6a69c", + "brightRed": "#e46876", + "brightGreen": "#87a987", + "brightYellow": "#e6c384", + "brightBlue": "#7fb4ca", + "brightPurple": "#938aa9", + "brightCyan": "#7aa89f", + "brightWhite": "#c5c9c5", + "background": "#181616", + "foreground": "#c8c093", + "cursorColor": "#c5c9c5", + "selectionBackground": "#223249" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Kanagawa Wave.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Kanagawa Wave.json new file mode 100644 index 0000000..5387e66 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Kanagawa Wave.json @@ -0,0 +1,23 @@ +{ + "name": "Kanagawa Wave", + "black": "#090618", + "red": "#c34043", + "green": "#76946a", + "yellow": "#c0a36e", + "blue": "#7e9cd8", + "purple": "#957fb8", + "cyan": "#6a9589", + "white": "#c8c093", + "brightBlack": "#727169", + "brightRed": "#e82424", + "brightGreen": "#98bb6c", + "brightYellow": "#e6c384", + "brightBlue": "#7fb4ca", + "brightPurple": "#938aa9", + "brightCyan": "#7aa89f", + "brightWhite": "#dcd7ba", + "background": "#1f1f28", + "foreground": "#dcd7ba", + "cursorColor": "#c8c093", + "selectionBackground": "#2d4f67" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Kanagawabones.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Kanagawabones.json new file mode 100644 index 0000000..89db752 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Kanagawabones.json @@ -0,0 +1,23 @@ +{ + "name": "Kanagawabones", + "black": "#1f1f28", + "red": "#e46a78", + "green": "#98bc6d", + "yellow": "#e5c283", + "blue": "#7eb3c9", + "purple": "#957fb8", + "cyan": "#7eb3c9", + "white": "#ddd8bb", + "brightBlack": "#49495e", + "brightRed": "#ec818c", + "brightGreen": "#9ec967", + "brightYellow": "#f1c982", + "brightBlue": "#7bc2df", + "brightPurple": "#a98fd2", + "brightCyan": "#7bc2df", + "brightWhite": "#a8a48d", + "background": "#1f1f28", + "foreground": "#ddd8bb", + "cursorColor": "#e6e0c2", + "selectionBackground": "#49473e" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Kibble.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Kibble.json new file mode 100644 index 0000000..9023b6d --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Kibble.json @@ -0,0 +1,23 @@ +{ + "name": "Kibble", + "black": "#4d4d4d", + "red": "#c70031", + "green": "#29cf13", + "yellow": "#d8e30e", + "blue": "#3449d1", + "purple": "#8400ff", + "cyan": "#0798ab", + "white": "#e2d1e3", + "brightBlack": "#5a5a5a", + "brightRed": "#f01578", + "brightGreen": "#6ce05c", + "brightYellow": "#f3f79e", + "brightBlue": "#97a4f7", + "brightPurple": "#c495f0", + "brightCyan": "#68f2e0", + "brightWhite": "#ffffff", + "background": "#0e100a", + "foreground": "#f7f7f7", + "cursorColor": "#9fda9c", + "selectionBackground": "#9ba787" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Kitty Default.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Kitty Default.json new file mode 100644 index 0000000..d2b60ed --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Kitty Default.json @@ -0,0 +1,23 @@ +{ + "name": "Kitty Default", + "black": "#000000", + "red": "#cc0403", + "green": "#19cb00", + "yellow": "#cecb00", + "blue": "#0d73cc", + "purple": "#cb1ed1", + "cyan": "#0dcdcd", + "white": "#dddddd", + "brightBlack": "#767676", + "brightRed": "#f2201f", + "brightGreen": "#23fd00", + "brightYellow": "#fffd00", + "brightBlue": "#1a8fff", + "brightPurple": "#fd28ff", + "brightCyan": "#14ffff", + "brightWhite": "#ffffff", + "background": "#000000", + "foreground": "#dddddd", + "cursorColor": "#cccccc", + "selectionBackground": "#fffacd" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Kitty Low Contrast.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Kitty Low Contrast.json new file mode 100644 index 0000000..e6576c1 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Kitty Low Contrast.json @@ -0,0 +1,23 @@ +{ + "name": "Kitty Low Contrast", + "black": "#000000", + "red": "#cc0403", + "green": "#19cb00", + "yellow": "#cecb00", + "blue": "#0d73cc", + "purple": "#cb1ed1", + "cyan": "#0dcdcd", + "white": "#dddddd", + "brightBlack": "#767676", + "brightRed": "#f2201f", + "brightGreen": "#23fd00", + "brightYellow": "#fffd00", + "brightBlue": "#1a8fff", + "brightPurple": "#fd28ff", + "brightCyan": "#14ffff", + "brightWhite": "#ffffff", + "background": "#333333", + "foreground": "#ffffff", + "cursorColor": "#cccccc", + "selectionBackground": "#fffacd" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Kolorit.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Kolorit.json new file mode 100644 index 0000000..859aa92 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Kolorit.json @@ -0,0 +1,23 @@ +{ + "name": "Kolorit", + "black": "#1d1a1e", + "red": "#ff5b82", + "green": "#47d7a1", + "yellow": "#e8e562", + "blue": "#5db4ee", + "purple": "#da6cda", + "cyan": "#57e9eb", + "white": "#ededed", + "brightBlack": "#504d51", + "brightRed": "#ff5b82", + "brightGreen": "#47d7a1", + "brightYellow": "#e8e562", + "brightBlue": "#5db4ee", + "brightPurple": "#da6cda", + "brightCyan": "#57e9eb", + "brightWhite": "#ededed", + "background": "#1d1a1e", + "foreground": "#efecec", + "cursorColor": "#c7c7c7", + "selectionBackground": "#e1925c" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Konsolas.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Konsolas.json new file mode 100644 index 0000000..4511c6d --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Konsolas.json @@ -0,0 +1,23 @@ +{ + "name": "Konsolas", + "black": "#000000", + "red": "#aa1717", + "green": "#18b218", + "yellow": "#ebae1f", + "blue": "#2323a5", + "purple": "#ad1edc", + "cyan": "#42b0c8", + "white": "#c8c1c1", + "brightBlack": "#7b716e", + "brightRed": "#ff4141", + "brightGreen": "#5fff5f", + "brightYellow": "#ffff55", + "brightBlue": "#4b4bff", + "brightPurple": "#ff54ff", + "brightCyan": "#69ffff", + "brightWhite": "#ffffff", + "background": "#060606", + "foreground": "#c8c1c1", + "cursorColor": "#c8c1c1", + "selectionBackground": "#060606" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Kurokula.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Kurokula.json new file mode 100644 index 0000000..c7854f7 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Kurokula.json @@ -0,0 +1,23 @@ +{ + "name": "Kurokula", + "black": "#333333", + "red": "#c35a52", + "green": "#78b3a9", + "yellow": "#e1b917", + "blue": "#5c91dd", + "purple": "#8b79a6", + "cyan": "#867268", + "white": "#e0cfc2", + "brightBlack": "#515151", + "brightRed": "#ffc34c", + "brightGreen": "#afffa5", + "brightYellow": "#fff700", + "brightBlue": "#90dbff", + "brightPurple": "#ad93ff", + "brightCyan": "#ffcdb6", + "brightWhite": "#ffffff", + "background": "#141515", + "foreground": "#e0cfc2", + "cursorColor": "#7a1c1c", + "selectionBackground": "#515151" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Lab Fox.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Lab Fox.json new file mode 100644 index 0000000..206b875 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Lab Fox.json @@ -0,0 +1,23 @@ +{ + "name": "Lab Fox", + "black": "#2e2e2e", + "red": "#fc6d26", + "green": "#3eb383", + "yellow": "#fca121", + "blue": "#db3b21", + "purple": "#6b40a8", + "cyan": "#6e49cb", + "white": "#ffffff", + "brightBlack": "#535353", + "brightRed": "#ff6517", + "brightGreen": "#53eaa8", + "brightYellow": "#fca013", + "brightBlue": "#db501f", + "brightPurple": "#6a36b6", + "brightCyan": "#7d53e7", + "brightWhite": "#ffffff", + "background": "#2e2e2e", + "foreground": "#ffffff", + "cursorColor": "#7f7f7f", + "selectionBackground": "#cb392e" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Laser.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Laser.json new file mode 100644 index 0000000..00b79a1 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Laser.json @@ -0,0 +1,23 @@ +{ + "name": "Laser", + "black": "#626262", + "red": "#ff8373", + "green": "#b4fb73", + "yellow": "#09b4bd", + "blue": "#fed300", + "purple": "#ff90fe", + "cyan": "#d1d1fe", + "white": "#f1f1f1", + "brightBlack": "#8f8f8f", + "brightRed": "#ffc4be", + "brightGreen": "#d6fcba", + "brightYellow": "#fffed5", + "brightBlue": "#f92883", + "brightPurple": "#ffb2fe", + "brightCyan": "#e6e7fe", + "brightWhite": "#ffffff", + "background": "#030d18", + "foreground": "#f106e3", + "cursorColor": "#00ff9c", + "selectionBackground": "#2e206a" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Later This Evening.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Later This Evening.json new file mode 100644 index 0000000..c8a964f --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Later This Evening.json @@ -0,0 +1,23 @@ +{ + "name": "Later This Evening", + "black": "#2b2b2b", + "red": "#d45a60", + "green": "#afba67", + "yellow": "#e5d289", + "blue": "#a0bad6", + "purple": "#c092d6", + "cyan": "#91bfb7", + "white": "#494a4a", + "brightBlack": "#525454", + "brightRed": "#d3232f", + "brightGreen": "#aabb39", + "brightYellow": "#e5be39", + "brightBlue": "#6699d6", + "brightPurple": "#ab53d6", + "brightCyan": "#5fc0ae", + "brightWhite": "#c1c2c2", + "background": "#222222", + "foreground": "#959595", + "cursorColor": "#4f4f4f", + "selectionBackground": "#424242" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Lavandula.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Lavandula.json new file mode 100644 index 0000000..4b04d1b --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Lavandula.json @@ -0,0 +1,23 @@ +{ + "name": "Lavandula", + "black": "#230046", + "red": "#7d1625", + "green": "#337e6f", + "yellow": "#7f6f49", + "blue": "#4f4a7f", + "purple": "#5a3f7f", + "cyan": "#58777f", + "white": "#736e7d", + "brightBlack": "#443a53", + "brightRed": "#e05167", + "brightGreen": "#52e0c4", + "brightYellow": "#e0c386", + "brightBlue": "#8e87e0", + "brightPurple": "#a776e0", + "brightCyan": "#9ad4e0", + "brightWhite": "#8c91fa", + "background": "#050014", + "foreground": "#736e7d", + "cursorColor": "#8c91fa", + "selectionBackground": "#37323c" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Light Owl.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Light Owl.json new file mode 100644 index 0000000..d4d67ef --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Light Owl.json @@ -0,0 +1,23 @@ +{ + "name": "Light Owl", + "black": "#403f53", + "red": "#de3d3b", + "green": "#08916a", + "yellow": "#e0af02", + "blue": "#288ed7", + "purple": "#d6438a", + "cyan": "#2aa298", + "white": "#bdbdbd", + "brightBlack": "#989fb1", + "brightRed": "#de3d3b", + "brightGreen": "#08916a", + "brightYellow": "#daaa01", + "brightBlue": "#288ed7", + "brightPurple": "#d6438a", + "brightCyan": "#2aa298", + "brightWhite": "#f0f0f0", + "background": "#fbfbfb", + "foreground": "#403f53", + "cursorColor": "#403f53", + "selectionBackground": "#e0e0e0" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Liquid Carbon Transparent.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Liquid Carbon Transparent.json new file mode 100644 index 0000000..89f222e5 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Liquid Carbon Transparent.json @@ -0,0 +1,23 @@ +{ + "name": "Liquid Carbon Transparent", + "black": "#000000", + "red": "#ff3030", + "green": "#559a70", + "yellow": "#ccac00", + "blue": "#0099cc", + "purple": "#cc69c8", + "cyan": "#7ac4cc", + "white": "#bccccc", + "brightBlack": "#404040", + "brightRed": "#ff3030", + "brightGreen": "#559a70", + "brightYellow": "#ccac00", + "brightBlue": "#0099cc", + "brightPurple": "#cc69c8", + "brightCyan": "#7ac4cc", + "brightWhite": "#bccccc", + "background": "#000000", + "foreground": "#afc2c2", + "cursorColor": "#ffffff", + "selectionBackground": "#7dbeff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Liquid Carbon.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Liquid Carbon.json new file mode 100644 index 0000000..54cc9cc --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Liquid Carbon.json @@ -0,0 +1,23 @@ +{ + "name": "Liquid Carbon", + "black": "#000000", + "red": "#ff3030", + "green": "#559a70", + "yellow": "#ccac00", + "blue": "#0099cc", + "purple": "#cc69c8", + "cyan": "#7ac4cc", + "white": "#bccccc", + "brightBlack": "#595959", + "brightRed": "#ff3030", + "brightGreen": "#559a70", + "brightYellow": "#ccac00", + "brightBlue": "#0099cc", + "brightPurple": "#cc69c8", + "brightCyan": "#7ac4cc", + "brightWhite": "#bccccc", + "background": "#303030", + "foreground": "#afc2c2", + "cursorColor": "#ffffff", + "selectionBackground": "#7dbeff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Lovelace.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Lovelace.json new file mode 100644 index 0000000..3c81279 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Lovelace.json @@ -0,0 +1,23 @@ +{ + "name": "Lovelace", + "black": "#282a36", + "red": "#f37f97", + "green": "#5adecd", + "yellow": "#f2a272", + "blue": "#8897f4", + "purple": "#c574dd", + "cyan": "#79e6f3", + "white": "#fdfdfd", + "brightBlack": "#4e5165", + "brightRed": "#ff4971", + "brightGreen": "#18e3c8", + "brightYellow": "#ff8037", + "brightBlue": "#556fff", + "brightPurple": "#b043d1", + "brightCyan": "#3fdcee", + "brightWhite": "#bebec1", + "background": "#1d1f28", + "foreground": "#fdfdfd", + "cursorColor": "#c574dd", + "selectionBackground": "#c1deff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Man Page.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Man Page.json new file mode 100644 index 0000000..d542ba2 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Man Page.json @@ -0,0 +1,23 @@ +{ + "name": "Man Page", + "black": "#000000", + "red": "#cc0000", + "green": "#00a600", + "yellow": "#999900", + "blue": "#0000b2", + "purple": "#b200b2", + "cyan": "#00a6b2", + "white": "#b2b2b2", + "brightBlack": "#666666", + "brightRed": "#e50000", + "brightGreen": "#00cc00", + "brightYellow": "#bfbf00", + "brightBlue": "#0000ff", + "brightPurple": "#e500e5", + "brightCyan": "#00cbcb", + "brightWhite": "#e5e5e5", + "background": "#fef49c", + "foreground": "#000000", + "cursorColor": "#7f7f7f", + "selectionBackground": "#a4c9cd" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Mariana.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Mariana.json new file mode 100644 index 0000000..b064013 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Mariana.json @@ -0,0 +1,23 @@ +{ + "name": "Mariana", + "black": "#000000", + "red": "#ec5f66", + "green": "#99c794", + "yellow": "#f9ae58", + "blue": "#6699cc", + "purple": "#c695c6", + "cyan": "#5fb4b4", + "white": "#f7f7f7", + "brightBlack": "#666666", + "brightRed": "#f97b58", + "brightGreen": "#acd1a8", + "brightYellow": "#fac761", + "brightBlue": "#85add6", + "brightPurple": "#d8b6d8", + "brightCyan": "#82c4c4", + "brightWhite": "#ffffff", + "background": "#343d46", + "foreground": "#d8dee9", + "cursorColor": "#fcbb6a", + "selectionBackground": "#4e5a65" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Material Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Material Dark.json new file mode 100644 index 0000000..a3affc5 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Material Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Material Dark", + "black": "#212121", + "red": "#b7141f", + "green": "#457b24", + "yellow": "#f6981e", + "blue": "#134eb2", + "purple": "#701aa2", + "cyan": "#0e717c", + "white": "#efefef", + "brightBlack": "#4f4f4f", + "brightRed": "#e83b3f", + "brightGreen": "#7aba3a", + "brightYellow": "#ffea2e", + "brightBlue": "#54a4f3", + "brightPurple": "#aa4dbc", + "brightCyan": "#26bbd1", + "brightWhite": "#d9d9d9", + "background": "#232322", + "foreground": "#e5e5e5", + "cursorColor": "#16afca", + "selectionBackground": "#dfdfdf" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Material Darker.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Material Darker.json new file mode 100644 index 0000000..5ccce3f --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Material Darker.json @@ -0,0 +1,23 @@ +{ + "name": "Material Darker", + "black": "#000000", + "red": "#ff5370", + "green": "#c3e88d", + "yellow": "#ffcb6b", + "blue": "#82aaff", + "purple": "#c792ea", + "cyan": "#89ddff", + "white": "#ffffff", + "brightBlack": "#545454", + "brightRed": "#ff5370", + "brightGreen": "#c3e88d", + "brightYellow": "#ffcb6b", + "brightBlue": "#82aaff", + "brightPurple": "#c792ea", + "brightCyan": "#89ddff", + "brightWhite": "#ffffff", + "background": "#212121", + "foreground": "#eeffff", + "cursorColor": "#ffffff", + "selectionBackground": "#eeffff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Material Design Colors.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Material Design Colors.json new file mode 100644 index 0000000..85a7a1d --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Material Design Colors.json @@ -0,0 +1,23 @@ +{ + "name": "Material Design Colors", + "black": "#435b67", + "red": "#fc3841", + "green": "#5cf19e", + "yellow": "#fed032", + "blue": "#37b6ff", + "purple": "#fc226e", + "cyan": "#59ffd1", + "white": "#ffffff", + "brightBlack": "#a1b0b8", + "brightRed": "#fc746d", + "brightGreen": "#adf7be", + "brightYellow": "#fee16c", + "brightBlue": "#70cfff", + "brightPurple": "#fc669b", + "brightCyan": "#9affe6", + "brightWhite": "#ffffff", + "background": "#1d262a", + "foreground": "#e7ebed", + "cursorColor": "#eaeaea", + "selectionBackground": "#4e6a78" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Material Ocean.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Material Ocean.json new file mode 100644 index 0000000..bc57923 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Material Ocean.json @@ -0,0 +1,23 @@ +{ + "name": "Material Ocean", + "black": "#546e7a", + "red": "#ff5370", + "green": "#c3e88d", + "yellow": "#ffcb6b", + "blue": "#82aaff", + "purple": "#c792ea", + "cyan": "#89ddff", + "white": "#ffffff", + "brightBlack": "#546e7a", + "brightRed": "#ff5370", + "brightGreen": "#c3e88d", + "brightYellow": "#ffcb6b", + "brightBlue": "#82aaff", + "brightPurple": "#c792ea", + "brightCyan": "#89ddff", + "brightWhite": "#ffffff", + "background": "#0f111a", + "foreground": "#8f93a2", + "cursorColor": "#ffcc00", + "selectionBackground": "#1f2233" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Material.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Material.json new file mode 100644 index 0000000..a38c628 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Material.json @@ -0,0 +1,23 @@ +{ + "name": "Material", + "black": "#212121", + "red": "#b7141f", + "green": "#457b24", + "yellow": "#f6981e", + "blue": "#134eb2", + "purple": "#560088", + "cyan": "#0e717c", + "white": "#afafaf", + "brightBlack": "#424242", + "brightRed": "#e83b3f", + "brightGreen": "#7aba3a", + "brightYellow": "#bfaa00", + "brightBlue": "#54a4f3", + "brightPurple": "#aa4dbc", + "brightCyan": "#26bbd1", + "brightWhite": "#d9d9d9", + "background": "#eaeaea", + "foreground": "#232322", + "cursorColor": "#16afca", + "selectionBackground": "#c2c2c2" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Mathias.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Mathias.json new file mode 100644 index 0000000..3ab4c00 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Mathias.json @@ -0,0 +1,23 @@ +{ + "name": "Mathias", + "black": "#000000", + "red": "#e52222", + "green": "#a6e32d", + "yellow": "#fc951e", + "blue": "#c48dff", + "purple": "#fa2573", + "cyan": "#67d9f0", + "white": "#f2f2f2", + "brightBlack": "#555555", + "brightRed": "#ff5555", + "brightGreen": "#55ff55", + "brightYellow": "#ffff55", + "brightBlue": "#5555ff", + "brightPurple": "#ff55ff", + "brightCyan": "#55ffff", + "brightWhite": "#ffffff", + "background": "#000000", + "foreground": "#bbbbbb", + "cursorColor": "#bbbbbb", + "selectionBackground": "#555555" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Matrix.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Matrix.json new file mode 100644 index 0000000..e1f490c --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Matrix.json @@ -0,0 +1,23 @@ +{ + "name": "Matrix", + "black": "#0f191c", + "red": "#23755a", + "green": "#82d967", + "yellow": "#ffd700", + "blue": "#3f5242", + "purple": "#409931", + "cyan": "#50b45a", + "white": "#507350", + "brightBlack": "#688060", + "brightRed": "#2fc079", + "brightGreen": "#90d762", + "brightYellow": "#faff00", + "brightBlue": "#4f7e7e", + "brightPurple": "#11ff25", + "brightCyan": "#c1ff8a", + "brightWhite": "#678c61", + "background": "#0f191c", + "foreground": "#426644", + "cursorColor": "#384545", + "selectionBackground": "#18282e" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Matte Black.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Matte Black.json new file mode 100644 index 0000000..70b549e --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Matte Black.json @@ -0,0 +1,23 @@ +{ + "name": "Matte Black", + "black": "#333333", + "red": "#d35f5f", + "green": "#ffc107", + "yellow": "#b91c1c", + "blue": "#e68e0d", + "purple": "#d35f5f", + "cyan": "#bebebe", + "white": "#bebebe", + "brightBlack": "#8a8a8d", + "brightRed": "#891c1c", + "brightGreen": "#ffc107", + "brightYellow": "#b90a0a", + "brightBlue": "#f59e0b", + "brightPurple": "#b91c1c", + "brightCyan": "#eaeaea", + "brightWhite": "#ffffff", + "background": "#121212", + "foreground": "#bebebe", + "cursorColor": "#eaeaea", + "selectionBackground": "#333333" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Medallion.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Medallion.json new file mode 100644 index 0000000..2781de0 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Medallion.json @@ -0,0 +1,23 @@ +{ + "name": "Medallion", + "black": "#000000", + "red": "#b64c00", + "green": "#7c8b16", + "yellow": "#d3bd26", + "blue": "#616bb0", + "purple": "#8c5a90", + "cyan": "#916c25", + "white": "#cac29a", + "brightBlack": "#5e5219", + "brightRed": "#ff9149", + "brightGreen": "#b2ca3b", + "brightYellow": "#ffe54a", + "brightBlue": "#acb8ff", + "brightPurple": "#ffa0ff", + "brightCyan": "#ffbc51", + "brightWhite": "#fed698", + "background": "#1d1908", + "foreground": "#cac296", + "cursorColor": "#d3ba30", + "selectionBackground": "#626dac" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Melange Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Melange Dark.json new file mode 100644 index 0000000..a1d8ac3 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Melange Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Melange Dark", + "black": "#34302c", + "red": "#bd8183", + "green": "#78997a", + "yellow": "#e49b5d", + "blue": "#7f91b2", + "purple": "#b380b0", + "cyan": "#7b9695", + "white": "#c1a78e", + "brightBlack": "#867462", + "brightRed": "#d47766", + "brightGreen": "#85b695", + "brightYellow": "#ebc06d", + "brightBlue": "#a3a9ce", + "brightPurple": "#cf9bc2", + "brightCyan": "#89b3b6", + "brightWhite": "#ece1d7", + "background": "#292522", + "foreground": "#ece1d7", + "cursorColor": "#ece1d7", + "selectionBackground": "#ece1d7" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Melange Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Melange Light.json new file mode 100644 index 0000000..d9a88ae --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Melange Light.json @@ -0,0 +1,23 @@ +{ + "name": "Melange Light", + "black": "#e9e1db", + "red": "#c77b8b", + "green": "#6e9b72", + "yellow": "#bc5c00", + "blue": "#7892bd", + "purple": "#be79bb", + "cyan": "#739797", + "white": "#7d6658", + "brightBlack": "#a98a78", + "brightRed": "#bf0021", + "brightGreen": "#3a684a", + "brightYellow": "#a06d00", + "brightBlue": "#465aa4", + "brightPurple": "#904180", + "brightCyan": "#3d6568", + "brightWhite": "#54433a", + "background": "#f1f1f1", + "foreground": "#54433a", + "cursorColor": "#54433a", + "selectionBackground": "#54433a" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Mellifluous.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Mellifluous.json new file mode 100644 index 0000000..955e204 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Mellifluous.json @@ -0,0 +1,23 @@ +{ + "name": "Mellifluous", + "black": "#1a1a1a", + "red": "#d29393", + "green": "#b3b393", + "yellow": "#cbaa89", + "blue": "#a8a1be", + "purple": "#b39fb0", + "cyan": "#c0af8c", + "white": "#dadada", + "brightBlack": "#5b5b5b", + "brightRed": "#c95954", + "brightGreen": "#828040", + "brightYellow": "#a6794c", + "brightBlue": "#5a6599", + "brightPurple": "#9c6995", + "brightCyan": "#74a39e", + "brightWhite": "#ffffff", + "background": "#1a1a1a", + "foreground": "#dadada", + "cursorColor": "#bfad9e", + "selectionBackground": "#2d2d2d" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Mellow.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Mellow.json new file mode 100644 index 0000000..e6a9c88 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Mellow.json @@ -0,0 +1,23 @@ +{ + "name": "Mellow", + "black": "#27272a", + "red": "#f5a191", + "green": "#90b99f", + "yellow": "#e6b99d", + "blue": "#aca1cf", + "purple": "#e29eca", + "cyan": "#ea83a5", + "white": "#c1c0d4", + "brightBlack": "#424246", + "brightRed": "#ffae9f", + "brightGreen": "#9dc6ac", + "brightYellow": "#f0c5a9", + "brightBlue": "#b9aeda", + "brightPurple": "#ecaad6", + "brightCyan": "#f591b2", + "brightWhite": "#cac9dd", + "background": "#161617", + "foreground": "#c9c7cd", + "cursorColor": "#cac9dd", + "selectionBackground": "#2a2a2d" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Miasma.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Miasma.json new file mode 100644 index 0000000..8b5388b --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Miasma.json @@ -0,0 +1,23 @@ +{ + "name": "Miasma", + "black": "#000000", + "red": "#685742", + "green": "#5f875f", + "yellow": "#b36d43", + "blue": "#78824b", + "purple": "#bb7744", + "cyan": "#c9a554", + "white": "#d7c483", + "brightBlack": "#666666", + "brightRed": "#685742", + "brightGreen": "#5f875f", + "brightYellow": "#b36d43", + "brightBlue": "#78824b", + "brightPurple": "#bb7744", + "brightCyan": "#c9a554", + "brightWhite": "#d7c483", + "background": "#222222", + "foreground": "#c2c2b0", + "cursorColor": "#c7c7c7", + "selectionBackground": "#e5c47b" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Midnight In Mojave.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Midnight In Mojave.json new file mode 100644 index 0000000..4c57a58 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Midnight In Mojave.json @@ -0,0 +1,23 @@ +{ + "name": "Midnight In Mojave", + "black": "#1e1e1e", + "red": "#ff453a", + "green": "#32d74b", + "yellow": "#ffd60a", + "blue": "#0a84ff", + "purple": "#bf5af2", + "cyan": "#5ac8fa", + "white": "#ffffff", + "brightBlack": "#515151", + "brightRed": "#ff453a", + "brightGreen": "#32d74b", + "brightYellow": "#ffd60a", + "brightBlue": "#0a84ff", + "brightPurple": "#bf5af2", + "brightCyan": "#5ac8fa", + "brightWhite": "#ffffff", + "background": "#1e1e1e", + "foreground": "#ffffff", + "cursorColor": "#32d74b", + "selectionBackground": "#4a504d" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Mirage.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Mirage.json new file mode 100644 index 0000000..e4858b3 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Mirage.json @@ -0,0 +1,23 @@ +{ + "name": "Mirage", + "black": "#011627", + "red": "#ff9999", + "green": "#85cc95", + "yellow": "#ffd700", + "blue": "#7fb5ff", + "purple": "#ddb3ff", + "cyan": "#21c7a8", + "white": "#ffffff", + "brightBlack": "#575656", + "brightRed": "#ff9999", + "brightGreen": "#85cc95", + "brightYellow": "#ffd700", + "brightBlue": "#7fb5ff", + "brightPurple": "#ddb3ff", + "brightCyan": "#85cc95", + "brightWhite": "#ffffff", + "background": "#1b2738", + "foreground": "#a6b2c0", + "cursorColor": "#ddb3ff", + "selectionBackground": "#273951" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Misterioso.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Misterioso.json new file mode 100644 index 0000000..c3e80ff --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Misterioso.json @@ -0,0 +1,23 @@ +{ + "name": "Misterioso", + "black": "#000000", + "red": "#ff4242", + "green": "#74af68", + "yellow": "#ffad29", + "blue": "#338f86", + "purple": "#9414e6", + "cyan": "#23d7d7", + "white": "#e1e1e0", + "brightBlack": "#626262", + "brightRed": "#ff3242", + "brightGreen": "#74cd68", + "brightYellow": "#ffb929", + "brightBlue": "#23d7d7", + "brightPurple": "#ff37ff", + "brightCyan": "#00ede1", + "brightWhite": "#ffffff", + "background": "#2d3743", + "foreground": "#e1e1e0", + "cursorColor": "#666666", + "selectionBackground": "#2d37ff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Molokai.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Molokai.json new file mode 100644 index 0000000..5dbb6cb --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Molokai.json @@ -0,0 +1,23 @@ +{ + "name": "Molokai", + "black": "#121212", + "red": "#fa2573", + "green": "#98e123", + "yellow": "#dfd460", + "blue": "#1080d0", + "purple": "#8700ff", + "cyan": "#43a8d0", + "white": "#bbbbbb", + "brightBlack": "#555555", + "brightRed": "#f6669d", + "brightGreen": "#b1e05f", + "brightYellow": "#fff26d", + "brightBlue": "#00afff", + "brightPurple": "#af87ff", + "brightCyan": "#51ceff", + "brightWhite": "#ffffff", + "background": "#121212", + "foreground": "#bbbbbb", + "cursorColor": "#bbbbbb", + "selectionBackground": "#b5d5ff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Mona Lisa.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Mona Lisa.json new file mode 100644 index 0000000..e5b4504 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Mona Lisa.json @@ -0,0 +1,23 @@ +{ + "name": "Mona Lisa", + "black": "#351b0e", + "red": "#9b291c", + "green": "#636232", + "yellow": "#c36e28", + "blue": "#515c5d", + "purple": "#9b1d29", + "cyan": "#588056", + "white": "#f7d75c", + "brightBlack": "#874228", + "brightRed": "#ff4331", + "brightGreen": "#b4b264", + "brightYellow": "#ff9566", + "brightBlue": "#9eb2b4", + "brightPurple": "#ff5b6a", + "brightCyan": "#8acd8f", + "brightWhite": "#ffe598", + "background": "#120b0d", + "foreground": "#f7d66a", + "cursorColor": "#c46c32", + "selectionBackground": "#f7d66a" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Classic.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Classic.json new file mode 100644 index 0000000..f15d48f --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Classic.json @@ -0,0 +1,23 @@ +{ + "name": "Monokai Classic", + "black": "#272822", + "red": "#f92672", + "green": "#a6e22e", + "yellow": "#e6db74", + "blue": "#fd971f", + "purple": "#ae81ff", + "cyan": "#66d9ef", + "white": "#fdfff1", + "brightBlack": "#6e7066", + "brightRed": "#f92672", + "brightGreen": "#a6e22e", + "brightYellow": "#e6db74", + "brightBlue": "#fd971f", + "brightPurple": "#ae81ff", + "brightCyan": "#66d9ef", + "brightWhite": "#fdfff1", + "background": "#272822", + "foreground": "#fdfff1", + "cursorColor": "#c0c1b5", + "selectionBackground": "#57584f" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Pro Light Sun.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Pro Light Sun.json new file mode 100644 index 0000000..3ec8c87 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Pro Light Sun.json @@ -0,0 +1,23 @@ +{ + "name": "Monokai Pro Light Sun", + "black": "#f8efe7", + "red": "#ce4770", + "green": "#218871", + "yellow": "#b16803", + "blue": "#d4572b", + "purple": "#6851a2", + "cyan": "#2473b6", + "white": "#2c232e", + "brightBlack": "#a59c9c", + "brightRed": "#ce4770", + "brightGreen": "#218871", + "brightYellow": "#b16803", + "brightBlue": "#d4572b", + "brightPurple": "#6851a2", + "brightCyan": "#2473b6", + "brightWhite": "#2c232e", + "background": "#f8efe7", + "foreground": "#2c232e", + "cursorColor": "#72696d", + "selectionBackground": "#beb5b3" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Pro Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Pro Light.json new file mode 100644 index 0000000..d41d412 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Pro Light.json @@ -0,0 +1,23 @@ +{ + "name": "Monokai Pro Light", + "black": "#faf4f2", + "red": "#e14775", + "green": "#269d69", + "yellow": "#cc7a0a", + "blue": "#e16032", + "purple": "#7058be", + "cyan": "#1c8ca8", + "white": "#29242a", + "brightBlack": "#a59fa0", + "brightRed": "#e14775", + "brightGreen": "#269d69", + "brightYellow": "#cc7a0a", + "brightBlue": "#e16032", + "brightPurple": "#7058be", + "brightCyan": "#1c8ca8", + "brightWhite": "#29242a", + "background": "#faf4f2", + "foreground": "#29242a", + "cursorColor": "#706b6e", + "selectionBackground": "#bfb9ba" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Pro Machine.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Pro Machine.json new file mode 100644 index 0000000..31e4e56 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Pro Machine.json @@ -0,0 +1,23 @@ +{ + "name": "Monokai Pro Machine", + "black": "#273136", + "red": "#ff6d7e", + "green": "#a2e57b", + "yellow": "#ffed72", + "blue": "#ffb270", + "purple": "#baa0f8", + "cyan": "#7cd5f1", + "white": "#f2fffc", + "brightBlack": "#6b7678", + "brightRed": "#ff6d7e", + "brightGreen": "#a2e57b", + "brightYellow": "#ffed72", + "brightBlue": "#ffb270", + "brightPurple": "#baa0f8", + "brightCyan": "#7cd5f1", + "brightWhite": "#f2fffc", + "background": "#273136", + "foreground": "#f2fffc", + "cursorColor": "#b8c4c3", + "selectionBackground": "#545f62" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Pro Octagon.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Pro Octagon.json new file mode 100644 index 0000000..f04f098 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Pro Octagon.json @@ -0,0 +1,23 @@ +{ + "name": "Monokai Pro Octagon", + "black": "#282a3a", + "red": "#ff657a", + "green": "#bad761", + "yellow": "#ffd76d", + "blue": "#ff9b5e", + "purple": "#c39ac9", + "cyan": "#9cd1bb", + "white": "#eaf2f1", + "brightBlack": "#696d77", + "brightRed": "#ff657a", + "brightGreen": "#bad761", + "brightYellow": "#ffd76d", + "brightBlue": "#ff9b5e", + "brightPurple": "#c39ac9", + "brightCyan": "#9cd1bb", + "brightWhite": "#eaf2f1", + "background": "#282a3a", + "foreground": "#eaf2f1", + "cursorColor": "#b2b9bd", + "selectionBackground": "#535763" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Pro Ristretto.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Pro Ristretto.json new file mode 100644 index 0000000..c13f144 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Pro Ristretto.json @@ -0,0 +1,23 @@ +{ + "name": "Monokai Pro Ristretto", + "black": "#2c2525", + "red": "#fd6883", + "green": "#adda78", + "yellow": "#f9cc6c", + "blue": "#f38d70", + "purple": "#a8a9eb", + "cyan": "#85dacc", + "white": "#fff1f3", + "brightBlack": "#72696a", + "brightRed": "#fd6883", + "brightGreen": "#adda78", + "brightYellow": "#f9cc6c", + "brightBlue": "#f38d70", + "brightPurple": "#a8a9eb", + "brightCyan": "#85dacc", + "brightWhite": "#fff1f3", + "background": "#2c2525", + "foreground": "#fff1f3", + "cursorColor": "#c3b7b8", + "selectionBackground": "#5b5353" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Pro Spectrum.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Pro Spectrum.json new file mode 100644 index 0000000..6fc80e2 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Pro Spectrum.json @@ -0,0 +1,23 @@ +{ + "name": "Monokai Pro Spectrum", + "black": "#222222", + "red": "#fc618d", + "green": "#7bd88f", + "yellow": "#fce566", + "blue": "#fd9353", + "purple": "#948ae3", + "cyan": "#5ad4e6", + "white": "#f7f1ff", + "brightBlack": "#69676c", + "brightRed": "#fc618d", + "brightGreen": "#7bd88f", + "brightYellow": "#fce566", + "brightBlue": "#fd9353", + "brightPurple": "#948ae3", + "brightCyan": "#5ad4e6", + "brightWhite": "#f7f1ff", + "background": "#222222", + "foreground": "#f7f1ff", + "cursorColor": "#bab6c0", + "selectionBackground": "#525053" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Pro.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Pro.json new file mode 100644 index 0000000..2a9586e --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Pro.json @@ -0,0 +1,23 @@ +{ + "name": "Monokai Pro", + "black": "#2d2a2e", + "red": "#ff6188", + "green": "#a9dc76", + "yellow": "#ffd866", + "blue": "#fc9867", + "purple": "#ab9df2", + "cyan": "#78dce8", + "white": "#fcfcfa", + "brightBlack": "#727072", + "brightRed": "#ff6188", + "brightGreen": "#a9dc76", + "brightYellow": "#ffd866", + "brightBlue": "#fc9867", + "brightPurple": "#ab9df2", + "brightCyan": "#78dce8", + "brightWhite": "#fcfcfa", + "background": "#2d2a2e", + "foreground": "#fcfcfa", + "cursorColor": "#c1c0c0", + "selectionBackground": "#5b595c" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Remastered.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Remastered.json new file mode 100644 index 0000000..88d5d72 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Remastered.json @@ -0,0 +1,23 @@ +{ + "name": "Monokai Remastered", + "black": "#1a1a1a", + "red": "#f4005f", + "green": "#98e024", + "yellow": "#fd971f", + "blue": "#9d65ff", + "purple": "#f4005f", + "cyan": "#58d1eb", + "white": "#c4c5b5", + "brightBlack": "#625e4c", + "brightRed": "#f4005f", + "brightGreen": "#98e024", + "brightYellow": "#e0d561", + "brightBlue": "#9d65ff", + "brightPurple": "#f4005f", + "brightCyan": "#58d1eb", + "brightWhite": "#f6f6ef", + "background": "#0c0c0c", + "foreground": "#d9d9d9", + "cursorColor": "#fc971f", + "selectionBackground": "#343434" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Soda.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Soda.json new file mode 100644 index 0000000..8530afa --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Soda.json @@ -0,0 +1,23 @@ +{ + "name": "Monokai Soda", + "black": "#1a1a1a", + "red": "#f4005f", + "green": "#98e024", + "yellow": "#fa8419", + "blue": "#9d65ff", + "purple": "#f4005f", + "cyan": "#58d1eb", + "white": "#c4c5b5", + "brightBlack": "#625e4c", + "brightRed": "#f4005f", + "brightGreen": "#98e024", + "brightYellow": "#e0d561", + "brightBlue": "#9d65ff", + "brightPurple": "#f4005f", + "brightCyan": "#58d1eb", + "brightWhite": "#f6f6ef", + "background": "#1a1a1a", + "foreground": "#c4c5b5", + "cursorColor": "#f6f7ec", + "selectionBackground": "#343434" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Vivid.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Vivid.json new file mode 100644 index 0000000..9b88241 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Monokai Vivid.json @@ -0,0 +1,23 @@ +{ + "name": "Monokai Vivid", + "black": "#121212", + "red": "#fa2934", + "green": "#98e123", + "yellow": "#fff30a", + "blue": "#0443ff", + "purple": "#f800f8", + "cyan": "#01b6ed", + "white": "#ffffff", + "brightBlack": "#838383", + "brightRed": "#f6669d", + "brightGreen": "#b1e05f", + "brightYellow": "#fff26d", + "brightBlue": "#0443ff", + "brightPurple": "#f200f6", + "brightCyan": "#51ceff", + "brightWhite": "#ffffff", + "background": "#121212", + "foreground": "#f9f9f9", + "cursorColor": "#fb0007", + "selectionBackground": "#ffffff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Moonfly.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Moonfly.json new file mode 100644 index 0000000..f1a3bde --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Moonfly.json @@ -0,0 +1,23 @@ +{ + "name": "Moonfly", + "black": "#323437", + "red": "#ff5454", + "green": "#8cc85f", + "yellow": "#e3c78a", + "blue": "#80a0ff", + "purple": "#cf87e8", + "cyan": "#79dac8", + "white": "#c6c6c6", + "brightBlack": "#949494", + "brightRed": "#ff5189", + "brightGreen": "#36c692", + "brightYellow": "#c6c684", + "brightBlue": "#74b2ff", + "brightPurple": "#ae81ff", + "brightCyan": "#85dc85", + "brightWhite": "#e4e4e4", + "background": "#080808", + "foreground": "#bdbdbd", + "cursorColor": "#9e9e9e", + "selectionBackground": "#b2ceee" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/N0Tch2K.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/N0Tch2K.json new file mode 100644 index 0000000..2b164c7 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/N0Tch2K.json @@ -0,0 +1,23 @@ +{ + "name": "N0Tch2K", + "black": "#383838", + "red": "#a95551", + "green": "#666666", + "yellow": "#a98051", + "blue": "#657d3e", + "purple": "#767676", + "cyan": "#c9c9c9", + "white": "#d0b8a3", + "brightBlack": "#545454", + "brightRed": "#a97775", + "brightGreen": "#8c8c8c", + "brightYellow": "#a99175", + "brightBlue": "#98bd5e", + "brightPurple": "#a3a3a3", + "brightCyan": "#dcdcdc", + "brightWhite": "#d8c8bb", + "background": "#222222", + "foreground": "#a0a0a0", + "cursorColor": "#aa9175", + "selectionBackground": "#4d4d4d" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Neobones Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Neobones Dark.json new file mode 100644 index 0000000..6ec87d2 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Neobones Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Neobones Dark", + "black": "#0f191f", + "red": "#de6e7c", + "green": "#90ff6b", + "yellow": "#b77e64", + "blue": "#8190d4", + "purple": "#b279a7", + "cyan": "#66a5ad", + "white": "#c6d5cf", + "brightBlack": "#334652", + "brightRed": "#e8838f", + "brightGreen": "#a0ff85", + "brightYellow": "#d68c67", + "brightBlue": "#92a0e2", + "brightPurple": "#cf86c1", + "brightCyan": "#65b8c1", + "brightWhite": "#98a39e", + "background": "#0f191f", + "foreground": "#c6d5cf", + "cursorColor": "#ceddd7", + "selectionBackground": "#3a3e3d" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Neobones Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Neobones Light.json new file mode 100644 index 0000000..64e4564 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Neobones Light.json @@ -0,0 +1,23 @@ +{ + "name": "Neobones Light", + "black": "#e5ede6", + "red": "#a8334c", + "green": "#567a30", + "yellow": "#944927", + "blue": "#286486", + "purple": "#88507d", + "cyan": "#3b8992", + "white": "#202e18", + "brightBlack": "#99ac9c", + "brightRed": "#94253e", + "brightGreen": "#3f5a22", + "brightYellow": "#803d1c", + "brightBlue": "#1d5573", + "brightPurple": "#7b3b70", + "brightCyan": "#2b747c", + "brightWhite": "#415934", + "background": "#e5ede6", + "foreground": "#202e18", + "cursorColor": "#202e18", + "selectionBackground": "#ade48c" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Neon.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Neon.json new file mode 100644 index 0000000..a917e00 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Neon.json @@ -0,0 +1,23 @@ +{ + "name": "Neon", + "black": "#000000", + "red": "#ff3045", + "green": "#5ffa74", + "yellow": "#fffc7e", + "blue": "#0f15d8", + "purple": "#f924e7", + "cyan": "#00fffc", + "white": "#c7c7c7", + "brightBlack": "#686868", + "brightRed": "#ff5a5a", + "brightGreen": "#75ff88", + "brightYellow": "#fffd96", + "brightBlue": "#3c40cb", + "brightPurple": "#f15be5", + "brightCyan": "#88fffe", + "brightWhite": "#ffffff", + "background": "#14161a", + "foreground": "#00fffc", + "cursorColor": "#c7c7c7", + "selectionBackground": "#0013ff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Neopolitan.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Neopolitan.json new file mode 100644 index 0000000..b3616e0 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Neopolitan.json @@ -0,0 +1,23 @@ +{ + "name": "Neopolitan", + "black": "#000000", + "red": "#9a1a1a", + "green": "#61ce3c", + "yellow": "#fbde2d", + "blue": "#324883", + "purple": "#ff0080", + "cyan": "#8da6ce", + "white": "#f8f8f8", + "brightBlack": "#4c4c4c", + "brightRed": "#9a1a1a", + "brightGreen": "#61ce3c", + "brightYellow": "#fbde2d", + "brightBlue": "#324883", + "brightPurple": "#ff0080", + "brightCyan": "#8da6ce", + "brightWhite": "#f8f8f8", + "background": "#271f19", + "foreground": "#ffffff", + "cursorColor": "#ffffff", + "selectionBackground": "#253b76" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Neutron.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Neutron.json new file mode 100644 index 0000000..213a2c6 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Neutron.json @@ -0,0 +1,23 @@ +{ + "name": "Neutron", + "black": "#23252b", + "red": "#b54036", + "green": "#5ab977", + "yellow": "#deb566", + "blue": "#6a7c93", + "purple": "#a4799d", + "cyan": "#3f94a8", + "white": "#e6e8ef", + "brightBlack": "#494b51", + "brightRed": "#b54036", + "brightGreen": "#5ab977", + "brightYellow": "#deb566", + "brightBlue": "#6a7c93", + "brightPurple": "#a4799d", + "brightCyan": "#3f94a8", + "brightWhite": "#ebedf2", + "background": "#1c1e22", + "foreground": "#e6e8ef", + "cursorColor": "#f6f7ec", + "selectionBackground": "#2f363e" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Night Lion V1.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Night Lion V1.json new file mode 100644 index 0000000..a4657cb --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Night Lion V1.json @@ -0,0 +1,23 @@ +{ + "name": "Night Lion V1", + "black": "#4c4c4c", + "red": "#bb0000", + "green": "#5fde8f", + "yellow": "#f3f167", + "blue": "#276bd8", + "purple": "#bb00bb", + "cyan": "#00dadf", + "white": "#bbbbbb", + "brightBlack": "#555555", + "brightRed": "#ff5555", + "brightGreen": "#55ff55", + "brightYellow": "#ffff55", + "brightBlue": "#5555ff", + "brightPurple": "#ff55ff", + "brightCyan": "#55ffff", + "brightWhite": "#ffffff", + "background": "#000000", + "foreground": "#bbbbbb", + "cursorColor": "#bbbbbb", + "selectionBackground": "#b5d5ff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Night Lion V2.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Night Lion V2.json new file mode 100644 index 0000000..34ca989 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Night Lion V2.json @@ -0,0 +1,23 @@ +{ + "name": "Night Lion V2", + "black": "#4c4c4c", + "red": "#bb0000", + "green": "#04f623", + "yellow": "#f3f167", + "blue": "#64d0f0", + "purple": "#ce6fdb", + "cyan": "#00dadf", + "white": "#bbbbbb", + "brightBlack": "#555555", + "brightRed": "#ff5555", + "brightGreen": "#7df71d", + "brightYellow": "#ffff55", + "brightBlue": "#62cbe8", + "brightPurple": "#ff9bf5", + "brightCyan": "#00ccd8", + "brightWhite": "#ffffff", + "background": "#171717", + "foreground": "#bbbbbb", + "cursorColor": "#bbbbbb", + "selectionBackground": "#b5d5ff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Night Owl.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Night Owl.json new file mode 100644 index 0000000..eb4bd9c --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Night Owl.json @@ -0,0 +1,23 @@ +{ + "name": "Night Owl", + "black": "#011627", + "red": "#ef5350", + "green": "#22da6e", + "yellow": "#addb67", + "blue": "#82aaff", + "purple": "#c792ea", + "cyan": "#21c7a8", + "white": "#ffffff", + "brightBlack": "#575656", + "brightRed": "#ef5350", + "brightGreen": "#22da6e", + "brightYellow": "#ffeb95", + "brightBlue": "#82aaff", + "brightPurple": "#c792ea", + "brightCyan": "#7fdbca", + "brightWhite": "#ffffff", + "background": "#011627", + "foreground": "#d6deeb", + "cursorColor": "#7e57c2", + "selectionBackground": "#5f7e97" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Night Owlish Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Night Owlish Light.json new file mode 100644 index 0000000..7ee2d3c --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Night Owlish Light.json @@ -0,0 +1,23 @@ +{ + "name": "Night Owlish Light", + "black": "#011627", + "red": "#d3423e", + "green": "#2aa298", + "yellow": "#daaa01", + "blue": "#4876d6", + "purple": "#403f53", + "cyan": "#08916a", + "white": "#7a8181", + "brightBlack": "#7a8181", + "brightRed": "#f76e6e", + "brightGreen": "#49d0c5", + "brightYellow": "#dac26b", + "brightBlue": "#5ca7e4", + "brightPurple": "#697098", + "brightCyan": "#00c990", + "brightWhite": "#989fb1", + "background": "#ffffff", + "foreground": "#403f53", + "cursorColor": "#403f53", + "selectionBackground": "#f2f2f2" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Nightfox.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Nightfox.json new file mode 100644 index 0000000..20fa510 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Nightfox.json @@ -0,0 +1,23 @@ +{ + "name": "Nightfox", + "black": "#393b44", + "red": "#c94f6d", + "green": "#81b29a", + "yellow": "#dbc074", + "blue": "#719cd6", + "purple": "#9d79d6", + "cyan": "#63cdcf", + "white": "#dfdfe0", + "brightBlack": "#575860", + "brightRed": "#d16983", + "brightGreen": "#8ebaa4", + "brightYellow": "#e0c989", + "brightBlue": "#86abdc", + "brightPurple": "#baa1e2", + "brightCyan": "#7ad5d6", + "brightWhite": "#e4e4e5", + "background": "#192330", + "foreground": "#cdcecf", + "cursorColor": "#cdcecf", + "selectionBackground": "#2b3b51" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Niji.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Niji.json new file mode 100644 index 0000000..87436db --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Niji.json @@ -0,0 +1,23 @@ +{ + "name": "Niji", + "black": "#333333", + "red": "#d23e08", + "green": "#54ca74", + "yellow": "#fff700", + "blue": "#2ab9ff", + "purple": "#ff50da", + "cyan": "#1ef9f5", + "white": "#ddd0c4", + "brightBlack": "#515151", + "brightRed": "#ffb7b7", + "brightGreen": "#c1ffae", + "brightYellow": "#fcffb8", + "brightBlue": "#8efff3", + "brightPurple": "#ffa2ed", + "brightCyan": "#bcffc7", + "brightWhite": "#ffffff", + "background": "#141515", + "foreground": "#ffffff", + "cursorColor": "#ffc663", + "selectionBackground": "#515151" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/No Clown Fiesta Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/No Clown Fiesta Light.json new file mode 100644 index 0000000..0b09d21 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/No Clown Fiesta Light.json @@ -0,0 +1,23 @@ +{ + "name": "No Clown Fiesta Light", + "black": "#d6d6d6", + "red": "#874e42", + "green": "#677940", + "yellow": "#b89058", + "blue": "#8ba1bf", + "purple": "#aa759f", + "cyan": "#3e5f66", + "white": "#151515", + "brightBlack": "#2b2b2b", + "brightRed": "#637786", + "brightGreen": "#677940", + "brightYellow": "#b89058", + "brightBlue": "#93a2ab", + "brightPurple": "#aa759f", + "brightCyan": "#99ab93", + "brightWhite": "#373737", + "background": "#e1e1e1", + "foreground": "#151515", + "cursorColor": "#151515", + "selectionBackground": "#c6d5de" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/No Clown Fiesta.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/No Clown Fiesta.json new file mode 100644 index 0000000..ad66996 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/No Clown Fiesta.json @@ -0,0 +1,23 @@ +{ + "name": "No Clown Fiesta", + "black": "#151515", + "red": "#b46958", + "green": "#90a959", + "yellow": "#f4bf75", + "blue": "#bad7ff", + "purple": "#aa759f", + "cyan": "#88afa2", + "white": "#e1e1e1", + "brightBlack": "#727272", + "brightRed": "#7e97ab", + "brightGreen": "#90a959", + "brightYellow": "#f4bf75", + "brightBlue": "#bad7ff", + "brightPurple": "#aa759f", + "brightCyan": "#88afa2", + "brightWhite": "#afafaf", + "background": "#101010", + "foreground": "#e0e1e4", + "cursorColor": "#e0e1e4", + "selectionBackground": "#696d79" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Nocturnal Winter.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Nocturnal Winter.json new file mode 100644 index 0000000..b1a543c --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Nocturnal Winter.json @@ -0,0 +1,23 @@ +{ + "name": "Nocturnal Winter", + "black": "#4d4d4d", + "red": "#f12d52", + "green": "#09cd7e", + "yellow": "#f5f17a", + "blue": "#3182e0", + "purple": "#ff2b6d", + "cyan": "#09c87a", + "white": "#fcfcfc", + "brightBlack": "#808080", + "brightRed": "#f16d86", + "brightGreen": "#0ae78d", + "brightYellow": "#fffc67", + "brightBlue": "#6096ff", + "brightPurple": "#ff78a2", + "brightCyan": "#0ae78d", + "brightWhite": "#ffffff", + "background": "#0d0d17", + "foreground": "#e6e5e5", + "cursorColor": "#e6e5e5", + "selectionBackground": "#adbdd0" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Nord Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Nord Light.json new file mode 100644 index 0000000..edbe153 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Nord Light.json @@ -0,0 +1,23 @@ +{ + "name": "Nord Light", + "black": "#3b4252", + "red": "#bf616a", + "green": "#96b17f", + "yellow": "#c5a565", + "blue": "#81a1c1", + "purple": "#b48ead", + "cyan": "#7bb3c3", + "white": "#a5abb6", + "brightBlack": "#4c566a", + "brightRed": "#bf616a", + "brightGreen": "#96b17f", + "brightYellow": "#c5a565", + "brightBlue": "#81a1c1", + "brightPurple": "#b48ead", + "brightCyan": "#82afae", + "brightWhite": "#eceff4", + "background": "#e5e9f0", + "foreground": "#414858", + "cursorColor": "#7bb3c3", + "selectionBackground": "#d8dee9" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Nord Wave.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Nord Wave.json new file mode 100644 index 0000000..3507877 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Nord Wave.json @@ -0,0 +1,23 @@ +{ + "name": "Nord Wave", + "black": "#3b4252", + "red": "#bf616a", + "green": "#a3be8c", + "yellow": "#ebcb8b", + "blue": "#81a1c1", + "purple": "#b48ead", + "cyan": "#88c0d0", + "white": "#e5e9f0", + "brightBlack": "#4c566a", + "brightRed": "#bf616a", + "brightGreen": "#a3be8c", + "brightYellow": "#ebcb8b", + "brightBlue": "#81a1c1", + "brightPurple": "#b48ead", + "brightCyan": "#8fbcbb", + "brightWhite": "#eceff4", + "background": "#212121", + "foreground": "#d8dee9", + "cursorColor": "#ebcb8b", + "selectionBackground": "#d8dee9" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Nord.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Nord.json new file mode 100644 index 0000000..6edb41d --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Nord.json @@ -0,0 +1,23 @@ +{ + "name": "Nord", + "black": "#3b4252", + "red": "#bf616a", + "green": "#a3be8c", + "yellow": "#ebcb8b", + "blue": "#81a1c1", + "purple": "#b48ead", + "cyan": "#88c0d0", + "white": "#e5e9f0", + "brightBlack": "#596377", + "brightRed": "#bf616a", + "brightGreen": "#a3be8c", + "brightYellow": "#ebcb8b", + "brightBlue": "#81a1c1", + "brightPurple": "#b48ead", + "brightCyan": "#8fbcbb", + "brightWhite": "#eceff4", + "background": "#2e3440", + "foreground": "#d8dee9", + "cursorColor": "#eceff4", + "selectionBackground": "#eceff4" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Nordfox.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Nordfox.json new file mode 100644 index 0000000..c395d6a --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Nordfox.json @@ -0,0 +1,23 @@ +{ + "name": "Nordfox", + "black": "#3b4252", + "red": "#bf616a", + "green": "#a3be8c", + "yellow": "#ebcb8b", + "blue": "#81a1c1", + "purple": "#b48ead", + "cyan": "#88c0d0", + "white": "#e5e9f0", + "brightBlack": "#53648d", + "brightRed": "#d06f79", + "brightGreen": "#b1d196", + "brightYellow": "#f0d399", + "brightBlue": "#8cafd2", + "brightPurple": "#c895bf", + "brightCyan": "#93ccdc", + "brightWhite": "#e7ecf4", + "background": "#2e3440", + "foreground": "#cdcecf", + "cursorColor": "#cdcecf", + "selectionBackground": "#3e4a5b" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Novel.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Novel.json new file mode 100644 index 0000000..08c7f7e --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Novel.json @@ -0,0 +1,23 @@ +{ + "name": "Novel", + "black": "#000000", + "red": "#cc0000", + "green": "#009600", + "yellow": "#d06b00", + "blue": "#0000cc", + "purple": "#cc00cc", + "cyan": "#0087cc", + "white": "#a6a6a6", + "brightBlack": "#808080", + "brightRed": "#cc0000", + "brightGreen": "#009600", + "brightYellow": "#d06b00", + "brightBlue": "#0000cc", + "brightPurple": "#cc00cc", + "brightCyan": "#0087cc", + "brightWhite": "#ffffff", + "background": "#dfdbc3", + "foreground": "#3b2322", + "cursorColor": "#73635a", + "selectionBackground": "#a4a390" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Nvim Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Nvim Dark.json new file mode 100644 index 0000000..ffde050 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Nvim Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Nvim Dark", + "black": "#07080d", + "red": "#ffc0b9", + "green": "#b3f6c0", + "yellow": "#fce094", + "blue": "#a6dbff", + "purple": "#ffcaff", + "cyan": "#8cf8f7", + "white": "#eef1f8", + "brightBlack": "#4f5258", + "brightRed": "#ffc0b9", + "brightGreen": "#b3f6c0", + "brightYellow": "#fce094", + "brightBlue": "#a6dbff", + "brightPurple": "#ffcaff", + "brightCyan": "#8cf8f7", + "brightWhite": "#eef1f8", + "background": "#14161b", + "foreground": "#e0e2ea", + "cursorColor": "#9b9ea4", + "selectionBackground": "#4f5258" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Nvim Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Nvim Light.json new file mode 100644 index 0000000..ea74702 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Nvim Light.json @@ -0,0 +1,23 @@ +{ + "name": "Nvim Light", + "black": "#07080d", + "red": "#590008", + "green": "#005523", + "yellow": "#6b5300", + "blue": "#004c73", + "purple": "#470045", + "cyan": "#007373", + "white": "#a1a4ab", + "brightBlack": "#4f5258", + "brightRed": "#590008", + "brightGreen": "#005523", + "brightYellow": "#6b5300", + "brightBlue": "#004c73", + "brightPurple": "#470045", + "brightCyan": "#007373", + "brightWhite": "#eef1f8", + "background": "#e0e2ea", + "foreground": "#14161b", + "cursorColor": "#9b9ea4", + "selectionBackground": "#9b9ea4" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Obsidian.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Obsidian.json new file mode 100644 index 0000000..532cf81 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Obsidian.json @@ -0,0 +1,23 @@ +{ + "name": "Obsidian", + "black": "#000000", + "red": "#b30d0e", + "green": "#00bb00", + "yellow": "#fecd22", + "blue": "#3a9bdb", + "purple": "#bb00bb", + "cyan": "#00bbbb", + "white": "#bbbbbb", + "brightBlack": "#555555", + "brightRed": "#ff0003", + "brightGreen": "#93c863", + "brightYellow": "#fef874", + "brightBlue": "#a1d7ff", + "brightPurple": "#ff55ff", + "brightCyan": "#55ffff", + "brightWhite": "#ffffff", + "background": "#283033", + "foreground": "#cdcdcd", + "cursorColor": "#c0cad0", + "selectionBackground": "#3e4c4f" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ocean.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ocean.json new file mode 100644 index 0000000..f8d4311 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ocean.json @@ -0,0 +1,23 @@ +{ + "name": "Ocean", + "black": "#000000", + "red": "#e64c4c", + "green": "#00a600", + "yellow": "#999900", + "blue": "#0000b2", + "purple": "#d826d8", + "cyan": "#00a6b2", + "white": "#bfbfbf", + "brightBlack": "#808080", + "brightRed": "#ff1a1a", + "brightGreen": "#00d900", + "brightYellow": "#e5e500", + "brightBlue": "#7373ff", + "brightPurple": "#e500e5", + "brightCyan": "#00e5e5", + "brightWhite": "#e5e5e5", + "background": "#224fbc", + "foreground": "#ffffff", + "cursorColor": "#7f7f7f", + "selectionBackground": "#216dff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Oceanic Material.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Oceanic Material.json new file mode 100644 index 0000000..72928b6 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Oceanic Material.json @@ -0,0 +1,23 @@ +{ + "name": "Oceanic Material", + "black": "#000000", + "red": "#ee2b2a", + "green": "#40a33f", + "yellow": "#ffea2e", + "blue": "#1e80f0", + "purple": "#8800a0", + "cyan": "#16afca", + "white": "#a4a4a4", + "brightBlack": "#777777", + "brightRed": "#dc5c60", + "brightGreen": "#70be71", + "brightYellow": "#fff163", + "brightBlue": "#54a4f3", + "brightPurple": "#aa4dbc", + "brightCyan": "#42c7da", + "brightWhite": "#ffffff", + "background": "#1c262b", + "foreground": "#c2c8d7", + "cursorColor": "#b3b8c3", + "selectionBackground": "#6dc2b8" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Oceanic Next.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Oceanic Next.json new file mode 100644 index 0000000..37f9f0f --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Oceanic Next.json @@ -0,0 +1,23 @@ +{ + "name": "Oceanic Next", + "black": "#162c35", + "red": "#ec5f67", + "green": "#99c794", + "yellow": "#fac863", + "blue": "#6699cc", + "purple": "#c594c5", + "cyan": "#5fb3b3", + "white": "#ffffff", + "brightBlack": "#65737e", + "brightRed": "#ec5f67", + "brightGreen": "#99c794", + "brightYellow": "#fac863", + "brightBlue": "#6699cc", + "brightPurple": "#c594c5", + "brightCyan": "#5fb3b3", + "brightWhite": "#ffffff", + "background": "#162c35", + "foreground": "#c0c5ce", + "cursorColor": "#c0c5ce", + "selectionBackground": "#4f5b66" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ollie.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ollie.json new file mode 100644 index 0000000..672480c --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ollie.json @@ -0,0 +1,23 @@ +{ + "name": "Ollie", + "black": "#000000", + "red": "#ac2e31", + "green": "#31ac61", + "yellow": "#ac4300", + "blue": "#2d57ac", + "purple": "#b08528", + "cyan": "#1fa6ac", + "white": "#8a8eac", + "brightBlack": "#684432", + "brightRed": "#ff3d48", + "brightGreen": "#3bff99", + "brightYellow": "#ff5e1e", + "brightBlue": "#4488ff", + "brightPurple": "#ffc21d", + "brightCyan": "#1ffaff", + "brightWhite": "#5b6ea7", + "background": "#222125", + "foreground": "#8a8dae", + "cursorColor": "#5b6ea7", + "selectionBackground": "#1e3a66" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/One Dark Two.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/One Dark Two.json new file mode 100644 index 0000000..79862df --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/One Dark Two.json @@ -0,0 +1,23 @@ +{ + "name": "One Dark Two", + "black": "#1d1f23", + "red": "#e27881", + "green": "#98c379", + "yellow": "#eac786", + "blue": "#71b9f4", + "purple": "#c88bda", + "cyan": "#62bac6", + "white": "#c9ccd3", + "brightBlack": "#4a505a", + "brightRed": "#e68991", + "brightGreen": "#a8cc8e", + "brightYellow": "#edcf97", + "brightBlue": "#8dc7f6", + "brightPurple": "#d3a2e2", + "brightCyan": "#78c4ce", + "brightWhite": "#e6e6e6", + "background": "#21252b", + "foreground": "#e6e6e6", + "cursorColor": "#e6e6e6", + "selectionBackground": "#393e47" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/One Double Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/One Double Dark.json new file mode 100644 index 0000000..39e497f --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/One Double Dark.json @@ -0,0 +1,23 @@ +{ + "name": "One Double Dark", + "black": "#3d4452", + "red": "#f16372", + "green": "#8cc570", + "yellow": "#ecbe70", + "blue": "#3fb1f5", + "purple": "#d373e3", + "cyan": "#17b9c4", + "white": "#dbdfe5", + "brightBlack": "#525d6f", + "brightRed": "#ff777b", + "brightGreen": "#82d882", + "brightYellow": "#f5c065", + "brightBlue": "#6dcaff", + "brightPurple": "#ff7bf4", + "brightCyan": "#00e5fb", + "brightWhite": "#f7f9fc", + "background": "#282c34", + "foreground": "#dbdfe5", + "cursorColor": "#f5e0dc", + "selectionBackground": "#585b70" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/One Double Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/One Double Light.json new file mode 100644 index 0000000..12c85f6 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/One Double Light.json @@ -0,0 +1,23 @@ +{ + "name": "One Double Light", + "black": "#454b58", + "red": "#f74840", + "green": "#25a343", + "yellow": "#cc8100", + "blue": "#0087c1", + "purple": "#b50da9", + "cyan": "#009ab7", + "white": "#c5b2b3", + "brightBlack": "#0e131f", + "brightRed": "#ff3711", + "brightGreen": "#00b90e", + "brightYellow": "#ec9900", + "brightBlue": "#1065de", + "brightPurple": "#e500d8", + "brightCyan": "#00b4dd", + "brightWhite": "#ffffff", + "background": "#fafafa", + "foreground": "#383a43", + "cursorColor": "#1a1919", + "selectionBackground": "#454e5e" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/One Half Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/One Half Dark.json new file mode 100644 index 0000000..33520d8 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/One Half Dark.json @@ -0,0 +1,23 @@ +{ + "name": "One Half Dark", + "black": "#282c34", + "red": "#e06c75", + "green": "#98c379", + "yellow": "#e5c07b", + "blue": "#61afef", + "purple": "#c678dd", + "cyan": "#56b6c2", + "white": "#dcdfe4", + "brightBlack": "#5d677a", + "brightRed": "#e06c75", + "brightGreen": "#98c379", + "brightYellow": "#e5c07b", + "brightBlue": "#61afef", + "brightPurple": "#c678dd", + "brightCyan": "#56b6c2", + "brightWhite": "#dcdfe4", + "background": "#282c34", + "foreground": "#dcdfe4", + "cursorColor": "#a3b3cc", + "selectionBackground": "#474e5d" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/One Half Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/One Half Light.json new file mode 100644 index 0000000..c3ac5d1 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/One Half Light.json @@ -0,0 +1,23 @@ +{ + "name": "One Half Light", + "black": "#383a42", + "red": "#e45649", + "green": "#50a14f", + "yellow": "#c18401", + "blue": "#0184bc", + "purple": "#a626a4", + "cyan": "#0997b3", + "white": "#bababa", + "brightBlack": "#4f525e", + "brightRed": "#e06c75", + "brightGreen": "#98c379", + "brightYellow": "#d8b36e", + "brightBlue": "#61afef", + "brightPurple": "#c678dd", + "brightCyan": "#56b6c2", + "brightWhite": "#ffffff", + "background": "#fafafa", + "foreground": "#383a42", + "cursorColor": "#a5b4e5", + "selectionBackground": "#bfceff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Onenord Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Onenord Light.json new file mode 100644 index 0000000..b20d776 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Onenord Light.json @@ -0,0 +1,23 @@ +{ + "name": "Onenord Light", + "black": "#2e3440", + "red": "#cb4f53", + "green": "#48a53d", + "yellow": "#ee5e25", + "blue": "#3879c5", + "purple": "#9f4aca", + "cyan": "#3ea1ad", + "white": "#b2b6bd", + "brightBlack": "#646a76", + "brightRed": "#d16366", + "brightGreen": "#5f9e9d", + "brightYellow": "#ba793e", + "brightBlue": "#1b40a6", + "brightPurple": "#9665af", + "brightCyan": "#8fbcbb", + "brightWhite": "#eceff4", + "background": "#f7f8fa", + "foreground": "#2e3440", + "cursorColor": "#3879c5", + "selectionBackground": "#eaebed" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Onenord.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Onenord.json new file mode 100644 index 0000000..838e4e1 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Onenord.json @@ -0,0 +1,23 @@ +{ + "name": "Onenord", + "black": "#3b4252", + "red": "#e06c75", + "green": "#9ec183", + "yellow": "#ebcb8b", + "blue": "#81a1c1", + "purple": "#b988b0", + "cyan": "#88c0d0", + "white": "#e5e9f0", + "brightBlack": "#596377", + "brightRed": "#e06c75", + "brightGreen": "#9ec183", + "brightYellow": "#ebcb8b", + "brightBlue": "#81a1c1", + "brightPurple": "#b988b0", + "brightCyan": "#8fbcbb", + "brightWhite": "#eceff4", + "background": "#2e3440", + "foreground": "#e5e9f0", + "cursorColor": "#81a1c1", + "selectionBackground": "#434c5e" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Operator Mono Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Operator Mono Dark.json new file mode 100644 index 0000000..0c86ee3 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Operator Mono Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Operator Mono Dark", + "black": "#5a5a5a", + "red": "#ca372d", + "green": "#4d7b3a", + "yellow": "#d4d697", + "blue": "#4387cf", + "purple": "#b86cb4", + "cyan": "#72d5c6", + "white": "#ced4cd", + "brightBlack": "#9a9b99", + "brightRed": "#c37d62", + "brightGreen": "#83d0a2", + "brightYellow": "#fdfdc5", + "brightBlue": "#89d3f6", + "brightPurple": "#ff2c7a", + "brightCyan": "#82eada", + "brightWhite": "#fdfdf6", + "background": "#191919", + "foreground": "#c3cac2", + "cursorColor": "#fcdc08", + "selectionBackground": "#19273b" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Overnight Slumber.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Overnight Slumber.json new file mode 100644 index 0000000..c9b94bd --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Overnight Slumber.json @@ -0,0 +1,23 @@ +{ + "name": "Overnight Slumber", + "black": "#0a1222", + "red": "#ffa7c4", + "green": "#85cc95", + "yellow": "#ffcb8b", + "blue": "#8dabe1", + "purple": "#c792eb", + "cyan": "#78ccf0", + "white": "#ffffff", + "brightBlack": "#575656", + "brightRed": "#ffa7c4", + "brightGreen": "#85cc95", + "brightYellow": "#ffcb8b", + "brightBlue": "#8dabe1", + "brightPurple": "#c792eb", + "brightCyan": "#ffa7c4", + "brightWhite": "#ffffff", + "background": "#0e1729", + "foreground": "#ced2d6", + "cursorColor": "#ffa7c4", + "selectionBackground": "#1f2b41" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Oxocarbon.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Oxocarbon.json new file mode 100644 index 0000000..31b86bd --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Oxocarbon.json @@ -0,0 +1,23 @@ +{ + "name": "Oxocarbon", + "black": "#161616", + "red": "#00dfdb", + "green": "#00b4ff", + "yellow": "#ff4297", + "blue": "#00c15a", + "purple": "#c693ff", + "cyan": "#ff74b8", + "white": "#f2f4f8", + "brightBlack": "#585858", + "brightRed": "#00dfdb", + "brightGreen": "#00b4ff", + "brightYellow": "#ff4297", + "brightBlue": "#00c15a", + "brightPurple": "#c693ff", + "brightCyan": "#ff74b8", + "brightWhite": "#f2f4f8", + "background": "#161616", + "foreground": "#f2f4f8", + "cursorColor": "#ffffff", + "selectionBackground": "#393939" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Pale Night Hc.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Pale Night Hc.json new file mode 100644 index 0000000..2b61600 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Pale Night Hc.json @@ -0,0 +1,23 @@ +{ + "name": "Pale Night Hc", + "black": "#000000", + "red": "#f07178", + "green": "#c3e88d", + "yellow": "#ffcb6b", + "blue": "#82aaff", + "purple": "#c792ea", + "cyan": "#89ddff", + "white": "#ffffff", + "brightBlack": "#737373", + "brightRed": "#f6a9ae", + "brightGreen": "#dbf1ba", + "brightYellow": "#ffdfa6", + "brightBlue": "#b4ccff", + "brightPurple": "#ddbdf2", + "brightCyan": "#b8eaff", + "brightWhite": "#999999", + "background": "#3e4251", + "foreground": "#cccccc", + "cursorColor": "#ffcb6b", + "selectionBackground": "#717cb4" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Pandora.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Pandora.json new file mode 100644 index 0000000..9946e4e --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Pandora.json @@ -0,0 +1,23 @@ +{ + "name": "Pandora", + "black": "#000000", + "red": "#ff4242", + "green": "#74af68", + "yellow": "#ffad29", + "blue": "#338f86", + "purple": "#9414e6", + "cyan": "#23d7d7", + "white": "#e2e2e2", + "brightBlack": "#3f5648", + "brightRed": "#ff3242", + "brightGreen": "#74cd68", + "brightYellow": "#ffb929", + "brightBlue": "#23d7d7", + "brightPurple": "#ff37ff", + "brightCyan": "#00ede1", + "brightWhite": "#ffffff", + "background": "#141e43", + "foreground": "#e1e1e1", + "cursorColor": "#43d58e", + "selectionBackground": "#2d37ff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Paraiso Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Paraiso Dark.json new file mode 100644 index 0000000..5175627 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Paraiso Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Paraiso Dark", + "black": "#2f1e2e", + "red": "#ef6155", + "green": "#48b685", + "yellow": "#fec418", + "blue": "#06b6ef", + "purple": "#815ba4", + "cyan": "#5bc4bf", + "white": "#a39e9b", + "brightBlack": "#776e71", + "brightRed": "#ef6155", + "brightGreen": "#48b685", + "brightYellow": "#fec418", + "brightBlue": "#06b6ef", + "brightPurple": "#815ba4", + "brightCyan": "#5bc4bf", + "brightWhite": "#e7e9db", + "background": "#2f1e2e", + "foreground": "#a39e9b", + "cursorColor": "#a39e9b", + "selectionBackground": "#4f424c" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Paul Millr.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Paul Millr.json new file mode 100644 index 0000000..21717b2 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Paul Millr.json @@ -0,0 +1,23 @@ +{ + "name": "Paul Millr", + "black": "#2a2a2a", + "red": "#ff0000", + "green": "#79ff0f", + "yellow": "#e7bf00", + "blue": "#396bd7", + "purple": "#b449be", + "cyan": "#66ccff", + "white": "#bbbbbb", + "brightBlack": "#666666", + "brightRed": "#ff0080", + "brightGreen": "#66ff66", + "brightYellow": "#f3d64e", + "brightBlue": "#709aed", + "brightPurple": "#db67e6", + "brightCyan": "#7adff2", + "brightWhite": "#ffffff", + "background": "#000000", + "foreground": "#f2f2f2", + "cursorColor": "#4d4d4d", + "selectionBackground": "#414141" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Pencil Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Pencil Dark.json new file mode 100644 index 0000000..a74e777 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Pencil Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Pencil Dark", + "black": "#212121", + "red": "#c30771", + "green": "#10a778", + "yellow": "#a89c14", + "blue": "#008ec4", + "purple": "#5f4986", + "cyan": "#20a5ba", + "white": "#d9d9d9", + "brightBlack": "#4f4f4f", + "brightRed": "#fb007a", + "brightGreen": "#5fd7af", + "brightYellow": "#f3e430", + "brightBlue": "#20bbfc", + "brightPurple": "#6855de", + "brightCyan": "#4fb8cc", + "brightWhite": "#f1f1f1", + "background": "#212121", + "foreground": "#f1f1f1", + "cursorColor": "#20bbfc", + "selectionBackground": "#b6d6fd" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Pencil Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Pencil Light.json new file mode 100644 index 0000000..a0e4d65 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Pencil Light.json @@ -0,0 +1,23 @@ +{ + "name": "Pencil Light", + "black": "#212121", + "red": "#c30771", + "green": "#10a778", + "yellow": "#a89c14", + "blue": "#008ec4", + "purple": "#523c79", + "cyan": "#20a5ba", + "white": "#b3b3b3", + "brightBlack": "#424242", + "brightRed": "#fb007a", + "brightGreen": "#52caa2", + "brightYellow": "#c0b100", + "brightBlue": "#20bbfc", + "brightPurple": "#6855de", + "brightCyan": "#4fb8cc", + "brightWhite": "#f1f1f1", + "background": "#f1f1f1", + "foreground": "#424242", + "cursorColor": "#20bbfc", + "selectionBackground": "#b6d6fd" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Peppermint.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Peppermint.json new file mode 100644 index 0000000..53d7f75 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Peppermint.json @@ -0,0 +1,23 @@ +{ + "name": "Peppermint", + "black": "#353535", + "red": "#e74669", + "green": "#89d287", + "yellow": "#dab853", + "blue": "#449fd0", + "purple": "#da62dc", + "cyan": "#65aaaf", + "white": "#b4b4b4", + "brightBlack": "#535353", + "brightRed": "#e4859b", + "brightGreen": "#a3cca2", + "brightYellow": "#e1e487", + "brightBlue": "#6fbce2", + "brightPurple": "#e586e7", + "brightCyan": "#96dcdb", + "brightWhite": "#dfdfdf", + "background": "#000000", + "foreground": "#c8c8c8", + "cursorColor": "#bbbbbb", + "selectionBackground": "#e6e6e6" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Phala Green Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Phala Green Dark.json new file mode 100644 index 0000000..15889a7 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Phala Green Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Phala Green Dark", + "black": "#000000", + "red": "#ab1500", + "green": "#00b100", + "yellow": "#a9a700", + "blue": "#0223c0", + "purple": "#c22ec0", + "cyan": "#00b4c0", + "white": "#cbcbcb", + "brightBlack": "#797979", + "brightRed": "#ed2200", + "brightGreen": "#00db00", + "brightYellow": "#eae700", + "brightBlue": "#0433ff", + "brightPurple": "#ed3aea", + "brightCyan": "#00e8ea", + "brightWhite": "#eaeaea", + "background": "#000000", + "foreground": "#c1fc03", + "cursorColor": "#c1fc03", + "selectionBackground": "#014804" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Piatto Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Piatto Light.json new file mode 100644 index 0000000..51f39f2 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Piatto Light.json @@ -0,0 +1,23 @@ +{ + "name": "Piatto Light", + "black": "#414141", + "red": "#b23771", + "green": "#66781e", + "yellow": "#cd6f34", + "blue": "#3c5ea8", + "purple": "#a454b2", + "cyan": "#66781e", + "white": "#bfbfbf", + "brightBlack": "#3f3f3f", + "brightRed": "#db3365", + "brightGreen": "#829429", + "brightYellow": "#cd6f34", + "brightBlue": "#3c5ea8", + "brightPurple": "#a454b2", + "brightCyan": "#829429", + "brightWhite": "#f2f2f2", + "background": "#ffffff", + "foreground": "#414141", + "cursorColor": "#5e77c8", + "selectionBackground": "#706b4e" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Pnevma.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Pnevma.json new file mode 100644 index 0000000..acee846 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Pnevma.json @@ -0,0 +1,23 @@ +{ + "name": "Pnevma", + "black": "#2f2e2d", + "red": "#a36666", + "green": "#90a57d", + "yellow": "#d7af87", + "blue": "#7fa5bd", + "purple": "#c79ec4", + "cyan": "#8adbb4", + "white": "#d0d0d0", + "brightBlack": "#4a4845", + "brightRed": "#d78787", + "brightGreen": "#afbea2", + "brightYellow": "#e4c9af", + "brightBlue": "#a1bdce", + "brightPurple": "#d7beda", + "brightCyan": "#b1e7dd", + "brightWhite": "#efefef", + "background": "#1c1c1c", + "foreground": "#d0d0d0", + "cursorColor": "#e4c9af", + "selectionBackground": "#4d4d4d" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Poimandres Darker.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Poimandres Darker.json new file mode 100644 index 0000000..0b1b42e --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Poimandres Darker.json @@ -0,0 +1,23 @@ +{ + "name": "Poimandres Darker", + "black": "#16161e", + "red": "#d0679d", + "green": "#5de4c7", + "yellow": "#fffac2", + "blue": "#89ddff", + "purple": "#fcc5e9", + "cyan": "#add7ff", + "white": "#ffffff", + "brightBlack": "#a6accd", + "brightRed": "#d0679d", + "brightGreen": "#5de4c7", + "brightYellow": "#fffac2", + "brightBlue": "#add7ff", + "brightPurple": "#fae4fc", + "brightCyan": "#89ddff", + "brightWhite": "#ffffff", + "background": "#16161e", + "foreground": "#a6accd", + "cursorColor": "#ffffff", + "selectionBackground": "#a6accd" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Poimandres Storm.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Poimandres Storm.json new file mode 100644 index 0000000..6a16a52 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Poimandres Storm.json @@ -0,0 +1,23 @@ +{ + "name": "Poimandres Storm", + "black": "#252b37", + "red": "#d0679d", + "green": "#5de4c7", + "yellow": "#fffac2", + "blue": "#89ddff", + "purple": "#f087bd", + "cyan": "#89ddff", + "white": "#ffffff", + "brightBlack": "#a6accd", + "brightRed": "#d0679d", + "brightGreen": "#5de4c7", + "brightYellow": "#fffac2", + "brightBlue": "#add7ff", + "brightPurple": "#f087bd", + "brightCyan": "#add7ff", + "brightWhite": "#ffffff", + "background": "#252b37", + "foreground": "#a6accd", + "cursorColor": "#ffffff", + "selectionBackground": "#a6accd" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Poimandres White.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Poimandres White.json new file mode 100644 index 0000000..5f27fd8 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Poimandres White.json @@ -0,0 +1,23 @@ +{ + "name": "Poimandres White", + "black": "#fefeff", + "red": "#ff2090", + "green": "#01dab2", + "yellow": "#e5ba4e", + "blue": "#8abacd", + "purple": "#eb8394", + "cyan": "#8abacd", + "white": "#000000", + "brightBlack": "#969cbd", + "brightRed": "#ff2090", + "brightGreen": "#01dab2", + "brightYellow": "#e5ba4e", + "brightBlue": "#0ebfff", + "brightPurple": "#eb8394", + "brightCyan": "#0ebfff", + "brightWhite": "#000000", + "background": "#fefeff", + "foreground": "#969cbd", + "cursorColor": "#969cbd", + "selectionBackground": "#969cbd" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Poimandres.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Poimandres.json new file mode 100644 index 0000000..b2734df --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Poimandres.json @@ -0,0 +1,23 @@ +{ + "name": "Poimandres", + "black": "#1a1e28", + "red": "#d0679d", + "green": "#5de4c7", + "yellow": "#fffac2", + "blue": "#89ddff", + "purple": "#fcc5e9", + "cyan": "#add7ff", + "white": "#ffffff", + "brightBlack": "#a6accd", + "brightRed": "#d0679d", + "brightGreen": "#5de4c7", + "brightYellow": "#fffac2", + "brightBlue": "#add7ff", + "brightPurple": "#fae4fc", + "brightCyan": "#89ddff", + "brightWhite": "#ffffff", + "background": "#1a1e28", + "foreground": "#a6accd", + "cursorColor": "#ffffff", + "selectionBackground": "#a6accd" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Popping And Locking.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Popping And Locking.json new file mode 100644 index 0000000..86b49cc --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Popping And Locking.json @@ -0,0 +1,23 @@ +{ + "name": "Popping And Locking", + "black": "#1d2021", + "red": "#cc241d", + "green": "#98971a", + "yellow": "#d79921", + "blue": "#458588", + "purple": "#b16286", + "cyan": "#689d6a", + "white": "#a89984", + "brightBlack": "#928374", + "brightRed": "#f42c3e", + "brightGreen": "#b8bb26", + "brightYellow": "#fabd2f", + "brightBlue": "#99c6ca", + "brightPurple": "#d3869b", + "brightCyan": "#7ec16e", + "brightWhite": "#ebdbb2", + "background": "#181921", + "foreground": "#ebdbb2", + "cursorColor": "#c7c7c7", + "selectionBackground": "#ebdbb2" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Powershell.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Powershell.json new file mode 100644 index 0000000..cfdc1cc --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Powershell.json @@ -0,0 +1,23 @@ +{ + "name": "Powershell", + "black": "#000000", + "red": "#981a22", + "green": "#098003", + "yellow": "#c4a000", + "blue": "#4140c3", + "purple": "#d33682", + "cyan": "#0e807f", + "white": "#7f7c7f", + "brightBlack": "#808080", + "brightRed": "#ef2929", + "brightGreen": "#1cfe3c", + "brightYellow": "#fefe45", + "brightBlue": "#268ad2", + "brightPurple": "#fe13fa", + "brightCyan": "#29fffe", + "brightWhite": "#c2c1c3", + "background": "#052454", + "foreground": "#f6f6f7", + "cursorColor": "#f6f6f7", + "selectionBackground": "#f6f6f7" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Primary.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Primary.json new file mode 100644 index 0000000..1243197 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Primary.json @@ -0,0 +1,23 @@ +{ + "name": "Primary", + "black": "#000000", + "red": "#db4437", + "green": "#0f9d58", + "yellow": "#f4b400", + "blue": "#4285f4", + "purple": "#db4437", + "cyan": "#4285f4", + "white": "#bfbfbf", + "brightBlack": "#000000", + "brightRed": "#db4437", + "brightGreen": "#0f9d58", + "brightYellow": "#f4b400", + "brightBlue": "#4285f4", + "brightPurple": "#4285f4", + "brightCyan": "#0f9d58", + "brightWhite": "#ffffff", + "background": "#ffffff", + "foreground": "#000000", + "cursorColor": "#000000", + "selectionBackground": "#656565" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Pro Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Pro Light.json new file mode 100644 index 0000000..3b83bbd --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Pro Light.json @@ -0,0 +1,23 @@ +{ + "name": "Pro Light", + "black": "#000000", + "red": "#e5492b", + "green": "#50d148", + "yellow": "#c6c440", + "blue": "#3b75ff", + "purple": "#ed66e8", + "cyan": "#4ed2de", + "white": "#c2c2c2", + "brightBlack": "#9f9f9f", + "brightRed": "#ff6640", + "brightGreen": "#48d53e", + "brightYellow": "#bfbe23", + "brightBlue": "#0082ff", + "brightPurple": "#ff7eff", + "brightCyan": "#3bd1d2", + "brightWhite": "#f2f2f2", + "background": "#ffffff", + "foreground": "#191919", + "cursorColor": "#4d4d4d", + "selectionBackground": "#c1ddff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Pro.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Pro.json new file mode 100644 index 0000000..0bb29b4 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Pro.json @@ -0,0 +1,23 @@ +{ + "name": "Pro", + "black": "#000000", + "red": "#990000", + "green": "#00a600", + "yellow": "#999900", + "blue": "#2009db", + "purple": "#b200b2", + "cyan": "#00a6b2", + "white": "#bfbfbf", + "brightBlack": "#666666", + "brightRed": "#e50000", + "brightGreen": "#00d900", + "brightYellow": "#e5e500", + "brightBlue": "#0000ff", + "brightPurple": "#e500e5", + "brightCyan": "#00e5e5", + "brightWhite": "#e5e5e5", + "background": "#000000", + "foreground": "#f2f2f2", + "cursorColor": "#4d4d4d", + "selectionBackground": "#414141" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Purple Rain.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Purple Rain.json new file mode 100644 index 0000000..f88e284 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Purple Rain.json @@ -0,0 +1,23 @@ +{ + "name": "Purple Rain", + "black": "#000000", + "red": "#ff260e", + "green": "#9be205", + "yellow": "#ffc400", + "blue": "#00a2fa", + "purple": "#815bb5", + "cyan": "#00deef", + "white": "#ffffff", + "brightBlack": "#565656", + "brightRed": "#ff4250", + "brightGreen": "#b8e36e", + "brightYellow": "#ffd852", + "brightBlue": "#00a6ff", + "brightPurple": "#ac7bf0", + "brightCyan": "#74fdf3", + "brightWhite": "#ffffff", + "background": "#21084a", + "foreground": "#fffbf6", + "cursorColor": "#ff271d", + "selectionBackground": "#287691" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Purplepeter.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Purplepeter.json new file mode 100644 index 0000000..22947d0 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Purplepeter.json @@ -0,0 +1,23 @@ +{ + "name": "Purplepeter", + "black": "#0a0520", + "red": "#ff796d", + "green": "#99b481", + "yellow": "#efdfac", + "blue": "#66d9ef", + "purple": "#e78fcd", + "cyan": "#ba8cff", + "white": "#ffba81", + "brightBlack": "#504b63", + "brightRed": "#f99f92", + "brightGreen": "#b4be8f", + "brightYellow": "#f2e9bf", + "brightBlue": "#79daed", + "brightPurple": "#ba91d4", + "brightCyan": "#a0a0d6", + "brightWhite": "#b9aed3", + "background": "#2a1a4a", + "foreground": "#ece7fa", + "cursorColor": "#c7c7c7", + "selectionBackground": "#8689c2" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Rapture.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Rapture.json new file mode 100644 index 0000000..0a9e00c --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Rapture.json @@ -0,0 +1,23 @@ +{ + "name": "Rapture", + "black": "#000000", + "red": "#fc644d", + "green": "#7afde1", + "yellow": "#fff09b", + "blue": "#6c9bf5", + "purple": "#ff4fa1", + "cyan": "#64e0ff", + "white": "#c0c9e5", + "brightBlack": "#304b66", + "brightRed": "#fc644d", + "brightGreen": "#7afde1", + "brightYellow": "#fff09b", + "brightBlue": "#6c9bf5", + "brightPurple": "#ff4fa1", + "brightCyan": "#64e0ff", + "brightWhite": "#ffffff", + "background": "#111e2a", + "foreground": "#c0c9e5", + "cursorColor": "#ffffff", + "selectionBackground": "#304b66" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Raycast Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Raycast Dark.json new file mode 100644 index 0000000..93b422d --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Raycast Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Raycast Dark", + "black": "#000000", + "red": "#ff5360", + "green": "#59d499", + "yellow": "#ffc531", + "blue": "#56c2ff", + "purple": "#cf2f98", + "cyan": "#52eee5", + "white": "#ffffff", + "brightBlack": "#4c4c4c", + "brightRed": "#ff6363", + "brightGreen": "#59d499", + "brightYellow": "#ffc531", + "brightBlue": "#56c2ff", + "brightPurple": "#cf2f98", + "brightCyan": "#52eee5", + "brightWhite": "#ffffff", + "background": "#1a1a1a", + "foreground": "#ffffff", + "cursorColor": "#cccccc", + "selectionBackground": "#333333" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Raycast Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Raycast Light.json new file mode 100644 index 0000000..ac24118 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Raycast Light.json @@ -0,0 +1,23 @@ +{ + "name": "Raycast Light", + "black": "#000000", + "red": "#b12424", + "green": "#006b4f", + "yellow": "#f8a300", + "blue": "#138af2", + "purple": "#9a1b6e", + "cyan": "#3eb8bf", + "white": "#bfbfbf", + "brightBlack": "#000000", + "brightRed": "#b12424", + "brightGreen": "#006b4f", + "brightYellow": "#f8a300", + "brightBlue": "#138af2", + "brightPurple": "#9a1b6e", + "brightCyan": "#3eb8bf", + "brightWhite": "#ffffff", + "background": "#ffffff", + "foreground": "#000000", + "cursorColor": "#000000", + "selectionBackground": "#e5e5e5" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Rebecca.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Rebecca.json new file mode 100644 index 0000000..83436f3 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Rebecca.json @@ -0,0 +1,23 @@ +{ + "name": "Rebecca", + "black": "#12131e", + "red": "#dd7755", + "green": "#04dbb5", + "yellow": "#f2e7b7", + "blue": "#7aa5ff", + "purple": "#bf9cf9", + "cyan": "#56d3c2", + "white": "#e4e3e9", + "brightBlack": "#666699", + "brightRed": "#ff92cd", + "brightGreen": "#01eac0", + "brightYellow": "#fffca8", + "brightBlue": "#69c0fa", + "brightPurple": "#c17ff8", + "brightCyan": "#8bfde1", + "brightWhite": "#f4f2f9", + "background": "#292a44", + "foreground": "#e8e6ed", + "cursorColor": "#b89bf9", + "selectionBackground": "#663399" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Red Alert.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Red Alert.json new file mode 100644 index 0000000..c50d229 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Red Alert.json @@ -0,0 +1,23 @@ +{ + "name": "Red Alert", + "black": "#000000", + "red": "#d62e4e", + "green": "#71be6b", + "yellow": "#beb86b", + "blue": "#489bee", + "purple": "#e979d7", + "cyan": "#6bbeb8", + "white": "#d6d6d6", + "brightBlack": "#666666", + "brightRed": "#e02553", + "brightGreen": "#aff08c", + "brightYellow": "#dfddb7", + "brightBlue": "#65aaf1", + "brightPurple": "#ddb7df", + "brightCyan": "#b7dfdd", + "brightWhite": "#ffffff", + "background": "#762423", + "foreground": "#ffffff", + "cursorColor": "#ffffff", + "selectionBackground": "#073642" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Red Planet.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Red Planet.json new file mode 100644 index 0000000..ca155ec --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Red Planet.json @@ -0,0 +1,23 @@ +{ + "name": "Red Planet", + "black": "#202020", + "red": "#8c3432", + "green": "#728271", + "yellow": "#e8bf6a", + "blue": "#69819e", + "purple": "#896492", + "cyan": "#5b8390", + "white": "#b9aa99", + "brightBlack": "#676767", + "brightRed": "#b55242", + "brightGreen": "#869985", + "brightYellow": "#ebeb91", + "brightBlue": "#60827e", + "brightPurple": "#de4974", + "brightCyan": "#38add8", + "brightWhite": "#d6bfb8", + "background": "#222222", + "foreground": "#c2b790", + "cursorColor": "#c2b790", + "selectionBackground": "#1b324a" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Red Sands.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Red Sands.json new file mode 100644 index 0000000..e0a4300 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Red Sands.json @@ -0,0 +1,23 @@ +{ + "name": "Red Sands", + "black": "#000000", + "red": "#ff3f00", + "green": "#00bb00", + "yellow": "#e7b000", + "blue": "#0072ff", + "purple": "#bb00bb", + "cyan": "#00bbbb", + "white": "#bbbbbb", + "brightBlack": "#6e6e6e", + "brightRed": "#d41a1a", + "brightGreen": "#00bb00", + "brightYellow": "#e7b000", + "brightBlue": "#0072ae", + "brightPurple": "#ff55ff", + "brightCyan": "#55ffff", + "brightWhite": "#ffffff", + "background": "#7a251e", + "foreground": "#d7c9a7", + "cursorColor": "#ffffff", + "selectionBackground": "#a4a390" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Relaxed.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Relaxed.json new file mode 100644 index 0000000..5745db4 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Relaxed.json @@ -0,0 +1,23 @@ +{ + "name": "Relaxed", + "black": "#151515", + "red": "#bc5653", + "green": "#909d63", + "yellow": "#ebc17a", + "blue": "#6a8799", + "purple": "#b06698", + "cyan": "#c9dfff", + "white": "#d9d9d9", + "brightBlack": "#636363", + "brightRed": "#bc5653", + "brightGreen": "#a0ac77", + "brightYellow": "#ebc17a", + "brightBlue": "#7eaac7", + "brightPurple": "#b06698", + "brightCyan": "#acbbd0", + "brightWhite": "#f7f7f7", + "background": "#353a44", + "foreground": "#d9d9d9", + "cursorColor": "#d9d9d9", + "selectionBackground": "#6a7985" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Retro Legends.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Retro Legends.json new file mode 100644 index 0000000..468ed5f --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Retro Legends.json @@ -0,0 +1,23 @@ +{ + "name": "Retro Legends", + "black": "#262626", + "red": "#de5454", + "green": "#45eb45", + "yellow": "#f7bf2b", + "blue": "#4066f2", + "purple": "#bf4cf2", + "cyan": "#40d9e6", + "white": "#bfe6bf", + "brightBlack": "#4c594c", + "brightRed": "#ff6666", + "brightGreen": "#59ff59", + "brightYellow": "#ffd933", + "brightBlue": "#4c80ff", + "brightPurple": "#e666ff", + "brightCyan": "#59e6ff", + "brightWhite": "#f2fff2", + "background": "#0d0d0d", + "foreground": "#45eb45", + "cursorColor": "#45eb45", + "selectionBackground": "#336633" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Retro.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Retro.json new file mode 100644 index 0000000..cc70bf4 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Retro.json @@ -0,0 +1,23 @@ +{ + "name": "Retro", + "black": "#13a10e", + "red": "#13a10e", + "green": "#13a10e", + "yellow": "#13a10e", + "blue": "#13a10e", + "purple": "#13a10e", + "cyan": "#13a10e", + "white": "#13a10e", + "brightBlack": "#16ba10", + "brightRed": "#16ba10", + "brightGreen": "#16ba10", + "brightYellow": "#16ba10", + "brightBlue": "#16ba10", + "brightPurple": "#16ba10", + "brightCyan": "#16ba10", + "brightWhite": "#16ba10", + "background": "#000000", + "foreground": "#13a10e", + "cursorColor": "#13a10e", + "selectionBackground": "#ffffff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Rippedcasts.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Rippedcasts.json new file mode 100644 index 0000000..f0fe781 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Rippedcasts.json @@ -0,0 +1,23 @@ +{ + "name": "Rippedcasts", + "black": "#000000", + "red": "#cdaf95", + "green": "#a8ff60", + "yellow": "#bfbb1f", + "blue": "#75a5b0", + "purple": "#ff73fd", + "cyan": "#5a647e", + "white": "#bfbfbf", + "brightBlack": "#666666", + "brightRed": "#eecbad", + "brightGreen": "#bcee68", + "brightYellow": "#e5e500", + "brightBlue": "#86bdc9", + "brightPurple": "#e500e5", + "brightCyan": "#8c9bc4", + "brightWhite": "#e5e5e5", + "background": "#2b2b2b", + "foreground": "#ffffff", + "cursorColor": "#7f7f7f", + "selectionBackground": "#5a647e" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Rose Pine Dawn.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Rose Pine Dawn.json new file mode 100644 index 0000000..7f72b10 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Rose Pine Dawn.json @@ -0,0 +1,23 @@ +{ + "name": "Rose Pine Dawn", + "black": "#f2e9e1", + "red": "#b4637a", + "green": "#286983", + "yellow": "#ea9d34", + "blue": "#56949f", + "purple": "#907aa9", + "cyan": "#d7827e", + "white": "#575279", + "brightBlack": "#9893a5", + "brightRed": "#b4637a", + "brightGreen": "#286983", + "brightYellow": "#ea9d34", + "brightBlue": "#56949f", + "brightPurple": "#907aa9", + "brightCyan": "#d7827e", + "brightWhite": "#575279", + "background": "#faf4ed", + "foreground": "#575279", + "cursorColor": "#575279", + "selectionBackground": "#dfdad9" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Rose Pine Moon.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Rose Pine Moon.json new file mode 100644 index 0000000..a14595d --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Rose Pine Moon.json @@ -0,0 +1,23 @@ +{ + "name": "Rose Pine Moon", + "black": "#393552", + "red": "#eb6f92", + "green": "#3e8fb0", + "yellow": "#f6c177", + "blue": "#9ccfd8", + "purple": "#c4a7e7", + "cyan": "#ea9a97", + "white": "#e0def4", + "brightBlack": "#6e6a86", + "brightRed": "#eb6f92", + "brightGreen": "#3e8fb0", + "brightYellow": "#f6c177", + "brightBlue": "#9ccfd8", + "brightPurple": "#c4a7e7", + "brightCyan": "#ea9a97", + "brightWhite": "#e0def4", + "background": "#232136", + "foreground": "#e0def4", + "cursorColor": "#e0def4", + "selectionBackground": "#44415a" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Rose Pine.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Rose Pine.json new file mode 100644 index 0000000..ca98fa5 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Rose Pine.json @@ -0,0 +1,23 @@ +{ + "name": "Rose Pine", + "black": "#26233a", + "red": "#eb6f92", + "green": "#31748f", + "yellow": "#f6c177", + "blue": "#9ccfd8", + "purple": "#c4a7e7", + "cyan": "#ebbcba", + "white": "#e0def4", + "brightBlack": "#6e6a86", + "brightRed": "#eb6f92", + "brightGreen": "#31748f", + "brightYellow": "#f6c177", + "brightBlue": "#9ccfd8", + "brightPurple": "#c4a7e7", + "brightCyan": "#ebbcba", + "brightWhite": "#e0def4", + "background": "#191724", + "foreground": "#e0def4", + "cursorColor": "#e0def4", + "selectionBackground": "#403d52" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Rouge 2.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Rouge 2.json new file mode 100644 index 0000000..718e063 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Rouge 2.json @@ -0,0 +1,23 @@ +{ + "name": "Rouge 2", + "black": "#5d5d6b", + "red": "#c6797e", + "green": "#969e92", + "yellow": "#dbcdab", + "blue": "#6e94b9", + "purple": "#4c4e78", + "cyan": "#8ab6c1", + "white": "#e8e8ea", + "brightBlack": "#616274", + "brightRed": "#c6797e", + "brightGreen": "#e6dcc4", + "brightYellow": "#e6dcc4", + "brightBlue": "#98b3cd", + "brightPurple": "#8283a1", + "brightCyan": "#abcbd3", + "brightWhite": "#e8e8ea", + "background": "#17182b", + "foreground": "#a2a3aa", + "cursorColor": "#969e92", + "selectionBackground": "#5d5d6b" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Royal.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Royal.json new file mode 100644 index 0000000..bb24825 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Royal.json @@ -0,0 +1,23 @@ +{ + "name": "Royal", + "black": "#241f2b", + "red": "#91284c", + "green": "#23801c", + "yellow": "#b49d27", + "blue": "#6580b0", + "purple": "#674d96", + "cyan": "#8aaabe", + "white": "#524966", + "brightBlack": "#3e3a4a", + "brightRed": "#d5356c", + "brightGreen": "#2cd946", + "brightYellow": "#fde83b", + "brightBlue": "#90baf9", + "brightPurple": "#a479e3", + "brightCyan": "#acd4eb", + "brightWhite": "#9e8cbd", + "background": "#100815", + "foreground": "#514968", + "cursorColor": "#524966", + "selectionBackground": "#1f1d2b" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ryuuko.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ryuuko.json new file mode 100644 index 0000000..357e481 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ryuuko.json @@ -0,0 +1,23 @@ +{ + "name": "Ryuuko", + "black": "#2c3941", + "red": "#865f5b", + "green": "#66907d", + "yellow": "#b1a990", + "blue": "#6a8e95", + "purple": "#b18a73", + "cyan": "#88b2ac", + "white": "#ececec", + "brightBlack": "#5d7079", + "brightRed": "#865f5b", + "brightGreen": "#66907d", + "brightYellow": "#b1a990", + "brightBlue": "#6a8e95", + "brightPurple": "#b18a73", + "brightCyan": "#88b2ac", + "brightWhite": "#ececec", + "background": "#2c3941", + "foreground": "#ececec", + "cursorColor": "#ececec", + "selectionBackground": "#002831" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Sakura.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Sakura.json new file mode 100644 index 0000000..2b4544d --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Sakura.json @@ -0,0 +1,23 @@ +{ + "name": "Sakura", + "black": "#000000", + "red": "#d52370", + "green": "#41af1a", + "yellow": "#bc7053", + "blue": "#6964ab", + "purple": "#c71fbf", + "cyan": "#939393", + "white": "#998eac", + "brightBlack": "#786d69", + "brightRed": "#f41d99", + "brightGreen": "#22e529", + "brightYellow": "#f59574", + "brightBlue": "#9892f1", + "brightPurple": "#e90cdd", + "brightCyan": "#eeeeee", + "brightWhite": "#cbb6ff", + "background": "#18131e", + "foreground": "#dd7bdc", + "cursorColor": "#ff65fd", + "selectionBackground": "#c05cbf" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Scarlet Protocol.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Scarlet Protocol.json new file mode 100644 index 0000000..569ada9 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Scarlet Protocol.json @@ -0,0 +1,23 @@ +{ + "name": "Scarlet Protocol", + "black": "#101116", + "red": "#ff0051", + "green": "#00dc84", + "yellow": "#faf945", + "blue": "#0271b6", + "purple": "#ca30c7", + "cyan": "#00c5c7", + "white": "#c7c7c7", + "brightBlack": "#686868", + "brightRed": "#ff6e67", + "brightGreen": "#5ffa68", + "brightYellow": "#fffc67", + "brightBlue": "#6871ff", + "brightPurple": "#bd35ec", + "brightCyan": "#60fdff", + "brightWhite": "#ffffff", + "background": "#1c153d", + "foreground": "#e41951", + "cursorColor": "#76ff9f", + "selectionBackground": "#c1deff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Sea Shells.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Sea Shells.json new file mode 100644 index 0000000..7183f6e --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Sea Shells.json @@ -0,0 +1,23 @@ +{ + "name": "Sea Shells", + "black": "#17384c", + "red": "#d15123", + "green": "#027c9b", + "yellow": "#fca02f", + "blue": "#1e4950", + "purple": "#68d4f1", + "cyan": "#50a3b5", + "white": "#deb88d", + "brightBlack": "#434b53", + "brightRed": "#d48678", + "brightGreen": "#628d98", + "brightYellow": "#fdd39f", + "brightBlue": "#1bbcdd", + "brightPurple": "#bbe3ee", + "brightCyan": "#87acb4", + "brightWhite": "#fee4ce", + "background": "#09141b", + "foreground": "#deb88d", + "cursorColor": "#fca02f", + "selectionBackground": "#1e4962" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Seafoam Pastel.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Seafoam Pastel.json new file mode 100644 index 0000000..13636d9 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Seafoam Pastel.json @@ -0,0 +1,23 @@ +{ + "name": "Seafoam Pastel", + "black": "#757575", + "red": "#825d4d", + "green": "#728c62", + "yellow": "#ada16d", + "blue": "#4d7b82", + "purple": "#8a7267", + "cyan": "#729494", + "white": "#e0e0e0", + "brightBlack": "#8a8a8a", + "brightRed": "#cf937a", + "brightGreen": "#98d9aa", + "brightYellow": "#fae79d", + "brightBlue": "#7ac3cf", + "brightPurple": "#d6b2a1", + "brightCyan": "#ade0e0", + "brightWhite": "#e0e0e0", + "background": "#243435", + "foreground": "#d4e7d4", + "cursorColor": "#57647a", + "selectionBackground": "#ffffff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Selenized Black.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Selenized Black.json new file mode 100644 index 0000000..7142808 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Selenized Black.json @@ -0,0 +1,23 @@ +{ + "name": "Selenized Black", + "black": "#252525", + "red": "#ed4a46", + "green": "#70b433", + "yellow": "#dbb32d", + "blue": "#368aeb", + "purple": "#eb6eb7", + "cyan": "#3fc5b7", + "white": "#b9b9b9", + "brightBlack": "#777777", + "brightRed": "#ff5e56", + "brightGreen": "#83c746", + "brightYellow": "#efc541", + "brightBlue": "#4f9cfe", + "brightPurple": "#ff81ca", + "brightCyan": "#56d8c9", + "brightWhite": "#dedede", + "background": "#181818", + "foreground": "#b9b9b9", + "cursorColor": "#777777", + "selectionBackground": "#3b3b3b" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Selenized Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Selenized Dark.json new file mode 100644 index 0000000..5c39ba7 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Selenized Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Selenized Dark", + "black": "#184956", + "red": "#fa5750", + "green": "#75b938", + "yellow": "#dbb32d", + "blue": "#4695f7", + "purple": "#f275be", + "cyan": "#41c7b9", + "white": "#adbcbc", + "brightBlack": "#72898f", + "brightRed": "#ff665c", + "brightGreen": "#84c747", + "brightYellow": "#ebc13d", + "brightBlue": "#58a3ff", + "brightPurple": "#ff84cd", + "brightCyan": "#53d6c7", + "brightWhite": "#cad8d9", + "background": "#103c48", + "foreground": "#adbcbc", + "cursorColor": "#adbcbc", + "selectionBackground": "#184956" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Selenized Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Selenized Light.json new file mode 100644 index 0000000..2d7853a --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Selenized Light.json @@ -0,0 +1,23 @@ +{ + "name": "Selenized Light", + "black": "#ece3cc", + "red": "#d2212d", + "green": "#489100", + "yellow": "#ad8900", + "blue": "#0072d4", + "purple": "#ca4898", + "cyan": "#009c8f", + "white": "#53676d", + "brightBlack": "#909995", + "brightRed": "#cc1729", + "brightGreen": "#428b00", + "brightYellow": "#a78300", + "brightBlue": "#006dce", + "brightPurple": "#c44392", + "brightCyan": "#00978a", + "brightWhite": "#3a4d53", + "background": "#fbf3db", + "foreground": "#53676d", + "cursorColor": "#53676d", + "selectionBackground": "#ece3cc" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Seoulbones Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Seoulbones Dark.json new file mode 100644 index 0000000..85ce408 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Seoulbones Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Seoulbones Dark", + "black": "#4b4b4b", + "red": "#e388a3", + "green": "#98bd99", + "yellow": "#ffdf9b", + "blue": "#97bdde", + "purple": "#a5a6c5", + "cyan": "#6fbdbe", + "white": "#dddddd", + "brightBlack": "#797172", + "brightRed": "#eb99b1", + "brightGreen": "#8fcd92", + "brightYellow": "#ffe5b3", + "brightBlue": "#a2c8e9", + "brightPurple": "#b2b3da", + "brightCyan": "#6bcacb", + "brightWhite": "#a8a8a8", + "background": "#4b4b4b", + "foreground": "#dddddd", + "cursorColor": "#e2e2e2", + "selectionBackground": "#777777" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Seoulbones Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Seoulbones Light.json new file mode 100644 index 0000000..8f94fc3 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Seoulbones Light.json @@ -0,0 +1,23 @@ +{ + "name": "Seoulbones Light", + "black": "#e2e2e2", + "red": "#dc5284", + "green": "#628562", + "yellow": "#c48562", + "blue": "#0084a3", + "purple": "#896788", + "cyan": "#008586", + "white": "#555555", + "brightBlack": "#a5a0a1", + "brightRed": "#be3c6d", + "brightGreen": "#487249", + "brightYellow": "#a76b48", + "brightBlue": "#006f89", + "brightPurple": "#7f4c7e", + "brightCyan": "#006f70", + "brightWhite": "#777777", + "background": "#e2e2e2", + "foreground": "#555555", + "cursorColor": "#555555", + "selectionBackground": "#cccccc" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Seti.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Seti.json new file mode 100644 index 0000000..4d03c91 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Seti.json @@ -0,0 +1,23 @@ +{ + "name": "Seti", + "black": "#323232", + "red": "#c22832", + "green": "#8ec43d", + "yellow": "#e0c64f", + "blue": "#43a5d5", + "purple": "#8b57b5", + "cyan": "#8ec43d", + "white": "#eeeeee", + "brightBlack": "#3f3f3f", + "brightRed": "#c22832", + "brightGreen": "#8ec43d", + "brightYellow": "#e0c64f", + "brightBlue": "#43a5d5", + "brightPurple": "#8b57b5", + "brightCyan": "#8ec43d", + "brightWhite": "#ffffff", + "background": "#111213", + "foreground": "#cacecd", + "cursorColor": "#e3bf21", + "selectionBackground": "#303233" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Shades Of Purple.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Shades Of Purple.json new file mode 100644 index 0000000..639f09c --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Shades Of Purple.json @@ -0,0 +1,23 @@ +{ + "name": "Shades Of Purple", + "black": "#000000", + "red": "#d90429", + "green": "#3ad900", + "yellow": "#ffe700", + "blue": "#6943ff", + "purple": "#ff2c70", + "cyan": "#00c5c7", + "white": "#c7c7c7", + "brightBlack": "#686868", + "brightRed": "#f92a1c", + "brightGreen": "#43d426", + "brightYellow": "#f1d000", + "brightBlue": "#6871ff", + "brightPurple": "#ff77ff", + "brightCyan": "#79e8fb", + "brightWhite": "#ffffff", + "background": "#1e1d40", + "foreground": "#ffffff", + "cursorColor": "#fad000", + "selectionBackground": "#b362ff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Shaman.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Shaman.json new file mode 100644 index 0000000..9754c7f --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Shaman.json @@ -0,0 +1,23 @@ +{ + "name": "Shaman", + "black": "#012026", + "red": "#b2302d", + "green": "#00a941", + "yellow": "#5e8baa", + "blue": "#449a86", + "purple": "#00599d", + "cyan": "#5d7e19", + "white": "#405555", + "brightBlack": "#384451", + "brightRed": "#ff4242", + "brightGreen": "#2aea5e", + "brightYellow": "#8ed4fd", + "brightBlue": "#61d5ba", + "brightPurple": "#1298ff", + "brightCyan": "#98d028", + "brightWhite": "#58fbd6", + "background": "#001015", + "foreground": "#405555", + "cursorColor": "#4afcd6", + "selectionBackground": "#415555" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Slate.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Slate.json new file mode 100644 index 0000000..63d2a72 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Slate.json @@ -0,0 +1,23 @@ +{ + "name": "Slate", + "black": "#222222", + "red": "#e2a8bf", + "green": "#81d778", + "yellow": "#c4c9c0", + "blue": "#335856", + "purple": "#a481d3", + "cyan": "#15ab9c", + "white": "#02c5e0", + "brightBlack": "#ffffff", + "brightRed": "#ffcdd9", + "brightGreen": "#beffa8", + "brightYellow": "#d0ccca", + "brightBlue": "#7ab0d2", + "brightPurple": "#c5a7d9", + "brightCyan": "#8cdfe0", + "brightWhite": "#e0e0e0", + "background": "#222222", + "foreground": "#35b1d2", + "cursorColor": "#87d3c4", + "selectionBackground": "#0f3754" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Sleepy Hollow.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Sleepy Hollow.json new file mode 100644 index 0000000..ec56a4b --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Sleepy Hollow.json @@ -0,0 +1,23 @@ +{ + "name": "Sleepy Hollow", + "black": "#572100", + "red": "#ba3934", + "green": "#91773f", + "yellow": "#b55600", + "blue": "#5f63b4", + "purple": "#a17c7b", + "cyan": "#8faea9", + "white": "#af9a91", + "brightBlack": "#4e4b61", + "brightRed": "#d9443f", + "brightGreen": "#d6b04e", + "brightYellow": "#f66813", + "brightBlue": "#8086ef", + "brightPurple": "#e2c2bb", + "brightCyan": "#a4dce7", + "brightWhite": "#d2c7a9", + "background": "#121214", + "foreground": "#af9a91", + "cursorColor": "#af9a91", + "selectionBackground": "#575256" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Smyck.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Smyck.json new file mode 100644 index 0000000..592e054 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Smyck.json @@ -0,0 +1,23 @@ +{ + "name": "Smyck", + "black": "#000000", + "red": "#b84131", + "green": "#7da900", + "yellow": "#c4a500", + "blue": "#62a3c4", + "purple": "#ba8acc", + "cyan": "#207383", + "white": "#a1a1a1", + "brightBlack": "#7a7a7a", + "brightRed": "#d6837c", + "brightGreen": "#c4f137", + "brightYellow": "#fee14d", + "brightBlue": "#8dcff0", + "brightPurple": "#f79aff", + "brightCyan": "#6ad9cf", + "brightWhite": "#f7f7f7", + "background": "#1b1b1b", + "foreground": "#f7f7f7", + "cursorColor": "#bbbbbb", + "selectionBackground": "#207483" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Snazzy Soft.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Snazzy Soft.json new file mode 100644 index 0000000..26efee3 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Snazzy Soft.json @@ -0,0 +1,23 @@ +{ + "name": "Snazzy Soft", + "black": "#000000", + "red": "#ff5c57", + "green": "#5af78e", + "yellow": "#f3f99d", + "blue": "#57c7ff", + "purple": "#ff6ac1", + "cyan": "#9aedfe", + "white": "#f1f1f0", + "brightBlack": "#686868", + "brightRed": "#ff5c57", + "brightGreen": "#5af78e", + "brightYellow": "#f3f99d", + "brightBlue": "#57c7ff", + "brightPurple": "#ff6ac1", + "brightCyan": "#9aedfe", + "brightWhite": "#f1f1f0", + "background": "#282a36", + "foreground": "#eff0eb", + "cursorColor": "#eaeaea", + "selectionBackground": "#92bcd0" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Snazzy.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Snazzy.json new file mode 100644 index 0000000..8a601a0 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Snazzy.json @@ -0,0 +1,23 @@ +{ + "name": "Snazzy", + "black": "#000000", + "red": "#fc4346", + "green": "#50fb7c", + "yellow": "#f0fb8c", + "blue": "#49baff", + "purple": "#fc4cb4", + "cyan": "#8be9fe", + "white": "#ededec", + "brightBlack": "#555555", + "brightRed": "#fc4346", + "brightGreen": "#50fb7c", + "brightYellow": "#f0fb8c", + "brightBlue": "#49baff", + "brightPurple": "#fc4cb4", + "brightCyan": "#8be9fe", + "brightWhite": "#ededec", + "background": "#1e1f29", + "foreground": "#ebece6", + "cursorColor": "#e4e4e4", + "selectionBackground": "#81aec6" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Soft Server.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Soft Server.json new file mode 100644 index 0000000..6d9eac0 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Soft Server.json @@ -0,0 +1,23 @@ +{ + "name": "Soft Server", + "black": "#000000", + "red": "#a2686a", + "green": "#9aa56a", + "yellow": "#a3906a", + "blue": "#6b8fa3", + "purple": "#6a71a3", + "cyan": "#6ba58f", + "white": "#99a3a2", + "brightBlack": "#666c6c", + "brightRed": "#dd5c60", + "brightGreen": "#bfdf55", + "brightYellow": "#deb360", + "brightBlue": "#62b1df", + "brightPurple": "#606edf", + "brightCyan": "#64e39c", + "brightWhite": "#d2e0de", + "background": "#242626", + "foreground": "#99a3a2", + "cursorColor": "#d2e0de", + "selectionBackground": "#7f8786" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Solarized Darcula.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Solarized Darcula.json new file mode 100644 index 0000000..ce6dbbc --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Solarized Darcula.json @@ -0,0 +1,23 @@ +{ + "name": "Solarized Darcula", + "black": "#25292a", + "red": "#f24840", + "green": "#629655", + "yellow": "#b68800", + "blue": "#2075c7", + "purple": "#797fd4", + "cyan": "#15968d", + "white": "#d2d8d9", + "brightBlack": "#65696a", + "brightRed": "#f24840", + "brightGreen": "#629655", + "brightYellow": "#b68800", + "brightBlue": "#2075c7", + "brightPurple": "#797fd4", + "brightCyan": "#15968d", + "brightWhite": "#d2d8d9", + "background": "#3d3f41", + "foreground": "#d2d8d9", + "cursorColor": "#708284", + "selectionBackground": "#214283" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Solarized Dark Higher Contrast.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Solarized Dark Higher Contrast.json new file mode 100644 index 0000000..0d45587 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Solarized Dark Higher Contrast.json @@ -0,0 +1,23 @@ +{ + "name": "Solarized Dark Higher Contrast", + "black": "#002831", + "red": "#d11c24", + "green": "#6cbe6c", + "yellow": "#a57706", + "blue": "#2176c7", + "purple": "#c61c6f", + "cyan": "#259286", + "white": "#eae3cb", + "brightBlack": "#006488", + "brightRed": "#f5163b", + "brightGreen": "#51ef84", + "brightYellow": "#b27e28", + "brightBlue": "#178ec8", + "brightPurple": "#e24d8e", + "brightCyan": "#00b39e", + "brightWhite": "#fcf4dc", + "background": "#001e27", + "foreground": "#9cc2c3", + "cursorColor": "#f34b00", + "selectionBackground": "#003748" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Solarized Dark Patched.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Solarized Dark Patched.json new file mode 100644 index 0000000..833c69e --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Solarized Dark Patched.json @@ -0,0 +1,23 @@ +{ + "name": "Solarized Dark Patched", + "black": "#002831", + "red": "#d11c24", + "green": "#738a05", + "yellow": "#a57706", + "blue": "#2176c7", + "purple": "#c61c6f", + "cyan": "#259286", + "white": "#eae3cb", + "brightBlack": "#475b62", + "brightRed": "#bd3613", + "brightGreen": "#475b62", + "brightYellow": "#536870", + "brightBlue": "#708284", + "brightPurple": "#5956ba", + "brightCyan": "#819090", + "brightWhite": "#fcf4dc", + "background": "#001e27", + "foreground": "#708284", + "cursorColor": "#708284", + "selectionBackground": "#002831" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Solarized Osaka Night.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Solarized Osaka Night.json new file mode 100644 index 0000000..6fa6e5f --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Solarized Osaka Night.json @@ -0,0 +1,23 @@ +{ + "name": "Solarized Osaka Night", + "black": "#15161e", + "red": "#f7768e", + "green": "#9ece6a", + "yellow": "#e0af68", + "blue": "#7aa2f7", + "purple": "#bb9af7", + "cyan": "#7dcfff", + "white": "#a9b1d6", + "brightBlack": "#414868", + "brightRed": "#f7768e", + "brightGreen": "#9ece6a", + "brightYellow": "#e0af68", + "brightBlue": "#7aa2f7", + "brightPurple": "#bb9af7", + "brightCyan": "#7dcfff", + "brightWhite": "#c0caf5", + "background": "#1a1b26", + "foreground": "#c0caf5", + "cursorColor": "#c0caf5", + "selectionBackground": "#283457" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Sonokai.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Sonokai.json new file mode 100644 index 0000000..9430426 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Sonokai.json @@ -0,0 +1,23 @@ +{ + "name": "Sonokai", + "black": "#181819", + "red": "#fc5d7c", + "green": "#9ed072", + "yellow": "#e7c664", + "blue": "#76cce0", + "purple": "#b39df3", + "cyan": "#f39660", + "white": "#e2e2e3", + "brightBlack": "#7f8490", + "brightRed": "#fc5d7c", + "brightGreen": "#9ed072", + "brightYellow": "#e7c664", + "brightBlue": "#76cce0", + "brightPurple": "#b39df3", + "brightCyan": "#f39660", + "brightWhite": "#e2e2e3", + "background": "#2c2e34", + "foreground": "#e2e2e3", + "cursorColor": "#e2e2e3", + "selectionBackground": "#414550" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Spacedust.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Spacedust.json new file mode 100644 index 0000000..e2eef80 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Spacedust.json @@ -0,0 +1,23 @@ +{ + "name": "Spacedust", + "black": "#6e5346", + "red": "#e35b00", + "green": "#5cab96", + "yellow": "#e3cd7b", + "blue": "#0f548b", + "purple": "#e35b00", + "cyan": "#06afc7", + "white": "#f0f1ce", + "brightBlack": "#684c31", + "brightRed": "#ff8a3a", + "brightGreen": "#aecab8", + "brightYellow": "#ffc878", + "brightBlue": "#67a0ce", + "brightPurple": "#ff8a3a", + "brightCyan": "#83a7b4", + "brightWhite": "#fefff1", + "background": "#0a1e24", + "foreground": "#ecf0c1", + "cursorColor": "#708284", + "selectionBackground": "#0a385c" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Spacegray Bright.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Spacegray Bright.json new file mode 100644 index 0000000..d4f9b95 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Spacegray Bright.json @@ -0,0 +1,23 @@ +{ + "name": "Spacegray Bright", + "black": "#080808", + "red": "#bc5553", + "green": "#a0b56c", + "yellow": "#f6c987", + "blue": "#7baec1", + "purple": "#b98aae", + "cyan": "#85c9b8", + "white": "#d8d8d8", + "brightBlack": "#626262", + "brightRed": "#bc5553", + "brightGreen": "#a0b56c", + "brightYellow": "#f6c987", + "brightBlue": "#7baec1", + "brightPurple": "#b98aae", + "brightCyan": "#85c9b8", + "brightWhite": "#f7f7f7", + "background": "#2a2e3a", + "foreground": "#f3f3f3", + "cursorColor": "#c6c6c6", + "selectionBackground": "#cacaca" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Spacegray Eighties Dull.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Spacegray Eighties Dull.json new file mode 100644 index 0000000..ebab515 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Spacegray Eighties Dull.json @@ -0,0 +1,23 @@ +{ + "name": "Spacegray Eighties Dull", + "black": "#15171c", + "red": "#b24a56", + "green": "#92b477", + "yellow": "#c6735a", + "blue": "#7c8fa5", + "purple": "#a5789e", + "cyan": "#80cdcb", + "white": "#b3b8c3", + "brightBlack": "#555555", + "brightRed": "#ec5f67", + "brightGreen": "#89e986", + "brightYellow": "#fec254", + "brightBlue": "#5486c0", + "brightPurple": "#bf83c1", + "brightCyan": "#58c2c1", + "brightWhite": "#ffffff", + "background": "#222222", + "foreground": "#c9c6bc", + "cursorColor": "#bbbbbb", + "selectionBackground": "#272e36" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Spacegray Eighties.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Spacegray Eighties.json new file mode 100644 index 0000000..ad26ab5 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Spacegray Eighties.json @@ -0,0 +1,23 @@ +{ + "name": "Spacegray Eighties", + "black": "#15171c", + "red": "#ec5f67", + "green": "#81a764", + "yellow": "#fec254", + "blue": "#5486c0", + "purple": "#bf83c1", + "cyan": "#57c2c1", + "white": "#efece7", + "brightBlack": "#555555", + "brightRed": "#ff6973", + "brightGreen": "#93d493", + "brightYellow": "#ffd256", + "brightBlue": "#4d84d1", + "brightPurple": "#ff55ff", + "brightCyan": "#83e9e4", + "brightWhite": "#ffffff", + "background": "#222222", + "foreground": "#bdbaae", + "cursorColor": "#bbbbbb", + "selectionBackground": "#272e35" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Spacegray.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Spacegray.json new file mode 100644 index 0000000..7f1729e --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Spacegray.json @@ -0,0 +1,23 @@ +{ + "name": "Spacegray", + "black": "#000000", + "red": "#b04b57", + "green": "#87b379", + "yellow": "#e5c179", + "blue": "#7d8fa4", + "purple": "#a47996", + "cyan": "#85a7a5", + "white": "#b3b8c3", + "brightBlack": "#4c4c4c", + "brightRed": "#b04b57", + "brightGreen": "#87b379", + "brightYellow": "#e5c179", + "brightBlue": "#7d8fa4", + "brightPurple": "#a47996", + "brightCyan": "#85a7a5", + "brightWhite": "#ffffff", + "background": "#20242d", + "foreground": "#b3b8c3", + "cursorColor": "#b3b8c3", + "selectionBackground": "#16181e" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Spiderman.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Spiderman.json new file mode 100644 index 0000000..a02bc4c --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Spiderman.json @@ -0,0 +1,23 @@ +{ + "name": "Spiderman", + "black": "#1b1d1e", + "red": "#e60813", + "green": "#e22928", + "yellow": "#e24756", + "blue": "#2c3fff", + "purple": "#2435db", + "cyan": "#3256ff", + "white": "#fffef6", + "brightBlack": "#505354", + "brightRed": "#ff0325", + "brightGreen": "#ff3338", + "brightYellow": "#fe3a35", + "brightBlue": "#1d50ff", + "brightPurple": "#747cff", + "brightCyan": "#6184ff", + "brightWhite": "#fffff9", + "background": "#1b1d1e", + "foreground": "#e3e3e3", + "cursorColor": "#2c3fff", + "selectionBackground": "#070e50" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Spring.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Spring.json new file mode 100644 index 0000000..7414953 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Spring.json @@ -0,0 +1,23 @@ +{ + "name": "Spring", + "black": "#000000", + "red": "#ff4d83", + "green": "#1f8c3b", + "yellow": "#1fc95b", + "blue": "#1dd3ee", + "purple": "#8959a8", + "cyan": "#3e999f", + "white": "#bfbfbf", + "brightBlack": "#000000", + "brightRed": "#ff0021", + "brightGreen": "#1fc231", + "brightYellow": "#d5b807", + "brightBlue": "#15a9fd", + "brightPurple": "#8959a8", + "brightCyan": "#3e999f", + "brightWhite": "#ffffff", + "background": "#ffffff", + "foreground": "#4d4d4c", + "cursorColor": "#4d4d4c", + "selectionBackground": "#d6d6d6" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Square.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Square.json new file mode 100644 index 0000000..9564066 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Square.json @@ -0,0 +1,23 @@ +{ + "name": "Square", + "black": "#050505", + "red": "#e9897c", + "green": "#b6377d", + "yellow": "#ecebbe", + "blue": "#a9cdeb", + "purple": "#75507b", + "cyan": "#c9caec", + "white": "#f2f2f2", + "brightBlack": "#474747", + "brightRed": "#f99286", + "brightGreen": "#c3f786", + "brightYellow": "#fcfbcc", + "brightBlue": "#b6defb", + "brightPurple": "#ad7fa8", + "brightCyan": "#d7d9fc", + "brightWhite": "#e2e2e2", + "background": "#1a1a1a", + "foreground": "#acacab", + "cursorColor": "#fcfbcc", + "selectionBackground": "#4d4d4d" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Squirrelsong Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Squirrelsong Dark.json new file mode 100644 index 0000000..a0a4770 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Squirrelsong Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Squirrelsong Dark", + "black": "#372920", + "red": "#ba4138", + "green": "#468336", + "yellow": "#d4b139", + "blue": "#4395c6", + "purple": "#855fb8", + "cyan": "#2f9794", + "white": "#d3b9a2", + "brightBlack": "#704f39", + "brightRed": "#df4d43", + "brightGreen": "#659a4c", + "brightYellow": "#e8c23f", + "brightBlue": "#4ca4db", + "brightPurple": "#9d70da", + "brightCyan": "#60aca9", + "brightWhite": "#f2d4bb", + "background": "#372920", + "foreground": "#b19b89", + "cursorColor": "#b19b89", + "selectionBackground": "#5b402e" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Srcery.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Srcery.json new file mode 100644 index 0000000..7438fde --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Srcery.json @@ -0,0 +1,23 @@ +{ + "name": "Srcery", + "black": "#1c1b19", + "red": "#ef2f27", + "green": "#519f50", + "yellow": "#fbb829", + "blue": "#2c78bf", + "purple": "#e02c6d", + "cyan": "#0aaeb3", + "white": "#baa67f", + "brightBlack": "#918175", + "brightRed": "#f75341", + "brightGreen": "#98bc37", + "brightYellow": "#fed06e", + "brightBlue": "#68a8e4", + "brightPurple": "#ff5c8f", + "brightCyan": "#2be4d0", + "brightWhite": "#fce8c3", + "background": "#1c1b19", + "foreground": "#fce8c3", + "cursorColor": "#fbb829", + "selectionBackground": "#fce8c3" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Starlight.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Starlight.json new file mode 100644 index 0000000..f83cc8b --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Starlight.json @@ -0,0 +1,23 @@ +{ + "name": "Starlight", + "black": "#242424", + "red": "#f62b5a", + "green": "#47b413", + "yellow": "#e3c401", + "blue": "#24acd4", + "purple": "#f2affd", + "cyan": "#13c299", + "white": "#e6e6e6", + "brightBlack": "#616161", + "brightRed": "#ff4d51", + "brightGreen": "#35d450", + "brightYellow": "#e9e836", + "brightBlue": "#5dc5f8", + "brightPurple": "#feabf2", + "brightCyan": "#24dfc4", + "brightWhite": "#ffffff", + "background": "#242424", + "foreground": "#ffffff", + "cursorColor": "#ffffff", + "selectionBackground": "#ffffff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Sublette.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Sublette.json new file mode 100644 index 0000000..29916f0 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Sublette.json @@ -0,0 +1,23 @@ +{ + "name": "Sublette", + "black": "#253045", + "red": "#ee5577", + "green": "#55ee77", + "yellow": "#ffdd88", + "blue": "#5588ff", + "purple": "#ff77cc", + "cyan": "#44eeee", + "white": "#f5f5da", + "brightBlack": "#405570", + "brightRed": "#ee6655", + "brightGreen": "#99ee77", + "brightYellow": "#ffff77", + "brightBlue": "#77bbff", + "brightPurple": "#aa88ff", + "brightCyan": "#55ffbb", + "brightWhite": "#ffffee", + "background": "#202535", + "foreground": "#ccced0", + "cursorColor": "#ccced0", + "selectionBackground": "#ccced0" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Subliminal.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Subliminal.json new file mode 100644 index 0000000..0e636e5 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Subliminal.json @@ -0,0 +1,23 @@ +{ + "name": "Subliminal", + "black": "#7f7f7f", + "red": "#e15a60", + "green": "#a9cfa4", + "yellow": "#ffe2a9", + "blue": "#6699cc", + "purple": "#f1a5ab", + "cyan": "#5fb3b3", + "white": "#d4d4d4", + "brightBlack": "#7f7f7f", + "brightRed": "#e15a60", + "brightGreen": "#a9cfa4", + "brightYellow": "#ffe2a9", + "brightBlue": "#6699cc", + "brightPurple": "#f1a5ab", + "brightCyan": "#5fb3b3", + "brightWhite": "#d4d4d4", + "background": "#282c35", + "foreground": "#d4d4d4", + "cursorColor": "#c7c7c7", + "selectionBackground": "#484e5b" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Sugarplum.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Sugarplum.json new file mode 100644 index 0000000..040b56c --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Sugarplum.json @@ -0,0 +1,23 @@ +{ + "name": "Sugarplum", + "black": "#111147", + "red": "#5ca8dc", + "green": "#53b397", + "yellow": "#249a84", + "blue": "#db7ddd", + "purple": "#d0beee", + "cyan": "#f9f3f9", + "white": "#a175d4", + "brightBlack": "#44447a", + "brightRed": "#5cb5dc", + "brightGreen": "#52deb5", + "brightYellow": "#01f5c7", + "brightBlue": "#fa5dfd", + "brightPurple": "#c6a5fd", + "brightCyan": "#ffffff", + "brightWhite": "#b577fd", + "background": "#111147", + "foreground": "#db7ddd", + "cursorColor": "#53b397", + "selectionBackground": "#5ca8dc" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Sundried.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Sundried.json new file mode 100644 index 0000000..40651f3 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Sundried.json @@ -0,0 +1,23 @@ +{ + "name": "Sundried", + "black": "#302b2a", + "red": "#a7463d", + "green": "#587744", + "yellow": "#9d602a", + "blue": "#485b98", + "purple": "#864651", + "cyan": "#9c814f", + "white": "#c9c9c9", + "brightBlack": "#4d4e48", + "brightRed": "#aa000c", + "brightGreen": "#128c21", + "brightYellow": "#fc6a21", + "brightBlue": "#7999f7", + "brightPurple": "#fd8aa1", + "brightCyan": "#fad484", + "brightWhite": "#ffffff", + "background": "#1a1818", + "foreground": "#c9c9c9", + "cursorColor": "#ffffff", + "selectionBackground": "#302b2a" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Symfonic.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Symfonic.json new file mode 100644 index 0000000..80f09b9 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Symfonic.json @@ -0,0 +1,23 @@ +{ + "name": "Symfonic", + "black": "#000000", + "red": "#dc322f", + "green": "#56db3a", + "yellow": "#ff8400", + "blue": "#0084d4", + "purple": "#b729d9", + "cyan": "#ccccff", + "white": "#ffffff", + "brightBlack": "#414347", + "brightRed": "#dc322f", + "brightGreen": "#56db3a", + "brightYellow": "#ff8400", + "brightBlue": "#0084d4", + "brightPurple": "#b729d9", + "brightCyan": "#ccccff", + "brightWhite": "#ffffff", + "background": "#000000", + "foreground": "#ffffff", + "cursorColor": "#dc322f", + "selectionBackground": "#073642" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Synthwave Alpha.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Synthwave Alpha.json new file mode 100644 index 0000000..a077c1f --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Synthwave Alpha.json @@ -0,0 +1,23 @@ +{ + "name": "Synthwave Alpha", + "black": "#241b30", + "red": "#e60a70", + "green": "#00986c", + "yellow": "#adad3e", + "blue": "#6e29ad", + "purple": "#b300ad", + "cyan": "#00b0b1", + "white": "#b9b1bc", + "brightBlack": "#7f7094", + "brightRed": "#e60a70", + "brightGreen": "#0ae4a4", + "brightYellow": "#f9f972", + "brightBlue": "#aa54f9", + "brightPurple": "#ff00f6", + "brightCyan": "#00fbfd", + "brightWhite": "#f2f2e3", + "background": "#241b30", + "foreground": "#f2f2e3", + "cursorColor": "#f2f2e3", + "selectionBackground": "#6e29ad" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Synthwave Everything.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Synthwave Everything.json new file mode 100644 index 0000000..27d716d --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Synthwave Everything.json @@ -0,0 +1,23 @@ +{ + "name": "Synthwave Everything", + "black": "#fefefe", + "red": "#f97e72", + "green": "#72f1b8", + "yellow": "#fede5d", + "blue": "#6d77b3", + "purple": "#c792ea", + "cyan": "#f772e0", + "white": "#fefefe", + "brightBlack": "#fefefe", + "brightRed": "#f88414", + "brightGreen": "#72f1b8", + "brightYellow": "#fff951", + "brightBlue": "#36f9f6", + "brightPurple": "#e1acff", + "brightCyan": "#f92aad", + "brightWhite": "#fefefe", + "background": "#2a2139", + "foreground": "#f0eff1", + "cursorColor": "#72f1b8", + "selectionBackground": "#181521" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Synthwave.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Synthwave.json new file mode 100644 index 0000000..8c31955 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Synthwave.json @@ -0,0 +1,23 @@ +{ + "name": "Synthwave", + "black": "#000000", + "red": "#f6188f", + "green": "#1ebb2b", + "yellow": "#fdf834", + "blue": "#2186ec", + "purple": "#f85a21", + "cyan": "#12c3e2", + "white": "#ffffff", + "brightBlack": "#7f7094", + "brightRed": "#f841a0", + "brightGreen": "#25c141", + "brightYellow": "#fdf454", + "brightBlue": "#2f9ded", + "brightPurple": "#f97137", + "brightCyan": "#19cde6", + "brightWhite": "#ffffff", + "background": "#000000", + "foreground": "#dad9c7", + "cursorColor": "#19cde6", + "selectionBackground": "#19cde6" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tango Adapted.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tango Adapted.json new file mode 100644 index 0000000..7d51a9b --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tango Adapted.json @@ -0,0 +1,23 @@ +{ + "name": "Tango Adapted", + "black": "#000000", + "red": "#ff0000", + "green": "#59d600", + "yellow": "#e3be00", + "blue": "#00a2ff", + "purple": "#c17ecc", + "cyan": "#00d0d6", + "white": "#c0c5bb", + "brightBlack": "#8f928b", + "brightRed": "#ff0013", + "brightGreen": "#6dd900", + "brightYellow": "#ccbe00", + "brightBlue": "#88c9ff", + "brightPurple": "#e9a7e1", + "brightCyan": "#00d8d9", + "brightWhite": "#f6f6f4", + "background": "#ffffff", + "foreground": "#000000", + "cursorColor": "#000000", + "selectionBackground": "#c1deff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tango Half Adapted.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tango Half Adapted.json new file mode 100644 index 0000000..ace9523 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tango Half Adapted.json @@ -0,0 +1,23 @@ +{ + "name": "Tango Half Adapted", + "black": "#000000", + "red": "#ff0000", + "green": "#4cc300", + "yellow": "#e2c000", + "blue": "#008ef6", + "purple": "#a96cb3", + "cyan": "#00bdc3", + "white": "#babfb5", + "brightBlack": "#797d76", + "brightRed": "#ff0013", + "brightGreen": "#70dc00", + "brightYellow": "#d9c600", + "brightBlue": "#76bfff", + "brightPurple": "#d898d1", + "brightCyan": "#00d0d4", + "brightWhite": "#f4f4f2", + "background": "#ffffff", + "foreground": "#000000", + "cursorColor": "#000000", + "selectionBackground": "#c1deff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tearout.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tearout.json new file mode 100644 index 0000000..bc6d4a2 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tearout.json @@ -0,0 +1,23 @@ +{ + "name": "Tearout", + "black": "#685742", + "red": "#cc967b", + "green": "#97976d", + "yellow": "#6c9861", + "blue": "#b5955e", + "purple": "#c9a554", + "cyan": "#d7c483", + "white": "#b5955e", + "brightBlack": "#75644f", + "brightRed": "#cc967b", + "brightGreen": "#97976d", + "brightYellow": "#6c9861", + "brightBlue": "#b5955e", + "brightPurple": "#c9a554", + "brightCyan": "#d7c483", + "brightWhite": "#b5955e", + "background": "#34392d", + "foreground": "#f4d2ae", + "cursorColor": "#d7c483", + "selectionBackground": "#e4c47a" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Teerb.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Teerb.json new file mode 100644 index 0000000..6cd3ca2 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Teerb.json @@ -0,0 +1,23 @@ +{ + "name": "Teerb", + "black": "#1c1c1c", + "red": "#d68686", + "green": "#aed686", + "yellow": "#d7af87", + "blue": "#86aed6", + "purple": "#d6aed6", + "cyan": "#8adbb4", + "white": "#d0d0d0", + "brightBlack": "#4f4f4f", + "brightRed": "#d68686", + "brightGreen": "#aed686", + "brightYellow": "#e4c9af", + "brightBlue": "#86aed6", + "brightPurple": "#d6aed6", + "brightCyan": "#b1e7dd", + "brightWhite": "#efefef", + "background": "#262626", + "foreground": "#d0d0d0", + "cursorColor": "#e4c9af", + "selectionBackground": "#4d4d4d" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Terafox.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Terafox.json new file mode 100644 index 0000000..8707249 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Terafox.json @@ -0,0 +1,23 @@ +{ + "name": "Terafox", + "black": "#2f3239", + "red": "#e85c51", + "green": "#7aa4a1", + "yellow": "#fda47f", + "blue": "#5a93aa", + "purple": "#ad5c7c", + "cyan": "#a1cdd8", + "white": "#ebebeb", + "brightBlack": "#4e5157", + "brightRed": "#eb746b", + "brightGreen": "#8eb2af", + "brightYellow": "#fdb292", + "brightBlue": "#73a3b7", + "brightPurple": "#b97490", + "brightCyan": "#afd4de", + "brightWhite": "#eeeeee", + "background": "#152528", + "foreground": "#e6eaea", + "cursorColor": "#e6eaea", + "selectionBackground": "#293e40" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Terminal Basic Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Terminal Basic Dark.json new file mode 100644 index 0000000..c578629 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Terminal Basic Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Terminal Basic Dark", + "black": "#000000", + "red": "#c65339", + "green": "#6ac44b", + "yellow": "#b8b74a", + "blue": "#6444ed", + "purple": "#d357db", + "cyan": "#69c1cf", + "white": "#d1d1d1", + "brightBlack": "#909090", + "brightRed": "#eb5a3a", + "brightGreen": "#77ea51", + "brightYellow": "#efef53", + "brightBlue": "#d09af9", + "brightPurple": "#eb5af7", + "brightCyan": "#78f1f2", + "brightWhite": "#ededed", + "background": "#1d1e1d", + "foreground": "#ffffff", + "cursorColor": "#9d9d9d", + "selectionBackground": "#3f638a" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Terminal Basic.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Terminal Basic.json new file mode 100644 index 0000000..18a72e3 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Terminal Basic.json @@ -0,0 +1,23 @@ +{ + "name": "Terminal Basic", + "black": "#000000", + "red": "#990000", + "green": "#00a600", + "yellow": "#999900", + "blue": "#0000b2", + "purple": "#b200b2", + "cyan": "#00a6b2", + "white": "#bfbfbf", + "brightBlack": "#666666", + "brightRed": "#e50000", + "brightGreen": "#00d900", + "brightYellow": "#bfbf00", + "brightBlue": "#0000ff", + "brightPurple": "#e500e5", + "brightCyan": "#00d8d8", + "brightWhite": "#e5e5e5", + "background": "#ffffff", + "foreground": "#000000", + "cursorColor": "#7f7f7f", + "selectionBackground": "#a4c9ff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Thayer Bright.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Thayer Bright.json new file mode 100644 index 0000000..33e7c7f --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Thayer Bright.json @@ -0,0 +1,23 @@ +{ + "name": "Thayer Bright", + "black": "#1b1d1e", + "red": "#f92672", + "green": "#4df840", + "yellow": "#f4fd22", + "blue": "#2757d6", + "purple": "#8c54fe", + "cyan": "#38c8b5", + "white": "#ccccc6", + "brightBlack": "#505354", + "brightRed": "#ff5995", + "brightGreen": "#b6e354", + "brightYellow": "#feed6c", + "brightBlue": "#3f78ff", + "brightPurple": "#9e6ffe", + "brightCyan": "#23cfd5", + "brightWhite": "#f8f8f2", + "background": "#1b1d1e", + "foreground": "#f8f8f8", + "cursorColor": "#fc971f", + "selectionBackground": "#4d4d4d" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/The Hulk.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/The Hulk.json new file mode 100644 index 0000000..3767449 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/The Hulk.json @@ -0,0 +1,23 @@ +{ + "name": "The Hulk", + "black": "#1b1d1e", + "red": "#269d1b", + "green": "#13ce30", + "yellow": "#63e457", + "blue": "#2525f5", + "purple": "#712c81", + "cyan": "#378ca9", + "white": "#d9d8d1", + "brightBlack": "#505354", + "brightRed": "#8dff2a", + "brightGreen": "#48ff77", + "brightYellow": "#3afe16", + "brightBlue": "#506b95", + "brightPurple": "#72589d", + "brightCyan": "#4085a6", + "brightWhite": "#e5e6e1", + "background": "#1b1d1e", + "foreground": "#b5b5b5", + "cursorColor": "#16b61b", + "selectionBackground": "#4d504c" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tinacious Design Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tinacious Design Dark.json new file mode 100644 index 0000000..482c8c9 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tinacious Design Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Tinacious Design Dark", + "black": "#1d1d26", + "red": "#ff3399", + "green": "#00d364", + "yellow": "#ffcc66", + "blue": "#00cbff", + "purple": "#cc66ff", + "cyan": "#00ceca", + "white": "#cbcbf0", + "brightBlack": "#636667", + "brightRed": "#ff2f92", + "brightGreen": "#00d364", + "brightYellow": "#ffd479", + "brightBlue": "#00cbff", + "brightPurple": "#d783ff", + "brightCyan": "#00d5d4", + "brightWhite": "#d5d6f3", + "background": "#1d1d26", + "foreground": "#cbcbf0", + "cursorColor": "#cbcbf0", + "selectionBackground": "#ff3399" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tinacious Design Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tinacious Design Light.json new file mode 100644 index 0000000..573dac0 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tinacious Design Light.json @@ -0,0 +1,23 @@ +{ + "name": "Tinacious Design Light", + "black": "#1d1d26", + "red": "#ff3399", + "green": "#00d364", + "yellow": "#e5b24d", + "blue": "#00cbff", + "purple": "#cc66ff", + "cyan": "#00ceca", + "white": "#b1b1d6", + "brightBlack": "#636667", + "brightRed": "#ff2f92", + "brightGreen": "#00d364", + "brightYellow": "#d9ae53", + "brightBlue": "#00cbff", + "brightPurple": "#d783ff", + "brightCyan": "#00c8c7", + "brightWhite": "#d5d6f3", + "background": "#f8f8ff", + "foreground": "#1d1d26", + "cursorColor": "#b1b1d6", + "selectionBackground": "#ff3399" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/TokyoNight Day.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/TokyoNight Day.json new file mode 100644 index 0000000..3a5406d --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/TokyoNight Day.json @@ -0,0 +1,23 @@ +{ + "name": "TokyoNight Day", + "black": "#e9e9ed", + "red": "#f52a65", + "green": "#587539", + "yellow": "#8c6c3e", + "blue": "#2e7de9", + "purple": "#9854f1", + "cyan": "#007197", + "white": "#6172b0", + "brightBlack": "#a1a6c5", + "brightRed": "#f52a65", + "brightGreen": "#587539", + "brightYellow": "#8c6c3e", + "brightBlue": "#2e7de9", + "brightPurple": "#9854f1", + "brightCyan": "#007197", + "brightWhite": "#3760bf", + "background": "#e1e2e7", + "foreground": "#3760bf", + "cursorColor": "#3760bf", + "selectionBackground": "#99a7df" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/TokyoNight Moon.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/TokyoNight Moon.json new file mode 100644 index 0000000..8efaaf5 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/TokyoNight Moon.json @@ -0,0 +1,23 @@ +{ + "name": "TokyoNight Moon", + "black": "#1b1d2b", + "red": "#ff757f", + "green": "#c3e88d", + "yellow": "#ffc777", + "blue": "#82aaff", + "purple": "#c099ff", + "cyan": "#86e1fc", + "white": "#828bb8", + "brightBlack": "#444a73", + "brightRed": "#ff757f", + "brightGreen": "#c3e88d", + "brightYellow": "#ffc777", + "brightBlue": "#82aaff", + "brightPurple": "#c099ff", + "brightCyan": "#86e1fc", + "brightWhite": "#c8d3f5", + "background": "#222436", + "foreground": "#c8d3f5", + "cursorColor": "#c8d3f5", + "selectionBackground": "#2d3f76" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/TokyoNight Night.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/TokyoNight Night.json new file mode 100644 index 0000000..9a8350e --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/TokyoNight Night.json @@ -0,0 +1,23 @@ +{ + "name": "TokyoNight Night", + "black": "#15161e", + "red": "#f7768e", + "green": "#9ece6a", + "yellow": "#e0af68", + "blue": "#7aa2f7", + "purple": "#bb9af7", + "cyan": "#7dcfff", + "white": "#a9b1d6", + "brightBlack": "#414868", + "brightRed": "#f7768e", + "brightGreen": "#9ece6a", + "brightYellow": "#e0af68", + "brightBlue": "#7aa2f7", + "brightPurple": "#bb9af7", + "brightCyan": "#7dcfff", + "brightWhite": "#c0caf5", + "background": "#1a1b26", + "foreground": "#c0caf5", + "cursorColor": "#c0caf5", + "selectionBackground": "#283457" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/TokyoNight Storm.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/TokyoNight Storm.json new file mode 100644 index 0000000..748cd41 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/TokyoNight Storm.json @@ -0,0 +1,23 @@ +{ + "name": "TokyoNight Storm", + "black": "#1d202f", + "red": "#f7768e", + "green": "#9ece6a", + "yellow": "#e0af68", + "blue": "#7aa2f7", + "purple": "#bb9af7", + "cyan": "#7dcfff", + "white": "#a9b1d6", + "brightBlack": "#4e5575", + "brightRed": "#f7768e", + "brightGreen": "#9ece6a", + "brightYellow": "#e0af68", + "brightBlue": "#7aa2f7", + "brightPurple": "#bb9af7", + "brightCyan": "#7dcfff", + "brightWhite": "#c0caf5", + "background": "#24283b", + "foreground": "#c0caf5", + "cursorColor": "#c0caf5", + "selectionBackground": "#364a82" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/TokyoNight.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/TokyoNight.json new file mode 100644 index 0000000..5a18440 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/TokyoNight.json @@ -0,0 +1,23 @@ +{ + "name": "TokyoNight", + "black": "#15161e", + "red": "#f7768e", + "green": "#9ece6a", + "yellow": "#e0af68", + "blue": "#7aa2f7", + "purple": "#bb9af7", + "cyan": "#7dcfff", + "white": "#a9b1d6", + "brightBlack": "#414868", + "brightRed": "#f7768e", + "brightGreen": "#9ece6a", + "brightYellow": "#e0af68", + "brightBlue": "#7aa2f7", + "brightPurple": "#bb9af7", + "brightCyan": "#7dcfff", + "brightWhite": "#c0caf5", + "background": "#1a1b26", + "foreground": "#c0caf5", + "cursorColor": "#c0caf5", + "selectionBackground": "#33467c" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tomorrow Night Blue.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tomorrow Night Blue.json new file mode 100644 index 0000000..59bfc83 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tomorrow Night Blue.json @@ -0,0 +1,23 @@ +{ + "name": "Tomorrow Night Blue", + "black": "#000000", + "red": "#ff9da4", + "green": "#d1f1a9", + "yellow": "#ffeead", + "blue": "#bbdaff", + "purple": "#ebbbff", + "cyan": "#99ffff", + "white": "#ffffff", + "brightBlack": "#4c4c4c", + "brightRed": "#ff9da4", + "brightGreen": "#d1f1a9", + "brightYellow": "#ffeead", + "brightBlue": "#bbdaff", + "brightPurple": "#ebbbff", + "brightCyan": "#99ffff", + "brightWhite": "#ffffff", + "background": "#002451", + "foreground": "#ffffff", + "cursorColor": "#ffffff", + "selectionBackground": "#003f8e" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tomorrow Night Bright.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tomorrow Night Bright.json new file mode 100644 index 0000000..1f2cc7f --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tomorrow Night Bright.json @@ -0,0 +1,23 @@ +{ + "name": "Tomorrow Night Bright", + "black": "#000000", + "red": "#d54e53", + "green": "#b9ca4a", + "yellow": "#e7c547", + "blue": "#7aa6da", + "purple": "#c397d8", + "cyan": "#70c0b1", + "white": "#ffffff", + "brightBlack": "#404040", + "brightRed": "#d54e53", + "brightGreen": "#b9ca4a", + "brightYellow": "#e7c547", + "brightBlue": "#7aa6da", + "brightPurple": "#c397d8", + "brightCyan": "#70c0b1", + "brightWhite": "#ffffff", + "background": "#000000", + "foreground": "#eaeaea", + "cursorColor": "#eaeaea", + "selectionBackground": "#424242" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tomorrow Night Burns.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tomorrow Night Burns.json new file mode 100644 index 0000000..be55021 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tomorrow Night Burns.json @@ -0,0 +1,23 @@ +{ + "name": "Tomorrow Night Burns", + "black": "#252525", + "red": "#832e31", + "green": "#a63c40", + "yellow": "#d3494e", + "blue": "#fc595f", + "purple": "#df9395", + "cyan": "#ba8586", + "white": "#f5f5f5", + "brightBlack": "#5d6f71", + "brightRed": "#832e31", + "brightGreen": "#a63c40", + "brightYellow": "#d2494e", + "brightBlue": "#fc595f", + "brightPurple": "#df9395", + "brightCyan": "#ba8586", + "brightWhite": "#f5f5f5", + "background": "#151515", + "foreground": "#a1b0b8", + "cursorColor": "#ff443e", + "selectionBackground": "#b0bec5" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tomorrow Night Eighties.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tomorrow Night Eighties.json new file mode 100644 index 0000000..c4ecc61 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tomorrow Night Eighties.json @@ -0,0 +1,23 @@ +{ + "name": "Tomorrow Night Eighties", + "black": "#000000", + "red": "#f2777a", + "green": "#99cc99", + "yellow": "#ffcc66", + "blue": "#6699cc", + "purple": "#cc99cc", + "cyan": "#66cccc", + "white": "#ffffff", + "brightBlack": "#595959", + "brightRed": "#f2777a", + "brightGreen": "#99cc99", + "brightYellow": "#ffcc66", + "brightBlue": "#6699cc", + "brightPurple": "#cc99cc", + "brightCyan": "#66cccc", + "brightWhite": "#ffffff", + "background": "#2d2d2d", + "foreground": "#cccccc", + "cursorColor": "#cccccc", + "selectionBackground": "#515151" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tomorrow Night.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tomorrow Night.json new file mode 100644 index 0000000..2144f52 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tomorrow Night.json @@ -0,0 +1,23 @@ +{ + "name": "Tomorrow Night", + "black": "#000000", + "red": "#cc6666", + "green": "#b5bd68", + "yellow": "#f0c674", + "blue": "#81a2be", + "purple": "#b294bb", + "cyan": "#8abeb7", + "white": "#ffffff", + "brightBlack": "#4c4c4c", + "brightRed": "#cc6666", + "brightGreen": "#b5bd68", + "brightYellow": "#f0c674", + "brightBlue": "#81a2be", + "brightPurple": "#b294bb", + "brightCyan": "#8abeb7", + "brightWhite": "#ffffff", + "background": "#1d1f21", + "foreground": "#c5c8c6", + "cursorColor": "#c5c8c6", + "selectionBackground": "#373b41" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tomorrow.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tomorrow.json new file mode 100644 index 0000000..69a2682 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Tomorrow.json @@ -0,0 +1,23 @@ +{ + "name": "Tomorrow", + "black": "#000000", + "red": "#c82829", + "green": "#718c00", + "yellow": "#eab700", + "blue": "#4271ae", + "purple": "#8959a8", + "cyan": "#3e999f", + "white": "#bfbfbf", + "brightBlack": "#000000", + "brightRed": "#c82829", + "brightGreen": "#718c00", + "brightYellow": "#eab700", + "brightBlue": "#4271ae", + "brightPurple": "#8959a8", + "brightCyan": "#3e999f", + "brightWhite": "#ffffff", + "background": "#ffffff", + "foreground": "#4d4d4c", + "cursorColor": "#4d4d4c", + "selectionBackground": "#d6d6d6" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Toy Chest.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Toy Chest.json new file mode 100644 index 0000000..d521afa --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Toy Chest.json @@ -0,0 +1,23 @@ +{ + "name": "Toy Chest", + "black": "#2c3f58", + "red": "#be2d26", + "green": "#1a9172", + "yellow": "#db8e27", + "blue": "#325d96", + "purple": "#8a5edc", + "cyan": "#35a08f", + "white": "#23d183", + "brightBlack": "#336889", + "brightRed": "#dd5944", + "brightGreen": "#31d07b", + "brightYellow": "#e7d84b", + "brightBlue": "#34a6da", + "brightPurple": "#ae6bdc", + "brightCyan": "#42c3ae", + "brightWhite": "#d5d5d5", + "background": "#24364b", + "foreground": "#31d07b", + "cursorColor": "#d5d5d5", + "selectionBackground": "#5f217a" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Treehouse.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Treehouse.json new file mode 100644 index 0000000..6c1bf3f --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Treehouse.json @@ -0,0 +1,23 @@ +{ + "name": "Treehouse", + "black": "#321300", + "red": "#b2270e", + "green": "#44a900", + "yellow": "#aa820c", + "blue": "#58859a", + "purple": "#97363d", + "cyan": "#b25a1e", + "white": "#786b53", + "brightBlack": "#504333", + "brightRed": "#ed5d20", + "brightGreen": "#55f238", + "brightYellow": "#f2b732", + "brightBlue": "#85cfed", + "brightPurple": "#e14c5a", + "brightCyan": "#f07d14", + "brightWhite": "#ffc800", + "background": "#191919", + "foreground": "#786b53", + "cursorColor": "#fac814", + "selectionBackground": "#786b53" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Twilight.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Twilight.json new file mode 100644 index 0000000..699ff68 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Twilight.json @@ -0,0 +1,23 @@ +{ + "name": "Twilight", + "black": "#141414", + "red": "#c06d44", + "green": "#afb97a", + "yellow": "#c2a86c", + "blue": "#44474a", + "purple": "#b4be7c", + "cyan": "#778385", + "white": "#ffffd4", + "brightBlack": "#404040", + "brightRed": "#de7c4c", + "brightGreen": "#ccd88c", + "brightYellow": "#e2c47e", + "brightBlue": "#5a5e62", + "brightPurple": "#d0dc8e", + "brightCyan": "#8a989b", + "brightWhite": "#ffffd4", + "background": "#141414", + "foreground": "#ffffd4", + "cursorColor": "#ffffff", + "selectionBackground": "#313131" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ubuntu.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ubuntu.json new file mode 100644 index 0000000..9da6ae4 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ubuntu.json @@ -0,0 +1,23 @@ +{ + "name": "Ubuntu", + "black": "#2e3436", + "red": "#cc0000", + "green": "#4e9a06", + "yellow": "#c4a000", + "blue": "#3465a4", + "purple": "#75507b", + "cyan": "#06989a", + "white": "#d3d7cf", + "brightBlack": "#555753", + "brightRed": "#ef2929", + "brightGreen": "#8ae234", + "brightYellow": "#fce94f", + "brightBlue": "#729fcf", + "brightPurple": "#ad7fa8", + "brightCyan": "#34e2e2", + "brightWhite": "#eeeeec", + "background": "#300a24", + "foreground": "#eeeeec", + "cursorColor": "#bbbbbb", + "selectionBackground": "#b5d5ff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ultra Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ultra Dark.json new file mode 100644 index 0000000..b9cb1ba --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ultra Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Ultra Dark", + "black": "#000000", + "red": "#f07178", + "green": "#c3e88d", + "yellow": "#ffcb6b", + "blue": "#82aaff", + "purple": "#c792ea", + "cyan": "#89ddff", + "white": "#cccccc", + "brightBlack": "#404040", + "brightRed": "#f6a9ae", + "brightGreen": "#dbf1ba", + "brightYellow": "#ffdfa6", + "brightBlue": "#b4ccff", + "brightPurple": "#ddbdf2", + "brightCyan": "#b8eaff", + "brightWhite": "#ffffff", + "background": "#000000", + "foreground": "#ffffff", + "cursorColor": "#fefefe", + "selectionBackground": "#222222" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ultra Violent.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ultra Violent.json new file mode 100644 index 0000000..7fa8db2 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Ultra Violent.json @@ -0,0 +1,23 @@ +{ + "name": "Ultra Violent", + "black": "#242728", + "red": "#ff0090", + "green": "#b6ff00", + "yellow": "#fff727", + "blue": "#47e0fb", + "purple": "#d731ff", + "cyan": "#0effbb", + "white": "#e1e1e1", + "brightBlack": "#636667", + "brightRed": "#fb58b4", + "brightGreen": "#deff8c", + "brightYellow": "#ebe087", + "brightBlue": "#7fecff", + "brightPurple": "#e681ff", + "brightCyan": "#69fcd3", + "brightWhite": "#f9f9f5", + "background": "#242728", + "foreground": "#c1c1c1", + "cursorColor": "#c1c1c1", + "selectionBackground": "#574c49" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Under The Sea.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Under The Sea.json new file mode 100644 index 0000000..fccaab0 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Under The Sea.json @@ -0,0 +1,23 @@ +{ + "name": "Under The Sea", + "black": "#022026", + "red": "#b2302d", + "green": "#00a941", + "yellow": "#59819c", + "blue": "#459a86", + "purple": "#00599d", + "cyan": "#5d7e19", + "white": "#405555", + "brightBlack": "#384451", + "brightRed": "#ff4242", + "brightGreen": "#2aea5e", + "brightYellow": "#8ed4fd", + "brightBlue": "#61d5ba", + "brightPurple": "#1298ff", + "brightCyan": "#98d028", + "brightWhite": "#58fbd6", + "background": "#011116", + "foreground": "#ffffff", + "cursorColor": "#4afcd6", + "selectionBackground": "#415555" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Unikitty.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Unikitty.json new file mode 100644 index 0000000..54e9f88 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Unikitty.json @@ -0,0 +1,23 @@ +{ + "name": "Unikitty", + "black": "#0c0c0c", + "red": "#a80f20", + "green": "#c7ff98", + "yellow": "#fff964", + "blue": "#145fcd", + "purple": "#ffe9ff", + "cyan": "#9effef", + "white": "#fcf1fb", + "brightBlack": "#434343", + "brightRed": "#d91329", + "brightGreen": "#d3ffaf", + "brightYellow": "#ffef50", + "brightBlue": "#0075ea", + "brightPurple": "#ffefff", + "brightCyan": "#93ffef", + "brightWhite": "#fff3fe", + "background": "#ff8cd9", + "foreground": "#0b0b0b", + "cursorColor": "#c7ff98", + "selectionBackground": "#3ea9fe" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Urple.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Urple.json new file mode 100644 index 0000000..56c6a0f --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Urple.json @@ -0,0 +1,23 @@ +{ + "name": "Urple", + "black": "#000000", + "red": "#b0425b", + "green": "#37a415", + "yellow": "#ad5c42", + "blue": "#564d9b", + "purple": "#6c3ca1", + "cyan": "#808080", + "white": "#87799c", + "brightBlack": "#6a3f32", + "brightRed": "#ff6388", + "brightGreen": "#29e620", + "brightYellow": "#f08161", + "brightBlue": "#867aed", + "brightPurple": "#a05eee", + "brightCyan": "#eaeaea", + "brightWhite": "#bfa3ff", + "background": "#1b1b23", + "foreground": "#877a9b", + "cursorColor": "#a063eb", + "selectionBackground": "#a063eb" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Vague.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Vague.json new file mode 100644 index 0000000..2c86a84 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Vague.json @@ -0,0 +1,23 @@ +{ + "name": "Vague", + "black": "#252530", + "red": "#d8647e", + "green": "#7fa563", + "yellow": "#f3be7c", + "blue": "#6e94b2", + "purple": "#bb9dbd", + "cyan": "#aeaed1", + "white": "#cdcdcd", + "brightBlack": "#606079", + "brightRed": "#e08398", + "brightGreen": "#99b782", + "brightYellow": "#f5cb96", + "brightBlue": "#8ba9c1", + "brightPurple": "#c9b1ca", + "brightCyan": "#bebeda", + "brightWhite": "#d7d7d7", + "background": "#141415", + "foreground": "#cdcdcd", + "cursorColor": "#cdcdcd", + "selectionBackground": "#252530" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Vaughn.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Vaughn.json new file mode 100644 index 0000000..5085bfb --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Vaughn.json @@ -0,0 +1,23 @@ +{ + "name": "Vaughn", + "black": "#25234f", + "red": "#705050", + "green": "#60b48a", + "yellow": "#dfaf8f", + "blue": "#5555ff", + "purple": "#f08cc3", + "cyan": "#8cd0d3", + "white": "#709080", + "brightBlack": "#709080", + "brightRed": "#dca3a3", + "brightGreen": "#60b48a", + "brightYellow": "#f0dfaf", + "brightBlue": "#5555ff", + "brightPurple": "#ec93d3", + "brightCyan": "#93e0e3", + "brightWhite": "#ffffff", + "background": "#25234f", + "foreground": "#dcdccc", + "cursorColor": "#ff5555", + "selectionBackground": "#b5d5ff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Vercel.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Vercel.json new file mode 100644 index 0000000..f82b511 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Vercel.json @@ -0,0 +1,23 @@ +{ + "name": "Vercel", + "black": "#000000", + "red": "#fc0036", + "green": "#29a948", + "yellow": "#ffae00", + "blue": "#006aff", + "purple": "#f32882", + "cyan": "#00ac96", + "white": "#feffff", + "brightBlack": "#a8a8a8", + "brightRed": "#ff8080", + "brightGreen": "#4be15d", + "brightYellow": "#ffae00", + "brightBlue": "#49aeff", + "brightPurple": "#f97ea8", + "brightCyan": "#00e4c4", + "brightWhite": "#fefefe", + "background": "#101010", + "foreground": "#fafafa", + "cursorColor": "#f32882", + "selectionBackground": "#005be7" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Vesper.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Vesper.json new file mode 100644 index 0000000..4641891 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Vesper.json @@ -0,0 +1,23 @@ +{ + "name": "Vesper", + "black": "#101010", + "red": "#f5a191", + "green": "#90b99f", + "yellow": "#e6b99d", + "blue": "#aca1cf", + "purple": "#e29eca", + "cyan": "#ea83a5", + "white": "#a0a0a0", + "brightBlack": "#7e7e7e", + "brightRed": "#ff8080", + "brightGreen": "#99ffe4", + "brightYellow": "#ffc799", + "brightBlue": "#b9aeda", + "brightPurple": "#ecaad6", + "brightCyan": "#f591b2", + "brightWhite": "#ffffff", + "background": "#101010", + "foreground": "#ffffff", + "cursorColor": "#acb1ab", + "selectionBackground": "#988049" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Vibrant Ink.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Vibrant Ink.json new file mode 100644 index 0000000..8c23ac5 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Vibrant Ink.json @@ -0,0 +1,23 @@ +{ + "name": "Vibrant Ink", + "black": "#878787", + "red": "#ff6600", + "green": "#ccff04", + "yellow": "#ffcc00", + "blue": "#44b4cc", + "purple": "#9933cc", + "cyan": "#44b4cc", + "white": "#f5f5f5", + "brightBlack": "#555555", + "brightRed": "#ff0000", + "brightGreen": "#00ff00", + "brightYellow": "#ffff00", + "brightBlue": "#0000ff", + "brightPurple": "#ff00ff", + "brightCyan": "#00ffff", + "brightWhite": "#e5e5e5", + "background": "#000000", + "foreground": "#ffffff", + "cursorColor": "#ffffff", + "selectionBackground": "#b5d5ff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Vimbones.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Vimbones.json new file mode 100644 index 0000000..75de24a --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Vimbones.json @@ -0,0 +1,23 @@ +{ + "name": "Vimbones", + "black": "#f0f0ca", + "red": "#a8334c", + "green": "#4f6c31", + "yellow": "#944927", + "blue": "#286486", + "purple": "#88507d", + "cyan": "#3b8992", + "white": "#353535", + "brightBlack": "#acac89", + "brightRed": "#94253e", + "brightGreen": "#3f5a22", + "brightYellow": "#803d1c", + "brightBlue": "#1d5573", + "brightPurple": "#7b3b70", + "brightCyan": "#2b747c", + "brightWhite": "#5c5c5c", + "background": "#f0f0ca", + "foreground": "#353535", + "cursorColor": "#353535", + "selectionBackground": "#d7d7d7" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Violet Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Violet Dark.json new file mode 100644 index 0000000..30dd9d1 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Violet Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Violet Dark", + "black": "#56595c", + "red": "#c94c22", + "green": "#85981c", + "yellow": "#b4881d", + "blue": "#2e8bce", + "purple": "#d13a82", + "cyan": "#32a198", + "white": "#c9c6bd", + "brightBlack": "#45484b", + "brightRed": "#bd3613", + "brightGreen": "#738a04", + "brightYellow": "#a57705", + "brightBlue": "#2176c7", + "brightPurple": "#c61c6f", + "brightCyan": "#259286", + "brightWhite": "#c9c6bd", + "background": "#1c1d1f", + "foreground": "#708284", + "cursorColor": "#708284", + "selectionBackground": "#595ab7" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Violet Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Violet Light.json new file mode 100644 index 0000000..14b85fc --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Violet Light.json @@ -0,0 +1,23 @@ +{ + "name": "Violet Light", + "black": "#56595c", + "red": "#c94c22", + "green": "#85981c", + "yellow": "#b4881d", + "blue": "#2e8bce", + "purple": "#d13a82", + "cyan": "#32a198", + "white": "#b9b6af", + "brightBlack": "#45484b", + "brightRed": "#bd3613", + "brightGreen": "#738a04", + "brightYellow": "#a57705", + "brightBlue": "#2176c7", + "brightPurple": "#c61c6f", + "brightCyan": "#259286", + "brightWhite": "#c9c6bd", + "background": "#fcf4dc", + "foreground": "#536870", + "cursorColor": "#536870", + "selectionBackground": "#595ab7" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Violite.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Violite.json new file mode 100644 index 0000000..c6fd16d --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Violite.json @@ -0,0 +1,23 @@ +{ + "name": "Violite", + "black": "#241c36", + "red": "#ec7979", + "green": "#79ecb3", + "yellow": "#ece279", + "blue": "#a979ec", + "purple": "#ec79ec", + "cyan": "#79ecec", + "white": "#eef4f6", + "brightBlack": "#56447a", + "brightRed": "#ef8f8f", + "brightGreen": "#9fefbf", + "brightYellow": "#efe78f", + "brightBlue": "#b78fef", + "brightPurple": "#ef8fcf", + "brightCyan": "#9fefef", + "brightWhite": "#f8fafc", + "background": "#241c36", + "foreground": "#eef4f6", + "cursorColor": "#eef4f6", + "selectionBackground": "#49376d" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Warm Neon.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Warm Neon.json new file mode 100644 index 0000000..27236ee --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Warm Neon.json @@ -0,0 +1,23 @@ +{ + "name": "Warm Neon", + "black": "#000000", + "red": "#e24346", + "green": "#39b13a", + "yellow": "#dae145", + "blue": "#4261c5", + "purple": "#f920fb", + "cyan": "#2abbd4", + "white": "#d0b8a3", + "brightBlack": "#fefcfc", + "brightRed": "#e97071", + "brightGreen": "#9cc090", + "brightYellow": "#ddda7a", + "brightBlue": "#7b91d6", + "brightPurple": "#f674ba", + "brightCyan": "#5ed1e5", + "brightWhite": "#d8c8bb", + "background": "#404040", + "foreground": "#afdab6", + "cursorColor": "#30ff24", + "selectionBackground": "#b0ad21" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Wez.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Wez.json new file mode 100644 index 0000000..392afbd --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Wez.json @@ -0,0 +1,23 @@ +{ + "name": "Wez", + "black": "#000000", + "red": "#cc5555", + "green": "#55cc55", + "yellow": "#cdcd55", + "blue": "#5555cc", + "purple": "#cc55cc", + "cyan": "#7acaca", + "white": "#cccccc", + "brightBlack": "#555555", + "brightRed": "#ff5555", + "brightGreen": "#55ff55", + "brightYellow": "#ffff55", + "brightBlue": "#5555ff", + "brightPurple": "#ff55ff", + "brightCyan": "#55ffff", + "brightWhite": "#ffffff", + "background": "#000000", + "foreground": "#b3b3b3", + "cursorColor": "#53ae71", + "selectionBackground": "#4d52f8" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Whimsy.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Whimsy.json new file mode 100644 index 0000000..46f8a4f --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Whimsy.json @@ -0,0 +1,23 @@ +{ + "name": "Whimsy", + "black": "#535178", + "red": "#ef6487", + "green": "#5eca89", + "yellow": "#fdd877", + "blue": "#65aef7", + "purple": "#aa7ff0", + "cyan": "#43c1be", + "white": "#ffffff", + "brightBlack": "#535178", + "brightRed": "#ef6487", + "brightGreen": "#5eca89", + "brightYellow": "#fdd877", + "brightBlue": "#65aef7", + "brightPurple": "#aa7ff0", + "brightCyan": "#43c1be", + "brightWhite": "#ffffff", + "background": "#29283b", + "foreground": "#b3b0d6", + "cursorColor": "#b3b0d6", + "selectionBackground": "#3d3c58" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Wild Cherry.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Wild Cherry.json new file mode 100644 index 0000000..6c7b25f --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Wild Cherry.json @@ -0,0 +1,23 @@ +{ + "name": "Wild Cherry", + "black": "#000507", + "red": "#d94085", + "green": "#2ab250", + "yellow": "#ffd16f", + "blue": "#883cdc", + "purple": "#ececec", + "cyan": "#c1b8b7", + "white": "#fff8de", + "brightBlack": "#009cc9", + "brightRed": "#da6bac", + "brightGreen": "#f4dca5", + "brightYellow": "#eac066", + "brightBlue": "#308cba", + "brightPurple": "#ae636b", + "brightCyan": "#ff919d", + "brightWhite": "#e4838d", + "background": "#1f1726", + "foreground": "#dafaff", + "cursorColor": "#dd00ff", + "selectionBackground": "#002831" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Wilmersdorf.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Wilmersdorf.json new file mode 100644 index 0000000..5f832b2 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Wilmersdorf.json @@ -0,0 +1,23 @@ +{ + "name": "Wilmersdorf", + "black": "#34373e", + "red": "#e06383", + "green": "#7ebebd", + "yellow": "#cccccc", + "blue": "#a6c1e0", + "purple": "#e1c1ee", + "cyan": "#5b94ab", + "white": "#ababab", + "brightBlack": "#50545d", + "brightRed": "#fa7193", + "brightGreen": "#8fd7d6", + "brightYellow": "#d1dfff", + "brightBlue": "#b2cff0", + "brightPurple": "#efccfd", + "brightCyan": "#69abc5", + "brightWhite": "#d3d3d3", + "background": "#282b33", + "foreground": "#c6c6c6", + "cursorColor": "#7ebebd", + "selectionBackground": "#1f2024" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Wombat.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Wombat.json new file mode 100644 index 0000000..7b9f250 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Wombat.json @@ -0,0 +1,23 @@ +{ + "name": "Wombat", + "black": "#000000", + "red": "#ff615a", + "green": "#b1e969", + "yellow": "#ebd99c", + "blue": "#5da9f6", + "purple": "#e86aff", + "cyan": "#82fff7", + "white": "#dedacf", + "brightBlack": "#4a4a4a", + "brightRed": "#f58c80", + "brightGreen": "#ddf88f", + "brightYellow": "#eee5b2", + "brightBlue": "#a5c7ff", + "brightPurple": "#ddaaff", + "brightCyan": "#b7fff9", + "brightWhite": "#ffffff", + "background": "#171717", + "foreground": "#dedacf", + "cursorColor": "#bbbbbb", + "selectionBackground": "#453b39" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Wryan.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Wryan.json new file mode 100644 index 0000000..dec788a --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Wryan.json @@ -0,0 +1,23 @@ +{ + "name": "Wryan", + "black": "#333333", + "red": "#8c4665", + "green": "#287373", + "yellow": "#7c7c99", + "blue": "#395573", + "purple": "#5e468c", + "cyan": "#31658c", + "white": "#899ca1", + "brightBlack": "#3d3d3d", + "brightRed": "#bf4d80", + "brightGreen": "#53a6a6", + "brightYellow": "#9e9ecb", + "brightBlue": "#477ab3", + "brightPurple": "#7e62b3", + "brightCyan": "#6096bf", + "brightWhite": "#c0c0c0", + "background": "#101010", + "foreground": "#999993", + "cursorColor": "#9e9ecb", + "selectionBackground": "#4d4d4d" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Xcode Dark hc.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Xcode Dark hc.json new file mode 100644 index 0000000..49dc581 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Xcode Dark hc.json @@ -0,0 +1,23 @@ +{ + "name": "Xcode Dark hc", + "black": "#43454b", + "red": "#ff8a7a", + "green": "#83c9bc", + "yellow": "#d9c668", + "blue": "#4ec4e6", + "purple": "#ff85b8", + "cyan": "#cda1ff", + "white": "#ffffff", + "brightBlack": "#838991", + "brightRed": "#ff8a7a", + "brightGreen": "#b1faeb", + "brightYellow": "#ffa14f", + "brightBlue": "#6bdfff", + "brightPurple": "#ff85b8", + "brightCyan": "#e5cfff", + "brightWhite": "#ffffff", + "background": "#1f1f24", + "foreground": "#ffffff", + "cursorColor": "#ffffff", + "selectionBackground": "#43454b" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Xcode Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Xcode Dark.json new file mode 100644 index 0000000..63d500a --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Xcode Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Xcode Dark", + "black": "#414453", + "red": "#ff8170", + "green": "#78c2b3", + "yellow": "#d9c97c", + "blue": "#4eb0cc", + "purple": "#ff7ab2", + "cyan": "#b281eb", + "white": "#dfdfe0", + "brightBlack": "#7f8c98", + "brightRed": "#ff8170", + "brightGreen": "#acf2e4", + "brightYellow": "#ffa14f", + "brightBlue": "#6bdfff", + "brightPurple": "#ff7ab2", + "brightCyan": "#dabaff", + "brightWhite": "#dfdfe0", + "background": "#292a30", + "foreground": "#dfdfe0", + "cursorColor": "#dfdfe0", + "selectionBackground": "#414453" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Xcode Light hc.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Xcode Light hc.json new file mode 100644 index 0000000..10eb4fe --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Xcode Light hc.json @@ -0,0 +1,23 @@ +{ + "name": "Xcode Light hc", + "black": "#b4d8fd", + "red": "#ad1805", + "green": "#355d61", + "yellow": "#78492a", + "blue": "#0058a1", + "purple": "#9c2191", + "cyan": "#703daa", + "white": "#000000", + "brightBlack": "#8a99a6", + "brightRed": "#ad1805", + "brightGreen": "#174145", + "brightYellow": "#78492a", + "brightBlue": "#003f73", + "brightPurple": "#9c2191", + "brightCyan": "#441ea1", + "brightWhite": "#000000", + "background": "#ffffff", + "foreground": "#000000", + "cursorColor": "#000000", + "selectionBackground": "#b4d8fd" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Xcode Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Xcode Light.json new file mode 100644 index 0000000..d35c5e0 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Xcode Light.json @@ -0,0 +1,23 @@ +{ + "name": "Xcode Light", + "black": "#b4d8fd", + "red": "#d12f1b", + "green": "#3e8087", + "yellow": "#78492a", + "blue": "#0f68a0", + "purple": "#ad3da4", + "cyan": "#804fb8", + "white": "#262626", + "brightBlack": "#8a99a6", + "brightRed": "#d12f1b", + "brightGreen": "#23575c", + "brightYellow": "#78492a", + "brightBlue": "#0b4f79", + "brightPurple": "#ad3da4", + "brightCyan": "#4b21b0", + "brightWhite": "#262626", + "background": "#ffffff", + "foreground": "#262626", + "cursorColor": "#262626", + "selectionBackground": "#b4d8fd" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Xcode WWDC.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Xcode WWDC.json new file mode 100644 index 0000000..afc5c41 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Xcode WWDC.json @@ -0,0 +1,23 @@ +{ + "name": "Xcode WWDC", + "black": "#494d5c", + "red": "#bb383a", + "green": "#94c66e", + "yellow": "#d28e5d", + "blue": "#8884c5", + "purple": "#b73999", + "cyan": "#00aba4", + "white": "#e7e8eb", + "brightBlack": "#7f869e", + "brightRed": "#bb383a", + "brightGreen": "#94c66e", + "brightYellow": "#d28e5d", + "brightBlue": "#8884c5", + "brightPurple": "#b73999", + "brightCyan": "#00aba4", + "brightWhite": "#e7e8eb", + "background": "#292c36", + "foreground": "#e7e8eb", + "cursorColor": "#e7e8eb", + "selectionBackground": "#494d5c" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Zenbones Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Zenbones Dark.json new file mode 100644 index 0000000..5cdbee1 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Zenbones Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Zenbones Dark", + "black": "#1c1917", + "red": "#de6e7c", + "green": "#819b69", + "yellow": "#b77e64", + "blue": "#6099c0", + "purple": "#b279a7", + "cyan": "#66a5ad", + "white": "#b4bdc3", + "brightBlack": "#4d4540", + "brightRed": "#e8838f", + "brightGreen": "#8bae68", + "brightYellow": "#d68c67", + "brightBlue": "#61abda", + "brightPurple": "#cf86c1", + "brightCyan": "#65b8c1", + "brightWhite": "#888f94", + "background": "#1c1917", + "foreground": "#b4bdc3", + "cursorColor": "#c4cacf", + "selectionBackground": "#3d4042" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Zenbones Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Zenbones Light.json new file mode 100644 index 0000000..f204869 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Zenbones Light.json @@ -0,0 +1,23 @@ +{ + "name": "Zenbones Light", + "black": "#f0edec", + "red": "#a8334c", + "green": "#4f6c31", + "yellow": "#944927", + "blue": "#286486", + "purple": "#88507d", + "cyan": "#3b8992", + "white": "#2c363c", + "brightBlack": "#b5a7a0", + "brightRed": "#94253e", + "brightGreen": "#3f5a22", + "brightYellow": "#803d1c", + "brightBlue": "#1d5573", + "brightPurple": "#7b3b70", + "brightCyan": "#2b747c", + "brightWhite": "#4f5e68", + "background": "#f0edec", + "foreground": "#2c363c", + "cursorColor": "#2c363c", + "selectionBackground": "#cbd9e3" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Zenbones.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Zenbones.json new file mode 100644 index 0000000..d5e8dcf --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Zenbones.json @@ -0,0 +1,23 @@ +{ + "name": "Zenbones", + "black": "#f0edec", + "red": "#a8334c", + "green": "#4f6c31", + "yellow": "#944927", + "blue": "#286486", + "purple": "#88507d", + "cyan": "#3b8992", + "white": "#2c363c", + "brightBlack": "#b5a7a0", + "brightRed": "#94253e", + "brightGreen": "#3f5a22", + "brightYellow": "#803d1c", + "brightBlue": "#1d5573", + "brightPurple": "#7b3b70", + "brightCyan": "#2b747c", + "brightWhite": "#4f5e68", + "background": "#f0edec", + "foreground": "#2c363c", + "cursorColor": "#2c363c", + "selectionBackground": "#cbd9e3" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Zenburn.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Zenburn.json new file mode 100644 index 0000000..99e8be4 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Zenburn.json @@ -0,0 +1,23 @@ +{ + "name": "Zenburn", + "black": "#4d4d4d", + "red": "#7d5d5d", + "green": "#60b48a", + "yellow": "#f0dfaf", + "blue": "#5d6d7d", + "purple": "#dc8cc3", + "cyan": "#8cd0d3", + "white": "#dcdccc", + "brightBlack": "#709080", + "brightRed": "#dca3a3", + "brightGreen": "#c3bf9f", + "brightYellow": "#e0cf9f", + "brightBlue": "#94bff3", + "brightPurple": "#ec93d3", + "brightCyan": "#93e0e3", + "brightWhite": "#ffffff", + "background": "#3f3f3f", + "foreground": "#dcdccc", + "cursorColor": "#73635a", + "selectionBackground": "#21322f" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Zenburned.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Zenburned.json new file mode 100644 index 0000000..45efda3 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Zenburned.json @@ -0,0 +1,23 @@ +{ + "name": "Zenburned", + "black": "#404040", + "red": "#e3716e", + "green": "#819b69", + "yellow": "#b77e64", + "blue": "#6099c0", + "purple": "#b279a7", + "cyan": "#66a5ad", + "white": "#f0e4cf", + "brightBlack": "#6f6768", + "brightRed": "#ec8685", + "brightGreen": "#8bae68", + "brightYellow": "#d68c67", + "brightBlue": "#61abda", + "brightPurple": "#cf86c1", + "brightCyan": "#65b8c1", + "brightWhite": "#c0ab86", + "background": "#404040", + "foreground": "#f0e4cf", + "cursorColor": "#f3eadb", + "selectionBackground": "#746956" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Zenwritten Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Zenwritten Dark.json new file mode 100644 index 0000000..e6c7077 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Zenwritten Dark.json @@ -0,0 +1,23 @@ +{ + "name": "Zenwritten Dark", + "black": "#191919", + "red": "#de6e7c", + "green": "#819b69", + "yellow": "#b77e64", + "blue": "#6099c0", + "purple": "#b279a7", + "cyan": "#66a5ad", + "white": "#bbbbbb", + "brightBlack": "#4a4546", + "brightRed": "#e8838f", + "brightGreen": "#8bae68", + "brightYellow": "#d68c67", + "brightBlue": "#61abda", + "brightPurple": "#cf86c1", + "brightCyan": "#65b8c1", + "brightWhite": "#8e8e8e", + "background": "#191919", + "foreground": "#bbbbbb", + "cursorColor": "#c9c9c9", + "selectionBackground": "#404040" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/Zenwritten Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Zenwritten Light.json new file mode 100644 index 0000000..c121277 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/Zenwritten Light.json @@ -0,0 +1,23 @@ +{ + "name": "Zenwritten Light", + "black": "#eeeeee", + "red": "#a8334c", + "green": "#4f6c31", + "yellow": "#944927", + "blue": "#286486", + "purple": "#88507d", + "cyan": "#3b8992", + "white": "#353535", + "brightBlack": "#aca9a9", + "brightRed": "#94253e", + "brightGreen": "#3f5a22", + "brightYellow": "#803d1c", + "brightBlue": "#1d5573", + "brightPurple": "#7b3b70", + "brightCyan": "#2b747c", + "brightWhite": "#5c5c5c", + "background": "#eeeeee", + "foreground": "#353535", + "cursorColor": "#353535", + "selectionBackground": "#d7d7d7" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/branch.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/branch.json new file mode 100644 index 0000000..09ff1d6 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/branch.json @@ -0,0 +1,23 @@ +{ + "name": "branch", + "black": "#35241c", + "red": "#c2562d", + "green": "#96a65e", + "yellow": "#d29b5a", + "blue": "#3b8e8c", + "purple": "#c47e5b", + "cyan": "#639a90", + "white": "#cfc1a9", + "brightBlack": "#564a45", + "brightRed": "#c2562d", + "brightGreen": "#96a65e", + "brightYellow": "#d29b5a", + "brightBlue": "#3b8e8c", + "brightPurple": "#c47e5b", + "brightCyan": "#639a90", + "brightWhite": "#cfc1a9", + "background": "#32221a", + "foreground": "#cfc1a9", + "cursorColor": "#cfc1a9", + "selectionBackground": "#32221a" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/iTerm2 Dark Background.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/iTerm2 Dark Background.json new file mode 100644 index 0000000..25a97b2 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/iTerm2 Dark Background.json @@ -0,0 +1,23 @@ +{ + "name": "iTerm2 Dark Background", + "black": "#000000", + "red": "#c91b00", + "green": "#00c200", + "yellow": "#c7c400", + "blue": "#0225c7", + "purple": "#ca30c7", + "cyan": "#00c5c7", + "white": "#c7c7c7", + "brightBlack": "#686868", + "brightRed": "#ff6e67", + "brightGreen": "#5ffa68", + "brightYellow": "#fffc67", + "brightBlue": "#6871ff", + "brightPurple": "#ff77ff", + "brightCyan": "#60fdff", + "brightWhite": "#ffffff", + "background": "#000000", + "foreground": "#c7c7c7", + "cursorColor": "#c7c7c7", + "selectionBackground": "#c1deff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/iTerm2 Default.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/iTerm2 Default.json new file mode 100644 index 0000000..52a2827 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/iTerm2 Default.json @@ -0,0 +1,23 @@ +{ + "name": "iTerm2 Default", + "black": "#000000", + "red": "#c91b00", + "green": "#00c200", + "yellow": "#c7c400", + "blue": "#2225c4", + "purple": "#ca30c7", + "cyan": "#00c5c7", + "white": "#ffffff", + "brightBlack": "#686868", + "brightRed": "#ff6e67", + "brightGreen": "#5ffa68", + "brightYellow": "#fffc67", + "brightBlue": "#6871ff", + "brightPurple": "#ff77ff", + "brightCyan": "#60fdff", + "brightWhite": "#ffffff", + "background": "#000000", + "foreground": "#ffffff", + "cursorColor": "#e5e5e5", + "selectionBackground": "#c1deff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/iTerm2 Light Background.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/iTerm2 Light Background.json new file mode 100644 index 0000000..49385e6 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/iTerm2 Light Background.json @@ -0,0 +1,23 @@ +{ + "name": "iTerm2 Light Background", + "black": "#000000", + "red": "#c91b00", + "green": "#00c200", + "yellow": "#c7c400", + "blue": "#0225c7", + "purple": "#ca30c7", + "cyan": "#00c5c7", + "white": "#bababa", + "brightBlack": "#686868", + "brightRed": "#ff6e67", + "brightGreen": "#39d442", + "brightYellow": "#ccc934", + "brightBlue": "#6871ff", + "brightPurple": "#ff77ff", + "brightCyan": "#3ad7d9", + "brightWhite": "#ffffff", + "background": "#ffffff", + "foreground": "#000000", + "cursorColor": "#000000", + "selectionBackground": "#c1deff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/iTerm2 Pastel Dark Background.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/iTerm2 Pastel Dark Background.json new file mode 100644 index 0000000..21bb20c --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/iTerm2 Pastel Dark Background.json @@ -0,0 +1,23 @@ +{ + "name": "iTerm2 Pastel Dark Background", + "black": "#626262", + "red": "#ff8373", + "green": "#b4fb73", + "yellow": "#fffdc3", + "blue": "#a5d5fe", + "purple": "#ff90fe", + "cyan": "#d1d1fe", + "white": "#f1f1f1", + "brightBlack": "#8f8f8f", + "brightRed": "#ffc4be", + "brightGreen": "#d6fcba", + "brightYellow": "#fffed5", + "brightBlue": "#c2e3ff", + "brightPurple": "#ffb2fe", + "brightCyan": "#e6e6fe", + "brightWhite": "#ffffff", + "background": "#000000", + "foreground": "#c7c7c7", + "cursorColor": "#ffb473", + "selectionBackground": "#454d96" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/iTerm2 Smoooooth.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/iTerm2 Smoooooth.json new file mode 100644 index 0000000..78de358 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/iTerm2 Smoooooth.json @@ -0,0 +1,23 @@ +{ + "name": "iTerm2 Smoooooth", + "black": "#14191e", + "red": "#b43c2a", + "green": "#00c200", + "yellow": "#c7c400", + "blue": "#2744c7", + "purple": "#c040be", + "cyan": "#00c5c7", + "white": "#c7c7c7", + "brightBlack": "#686868", + "brightRed": "#dd7975", + "brightGreen": "#58e790", + "brightYellow": "#ece100", + "brightBlue": "#a7abf2", + "brightPurple": "#e17ee1", + "brightCyan": "#60fdff", + "brightWhite": "#ffffff", + "background": "#15191f", + "foreground": "#dcdcdc", + "cursorColor": "#ffffff", + "selectionBackground": "#b3d7ff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/iTerm2 Solarized Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/iTerm2 Solarized Dark.json new file mode 100644 index 0000000..737242d --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/iTerm2 Solarized Dark.json @@ -0,0 +1,23 @@ +{ + "name": "iTerm2 Solarized Dark", + "black": "#073642", + "red": "#dc322f", + "green": "#859900", + "yellow": "#b58900", + "blue": "#268bd2", + "purple": "#d33682", + "cyan": "#2aa198", + "white": "#eee8d5", + "brightBlack": "#335e69", + "brightRed": "#cb4b16", + "brightGreen": "#586e75", + "brightYellow": "#657b83", + "brightBlue": "#839496", + "brightPurple": "#6c71c4", + "brightCyan": "#93a1a1", + "brightWhite": "#fdf6e3", + "background": "#002b36", + "foreground": "#839496", + "cursorColor": "#839496", + "selectionBackground": "#073642" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/iTerm2 Solarized Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/iTerm2 Solarized Light.json new file mode 100644 index 0000000..d84282c --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/iTerm2 Solarized Light.json @@ -0,0 +1,23 @@ +{ + "name": "iTerm2 Solarized Light", + "black": "#073642", + "red": "#dc322f", + "green": "#859900", + "yellow": "#b58900", + "blue": "#268bd2", + "purple": "#d33682", + "cyan": "#2aa198", + "white": "#bbb5a2", + "brightBlack": "#002b36", + "brightRed": "#cb4b16", + "brightGreen": "#586e75", + "brightYellow": "#657b83", + "brightBlue": "#839496", + "brightPurple": "#6c71c4", + "brightCyan": "#93a1a1", + "brightWhite": "#fdf6e3", + "background": "#fdf6e3", + "foreground": "#657b83", + "cursorColor": "#657b83", + "selectionBackground": "#eee8d5" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/iTerm2 Tango Dark.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/iTerm2 Tango Dark.json new file mode 100644 index 0000000..550a2e4 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/iTerm2 Tango Dark.json @@ -0,0 +1,23 @@ +{ + "name": "iTerm2 Tango Dark", + "black": "#000000", + "red": "#d81e00", + "green": "#5ea702", + "yellow": "#cfae00", + "blue": "#427ab3", + "purple": "#89658e", + "cyan": "#00a7aa", + "white": "#dbded8", + "brightBlack": "#686a66", + "brightRed": "#f54235", + "brightGreen": "#99e343", + "brightYellow": "#fdeb61", + "brightBlue": "#84b0d8", + "brightPurple": "#bc94b7", + "brightCyan": "#37e6e8", + "brightWhite": "#f1f1f0", + "background": "#000000", + "foreground": "#ffffff", + "cursorColor": "#ffffff", + "selectionBackground": "#c1deff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/iTerm2 Tango Light.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/iTerm2 Tango Light.json new file mode 100644 index 0000000..8368c60 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/iTerm2 Tango Light.json @@ -0,0 +1,23 @@ +{ + "name": "iTerm2 Tango Light", + "black": "#000000", + "red": "#d81e00", + "green": "#5ea702", + "yellow": "#cfae00", + "blue": "#427ab3", + "purple": "#89658e", + "cyan": "#00a7aa", + "white": "#c1c4be", + "brightBlack": "#686a66", + "brightRed": "#f54235", + "brightGreen": "#8cd636", + "brightYellow": "#d7c53b", + "brightBlue": "#84b0d8", + "brightPurple": "#bc94b7", + "brightCyan": "#1eccce", + "brightWhite": "#f1f1f0", + "background": "#ffffff", + "foreground": "#000000", + "cursorColor": "#000000", + "selectionBackground": "#c1deff" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/novmbr.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/novmbr.json new file mode 100644 index 0000000..c1559b4 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/novmbr.json @@ -0,0 +1,23 @@ +{ + "name": "novmbr", + "black": "#282a2e", + "red": "#9f6434", + "green": "#9dac5f", + "yellow": "#cca75f", + "blue": "#2f7d7c", + "purple": "#b5896e", + "cyan": "#52877f", + "white": "#c7b8ac", + "brightBlack": "#5d4e47", + "brightRed": "#9f6434", + "brightGreen": "#9dac5f", + "brightYellow": "#cca75f", + "brightBlue": "#2f7d7c", + "brightPurple": "#b5896e", + "brightCyan": "#52877f", + "brightWhite": "#c7b8ac", + "background": "#241d1a", + "foreground": "#c7b8ac", + "cursorColor": "#c7b8ac", + "selectionBackground": "#241d1a" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/owl.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/owl.json new file mode 100644 index 0000000..eba8173 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/owl.json @@ -0,0 +1,23 @@ +{ + "name": "owl", + "black": "#302c2c", + "red": "#5a5a5a", + "green": "#989898", + "yellow": "#cacaca", + "blue": "#656565", + "purple": "#b1b1b1", + "cyan": "#7f7f7f", + "white": "#dedede", + "brightBlack": "#5d595b", + "brightRed": "#da5b2c", + "brightGreen": "#989898", + "brightYellow": "#cacaca", + "brightBlue": "#656565", + "brightPurple": "#b1b1b1", + "brightCyan": "#7f7f7f", + "brightWhite": "#ffffff", + "background": "#2f2b2c", + "foreground": "#dedede", + "cursorColor": "#dedede", + "selectionBackground": "#2f2b2c" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/traffic.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/traffic.json new file mode 100644 index 0000000..2a16660 --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/traffic.json @@ -0,0 +1,23 @@ +{ + "name": "traffic", + "black": "#282d31", + "red": "#934e46", + "green": "#637268", + "yellow": "#c79e84", + "blue": "#515e67", + "purple": "#715f5e", + "cyan": "#5c6f7d", + "white": "#cfb9a8", + "brightBlack": "#4e575e", + "brightRed": "#934e46", + "brightGreen": "#637270", + "brightYellow": "#c79e84", + "brightBlue": "#515e67", + "brightPurple": "#715f5e", + "brightCyan": "#5c6f7d", + "brightWhite": "#ddcec2", + "background": "#272c30", + "foreground": "#cfb9a8", + "cursorColor": "#cfb9a8", + "selectionBackground": "#272c30" +} diff --git a/third_party/KodoTerm/KodoTermThemes/windowsterminal/urban.json b/third_party/KodoTerm/KodoTermThemes/windowsterminal/urban.json new file mode 100644 index 0000000..71b137e --- /dev/null +++ b/third_party/KodoTerm/KodoTermThemes/windowsterminal/urban.json @@ -0,0 +1,23 @@ +{ + "name": "urban", + "black": "#33303b", + "red": "#87404f", + "green": "#74934e", + "yellow": "#ae835a", + "blue": "#615772", + "purple": "#854b64", + "cyan": "#625464", + "white": "#c0a79a", + "brightBlack": "#5c5865", + "brightRed": "#87404f", + "brightGreen": "#74934e", + "brightYellow": "#ae835a", + "brightBlue": "#615772", + "brightPurple": "#854b64", + "brightCyan": "#625464", + "brightWhite": "#c0a79a", + "background": "#312e39", + "foreground": "#c0a79a", + "cursorColor": "#c0a79a", + "selectionBackground": "#312e39" +} diff --git a/third_party/KodoTerm/LICENSE b/third_party/KodoTerm/LICENSE new file mode 100644 index 0000000..a0b78fa --- /dev/null +++ b/third_party/KodoTerm/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Diego Iastrubni + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/third_party/KodoTerm/include/KodoTerm/KodoTerm.hpp b/third_party/KodoTerm/include/KodoTerm/KodoTerm.hpp new file mode 100644 index 0000000..0ff6d73 --- /dev/null +++ b/third_party/KodoTerm/include/KodoTerm/KodoTerm.hpp @@ -0,0 +1,209 @@ +// SPDX-License-Identifier: MIT +// Author: Diego Iastrubni + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "KodoTermConfig.hpp" + +class PtyProcess; + +class KodoTerm : public QWidget { + Q_OBJECT + + public: + explicit KodoTerm(QWidget *parent = nullptr); + ~KodoTerm(); + + static void + populateThemeMenu(QMenu *parentMenu, const QString &title, TerminalTheme::ThemeFormat format, + const std::function &callback); + + void setTheme(const TerminalTheme &theme); + void setConfig(const KodoTermConfig &config); + KodoTermConfig getConfig() const { return m_config; } + + void setProgram(const QString &program) { m_program = program; } + QString program() const { return m_program; } + void setArguments(const QStringList &arguments) { m_arguments = arguments; } + QStringList arguments() const { return m_arguments; } + void setWorkingDirectory(const QString &workingDirectory) { + m_workingDirectory = workingDirectory; + } + QString workingDirectory() const { return m_workingDirectory; } + void setProcessEnvironment(const QProcessEnvironment &environment) { + m_environment = environment; + } + QProcessEnvironment processEnvironment() const { return m_environment; } + bool start(bool reset = true); + + void saveState(const QString &path); + void loadState(const QString &path); + + protected: + void paintEvent(QPaintEvent *event) override; + void resizeEvent(QResizeEvent *event) override; + void keyPressEvent(QKeyEvent *event) override; + void wheelEvent(QWheelEvent *event) override; + void mousePressEvent(QMouseEvent *event) override; + void mouseDoubleClickEvent(QMouseEvent *event) override; + void mouseMoveEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event) override; + void contextMenuEvent(QContextMenuEvent *event) override; + bool focusNextPrevChild(bool next) override; + void focusInEvent(QFocusEvent *event) override; + void focusOutEvent(QFocusEvent *event) override; + + signals: + void contextMenuRequested(QMenu *menu, const QPoint &pos); + void cwdChanged(const QString &cwd); + void finished(int exitCode, int exitStatus); + + public slots: + void onPtyReadyRead(const QByteArray &data); + void onScrollValueChanged(int value); + void scrollUp(int lines = 1); + void scrollDown(int lines = 1); + void pageUp(); + void pageDown(); + void copyToClipboard(); + void pasteFromClipboard(); + void selectAll(); + void clearScrollback(); + void resetTerminal(); + void openFileBrowser(); + void kill(); + + void logData(const QByteArray &data); + QString logPath() const { return m_logFile.fileName(); } + void setRestoreLog(const QString &path) { m_pendingLogReplay = path; } + void scrollToBottom(); + void processLogReplay(); + + void zoomIn(); + void zoomOut(); + void resetZoom(); + + QString foregroundProcessName() const; + bool isRoot() const; + const QString &cwd() const { return m_cwd; } + + bool copyOnSelect() const { return m_config.copyOnSelect; } + void setCopyOnSelect(bool enable) { m_config.copyOnSelect = enable; } + + bool pasteOnMiddleClick() const { return m_config.pasteOnMiddleClick; } + void setPasteOnMiddleClick(bool enable) { m_config.pasteOnMiddleClick = enable; } + bool mouseWheelZoom() const { return m_config.mouseWheelZoom; } + void setMouseWheelZoom(bool enable) { m_config.mouseWheelZoom = enable; } + bool visualBell() const { return m_config.visualBell; } + void setVisualBell(bool enable) { m_config.visualBell = enable; } + bool audibleBell() const { return m_config.audibleBell; } + void setAudibleBell(bool enable) { m_config.audibleBell = enable; } + + private: + void setupPty(); + void updateTerminalSize(); + QColor mapColor(const VTermColor &c, const VTermState *state) const; + QString getTextRange(VTermPos start, VTermPos end); + bool isSelected(int row, int col) const; + VTermPos mouseToPos(const QPoint &pos) const; + + // VTerm callbacks + static int onDamage(VTermRect rect, void *user); + static int onMoveRect(VTermRect dest, VTermRect src, void *user); + static int onMoveCursor(VTermPos pos, VTermPos oldpos, int visible, void *user); + static int onSetTermProp(VTermProp prop, VTermValue *val, void *user); + static int onBell(void *user); + static int onSbPushLine(int cols, const VTermScreenCell *cells, void *user); + static int onSbPopLine(int cols, VTermScreenCell *cells, void *user); + static int onOsc(int command, VTermStringFragment frag, void *user); + + int pushScrollback(int cols, const VTermScreenCell *cells); + int popScrollback(int cols, VTermScreenCell *cells); + + struct SavedCell { + uint32_t chars[VTERM_MAX_CHARS_PER_CELL]; + VTermScreenCellAttrs attrs; + VTermColor fg, bg; + int width; + }; + using SavedLine = std::vector; + + PtyProcess *m_pty = nullptr; + VTerm *m_vterm = nullptr; + VTermScreen *m_vtermScreen = nullptr; + + QSocketNotifier *m_notifier = nullptr; + QSize m_cellSize; + int m_cursorRow = 0; + int m_cursorCol = 0; + bool m_cursorVisible = true; + bool m_cursorBlink = false; + int m_cursorShape = 1; // VTERM_PROP_CURSORSHAPE_BLOCK + bool m_cursorBlinkState = true; + bool m_altScreen = false; + bool m_flowControlStopped = false; + bool m_restorationBannerActive = false; + QString m_restorationBannerText; + QTimer *m_restorationBannerTimer = nullptr; + int m_mouseMode = 0; // VTERM_PROP_MOUSE_NONE + QTimer *m_cursorBlinkTimer = nullptr; + + QScrollBar *m_scrollBar = nullptr; + std::deque m_scrollback; + + bool m_selecting = false; + VTermPos m_selectionStart = {-1, -1}; + VTermPos m_selectionEnd = {-1, -1}; + + QElapsedTimer m_clickTimer; + int m_clickCount = 0; + QPoint m_lastClickPos; + + bool m_visualBellActive = false; + QString m_cwd; + QByteArray m_oscBuffer; + + QString m_program; + QStringList m_arguments; + QString m_workingDirectory; + QProcessEnvironment m_environment = QProcessEnvironment::systemEnvironment(); + KodoTermConfig m_config; + QFile m_logFile; + QString m_pendingLogReplay; + QFile *m_replayFile = nullptr; + bool m_restoring = false; + + mutable QColor m_paletteCache[256]; + mutable bool m_paletteCacheValid[256]; + + mutable VTermColor m_lastVTermFg, m_lastVTermBg; + mutable QColor m_lastFg, m_lastBg; + double m_avgDrawTime = 0.0; + + VTermRect m_dirtyRect; + void resetDirtyRect(); + + bool m_dirty = false; + QImage m_backBuffer; + std::vector m_cellCache; + std::vector m_selectedCache; + void renderToBackbuffer(); + void flushTerminal(); + void damageAll(); + void drawRestorationBanner(QPainter &painter); +}; diff --git a/third_party/KodoTerm/include/KodoTerm/KodoTermConfig.hpp b/third_party/KodoTerm/include/KodoTerm/KodoTermConfig.hpp new file mode 100644 index 0000000..26a2a47 --- /dev/null +++ b/third_party/KodoTerm/include/KodoTerm/KodoTermConfig.hpp @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: MIT +// Author: Diego Iastrubni + +#pragma once + +#include +#include +#include +#include +#include +#include + +struct TerminalTheme { + QString name; + QColor foreground; + QColor background; + QColor palette[16]; + + enum class ThemeFormat { Konsole, WindowsTerminal, ITerm }; + + struct ThemeInfo { + QString name; + QString path; + ThemeFormat format; + }; + + static TerminalTheme defaultTheme(); + static TerminalTheme loadTheme(const QString &path); + static TerminalTheme loadKonsoleTheme(const QString &path); + static TerminalTheme loadWindowsTerminalTheme(const QString &path); + static TerminalTheme loadITermTheme(const QString &path); + static QList builtInThemes(); + + QJsonObject toJson() const; + static TerminalTheme fromJson(const QJsonObject &json); + void save(QSettings &settings, const QString &group = "Theme") const; + void load(QSettings &settings, const QString &group = "Theme"); +}; + +class KodoTermConfig { + public: + KodoTermConfig(); + KodoTermConfig(QSettings &settings); + + QFont font; + bool textAntialiasing; + bool customBoxDrawing; + bool copyOnSelect; + bool pasteOnMiddleClick; + bool mouseWheelZoom; + bool visualBell; + bool audibleBell; + bool tripleClickSelectsLine; + bool enableLogging; + QString logDirectory; + QString wordSelectionRegex; + int maxScrollback; + TerminalTheme theme; + + void setDefaults(); + void load(const QJsonObject &json); + QJsonObject saveToJson() const; + void load(QSettings &settings); + void save(QSettings &settings) const; +}; diff --git a/third_party/KodoTerm/src/KodoTerm.cpp b/third_party/KodoTerm/src/KodoTerm.cpp new file mode 100644 index 0000000..3740724 --- /dev/null +++ b/third_party/KodoTerm/src/KodoTerm.cpp @@ -0,0 +1,1847 @@ +// SPDX-License-Identifier: MIT +// Author: Diego Iastrubni + +#include "KodoTerm/KodoTerm.hpp" +#include "PtyProcess.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static void vterm_output_callback(const char *s, size_t len, void *user) { + auto *pty = static_cast(user); + if (pty) { + pty->write(QByteArray(s, (int)len)); + } +} + +static VTermColor toVTermColor(const QColor &c) { + VTermColor vc; + vc.type = VTERM_COLOR_RGB; + vc.rgb.red = c.red(); + vc.rgb.green = c.green(); + vc.rgb.blue = c.blue(); + return vc; +} + +void KodoTerm::setConfig(const KodoTermConfig &config) { + m_config = config; + setFont(m_config.font); + setTheme(m_config.theme); + + // Force a full redraw by resetting cell size and calling updateTerminalSize + m_cellSize = QSize(0, 0); + updateTerminalSize(); +} + +void KodoTerm::setTheme(const TerminalTheme &theme) { + m_config.theme = theme; + VTermState *state = vterm_obtain_state(m_vterm); + VTermColor fg = toVTermColor(theme.foreground), bg = toVTermColor(theme.background); + vterm_state_set_default_colors(state, &fg, &bg); + for (int i = 0; i < 16; ++i) { + VTermColor c = toVTermColor(theme.palette[i]); + vterm_state_set_palette_color(state, i, &c); + } + for (int i = 0; i < 256; ++i) { + m_paletteCacheValid[i] = false; + } + for (auto &cell : m_cellCache) { + cell.chars[0] = (uint32_t)-1; + } + damageAll(); +} + +KodoTerm::KodoTerm(QWidget *parent) : QWidget(parent) { + m_restoring = false; + for (int i = 0; i < 256; ++i) { + m_paletteCacheValid[i] = false; + } + setAttribute(Qt::WA_OpaquePaintEvent); + setAttribute(Qt::WA_NoSystemBackground); + memset(&m_lastVTermFg, 0, sizeof(VTermColor)); + memset(&m_lastVTermBg, 0, sizeof(VTermColor)); + m_config.font.setStyleHint(QFont::Monospace); + setFocusPolicy(Qt::StrongFocus); + m_scrollBar = new QScrollBar(Qt::Vertical, this); + m_scrollBar->setRange(0, 0); + connect(m_scrollBar, &QScrollBar::valueChanged, this, &KodoTerm::onScrollValueChanged); + setMouseTracking(true); + updateTerminalSize(); + m_cursorBlinkTimer = new QTimer(this); + m_cursorBlinkTimer->setInterval(500); + m_restorationBannerTimer = new QTimer(this); + m_restorationBannerTimer->setSingleShot(true); + m_restorationBannerTimer->setInterval(3000); + connect(m_restorationBannerTimer, &QTimer::timeout, this, [this]() { + m_restorationBannerActive = false; + update(); + }); + connect(m_cursorBlinkTimer, &QTimer::timeout, this, [this]() { + if (m_cursorBlink) { + m_cursorBlinkState = !m_cursorBlinkState; + QRect r(m_cursorCol * m_cellSize.width(), m_cursorRow * m_cellSize.height(), + m_cellSize.width(), m_cellSize.height()); + update(r); + } + }); + m_vterm = vterm_new(25, 80); + if (!m_vterm) { + return; + } + vterm_set_utf8(m_vterm, 1); + m_vtermScreen = vterm_obtain_screen(m_vterm); + if (!m_vtermScreen) { + return; + } + vterm_screen_enable_altscreen(m_vtermScreen, 1); + static VTermScreenCallbacks callbacks = {.damage = &KodoTerm::onDamage, + .moverect = &KodoTerm::onMoveRect, + .movecursor = &KodoTerm::onMoveCursor, + .settermprop = &KodoTerm::onSetTermProp, + .bell = &KodoTerm::onBell, + .resize = nullptr, + .sb_pushline = &KodoTerm::onSbPushLine, + .sb_popline = &KodoTerm::onSbPopLine, + .sb_clear = nullptr, + .sb_pushline4 = nullptr}; + vterm_screen_set_callbacks(m_vtermScreen, &callbacks, this); + vterm_screen_reset(m_vtermScreen, 1); + if (!m_environment.contains("TERM")) { + m_environment.insert("TERM", "xterm-256color"); + } + if (!m_environment.contains("COLORTERM")) { + m_environment.insert("COLORTERM", "truecolor"); + } + setTheme(m_config.theme); + resetDirtyRect(); + VTermState *state = vterm_obtain_state(m_vterm); + static VTermStateFallbacks fallbacks = {.control = nullptr, + .csi = nullptr, + .osc = &KodoTerm::onOsc, + .dcs = nullptr, + .apc = nullptr, + .pm = nullptr, + .sos = nullptr}; + vterm_state_set_unrecognised_fallbacks(state, &fallbacks, this); +} + +KodoTerm::~KodoTerm() { + if (m_replayFile) { + m_replayFile->close(); + delete m_replayFile; + } + if (m_pty) { + m_pty->kill(); + } + if (m_vterm) { + vterm_free(m_vterm); + } +} + +bool KodoTerm::start(bool reset) { + if (m_pty) { + m_pty->kill(); + delete m_pty; + m_pty = nullptr; + } + if (reset) { + resetTerminal(); + } + setupPty(); + if (m_program.isEmpty()) { + return false; + } + m_pty->setProgram(m_program); + m_pty->setArguments(m_arguments); + m_pty->setWorkingDirectory(m_workingDirectory); + m_pty->setProcessEnvironment(m_environment); + if (m_config.enableLogging) { + QDir logDir(m_config.logDirectory); + if (!logDir.exists()) { + logDir.mkpath("."); + } + QString timestamp = QDateTime::currentDateTime().toString("yyyyMMdd_HHmmss_zzz"); + m_logFile.setFileName(logDir.filePath(QString("kodoterm_%1.log").arg(timestamp))); + if (m_logFile.open(QIODevice::WriteOnly)) { + QString h = QString("-- KodoTerm Session Log ---\nProgram: %1\nArguments: %2\nCWD: " + "%3\nLOG_START_MARKER\n") + .arg(m_program) + .arg(m_arguments.join(" ")) + .arg(m_workingDirectory); + m_logFile.write(h.toUtf8()); + m_logFile.flush(); + } + } + updateTerminalSize(); + int r, c; + vterm_get_size(m_vterm, &r, &c); + return m_pty->start(QSize(c, r)); +} + +void KodoTerm::setupPty() { + if (m_pty) { + return; + } + m_pty = PtyProcess::create(this); + if (!m_pty) { + return; + } + connect(m_pty, &PtyProcess::readyRead, this, &KodoTerm::onPtyReadyRead); + connect(m_pty, &PtyProcess::finished, this, &KodoTerm::finished); + vterm_output_set_callback(m_vterm, vterm_output_callback, m_pty); +} + +void KodoTerm::flushTerminal() { + if (m_vtermScreen) { + vterm_screen_flush_damage(m_vtermScreen); + } +} +void KodoTerm::onPtyReadyRead(const QByteArray &data) { + if (!data.isEmpty()) { + if (m_logFile.isOpen()) { + m_logFile.write(data); + m_logFile.flush(); + } + vterm_input_write(m_vterm, data.constData(), data.size()); + flushTerminal(); + } +} +void KodoTerm::onScrollValueChanged(int value) { + if (m_vterm && !m_backBuffer.isNull()) { + VTermState *state = vterm_obtain_state(m_vterm); + VTermColor dfg, dbg; + vterm_state_get_default_colors(state, &dfg, &dbg); + m_backBuffer.fill(mapColor(dbg, state)); + for (auto &cell : m_cellCache) { + cell.chars[0] = (uint32_t)-1; + } + } + damageAll(); +} +void KodoTerm::scrollUp(int lines) { m_scrollBar->setValue(m_scrollBar->value() - lines); } +void KodoTerm::scrollDown(int lines) { m_scrollBar->setValue(m_scrollBar->value() + lines); } +void KodoTerm::pageUp() { scrollUp(m_scrollBar->pageStep()); } +void KodoTerm::pageDown() { scrollDown(m_scrollBar->pageStep()); } +int KodoTerm::onSbPushLine(int cols, const VTermScreenCell *cells, void *user) { + return static_cast(user)->pushScrollback(cols, cells); +} +int KodoTerm::onSbPopLine(int cols, VTermScreenCell *cells, void *user) { + return static_cast(user)->popScrollback(cols, cells); +} + +int KodoTerm::onOsc(int command, VTermStringFragment frag, void *user) { + auto *w = static_cast(user); + if (frag.initial) { + w->m_oscBuffer.clear(); + } + w->m_oscBuffer.append(frag.str, frag.len); + if (frag.final && command == 7) { + QString s = QString::fromUtf8(w->m_oscBuffer); + while (!s.isEmpty() && + (s.endsWith(';') || s.endsWith('') || s.endsWith('\n') || s.endsWith(' '))) { + s.chop(1); + } + if (s.startsWith("file://")) { + QUrl u(s); + QString p = u.toLocalFile(); + if (p.isEmpty() || (p.startsWith("//") && !u.host().isEmpty())) { + p = u.path(); + } + if (!p.isEmpty() && w->m_cwd != p) { + w->m_cwd = p; + emit w->cwdChanged(p); + } + } else if (!s.isEmpty() && w->m_cwd != s) { + w->m_cwd = s; + emit w->cwdChanged(s); + } + } + return 1; +} + +int KodoTerm::pushScrollback(int cols, const VTermScreenCell *cells) { + if (m_altScreen) { + return 0; + } + SavedLine line; + line.reserve(cols); + for (int i = 0; i < cols; ++i) { + SavedCell sc; + memcpy(sc.chars, cells[i].chars, sizeof(sc.chars)); + sc.attrs = cells[i].attrs; + sc.fg = cells[i].fg; + sc.bg = cells[i].bg; + sc.width = cells[i].width; + line.push_back(sc); + } + m_scrollback.push_back(std::move(line)); + if ((int)m_scrollback.size() > m_config.maxScrollback) { + m_scrollback.pop_front(); + } + bool bottom = m_scrollBar->value() == m_scrollBar->maximum(); + m_scrollBar->setRange(0, (int)m_scrollback.size()); + if (bottom) { + m_scrollBar->setValue(m_scrollBar->maximum()); + } + return 1; +} + +int KodoTerm::popScrollback(int cols, VTermScreenCell *cells) { + if (m_scrollback.empty()) { + return 0; + } + const SavedLine &line = m_scrollback.back(); + int n = std::min(cols, (int)line.size()); + for (int i = 0; i < n; ++i) { + memcpy(cells[i].chars, line[i].chars, sizeof(cells[i].chars)); + cells[i].attrs = line[i].attrs; + cells[i].fg = line[i].fg; + cells[i].bg = line[i].bg; + cells[i].width = line[i].width; + } + for (int i = n; i < cols; ++i) { + memset(&cells[i], 0, sizeof(VTermScreenCell)); + cells[i].width = 1; + } + m_scrollback.pop_back(); + m_scrollBar->setRange(0, (int)m_scrollback.size()); + return 1; +} + +void KodoTerm::updateTerminalSize() { + QFontMetrics fm(m_config.font); + QSize oldCellSize = m_cellSize; + m_cellSize = QSize(fm.horizontalAdvance('W'), fm.height()); + if (m_cellSize.width() <= 0 || m_cellSize.height() <= 0) { + m_cellSize = QSize(10, 20); + } + int rows = height() / m_cellSize.height(), + sb = m_scrollBar->isVisible() ? m_scrollBar->sizeHint().width() : 0, + cols = (width() - sb) / m_cellSize.width(); + if (rows <= 0) { + rows = 1; + } + if (cols <= 0) { + cols = 1; + } + int orows, ocols; + if (m_vterm) { + vterm_get_size(m_vterm, &orows, &ocols); + if (rows == orows && cols == ocols && m_cellSize == oldCellSize && + m_pendingLogReplay.isEmpty()) { + return; + } + vterm_set_size(m_vterm, rows, cols); + vterm_screen_flush_damage(m_vtermScreen); + qreal dpr = devicePixelRatioF(); + m_backBuffer = QImage(cols * m_cellSize.width() * dpr, rows * m_cellSize.height() * dpr, + QImage::Format_RGB32); + m_backBuffer.setDevicePixelRatio(dpr); + VTermState *state = vterm_obtain_state(m_vterm); + VTermColor dfg, dbg; + vterm_state_get_default_colors(state, &dfg, &dbg); + m_backBuffer.fill(mapColor(dbg, state)); + m_cellCache.assign(rows * cols, VTermScreenCell{}); + for (auto &c : m_cellCache) { + c.chars[0] = (uint32_t)-1; + } + m_selectedCache.assign(rows * cols, false); + m_scrollBar->setPageStep(rows); + if (m_scrollBar->value() == m_scrollBar->maximum()) { + m_scrollBar->setValue(m_scrollBar->maximum()); + } + if (!m_pendingLogReplay.isEmpty() && cols > 40) { + QTimer::singleShot(100, this, &KodoTerm::processLogReplay); + } + } + if (m_pty) { + m_pty->resize(QSize(cols, rows)); + } + damageAll(); +} + +void KodoTerm::processLogReplay() { + if (m_pendingLogReplay.isEmpty() && !m_replayFile) { + return; + } + + if (!m_replayFile) { + m_restoring = true; + m_restorationBannerActive = true; + m_restorationBannerText = tr("Restoring session..."); + + // Thorough reset + vterm_screen_reset(m_vtermScreen, 1); + m_scrollback.clear(); + m_scrollBar->setRange(0, 0); + m_scrollBar->setValue(0); + + VTermState *state = vterm_obtain_state(m_vterm); + VTermColor dfg, dbg; + vterm_state_get_default_colors(state, &dfg, &dbg); + if (!m_backBuffer.isNull()) { + m_backBuffer.fill(mapColor(dbg, state)); + } + + for (auto &c : m_cellCache) { + c.chars[0] = (uint32_t)-1; + } + m_selectedCache.assign(m_selectedCache.size(), false); + + update(); + m_replayFile = new QFile(m_pendingLogReplay); + m_pendingLogReplay.clear(); + if (!m_replayFile->open(QIODevice::ReadOnly)) { + delete m_replayFile; + m_replayFile = nullptr; + m_restoring = false; + m_restorationBannerActive = false; + return; + } + // Read header + QByteArray header; + while (!m_replayFile->atEnd()) { + char c; + if (m_replayFile->getChar(&c)) { + header.append(c); + if (c == '\n' && header.endsWith("LOG_START_MARKER\n")) { + break; + } + if (header.size() > 1024) { // Header too big or invalid + break; + } + } else { + break; + } + } + } + + if (m_replayFile) { + QByteArray chunk = m_replayFile->read(65536); // 64KB + if (!chunk.isEmpty()) { + onPtyReadyRead(chunk); + QTimer::singleShot(0, this, &KodoTerm::processLogReplay); + } else { + m_replayFile->close(); + delete m_replayFile; + m_replayFile = nullptr; + onPtyReadyRead("\r\n"); + scrollToBottom(); + m_restoring = false; + m_restorationBannerTimer->start(); + damageAll(); + update(); + } + } +} + +void KodoTerm::resetDirtyRect() { + m_dirtyRect.start_row = 10000; + m_dirtyRect.start_col = 10000; + m_dirtyRect.end_row = -1; + m_dirtyRect.end_col = -1; +} +void KodoTerm::damageAll() { + int r, c; + if (!m_vterm) { + return; + } + vterm_get_size(m_vterm, &r, &c); + m_dirtyRect.start_row = 0; + m_dirtyRect.start_col = 0; + m_dirtyRect.end_row = r; + m_dirtyRect.end_col = c; + m_dirty = true; + if (!m_restoring) { + update(); + } +} + +void KodoTerm::drawRestorationBanner(QPainter &painter) { + if (m_restorationBannerText.isEmpty()) { + return; + } + + QFont f = font(); + f.setBold(true); + f.setPointSize(f.pointSize() * 1.5); + painter.setFont(f); + + QFontMetrics fm(f); + int padding = 20; + QRect textRect = fm.boundingRect(m_restorationBannerText); + QRect bannerRect(0, 0, textRect.width() + padding * 2, textRect.height() + padding); + bannerRect.moveCenter(rect().center()); + + painter.setRenderHint(QPainter::Antialiasing, m_config.textAntialiasing); + painter.setRenderHint(QPainter::TextAntialiasing, m_config.textAntialiasing); + painter.setBrush(QColor(0, 0, 0, 180)); + painter.setPen(Qt::NoPen); + painter.drawRoundedRect(bannerRect, 10, 10); + + painter.setPen(Qt::white); + painter.drawText(bannerRect, Qt::AlignCenter, m_restorationBannerText); +} + +static bool colorsEqual(const VTermColor &a, const VTermColor &b) { + if (a.type != b.type) { + return false; + } + if (a.type == VTERM_COLOR_RGB) { + return a.rgb.red == b.rgb.red && a.rgb.green == b.rgb.green && a.rgb.blue == b.rgb.blue; + } + if (a.type == VTERM_COLOR_INDEXED) { + return a.indexed.idx == b.indexed.idx; + } + return true; +} + +static bool cellsEqual(const VTermScreenCell &a, const VTermScreenCell &b) { + if (a.width != b.width) { + return false; + } + if (memcmp(&a.attrs, &b.attrs, sizeof(VTermScreenCellAttrs)) != 0) { + return false; + } + if (!colorsEqual(a.fg, b.fg) || !colorsEqual(a.bg, b.bg)) { + return false; + } + for (int i = 0; i < VTERM_MAX_CHARS_PER_CELL; ++i) { + if (a.chars[i] != b.chars[i]) { + return false; + } + if (a.chars[i] == 0) { + break; + } + } + return true; +} + +static bool isBoxChar(uint32_t c) { return (c >= 0x2500 && c <= 0x257F); } + +static void drawBoxChar(QPainter &p, const QRect &r, uint32_t c, const QColor &fg) { + enum { L = 1, R = 2, U = 4, D = 8, H = 16, Db = 32 }; + int f = 0; + switch (c) { + case 0x2500: + f = L | R; + break; + case 0x2501: + f = L | R | H; + break; + case 0x2502: + f = U | D; + break; + case 0x2503: + f = U | D | H; + break; + case 0x250C: + f = D | R; + break; + case 0x250F: + f = D | R | H; + break; + case 0x2510: + f = D | L; + break; + case 0x2513: + f = D | L | H; + break; + case 0x2514: + f = U | R; + break; + case 0x2517: + f = U | R | H; + break; + case 0x2518: + f = U | L; + break; + case 0x251B: + f = U | L | H; + break; + case 0x251C: + f = U | D | R; + break; + case 0x2523: + f = U | D | R | H; + break; + case 0x2524: + f = U | D | L; + break; + case 0x252B: + f = U | D | L | H; + break; + case 0x252C: + f = D | L | R; + break; + case 0x2533: + f = D | L | R | H; + break; + case 0x2534: + f = U | L | R; + break; + case 0x253B: + f = U | L | R | H; + break; + case 0x253C: + f = U | D | L | R; + break; + case 0x254B: + f = U | D | L | R | H; + break; + case 0x2550: + f = L | R | Db; + break; + case 0x2551: + f = U | D | Db; + break; + case 0x2554: + f = D | R | Db; + break; + case 0x2557: + f = D | L | Db; + break; + case 0x255A: + f = U | R | Db; + break; + case 0x255D: + f = U | L | Db; + break; + case 0x2560: + f = U | D | R | Db; + break; + case 0x2563: + f = U | D | L | Db; + break; + case 0x2566: + f = D | L | R | Db; + break; + case 0x2569: + f = U | L | R | Db; + break; + case 0x256C: + f = U | D | L | R | Db; + break; + } + + if (f == 0) { + p.setPen(fg); + p.drawText(r, Qt::AlignCenter, QString::fromUcs4((const char32_t *)&c, 1)); + return; + } + + p.setPen(Qt::NoPen); + p.setBrush(fg); + int cx = r.center().x(); + int cy = r.center().y(); + int t = (f & H) ? 2 : 1; + + if (f & Db) { + int g = 1; // gap + if (f & U) { + p.drawRect(cx - 1, r.top(), 1, cy - r.top() + g); + p.drawRect(cx + 1, r.top(), 1, cy - r.top() + g); + } + if (f & D) { + p.drawRect(cx - 1, cy - g, 1, r.bottom() - cy + 1 + g); + p.drawRect(cx + 1, cy - g, 1, r.bottom() - cy + 1 + g); + } + if (f & L) { + p.drawRect(r.left(), cy - 1, cx - r.left() + g, 1); + p.drawRect(r.left(), cy + 1, cx - r.left() + g, 1); + } + if (f & R) { + p.drawRect(cx - g, cy - 1, r.right() - cx + 1 + g, 1); + p.drawRect(cx - g, cy + 1, r.right() - cx + 1 + g, 1); + } + } else { + if (f & U) { + p.drawRect(cx, r.top(), t, cy - r.top() + t); + } + if (f & D) { + p.drawRect(cx, cy, t, r.bottom() - cy + 1); + } + if (f & L) { + p.drawRect(r.left(), cy, cx - r.left() + t, t); + } + if (f & R) { + p.drawRect(cx, cy, r.right() - cx + 1, t); + } + } +} + +void KodoTerm::renderToBackbuffer() { + if (m_backBuffer.isNull()) { + return; + } + int rows, cols; + vterm_get_size(m_vterm, &rows, &cols); + int cur = m_scrollBar->value(), sb = (int)m_scrollback.size(); + bool useCache = (cur == sb); + if (useCache && (m_dirtyRect.start_row > m_dirtyRect.end_row)) { + m_dirty = false; + return; + } + + QPainter painter(&m_backBuffer); + QFont f = font(); + f.setKerning(false); + f.setStyleStrategy(m_config.textAntialiasing ? QFont::PreferAntialias : QFont::NoAntialias); + painter.setFont(f); + painter.setRenderHint(QPainter::TextAntialiasing, m_config.textAntialiasing); + painter.setRenderHint(QPainter::Antialiasing, + false); // Always false for cell backgrounds to prevent gaps + + VTermState *state = vterm_obtain_state(m_vterm); + VTermColor dfg, dbg; + vterm_state_get_default_colors(state, &dfg, &dbg); + QColor defBg = mapColor(dbg, state), defFg = mapColor(dfg, state); + + VTermPos sS = m_selectionStart, sE = m_selectionEnd; + bool hasS = (sS.row != -1); + if (hasS && (sS.row > sE.row || (sS.row == sE.row && sS.col > sE.col))) { + std::swap(sS, sE); + } + int sR = 0, eR = rows, sC = 0, eC = cols; + if (useCache) { + sR = std::max(0, m_dirtyRect.start_row); + eR = std::min(rows, m_dirtyRect.end_row); + sC = std::max(0, m_dirtyRect.start_col); + eC = std::min(cols, m_dirtyRect.end_col); + } + for (int r = sR; r < eR; ++r) { + int absR = cur + r; + for (int c = sC; c < eC; ++c) { + VTermScreenCell cell; + if (absR < sb) { + const SavedLine &l = m_scrollback[absR]; + if (c < (int)l.size()) { + const SavedCell &sc = l[c]; + memcpy(cell.chars, sc.chars, sizeof(cell.chars)); + cell.attrs = sc.attrs; + cell.fg = sc.fg; + cell.bg = sc.bg; + cell.width = sc.width; + } else { + memset(&cell, 0, sizeof(cell)); + cell.width = 1; + } + } else { + vterm_screen_get_cell(m_vtermScreen, {r, c}, &cell); + } + if (cell.width == 0) { + continue; + } + bool sel = false; + if (hasS) { + if (absR > sS.row && absR < sE.row) { + sel = true; + } else if (absR == sS.row && absR == sE.row) { + sel = (c >= sS.col && c <= sE.col); + } else if (absR == sS.row) { + sel = (c >= sS.col); + } else if (absR == sE.row) { + sel = (c <= sE.col); + } + } + if (useCache && sel == m_selectedCache[r * cols + c] && + cellsEqual(cell, m_cellCache[r * cols + c])) { + if (cell.width > 1) { + c += (cell.width - 1); + } + continue; + } + if (useCache) { + m_cellCache[r * cols + c] = cell; + m_selectedCache[r * cols + c] = sel; + } + QColor fg = defFg, bg = defBg; + if (!VTERM_COLOR_IS_DEFAULT_FG(&cell.fg)) { + fg = mapColor(cell.fg, state); + } + if (!VTERM_COLOR_IS_DEFAULT_BG(&cell.bg)) { + bg = mapColor(cell.bg, state); + } + if (cell.attrs.reverse ^ sel) { + std::swap(fg, bg); + } + + QRectF rect(c * m_cellSize.width(), r * m_cellSize.height(), + cell.width * m_cellSize.width(), m_cellSize.height()); + painter.fillRect(rect, bg); + + if (m_config.customBoxDrawing && isBoxChar(cell.chars[0])) { + drawBoxChar(painter, rect.toRect(), cell.chars[0], fg); + } else if (cell.chars[0] != 0) { + int n_chars = 0; + while (n_chars < VTERM_MAX_CHARS_PER_CELL && cell.chars[n_chars]) { + n_chars++; + } + painter.setPen(fg); + painter.drawText(rect, Qt::AlignCenter, + QString::fromUcs4((const char32_t *)cell.chars, n_chars)); + } + + if (cell.width > 1) { + c += (cell.width - 1); + } + } + } + resetDirtyRect(); + m_dirty = false; +} + +int KodoTerm::onDamage(VTermRect r, void *u) { + auto *w = static_cast(u); + if (!w->m_pendingLogReplay.isEmpty()) { + return 1; + } + w->m_dirtyRect.start_row = std::min(w->m_dirtyRect.start_row, r.start_row); + w->m_dirtyRect.start_col = std::min(w->m_dirtyRect.start_col, r.start_col); + w->m_dirtyRect.end_row = std::max(w->m_dirtyRect.end_row, r.end_row); + w->m_dirtyRect.end_col = std::max(w->m_dirtyRect.end_col, r.end_col); + w->m_dirty = true; + if (!w->m_restoring) { + w->update(); + } + return 1; +} + +int KodoTerm::onMoveRect(VTermRect d, VTermRect s, void *u) { + auto *w = static_cast(u); + if (!w->m_pendingLogReplay.isEmpty()) { + return 1; + } + + int cols, rows; + vterm_get_size(w->m_vterm, &rows, &cols); + int h = s.end_row - s.start_row; + if (d.start_row < s.start_row) { + for (int r = 0; r < h; ++r) { + int sr = s.start_row + r, dr = d.start_row + r; + if (sr >= 0 && sr < rows && dr >= 0 && dr < rows) { + std::copy(w->m_cellCache.begin() + sr * cols, + w->m_cellCache.begin() + sr * cols + cols, + w->m_cellCache.begin() + dr * cols); + std::copy(w->m_selectedCache.begin() + sr * cols, + w->m_selectedCache.begin() + sr * cols + cols, + w->m_selectedCache.begin() + dr * cols); + } + } + } else { + for (int r = h - 1; r >= 0; --r) { + int sr = s.start_row + r, dr = d.start_row + r; + if (sr >= 0 && sr < rows && dr >= 0 && dr < rows) { + std::copy(w->m_cellCache.begin() + sr * cols, + w->m_cellCache.begin() + sr * cols + cols, + w->m_cellCache.begin() + dr * cols); + std::copy(w->m_selectedCache.begin() + sr * cols, + w->m_selectedCache.begin() + sr * cols + cols, + w->m_selectedCache.begin() + dr * cols); + } + } + } + + w->m_dirtyRect.start_row = std::min({w->m_dirtyRect.start_row, d.start_row, s.start_row}); + w->m_dirtyRect.end_row = std::max({w->m_dirtyRect.end_row, d.end_row, s.end_row}); + w->m_dirtyRect.start_col = 0; + w->m_dirtyRect.end_col = cols; + + w->m_dirty = true; + if (!w->m_restoring) { + w->update(); + } + return 1; +} + +int KodoTerm::onMoveCursor(VTermPos p, VTermPos op, int v, void *u) { + auto *w = static_cast(u); + if (!w->m_pendingLogReplay.isEmpty()) { + return 1; + } + w->m_cursorRow = p.row; + w->m_cursorCol = p.col; + w->m_cursorVisible = v; + if (!w->m_restoring) { + w->update(); + } + return 1; +} + +int KodoTerm::onSetTermProp(VTermProp p, VTermValue *v, void *u) { + auto *w = static_cast(u); + if (!w->m_pendingLogReplay.isEmpty()) { + return 1; + } + switch (p) { + case VTERM_PROP_CURSORVISIBLE: + w->m_cursorVisible = v->boolean; + break; + case VTERM_PROP_CURSORBLINK: + w->m_cursorBlink = v->boolean; + if (w->m_cursorBlink) { + w->m_cursorBlinkTimer->start(); + } else { + w->m_cursorBlinkTimer->stop(); + w->m_cursorBlinkState = true; + } + break; + case VTERM_PROP_CURSORSHAPE: + w->m_cursorShape = v->number; + break; + case VTERM_PROP_ALTSCREEN: + w->m_altScreen = v->boolean; + if (w->m_altScreen) { + w->m_scrollBar->hide(); + } else { + w->m_scrollBar->show(); + } + w->updateTerminalSize(); + break; + case VTERM_PROP_TITLE: + w->setWindowTitle(QString::fromUtf8(v->string.str, (int)v->string.len)); + break; + case VTERM_PROP_MOUSE: + w->m_mouseMode = v->number; + break; + default: + break; + } + if (!w->m_restoring) { + w->damageAll(); + } + return 1; +} + +int KodoTerm::onBell(void *u) { + auto *w = static_cast(u); + if (w->m_restoring || !w->m_pendingLogReplay.isEmpty()) { + return 1; + } + if (w->m_config.audibleBell) { + QApplication::beep(); + } + if (w->m_config.visualBell) { + w->m_visualBellActive = true; + w->update(); + QTimer::singleShot(100, w, [w]() { + w->m_visualBellActive = false; + w->update(); + }); + } + return 1; +} + +void KodoTerm::resizeEvent(QResizeEvent *e) { + int sb = m_scrollBar->sizeHint().width(); + m_scrollBar->setGeometry(width() - sb, 0, sb, height()); + updateTerminalSize(); + QWidget::resizeEvent(e); +} + +void KodoTerm::wheelEvent(QWheelEvent *e) { + if (m_config.mouseWheelZoom && (e->modifiers() & Qt::ControlModifier)) { + if (e->angleDelta().y() > 0) { + zoomIn(); + } else if (e->angleDelta().y() < 0) { + zoomOut(); + } + return; + } + if (m_mouseMode > 0 && !(e->modifiers() & Qt::ShiftModifier)) { + VTermModifier m = VTERM_MOD_NONE; + if (e->modifiers() & Qt::ShiftModifier) { + m = (VTermModifier)(m | VTERM_MOD_SHIFT); + } + if (e->modifiers() & Qt::ControlModifier) { + m = (VTermModifier)(m | VTERM_MOD_CTRL); + } + if (e->modifiers() & Qt::AltModifier) { + m = (VTermModifier)(m | VTERM_MOD_ALT); + } + int r = e->position().toPoint().y() / m_cellSize.height(), + c = e->position().toPoint().x() / m_cellSize.width(), + b = e->angleDelta().y() > 0 ? 4 : 5; + vterm_mouse_move(m_vterm, r, c, m); + vterm_mouse_button(m_vterm, b, true, m); + vterm_screen_flush_damage(m_vtermScreen); + return; + } + m_scrollBar->event(e); +} + +void KodoTerm::mousePressEvent(QMouseEvent *e) { + VTermModifier m = VTERM_MOD_NONE; + if (e->modifiers() & Qt::ShiftModifier) { + m = (VTermModifier)(m | VTERM_MOD_SHIFT); + } + if (e->modifiers() & Qt::ControlModifier) { + m = (VTermModifier)(m | VTERM_MOD_CTRL); + } + if (e->modifiers() & Qt::AltModifier) { + m = (VTermModifier)(m | VTERM_MOD_ALT); + } + int r = e->pos().y() / m_cellSize.height(), c = e->pos().x() / m_cellSize.width(); + if (m_mouseMode > 0 && !(e->modifiers() & Qt::ShiftModifier)) { + int b = 0; + if (e->button() == Qt::LeftButton) { + b = 1; + } else if (e->button() == Qt::MiddleButton) { + b = 2; + } else if (e->button() == Qt::RightButton) { + b = 3; + } + if (b > 0) { + vterm_mouse_move(m_vterm, r, c, m); + vterm_mouse_button(m_vterm, b, true, m); + vterm_screen_flush_damage(m_vtermScreen); + e->accept(); + return; + } + } + if (e->button() == Qt::LeftButton) { + if (!m_clickTimer.isValid() || + m_clickTimer.elapsed() > QApplication::doubleClickInterval() || + (e->pos() - m_lastClickPos).manhattanLength() > 5) { + m_clickCount = 1; + } else { + m_clickCount++; + } + m_clickTimer.restart(); + m_lastClickPos = e->pos(); + VTermPos vp = mouseToPos(e->pos()); + if (m_clickCount == 3 && m_config.tripleClickSelectsLine) { + int rows, cols; + vterm_get_size(m_vterm, &rows, &cols); + m_selectionStart = {vp.row, 0}; + m_selectionEnd = {vp.row, cols - 1}; + m_selecting = false; + if (m_config.copyOnSelect) { + copyToClipboard(); + } + damageAll(); + } else if (m_clickCount == 1) { + m_selecting = true; + m_selectionStart = vp; + m_selectionEnd = m_selectionStart; + damageAll(); + } + update(); + } else if (e->button() == Qt::MiddleButton && m_config.pasteOnMiddleClick) { + pasteFromClipboard(); + } + e->accept(); +} + +void KodoTerm::mouseDoubleClickEvent(QMouseEvent *e) { + if (e->button() != Qt::LeftButton || + (m_mouseMode > 0 && !(e->modifiers() & Qt::ShiftModifier))) { + return; + } + m_clickCount = 2; + m_clickTimer.restart(); + m_lastClickPos = e->pos(); + m_selecting = false; + VTermPos vp = mouseToPos(e->pos()); + int sb = (int)m_scrollback.size(), rows, cols; + vterm_get_size(m_vterm, &rows, &cols); + QString line; + line.fill(' ', cols); + int cc = vp.col; + if (vp.row < sb) { + const SavedLine &l = m_scrollback[vp.row]; + int n = std::min((int)l.size(), cols); + for (int c = 0; c < n; ++c) { + if (l[c].chars[0] != 0) { + line[c] = QChar(static_cast(l[c].chars[0] & 0xFFFF)); + } + } + } else { + int vr = vp.row - sb; + if (vr < rows) { + for (int c = 0; c < cols; ++c) { + VTermScreenCell cell; + vterm_screen_get_cell(m_vtermScreen, {vr, c}, &cell); + if (cell.chars[0] != 0) { + line[c] = QChar(static_cast(cell.chars[0] & 0xFFFF)); + } + } + } + } + QRegularExpression re(m_config.wordSelectionRegex); + if (re.isValid()) { + QRegularExpressionMatchIterator it = re.globalMatch(line); + while (it.hasNext()) { + QRegularExpressionMatch m = it.next(); + if (cc >= m.capturedStart() && cc < m.capturedEnd()) { + m_selectionStart = {vp.row, static_cast(m.capturedStart())}; + m_selectionEnd = {vp.row, static_cast(m.capturedEnd() - 1)}; + if (m_config.copyOnSelect) { + copyToClipboard(); + } + break; + } + } + } + damageAll(); + e->accept(); +} + +void KodoTerm::mouseMoveEvent(QMouseEvent *e) { + VTermModifier m = VTERM_MOD_NONE; + if (e->modifiers() & Qt::ShiftModifier) { + m = (VTermModifier)(m | VTERM_MOD_SHIFT); + } + if (e->modifiers() & Qt::ControlModifier) { + m = (VTermModifier)(m | VTERM_MOD_CTRL); + } + if (e->modifiers() & Qt::AltModifier) { + m = (VTermModifier)(m | VTERM_MOD_ALT); + } + VTermPos vp = mouseToPos(e->pos()); + int r = e->pos().y() / m_cellSize.height(), c = e->pos().x() / m_cellSize.width(); + if (m_mouseMode > 0 && !(e->modifiers() & Qt::ShiftModifier)) { + vterm_mouse_move(m_vterm, r, c, m); + vterm_screen_flush_damage(m_vtermScreen); + return; + } + if (m_selecting) { + m_selectionEnd = vp; + damageAll(); + } + QWidget::mouseMoveEvent(e); +} + +void KodoTerm::mouseReleaseEvent(QMouseEvent *e) { + VTermModifier m = VTERM_MOD_NONE; + if (e->modifiers() & Qt::ShiftModifier) { + m = (VTermModifier)(m | VTERM_MOD_SHIFT); + } + if (e->modifiers() & Qt::ControlModifier) { + m = (VTermModifier)(m | VTERM_MOD_CTRL); + } + if (e->modifiers() & Qt::AltModifier) { + m = (VTermModifier)(m | VTERM_MOD_ALT); + } + int r = e->pos().y() / m_cellSize.height(), c = e->pos().x() / m_cellSize.width(); + if (m_mouseMode > 0 && !(e->modifiers() & Qt::ShiftModifier)) { + int b = 0; + if (e->button() == Qt::LeftButton) { + b = 1; + } else if (e->button() == Qt::MiddleButton) { + b = 2; + } else if (e->button() == Qt::RightButton) { + b = 3; + } + if (b > 0) { + vterm_mouse_move(m_vterm, r, c, m); + vterm_mouse_button(m_vterm, b, false, m); + vterm_screen_flush_damage(m_vtermScreen); + e->accept(); + return; + } + } + if (e->button() == Qt::LeftButton && m_selecting) { + m_selecting = false; + m_selectionEnd = mouseToPos(e->pos()); + if (m_selectionStart.row == m_selectionEnd.row && + m_selectionStart.col == m_selectionEnd.col) { + m_selectionStart = {-1, -1}; + m_selectionEnd = {-1, -1}; + } else if (m_config.copyOnSelect) { + copyToClipboard(); + } + damageAll(); + } + e->accept(); +} + +VTermPos KodoTerm::mouseToPos(const QPoint &p) const { + if (m_cellSize.width() <= 0 || m_cellSize.height() <= 0) { + return {0, 0}; + } + int r = p.y() / m_cellSize.height(), c = p.x() / m_cellSize.width(), + sb = (int)m_scrollback.size(), cur = m_scrollBar->value(); + VTermPos vp; + vp.row = cur + r; + vp.col = c; + return vp; +} + +bool KodoTerm::isSelected(int r, int c) const { + if (m_selectionStart.row == -1) { + return false; + } + VTermPos s = m_selectionStart, e = m_selectionEnd; + if (s.row > e.row || (s.row == e.row && s.col > e.col)) { + std::swap(s, e); + } + if (r < s.row || r > e.row) { + return false; + } + if (r == s.row && r == e.row) { + return c >= s.col && c <= e.col; + } + if (r == s.row) { + return c >= s.col; + } + if (r == e.row) { + return c <= e.col; + } + return true; +} + +QString KodoTerm::getTextRange(VTermPos s, VTermPos e) { + if (s.row > e.row || (s.row == e.row && s.col > e.col)) { + std::swap(s, e); + } + QString t; + int sb = (int)m_scrollback.size(), rs, cs; + vterm_get_size(m_vterm, &rs, &cs); + for (int r = s.row; r <= e.row; ++r) { + int sc = (r == s.row) ? s.col : 0, ec = (r == e.row) ? e.col : 1000; + if (r < sb) { + const SavedLine &l = m_scrollback[r]; + for (int c = sc; c <= ec && c < (int)l.size(); ++c) { + for (int i = 0; i < VTERM_MAX_CHARS_PER_CELL && l[c].chars[i]; ++i) { + t.append(QChar::fromUcs4(l[c].chars[i])); + } + } + } else { + int vr = r - sb; + if (vr < rs) { + for (int c = sc; c <= ec && c < cs; ++c) { + VTermScreenCell cell; + vterm_screen_get_cell(m_vtermScreen, {vr, c}, &cell); + for (int i = 0; i < VTERM_MAX_CHARS_PER_CELL && cell.chars[i]; ++i) { + t.append(QChar::fromUcs4(cell.chars[i])); + } + } + } + } + if (r < e.row) { + t.append('\n'); + } + } + return t; +} + +void KodoTerm::copyToClipboard() { + if (m_selectionStart.row != -1) { + QApplication::clipboard()->setText(getTextRange(m_selectionStart, m_selectionEnd)); + } +} +void KodoTerm::pasteFromClipboard() { + QString t = QApplication::clipboard()->text(); + if (!t.isEmpty()) { + m_pty->write(t.toUtf8()); + } +} +void KodoTerm::selectAll() { + int rs, cs; + vterm_get_size(m_vterm, &rs, &cs); + int sb = (int)m_scrollback.size(); + m_selectionStart = {0, 0}; + m_selectionEnd = {sb + rs - 1, cs - 1}; + damageAll(); +} +void KodoTerm::clearScrollback() { + m_scrollback.clear(); + m_scrollBar->setRange(0, 0); + m_scrollBar->setValue(0); + damageAll(); +} +void KodoTerm::resetTerminal() { + vterm_screen_reset(m_vtermScreen, 1); + m_flowControlStopped = false; + if (m_vterm && !m_backBuffer.isNull()) { + VTermState *state = vterm_obtain_state(m_vterm); + VTermColor dfg, dbg; + vterm_state_get_default_colors(state, &dfg, &dbg); + m_backBuffer.fill(mapColor(dbg, state)); + } + clearScrollback(); + damageAll(); +} +void KodoTerm::openFileBrowser() { + if (!m_cwd.isEmpty()) { + QDir d(m_cwd); + if (d.exists()) { + QDesktopServices::openUrl(QUrl::fromLocalFile(d.absolutePath())); + } + } +} +void KodoTerm::kill() { + if (m_pty) { + m_pty->kill(); + } +} +void KodoTerm::logData(const QByteArray &d) { + if (m_logFile.isOpen()) { + m_logFile.write(d); + m_logFile.flush(); + } +} +void KodoTerm::scrollToBottom() { + if (m_scrollBar) { + m_scrollBar->setValue(m_scrollBar->maximum()); + } +} + +void KodoTerm::contextMenuEvent(QContextMenuEvent *e) { + if (m_mouseMode > 0 && !(QGuiApplication::keyboardModifiers() & Qt::ShiftModifier)) { + return; + } + auto *m = new QMenu(this); + auto *cA = m->addAction(tr("Copy"), this, &KodoTerm::copyToClipboard); + cA->setEnabled(m_selectionStart.row != -1); + cA->setShortcut(QKeySequence(Qt::CTRL | Qt::SHIFT | Qt::Key_C)); + auto *pA = m->addAction(tr("Paste"), this, &KodoTerm::pasteFromClipboard); + pA->setEnabled(!QApplication::clipboard()->text().isEmpty()); + pA->setShortcut(QKeySequence(Qt::CTRL | Qt::SHIFT | Qt::Key_V)); + m->addSeparator(); + m->addAction(tr("Select All"), this, &KodoTerm::selectAll); + m->addSeparator(); + m->addAction(tr("Clear Scrollback"), this, &KodoTerm::clearScrollback); + m->addAction(tr("Reset"), this, &KodoTerm::resetTerminal); + m->addSeparator(); + auto *oB = m->addAction(tr("Open current directory in file browser"), this, + &KodoTerm::openFileBrowser); + oB->setEnabled(!m_cwd.isEmpty() && QDir(m_cwd).exists()); + m->addSeparator(); + m->addAction(tr("Zoom In"), this, &KodoTerm::zoomIn); + m->addAction(tr("Zoom Out"), this, &KodoTerm::zoomOut); + m->addAction(tr("Reset Zoom"), this, &KodoTerm::resetZoom); + m->addSeparator(); + auto *tM = m->addMenu(tr("Themes")); + auto tC = [this](const TerminalTheme::ThemeInfo &i) { + setTheme(TerminalTheme::loadTheme(i.path)); + }; + populateThemeMenu(tM, tr("Konsole"), TerminalTheme::ThemeFormat::Konsole, tC); + populateThemeMenu(tM, tr("Windows Terminal"), TerminalTheme::ThemeFormat::WindowsTerminal, tC); + populateThemeMenu(tM, tr("iTerm"), TerminalTheme::ThemeFormat::ITerm, tC); + emit contextMenuRequested(m, e->globalPos()); + m->exec(e->globalPos()); + delete m; +} + +void KodoTerm::zoomIn() { + qreal s = m_config.font.pointSizeF(); + if (s <= 0) { + s = m_config.font.pointSize(); + } + m_config.font.setPointSizeF(s + 1.0); + m_config.font.setStyleStrategy(m_config.textAntialiasing ? QFont::PreferAntialias + : QFont::NoAntialias); + setFont(m_config.font); + updateTerminalSize(); + update(); +} +void KodoTerm::zoomOut() { + qreal s = m_config.font.pointSizeF(); + if (s <= 0) { + s = m_config.font.pointSize(); + } + if (s > 1.0) { + m_config.font.setPointSizeF(s - 1.0); + m_config.font.setStyleStrategy(m_config.textAntialiasing ? QFont::PreferAntialias + : QFont::NoAntialias); + setFont(m_config.font); + updateTerminalSize(); + update(); + } +} +void KodoTerm::resetZoom() { + m_config.font.setPointSize(10); + m_config.font.setStyleStrategy(m_config.textAntialiasing ? QFont::PreferAntialias + : QFont::NoAntialias); + setFont(m_config.font); + updateTerminalSize(); + update(); +} +QString KodoTerm::foregroundProcessName() const { + return m_pty ? m_pty->foregroundProcessName() : QString(); +} +bool KodoTerm::isRoot() const { return m_pty && m_pty->isRoot(); } + +QColor KodoTerm::mapColor(const VTermColor &c, const VTermState *s) const { + if (VTERM_COLOR_IS_RGB(&c)) { + if (c.rgb.red == m_lastVTermFg.rgb.red && c.rgb.green == m_lastVTermFg.rgb.green && + c.rgb.blue == m_lastVTermFg.rgb.blue) { + return m_lastFg; + } + if (c.rgb.red == m_lastVTermBg.rgb.red && c.rgb.green == m_lastVTermBg.rgb.green && + c.rgb.blue == m_lastVTermBg.rgb.blue) { + return m_lastBg; + } + QColor col(c.rgb.red, c.rgb.green, c.rgb.blue); + m_lastVTermBg = m_lastVTermFg; + m_lastBg = m_lastFg; + m_lastVTermFg = c; + m_lastFg = col; + return col; + } else if (VTERM_COLOR_IS_INDEXED(&c)) { + uint8_t i = c.indexed.idx; + if (!m_paletteCacheValid[i]) { + VTermColor rgb = c; + vterm_state_convert_color_to_rgb(s, &rgb); + m_paletteCache[i] = QColor(rgb.rgb.red, rgb.rgb.green, rgb.rgb.blue); + m_paletteCacheValid[i] = true; + } + return m_paletteCache[i]; + } + return Qt::white; +} + +void KodoTerm::paintEvent(QPaintEvent *e) { + QElapsedTimer timer; + timer.start(); + + // Ensure backbuffer resolution matches current screen resolution + if (!m_backBuffer.isNull() && m_backBuffer.devicePixelRatio() != devicePixelRatioF()) { + updateTerminalSize(); + } + + if (m_dirty && !m_restoring) { + renderToBackbuffer(); + } + QPainter painter(this); + // Fill background to cover gaps + if (m_vterm) { + VTermState *state = vterm_obtain_state(m_vterm); + VTermColor dfg, dbg; + vterm_state_get_default_colors(state, &dfg, &dbg); + painter.fillRect(rect(), mapColor(dbg, state)); + } + + if (!m_restoring && !m_backBuffer.isNull()) { + painter.setRenderHint(QPainter::Antialiasing, false); + painter.drawImage(0, 0, m_backBuffer); + } + + if (m_restorationBannerActive) { + drawRestorationBanner(painter); + } + + if (m_restoring) { + return; + } + int sb = (int)m_scrollback.size(), cur = m_scrollBar->value(); + if (hasFocus() && m_cursorVisible && cur == sb && (!m_cursorBlink || m_cursorBlinkState)) { + QRect r(m_cursorCol * m_cellSize.width(), m_cursorRow * m_cellSize.height(), + m_cellSize.width(), m_cellSize.height()); + painter.setCompositionMode(QPainter::CompositionMode_Difference); + switch (m_cursorShape) { + case 2: + case 3: + painter.fillRect(r.x(), r.y() + r.height() - 2, r.width(), 2, Qt::white); + break; + case 4: + case 5: + painter.fillRect(r.x(), r.y(), 2, r.height(), Qt::white); + break; + case 1: + default: + painter.fillRect(r, Qt::white); + break; + } + painter.setCompositionMode(QPainter::CompositionMode_SourceOver); + } + if (m_visualBellActive) { + painter.setCompositionMode(QPainter::CompositionMode_Difference); + painter.fillRect(rect(), Qt::white); + painter.setCompositionMode(QPainter::CompositionMode_SourceOver); + } + if (m_flowControlStopped) { + QString m = tr("Terminal stopped (Ctrl+S). Press Ctrl+Q to resume."); + QFont f = font(); + f.setBold(true); + painter.setFont(f); + painter.setRenderHint(QPainter::TextAntialiasing, m_config.textAntialiasing); + painter.setRenderHint(QPainter::Antialiasing, m_config.textAntialiasing); + QFontMetrics fm(f); + QRect r = fm.boundingRect(m).adjusted(-5, -2, 5, 2); + r.moveCenter(QPoint(width() / 2, r.height() / 2 + 10)); + painter.fillRect(r, Qt::yellow); + painter.setPen(Qt::black); + painter.drawText(r, Qt::AlignCenter, m); + } + + qint64 ns = timer.nsecsElapsed(); + double ms = ns / 1000000.0; + m_avgDrawTime = (m_avgDrawTime == 0.0) ? ms : (m_avgDrawTime * 0.9 + ms * 0.1); + + /* auto r = rect().adjusted(0, 0, -5, -5); + painter.setPen(Qt::red); + //painter.fillRect(r, Qt::yellow); + painter.setCompositionMode(QPainter::CompositionMode_SourceOver); + painter.drawText(r, Qt::AlignBottom | Qt::AlignRight, QString::number(m_avgDrawTime, 'f', 2) + + " ms"); qDebug() << "Average draw time" << QString::number(m_avgDrawTime, 'f', 2); + */ +} + +void KodoTerm::keyPressEvent(QKeyEvent *e) { + VTermModifier m = VTERM_MOD_NONE; + if (e->modifiers() & Qt::ShiftModifier) { + m = (VTermModifier)(m | VTERM_MOD_SHIFT); + } + if (e->modifiers() & Qt::ControlModifier) { + m = (VTermModifier)(m | VTERM_MOD_CTRL); + } + if (e->modifiers() & Qt::AltModifier) { + m = (VTermModifier)(m | VTERM_MOD_ALT); + } + int k = e->key(); + if (k >= Qt::Key_F1 && k <= Qt::Key_F12) { + vterm_keyboard_key(m_vterm, (VTermKey)(VTERM_KEY_FUNCTION(1 + k - Qt::Key_F1)), m); + } else { + switch (k) { + case Qt::Key_Enter: + case Qt::Key_Return: + vterm_keyboard_key(m_vterm, VTERM_KEY_ENTER, m); + break; + case Qt::Key_Backspace: + vterm_keyboard_key(m_vterm, VTERM_KEY_BACKSPACE, m); + break; + case Qt::Key_Tab: + vterm_keyboard_key(m_vterm, VTERM_KEY_TAB, m); + break; + case Qt::Key_Escape: + vterm_keyboard_key(m_vterm, VTERM_KEY_ESCAPE, m); + break; + case Qt::Key_Up: + vterm_keyboard_key(m_vterm, VTERM_KEY_UP, m); + break; + case Qt::Key_Down: + vterm_keyboard_key(m_vterm, VTERM_KEY_DOWN, m); + break; + case Qt::Key_Left: + vterm_keyboard_key(m_vterm, VTERM_KEY_LEFT, m); + break; + case Qt::Key_Right: + vterm_keyboard_key(m_vterm, VTERM_KEY_RIGHT, m); + break; + case Qt::Key_PageUp: + if (e->modifiers() & Qt::ShiftModifier) { + pageUp(); + } else { + vterm_keyboard_key(m_vterm, VTERM_KEY_PAGEUP, m); + } + break; + case Qt::Key_PageDown: + if (e->modifiers() & Qt::ShiftModifier) { + pageDown(); + } else { + vterm_keyboard_key(m_vterm, VTERM_KEY_PAGEDOWN, m); + } + break; + case Qt::Key_Home: + if (e->modifiers() & Qt::ShiftModifier) { + m_scrollBar->setValue(m_scrollBar->minimum()); + } else { + vterm_keyboard_key(m_vterm, VTERM_KEY_HOME, m); + } + break; + case Qt::Key_End: + if (e->modifiers() & Qt::ShiftModifier) { + m_scrollBar->setValue(m_scrollBar->maximum()); + } else { + vterm_keyboard_key(m_vterm, VTERM_KEY_END, m); + } + break; + case Qt::Key_Insert: + vterm_keyboard_key(m_vterm, VTERM_KEY_INS, m); + break; + case Qt::Key_Delete: + vterm_keyboard_key(m_vterm, VTERM_KEY_DEL, m); + break; + default: + if (e->modifiers() & Qt::ControlModifier) { + if (k == Qt::Key_Plus || k == Qt::Key_Equal) { + zoomIn(); + return; + } else if (k == Qt::Key_Minus) { + zoomOut(); + return; + } else if (k == Qt::Key_0) { + resetZoom(); + return; + } + } + if ((e->modifiers() & Qt::ControlModifier) && (e->modifiers() & Qt::ShiftModifier)) { + if (k == Qt::Key_C) { + copyToClipboard(); + return; + } else if (k == Qt::Key_V) { + pasteFromClipboard(); + return; + } + } + if ((m & VTERM_MOD_CTRL) && k >= Qt::Key_A && k <= Qt::Key_Z) { + if (k == Qt::Key_S) { + m_flowControlStopped = true; + update(); + } else if (k == Qt::Key_Q) { + m_flowControlStopped = false; + update(); + } + vterm_keyboard_unichar(m_vterm, k - Qt::Key_A + 1, VTERM_MOD_NONE); + } else if (!e->text().isEmpty()) { + for (const QChar &qc : e->text()) { + vterm_keyboard_unichar(m_vterm, qc.unicode(), m); + } + } + break; + } + } +} + +bool KodoTerm::focusNextPrevChild(bool n) { return false; } + +void KodoTerm::focusInEvent(QFocusEvent *e) { + QWidget::focusInEvent(e); + m_cursorBlinkState = true; + m_cursorBlinkTimer->start(); +} +void KodoTerm::focusOutEvent(QFocusEvent *e) { + QWidget::focusOutEvent(e); + m_cursorBlinkTimer->stop(); +} + +void KodoTerm::populateThemeMenu(QMenu *pM, const QString &t, TerminalTheme::ThemeFormat f, + const std::function &c) { + QList ths = TerminalTheme::builtInThemes(); + QList fT; + for (const auto &theme : ths) { + if (theme.format == f) { + fT.append(theme); + } + } + if (fT.isEmpty()) { + return; + } + QMenu *mT = pM->addMenu(t); + auto aTA = [&](QMenu *m, const TerminalTheme::ThemeInfo &i) { + m->addAction(i.name, [c, i]() { c(i); }); + }; + if (fT.size() < 26) { + for (const auto &i : fT) { + aTA(mT, i); + } + } else { + QMap sM; + for (const auto &i : fT) { + QChar fLC = i.name.isEmpty() ? QChar('#') : i.name[0].toUpper(); + if (!fLC.isLetter()) { + fLC = QChar('#'); + } + QString fL(fLC); + if (!sM.contains(fL)) { + sM[fL] = mT->addMenu(fL); + } + aTA(sM[fL], i); + } + } +} + +static QDataStream &operator<<(QDataStream &out, const VTermColor &c) { + out << (quint8)c.type; + if (c.type == VTERM_COLOR_RGB) { + out << c.rgb.red << c.rgb.green << c.rgb.blue; + } else if (c.type == VTERM_COLOR_INDEXED) { + out << c.indexed.idx; + } + return out; +} + +static QDataStream &operator>>(QDataStream &in, VTermColor &c) { + quint8 t; + in >> t; + c.type = (VTermColorType)t; + if (c.type == VTERM_COLOR_RGB) { + in >> c.rgb.red >> c.rgb.green >> c.rgb.blue; + } else if (c.type == VTERM_COLOR_INDEXED) { + in >> c.indexed.idx; + } + return in; +} + +void KodoTerm::saveState(const QString &path) { + QFile f(path); + if (!f.open(QIODevice::WriteOnly)) { + return; + } + QDataStream out(&f); + out << (quint32)0x4B4F444F; // "KODO" + out << (quint32)3; // Version 3 + out << (quint32)m_cursorRow << (quint32)m_cursorCol; + out << (quint32)m_scrollback.size(); + for (const auto &line : m_scrollback) { + out << (quint32)line.size(); + if (!line.empty()) { + out.writeRawData((const char *)line.data(), line.size() * sizeof(SavedCell)); + } + } + + // Save current screen + int rows, cols; + vterm_get_size(m_vterm, &rows, &cols); + out << (quint32)rows << (quint32)cols; + for (int r = 0; r < rows; ++r) { + for (int c = 0; c < cols; ++c) { + VTermScreenCell cell; + vterm_screen_get_cell(m_vtermScreen, {r, c}, &cell); + // Save as SavedCell for consistency/speed? + // VTermScreenCell and SavedCell are slightly different. + // SavedCell has fixed char array. VTermScreenCell has uint32_t + // chars[VTERM_MAX_CHARS_PER_CELL]. SavedCell definition: uint32_t + // chars[VTERM_MAX_CHARS_PER_CELL]; ... They are structurally nearly identical. Let's + // stick to safe member-wise save for screen (it's small, 25x80). + out.writeRawData((const char *)cell.chars, sizeof(cell.chars)); + quint32 attrs = 0; + memcpy(&attrs, &cell.attrs, std::min(sizeof(attrs), sizeof(cell.attrs))); + out << attrs; + out << cell.fg << cell.bg << (quint32)cell.width; + } + } +} + +void KodoTerm::loadState(const QString &path) { + m_restoring = true; + QFile f(path); + if (!f.open(QIODevice::ReadOnly)) { + m_restoring = false; + return; + } + QDataStream in(&f); + quint32 magic, ver; + in >> magic >> ver; + if (magic != 0x4B4F444F) { + m_restoring = false; + return; + } + + quint32 cR = 0, cC = 0; + if (ver >= 2) { + in >> cR >> cC; + } + + quint32 sbSize; + in >> sbSize; + m_scrollback.clear(); + // Fast path for Version 3+ + if (ver >= 3) { + for (quint32 i = 0; i < sbSize; ++i) { + quint32 lineSize; + in >> lineSize; + SavedLine line; + line.resize(lineSize); + if (lineSize > 0) { + in.readRawData((char *)line.data(), lineSize * sizeof(SavedCell)); + } + m_scrollback.push_back(std::move(line)); + } + } else { + // Slow path for older versions + for (quint32 i = 0; i < sbSize; ++i) { + quint32 lineSize; + in >> lineSize; + SavedLine line; + line.resize(lineSize); + for (quint32 j = 0; j < lineSize; ++j) { + in.readRawData((char *)line[j].chars, sizeof(line[j].chars)); + quint32 attrs; + in >> attrs; + memcpy(&line[j].attrs, &attrs, std::min(sizeof(attrs), sizeof(line[j].attrs))); + in >> line[j].fg >> line[j].bg; + quint32 width; + in >> width; + line[j].width = width; + } + m_scrollback.push_back(std::move(line)); + } + } + + // Load screen lines and replay to vterm + quint32 rows, cols; + in >> rows >> cols; + QByteArray replayData; + + for (quint32 r = 0; r < rows; ++r) { + for (quint32 c = 0; c < cols; ++c) { + SavedCell cell; + in.readRawData((char *)cell.chars, sizeof(cell.chars)); + quint32 attrs; + in >> attrs; + in >> cell.fg >> cell.bg; + quint32 width; + in >> width; + + // Replay Logic + if (cell.chars[0] == 0) { + replayData.append(' '); + } else { + if (cell.fg.type == VTERM_COLOR_RGB) { + replayData.append(QString("\033[38;2;%1;%2;%3m") + .arg(cell.fg.rgb.red) + .arg(cell.fg.rgb.green) + .arg(cell.fg.rgb.blue) + .toUtf8()); + } + if (cell.bg.type == VTERM_COLOR_RGB) { + replayData.append(QString("\033[48;2;%1;%2;%3m") + .arg(cell.bg.rgb.red) + .arg(cell.bg.rgb.green) + .arg(cell.bg.rgb.blue) + .toUtf8()); + } + int n = 0; + while (n < VTERM_MAX_CHARS_PER_CELL && cell.chars[n]) { + n++; + } + if (n > 0) { + replayData.append(QString::fromUcs4((const char32_t *)cell.chars, n).toUtf8()); + } + } + if (width > 1) { + c += (width - 1); + } + } + replayData.append("\r\n"); + } + replayData.append("\033[0m"); + + if (ver >= 2) { + replayData.append(QString("\033[%1;%2H").arg(cR + 1).arg(cC + 1).toUtf8()); + } + + vterm_input_write(m_vterm, replayData.constData(), replayData.size()); + + m_scrollBar->setRange(0, (int)m_scrollback.size()); + m_scrollBar->setValue(m_scrollBar->maximum()); + damageAll(); + m_restoring = false; + update(); +} diff --git a/third_party/KodoTerm/src/KodoTermConfig.cpp b/third_party/KodoTerm/src/KodoTermConfig.cpp new file mode 100644 index 0000000..1581485 --- /dev/null +++ b/third_party/KodoTerm/src/KodoTermConfig.cpp @@ -0,0 +1,456 @@ +// SPDX-License-Identifier: MIT +// Author: Diego Iastrubni + +#include "KodoTerm/KodoTermConfig.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +TerminalTheme TerminalTheme::defaultTheme() { + return {"Default", + QColor(170, 170, 170), + QColor(0, 0, 0), + {QColor(0, 0, 0), QColor(170, 0, 0), QColor(0, 170, 0), QColor(170, 85, 0), + QColor(0, 0, 170), QColor(170, 0, 170), QColor(0, 170, 170), QColor(170, 170, 170), + QColor(85, 85, 85), QColor(255, 85, 85), QColor(85, 255, 85), QColor(255, 255, 85), + QColor(85, 85, 255), QColor(255, 85, 255), QColor(85, 255, 255), + QColor(255, 255, 255)}}; +} + +TerminalTheme TerminalTheme::loadTheme(const QString &path) { + if (path.endsWith(".colorscheme")) { + return loadKonsoleTheme(path); + } else if (path.endsWith(".itermcolors")) { + return loadITermTheme(path); + } else if (path.endsWith(".json")) { + return loadWindowsTerminalTheme(path); + } + + // Fallback: try to guess content or return default + return defaultTheme(); +} + +TerminalTheme TerminalTheme::loadKonsoleTheme(const QString &path) { + TerminalTheme theme = defaultTheme(); + QFile file(path); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + return theme; + } + + theme.name = QFileInfo(path).baseName(); + auto parseColor = [](const QString &s) -> QColor { + QStringList parts = s.split(','); + if (parts.size() >= 3) { + return QColor(parts[0].toInt(), parts[1].toInt(), parts[2].toInt()); + } + return QColor(); + }; + + QMap> sections; + QString currentSection; + QTextStream in(&file); + while (!in.atEnd()) { + QString line = in.readLine().trimmed(); + if (line.isEmpty() || line.startsWith(';')) { + continue; + } + if (line.startsWith('[') && line.endsWith(']')) { + currentSection = line.mid(1, line.length() - 2); + } else if (!currentSection.isEmpty()) { + int eq = line.indexOf('='); + if (eq != -1) { + QString key = line.left(eq).trimmed(); + QString value = line.mid(eq + 1).trimmed(); + sections[currentSection][key] = value; + } + } + } + + if (sections.contains("General") && sections["General"].contains("Description")) { + theme.name = sections["General"]["Description"]; + } + + QColor fg = parseColor(sections["Foreground"]["Color"]); + if (fg.isValid()) { + theme.foreground = fg; + } + + QColor bg = parseColor(sections["Background"]["Color"]); + if (bg.isValid()) { + theme.background = bg; + } + + for (int i = 0; i < 16; ++i) { + QString section = QString("Color%1%2").arg(i % 8).arg(i >= 8 ? "Intense" : ""); + QColor c = parseColor(sections[section]["Color"]); + if (c.isValid()) { + theme.palette[i] = c; + } + } + + return theme; +} + +TerminalTheme TerminalTheme::loadWindowsTerminalTheme(const QString &path) { + TerminalTheme theme = defaultTheme(); + QFile file(path); + if (!file.open(QIODevice::ReadOnly)) { + return theme; + } + + QJsonDocument doc = QJsonDocument::fromJson(file.readAll()); + QJsonObject obj = doc.object(); + if (obj.contains("name")) { + theme.name = obj.value("name").toString(); + } + if (obj.contains("foreground")) { + theme.foreground = QColor(obj.value("foreground").toString()); + } + if (obj.contains("background")) { + theme.background = QColor(obj.value("background").toString()); + } + QStringList keys = {"black", "red", "green", "yellow", + "blue", "purple", "cyan", "white", + "brightBlack", "brightRed", "brightGreen", "brightYellow", + "brightBlue", "brightPurple", "brightCyan", "brightWhite"}; + for (int i = 0; i < 16; ++i) { + if (obj.contains(keys[i])) { + QColor c(obj.value(keys[i]).toString()); + if (c.isValid()) { + theme.palette[i] = c; + } + } + } + return theme; +} + +TerminalTheme TerminalTheme::loadITermTheme(const QString &path) { + TerminalTheme theme = defaultTheme(); + theme.name = QFileInfo(path).baseName(); + QFile file(path); + if (!file.open(QIODevice::ReadOnly)) { + return theme; + } + + QXmlStreamReader xml(&file); + if (xml.readNextStartElement() && xml.name() == QLatin1String("plist")) { + if (xml.readNextStartElement() && xml.name() == QLatin1String("dict")) { + while (xml.readNextStartElement()) { + if (xml.name() == QLatin1String("key")) { + QString keyName = xml.readElementText(); + if (xml.readNextStartElement()) { + if (xml.name() == QLatin1String("dict")) { + double red = 0.0, green = 0.0, blue = 0.0; + while (xml.readNextStartElement()) { + if (xml.name() == QLatin1String("key")) { + QString componentKey = xml.readElementText(); + if (xml.readNextStartElement()) { + if (xml.name() == QLatin1String("real")) { + double val = xml.readElementText().toDouble(); + if (componentKey == "Red Component") { + red = val; + } else if (componentKey == "Green Component") { + green = val; + } else if (componentKey == "Blue Component") { + blue = val; + } + } else { + xml.skipCurrentElement(); + } + } + } else { + xml.skipCurrentElement(); + } + } + QColor color; + color.setRgbF(red, green, blue); + + if (keyName == "Background Color") { + theme.background = color; + } else if (keyName == "Foreground Color") { + theme.foreground = color; + } else if (keyName.startsWith("Ansi ") && keyName.endsWith(" Color")) { + int index = keyName.mid(5, keyName.length() - 11).toInt(); + if (index >= 0 && index < 16) { + theme.palette[index] = color; + } + } + } else { + xml.skipCurrentElement(); + } + } + } else { + xml.skipCurrentElement(); + } + } + } + } + return theme; +} + +QList TerminalTheme::builtInThemes() { + Q_INIT_RESOURCE(KodoTermThemes); + QList themes; + QDirIterator it(":/KodoTermThemes", + QStringList() << "*.colorscheme" << "*.json" << "*.itermcolors", QDir::Files, + QDirIterator::Subdirectories); + while (it.hasNext()) { + it.next(); + ThemeInfo info; + info.path = it.filePath(); + if (info.path.endsWith(".colorscheme")) { + info.format = ThemeFormat::Konsole; + QSettings settings(info.path, QSettings::IniFormat); + info.name = settings.value("General/Description", it.fileName()).toString(); + } else if (info.path.endsWith(".itermcolors")) { + info.format = ThemeFormat::ITerm; + info.name = QFileInfo(info.path).baseName(); + // Optional: Parse the file to find "Name" comment if available, but filename is usually + // good enough. + } else { + info.format = ThemeFormat::WindowsTerminal; + QFile file(info.path); + if (file.open(QIODevice::ReadOnly)) { + QJsonDocument doc = QJsonDocument::fromJson(file.readAll()); + info.name = doc.object().value("name").toString(); + } + if (info.name.isEmpty()) { + info.name = it.fileName(); + } + } + themes.append(info); + } + std::sort(themes.begin(), themes.end(), [](const ThemeInfo &a, const ThemeInfo &b) { + return a.name.compare(b.name, Qt::CaseInsensitive) < 0; + }); + return themes; +} + +QJsonObject TerminalTheme::toJson() const { + QJsonObject obj; + obj["name"] = name; + obj["foreground"] = foreground.name(); + obj["background"] = background.name(); + QJsonArray paletteArray; + for (const auto &c : palette) { + paletteArray.append(c.name()); + } + obj["palette"] = paletteArray; + return obj; +} + +TerminalTheme TerminalTheme::fromJson(const QJsonObject &json) { + TerminalTheme theme = defaultTheme(); + if (json.contains("name")) { + theme.name = json["name"].toString(); + } + if (json.contains("foreground")) { + theme.foreground = QColor(json["foreground"].toString()); + } + if (json.contains("background")) { + theme.background = QColor(json["background"].toString()); + } + if (json.contains("palette") && json["palette"].isArray()) { + QJsonArray arr = json["palette"].toArray(); + for (int i = 0; i < std::min(16, (int)arr.size()); ++i) { + theme.palette[i] = QColor(arr[i].toString()); + } + } + return theme; +} + +void TerminalTheme::save(QSettings &settings, const QString &group) const { + if (!group.isEmpty()) { + settings.beginGroup(group); + } + settings.setValue("name", name); + settings.setValue("foreground", foreground.name()); + settings.setValue("background", background.name()); + QStringList paletteList; + for (const auto &c : palette) { + paletteList << c.name(); + } + settings.setValue("palette", paletteList); + if (!group.isEmpty()) { + settings.endGroup(); + } +} + +void TerminalTheme::load(QSettings &settings, const QString &group) { + if (!group.isEmpty()) { + settings.beginGroup(group); + } + name = settings.value("name", "Default").toString(); + foreground = QColor(settings.value("foreground", "#aaaaaa").toString()); + background = QColor(settings.value("background", "#000000").toString()); + QStringList paletteList = settings.value("palette").toStringList(); + if (paletteList.size() >= 16) { + for (int i = 0; i < 16; ++i) { + palette[i] = QColor(paletteList[i]); + } + } else { + *this = defaultTheme(); // Fallback if palette is incomplete or missing + // Re-apply overrides if any + if (settings.contains("foreground")) { + foreground = QColor(settings.value("foreground").toString()); + } + if (settings.contains("background")) { + background = QColor(settings.value("background").toString()); + } + } + if (!group.isEmpty()) { + settings.endGroup(); + } +} + +KodoTermConfig::KodoTermConfig(QSettings &settings) { + setDefaults(); + load(settings); +} + +KodoTermConfig::KodoTermConfig() { setDefaults(); } + +void KodoTermConfig::setDefaults() { + font = QFont("Monospace", 10); + font.setStyleHint(QFont::Monospace); + font.setKerning(false); + textAntialiasing = false; + font.setStyleStrategy(QFont::NoAntialias); + + customBoxDrawing = false; + copyOnSelect = true; + pasteOnMiddleClick = true; + mouseWheelZoom = true; + visualBell = true; + audibleBell = true; + tripleClickSelectsLine = true; + enableLogging = true; + logDirectory = + QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + "/KodoShell"; + wordSelectionRegex = "[a-zA-Z0-9_\\.\\-\\/~\\:]+"; + maxScrollback = 1000; + theme = TerminalTheme::defaultTheme(); +} + +void KodoTermConfig::load(const QJsonObject &json) { + if (json.contains("font")) { + QJsonObject fontObj = json["font"].toObject(); + font.setFamily(fontObj["family"].toString()); + font.setPointSizeF(fontObj["size"].toDouble()); + } + if (json.contains("textAntialiasing")) { + textAntialiasing = json["textAntialiasing"].toBool(); + } + font.setKerning(false); + font.setStyleStrategy(textAntialiasing ? QFont::PreferAntialias : QFont::NoAntialias); + + if (json.contains("customBoxDrawing")) { + customBoxDrawing = json["customBoxDrawing"].toBool(); + } + if (json.contains("copyOnSelect")) { + copyOnSelect = json["copyOnSelect"].toBool(); + } + if (json.contains("pasteOnMiddleClick")) { + pasteOnMiddleClick = json["pasteOnMiddleClick"].toBool(); + } + if (json.contains("mouseWheelZoom")) { + mouseWheelZoom = json["mouseWheelZoom"].toBool(); + } + if (json.contains("visualBell")) { + visualBell = json["visualBell"].toBool(); + } + if (json.contains("audibleBell")) { + audibleBell = json["audibleBell"].toBool(); + } + if (json.contains("tripleClickSelectsLine")) { + tripleClickSelectsLine = json["tripleClickSelectsLine"].toBool(); + } + if (json.contains("enableLogging")) { + enableLogging = json["enableLogging"].toBool(); + } + if (json.contains("logDirectory")) { + logDirectory = json["logDirectory"].toString(); + } + if (json.contains("wordSelectionRegex")) { + wordSelectionRegex = json["wordSelectionRegex"].toString(); + } + if (json.contains("maxScrollback")) { + maxScrollback = json["maxScrollback"].toInt(); + } + if (json.contains("theme")) { + theme = TerminalTheme::fromJson(json["theme"].toObject()); + } +} + +QJsonObject KodoTermConfig::saveToJson() const { + QJsonObject obj; + QJsonObject fontObj; + fontObj["family"] = font.family(); + fontObj["size"] = font.pointSizeF(); + obj["font"] = fontObj; + obj["textAntialiasing"] = textAntialiasing; + obj["customBoxDrawing"] = customBoxDrawing; + obj["copyOnSelect"] = copyOnSelect; + obj["pasteOnMiddleClick"] = pasteOnMiddleClick; + obj["mouseWheelZoom"] = mouseWheelZoom; + obj["visualBell"] = visualBell; + obj["audibleBell"] = audibleBell; + obj["tripleClickSelectsLine"] = tripleClickSelectsLine; + obj["enableLogging"] = enableLogging; + obj["logDirectory"] = logDirectory; + obj["wordSelectionRegex"] = wordSelectionRegex; + obj["maxScrollback"] = maxScrollback; + obj["theme"] = theme.toJson(); + return obj; +} + +void KodoTermConfig::load(QSettings &settings) { + if (settings.contains("font/family")) { + font.setFamily(settings.value("font/family").toString()); + font.setPointSizeF(settings.value("font/size", 10).toDouble()); + } + textAntialiasing = settings.value("textAntialiasing", textAntialiasing).toBool(); + font.setKerning(false); + font.setStyleStrategy(textAntialiasing ? QFont::PreferAntialias : QFont::NoAntialias); + customBoxDrawing = settings.value("customBoxDrawing", customBoxDrawing).toBool(); + copyOnSelect = settings.value("copyOnSelect", copyOnSelect).toBool(); + pasteOnMiddleClick = settings.value("pasteOnMiddleClick", pasteOnMiddleClick).toBool(); + mouseWheelZoom = settings.value("mouseWheelZoom", mouseWheelZoom).toBool(); + visualBell = settings.value("visualBell", visualBell).toBool(); + audibleBell = settings.value("audibleBell", audibleBell).toBool(); + tripleClickSelectsLine = + settings.value("tripleClickSelectsLine", tripleClickSelectsLine).toBool(); + enableLogging = settings.value("enableLogging", enableLogging).toBool(); + logDirectory = settings.value("logDirectory", logDirectory).toString(); + wordSelectionRegex = settings.value("wordSelectionRegex", wordSelectionRegex).toString(); + maxScrollback = settings.value("maxScrollback", maxScrollback).toInt(); + theme.load(settings, "Theme"); +} + +void KodoTermConfig::save(QSettings &settings) const { + settings.setValue("font/family", font.family()); + settings.setValue("font/size", font.pointSizeF()); + settings.setValue("textAntialiasing", textAntialiasing); + settings.setValue("customBoxDrawing", customBoxDrawing); + settings.setValue("copyOnSelect", copyOnSelect); + settings.setValue("pasteOnMiddleClick", pasteOnMiddleClick); + settings.setValue("mouseWheelZoom", mouseWheelZoom); + settings.setValue("visualBell", visualBell); + settings.setValue("audibleBell", audibleBell); + settings.setValue("tripleClickSelectsLine", tripleClickSelectsLine); + settings.setValue("enableLogging", enableLogging); + settings.setValue("logDirectory", logDirectory); + settings.setValue("wordSelectionRegex", wordSelectionRegex); + settings.setValue("maxScrollback", maxScrollback); + theme.save(settings, "Theme"); +} diff --git a/third_party/KodoTerm/src/PtyProcess.cpp b/third_party/KodoTerm/src/PtyProcess.cpp new file mode 100644 index 0000000..9eb363f --- /dev/null +++ b/third_party/KodoTerm/src/PtyProcess.cpp @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +// Author: Diego Iastrubni + +#include "PtyProcess.h" +#include + +#if defined(Q_OS_UNIX) +#include "PtyProcess_unix.h" +#elif defined(Q_OS_WIN) +#include "PtyProcess_win.h" +#endif + +bool PtyProcess::start(const QString &program, const QStringList &arguments, const QSize &size) { + setProgram(program); + setArguments(arguments); + return start(size); +} + +PtyProcess *PtyProcess::create(QObject *parent) { +#if defined(Q_OS_UNIX) + return new PtyProcessUnix(parent); +#elif defined(Q_OS_WIN) + return new PtyProcessWin(parent); +#else + return nullptr; +#endif +} diff --git a/third_party/KodoTerm/src/PtyProcess.h b/third_party/KodoTerm/src/PtyProcess.h new file mode 100644 index 0000000..fe1086f --- /dev/null +++ b/third_party/KodoTerm/src/PtyProcess.h @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: MIT +// Author: Diego Iastrubni + +#pragma once + +#include +#include +#include +#include + +class PtyProcess : public QObject { + Q_OBJECT + + public: + explicit PtyProcess(QObject *parent = nullptr) : QObject(parent) {} + virtual ~PtyProcess() = default; + + void setProgram(const QString &program) { m_program = program; } + QString program() const { return m_program; } + + void setArguments(const QStringList &arguments) { m_arguments = arguments; } + QStringList arguments() const { return m_arguments; } + + void setWorkingDirectory(const QString &workingDirectory) { + m_workingDirectory = workingDirectory; + } + QString workingDirectory() const { return m_workingDirectory; } + + void setProcessEnvironment(const QProcessEnvironment &environment) { + m_environment = environment; + } + QProcessEnvironment processEnvironment() const { return m_environment; } + + virtual bool start(const QSize &size) = 0; + virtual bool start(const QString &program, const QStringList &arguments, const QSize &size); + virtual void write(const QByteArray &data) = 0; + virtual void resize(const QSize &size) = 0; + virtual void kill() = 0; + virtual bool isRoot() const = 0; + virtual QString foregroundProcessName() const = 0; + + // Factory method + static PtyProcess *create(QObject *parent = nullptr); + + signals: + void readyRead(const QByteArray &data); + void finished(int exitCode, int exitStatus); + + protected: + QString m_program; + QStringList m_arguments; + QString m_workingDirectory; + QProcessEnvironment m_environment = QProcessEnvironment::systemEnvironment(); +}; diff --git a/third_party/KodoTerm/src/PtyProcess_unix.cpp b/third_party/KodoTerm/src/PtyProcess_unix.cpp new file mode 100644 index 0000000..222b07b --- /dev/null +++ b/third_party/KodoTerm/src/PtyProcess_unix.cpp @@ -0,0 +1,184 @@ +// SPDX-License-Identifier: MIT +// Author: Diego Iastrubni + +#include "PtyProcess_unix.h" + +#include +#include +#if defined(__APPLE__) || defined(__FreeBSD__) +#include +#else +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include + +PtyProcessUnix::PtyProcessUnix(QObject *parent) : PtyProcess(parent) {} + +PtyProcessUnix::~PtyProcessUnix() { + kill(); + if (m_masterFd >= 0) { + ::close(m_masterFd); + m_masterFd = -1; + } +} + +bool PtyProcessUnix::start(const QSize &size) { + if (m_program.isEmpty()) { + return false; + } + + struct winsize ws; + ws.ws_row = (unsigned short)size.height(); + ws.ws_col = (unsigned short)size.width(); + ws.ws_xpixel = 0; + ws.ws_ypixel = 0; + + pid_t pid = forkpty(&m_masterFd, nullptr, nullptr, &ws); + + if (pid == -1) { + qWarning() << "Failed to forkpty"; + return false; + } + + if (pid == 0) { + // Child + // Working directory + if (!m_workingDirectory.isEmpty()) { + if (chdir(m_workingDirectory.toLocal8Bit().constData()) != 0) { + _exit(1); + } + } + + // Environment + for (const auto &key : m_environment.keys()) { + setenv(key.toLocal8Bit().constData(), + m_environment.value(key).toLocal8Bit().constData(), 1); + } + setenv("TERM", "xterm-256color", 1); + + // Convert args to char* array + std::vector args; + QByteArray progBytes = m_program.toLocal8Bit(); + args.push_back(progBytes.data()); + + // Helper to keep storage alive + std::vector storage; + storage.reserve(m_arguments.size()); + + for (const auto &arg : m_arguments) { + storage.push_back(arg.toLocal8Bit()); + args.push_back(storage.back().data()); + } + args.push_back(nullptr); + + execvp(m_program.toLocal8Bit().constData(), args.data()); + + // If execvp returns, it failed + _exit(1); + } else { + // Parent + m_pid = pid; + + m_notifier = new QSocketNotifier(m_masterFd, QSocketNotifier::Read, this); + connect(m_notifier, &QSocketNotifier::activated, this, &PtyProcessUnix::onReadyRead); + + return true; + } +} + +bool PtyProcessUnix::start(const QString &program, const QStringList &arguments, + const QSize &size) { + return PtyProcess::start(program, arguments, size); +} + +void PtyProcessUnix::write(const QByteArray &data) { + if (m_masterFd >= 0) { + ::write(m_masterFd, data.constData(), data.size()); + } +} + +void PtyProcessUnix::resize(const QSize &size) { + if (m_masterFd >= 0) { + struct winsize ws; + ws.ws_row = (unsigned short)size.height(); + ws.ws_col = (unsigned short)size.width(); + ws.ws_xpixel = 0; + ws.ws_ypixel = 0; + ioctl(m_masterFd, TIOCSWINSZ, &ws); + } +} + +void PtyProcessUnix::kill() { + if (m_pid > 0) { + ::kill(m_pid, SIGTERM); + // Wait? usually waitpid via signal handler, but for now just cleanup + m_pid = -1; + } +} + +bool PtyProcessUnix::isRoot() const { + if (m_masterFd < 0) { + return false; + } + + pid_t pgrp = tcgetpgrp(m_masterFd); + if (pgrp <= 0) { + // Fallback to initial pid + if (m_pid <= 0) { + return false; + } + pgrp = m_pid; + } + + struct stat st; + char path[64]; + snprintf(path, sizeof(path), "/proc/%d", (int)pgrp); + if (stat(path, &st) == 0) { + return st.st_uid == 0; + } + return false; +} + +QString PtyProcessUnix::foregroundProcessName() const { + if (m_masterFd < 0) { + return QString(); + } + + pid_t pgrp = tcgetpgrp(m_masterFd); + if (pgrp <= 0) { + return QFileInfo(m_program).baseName(); + } + + char path[64]; + snprintf(path, sizeof(path), "/proc/%d/comm", (int)pgrp); + QFile file(path); + if (file.open(QIODevice::ReadOnly)) { + return QString::fromUtf8(file.readAll().trimmed()); + } + + // Fallback to initial program + return QFileInfo(m_program).baseName(); +} + +void PtyProcessUnix::onReadyRead() { + char buffer[4096]; + ssize_t len = ::read(m_masterFd, buffer, sizeof(buffer)); + + if (len > 0) { + emit readyRead(QByteArray(buffer, (int)len)); + } else if (len < 0 && errno != EAGAIN) { + m_notifier->setEnabled(false); + emit finished(-1, -1); // Error + } else if (len == 0) { + m_notifier->setEnabled(false); + emit finished(0, 0); // EOF + } +} \ No newline at end of file diff --git a/third_party/KodoTerm/src/PtyProcess_unix.h b/third_party/KodoTerm/src/PtyProcess_unix.h new file mode 100644 index 0000000..df2f10e --- /dev/null +++ b/third_party/KodoTerm/src/PtyProcess_unix.h @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +// Author: Diego Iastrubni + +#pragma once + +#include "PtyProcess.h" +#include +#include + +class PtyProcessUnix : public PtyProcess { + Q_OBJECT + + public: + PtyProcessUnix(QObject *parent = nullptr); + ~PtyProcessUnix(); + + bool start(const QSize &size) override; + bool start(const QString &program, const QStringList &arguments, const QSize &size) override; + void write(const QByteArray &data) override; + void resize(const QSize &size) override; + void kill() override; + bool isRoot() const override; + QString foregroundProcessName() const override; + + private slots: + void onReadyRead(); + + private: + int m_masterFd = -1; + pid_t m_pid = -1; + QSocketNotifier *m_notifier = nullptr; +}; diff --git a/third_party/KodoTerm/src/PtyProcess_win.cpp b/third_party/KodoTerm/src/PtyProcess_win.cpp new file mode 100644 index 0000000..91bba15 --- /dev/null +++ b/third_party/KodoTerm/src/PtyProcess_win.cpp @@ -0,0 +1,229 @@ +// SPDX-License-Identifier: MIT +// Author: Diego Iastrubni + +#include "PtyProcess_win.h" +#include +#include +#include + +// Define necessary types if building on older SDKs or mingw that might lack them +// But assuming standard modern environment. + +class PtyProcessWin::ReaderThread : public QThread { + public: + ReaderThread(HANDLE hPipe, PtyProcessWin *parent) : m_hPipe(hPipe), m_parent(parent) {} + + void run() override { + char buffer[4096]; + DWORD bytesRead; + while (m_running) { + if (ReadFile(m_hPipe, buffer, sizeof(buffer), &bytesRead, NULL)) { + if (bytesRead > 0) { + QByteArray data(buffer, (int)bytesRead); + QMetaObject::invokeMethod(m_parent, "onReadThreadData", Qt::QueuedConnection, + Q_ARG(QByteArray, data)); + } else { + // EOF (bytesRead == 0) + break; + } + } else { + DWORD err = GetLastError(); + if (err == ERROR_BROKEN_PIPE || err == ERROR_HANDLE_EOF) { + break; + } + break; + } + } + } + + void stop() { m_running = false; } + + private: + HANDLE m_hPipe; + PtyProcessWin *m_parent; + bool m_running = true; +}; + +PtyProcessWin::PtyProcessWin(QObject *parent) : PtyProcess(parent) { + ZeroMemory(&m_pi, sizeof(PROCESS_INFORMATION)); + m_hPC = INVALID_HANDLE_VALUE; + m_hPipeIn = INVALID_HANDLE_VALUE; + m_hPipeOut = INVALID_HANDLE_VALUE; +} + +PtyProcessWin::~PtyProcessWin() { + kill(); // kill() now closes everything properly +} + +bool PtyProcessWin::start(const QSize &size) { + if (m_program.isEmpty()) { + return false; + } + + HANDLE hPipePTYIn = INVALID_HANDLE_VALUE; + HANDLE hPipePTYOut = INVALID_HANDLE_VALUE; + + // Create pipes + if (!CreatePipe(&hPipePTYIn, &m_hPipeOut, NULL, 0)) { + return false; + } + if (!CreatePipe(&m_hPipeIn, &hPipePTYOut, NULL, 0)) { + return false; + } + + // Create Pseudo Console + COORD origin = {(SHORT)size.width(), (SHORT)size.height()}; + HRESULT hr = CreatePseudoConsole(origin, hPipePTYIn, hPipePTYOut, 0, &m_hPC); + + // Close the sides we don't need + CloseHandle(hPipePTYIn); + CloseHandle(hPipePTYOut); + + if (FAILED(hr)) { + return false; + } + + // Prepare Startup Info + STARTUPINFOEX si; + ZeroMemory(&si, sizeof(STARTUPINFOEX)); + si.StartupInfo.cb = sizeof(STARTUPINFOEX); + + SIZE_T bytesRequired = 0; + InitializeProcThreadAttributeList(NULL, 1, 0, &bytesRequired); + si.lpAttributeList = (PPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(GetProcessHeap(), 0, bytesRequired); + if (!si.lpAttributeList) { + return false; + } + + if (!InitializeProcThreadAttributeList(si.lpAttributeList, 1, 0, &bytesRequired)) { + return false; + } + + if (!UpdateProcThreadAttribute(si.lpAttributeList, 0, PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE, + m_hPC, sizeof(HPCON), NULL, NULL)) { + return false; + } + + // Command Line + QString programNative = QDir::toNativeSeparators(m_program); + QString cmd = programNative; + if (cmd.contains(' ')) { + cmd = "\"" + cmd + "\""; + } + for (const auto &arg : m_arguments) { + cmd += " " + arg; // Simple quoting might be needed + } + + // Working directory + wchar_t *pWorkingDirectory = nullptr; + std::vector workingDir; + if (!m_workingDirectory.isEmpty()) { + workingDir.resize(m_workingDirectory.length() + 1); + m_workingDirectory.toWCharArray(workingDir.data()); + workingDir[m_workingDirectory.length()] = 0; + pWorkingDirectory = workingDir.data(); + } + + // Environment + std::vector envBlock; + for (const auto &key : m_environment.keys()) { + QString entry = key + "=" + m_environment.value(key); + for (QChar c : entry) { + envBlock.push_back(c.unicode()); + } + envBlock.push_back(0); + } + envBlock.push_back(0); + + // Create Process + std::vector cmdLine(cmd.length() + 1); + cmd.toWCharArray(cmdLine.data()); + cmdLine[cmd.length()] = 0; + + BOOL success = CreateProcessW(NULL, cmdLine.data(), NULL, NULL, FALSE, + EXTENDED_STARTUPINFO_PRESENT | CREATE_UNICODE_ENVIRONMENT, + envBlock.data(), pWorkingDirectory, &si.StartupInfo, &m_pi); + + // Cleanup attribute list + DeleteProcThreadAttributeList(si.lpAttributeList); + HeapFree(GetProcessHeap(), 0, si.lpAttributeList); + + if (!success) { + return false; + } + + // Start reader thread + m_readerThread = new ReaderThread(m_hPipeIn, this); + m_readerThread->start(); + + return true; +} + +bool PtyProcessWin::start(const QString &program, const QStringList &arguments, const QSize &size) { + return PtyProcess::start(program, arguments, size); +} + +void PtyProcessWin::write(const QByteArray &data) { + if (m_hPipeOut != INVALID_HANDLE_VALUE) { + DWORD bytesWritten; + WriteFile(m_hPipeOut, data.constData(), data.size(), &bytesWritten, NULL); + } +} + +void PtyProcessWin::resize(const QSize &size) { + if (m_hPC != INVALID_HANDLE_VALUE) { + COORD origin = {(SHORT)size.width(), (SHORT)size.height()}; + ResizePseudoConsole(m_hPC, origin); + } +} + +void PtyProcessWin::kill() { + // First, close the pseudo console — this is the key fix + // It immediately unblocks any pending ReadFile on the pipes + if (m_hPC != INVALID_HANDLE_VALUE) { + ClosePseudoConsole(m_hPC); + m_hPC = INVALID_HANDLE_VALUE; + } + + // Stop and clean up reader thread + if (m_readerThread) { + m_readerThread->stop(); + // Close our read handle as a safety net (though ClosePseudoConsole already unblocked) + if (m_hPipeIn != INVALID_HANDLE_VALUE) { + CloseHandle(m_hPipeIn); + m_hPipeIn = INVALID_HANDLE_VALUE; + } + m_readerThread->wait(3000); // give it a reasonable timeout + if (m_readerThread->isRunning()) { + m_readerThread->terminate(); // last resort + m_readerThread->wait(); + } + delete m_readerThread; + m_readerThread = nullptr; + } + + // Close write pipe + if (m_hPipeOut != INVALID_HANDLE_VALUE) { + CloseHandle(m_hPipeOut); + m_hPipeOut = INVALID_HANDLE_VALUE; + } + + // Terminate child process if still running + if (m_pi.hProcess) { + TerminateProcess(m_pi.hProcess, 1); + WaitForSingleObject(m_pi.hProcess, 5000); + CloseHandle(m_pi.hProcess); + CloseHandle(m_pi.hThread); + m_pi.hProcess = NULL; + m_pi.hThread = NULL; + } +} + +bool PtyProcessWin::isRoot() const { + // Could check for elevation here + return false; +} + +QString PtyProcessWin::foregroundProcessName() const { return QFileInfo(m_program).baseName(); } + +void PtyProcessWin::onReadThreadData(const QByteArray &data) { emit readyRead(data); } diff --git a/third_party/KodoTerm/src/PtyProcess_win.h b/third_party/KodoTerm/src/PtyProcess_win.h new file mode 100644 index 0000000..62f8c75 --- /dev/null +++ b/third_party/KodoTerm/src/PtyProcess_win.h @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: MIT +// Author: Diego Iastrubni + +#pragma once + +#include "PtyProcess.h" +#include +#include + +class PtyProcessWin : public PtyProcess { + Q_OBJECT + + public: + explicit PtyProcessWin(QObject *parent = nullptr); + ~PtyProcessWin() override; + + bool start(const QSize &size) override; + bool start(const QString &program, const QStringList &arguments, const QSize &size) override; + void write(const QByteArray &data) override; + void resize(const QSize &size) override; + void kill() override; + bool isRoot() const override; + QString foregroundProcessName() const override; + + private slots: + void onReadThreadData(const QByteArray &data); + + private: + HPCON m_hPC = INVALID_HANDLE_VALUE; + HANDLE m_hPipeIn = INVALID_HANDLE_VALUE; + HANDLE m_hPipeOut = INVALID_HANDLE_VALUE; + PROCESS_INFORMATION m_pi; + + class ReaderThread; + ReaderThread *m_readerThread = nullptr; +}; diff --git a/third_party/libvterm/include/vterm.h b/third_party/libvterm/include/vterm.h new file mode 100644 index 0000000..1ae2028 --- /dev/null +++ b/third_party/libvterm/include/vterm.h @@ -0,0 +1,645 @@ +#ifndef __VTERM_H__ +#define __VTERM_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +#include "vterm_keycodes.h" + +#define VTERM_VERSION_MAJOR 0 +#define VTERM_VERSION_MINOR 3 +#define VTERM_VERSION_PATCH 3 + +#define VTERM_CHECK_VERSION \ + vterm_check_version(VTERM_VERSION_MAJOR, VTERM_VERSION_MINOR) + +/* Any cell can contain at most one basic printing character and 5 combining + * characters. This number could be changed but will be ABI-incompatible if + * you do */ +#define VTERM_MAX_CHARS_PER_CELL 6 + +typedef struct VTerm VTerm; +typedef struct VTermState VTermState; +typedef struct VTermScreen VTermScreen; + +typedef struct { + int row; + int col; +} VTermPos; + +/* some small utility functions; we can just keep these static here */ + +/* order points by on-screen flow order */ +static inline int vterm_pos_cmp(VTermPos a, VTermPos b) +{ + return (a.row == b.row) ? a.col - b.col : a.row - b.row; +} + +typedef struct { + int start_row; + int end_row; + int start_col; + int end_col; +} VTermRect; + +/* true if the rect contains the point */ +static inline int vterm_rect_contains(VTermRect r, VTermPos p) +{ + return p.row >= r.start_row && p.row < r.end_row && + p.col >= r.start_col && p.col < r.end_col; +} + +/* move a rect */ +static inline void vterm_rect_move(VTermRect *rect, int row_delta, int col_delta) +{ + rect->start_row += row_delta; rect->end_row += row_delta; + rect->start_col += col_delta; rect->end_col += col_delta; +} + +/** + * Bit-field describing the content of the tagged union `VTermColor`. + */ +typedef enum { + /** + * If the lower bit of `type` is not set, the colour is 24-bit RGB. + */ + VTERM_COLOR_RGB = 0x00, + + /** + * The colour is an index into a palette of 256 colours. + */ + VTERM_COLOR_INDEXED = 0x01, + + /** + * Mask that can be used to extract the RGB/Indexed bit. + */ + VTERM_COLOR_TYPE_MASK = 0x01, + + /** + * If set, indicates that this colour should be the default foreground + * color, i.e. there was no SGR request for another colour. When + * rendering this colour it is possible to ignore "idx" and just use a + * colour that is not in the palette. + */ + VTERM_COLOR_DEFAULT_FG = 0x02, + + /** + * If set, indicates that this colour should be the default background + * color, i.e. there was no SGR request for another colour. A common + * option when rendering this colour is to not render a background at + * all, for example by rendering the window transparently at this spot. + */ + VTERM_COLOR_DEFAULT_BG = 0x04, + + /** + * Mask that can be used to extract the default foreground/background bit. + */ + VTERM_COLOR_DEFAULT_MASK = 0x06 +} VTermColorType; + +/** + * Returns true if the VTERM_COLOR_RGB `type` flag is set, indicating that the + * given VTermColor instance is an indexed colour. + */ +#define VTERM_COLOR_IS_INDEXED(col) \ + (((col)->type & VTERM_COLOR_TYPE_MASK) == VTERM_COLOR_INDEXED) + +/** + * Returns true if the VTERM_COLOR_INDEXED `type` flag is set, indicating that + * the given VTermColor instance is an rgb colour. + */ +#define VTERM_COLOR_IS_RGB(col) \ + (((col)->type & VTERM_COLOR_TYPE_MASK) == VTERM_COLOR_RGB) + +/** + * Returns true if the VTERM_COLOR_DEFAULT_FG `type` flag is set, indicating + * that the given VTermColor instance corresponds to the default foreground + * color. + */ +#define VTERM_COLOR_IS_DEFAULT_FG(col) \ + (!!((col)->type & VTERM_COLOR_DEFAULT_FG)) + +/** + * Returns true if the VTERM_COLOR_DEFAULT_BG `type` flag is set, indicating + * that the given VTermColor instance corresponds to the default background + * color. + */ +#define VTERM_COLOR_IS_DEFAULT_BG(col) \ + (!!((col)->type & VTERM_COLOR_DEFAULT_BG)) + +/** + * Tagged union storing either an RGB color or an index into a colour palette. + * In order to convert indexed colours to RGB, you may use the + * vterm_state_convert_color_to_rgb() or vterm_screen_convert_color_to_rgb() + * functions which lookup the RGB colour from the palette maintained by a + * VTermState or VTermScreen instance. + */ +typedef union { + /** + * Tag indicating which union member is actually valid. This variable + * coincides with the `type` member of the `rgb` and the `indexed` struct + * in memory. Please use the `VTERM_COLOR_IS_*` test macros to check whether + * a particular type flag is set. + */ + uint8_t type; + + /** + * Valid if `VTERM_COLOR_IS_RGB(type)` is true. Holds the RGB colour values. + */ + struct { + /** + * Same as the top-level `type` member stored in VTermColor. + */ + uint8_t type; + + /** + * The actual 8-bit red, green, blue colour values. + */ + uint8_t red, green, blue; + } rgb; + + /** + * If `VTERM_COLOR_IS_INDEXED(type)` is true, this member holds the index into + * the colour palette. + */ + struct { + /** + * Same as the top-level `type` member stored in VTermColor. + */ + uint8_t type; + + /** + * Index into the colour map. + */ + uint8_t idx; + } indexed; +} VTermColor; + +/** + * Constructs a new VTermColor instance representing the given RGB values. + */ +static inline void vterm_color_rgb(VTermColor *col, uint8_t red, uint8_t green, + uint8_t blue) +{ + col->type = VTERM_COLOR_RGB; + col->rgb.red = red; + col->rgb.green = green; + col->rgb.blue = blue; +} + +/** + * Construct a new VTermColor instance representing an indexed color with the + * given index. + */ +static inline void vterm_color_indexed(VTermColor *col, uint8_t idx) +{ + col->type = VTERM_COLOR_INDEXED; + col->indexed.idx = idx; +} + +/** + * Compares two colours. Returns true if the colors are equal, false otherwise. + */ +int vterm_color_is_equal(const VTermColor *a, const VTermColor *b); + +typedef enum { + /* VTERM_VALUETYPE_NONE = 0 */ + VTERM_VALUETYPE_BOOL = 1, + VTERM_VALUETYPE_INT, + VTERM_VALUETYPE_STRING, + VTERM_VALUETYPE_COLOR, + + VTERM_N_VALUETYPES +} VTermValueType; + +typedef struct { + const char *str; + size_t len : 30; + bool initial : 1; + bool final : 1; +} VTermStringFragment; + +typedef union { + int boolean; + int number; + VTermStringFragment string; + VTermColor color; +} VTermValue; + +typedef enum { + /* VTERM_ATTR_NONE = 0 */ + VTERM_ATTR_BOLD = 1, // bool: 1, 22 + VTERM_ATTR_UNDERLINE, // number: 4, 21, 24 + VTERM_ATTR_ITALIC, // bool: 3, 23 + VTERM_ATTR_BLINK, // bool: 5, 25 + VTERM_ATTR_REVERSE, // bool: 7, 27 + VTERM_ATTR_CONCEAL, // bool: 8, 28 + VTERM_ATTR_STRIKE, // bool: 9, 29 + VTERM_ATTR_FONT, // number: 10-19 + VTERM_ATTR_FOREGROUND, // color: 30-39 90-97 + VTERM_ATTR_BACKGROUND, // color: 40-49 100-107 + VTERM_ATTR_SMALL, // bool: 73, 74, 75 + VTERM_ATTR_BASELINE, // number: 73, 74, 75 + + VTERM_N_ATTRS +} VTermAttr; + +typedef enum { + /* VTERM_PROP_NONE = 0 */ + VTERM_PROP_CURSORVISIBLE = 1, // bool + VTERM_PROP_CURSORBLINK, // bool + VTERM_PROP_ALTSCREEN, // bool + VTERM_PROP_TITLE, // string + VTERM_PROP_ICONNAME, // string + VTERM_PROP_REVERSE, // bool + VTERM_PROP_CURSORSHAPE, // number + VTERM_PROP_MOUSE, // number + VTERM_PROP_FOCUSREPORT, // bool + + VTERM_N_PROPS +} VTermProp; + +enum { + VTERM_PROP_CURSORSHAPE_BLOCK = 1, + VTERM_PROP_CURSORSHAPE_UNDERLINE, + VTERM_PROP_CURSORSHAPE_BAR_LEFT, + + VTERM_N_PROP_CURSORSHAPES +}; + +enum { + VTERM_PROP_MOUSE_NONE = 0, + VTERM_PROP_MOUSE_CLICK, + VTERM_PROP_MOUSE_DRAG, + VTERM_PROP_MOUSE_MOVE, + + VTERM_N_PROP_MOUSES +}; + +typedef enum { + VTERM_SELECTION_CLIPBOARD = (1<<0), + VTERM_SELECTION_PRIMARY = (1<<1), + VTERM_SELECTION_SECONDARY = (1<<2), + VTERM_SELECTION_SELECT = (1<<3), + VTERM_SELECTION_CUT0 = (1<<4), /* also CUT1 .. CUT7 by bitshifting */ +} VTermSelectionMask; + +typedef struct { + const uint32_t *chars; + int width; + unsigned int protected_cell:1; /* DECSCA-protected against DECSEL/DECSED */ + unsigned int dwl:1; /* DECDWL or DECDHL double-width line */ + unsigned int dhl:2; /* DECDHL double-height line (1=top 2=bottom) */ +} VTermGlyphInfo; + +typedef struct { + unsigned int doublewidth:1; /* DECDWL or DECDHL line */ + unsigned int doubleheight:2; /* DECDHL line (1=top 2=bottom) */ + unsigned int continuation:1; /* Line is a flow continuation of the previous */ +} VTermLineInfo; + +/* Copies of VTermState fields that the 'resize' callback might have reason to + * edit. 'resize' callback gets total control of these fields and may + * free-and-reallocate them if required. They will be copied back from the + * struct after the callback has returned. + */ +typedef struct { + VTermPos pos; /* current cursor position */ + VTermLineInfo *lineinfos[2]; /* [1] may be NULL */ +} VTermStateFields; + +typedef struct { + /* libvterm relies on this memory to be zeroed out before it is returned + * by the allocator. */ + void *(*malloc)(size_t size, void *allocdata); + void (*free)(void *ptr, void *allocdata); +} VTermAllocatorFunctions; + +void vterm_check_version(int major, int minor); + +struct VTermBuilder { + int ver; /* currently unused but reserved for some sort of ABI version flag */ + + int rows, cols; + + const VTermAllocatorFunctions *allocator; + void *allocdata; + + /* Override default sizes for various structures */ + size_t outbuffer_len; /* default: 4096 */ + size_t tmpbuffer_len; /* default: 4096 */ +}; + +VTerm *vterm_build(const struct VTermBuilder *builder); + +/* A convenient shortcut for default cases */ +VTerm *vterm_new(int rows, int cols); +/* This shortcuts are generally discouraged in favour of just using vterm_build() */ +VTerm *vterm_new_with_allocator(int rows, int cols, VTermAllocatorFunctions *funcs, void *allocdata); + +void vterm_free(VTerm* vt); + +void vterm_get_size(const VTerm *vt, int *rowsp, int *colsp); +void vterm_set_size(VTerm *vt, int rows, int cols); + +int vterm_get_utf8(const VTerm *vt); +void vterm_set_utf8(VTerm *vt, int is_utf8); + +size_t vterm_input_write(VTerm *vt, const char *bytes, size_t len); + +/* Setting output callback will override the buffer logic */ +typedef void VTermOutputCallback(const char *s, size_t len, void *user); +void vterm_output_set_callback(VTerm *vt, VTermOutputCallback *func, void *user); + +/* These buffer functions only work if output callback is NOT set + * These are deprecated and will be removed in a later version */ +size_t vterm_output_get_buffer_size(const VTerm *vt); +size_t vterm_output_get_buffer_current(const VTerm *vt); +size_t vterm_output_get_buffer_remaining(const VTerm *vt); + +/* This too */ +size_t vterm_output_read(VTerm *vt, char *buffer, size_t len); + +void vterm_keyboard_unichar(VTerm *vt, uint32_t c, VTermModifier mod); +void vterm_keyboard_key(VTerm *vt, VTermKey key, VTermModifier mod); + +void vterm_keyboard_start_paste(VTerm *vt); +void vterm_keyboard_end_paste(VTerm *vt); + +void vterm_mouse_move(VTerm *vt, int row, int col, VTermModifier mod); +void vterm_mouse_button(VTerm *vt, int button, bool pressed, VTermModifier mod); + +// ------------ +// Parser layer +// ------------ + +/* Flag to indicate non-final subparameters in a single CSI parameter. + * Consider + * CSI 1;2:3:4;5a + * 1 4 and 5 are final. + * 2 and 3 are non-final and will have this bit set + * + * Don't confuse this with the final byte of the CSI escape; 'a' in this case. + */ +#define CSI_ARG_FLAG_MORE (1U<<31) +#define CSI_ARG_MASK (~(1U<<31)) + +#define CSI_ARG_HAS_MORE(a) ((a) & CSI_ARG_FLAG_MORE) +#define CSI_ARG(a) ((a) & CSI_ARG_MASK) + +/* Can't use -1 to indicate a missing argument; use this instead */ +#define CSI_ARG_MISSING ((1UL<<31)-1) + +#define CSI_ARG_IS_MISSING(a) (CSI_ARG(a) == CSI_ARG_MISSING) +#define CSI_ARG_OR(a,def) (CSI_ARG(a) == CSI_ARG_MISSING ? (def) : CSI_ARG(a)) +#define CSI_ARG_COUNT(a) (CSI_ARG(a) == CSI_ARG_MISSING || CSI_ARG(a) == 0 ? 1 : CSI_ARG(a)) + +typedef struct { + int (*text)(const char *bytes, size_t len, void *user); + int (*control)(unsigned char control, void *user); + int (*escape)(const char *bytes, size_t len, void *user); + int (*csi)(const char *leader, const long args[], int argcount, const char *intermed, char command, void *user); + int (*osc)(int command, VTermStringFragment frag, void *user); + int (*dcs)(const char *command, size_t commandlen, VTermStringFragment frag, void *user); + int (*apc)(VTermStringFragment frag, void *user); + int (*pm)(VTermStringFragment frag, void *user); + int (*sos)(VTermStringFragment frag, void *user); + int (*resize)(int rows, int cols, void *user); +} VTermParserCallbacks; + +void vterm_parser_set_callbacks(VTerm *vt, const VTermParserCallbacks *callbacks, void *user); +void *vterm_parser_get_cbdata(VTerm *vt); + +/* Normally NUL, CAN, SUB and DEL are ignored. Setting this true causes them + * to be emitted by the 'control' callback + */ +void vterm_parser_set_emit_nul(VTerm *vt, bool emit); + +// ----------- +// State layer +// ----------- + +typedef struct { + int (*putglyph)(VTermGlyphInfo *info, VTermPos pos, void *user); + int (*movecursor)(VTermPos pos, VTermPos oldpos, int visible, void *user); + int (*scrollrect)(VTermRect rect, int downward, int rightward, void *user); + int (*moverect)(VTermRect dest, VTermRect src, void *user); + int (*erase)(VTermRect rect, int selective, void *user); + int (*initpen)(void *user); + int (*setpenattr)(VTermAttr attr, VTermValue *val, void *user); + int (*settermprop)(VTermProp prop, VTermValue *val, void *user); + int (*bell)(void *user); + int (*resize)(int rows, int cols, VTermStateFields *fields, void *user); + int (*setlineinfo)(int row, const VTermLineInfo *newinfo, const VTermLineInfo *oldinfo, void *user); + int (*sb_clear)(void *user); + // ABI-compat only enabled if vterm_state_callbacks_has_premove() is invoked + int (*premove)(VTermRect dest, void *user); +} VTermStateCallbacks; + +typedef struct { + int (*control)(unsigned char control, void *user); + int (*csi)(const char *leader, const long args[], int argcount, const char *intermed, char command, void *user); + int (*osc)(int command, VTermStringFragment frag, void *user); + int (*dcs)(const char *command, size_t commandlen, VTermStringFragment frag, void *user); + int (*apc)(VTermStringFragment frag, void *user); + int (*pm)(VTermStringFragment frag, void *user); + int (*sos)(VTermStringFragment frag, void *user); +} VTermStateFallbacks; + +typedef struct { + int (*set)(VTermSelectionMask mask, VTermStringFragment frag, void *user); + int (*query)(VTermSelectionMask mask, void *user); +} VTermSelectionCallbacks; + +VTermState *vterm_obtain_state(VTerm *vt); + +void vterm_state_set_callbacks(VTermState *state, const VTermStateCallbacks *callbacks, void *user); +void *vterm_state_get_cbdata(VTermState *state); + +void vterm_state_callbacks_has_premove(VTermState *state); + +void vterm_state_set_unrecognised_fallbacks(VTermState *state, const VTermStateFallbacks *fallbacks, void *user); +void *vterm_state_get_unrecognised_fbdata(VTermState *state); + +void vterm_state_reset(VTermState *state, int hard); +void vterm_state_get_cursorpos(const VTermState *state, VTermPos *cursorpos); +void vterm_state_get_default_colors(const VTermState *state, VTermColor *default_fg, VTermColor *default_bg); +void vterm_state_get_palette_color(const VTermState *state, int index, VTermColor *col); +void vterm_state_set_default_colors(VTermState *state, const VTermColor *default_fg, const VTermColor *default_bg); +void vterm_state_set_palette_color(VTermState *state, int index, const VTermColor *col); +void vterm_state_set_bold_highbright(VTermState *state, int bold_is_highbright); +int vterm_state_get_penattr(const VTermState *state, VTermAttr attr, VTermValue *val); +int vterm_state_set_termprop(VTermState *state, VTermProp prop, VTermValue *val); +void vterm_state_focus_in(VTermState *state); +void vterm_state_focus_out(VTermState *state); +const VTermLineInfo *vterm_state_get_lineinfo(const VTermState *state, int row); + +/** + * Makes sure that the given color `col` is indeed an RGB colour. After this + * function returns, VTERM_COLOR_IS_RGB(col) will return true, while all other + * flags stored in `col->type` will have been reset. + * + * @param state is the VTermState instance from which the colour palette should + * be extracted. + * @param col is a pointer at the VTermColor instance that should be converted + * to an RGB colour. + */ +void vterm_state_convert_color_to_rgb(const VTermState *state, VTermColor *col); + +void vterm_state_set_selection_callbacks(VTermState *state, const VTermSelectionCallbacks *callbacks, void *user, + char *buffer, size_t buflen); + +void vterm_state_send_selection(VTermState *state, VTermSelectionMask mask, VTermStringFragment frag); + +// ------------ +// Screen layer +// ------------ + +typedef struct { + unsigned int bold : 1; + unsigned int underline : 2; + unsigned int italic : 1; + unsigned int blink : 1; + unsigned int reverse : 1; + unsigned int conceal : 1; + unsigned int strike : 1; + unsigned int font : 4; /* 0 to 9 */ + unsigned int dwl : 1; /* On a DECDWL or DECDHL line */ + unsigned int dhl : 2; /* On a DECDHL line (1=top 2=bottom) */ + unsigned int small : 1; + unsigned int baseline : 2; +} VTermScreenCellAttrs; + +enum { + VTERM_UNDERLINE_OFF, + VTERM_UNDERLINE_SINGLE, + VTERM_UNDERLINE_DOUBLE, + VTERM_UNDERLINE_CURLY, +}; + +enum { + VTERM_BASELINE_NORMAL, + VTERM_BASELINE_RAISE, + VTERM_BASELINE_LOWER, +}; + +typedef struct { + uint32_t chars[VTERM_MAX_CHARS_PER_CELL]; + char width; + VTermScreenCellAttrs attrs; + VTermColor fg, bg; +} VTermScreenCell; + +typedef struct { + int (*damage)(VTermRect rect, void *user); + int (*moverect)(VTermRect dest, VTermRect src, void *user); + int (*movecursor)(VTermPos pos, VTermPos oldpos, int visible, void *user); + int (*settermprop)(VTermProp prop, VTermValue *val, void *user); + int (*bell)(void *user); + int (*resize)(int rows, int cols, void *user); + int (*sb_pushline)(int cols, const VTermScreenCell *cells, void *user); + int (*sb_popline)(int cols, VTermScreenCell *cells, void *user); + int (*sb_clear)(void* user); + /* ABI-compat this is only used if vterm_screen_callbacks_has_pushline4() is called */ + int (*sb_pushline4)(int cols, const VTermScreenCell *cells, bool continuation, void *user); +} VTermScreenCallbacks; + +VTermScreen *vterm_obtain_screen(VTerm *vt); + +void vterm_screen_set_callbacks(VTermScreen *screen, const VTermScreenCallbacks *callbacks, void *user); +void *vterm_screen_get_cbdata(VTermScreen *screen); + +void vterm_screen_callbacks_has_pushline4(VTermScreen *screen); + +void vterm_screen_set_unrecognised_fallbacks(VTermScreen *screen, const VTermStateFallbacks *fallbacks, void *user); +void *vterm_screen_get_unrecognised_fbdata(VTermScreen *screen); + +void vterm_screen_enable_reflow(VTermScreen *screen, bool reflow); + +// Back-compat alias for the brief time it was in 0.3-RC1 +#define vterm_screen_set_reflow vterm_screen_enable_reflow + +void vterm_screen_enable_altscreen(VTermScreen *screen, int altscreen); + +typedef enum { + VTERM_DAMAGE_CELL, /* every cell */ + VTERM_DAMAGE_ROW, /* entire rows */ + VTERM_DAMAGE_SCREEN, /* entire screen */ + VTERM_DAMAGE_SCROLL, /* entire screen + scrollrect */ + + VTERM_N_DAMAGES +} VTermDamageSize; + +void vterm_screen_flush_damage(VTermScreen *screen); +void vterm_screen_set_damage_merge(VTermScreen *screen, VTermDamageSize size); + +void vterm_screen_reset(VTermScreen *screen, int hard); + +/* Neither of these functions NUL-terminate the buffer */ +size_t vterm_screen_get_chars(const VTermScreen *screen, uint32_t *chars, size_t len, const VTermRect rect); +size_t vterm_screen_get_text(const VTermScreen *screen, char *str, size_t len, const VTermRect rect); + +typedef enum { + VTERM_ATTR_BOLD_MASK = 1 << 0, + VTERM_ATTR_UNDERLINE_MASK = 1 << 1, + VTERM_ATTR_ITALIC_MASK = 1 << 2, + VTERM_ATTR_BLINK_MASK = 1 << 3, + VTERM_ATTR_REVERSE_MASK = 1 << 4, + VTERM_ATTR_STRIKE_MASK = 1 << 5, + VTERM_ATTR_FONT_MASK = 1 << 6, + VTERM_ATTR_FOREGROUND_MASK = 1 << 7, + VTERM_ATTR_BACKGROUND_MASK = 1 << 8, + VTERM_ATTR_CONCEAL_MASK = 1 << 9, + VTERM_ATTR_SMALL_MASK = 1 << 10, + VTERM_ATTR_BASELINE_MASK = 1 << 11, + + VTERM_ALL_ATTRS_MASK = (1 << 12) - 1 +} VTermAttrMask; + +int vterm_screen_get_attrs_extent(const VTermScreen *screen, VTermRect *extent, VTermPos pos, VTermAttrMask attrs); + +int vterm_screen_get_cell(const VTermScreen *screen, VTermPos pos, VTermScreenCell *cell); + +int vterm_screen_is_eol(const VTermScreen *screen, VTermPos pos); + +/** + * Same as vterm_state_convert_color_to_rgb(), but takes a `screen` instead of a `state` + * instance. + */ +void vterm_screen_convert_color_to_rgb(const VTermScreen *screen, VTermColor *col); + +/** + * Similar to vterm_state_set_default_colors(), but also resets colours in the + * screen buffer(s) + */ +void vterm_screen_set_default_colors(VTermScreen *screen, const VTermColor *default_fg, const VTermColor *default_bg); + +// --------- +// Utilities +// --------- + +VTermValueType vterm_get_attr_type(VTermAttr attr); +VTermValueType vterm_get_prop_type(VTermProp prop); + +void vterm_scroll_rect(VTermRect rect, + int downward, + int rightward, + int (*moverect)(VTermRect src, VTermRect dest, void *user), + int (*eraserect)(VTermRect rect, int selective, void *user), + void *user); + +void vterm_copy_cells(VTermRect dest, + VTermRect src, + void (*copycell)(VTermPos dest, VTermPos src, void *user), + void *user); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/third_party/libvterm/include/vterm_keycodes.h b/third_party/libvterm/include/vterm_keycodes.h new file mode 100644 index 0000000..661759f --- /dev/null +++ b/third_party/libvterm/include/vterm_keycodes.h @@ -0,0 +1,61 @@ +#ifndef __VTERM_INPUT_H__ +#define __VTERM_INPUT_H__ + +typedef enum { + VTERM_MOD_NONE = 0x00, + VTERM_MOD_SHIFT = 0x01, + VTERM_MOD_ALT = 0x02, + VTERM_MOD_CTRL = 0x04, + + VTERM_ALL_MODS_MASK = 0x07 +} VTermModifier; + +typedef enum { + VTERM_KEY_NONE, + + VTERM_KEY_ENTER, + VTERM_KEY_TAB, + VTERM_KEY_BACKSPACE, + VTERM_KEY_ESCAPE, + + VTERM_KEY_UP, + VTERM_KEY_DOWN, + VTERM_KEY_LEFT, + VTERM_KEY_RIGHT, + + VTERM_KEY_INS, + VTERM_KEY_DEL, + VTERM_KEY_HOME, + VTERM_KEY_END, + VTERM_KEY_PAGEUP, + VTERM_KEY_PAGEDOWN, + + VTERM_KEY_FUNCTION_0 = 256, + VTERM_KEY_FUNCTION_MAX = VTERM_KEY_FUNCTION_0 + 255, + + VTERM_KEY_KP_0, + VTERM_KEY_KP_1, + VTERM_KEY_KP_2, + VTERM_KEY_KP_3, + VTERM_KEY_KP_4, + VTERM_KEY_KP_5, + VTERM_KEY_KP_6, + VTERM_KEY_KP_7, + VTERM_KEY_KP_8, + VTERM_KEY_KP_9, + VTERM_KEY_KP_MULT, + VTERM_KEY_KP_PLUS, + VTERM_KEY_KP_COMMA, + VTERM_KEY_KP_MINUS, + VTERM_KEY_KP_PERIOD, + VTERM_KEY_KP_DIVIDE, + VTERM_KEY_KP_ENTER, + VTERM_KEY_KP_EQUAL, + + VTERM_KEY_MAX, // Must be last + VTERM_N_KEYS = VTERM_KEY_MAX +} VTermKey; + +#define VTERM_KEY_FUNCTION(n) (VTERM_KEY_FUNCTION_0+(n)) + +#endif diff --git a/third_party/libvterm/src/encoding.c b/third_party/libvterm/src/encoding.c new file mode 100644 index 0000000..434ac3f --- /dev/null +++ b/third_party/libvterm/src/encoding.c @@ -0,0 +1,230 @@ +#include "vterm_internal.h" + +#define UNICODE_INVALID 0xFFFD + +#if defined(DEBUG) && DEBUG > 1 +# define DEBUG_PRINT_UTF8 +#endif + +struct UTF8DecoderData { + // number of bytes remaining in this codepoint + int bytes_remaining; + + // number of bytes total in this codepoint once it's finished + // (for detecting overlongs) + int bytes_total; + + int this_cp; +}; + +static void init_utf8(VTermEncoding *enc, void *data_) +{ + struct UTF8DecoderData *data = data_; + + data->bytes_remaining = 0; + data->bytes_total = 0; +} + +static void decode_utf8(VTermEncoding *enc, void *data_, + uint32_t cp[], int *cpi, int cplen, + const char bytes[], size_t *pos, size_t bytelen) +{ + struct UTF8DecoderData *data = data_; + +#ifdef DEBUG_PRINT_UTF8 + printf("BEGIN UTF-8\n"); +#endif + + for(; *pos < bytelen && *cpi < cplen; (*pos)++) { + unsigned char c = bytes[*pos]; + +#ifdef DEBUG_PRINT_UTF8 + printf(" pos=%zd c=%02x rem=%d\n", *pos, c, data->bytes_remaining); +#endif + + if(c < 0x20) // C0 + return; + + else if(c >= 0x20 && c < 0x7f) { + if(data->bytes_remaining) + cp[(*cpi)++] = UNICODE_INVALID; + + cp[(*cpi)++] = c; +#ifdef DEBUG_PRINT_UTF8 + printf(" UTF-8 char: U+%04x\n", c); +#endif + data->bytes_remaining = 0; + } + + else if(c == 0x7f) // DEL + return; + + else if(c >= 0x80 && c < 0xc0) { + if(!data->bytes_remaining) { + cp[(*cpi)++] = UNICODE_INVALID; + continue; + } + + data->this_cp <<= 6; + data->this_cp |= c & 0x3f; + data->bytes_remaining--; + + if(!data->bytes_remaining) { +#ifdef DEBUG_PRINT_UTF8 + printf(" UTF-8 raw char U+%04x bytelen=%d ", data->this_cp, data->bytes_total); +#endif + // Check for overlong sequences + switch(data->bytes_total) { + case 2: + if(data->this_cp < 0x0080) data->this_cp = UNICODE_INVALID; + break; + case 3: + if(data->this_cp < 0x0800) data->this_cp = UNICODE_INVALID; + break; + case 4: + if(data->this_cp < 0x10000) data->this_cp = UNICODE_INVALID; + break; + case 5: + if(data->this_cp < 0x200000) data->this_cp = UNICODE_INVALID; + break; + case 6: + if(data->this_cp < 0x4000000) data->this_cp = UNICODE_INVALID; + break; + } + // Now look for plain invalid ones + if((data->this_cp >= 0xD800 && data->this_cp <= 0xDFFF) || + data->this_cp == 0xFFFE || + data->this_cp == 0xFFFF) + data->this_cp = UNICODE_INVALID; +#ifdef DEBUG_PRINT_UTF8 + printf(" char: U+%04x\n", data->this_cp); +#endif + cp[(*cpi)++] = data->this_cp; + } + } + + else if(c >= 0xc0 && c < 0xe0) { + if(data->bytes_remaining) + cp[(*cpi)++] = UNICODE_INVALID; + + data->this_cp = c & 0x1f; + data->bytes_total = 2; + data->bytes_remaining = 1; + } + + else if(c >= 0xe0 && c < 0xf0) { + if(data->bytes_remaining) + cp[(*cpi)++] = UNICODE_INVALID; + + data->this_cp = c & 0x0f; + data->bytes_total = 3; + data->bytes_remaining = 2; + } + + else if(c >= 0xf0 && c < 0xf8) { + if(data->bytes_remaining) + cp[(*cpi)++] = UNICODE_INVALID; + + data->this_cp = c & 0x07; + data->bytes_total = 4; + data->bytes_remaining = 3; + } + + else if(c >= 0xf8 && c < 0xfc) { + if(data->bytes_remaining) + cp[(*cpi)++] = UNICODE_INVALID; + + data->this_cp = c & 0x03; + data->bytes_total = 5; + data->bytes_remaining = 4; + } + + else if(c >= 0xfc && c < 0xfe) { + if(data->bytes_remaining) + cp[(*cpi)++] = UNICODE_INVALID; + + data->this_cp = c & 0x01; + data->bytes_total = 6; + data->bytes_remaining = 5; + } + + else { + cp[(*cpi)++] = UNICODE_INVALID; + } + } +} + +static VTermEncoding encoding_utf8 = { + .init = &init_utf8, + .decode = &decode_utf8, +}; + +static void decode_usascii(VTermEncoding *enc, void *data, + uint32_t cp[], int *cpi, int cplen, + const char bytes[], size_t *pos, size_t bytelen) +{ + int is_gr = bytes[*pos] & 0x80; + + for(; *pos < bytelen && *cpi < cplen; (*pos)++) { + unsigned char c = bytes[*pos] ^ is_gr; + + if(c < 0x20 || c == 0x7f || c >= 0x80) + return; + + cp[(*cpi)++] = c; + } +} + +static VTermEncoding encoding_usascii = { + .decode = &decode_usascii, +}; + +struct StaticTableEncoding { + const VTermEncoding enc; + const uint32_t chars[128]; +}; + +static void decode_table(VTermEncoding *enc, void *data, + uint32_t cp[], int *cpi, int cplen, + const char bytes[], size_t *pos, size_t bytelen) +{ + struct StaticTableEncoding *table = (struct StaticTableEncoding *)enc; + int is_gr = bytes[*pos] & 0x80; + + for(; *pos < bytelen && *cpi < cplen; (*pos)++) { + unsigned char c = bytes[*pos] ^ is_gr; + + if(c < 0x20 || c == 0x7f || c >= 0x80) + return; + + if(table->chars[c]) + cp[(*cpi)++] = table->chars[c]; + else + cp[(*cpi)++] = c; + } +} + +#include "encoding/DECdrawing.inc" +#include "encoding/uk.inc" + +static struct { + VTermEncodingType type; + char designation; + VTermEncoding *enc; +} +encodings[] = { + { ENC_UTF8, 'u', &encoding_utf8 }, + { ENC_SINGLE_94, '0', (VTermEncoding*)&encoding_DECdrawing }, + { ENC_SINGLE_94, 'A', (VTermEncoding*)&encoding_uk }, + { ENC_SINGLE_94, 'B', &encoding_usascii }, + { 0 }, +}; + +/* This ought to be INTERNAL but isn't because it's used by unit testing */ +VTermEncoding *vterm_lookup_encoding(VTermEncodingType type, char designation) +{ + for(int i = 0; encodings[i].designation; i++) + if(encodings[i].type == type && encodings[i].designation == designation) + return encodings[i].enc; + return NULL; +} diff --git a/third_party/libvterm/src/encoding/DECdrawing.inc b/third_party/libvterm/src/encoding/DECdrawing.inc new file mode 100644 index 0000000..47093ed --- /dev/null +++ b/third_party/libvterm/src/encoding/DECdrawing.inc @@ -0,0 +1,36 @@ +static const struct StaticTableEncoding encoding_DECdrawing = { + { .decode = &decode_table }, + { + [0x60] = 0x25C6, + [0x61] = 0x2592, + [0x62] = 0x2409, + [0x63] = 0x240C, + [0x64] = 0x240D, + [0x65] = 0x240A, + [0x66] = 0x00B0, + [0x67] = 0x00B1, + [0x68] = 0x2424, + [0x69] = 0x240B, + [0x6a] = 0x2518, + [0x6b] = 0x2510, + [0x6c] = 0x250C, + [0x6d] = 0x2514, + [0x6e] = 0x253C, + [0x6f] = 0x23BA, + [0x70] = 0x23BB, + [0x71] = 0x2500, + [0x72] = 0x23BC, + [0x73] = 0x23BD, + [0x74] = 0x251C, + [0x75] = 0x2524, + [0x76] = 0x2534, + [0x77] = 0x252C, + [0x78] = 0x2502, + [0x79] = 0x2A7D, + [0x7a] = 0x2A7E, + [0x7b] = 0x03C0, + [0x7c] = 0x2260, + [0x7d] = 0x00A3, + [0x7e] = 0x00B7, + } +}; diff --git a/third_party/libvterm/src/encoding/DECdrawing.tbl b/third_party/libvterm/src/encoding/DECdrawing.tbl new file mode 100644 index 0000000..6e19c50 --- /dev/null +++ b/third_party/libvterm/src/encoding/DECdrawing.tbl @@ -0,0 +1,31 @@ +6/0 = U+25C6 # BLACK DIAMOND +6/1 = U+2592 # MEDIUM SHADE (checkerboard) +6/2 = U+2409 # SYMBOL FOR HORIZONTAL TAB +6/3 = U+240C # SYMBOL FOR FORM FEED +6/4 = U+240D # SYMBOL FOR CARRIAGE RETURN +6/5 = U+240A # SYMBOL FOR LINE FEED +6/6 = U+00B0 # DEGREE SIGN +6/7 = U+00B1 # PLUS-MINUS SIGN (plus or minus) +6/8 = U+2424 # SYMBOL FOR NEW LINE +6/9 = U+240B # SYMBOL FOR VERTICAL TAB +6/10 = U+2518 # BOX DRAWINGS LIGHT UP AND LEFT (bottom-right corner) +6/11 = U+2510 # BOX DRAWINGS LIGHT DOWN AND LEFT (top-right corner) +6/12 = U+250C # BOX DRAWINGS LIGHT DOWN AND RIGHT (top-left corner) +6/13 = U+2514 # BOX DRAWINGS LIGHT UP AND RIGHT (bottom-left corner) +6/14 = U+253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL (crossing lines) +6/15 = U+23BA # HORIZONTAL SCAN LINE-1 +7/0 = U+23BB # HORIZONTAL SCAN LINE-3 +7/1 = U+2500 # BOX DRAWINGS LIGHT HORIZONTAL +7/2 = U+23BC # HORIZONTAL SCAN LINE-7 +7/3 = U+23BD # HORIZONTAL SCAN LINE-9 +7/4 = U+251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT +7/5 = U+2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT +7/6 = U+2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL +7/7 = U+252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +7/8 = U+2502 # BOX DRAWINGS LIGHT VERTICAL +7/9 = U+2A7D # LESS-THAN OR SLANTED EQUAL-TO +7/10 = U+2A7E # GREATER-THAN OR SLANTED EQUAL-TO +7/11 = U+03C0 # GREEK SMALL LETTER PI +7/12 = U+2260 # NOT EQUAL TO +7/13 = U+00A3 # POUND SIGN +7/14 = U+00B7 # MIDDLE DOT diff --git a/third_party/libvterm/src/encoding/uk.inc b/third_party/libvterm/src/encoding/uk.inc new file mode 100644 index 0000000..da1445d --- /dev/null +++ b/third_party/libvterm/src/encoding/uk.inc @@ -0,0 +1,6 @@ +static const struct StaticTableEncoding encoding_uk = { + { .decode = &decode_table }, + { + [0x23] = 0x00a3, + } +}; diff --git a/third_party/libvterm/src/encoding/uk.tbl b/third_party/libvterm/src/encoding/uk.tbl new file mode 100644 index 0000000..b27b1a2 --- /dev/null +++ b/third_party/libvterm/src/encoding/uk.tbl @@ -0,0 +1 @@ +2/3 = "£" diff --git a/third_party/libvterm/src/fullwidth.inc b/third_party/libvterm/src/fullwidth.inc new file mode 100644 index 0000000..a703529 --- /dev/null +++ b/third_party/libvterm/src/fullwidth.inc @@ -0,0 +1,111 @@ + { 0x1100, 0x115f }, + { 0x231a, 0x231b }, + { 0x2329, 0x232a }, + { 0x23e9, 0x23ec }, + { 0x23f0, 0x23f0 }, + { 0x23f3, 0x23f3 }, + { 0x25fd, 0x25fe }, + { 0x2614, 0x2615 }, + { 0x2648, 0x2653 }, + { 0x267f, 0x267f }, + { 0x2693, 0x2693 }, + { 0x26a1, 0x26a1 }, + { 0x26aa, 0x26ab }, + { 0x26bd, 0x26be }, + { 0x26c4, 0x26c5 }, + { 0x26ce, 0x26ce }, + { 0x26d4, 0x26d4 }, + { 0x26ea, 0x26ea }, + { 0x26f2, 0x26f3 }, + { 0x26f5, 0x26f5 }, + { 0x26fa, 0x26fa }, + { 0x26fd, 0x26fd }, + { 0x2705, 0x2705 }, + { 0x270a, 0x270b }, + { 0x2728, 0x2728 }, + { 0x274c, 0x274c }, + { 0x274e, 0x274e }, + { 0x2753, 0x2755 }, + { 0x2757, 0x2757 }, + { 0x2795, 0x2797 }, + { 0x27b0, 0x27b0 }, + { 0x27bf, 0x27bf }, + { 0x2b1b, 0x2b1c }, + { 0x2b50, 0x2b50 }, + { 0x2b55, 0x2b55 }, + { 0x2e80, 0x2e99 }, + { 0x2e9b, 0x2ef3 }, + { 0x2f00, 0x2fd5 }, + { 0x2ff0, 0x2ffb }, + { 0x3000, 0x303e }, + { 0x3041, 0x3096 }, + { 0x3099, 0x30ff }, + { 0x3105, 0x312f }, + { 0x3131, 0x318e }, + { 0x3190, 0x31ba }, + { 0x31c0, 0x31e3 }, + { 0x31f0, 0x321e }, + { 0x3220, 0x3247 }, + { 0x3250, 0x4dbf }, + { 0x4e00, 0xa48c }, + { 0xa490, 0xa4c6 }, + { 0xa960, 0xa97c }, + { 0xac00, 0xd7a3 }, + { 0xf900, 0xfaff }, + { 0xfe10, 0xfe19 }, + { 0xfe30, 0xfe52 }, + { 0xfe54, 0xfe66 }, + { 0xfe68, 0xfe6b }, + { 0xff01, 0xff60 }, + { 0xffe0, 0xffe6 }, + { 0x16fe0, 0x16fe3 }, + { 0x17000, 0x187f7 }, + { 0x18800, 0x18af2 }, + { 0x1b000, 0x1b11e }, + { 0x1b150, 0x1b152 }, + { 0x1b164, 0x1b167 }, + { 0x1b170, 0x1b2fb }, + { 0x1f004, 0x1f004 }, + { 0x1f0cf, 0x1f0cf }, + { 0x1f18e, 0x1f18e }, + { 0x1f191, 0x1f19a }, + { 0x1f200, 0x1f202 }, + { 0x1f210, 0x1f23b }, + { 0x1f240, 0x1f248 }, + { 0x1f250, 0x1f251 }, + { 0x1f260, 0x1f265 }, + { 0x1f300, 0x1f320 }, + { 0x1f32d, 0x1f335 }, + { 0x1f337, 0x1f37c }, + { 0x1f37e, 0x1f393 }, + { 0x1f3a0, 0x1f3ca }, + { 0x1f3cf, 0x1f3d3 }, + { 0x1f3e0, 0x1f3f0 }, + { 0x1f3f4, 0x1f3f4 }, + { 0x1f3f8, 0x1f43e }, + { 0x1f440, 0x1f440 }, + { 0x1f442, 0x1f4fc }, + { 0x1f4ff, 0x1f53d }, + { 0x1f54b, 0x1f54e }, + { 0x1f550, 0x1f567 }, + { 0x1f57a, 0x1f57a }, + { 0x1f595, 0x1f596 }, + { 0x1f5a4, 0x1f5a4 }, + { 0x1f5fb, 0x1f64f }, + { 0x1f680, 0x1f6c5 }, + { 0x1f6cc, 0x1f6cc }, + { 0x1f6d0, 0x1f6d2 }, + { 0x1f6d5, 0x1f6d5 }, + { 0x1f6eb, 0x1f6ec }, + { 0x1f6f4, 0x1f6fa }, + { 0x1f7e0, 0x1f7eb }, + { 0x1f90d, 0x1f971 }, + { 0x1f973, 0x1f976 }, + { 0x1f97a, 0x1f9a2 }, + { 0x1f9a5, 0x1f9aa }, + { 0x1f9ae, 0x1f9ca }, + { 0x1f9cd, 0x1f9ff }, + { 0x1fa70, 0x1fa73 }, + { 0x1fa78, 0x1fa7a }, + { 0x1fa80, 0x1fa82 }, + { 0x1fa90, 0x1fa95 }, diff --git a/third_party/libvterm/src/keyboard.c b/third_party/libvterm/src/keyboard.c new file mode 100644 index 0000000..d31c8be --- /dev/null +++ b/third_party/libvterm/src/keyboard.c @@ -0,0 +1,226 @@ +#include "vterm_internal.h" + +#include + +#include "utf8.h" + +void vterm_keyboard_unichar(VTerm *vt, uint32_t c, VTermModifier mod) +{ + /* The shift modifier is never important for Unicode characters + * apart from Space + */ + if(c != ' ') + mod &= ~VTERM_MOD_SHIFT; + + if(mod == 0) { + // Normal text - ignore just shift + char str[6]; + int seqlen = fill_utf8(c, str); + vterm_push_output_bytes(vt, str, seqlen); + return; + } + + int needs_CSIu; + switch(c) { + /* Special Ctrl- letters that can't be represented elsewise */ + case 'i': case 'j': case 'm': case '[': + needs_CSIu = 1; + break; + /* Ctrl-\ ] ^ _ don't need CSUu */ + case '\\': case ']': case '^': case '_': + needs_CSIu = 0; + break; + /* Shift-space needs CSIu */ + case ' ': + needs_CSIu = !!(mod & VTERM_MOD_SHIFT); + break; + /* All other characters needs CSIu except for letters a-z */ + default: + needs_CSIu = (c < 'a' || c > 'z'); + } + + /* ALT we can just prefix with ESC; anything else requires CSI u */ + if(needs_CSIu && (mod & ~VTERM_MOD_ALT)) { + vterm_push_output_sprintf_ctrl(vt, C1_CSI, "%d;%du", c, mod+1); + return; + } + + if(mod & VTERM_MOD_CTRL) + c &= 0x1f; + + vterm_push_output_sprintf(vt, "%s%c", mod & VTERM_MOD_ALT ? ESC_S : "", c); +} + +typedef struct { + enum { + KEYCODE_NONE, + KEYCODE_LITERAL, + KEYCODE_TAB, + KEYCODE_ENTER, + KEYCODE_SS3, + KEYCODE_CSI, + KEYCODE_CSI_CURSOR, + KEYCODE_CSINUM, + KEYCODE_KEYPAD, + } type; + char literal; + int csinum; +} keycodes_s; + +static keycodes_s keycodes[] = { + { KEYCODE_NONE }, // NONE + + { KEYCODE_ENTER, '\r' }, // ENTER + { KEYCODE_TAB, '\t' }, // TAB + { KEYCODE_LITERAL, '\x7f' }, // BACKSPACE == ASCII DEL + { KEYCODE_LITERAL, '\x1b' }, // ESCAPE + + { KEYCODE_CSI_CURSOR, 'A' }, // UP + { KEYCODE_CSI_CURSOR, 'B' }, // DOWN + { KEYCODE_CSI_CURSOR, 'D' }, // LEFT + { KEYCODE_CSI_CURSOR, 'C' }, // RIGHT + + { KEYCODE_CSINUM, '~', 2 }, // INS + { KEYCODE_CSINUM, '~', 3 }, // DEL + { KEYCODE_CSI_CURSOR, 'H' }, // HOME + { KEYCODE_CSI_CURSOR, 'F' }, // END + { KEYCODE_CSINUM, '~', 5 }, // PAGEUP + { KEYCODE_CSINUM, '~', 6 }, // PAGEDOWN +}; + +static keycodes_s keycodes_fn[] = { + { KEYCODE_NONE }, // F0 - shouldn't happen + { KEYCODE_SS3, 'P' }, // F1 + { KEYCODE_SS3, 'Q' }, // F2 + { KEYCODE_SS3, 'R' }, // F3 + { KEYCODE_SS3, 'S' }, // F4 + { KEYCODE_CSINUM, '~', 15 }, // F5 + { KEYCODE_CSINUM, '~', 17 }, // F6 + { KEYCODE_CSINUM, '~', 18 }, // F7 + { KEYCODE_CSINUM, '~', 19 }, // F8 + { KEYCODE_CSINUM, '~', 20 }, // F9 + { KEYCODE_CSINUM, '~', 21 }, // F10 + { KEYCODE_CSINUM, '~', 23 }, // F11 + { KEYCODE_CSINUM, '~', 24 }, // F12 +}; + +static keycodes_s keycodes_kp[] = { + { KEYCODE_KEYPAD, '0', 'p' }, // KP_0 + { KEYCODE_KEYPAD, '1', 'q' }, // KP_1 + { KEYCODE_KEYPAD, '2', 'r' }, // KP_2 + { KEYCODE_KEYPAD, '3', 's' }, // KP_3 + { KEYCODE_KEYPAD, '4', 't' }, // KP_4 + { KEYCODE_KEYPAD, '5', 'u' }, // KP_5 + { KEYCODE_KEYPAD, '6', 'v' }, // KP_6 + { KEYCODE_KEYPAD, '7', 'w' }, // KP_7 + { KEYCODE_KEYPAD, '8', 'x' }, // KP_8 + { KEYCODE_KEYPAD, '9', 'y' }, // KP_9 + { KEYCODE_KEYPAD, '*', 'j' }, // KP_MULT + { KEYCODE_KEYPAD, '+', 'k' }, // KP_PLUS + { KEYCODE_KEYPAD, ',', 'l' }, // KP_COMMA + { KEYCODE_KEYPAD, '-', 'm' }, // KP_MINUS + { KEYCODE_KEYPAD, '.', 'n' }, // KP_PERIOD + { KEYCODE_KEYPAD, '/', 'o' }, // KP_DIVIDE + { KEYCODE_KEYPAD, '\n', 'M' }, // KP_ENTER + { KEYCODE_KEYPAD, '=', 'X' }, // KP_EQUAL +}; + +void vterm_keyboard_key(VTerm *vt, VTermKey key, VTermModifier mod) +{ + if(key == VTERM_KEY_NONE) + return; + + keycodes_s k; + if(key < VTERM_KEY_FUNCTION_0) { + if(key >= sizeof(keycodes)/sizeof(keycodes[0])) + return; + k = keycodes[key]; + } + else if(key >= VTERM_KEY_FUNCTION_0 && key <= VTERM_KEY_FUNCTION_MAX) { + if((key - VTERM_KEY_FUNCTION_0) >= sizeof(keycodes_fn)/sizeof(keycodes_fn[0])) + return; + k = keycodes_fn[key - VTERM_KEY_FUNCTION_0]; + } + else if(key >= VTERM_KEY_KP_0) { + if((key - VTERM_KEY_KP_0) >= sizeof(keycodes_kp)/sizeof(keycodes_kp[0])) + return; + k = keycodes_kp[key - VTERM_KEY_KP_0]; + } + + switch(k.type) { + case KEYCODE_NONE: + break; + + case KEYCODE_TAB: + /* Shift-Tab is CSI Z but plain Tab is 0x09 */ + if(mod == VTERM_MOD_SHIFT) + vterm_push_output_sprintf_ctrl(vt, C1_CSI, "Z"); + else if(mod & VTERM_MOD_SHIFT) + vterm_push_output_sprintf_ctrl(vt, C1_CSI, "1;%dZ", mod+1); + else + goto case_LITERAL; + break; + + case KEYCODE_ENTER: + /* Enter is CRLF in newline mode, but just LF in linefeed */ + if(vt->state->mode.newline) + vterm_push_output_sprintf(vt, "\r\n"); + else + goto case_LITERAL; + break; + + case KEYCODE_LITERAL: case_LITERAL: + if(mod & (VTERM_MOD_SHIFT|VTERM_MOD_CTRL)) + vterm_push_output_sprintf_ctrl(vt, C1_CSI, "%d;%du", k.literal, mod+1); + else + vterm_push_output_sprintf(vt, mod & VTERM_MOD_ALT ? ESC_S "%c" : "%c", k.literal); + break; + + case KEYCODE_SS3: case_SS3: + if(mod == 0) + vterm_push_output_sprintf_ctrl(vt, C1_SS3, "%c", k.literal); + else + goto case_CSI; + break; + + case KEYCODE_CSI: case_CSI: + if(mod == 0) + vterm_push_output_sprintf_ctrl(vt, C1_CSI, "%c", k.literal); + else + vterm_push_output_sprintf_ctrl(vt, C1_CSI, "1;%d%c", mod + 1, k.literal); + break; + + case KEYCODE_CSINUM: + if(mod == 0) + vterm_push_output_sprintf_ctrl(vt, C1_CSI, "%d%c", k.csinum, k.literal); + else + vterm_push_output_sprintf_ctrl(vt, C1_CSI, "%d;%d%c", k.csinum, mod + 1, k.literal); + break; + + case KEYCODE_CSI_CURSOR: + if(vt->state->mode.cursor) + goto case_SS3; + else + goto case_CSI; + + case KEYCODE_KEYPAD: + if(vt->state->mode.keypad) { + k.literal = k.csinum; + goto case_SS3; + } + else + goto case_LITERAL; + } +} + +void vterm_keyboard_start_paste(VTerm *vt) +{ + if(vt->state->mode.bracketpaste) + vterm_push_output_sprintf_ctrl(vt, C1_CSI, "200~"); +} + +void vterm_keyboard_end_paste(VTerm *vt) +{ + if(vt->state->mode.bracketpaste) + vterm_push_output_sprintf_ctrl(vt, C1_CSI, "201~"); +} diff --git a/third_party/libvterm/src/mouse.c b/third_party/libvterm/src/mouse.c new file mode 100644 index 0000000..f74abc3 --- /dev/null +++ b/third_party/libvterm/src/mouse.c @@ -0,0 +1,99 @@ +#include "vterm_internal.h" + +#include "utf8.h" + +static void output_mouse(VTermState *state, int code, int pressed, int modifiers, int col, int row) +{ + modifiers <<= 2; + + switch(state->mouse_protocol) { + case MOUSE_X10: + if(col + 0x21 > 0xff) + col = 0xff - 0x21; + if(row + 0x21 > 0xff) + row = 0xff - 0x21; + + if(!pressed) + code = 3; + + vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "M%c%c%c", + (code | modifiers) + 0x20, col + 0x21, row + 0x21); + break; + + case MOUSE_UTF8: + { + char utf8[18]; size_t len = 0; + + if(!pressed) + code = 3; + + len += fill_utf8((code | modifiers) + 0x20, utf8 + len); + len += fill_utf8(col + 0x21, utf8 + len); + len += fill_utf8(row + 0x21, utf8 + len); + utf8[len] = 0; + + vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "M%s", utf8); + } + break; + + case MOUSE_SGR: + vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "<%d;%d;%d%c", + code | modifiers, col + 1, row + 1, pressed ? 'M' : 'm'); + break; + + case MOUSE_RXVT: + if(!pressed) + code = 3; + + vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "%d;%d;%dM", + code | modifiers, col + 1, row + 1); + break; + } +} + +void vterm_mouse_move(VTerm *vt, int row, int col, VTermModifier mod) +{ + VTermState *state = vt->state; + + if(col == state->mouse_col && row == state->mouse_row) + return; + + state->mouse_col = col; + state->mouse_row = row; + + if((state->mouse_flags & MOUSE_WANT_DRAG && state->mouse_buttons) || + (state->mouse_flags & MOUSE_WANT_MOVE)) { + int button = state->mouse_buttons & 0x01 ? 1 : + state->mouse_buttons & 0x02 ? 2 : + state->mouse_buttons & 0x04 ? 3 : 4; + output_mouse(state, button-1 + 0x20, 1, mod, col, row); + } +} + +void vterm_mouse_button(VTerm *vt, int button, bool pressed, VTermModifier mod) +{ + VTermState *state = vt->state; + + int old_buttons = state->mouse_buttons; + + if(button > 0 && button <= 3) { + if(pressed) + state->mouse_buttons |= (1 << (button-1)); + else + state->mouse_buttons &= ~(1 << (button-1)); + } + + /* Most of the time we don't get button releases from 4/5 */ + if(state->mouse_buttons == old_buttons && button < 4) + return; + + if(!state->mouse_flags) + return; + + if(button < 4) { + output_mouse(state, button-1, pressed, mod, state->mouse_col, state->mouse_row); + } + else if(button < 8) { + output_mouse(state, button-4 + 0x40, pressed, mod, state->mouse_col, state->mouse_row); + } +} diff --git a/third_party/libvterm/src/parser.c b/third_party/libvterm/src/parser.c new file mode 100644 index 0000000..b43a549 --- /dev/null +++ b/third_party/libvterm/src/parser.c @@ -0,0 +1,402 @@ +#include "vterm_internal.h" + +#include +#include + +#undef DEBUG_PARSER + +static bool is_intermed(unsigned char c) +{ + return c >= 0x20 && c <= 0x2f; +} + +static void do_control(VTerm *vt, unsigned char control) +{ + if(vt->parser.callbacks && vt->parser.callbacks->control) + if((*vt->parser.callbacks->control)(control, vt->parser.cbdata)) + return; + + DEBUG_LOG("libvterm: Unhandled control 0x%02x\n", control); +} + +static void do_csi(VTerm *vt, char command) +{ +#ifdef DEBUG_PARSER + printf("Parsed CSI args as:\n", arglen, args); + printf(" leader: %s\n", vt->parser.v.csi.leader); + for(int argi = 0; argi < vt->parser.v.csi.argi; argi++) { + printf(" %lu", CSI_ARG(vt->parser.v.csi.args[argi])); + if(!CSI_ARG_HAS_MORE(vt->parser.v.csi.args[argi])) + printf("\n"); + printf(" intermed: %s\n", vt->parser.intermed); + } +#endif + + if(vt->parser.callbacks && vt->parser.callbacks->csi) + if((*vt->parser.callbacks->csi)( + vt->parser.v.csi.leaderlen ? vt->parser.v.csi.leader : NULL, + vt->parser.v.csi.args, + vt->parser.v.csi.argi, + vt->parser.intermedlen ? vt->parser.intermed : NULL, + command, + vt->parser.cbdata)) + return; + + DEBUG_LOG("libvterm: Unhandled CSI %c\n", command); +} + +static void do_escape(VTerm *vt, char command) +{ + char seq[INTERMED_MAX+1]; + + size_t len = vt->parser.intermedlen; + strncpy(seq, vt->parser.intermed, len); + seq[len++] = command; + seq[len] = 0; + + if(vt->parser.callbacks && vt->parser.callbacks->escape) + if((*vt->parser.callbacks->escape)(seq, len, vt->parser.cbdata)) + return; + + DEBUG_LOG("libvterm: Unhandled escape ESC 0x%02x\n", command); +} + +static void string_fragment(VTerm *vt, const char *str, size_t len, bool final) +{ + VTermStringFragment frag = { + .str = str, + .len = len, + .initial = vt->parser.string_initial, + .final = final, + }; + + switch(vt->parser.state) { + case OSC: + if(vt->parser.callbacks && vt->parser.callbacks->osc) + (*vt->parser.callbacks->osc)(vt->parser.v.osc.command, frag, vt->parser.cbdata); + break; + + case DCS: + if(vt->parser.callbacks && vt->parser.callbacks->dcs) + (*vt->parser.callbacks->dcs)(vt->parser.v.dcs.command, vt->parser.v.dcs.commandlen, frag, vt->parser.cbdata); + break; + + case APC: + if(vt->parser.callbacks && vt->parser.callbacks->apc) + (*vt->parser.callbacks->apc)(frag, vt->parser.cbdata); + break; + + case PM: + if(vt->parser.callbacks && vt->parser.callbacks->pm) + (*vt->parser.callbacks->pm)(frag, vt->parser.cbdata); + break; + + case SOS: + if(vt->parser.callbacks && vt->parser.callbacks->sos) + (*vt->parser.callbacks->sos)(frag, vt->parser.cbdata); + break; + + case NORMAL: + case CSI_LEADER: + case CSI_ARGS: + case CSI_INTERMED: + case OSC_COMMAND: + case DCS_COMMAND: + break; + } + + vt->parser.string_initial = false; +} + +size_t vterm_input_write(VTerm *vt, const char *bytes, size_t len) +{ + size_t pos = 0; + const char *string_start; + + switch(vt->parser.state) { + case NORMAL: + case CSI_LEADER: + case CSI_ARGS: + case CSI_INTERMED: + case OSC_COMMAND: + case DCS_COMMAND: + string_start = NULL; + break; + case OSC: + case DCS: + case APC: + case PM: + case SOS: + string_start = bytes; + break; + } + +#define ENTER_STATE(st) do { vt->parser.state = st; string_start = NULL; } while(0) +#define ENTER_NORMAL_STATE() ENTER_STATE(NORMAL) + +#define IS_STRING_STATE() (vt->parser.state >= OSC_COMMAND) + + for( ; pos < len; pos++) { + unsigned char c = bytes[pos]; + bool c1_allowed = !vt->mode.utf8; + + if(c == 0x00 || c == 0x7f) { // NUL, DEL + if(IS_STRING_STATE()) { + string_fragment(vt, string_start, bytes + pos - string_start, false); + string_start = bytes + pos + 1; + } + if(vt->parser.emit_nul) + do_control(vt, c); + continue; + } + if(c == 0x18 || c == 0x1a) { // CAN, SUB + vt->parser.in_esc = false; + ENTER_NORMAL_STATE(); + if(vt->parser.emit_nul) + do_control(vt, c); + continue; + } + else if(c == 0x1b) { // ESC + vt->parser.intermedlen = 0; + if(!IS_STRING_STATE()) + vt->parser.state = NORMAL; + vt->parser.in_esc = true; + continue; + } + else if(c == 0x07 && // BEL, can stand for ST in OSC or DCS state + IS_STRING_STATE()) { + // fallthrough + } + else if(c < 0x20) { // other C0 + if(vt->parser.state == SOS) + continue; // All other C0s permitted in SOS + + if(IS_STRING_STATE()) + string_fragment(vt, string_start, bytes + pos - string_start, false); + do_control(vt, c); + if(IS_STRING_STATE()) + string_start = bytes + pos + 1; + continue; + } + // else fallthrough + + size_t string_len = bytes + pos - string_start; + + if(vt->parser.in_esc) { + // Hoist an ESC letter into a C1 if we're not in a string mode + // Always accept ESC \ == ST even in string mode + if(!vt->parser.intermedlen && + c >= 0x40 && c < 0x60 && + ((!IS_STRING_STATE() || c == 0x5c))) { + c += 0x40; + c1_allowed = true; + if(string_len) + string_len -= 1; + vt->parser.in_esc = false; + } + else { + string_start = NULL; + vt->parser.state = NORMAL; + } + } + + switch(vt->parser.state) { + case CSI_LEADER: + /* Extract leader bytes 0x3c to 0x3f */ + if(c >= 0x3c && c <= 0x3f) { + if(vt->parser.v.csi.leaderlen < CSI_LEADER_MAX-1) + vt->parser.v.csi.leader[vt->parser.v.csi.leaderlen++] = c; + break; + } + + /* else fallthrough */ + vt->parser.v.csi.leader[vt->parser.v.csi.leaderlen] = 0; + + vt->parser.v.csi.argi = 0; + vt->parser.v.csi.args[0] = CSI_ARG_MISSING; + vt->parser.state = CSI_ARGS; + + /* fallthrough */ + case CSI_ARGS: + /* Numerical value of argument */ + if(c >= '0' && c <= '9') { + if(vt->parser.v.csi.args[vt->parser.v.csi.argi] == CSI_ARG_MISSING) + vt->parser.v.csi.args[vt->parser.v.csi.argi] = 0; + vt->parser.v.csi.args[vt->parser.v.csi.argi] *= 10; + vt->parser.v.csi.args[vt->parser.v.csi.argi] += c - '0'; + break; + } + if(c == ':') { + vt->parser.v.csi.args[vt->parser.v.csi.argi] |= CSI_ARG_FLAG_MORE; + c = ';'; + } + if(c == ';') { + vt->parser.v.csi.argi++; + vt->parser.v.csi.args[vt->parser.v.csi.argi] = CSI_ARG_MISSING; + break; + } + + /* else fallthrough */ + vt->parser.v.csi.argi++; + vt->parser.intermedlen = 0; + vt->parser.state = CSI_INTERMED; + case CSI_INTERMED: + if(is_intermed(c)) { + if(vt->parser.intermedlen < INTERMED_MAX-1) + vt->parser.intermed[vt->parser.intermedlen++] = c; + break; + } + else if(c == 0x1b) { + /* ESC in CSI cancels */ + } + else if(c >= 0x40 && c <= 0x7e) { + vt->parser.intermed[vt->parser.intermedlen] = 0; + do_csi(vt, c); + } + /* else was invalid CSI */ + + ENTER_NORMAL_STATE(); + break; + + case OSC_COMMAND: + /* Numerical value of command */ + if(c >= '0' && c <= '9') { + if(vt->parser.v.osc.command == -1) + vt->parser.v.osc.command = 0; + else + vt->parser.v.osc.command *= 10; + vt->parser.v.osc.command += c - '0'; + break; + } + if(c == ';') { + vt->parser.state = OSC; + string_start = bytes + pos + 1; + break; + } + + /* else fallthrough */ + string_start = bytes + pos; + string_len = 0; + vt->parser.state = OSC; + goto string_state; + + case DCS_COMMAND: + if(vt->parser.v.dcs.commandlen < CSI_LEADER_MAX) + vt->parser.v.dcs.command[vt->parser.v.dcs.commandlen++] = c; + + if(c >= 0x40 && c<= 0x7e) { + string_start = bytes + pos + 1; + vt->parser.state = DCS; + } + break; + +string_state: + case OSC: + case DCS: + case APC: + case PM: + case SOS: + if(c == 0x07 || (c1_allowed && c == 0x9c)) { + string_fragment(vt, string_start, string_len, true); + ENTER_NORMAL_STATE(); + } + break; + + case NORMAL: + if(vt->parser.in_esc) { + if(is_intermed(c)) { + if(vt->parser.intermedlen < INTERMED_MAX-1) + vt->parser.intermed[vt->parser.intermedlen++] = c; + } + else if(c >= 0x30 && c < 0x7f) { + do_escape(vt, c); + vt->parser.in_esc = 0; + ENTER_NORMAL_STATE(); + } + else { + DEBUG_LOG("TODO: Unhandled byte %02x in Escape\n", c); + } + break; + } + if(c1_allowed && c >= 0x80 && c < 0xa0) { + switch(c) { + case 0x90: // DCS + vt->parser.string_initial = true; + vt->parser.v.dcs.commandlen = 0; + ENTER_STATE(DCS_COMMAND); + break; + case 0x98: // SOS + vt->parser.string_initial = true; + ENTER_STATE(SOS); + string_start = bytes + pos + 1; + string_len = 0; + break; + case 0x9b: // CSI + vt->parser.v.csi.leaderlen = 0; + ENTER_STATE(CSI_LEADER); + break; + case 0x9d: // OSC + vt->parser.v.osc.command = -1; + vt->parser.string_initial = true; + string_start = bytes + pos + 1; + ENTER_STATE(OSC_COMMAND); + break; + case 0x9e: // PM + vt->parser.string_initial = true; + ENTER_STATE(PM); + string_start = bytes + pos + 1; + string_len = 0; + break; + case 0x9f: // APC + vt->parser.string_initial = true; + ENTER_STATE(APC); + string_start = bytes + pos + 1; + string_len = 0; + break; + default: + do_control(vt, c); + break; + } + } + else { + size_t eaten = 0; + if(vt->parser.callbacks && vt->parser.callbacks->text) + eaten = (*vt->parser.callbacks->text)(bytes + pos, len - pos, vt->parser.cbdata); + + if(!eaten) { + DEBUG_LOG("libvterm: Text callback did not consume any input\n"); + /* force it to make progress */ + eaten = 1; + } + + pos += (eaten - 1); // we'll ++ it again in a moment + } + break; + } + } + + if(string_start) { + size_t string_len = bytes + pos - string_start; + if(vt->parser.in_esc) + string_len -= 1; + string_fragment(vt, string_start, string_len, false); + } + + return len; +} + +void vterm_parser_set_callbacks(VTerm *vt, const VTermParserCallbacks *callbacks, void *user) +{ + vt->parser.callbacks = callbacks; + vt->parser.cbdata = user; +} + +void *vterm_parser_get_cbdata(VTerm *vt) +{ + return vt->parser.cbdata; +} + +void vterm_parser_set_emit_nul(VTerm *vt, bool emit) +{ + vt->parser.emit_nul = emit; +} diff --git a/third_party/libvterm/src/pen.c b/third_party/libvterm/src/pen.c new file mode 100644 index 0000000..2227a6f --- /dev/null +++ b/third_party/libvterm/src/pen.c @@ -0,0 +1,607 @@ +#include "vterm_internal.h" + +#include + +/** + * Structure used to store RGB triples without the additional metadata stored in + * VTermColor. + */ +typedef struct { + uint8_t red, green, blue; +} VTermRGB; + +static const VTermRGB ansi_colors[] = { + /* R G B */ + { 0, 0, 0 }, // black + { 224, 0, 0 }, // red + { 0, 224, 0 }, // green + { 224, 224, 0 }, // yellow + { 0, 0, 224 }, // blue + { 224, 0, 224 }, // magenta + { 0, 224, 224 }, // cyan + { 224, 224, 224 }, // white == light grey + + // high intensity + { 128, 128, 128 }, // black + { 255, 64, 64 }, // red + { 64, 255, 64 }, // green + { 255, 255, 64 }, // yellow + { 64, 64, 255 }, // blue + { 255, 64, 255 }, // magenta + { 64, 255, 255 }, // cyan + { 255, 255, 255 }, // white for real +}; + +static int ramp6[] = { + 0x00, 0x33, 0x66, 0x99, 0xCC, 0xFF, +}; + +static int ramp24[] = { + 0x00, 0x0B, 0x16, 0x21, 0x2C, 0x37, 0x42, 0x4D, 0x58, 0x63, 0x6E, 0x79, + 0x85, 0x90, 0x9B, 0xA6, 0xB1, 0xBC, 0xC7, 0xD2, 0xDD, 0xE8, 0xF3, 0xFF, +}; + +static void lookup_default_colour_ansi(long idx, VTermColor *col) +{ + if (idx >= 0 && idx < 16) { + vterm_color_rgb( + col, + ansi_colors[idx].red, ansi_colors[idx].green, ansi_colors[idx].blue); + } +} + +static bool lookup_colour_ansi(const VTermState *state, long index, VTermColor *col) +{ + if(index >= 0 && index < 16) { + *col = state->colors[index]; + return true; + } + + return false; +} + +static bool lookup_colour_palette(const VTermState *state, long index, VTermColor *col) +{ + if(index >= 0 && index < 16) { + // Normal 8 colours or high intensity - parse as palette 0 + return lookup_colour_ansi(state, index, col); + } + else if(index >= 16 && index < 232) { + // 216-colour cube + index -= 16; + + vterm_color_rgb(col, ramp6[index/6/6 % 6], + ramp6[index/6 % 6], + ramp6[index % 6]); + + return true; + } + else if(index >= 232 && index < 256) { + // 24 greyscales + index -= 232; + + vterm_color_rgb(col, ramp24[index], ramp24[index], ramp24[index]); + + return true; + } + + return false; +} + +static int lookup_colour(const VTermState *state, int palette, const long args[], int argcount, VTermColor *col) +{ + switch(palette) { + case 2: // RGB mode - 3 args contain colour values directly + if(argcount < 3) + return argcount; + + vterm_color_rgb(col, CSI_ARG(args[0]), CSI_ARG(args[1]), CSI_ARG(args[2])); + + return 3; + + case 5: // XTerm 256-colour mode + if (!argcount || CSI_ARG_IS_MISSING(args[0])) { + return argcount ? 1 : 0; + } + + vterm_color_indexed(col, args[0]); + + return argcount ? 1 : 0; + + default: + DEBUG_LOG("Unrecognised colour palette %d\n", palette); + return 0; + } +} + +// Some conveniences + +static void setpenattr(VTermState *state, VTermAttr attr, VTermValueType type, VTermValue *val) +{ +#ifdef DEBUG + if(type != vterm_get_attr_type(attr)) { + DEBUG_LOG("Cannot set attr %d as it has type %d, not type %d\n", + attr, vterm_get_attr_type(attr), type); + return; + } +#endif + if(state->callbacks && state->callbacks->setpenattr) + (*state->callbacks->setpenattr)(attr, val, state->cbdata); +} + +static void setpenattr_bool(VTermState *state, VTermAttr attr, int boolean) +{ + VTermValue val = { .boolean = boolean }; + setpenattr(state, attr, VTERM_VALUETYPE_BOOL, &val); +} + +static void setpenattr_int(VTermState *state, VTermAttr attr, int number) +{ + VTermValue val = { .number = number }; + setpenattr(state, attr, VTERM_VALUETYPE_INT, &val); +} + +static void setpenattr_col(VTermState *state, VTermAttr attr, VTermColor color) +{ + VTermValue val = { .color = color }; + setpenattr(state, attr, VTERM_VALUETYPE_COLOR, &val); +} + +static void set_pen_col_ansi(VTermState *state, VTermAttr attr, long col) +{ + VTermColor *colp = (attr == VTERM_ATTR_BACKGROUND) ? &state->pen.bg : &state->pen.fg; + + vterm_color_indexed(colp, col); + + setpenattr_col(state, attr, *colp); +} + +INTERNAL void vterm_state_newpen(VTermState *state) +{ + // 90% grey so that pure white is brighter + vterm_color_rgb(&state->default_fg, 240, 240, 240); + vterm_color_rgb(&state->default_bg, 0, 0, 0); + vterm_state_set_default_colors(state, &state->default_fg, &state->default_bg); + + for(int col = 0; col < 16; col++) + lookup_default_colour_ansi(col, &state->colors[col]); +} + +INTERNAL void vterm_state_resetpen(VTermState *state) +{ + state->pen.bold = 0; setpenattr_bool(state, VTERM_ATTR_BOLD, 0); + state->pen.underline = 0; setpenattr_int (state, VTERM_ATTR_UNDERLINE, 0); + state->pen.italic = 0; setpenattr_bool(state, VTERM_ATTR_ITALIC, 0); + state->pen.blink = 0; setpenattr_bool(state, VTERM_ATTR_BLINK, 0); + state->pen.reverse = 0; setpenattr_bool(state, VTERM_ATTR_REVERSE, 0); + state->pen.conceal = 0; setpenattr_bool(state, VTERM_ATTR_CONCEAL, 0); + state->pen.strike = 0; setpenattr_bool(state, VTERM_ATTR_STRIKE, 0); + state->pen.font = 0; setpenattr_int (state, VTERM_ATTR_FONT, 0); + state->pen.small = 0; setpenattr_bool(state, VTERM_ATTR_SMALL, 0); + state->pen.baseline = 0; setpenattr_int (state, VTERM_ATTR_BASELINE, 0); + + state->pen.fg = state->default_fg; setpenattr_col(state, VTERM_ATTR_FOREGROUND, state->default_fg); + state->pen.bg = state->default_bg; setpenattr_col(state, VTERM_ATTR_BACKGROUND, state->default_bg); +} + +INTERNAL void vterm_state_savepen(VTermState *state, int save) +{ + if(save) { + state->saved.pen = state->pen; + } + else { + state->pen = state->saved.pen; + + setpenattr_bool(state, VTERM_ATTR_BOLD, state->pen.bold); + setpenattr_int (state, VTERM_ATTR_UNDERLINE, state->pen.underline); + setpenattr_bool(state, VTERM_ATTR_ITALIC, state->pen.italic); + setpenattr_bool(state, VTERM_ATTR_BLINK, state->pen.blink); + setpenattr_bool(state, VTERM_ATTR_REVERSE, state->pen.reverse); + setpenattr_bool(state, VTERM_ATTR_CONCEAL, state->pen.conceal); + setpenattr_bool(state, VTERM_ATTR_STRIKE, state->pen.strike); + setpenattr_int (state, VTERM_ATTR_FONT, state->pen.font); + setpenattr_bool(state, VTERM_ATTR_SMALL, state->pen.small); + setpenattr_int (state, VTERM_ATTR_BASELINE, state->pen.baseline); + + setpenattr_col( state, VTERM_ATTR_FOREGROUND, state->pen.fg); + setpenattr_col( state, VTERM_ATTR_BACKGROUND, state->pen.bg); + } +} + +int vterm_color_is_equal(const VTermColor *a, const VTermColor *b) +{ + /* First make sure that the two colours are of the same type (RGB/Indexed) */ + if (a->type != b->type) { + return false; + } + + /* Depending on the type inspect the corresponding members */ + if (VTERM_COLOR_IS_INDEXED(a)) { + return a->indexed.idx == b->indexed.idx; + } + else if (VTERM_COLOR_IS_RGB(a)) { + return (a->rgb.red == b->rgb.red) + && (a->rgb.green == b->rgb.green) + && (a->rgb.blue == b->rgb.blue); + } + + return 0; +} + +void vterm_state_get_default_colors(const VTermState *state, VTermColor *default_fg, VTermColor *default_bg) +{ + *default_fg = state->default_fg; + *default_bg = state->default_bg; +} + +void vterm_state_get_palette_color(const VTermState *state, int index, VTermColor *col) +{ + lookup_colour_palette(state, index, col); +} + +void vterm_state_set_default_colors(VTermState *state, const VTermColor *default_fg, const VTermColor *default_bg) +{ + if(default_fg) { + state->default_fg = *default_fg; + state->default_fg.type = (state->default_fg.type & ~VTERM_COLOR_DEFAULT_MASK) + | VTERM_COLOR_DEFAULT_FG; + } + + if(default_bg) { + state->default_bg = *default_bg; + state->default_bg.type = (state->default_bg.type & ~VTERM_COLOR_DEFAULT_MASK) + | VTERM_COLOR_DEFAULT_BG; + } +} + +void vterm_state_set_palette_color(VTermState *state, int index, const VTermColor *col) +{ + if(index >= 0 && index < 16) + state->colors[index] = *col; +} + +void vterm_state_convert_color_to_rgb(const VTermState *state, VTermColor *col) +{ + if (VTERM_COLOR_IS_INDEXED(col)) { /* Convert indexed colors to RGB */ + lookup_colour_palette(state, col->indexed.idx, col); + } + col->type &= VTERM_COLOR_TYPE_MASK; /* Reset any metadata but the type */ +} + +void vterm_state_set_bold_highbright(VTermState *state, int bold_is_highbright) +{ + state->bold_is_highbright = bold_is_highbright; +} + +INTERNAL void vterm_state_setpen(VTermState *state, const long args[], int argcount) +{ + // SGR - ECMA-48 8.3.117 + + int argi = 0; + int value; + + while(argi < argcount) { + // This logic is easier to do 'done' backwards; set it true, and make it + // false again in the 'default' case + int done = 1; + + long arg; + switch(arg = CSI_ARG(args[argi])) { + case CSI_ARG_MISSING: + case 0: // Reset + vterm_state_resetpen(state); + break; + + case 1: { // Bold on + const VTermColor *fg = &state->pen.fg; + state->pen.bold = 1; + setpenattr_bool(state, VTERM_ATTR_BOLD, 1); + if(!VTERM_COLOR_IS_DEFAULT_FG(fg) && VTERM_COLOR_IS_INDEXED(fg) && fg->indexed.idx < 8 && state->bold_is_highbright) + set_pen_col_ansi(state, VTERM_ATTR_FOREGROUND, fg->indexed.idx + (state->pen.bold ? 8 : 0)); + break; + } + + case 3: // Italic on + state->pen.italic = 1; + setpenattr_bool(state, VTERM_ATTR_ITALIC, 1); + break; + + case 4: // Underline + state->pen.underline = VTERM_UNDERLINE_SINGLE; + if(CSI_ARG_HAS_MORE(args[argi])) { + argi++; + switch(CSI_ARG(args[argi])) { + case 0: + state->pen.underline = 0; + break; + case 1: + state->pen.underline = VTERM_UNDERLINE_SINGLE; + break; + case 2: + state->pen.underline = VTERM_UNDERLINE_DOUBLE; + break; + case 3: + state->pen.underline = VTERM_UNDERLINE_CURLY; + break; + } + } + setpenattr_int(state, VTERM_ATTR_UNDERLINE, state->pen.underline); + break; + + case 5: // Blink + state->pen.blink = 1; + setpenattr_bool(state, VTERM_ATTR_BLINK, 1); + break; + + case 7: // Reverse on + state->pen.reverse = 1; + setpenattr_bool(state, VTERM_ATTR_REVERSE, 1); + break; + + case 8: // Conceal on + state->pen.conceal = 1; + setpenattr_bool(state, VTERM_ATTR_CONCEAL, 1); + break; + + case 9: // Strikethrough on + state->pen.strike = 1; + setpenattr_bool(state, VTERM_ATTR_STRIKE, 1); + break; + + case 10: case 11: case 12: case 13: case 14: + case 15: case 16: case 17: case 18: case 19: // Select font + state->pen.font = CSI_ARG(args[argi]) - 10; + setpenattr_int(state, VTERM_ATTR_FONT, state->pen.font); + break; + + case 21: // Underline double + state->pen.underline = VTERM_UNDERLINE_DOUBLE; + setpenattr_int(state, VTERM_ATTR_UNDERLINE, state->pen.underline); + break; + + case 22: // Bold off + state->pen.bold = 0; + setpenattr_bool(state, VTERM_ATTR_BOLD, 0); + break; + + case 23: // Italic and Gothic (currently unsupported) off + state->pen.italic = 0; + setpenattr_bool(state, VTERM_ATTR_ITALIC, 0); + break; + + case 24: // Underline off + state->pen.underline = 0; + setpenattr_int(state, VTERM_ATTR_UNDERLINE, 0); + break; + + case 25: // Blink off + state->pen.blink = 0; + setpenattr_bool(state, VTERM_ATTR_BLINK, 0); + break; + + case 27: // Reverse off + state->pen.reverse = 0; + setpenattr_bool(state, VTERM_ATTR_REVERSE, 0); + break; + + case 28: // Conceal off (Reveal) + state->pen.conceal = 0; + setpenattr_bool(state, VTERM_ATTR_CONCEAL, 0); + break; + + case 29: // Strikethrough off + state->pen.strike = 0; + setpenattr_bool(state, VTERM_ATTR_STRIKE, 0); + break; + + case 30: case 31: case 32: case 33: + case 34: case 35: case 36: case 37: // Foreground colour palette + value = CSI_ARG(args[argi]) - 30; + if(state->pen.bold && state->bold_is_highbright) + value += 8; + set_pen_col_ansi(state, VTERM_ATTR_FOREGROUND, value); + break; + + case 38: // Foreground colour alternative palette + if(argcount - argi < 1) + return; + argi += 1 + lookup_colour(state, CSI_ARG(args[argi+1]), args+argi+2, argcount-argi-2, &state->pen.fg); + setpenattr_col(state, VTERM_ATTR_FOREGROUND, state->pen.fg); + break; + + case 39: // Foreground colour default + state->pen.fg = state->default_fg; + setpenattr_col(state, VTERM_ATTR_FOREGROUND, state->pen.fg); + break; + + case 40: case 41: case 42: case 43: + case 44: case 45: case 46: case 47: // Background colour palette + value = CSI_ARG(args[argi]) - 40; + set_pen_col_ansi(state, VTERM_ATTR_BACKGROUND, value); + break; + + case 48: // Background colour alternative palette + if(argcount - argi < 1) + return; + argi += 1 + lookup_colour(state, CSI_ARG(args[argi+1]), args+argi+2, argcount-argi-2, &state->pen.bg); + setpenattr_col(state, VTERM_ATTR_BACKGROUND, state->pen.bg); + break; + + case 49: // Default background + state->pen.bg = state->default_bg; + setpenattr_col(state, VTERM_ATTR_BACKGROUND, state->pen.bg); + break; + + case 73: // Superscript + case 74: // Subscript + case 75: // Superscript/subscript off + state->pen.small = (arg != 75); + state->pen.baseline = + (arg == 73) ? VTERM_BASELINE_RAISE : + (arg == 74) ? VTERM_BASELINE_LOWER : + VTERM_BASELINE_NORMAL; + setpenattr_bool(state, VTERM_ATTR_SMALL, state->pen.small); + setpenattr_int (state, VTERM_ATTR_BASELINE, state->pen.baseline); + break; + + case 90: case 91: case 92: case 93: + case 94: case 95: case 96: case 97: // Foreground colour high-intensity palette + value = CSI_ARG(args[argi]) - 90 + 8; + set_pen_col_ansi(state, VTERM_ATTR_FOREGROUND, value); + break; + + case 100: case 101: case 102: case 103: + case 104: case 105: case 106: case 107: // Background colour high-intensity palette + value = CSI_ARG(args[argi]) - 100 + 8; + set_pen_col_ansi(state, VTERM_ATTR_BACKGROUND, value); + break; + + default: + done = 0; + break; + } + + if(!done) + DEBUG_LOG("libvterm: Unhandled CSI SGR %ld\n", arg); + + while(CSI_ARG_HAS_MORE(args[argi++])); + } +} + +static int vterm_state_getpen_color(const VTermColor *col, int argi, long args[], int fg) +{ + /* Do nothing if the given color is the default color */ + if (( fg && VTERM_COLOR_IS_DEFAULT_FG(col)) || + (!fg && VTERM_COLOR_IS_DEFAULT_BG(col))) { + return argi; + } + + /* Decide whether to send an indexed color or an RGB color */ + if (VTERM_COLOR_IS_INDEXED(col)) { + const uint8_t idx = col->indexed.idx; + if (idx < 8) { + args[argi++] = (idx + (fg ? 30 : 40)); + } + else if (idx < 16) { + args[argi++] = (idx - 8 + (fg ? 90 : 100)); + } + else { + args[argi++] = CSI_ARG_FLAG_MORE | (fg ? 38 : 48); + args[argi++] = CSI_ARG_FLAG_MORE | 5; + args[argi++] = idx; + } + } + else if (VTERM_COLOR_IS_RGB(col)) { + args[argi++] = CSI_ARG_FLAG_MORE | (fg ? 38 : 48); + args[argi++] = CSI_ARG_FLAG_MORE | 2; + args[argi++] = CSI_ARG_FLAG_MORE | col->rgb.red; + args[argi++] = CSI_ARG_FLAG_MORE | col->rgb.green; + args[argi++] = col->rgb.blue; + } + return argi; +} + +INTERNAL int vterm_state_getpen(VTermState *state, long args[], int argcount) +{ + int argi = 0; + + if(state->pen.bold) + args[argi++] = 1; + + if(state->pen.italic) + args[argi++] = 3; + + if(state->pen.underline == VTERM_UNDERLINE_SINGLE) + args[argi++] = 4; + if(state->pen.underline == VTERM_UNDERLINE_CURLY) + args[argi++] = 4 | CSI_ARG_FLAG_MORE, args[argi++] = 3; + + if(state->pen.blink) + args[argi++] = 5; + + if(state->pen.reverse) + args[argi++] = 7; + + if(state->pen.conceal) + args[argi++] = 8; + + if(state->pen.strike) + args[argi++] = 9; + + if(state->pen.font) + args[argi++] = 10 + state->pen.font; + + if(state->pen.underline == VTERM_UNDERLINE_DOUBLE) + args[argi++] = 21; + + argi = vterm_state_getpen_color(&state->pen.fg, argi, args, true); + + argi = vterm_state_getpen_color(&state->pen.bg, argi, args, false); + + if(state->pen.small) { + if(state->pen.baseline == VTERM_BASELINE_RAISE) + args[argi++] = 73; + else if(state->pen.baseline == VTERM_BASELINE_LOWER) + args[argi++] = 74; + } + + return argi; +} + +int vterm_state_get_penattr(const VTermState *state, VTermAttr attr, VTermValue *val) +{ + switch(attr) { + case VTERM_ATTR_BOLD: + val->boolean = state->pen.bold; + return 1; + + case VTERM_ATTR_UNDERLINE: + val->number = state->pen.underline; + return 1; + + case VTERM_ATTR_ITALIC: + val->boolean = state->pen.italic; + return 1; + + case VTERM_ATTR_BLINK: + val->boolean = state->pen.blink; + return 1; + + case VTERM_ATTR_REVERSE: + val->boolean = state->pen.reverse; + return 1; + + case VTERM_ATTR_CONCEAL: + val->boolean = state->pen.conceal; + return 1; + + case VTERM_ATTR_STRIKE: + val->boolean = state->pen.strike; + return 1; + + case VTERM_ATTR_FONT: + val->number = state->pen.font; + return 1; + + case VTERM_ATTR_FOREGROUND: + val->color = state->pen.fg; + return 1; + + case VTERM_ATTR_BACKGROUND: + val->color = state->pen.bg; + return 1; + + case VTERM_ATTR_SMALL: + val->boolean = state->pen.small; + return 1; + + case VTERM_ATTR_BASELINE: + val->number = state->pen.baseline; + return 1; + + case VTERM_N_ATTRS: + return 0; + } + + return 0; +} diff --git a/third_party/libvterm/src/rect.h b/third_party/libvterm/src/rect.h new file mode 100644 index 0000000..2114f24 --- /dev/null +++ b/third_party/libvterm/src/rect.h @@ -0,0 +1,56 @@ +/* + * Some utility functions on VTermRect structures + */ + +#define STRFrect "(%d,%d-%d,%d)" +#define ARGSrect(r) (r).start_row, (r).start_col, (r).end_row, (r).end_col + +/* Expand dst to contain src as well */ +static void rect_expand(VTermRect *dst, VTermRect *src) +{ + if(dst->start_row > src->start_row) dst->start_row = src->start_row; + if(dst->start_col > src->start_col) dst->start_col = src->start_col; + if(dst->end_row < src->end_row) dst->end_row = src->end_row; + if(dst->end_col < src->end_col) dst->end_col = src->end_col; +} + +/* Clip the dst to ensure it does not step outside of bounds */ +static void rect_clip(VTermRect *dst, VTermRect *bounds) +{ + if(dst->start_row < bounds->start_row) dst->start_row = bounds->start_row; + if(dst->start_col < bounds->start_col) dst->start_col = bounds->start_col; + if(dst->end_row > bounds->end_row) dst->end_row = bounds->end_row; + if(dst->end_col > bounds->end_col) dst->end_col = bounds->end_col; + /* Ensure it doesn't end up negatively-sized */ + if(dst->end_row < dst->start_row) dst->end_row = dst->start_row; + if(dst->end_col < dst->start_col) dst->end_col = dst->start_col; +} + +/* True if the two rectangles are equal */ +static int rect_equal(VTermRect *a, VTermRect *b) +{ + return (a->start_row == b->start_row) && + (a->start_col == b->start_col) && + (a->end_row == b->end_row) && + (a->end_col == b->end_col); +} + +/* True if small is contained entirely within big */ +static int rect_contains(VTermRect *big, VTermRect *small) +{ + if(small->start_row < big->start_row) return 0; + if(small->start_col < big->start_col) return 0; + if(small->end_row > big->end_row) return 0; + if(small->end_col > big->end_col) return 0; + return 1; +} + +/* True if the rectangles overlap at all */ +static int rect_intersects(VTermRect *a, VTermRect *b) +{ + if(a->start_row > b->end_row || b->start_row > a->end_row) + return 0; + if(a->start_col > b->end_col || b->start_col > a->end_col) + return 0; + return 1; +} diff --git a/third_party/libvterm/src/screen.c b/third_party/libvterm/src/screen.c new file mode 100644 index 0000000..6747acb --- /dev/null +++ b/third_party/libvterm/src/screen.c @@ -0,0 +1,1214 @@ +#include "vterm_internal.h" + +#include +#include + +#include "rect.h" +#include "utf8.h" + +#define UNICODE_SPACE 0x20 +#define UNICODE_LINEFEED 0x0a + +#undef DEBUG_REFLOW + +/* State of the pen at some moment in time, also used in a cell */ +typedef struct +{ + /* After the bitfield */ + VTermColor fg, bg; + + unsigned int bold : 1; + unsigned int underline : 2; + unsigned int italic : 1; + unsigned int blink : 1; + unsigned int reverse : 1; + unsigned int conceal : 1; + unsigned int strike : 1; + unsigned int font : 4; /* 0 to 9 */ + unsigned int small : 1; + unsigned int baseline : 2; + + /* Extra state storage that isn't strictly pen-related */ + unsigned int protected_cell : 1; + unsigned int dwl : 1; /* on a DECDWL or DECDHL line */ + unsigned int dhl : 2; /* on a DECDHL line (1=top 2=bottom) */ +} ScreenPen; + +/* Internal representation of a screen cell */ +typedef struct +{ + uint32_t chars[VTERM_MAX_CHARS_PER_CELL]; + ScreenPen pen; +} ScreenCell; + +struct VTermScreen +{ + VTerm *vt; + VTermState *state; + + const VTermScreenCallbacks *callbacks; + void *cbdata; + bool callbacks_has_pushline4; + + VTermDamageSize damage_merge; + /* start_row == -1 => no damage */ + VTermRect damaged; + VTermRect pending_scrollrect; + int pending_scroll_downward, pending_scroll_rightward; + + int rows; + int cols; + + unsigned int global_reverse : 1; + unsigned int reflow : 1; + + /* Primary and Altscreen. buffers[1] is lazily allocated as needed */ + ScreenCell *buffers[2]; + + /* buffer will == buffers[0] or buffers[1], depending on altscreen */ + ScreenCell *buffer; + + /* buffer for a single screen row used in scrollback storage callbacks */ + VTermScreenCell *sb_buffer; + + ScreenPen pen; +}; + +static inline void clearcell(const VTermScreen *screen, ScreenCell *cell) +{ + cell->chars[0] = 0; + cell->pen = screen->pen; +} + +static inline ScreenCell *getcell(const VTermScreen *screen, int row, int col) +{ + if(row < 0 || row >= screen->rows) + return NULL; + if(col < 0 || col >= screen->cols) + return NULL; + return screen->buffer + (screen->cols * row) + col; +} + +static ScreenCell *alloc_buffer(VTermScreen *screen, int rows, int cols) +{ + ScreenCell *new_buffer = vterm_allocator_malloc(screen->vt, sizeof(ScreenCell) * rows * cols); + + for(int row = 0; row < rows; row++) { + for(int col = 0; col < cols; col++) { + clearcell(screen, &new_buffer[row * cols + col]); + } + } + + return new_buffer; +} + +static void damagerect(VTermScreen *screen, VTermRect rect) +{ + VTermRect emit; + + switch(screen->damage_merge) { + case VTERM_DAMAGE_CELL: + /* Always emit damage event */ + emit = rect; + break; + + case VTERM_DAMAGE_ROW: + /* Emit damage longer than one row. Try to merge with existing damage in + * the same row */ + if(rect.end_row > rect.start_row + 1) { + // Bigger than 1 line - flush existing, emit this + vterm_screen_flush_damage(screen); + emit = rect; + } + else if(screen->damaged.start_row == -1) { + // None stored yet + screen->damaged = rect; + return; + } + else if(rect.start_row == screen->damaged.start_row) { + // Merge with the stored line + if(screen->damaged.start_col > rect.start_col) + screen->damaged.start_col = rect.start_col; + if(screen->damaged.end_col < rect.end_col) + screen->damaged.end_col = rect.end_col; + return; + } + else { + // Emit the currently stored line, store a new one + emit = screen->damaged; + screen->damaged = rect; + } + break; + + case VTERM_DAMAGE_SCREEN: + case VTERM_DAMAGE_SCROLL: + /* Never emit damage event */ + if(screen->damaged.start_row == -1) + screen->damaged = rect; + else { + rect_expand(&screen->damaged, &rect); + } + return; + + default: + DEBUG_LOG("TODO: Maybe merge damage for level %d\n", screen->damage_merge); + return; + } + + if(screen->callbacks && screen->callbacks->damage) + (*screen->callbacks->damage)(emit, screen->cbdata); +} + +static void damagescreen(VTermScreen *screen) +{ + VTermRect rect = { + .start_row = 0, + .end_row = screen->rows, + .start_col = 0, + .end_col = screen->cols, + }; + + damagerect(screen, rect); +} + +static int putglyph(VTermGlyphInfo *info, VTermPos pos, void *user) +{ + VTermScreen *screen = user; + ScreenCell *cell = getcell(screen, pos.row, pos.col); + + if(!cell) + return 0; + + int i; + for(i = 0; i < VTERM_MAX_CHARS_PER_CELL && info->chars[i]; i++) { + cell->chars[i] = info->chars[i]; + cell->pen = screen->pen; + } + if(i < VTERM_MAX_CHARS_PER_CELL) + cell->chars[i] = 0; + + for(int col = 1; col < info->width; col++) + getcell(screen, pos.row, pos.col + col)->chars[0] = (uint32_t)-1; + + VTermRect rect = { + .start_row = pos.row, + .end_row = pos.row+1, + .start_col = pos.col, + .end_col = pos.col+info->width, + }; + + cell->pen.protected_cell = info->protected_cell; + cell->pen.dwl = info->dwl; + cell->pen.dhl = info->dhl; + + damagerect(screen, rect); + + return 1; +} + +static void sb_pushline_from_row(VTermScreen *screen, int row, bool continuation) +{ + VTermPos pos = { .row = row }; + for(pos.col = 0; pos.col < screen->cols; pos.col++) + vterm_screen_get_cell(screen, pos, screen->sb_buffer + pos.col); + + if(screen->callbacks_has_pushline4 && screen->callbacks->sb_pushline4) + (screen->callbacks->sb_pushline4)(screen->cols, screen->sb_buffer, continuation, screen->cbdata); + else + (screen->callbacks->sb_pushline)(screen->cols, screen->sb_buffer, screen->cbdata); +} + +static int premove(VTermRect rect, void *user) +{ + VTermScreen *screen = user; + + if(((screen->callbacks && screen->callbacks->sb_pushline) || + (screen->callbacks_has_pushline4 && screen->callbacks && screen->callbacks->sb_pushline4)) && + rect.start_row == 0 && rect.start_col == 0 && // starts top-left corner + rect.end_col == screen->cols && // full width + screen->buffer == screen->buffers[BUFIDX_PRIMARY]) { // not altscreen + for(int row = 0; row < rect.end_row; row++) { + const VTermLineInfo *lineinfo = vterm_state_get_lineinfo(screen->state, row); + sb_pushline_from_row(screen, row, lineinfo->continuation); + } + } + + return 1; +} + +static int moverect_internal(VTermRect dest, VTermRect src, void *user) +{ + VTermScreen *screen = user; + + int cols = src.end_col - src.start_col; + int downward = src.start_row - dest.start_row; + + int init_row, test_row, inc_row; + if(downward < 0) { + init_row = dest.end_row - 1; + test_row = dest.start_row - 1; + inc_row = -1; + } + else { + init_row = dest.start_row; + test_row = dest.end_row; + inc_row = +1; + } + + for(int row = init_row; row != test_row; row += inc_row) + memmove(getcell(screen, row, dest.start_col), + getcell(screen, row + downward, src.start_col), + cols * sizeof(ScreenCell)); + + return 1; +} + +static int moverect_user(VTermRect dest, VTermRect src, void *user) +{ + VTermScreen *screen = user; + + if(screen->callbacks && screen->callbacks->moverect) { + if(screen->damage_merge != VTERM_DAMAGE_SCROLL) + // Avoid an infinite loop + vterm_screen_flush_damage(screen); + + if((*screen->callbacks->moverect)(dest, src, screen->cbdata)) + return 1; + } + + damagerect(screen, dest); + + return 1; +} + +static int erase_internal(VTermRect rect, int selective, void *user) +{ + VTermScreen *screen = user; + + for(int row = rect.start_row; row < screen->state->rows && row < rect.end_row; row++) { + const VTermLineInfo *info = vterm_state_get_lineinfo(screen->state, row); + + for(int col = rect.start_col; col < rect.end_col; col++) { + ScreenCell *cell = getcell(screen, row, col); + + if(selective && cell->pen.protected_cell) + continue; + + cell->chars[0] = 0; + cell->pen = (ScreenPen){ + /* Only copy .fg and .bg; leave things like rv in reset state */ + .fg = screen->pen.fg, + .bg = screen->pen.bg, + }; + cell->pen.dwl = info->doublewidth; + cell->pen.dhl = info->doubleheight; + } + } + + return 1; +} + +static int erase_user(VTermRect rect, int selective, void *user) +{ + VTermScreen *screen = user; + + damagerect(screen, rect); + + return 1; +} + +static int erase(VTermRect rect, int selective, void *user) +{ + erase_internal(rect, selective, user); + return erase_user(rect, 0, user); +} + +static int scrollrect(VTermRect rect, int downward, int rightward, void *user) +{ + VTermScreen *screen = user; + + if(screen->damage_merge != VTERM_DAMAGE_SCROLL) { + vterm_scroll_rect(rect, downward, rightward, + moverect_internal, erase_internal, screen); + + vterm_screen_flush_damage(screen); + + vterm_scroll_rect(rect, downward, rightward, + moverect_user, erase_user, screen); + + return 1; + } + + if(screen->damaged.start_row != -1 && + !rect_intersects(&rect, &screen->damaged)) { + vterm_screen_flush_damage(screen); + } + + if(screen->pending_scrollrect.start_row == -1) { + screen->pending_scrollrect = rect; + screen->pending_scroll_downward = downward; + screen->pending_scroll_rightward = rightward; + } + else if(rect_equal(&screen->pending_scrollrect, &rect) && + ((screen->pending_scroll_downward == 0 && downward == 0) || + (screen->pending_scroll_rightward == 0 && rightward == 0))) { + screen->pending_scroll_downward += downward; + screen->pending_scroll_rightward += rightward; + } + else { + vterm_screen_flush_damage(screen); + + screen->pending_scrollrect = rect; + screen->pending_scroll_downward = downward; + screen->pending_scroll_rightward = rightward; + } + + vterm_scroll_rect(rect, downward, rightward, + moverect_internal, erase_internal, screen); + + if(screen->damaged.start_row == -1) + return 1; + + if(rect_contains(&rect, &screen->damaged)) { + /* Scroll region entirely contains the damage; just move it */ + vterm_rect_move(&screen->damaged, -downward, -rightward); + rect_clip(&screen->damaged, &rect); + } + /* There are a number of possible cases here, but lets restrict this to only + * the common case where we might actually gain some performance by + * optimising it. Namely, a vertical scroll that neatly cuts the damage + * region in half. + */ + else if(rect.start_col <= screen->damaged.start_col && + rect.end_col >= screen->damaged.end_col && + rightward == 0) { + if(screen->damaged.start_row >= rect.start_row && + screen->damaged.start_row < rect.end_row) { + screen->damaged.start_row -= downward; + if(screen->damaged.start_row < rect.start_row) + screen->damaged.start_row = rect.start_row; + if(screen->damaged.start_row > rect.end_row) + screen->damaged.start_row = rect.end_row; + } + if(screen->damaged.end_row >= rect.start_row && + screen->damaged.end_row < rect.end_row) { + screen->damaged.end_row -= downward; + if(screen->damaged.end_row < rect.start_row) + screen->damaged.end_row = rect.start_row; + if(screen->damaged.end_row > rect.end_row) + screen->damaged.end_row = rect.end_row; + } + } + else { + DEBUG_LOG("TODO: Just flush and redo damaged=" STRFrect " rect=" STRFrect "\n", + ARGSrect(screen->damaged), ARGSrect(rect)); + } + + return 1; +} + +static int movecursor(VTermPos pos, VTermPos oldpos, int visible, void *user) +{ + VTermScreen *screen = user; + + if(screen->callbacks && screen->callbacks->movecursor) + return (*screen->callbacks->movecursor)(pos, oldpos, visible, screen->cbdata); + + return 0; +} + +static int setpenattr(VTermAttr attr, VTermValue *val, void *user) +{ + VTermScreen *screen = user; + + switch(attr) { + case VTERM_ATTR_BOLD: + screen->pen.bold = val->boolean; + return 1; + case VTERM_ATTR_UNDERLINE: + screen->pen.underline = val->number; + return 1; + case VTERM_ATTR_ITALIC: + screen->pen.italic = val->boolean; + return 1; + case VTERM_ATTR_BLINK: + screen->pen.blink = val->boolean; + return 1; + case VTERM_ATTR_REVERSE: + screen->pen.reverse = val->boolean; + return 1; + case VTERM_ATTR_CONCEAL: + screen->pen.conceal = val->boolean; + return 1; + case VTERM_ATTR_STRIKE: + screen->pen.strike = val->boolean; + return 1; + case VTERM_ATTR_FONT: + screen->pen.font = val->number; + return 1; + case VTERM_ATTR_FOREGROUND: + screen->pen.fg = val->color; + return 1; + case VTERM_ATTR_BACKGROUND: + screen->pen.bg = val->color; + return 1; + case VTERM_ATTR_SMALL: + screen->pen.small = val->boolean; + return 1; + case VTERM_ATTR_BASELINE: + screen->pen.baseline = val->number; + return 1; + + case VTERM_N_ATTRS: + return 0; + } + + return 0; +} + +static int settermprop(VTermProp prop, VTermValue *val, void *user) +{ + VTermScreen *screen = user; + + switch(prop) { + case VTERM_PROP_ALTSCREEN: + if(val->boolean && !screen->buffers[BUFIDX_ALTSCREEN]) + return 0; + + screen->buffer = val->boolean ? screen->buffers[BUFIDX_ALTSCREEN] : screen->buffers[BUFIDX_PRIMARY]; + /* only send a damage event on disable; because during enable there's an + * erase that sends a damage anyway + */ + if(!val->boolean) + damagescreen(screen); + break; + case VTERM_PROP_REVERSE: + screen->global_reverse = val->boolean; + damagescreen(screen); + break; + default: + ; /* ignore */ + } + + if(screen->callbacks && screen->callbacks->settermprop) + return (*screen->callbacks->settermprop)(prop, val, screen->cbdata); + + return 1; +} + +static int bell(void *user) +{ + VTermScreen *screen = user; + + if(screen->callbacks && screen->callbacks->bell) + return (*screen->callbacks->bell)(screen->cbdata); + + return 0; +} + +/* How many cells are non-blank + * Returns the position of the first blank cell in the trailing blank end */ +static int line_popcount(ScreenCell *buffer, int row, int rows, int cols) +{ + int col = cols - 1; + while(col >= 0 && buffer[row * cols + col].chars[0] == 0) + col--; + return col + 1; +} + +static void resize_buffer(VTermScreen *screen, int bufidx, int new_rows, int new_cols, bool active, VTermStateFields *statefields) +{ + int old_rows = screen->rows; + int old_cols = screen->cols; + + ScreenCell *old_buffer = screen->buffers[bufidx]; + VTermLineInfo *old_lineinfo = statefields->lineinfos[bufidx]; + + ScreenCell *new_buffer = vterm_allocator_malloc(screen->vt, sizeof(ScreenCell) * new_rows * new_cols); + VTermLineInfo *new_lineinfo = vterm_allocator_malloc(screen->vt, sizeof(new_lineinfo[0]) * new_rows); + + int old_row = old_rows - 1; + int new_row = new_rows - 1; + + VTermPos old_cursor = statefields->pos; + VTermPos new_cursor = { -1, -1 }; + +#ifdef DEBUG_REFLOW + fprintf(stderr, "Resizing from %dx%d to %dx%d; cursor was at (%d,%d)\n", + old_cols, old_rows, new_cols, new_rows, old_cursor.col, old_cursor.row); +#endif + + /* Keep track of the final row that is knonw to be blank, so we know what + * spare space we have for scrolling into + */ + int final_blank_row = new_rows; + + while(old_row >= 0) { + int old_row_end = old_row; + /* TODO: Stop if dwl or dhl */ + while(screen->reflow && old_lineinfo && old_row >= 0 && old_lineinfo[old_row].continuation) + old_row--; + int old_row_start = old_row; + + int width = 0; + for(int row = old_row_start; row <= old_row_end; row++) { + if(screen->reflow && row < (old_rows - 1) && old_lineinfo[row + 1].continuation) + width += old_cols; + else + width += line_popcount(old_buffer, row, old_rows, old_cols); + } + + if(final_blank_row == (new_row + 1) && width == 0) + final_blank_row = new_row; + + int new_height = screen->reflow + ? width ? (width + new_cols - 1) / new_cols : 1 + : 1; + + int new_row_end = new_row; + int new_row_start = new_row - new_height + 1; + + old_row = old_row_start; + int old_col = 0; + + int spare_rows = new_rows - final_blank_row; + + if(new_row_start < 0 && /* we'd fall off the top */ + spare_rows >= 0 && /* we actually have spare rows */ + (!active || new_cursor.row == -1 || (new_cursor.row - new_row_start) < new_rows)) + { + /* Attempt to scroll content down into the blank rows at the bottom to + * make it fit + */ + int downwards = -new_row_start; + if(downwards > spare_rows) + downwards = spare_rows; + int rowcount = new_rows - downwards; + +#ifdef DEBUG_REFLOW + fprintf(stderr, " scroll %d rows +%d downwards\n", rowcount, downwards); +#endif + + memmove(&new_buffer[downwards * new_cols], &new_buffer[0], rowcount * new_cols * sizeof(ScreenCell)); + memmove(&new_lineinfo[downwards], &new_lineinfo[0], rowcount * sizeof(new_lineinfo[0])); + + new_row += downwards; + new_row_start += downwards; + new_row_end += downwards; + + if(new_cursor.row >= 0) + new_cursor.row += downwards; + + final_blank_row += downwards; + } + +#ifdef DEBUG_REFLOW + fprintf(stderr, " rows [%d..%d] <- [%d..%d] width=%d\n", + new_row_start, new_row_end, old_row_start, old_row_end, width); +#endif + + if(new_row_start < 0) { + if(old_row_start <= old_cursor.row && old_cursor.row < old_row_end) { + new_cursor.row = 0; + new_cursor.col = old_cursor.col; + if(new_cursor.col >= new_cols) + new_cursor.col = new_cols-1; + } + break; + } + + for(new_row = new_row_start, old_row = old_row_start; new_row <= new_row_end; new_row++) { + int count = width >= new_cols ? new_cols : width; + width -= count; + + int new_col = 0; + + while(count) { + /* TODO: This could surely be done a lot faster by memcpy()'ing the entire range */ + new_buffer[new_row * new_cols + new_col] = old_buffer[old_row * old_cols + old_col]; + + if(old_cursor.row == old_row && old_cursor.col == old_col) + new_cursor.row = new_row, new_cursor.col = new_col; + + old_col++; + if(old_col == old_cols) { + old_row++; + + if(!screen->reflow) { + new_col++; + break; + } + old_col = 0; + } + + new_col++; + count--; + } + + if(old_cursor.row == old_row && old_cursor.col >= old_col) { + new_cursor.row = new_row, new_cursor.col = (old_cursor.col - old_col + new_col); + if(new_cursor.col >= new_cols) + new_cursor.col = new_cols-1; + } + + while(new_col < new_cols) { + clearcell(screen, &new_buffer[new_row * new_cols + new_col]); + new_col++; + } + + new_lineinfo[new_row].continuation = (new_row > new_row_start); + } + + old_row = old_row_start - 1; + new_row = new_row_start - 1; + } + + if(old_cursor.row <= old_row) { + /* cursor would have moved entirely off the top of the screen; lets just + * bring it within range */ + new_cursor.row = 0, new_cursor.col = old_cursor.col; + if(new_cursor.col >= new_cols) + new_cursor.col = new_cols-1; + } + + /* We really expect the cursor position to be set by now */ + if(active && (new_cursor.row == -1 || new_cursor.col == -1)) { + fprintf(stderr, "screen_resize failed to update cursor position\n"); + abort(); + } + + if(old_row >= 0 && bufidx == BUFIDX_PRIMARY) { + /* Push spare lines to scrollback buffer */ + if((screen->callbacks && screen->callbacks->sb_pushline) || + (screen->callbacks_has_pushline4 && screen->callbacks && screen->callbacks->sb_pushline4)) + for(int row = 0; row <= old_row; row++) { + const VTermLineInfo *lineinfo = old_lineinfo + row; + sb_pushline_from_row(screen, row, lineinfo->continuation); + } + if(active) + statefields->pos.row -= (old_row + 1); + } + if(new_row >= 0 && bufidx == BUFIDX_PRIMARY && + screen->callbacks && screen->callbacks->sb_popline) { + /* Try to backfill rows by popping scrollback buffer */ + while(new_row >= 0) { + if(!(screen->callbacks->sb_popline(old_cols, screen->sb_buffer, screen->cbdata))) + break; + + VTermPos pos = { .row = new_row }; + for(pos.col = 0; pos.col < old_cols && pos.col < new_cols; pos.col += screen->sb_buffer[pos.col].width) { + VTermScreenCell *src = &screen->sb_buffer[pos.col]; + ScreenCell *dst = &new_buffer[pos.row * new_cols + pos.col]; + + for(int i = 0; i < VTERM_MAX_CHARS_PER_CELL; i++) { + dst->chars[i] = src->chars[i]; + if(!src->chars[i]) + break; + } + + dst->pen.bold = src->attrs.bold; + dst->pen.underline = src->attrs.underline; + dst->pen.italic = src->attrs.italic; + dst->pen.blink = src->attrs.blink; + dst->pen.reverse = src->attrs.reverse ^ screen->global_reverse; + dst->pen.conceal = src->attrs.conceal; + dst->pen.strike = src->attrs.strike; + dst->pen.font = src->attrs.font; + dst->pen.small = src->attrs.small; + dst->pen.baseline = src->attrs.baseline; + + dst->pen.fg = src->fg; + dst->pen.bg = src->bg; + + if(src->width == 2 && pos.col < (new_cols-1)) + (dst + 1)->chars[0] = (uint32_t) -1; + } + for( ; pos.col < new_cols; pos.col++) + clearcell(screen, &new_buffer[pos.row * new_cols + pos.col]); + new_row--; + + if(active) + statefields->pos.row++; + } + } + if(new_row >= 0) { + /* Scroll new rows back up to the top and fill in blanks at the bottom */ + int moverows = new_rows - new_row - 1; + memmove(&new_buffer[0], &new_buffer[(new_row + 1) * new_cols], moverows * new_cols * sizeof(ScreenCell)); + memmove(&new_lineinfo[0], &new_lineinfo[new_row + 1], moverows * sizeof(new_lineinfo[0])); + + new_cursor.row -= (new_row + 1); + + for(new_row = moverows; new_row < new_rows; new_row++) { + for(int col = 0; col < new_cols; col++) + clearcell(screen, &new_buffer[new_row * new_cols + col]); + new_lineinfo[new_row] = (VTermLineInfo){ 0 }; + } + } + + vterm_allocator_free(screen->vt, old_buffer); + screen->buffers[bufidx] = new_buffer; + + vterm_allocator_free(screen->vt, old_lineinfo); + statefields->lineinfos[bufidx] = new_lineinfo; + + if(active) + statefields->pos = new_cursor; + + return; +} + +static int resize(int new_rows, int new_cols, VTermStateFields *fields, void *user) +{ + VTermScreen *screen = user; + + int altscreen_active = (screen->buffers[BUFIDX_ALTSCREEN] && screen->buffer == screen->buffers[BUFIDX_ALTSCREEN]); + + int old_rows = screen->rows; + int old_cols = screen->cols; + + if(new_cols > old_cols) { + /* Ensure that ->sb_buffer is large enough for a new or and old row */ + if(screen->sb_buffer) + vterm_allocator_free(screen->vt, screen->sb_buffer); + + screen->sb_buffer = vterm_allocator_malloc(screen->vt, sizeof(VTermScreenCell) * new_cols); + } + + resize_buffer(screen, 0, new_rows, new_cols, !altscreen_active, fields); + if(screen->buffers[BUFIDX_ALTSCREEN]) + resize_buffer(screen, 1, new_rows, new_cols, altscreen_active, fields); + else if(new_rows != old_rows) { + /* We don't need a full resize of the altscreen because it isn't enabled + * but we should at least keep the lineinfo the right size */ + vterm_allocator_free(screen->vt, fields->lineinfos[BUFIDX_ALTSCREEN]); + + VTermLineInfo *new_lineinfo = vterm_allocator_malloc(screen->vt, sizeof(new_lineinfo[0]) * new_rows); + for(int row = 0; row < new_rows; row++) + new_lineinfo[row] = (VTermLineInfo){ 0 }; + + fields->lineinfos[BUFIDX_ALTSCREEN] = new_lineinfo; + } + + screen->buffer = altscreen_active ? screen->buffers[BUFIDX_ALTSCREEN] : screen->buffers[BUFIDX_PRIMARY]; + + screen->rows = new_rows; + screen->cols = new_cols; + + if(new_cols <= old_cols) { + if(screen->sb_buffer) + vterm_allocator_free(screen->vt, screen->sb_buffer); + + screen->sb_buffer = vterm_allocator_malloc(screen->vt, sizeof(VTermScreenCell) * new_cols); + } + + /* TODO: Maaaaybe we can optimise this if there's no reflow happening */ + damagescreen(screen); + + if(screen->callbacks && screen->callbacks->resize) + return (*screen->callbacks->resize)(new_rows, new_cols, screen->cbdata); + + return 1; +} + +static int setlineinfo(int row, const VTermLineInfo *newinfo, const VTermLineInfo *oldinfo, void *user) +{ + VTermScreen *screen = user; + + if(newinfo->doublewidth != oldinfo->doublewidth || + newinfo->doubleheight != oldinfo->doubleheight) { + for(int col = 0; col < screen->cols; col++) { + ScreenCell *cell = getcell(screen, row, col); + cell->pen.dwl = newinfo->doublewidth; + cell->pen.dhl = newinfo->doubleheight; + } + + VTermRect rect = { + .start_row = row, + .end_row = row + 1, + .start_col = 0, + .end_col = newinfo->doublewidth ? screen->cols / 2 : screen->cols, + }; + damagerect(screen, rect); + + if(newinfo->doublewidth) { + rect.start_col = screen->cols / 2; + rect.end_col = screen->cols; + + erase_internal(rect, 0, user); + } + } + + return 1; +} + +static int sb_clear(void *user) { + VTermScreen *screen = user; + + if(screen->callbacks && screen->callbacks->sb_clear) + if((*screen->callbacks->sb_clear)(screen->cbdata)) + return 1; + + return 0; +} + +static VTermStateCallbacks state_cbs = { + .putglyph = &putglyph, + .movecursor = &movecursor, + .premove = &premove, + .scrollrect = &scrollrect, + .erase = &erase, + .setpenattr = &setpenattr, + .settermprop = &settermprop, + .bell = &bell, + .resize = &resize, + .setlineinfo = &setlineinfo, + .sb_clear = &sb_clear, +}; + +static VTermScreen *screen_new(VTerm *vt) +{ + VTermState *state = vterm_obtain_state(vt); + if(!state) + return NULL; + + VTermScreen *screen = vterm_allocator_malloc(vt, sizeof(VTermScreen)); + int rows, cols; + + vterm_get_size(vt, &rows, &cols); + + screen->vt = vt; + screen->state = state; + + screen->damage_merge = VTERM_DAMAGE_CELL; + screen->damaged.start_row = -1; + screen->pending_scrollrect.start_row = -1; + + screen->rows = rows; + screen->cols = cols; + + screen->global_reverse = false; + screen->reflow = false; + + screen->callbacks = NULL; + screen->cbdata = NULL; + screen->callbacks_has_pushline4 = false; + + screen->buffers[BUFIDX_PRIMARY] = alloc_buffer(screen, rows, cols); + + screen->buffer = screen->buffers[BUFIDX_PRIMARY]; + + screen->sb_buffer = vterm_allocator_malloc(screen->vt, sizeof(VTermScreenCell) * cols); + + vterm_state_set_callbacks(screen->state, &state_cbs, screen); + vterm_state_callbacks_has_premove(screen->state); + + return screen; +} + +INTERNAL void vterm_screen_free(VTermScreen *screen) +{ + vterm_allocator_free(screen->vt, screen->buffers[BUFIDX_PRIMARY]); + if(screen->buffers[BUFIDX_ALTSCREEN]) + vterm_allocator_free(screen->vt, screen->buffers[BUFIDX_ALTSCREEN]); + + vterm_allocator_free(screen->vt, screen->sb_buffer); + + vterm_allocator_free(screen->vt, screen); +} + +void vterm_screen_reset(VTermScreen *screen, int hard) +{ + screen->damaged.start_row = -1; + screen->pending_scrollrect.start_row = -1; + vterm_state_reset(screen->state, hard); + vterm_screen_flush_damage(screen); +} + +static size_t _get_chars(const VTermScreen *screen, const int utf8, void *buffer, size_t len, const VTermRect rect) +{ + size_t outpos = 0; + int padding = 0; + +#define PUT(c) \ + if(utf8) { \ + size_t thislen = utf8_seqlen(c); \ + if(buffer && outpos + thislen <= len) \ + outpos += fill_utf8((c), (char *)buffer + outpos); \ + else \ + outpos += thislen; \ + } \ + else { \ + if(buffer && outpos + 1 <= len) \ + ((uint32_t*)buffer)[outpos++] = (c); \ + else \ + outpos++; \ + } + + for(int row = rect.start_row; row < rect.end_row; row++) { + for(int col = rect.start_col; col < rect.end_col; col++) { + ScreenCell *cell = getcell(screen, row, col); + + if(cell->chars[0] == 0) + // Erased cell, might need a space + padding++; + else if(cell->chars[0] == (uint32_t)-1) + // Gap behind a double-width char, do nothing + ; + else { + while(padding) { + PUT(UNICODE_SPACE); + padding--; + } + for(int i = 0; i < VTERM_MAX_CHARS_PER_CELL && cell->chars[i]; i++) { + PUT(cell->chars[i]); + } + } + } + + if(row < rect.end_row - 1) { + PUT(UNICODE_LINEFEED); + padding = 0; + } + } + + return outpos; +} + +size_t vterm_screen_get_chars(const VTermScreen *screen, uint32_t *chars, size_t len, const VTermRect rect) +{ + return _get_chars(screen, 0, chars, len, rect); +} + +size_t vterm_screen_get_text(const VTermScreen *screen, char *str, size_t len, const VTermRect rect) +{ + return _get_chars(screen, 1, str, len, rect); +} + +/* Copy internal to external representation of a screen cell */ +int vterm_screen_get_cell(const VTermScreen *screen, VTermPos pos, VTermScreenCell *cell) +{ + ScreenCell *intcell = getcell(screen, pos.row, pos.col); + if(!intcell) + return 0; + + for(int i = 0; i < VTERM_MAX_CHARS_PER_CELL; i++) { + cell->chars[i] = intcell->chars[i]; + if(!intcell->chars[i]) + break; + } + + cell->attrs.bold = intcell->pen.bold; + cell->attrs.underline = intcell->pen.underline; + cell->attrs.italic = intcell->pen.italic; + cell->attrs.blink = intcell->pen.blink; + cell->attrs.reverse = intcell->pen.reverse ^ screen->global_reverse; + cell->attrs.conceal = intcell->pen.conceal; + cell->attrs.strike = intcell->pen.strike; + cell->attrs.font = intcell->pen.font; + cell->attrs.small = intcell->pen.small; + cell->attrs.baseline = intcell->pen.baseline; + + cell->attrs.dwl = intcell->pen.dwl; + cell->attrs.dhl = intcell->pen.dhl; + + cell->fg = intcell->pen.fg; + cell->bg = intcell->pen.bg; + + if(pos.col < (screen->cols - 1) && + getcell(screen, pos.row, pos.col + 1)->chars[0] == (uint32_t)-1) + cell->width = 2; + else + cell->width = 1; + + return 1; +} + +int vterm_screen_is_eol(const VTermScreen *screen, VTermPos pos) +{ + /* This cell is EOL if this and every cell to the right is black */ + for(; pos.col < screen->cols; pos.col++) { + ScreenCell *cell = getcell(screen, pos.row, pos.col); + if(cell->chars[0] != 0) + return 0; + } + + return 1; +} + +VTermScreen *vterm_obtain_screen(VTerm *vt) +{ + if(vt->screen) + return vt->screen; + + VTermScreen *screen = screen_new(vt); + vt->screen = screen; + + return screen; +} + +void vterm_screen_enable_reflow(VTermScreen *screen, bool reflow) +{ + screen->reflow = reflow; +} + +#undef vterm_screen_set_reflow +void vterm_screen_set_reflow(VTermScreen *screen, bool reflow) +{ + vterm_screen_enable_reflow(screen, reflow); +} + +void vterm_screen_enable_altscreen(VTermScreen *screen, int altscreen) +{ + if(!screen->buffers[BUFIDX_ALTSCREEN] && altscreen) { + int rows, cols; + vterm_get_size(screen->vt, &rows, &cols); + + screen->buffers[BUFIDX_ALTSCREEN] = alloc_buffer(screen, rows, cols); + } +} + +void vterm_screen_set_callbacks(VTermScreen *screen, const VTermScreenCallbacks *callbacks, void *user) +{ + screen->callbacks = callbacks; + screen->cbdata = user; +} + +void *vterm_screen_get_cbdata(VTermScreen *screen) +{ + return screen->cbdata; +} + +void vterm_screen_callbacks_has_pushline4(VTermScreen *screen) +{ + screen->callbacks_has_pushline4 = true; +} + +void vterm_screen_set_unrecognised_fallbacks(VTermScreen *screen, const VTermStateFallbacks *fallbacks, void *user) +{ + vterm_state_set_unrecognised_fallbacks(screen->state, fallbacks, user); +} + +void *vterm_screen_get_unrecognised_fbdata(VTermScreen *screen) +{ + return vterm_state_get_unrecognised_fbdata(screen->state); +} + +void vterm_screen_flush_damage(VTermScreen *screen) +{ + if(screen->pending_scrollrect.start_row != -1) { + vterm_scroll_rect(screen->pending_scrollrect, screen->pending_scroll_downward, screen->pending_scroll_rightward, + moverect_user, erase_user, screen); + + screen->pending_scrollrect.start_row = -1; + } + + if(screen->damaged.start_row != -1) { + if(screen->callbacks && screen->callbacks->damage) + (*screen->callbacks->damage)(screen->damaged, screen->cbdata); + + screen->damaged.start_row = -1; + } +} + +void vterm_screen_set_damage_merge(VTermScreen *screen, VTermDamageSize size) +{ + vterm_screen_flush_damage(screen); + screen->damage_merge = size; +} + +static int attrs_differ(VTermAttrMask attrs, ScreenCell *a, ScreenCell *b) +{ + if((attrs & VTERM_ATTR_BOLD_MASK) && (a->pen.bold != b->pen.bold)) + return 1; + if((attrs & VTERM_ATTR_UNDERLINE_MASK) && (a->pen.underline != b->pen.underline)) + return 1; + if((attrs & VTERM_ATTR_ITALIC_MASK) && (a->pen.italic != b->pen.italic)) + return 1; + if((attrs & VTERM_ATTR_BLINK_MASK) && (a->pen.blink != b->pen.blink)) + return 1; + if((attrs & VTERM_ATTR_REVERSE_MASK) && (a->pen.reverse != b->pen.reverse)) + return 1; + if((attrs & VTERM_ATTR_CONCEAL_MASK) && (a->pen.conceal != b->pen.conceal)) + return 1; + if((attrs & VTERM_ATTR_STRIKE_MASK) && (a->pen.strike != b->pen.strike)) + return 1; + if((attrs & VTERM_ATTR_FONT_MASK) && (a->pen.font != b->pen.font)) + return 1; + if((attrs & VTERM_ATTR_FOREGROUND_MASK) && !vterm_color_is_equal(&a->pen.fg, &b->pen.fg)) + return 1; + if((attrs & VTERM_ATTR_BACKGROUND_MASK) && !vterm_color_is_equal(&a->pen.bg, &b->pen.bg)) + return 1; + if((attrs & VTERM_ATTR_SMALL_MASK) && (a->pen.small != b->pen.small)) + return 1; + if((attrs & VTERM_ATTR_BASELINE_MASK) && (a->pen.baseline != b->pen.baseline)) + return 1; + + return 0; +} + +int vterm_screen_get_attrs_extent(const VTermScreen *screen, VTermRect *extent, VTermPos pos, VTermAttrMask attrs) +{ + ScreenCell *target = getcell(screen, pos.row, pos.col); + + // TODO: bounds check + extent->start_row = pos.row; + extent->end_row = pos.row + 1; + + if(extent->start_col < 0) + extent->start_col = 0; + if(extent->end_col < 0) + extent->end_col = screen->cols; + + int col; + + for(col = pos.col - 1; col >= extent->start_col; col--) + if(attrs_differ(attrs, target, getcell(screen, pos.row, col))) + break; + extent->start_col = col + 1; + + for(col = pos.col + 1; col < extent->end_col; col++) + if(attrs_differ(attrs, target, getcell(screen, pos.row, col))) + break; + extent->end_col = col - 1; + + return 1; +} + +void vterm_screen_convert_color_to_rgb(const VTermScreen *screen, VTermColor *col) +{ + vterm_state_convert_color_to_rgb(screen->state, col); +} + +static void reset_default_colours(VTermScreen *screen, ScreenCell *buffer) +{ + for(int row = 0; row <= screen->rows - 1; row++) + for(int col = 0; col <= screen->cols - 1; col++) { + ScreenCell *cell = &buffer[row * screen->cols + col]; + if(VTERM_COLOR_IS_DEFAULT_FG(&cell->pen.fg)) + cell->pen.fg = screen->pen.fg; + if(VTERM_COLOR_IS_DEFAULT_BG(&cell->pen.bg)) + cell->pen.bg = screen->pen.bg; + } +} + +void vterm_screen_set_default_colors(VTermScreen *screen, const VTermColor *default_fg, const VTermColor *default_bg) +{ + vterm_state_set_default_colors(screen->state, default_fg, default_bg); + + if(default_fg && VTERM_COLOR_IS_DEFAULT_FG(&screen->pen.fg)) { + screen->pen.fg = *default_fg; + screen->pen.fg.type = (screen->pen.fg.type & ~VTERM_COLOR_DEFAULT_MASK) + | VTERM_COLOR_DEFAULT_FG; + } + + if(default_bg && VTERM_COLOR_IS_DEFAULT_BG(&screen->pen.bg)) { + screen->pen.bg = *default_bg; + screen->pen.bg.type = (screen->pen.bg.type & ~VTERM_COLOR_DEFAULT_MASK) + | VTERM_COLOR_DEFAULT_BG; + } + + reset_default_colours(screen, screen->buffers[0]); + if(screen->buffers[1]) + reset_default_colours(screen, screen->buffers[1]); +} diff --git a/third_party/libvterm/src/state.c b/third_party/libvterm/src/state.c new file mode 100644 index 0000000..54618d5 --- /dev/null +++ b/third_party/libvterm/src/state.c @@ -0,0 +1,2380 @@ +#include "vterm_internal.h" + +#include +#include + +#define strneq(a,b,n) (strncmp(a,b,n)==0) + +#if defined(DEBUG) && DEBUG > 1 +# define DEBUG_GLYPH_COMBINE +#endif + +/* Some convenient wrappers to make callback functions easier */ + +static void putglyph(VTermState *state, const uint32_t chars[], int width, VTermPos pos) +{ + VTermGlyphInfo info = { + .chars = chars, + .width = width, + .protected_cell = state->protected_cell, + .dwl = state->lineinfo[pos.row].doublewidth, + .dhl = state->lineinfo[pos.row].doubleheight, + }; + + if(state->callbacks && state->callbacks->putglyph) + if((*state->callbacks->putglyph)(&info, pos, state->cbdata)) + return; + + DEBUG_LOG("libvterm: Unhandled putglyph U+%04x at (%d,%d)\n", chars[0], pos.col, pos.row); +} + +static void updatecursor(VTermState *state, VTermPos *oldpos, int cancel_phantom) +{ + if(state->pos.col == oldpos->col && state->pos.row == oldpos->row) + return; + + if(cancel_phantom) + state->at_phantom = 0; + + if(state->callbacks && state->callbacks->movecursor) + if((*state->callbacks->movecursor)(state->pos, *oldpos, state->mode.cursor_visible, state->cbdata)) + return; +} + +static void erase(VTermState *state, VTermRect rect, int selective) +{ + if(rect.end_col == state->cols) { + /* If we're erasing the final cells of any lines, cancel the continuation + * marker on the subsequent line + */ + for(int row = rect.start_row + 1; row < rect.end_row + 1 && row < state->rows; row++) + state->lineinfo[row].continuation = 0; + } + + if(state->callbacks && state->callbacks->erase) + if((*state->callbacks->erase)(rect, selective, state->cbdata)) + return; +} + +static VTermState *vterm_state_new(VTerm *vt) +{ + VTermState *state = vterm_allocator_malloc(vt, sizeof(VTermState)); + + state->vt = vt; + + state->rows = vt->rows; + state->cols = vt->cols; + + state->mouse_col = 0; + state->mouse_row = 0; + state->mouse_buttons = 0; + + state->mouse_protocol = MOUSE_X10; + + state->callbacks = NULL; + state->cbdata = NULL; + state->callbacks_has_premove = false; + + state->selection.callbacks = NULL; + state->selection.user = NULL; + state->selection.buffer = NULL; + + vterm_state_newpen(state); + + state->bold_is_highbright = 0; + + state->combine_chars_size = 16; + state->combine_chars = vterm_allocator_malloc(state->vt, state->combine_chars_size * sizeof(state->combine_chars[0])); + + state->tabstops = vterm_allocator_malloc(state->vt, (state->cols + 7) / 8); + + state->lineinfos[BUFIDX_PRIMARY] = vterm_allocator_malloc(state->vt, state->rows * sizeof(VTermLineInfo)); + /* TODO: Make an 'enable' function */ + state->lineinfos[BUFIDX_ALTSCREEN] = vterm_allocator_malloc(state->vt, state->rows * sizeof(VTermLineInfo)); + state->lineinfo = state->lineinfos[BUFIDX_PRIMARY]; + + state->encoding_utf8.enc = vterm_lookup_encoding(ENC_UTF8, 'u'); + if(*state->encoding_utf8.enc->init) + (*state->encoding_utf8.enc->init)(state->encoding_utf8.enc, state->encoding_utf8.data); + + return state; +} + +INTERNAL void vterm_state_free(VTermState *state) +{ + vterm_allocator_free(state->vt, state->tabstops); + vterm_allocator_free(state->vt, state->lineinfos[BUFIDX_PRIMARY]); + if(state->lineinfos[BUFIDX_ALTSCREEN]) + vterm_allocator_free(state->vt, state->lineinfos[BUFIDX_ALTSCREEN]); + vterm_allocator_free(state->vt, state->combine_chars); + vterm_allocator_free(state->vt, state); +} + +static void scroll(VTermState *state, VTermRect rect, int downward, int rightward) +{ + if(!downward && !rightward) + return; + + int rows = rect.end_row - rect.start_row; + if(downward > rows) + downward = rows; + else if(downward < -rows) + downward = -rows; + + int cols = rect.end_col - rect.start_col; + if(rightward > cols) + rightward = cols; + else if(rightward < -cols) + rightward = -cols; + + if(state->callbacks_has_premove && state->callbacks && state->callbacks->premove) { + // TODO: technically this logic is wrong if both downward != 0 and rightward != 0 + + /* Work out what subsection of the destination area is about to be destroyed */ + if(downward > 0) + /* about to destroy the top */ + (*state->callbacks->premove)((VTermRect){ + .start_row = rect.start_row, .end_row = rect.start_row + downward, + .start_col = rect.start_col, .end_col = rect.end_col}, state->cbdata); + else if(downward < 0) + /* about to destroy the bottom */ + (*state->callbacks->premove)((VTermRect){ + .start_row = rect.end_row + downward, .end_row = rect.end_row, + .start_col = rect.start_col, .end_col = rect.end_col}, state->cbdata); + + if(rightward > 0) + /* about to destroy the left */ + (*state->callbacks->premove)((VTermRect){ + .start_row = rect.start_row, .end_row = rect.end_row, + .start_col = rect.start_col, .end_col = rect.start_col + rightward}, state->cbdata); + else if(rightward < 0) + /* about to destroy the right */ + (*state->callbacks->premove)((VTermRect){ + .start_row = rect.start_row, .end_row = rect.end_row, + .start_col = rect.end_col + rightward, .end_col = rect.end_col}, state->cbdata); + } + + // Update lineinfo if full line + if(rect.start_col == 0 && rect.end_col == state->cols && rightward == 0) { + int height = rect.end_row - rect.start_row - abs(downward); + + if(downward > 0) { + memmove(state->lineinfo + rect.start_row, + state->lineinfo + rect.start_row + downward, + height * sizeof(state->lineinfo[0])); + for(int row = rect.end_row - downward; row < rect.end_row; row++) + state->lineinfo[row] = (VTermLineInfo){ 0 }; + } + else { + memmove(state->lineinfo + rect.start_row - downward, + state->lineinfo + rect.start_row, + height * sizeof(state->lineinfo[0])); + for(int row = rect.start_row; row < rect.start_row - downward; row++) + state->lineinfo[row] = (VTermLineInfo){ 0 }; + } + } + + if(state->callbacks && state->callbacks->scrollrect) + if((*state->callbacks->scrollrect)(rect, downward, rightward, state->cbdata)) + return; + + if(state->callbacks) + vterm_scroll_rect(rect, downward, rightward, + state->callbacks->moverect, state->callbacks->erase, state->cbdata); +} + +static void linefeed(VTermState *state) +{ + if(state->pos.row == SCROLLREGION_BOTTOM(state) - 1) { + VTermRect rect = { + .start_row = state->scrollregion_top, + .end_row = SCROLLREGION_BOTTOM(state), + .start_col = SCROLLREGION_LEFT(state), + .end_col = SCROLLREGION_RIGHT(state), + }; + + scroll(state, rect, 1, 0); + } + else if(state->pos.row < state->rows-1) + state->pos.row++; +} + +static void grow_combine_buffer(VTermState *state) +{ + size_t new_size = state->combine_chars_size * 2; + uint32_t *new_chars = vterm_allocator_malloc(state->vt, new_size * sizeof(new_chars[0])); + + memcpy(new_chars, state->combine_chars, state->combine_chars_size * sizeof(new_chars[0])); + + vterm_allocator_free(state->vt, state->combine_chars); + + state->combine_chars = new_chars; + state->combine_chars_size = new_size; +} + +static void set_col_tabstop(VTermState *state, int col) +{ + unsigned char mask = 1 << (col & 7); + state->tabstops[col >> 3] |= mask; +} + +static void clear_col_tabstop(VTermState *state, int col) +{ + unsigned char mask = 1 << (col & 7); + state->tabstops[col >> 3] &= ~mask; +} + +static int is_col_tabstop(VTermState *state, int col) +{ + unsigned char mask = 1 << (col & 7); + return state->tabstops[col >> 3] & mask; +} + +static int is_cursor_in_scrollregion(const VTermState *state) +{ + if(state->pos.row < state->scrollregion_top || + state->pos.row >= SCROLLREGION_BOTTOM(state)) + return 0; + if(state->pos.col < SCROLLREGION_LEFT(state) || + state->pos.col >= SCROLLREGION_RIGHT(state)) + return 0; + + return 1; +} + +static void tab(VTermState *state, int count, int direction) +{ + while(count > 0) { + if(direction > 0) { + if(state->pos.col >= THISROWWIDTH(state)-1) + return; + + state->pos.col++; + } + else if(direction < 0) { + if(state->pos.col < 1) + return; + + state->pos.col--; + } + + if(is_col_tabstop(state, state->pos.col)) + count--; + } +} + +#define NO_FORCE 0 +#define FORCE 1 + +#define DWL_OFF 0 +#define DWL_ON 1 + +#define DHL_OFF 0 +#define DHL_TOP 1 +#define DHL_BOTTOM 2 + +static void set_lineinfo(VTermState *state, int row, int force, int dwl, int dhl) +{ + VTermLineInfo info = state->lineinfo[row]; + + if(dwl == DWL_OFF) + info.doublewidth = DWL_OFF; + else if(dwl == DWL_ON) + info.doublewidth = DWL_ON; + // else -1 to ignore + + if(dhl == DHL_OFF) + info.doubleheight = DHL_OFF; + else if(dhl == DHL_TOP) + info.doubleheight = DHL_TOP; + else if(dhl == DHL_BOTTOM) + info.doubleheight = DHL_BOTTOM; + + if((state->callbacks && + state->callbacks->setlineinfo && + (*state->callbacks->setlineinfo)(row, &info, state->lineinfo + row, state->cbdata)) + || force) + state->lineinfo[row] = info; +} + +static int on_text(const char bytes[], size_t len, void *user) +{ + VTermState *state = user; + + VTermPos oldpos = state->pos; + + uint32_t *codepoints = (uint32_t *)(state->vt->tmpbuffer); + size_t maxpoints = (state->vt->tmpbuffer_len) / sizeof(uint32_t); + + int npoints = 0; + size_t eaten = 0; + + VTermEncodingInstance *encoding = + state->gsingle_set ? &state->encoding[state->gsingle_set] : + !(bytes[eaten] & 0x80) ? &state->encoding[state->gl_set] : + state->vt->mode.utf8 ? &state->encoding_utf8 : + &state->encoding[state->gr_set]; + + (*encoding->enc->decode)(encoding->enc, encoding->data, + codepoints, &npoints, state->gsingle_set ? 1 : maxpoints, + bytes, &eaten, len); + + /* There's a chance an encoding (e.g. UTF-8) hasn't found enough bytes yet + * for even a single codepoint + */ + if(!npoints) + return eaten; + + if(state->gsingle_set && npoints) + state->gsingle_set = 0; + + int i = 0; + + /* This is a combining char. that needs to be merged with the previous + * glyph output */ + if(vterm_unicode_is_combining(codepoints[i])) { + /* See if the cursor has moved since */ + if(state->pos.row == state->combine_pos.row && state->pos.col == state->combine_pos.col + state->combine_width) { +#ifdef DEBUG_GLYPH_COMBINE + int printpos; + printf("DEBUG: COMBINING SPLIT GLYPH of chars {"); + for(printpos = 0; state->combine_chars[printpos]; printpos++) + printf("U+%04x ", state->combine_chars[printpos]); + printf("} + {"); +#endif + + /* Find where we need to append these combining chars */ + int saved_i = 0; + while(state->combine_chars[saved_i]) + saved_i++; + + /* Add extra ones */ + while(i < npoints && vterm_unicode_is_combining(codepoints[i])) { + if(saved_i >= state->combine_chars_size) + grow_combine_buffer(state); + state->combine_chars[saved_i++] = codepoints[i++]; + } + if(saved_i >= state->combine_chars_size) + grow_combine_buffer(state); + state->combine_chars[saved_i] = 0; + +#ifdef DEBUG_GLYPH_COMBINE + for(; state->combine_chars[printpos]; printpos++) + printf("U+%04x ", state->combine_chars[printpos]); + printf("}\n"); +#endif + + /* Now render it */ + putglyph(state, state->combine_chars, state->combine_width, state->combine_pos); + } + else { + DEBUG_LOG("libvterm: TODO: Skip over split char+combining\n"); + } + } + + for(; i < npoints; i++) { + // Try to find combining characters following this + int glyph_starts = i; + int glyph_ends; + for(glyph_ends = i + 1; + (glyph_ends < npoints) && (glyph_ends < glyph_starts + VTERM_MAX_CHARS_PER_CELL); + glyph_ends++) + if(!vterm_unicode_is_combining(codepoints[glyph_ends])) + break; + + int width = 0; + + uint32_t chars[VTERM_MAX_CHARS_PER_CELL + 1]; + + for( ; i < glyph_ends; i++) { + chars[i - glyph_starts] = codepoints[i]; + int this_width = vterm_unicode_width(codepoints[i]); +#ifdef DEBUG + if(this_width < 0) { + fprintf(stderr, "Text with negative-width codepoint U+%04x\n", codepoints[i]); + abort(); + } +#endif + width += this_width; + } + + while(i < npoints && vterm_unicode_is_combining(codepoints[i])) + i++; + + chars[glyph_ends - glyph_starts] = 0; + i--; + +#ifdef DEBUG_GLYPH_COMBINE + int printpos; + printf("DEBUG: COMBINED GLYPH of %d chars {", glyph_ends - glyph_starts); + for(printpos = 0; printpos < glyph_ends - glyph_starts; printpos++) + printf("U+%04x ", chars[printpos]); + printf("}, onscreen width %d\n", width); +#endif + + if(state->at_phantom || state->pos.col + width > THISROWWIDTH(state)) { + linefeed(state); + state->pos.col = 0; + state->at_phantom = 0; + state->lineinfo[state->pos.row].continuation = 1; + } + + if(state->mode.insert) { + /* TODO: This will be a little inefficient for large bodies of text, as + * it'll have to 'ICH' effectively before every glyph. We should scan + * ahead and ICH as many times as required + */ + VTermRect rect = { + .start_row = state->pos.row, + .end_row = state->pos.row + 1, + .start_col = state->pos.col, + .end_col = THISROWWIDTH(state), + }; + scroll(state, rect, 0, -1); + } + + putglyph(state, chars, width, state->pos); + + if(i == npoints - 1) { + /* End of the buffer. Save the chars in case we have to combine with + * more on the next call */ + int save_i; + for(save_i = 0; chars[save_i]; save_i++) { + if(save_i >= state->combine_chars_size) + grow_combine_buffer(state); + state->combine_chars[save_i] = chars[save_i]; + } + if(save_i >= state->combine_chars_size) + grow_combine_buffer(state); + state->combine_chars[save_i] = 0; + state->combine_width = width; + state->combine_pos = state->pos; + } + + if(state->pos.col + width >= THISROWWIDTH(state)) { + if(state->mode.autowrap) + state->at_phantom = 1; + } + else { + state->pos.col += width; + } + } + + updatecursor(state, &oldpos, 0); + +#ifdef DEBUG + if(state->pos.row < 0 || state->pos.row >= state->rows || + state->pos.col < 0 || state->pos.col >= state->cols) { + fprintf(stderr, "Position out of bounds after text: (%d,%d)\n", + state->pos.row, state->pos.col); + abort(); + } +#endif + + return eaten; +} + +static int on_control(unsigned char control, void *user) +{ + VTermState *state = user; + + VTermPos oldpos = state->pos; + + switch(control) { + case 0x07: // BEL - ECMA-48 8.3.3 + if(state->callbacks && state->callbacks->bell) + (*state->callbacks->bell)(state->cbdata); + break; + + case 0x08: // BS - ECMA-48 8.3.5 + if(state->pos.col > 0) + state->pos.col--; + break; + + case 0x09: // HT - ECMA-48 8.3.60 + tab(state, 1, +1); + break; + + case 0x0a: // LF - ECMA-48 8.3.74 + case 0x0b: // VT + case 0x0c: // FF + linefeed(state); + if(state->mode.newline) + state->pos.col = 0; + break; + + case 0x0d: // CR - ECMA-48 8.3.15 + state->pos.col = 0; + break; + + case 0x0e: // LS1 - ECMA-48 8.3.76 + state->gl_set = 1; + break; + + case 0x0f: // LS0 - ECMA-48 8.3.75 + state->gl_set = 0; + break; + + case 0x84: // IND - DEPRECATED but implemented for completeness + linefeed(state); + break; + + case 0x85: // NEL - ECMA-48 8.3.86 + linefeed(state); + state->pos.col = 0; + break; + + case 0x88: // HTS - ECMA-48 8.3.62 + set_col_tabstop(state, state->pos.col); + break; + + case 0x8d: // RI - ECMA-48 8.3.104 + if(state->pos.row == state->scrollregion_top) { + VTermRect rect = { + .start_row = state->scrollregion_top, + .end_row = SCROLLREGION_BOTTOM(state), + .start_col = SCROLLREGION_LEFT(state), + .end_col = SCROLLREGION_RIGHT(state), + }; + + scroll(state, rect, -1, 0); + } + else if(state->pos.row > 0) + state->pos.row--; + break; + + case 0x8e: // SS2 - ECMA-48 8.3.141 + state->gsingle_set = 2; + break; + + case 0x8f: // SS3 - ECMA-48 8.3.142 + state->gsingle_set = 3; + break; + + default: + if(state->fallbacks && state->fallbacks->control) + if((*state->fallbacks->control)(control, state->fbdata)) + return 1; + + return 0; + } + + updatecursor(state, &oldpos, 1); + +#ifdef DEBUG + if(state->pos.row < 0 || state->pos.row >= state->rows || + state->pos.col < 0 || state->pos.col >= state->cols) { + fprintf(stderr, "Position out of bounds after Ctrl %02x: (%d,%d)\n", + control, state->pos.row, state->pos.col); + abort(); + } +#endif + + return 1; +} + +static int settermprop_bool(VTermState *state, VTermProp prop, int v) +{ + VTermValue val = { .boolean = v }; + return vterm_state_set_termprop(state, prop, &val); +} + +static int settermprop_int(VTermState *state, VTermProp prop, int v) +{ + VTermValue val = { .number = v }; + return vterm_state_set_termprop(state, prop, &val); +} + +static int settermprop_string(VTermState *state, VTermProp prop, VTermStringFragment frag) +{ + VTermValue val = { .string = frag }; + return vterm_state_set_termprop(state, prop, &val); +} + +static void savecursor(VTermState *state, int save) +{ + if(save) { + state->saved.pos = state->pos; + state->saved.mode.cursor_visible = state->mode.cursor_visible; + state->saved.mode.cursor_blink = state->mode.cursor_blink; + state->saved.mode.cursor_shape = state->mode.cursor_shape; + + vterm_state_savepen(state, 1); + } + else { + VTermPos oldpos = state->pos; + + state->pos = state->saved.pos; + + settermprop_bool(state, VTERM_PROP_CURSORVISIBLE, state->saved.mode.cursor_visible); + settermprop_bool(state, VTERM_PROP_CURSORBLINK, state->saved.mode.cursor_blink); + settermprop_int (state, VTERM_PROP_CURSORSHAPE, state->saved.mode.cursor_shape); + + vterm_state_savepen(state, 0); + + updatecursor(state, &oldpos, 1); + } +} + +static int on_escape(const char *bytes, size_t len, void *user) +{ + VTermState *state = user; + + /* Easier to decode this from the first byte, even though the final + * byte terminates it + */ + switch(bytes[0]) { + case ' ': + if(len != 2) + return 0; + + switch(bytes[1]) { + case 'F': // S7C1T + state->vt->mode.ctrl8bit = 0; + break; + + case 'G': // S8C1T + state->vt->mode.ctrl8bit = 1; + break; + + default: + return 0; + } + return 2; + + case '#': + if(len != 2) + return 0; + + switch(bytes[1]) { + case '3': // DECDHL top + if(state->mode.leftrightmargin) + break; + set_lineinfo(state, state->pos.row, NO_FORCE, DWL_ON, DHL_TOP); + break; + + case '4': // DECDHL bottom + if(state->mode.leftrightmargin) + break; + set_lineinfo(state, state->pos.row, NO_FORCE, DWL_ON, DHL_BOTTOM); + break; + + case '5': // DECSWL + if(state->mode.leftrightmargin) + break; + set_lineinfo(state, state->pos.row, NO_FORCE, DWL_OFF, DHL_OFF); + break; + + case '6': // DECDWL + if(state->mode.leftrightmargin) + break; + set_lineinfo(state, state->pos.row, NO_FORCE, DWL_ON, DHL_OFF); + break; + + case '8': // DECALN + { + VTermPos pos; + uint32_t E[] = { 'E', 0 }; + for(pos.row = 0; pos.row < state->rows; pos.row++) + for(pos.col = 0; pos.col < ROWWIDTH(state, pos.row); pos.col++) + putglyph(state, E, 1, pos); + break; + } + + default: + return 0; + } + return 2; + + case '(': case ')': case '*': case '+': // SCS + if(len != 2) + return 0; + + { + int setnum = bytes[0] - 0x28; + VTermEncoding *newenc = vterm_lookup_encoding(ENC_SINGLE_94, bytes[1]); + + if(newenc) { + state->encoding[setnum].enc = newenc; + + if(newenc->init) + (*newenc->init)(newenc, state->encoding[setnum].data); + } + } + + return 2; + + case '7': // DECSC + savecursor(state, 1); + return 1; + + case '8': // DECRC + savecursor(state, 0); + return 1; + + case '<': // Ignored by VT100. Used in VT52 mode to switch up to VT100 + return 1; + + case '=': // DECKPAM + state->mode.keypad = 1; + return 1; + + case '>': // DECKPNM + state->mode.keypad = 0; + return 1; + + case 'c': // RIS - ECMA-48 8.3.105 + { + VTermPos oldpos = state->pos; + vterm_state_reset(state, 1); + if(state->callbacks && state->callbacks->movecursor) + (*state->callbacks->movecursor)(state->pos, oldpos, state->mode.cursor_visible, state->cbdata); + return 1; + } + + case 'n': // LS2 - ECMA-48 8.3.78 + state->gl_set = 2; + return 1; + + case 'o': // LS3 - ECMA-48 8.3.80 + state->gl_set = 3; + return 1; + + case '~': // LS1R - ECMA-48 8.3.77 + state->gr_set = 1; + return 1; + + case '}': // LS2R - ECMA-48 8.3.79 + state->gr_set = 2; + return 1; + + case '|': // LS3R - ECMA-48 8.3.81 + state->gr_set = 3; + return 1; + + default: + return 0; + } +} + +static void set_mode(VTermState *state, int num, int val) +{ + switch(num) { + case 4: // IRM - ECMA-48 7.2.10 + state->mode.insert = val; + break; + + case 20: // LNM - ANSI X3.4-1977 + state->mode.newline = val; + break; + + default: + DEBUG_LOG("libvterm: Unknown mode %d\n", num); + return; + } +} + +static void set_dec_mode(VTermState *state, int num, int val) +{ + switch(num) { + case 1: + state->mode.cursor = val; + break; + + case 5: // DECSCNM - screen mode + settermprop_bool(state, VTERM_PROP_REVERSE, val); + break; + + case 6: // DECOM - origin mode + { + VTermPos oldpos = state->pos; + state->mode.origin = val; + state->pos.row = state->mode.origin ? state->scrollregion_top : 0; + state->pos.col = state->mode.origin ? SCROLLREGION_LEFT(state) : 0; + updatecursor(state, &oldpos, 1); + } + break; + + case 7: + state->mode.autowrap = val; + break; + + case 12: + settermprop_bool(state, VTERM_PROP_CURSORBLINK, val); + break; + + case 25: + settermprop_bool(state, VTERM_PROP_CURSORVISIBLE, val); + break; + + case 69: // DECVSSM - vertical split screen mode + // DECLRMM - left/right margin mode + state->mode.leftrightmargin = val; + if(val) { + // Setting DECVSSM must clear doublewidth/doubleheight state of every line + for(int row = 0; row < state->rows; row++) + set_lineinfo(state, row, FORCE, DWL_OFF, DHL_OFF); + } + + break; + + case 1000: + case 1002: + case 1003: + settermprop_int(state, VTERM_PROP_MOUSE, + !val ? VTERM_PROP_MOUSE_NONE : + (num == 1000) ? VTERM_PROP_MOUSE_CLICK : + (num == 1002) ? VTERM_PROP_MOUSE_DRAG : + VTERM_PROP_MOUSE_MOVE); + break; + + case 1004: + settermprop_bool(state, VTERM_PROP_FOCUSREPORT, val); + state->mode.report_focus = val; + break; + + case 1005: + state->mouse_protocol = val ? MOUSE_UTF8 : MOUSE_X10; + break; + + case 1006: + state->mouse_protocol = val ? MOUSE_SGR : MOUSE_X10; + break; + + case 1015: + state->mouse_protocol = val ? MOUSE_RXVT : MOUSE_X10; + break; + + case 1047: + settermprop_bool(state, VTERM_PROP_ALTSCREEN, val); + break; + + case 1048: + savecursor(state, val); + break; + + case 1049: + settermprop_bool(state, VTERM_PROP_ALTSCREEN, val); + savecursor(state, val); + break; + + case 2004: + state->mode.bracketpaste = val; + break; + + default: + DEBUG_LOG("libvterm: Unknown DEC mode %d\n", num); + return; + } +} + +static void request_dec_mode(VTermState *state, int num) +{ + int reply; + + switch(num) { + case 1: + reply = state->mode.cursor; + break; + + case 5: + reply = state->mode.screen; + break; + + case 6: + reply = state->mode.origin; + break; + + case 7: + reply = state->mode.autowrap; + break; + + case 12: + reply = state->mode.cursor_blink; + break; + + case 25: + reply = state->mode.cursor_visible; + break; + + case 69: + reply = state->mode.leftrightmargin; + break; + + case 1000: + reply = state->mouse_flags == MOUSE_WANT_CLICK; + break; + + case 1002: + reply = state->mouse_flags == (MOUSE_WANT_CLICK|MOUSE_WANT_DRAG); + break; + + case 1003: + reply = state->mouse_flags == (MOUSE_WANT_CLICK|MOUSE_WANT_MOVE); + break; + + case 1004: + reply = state->mode.report_focus; + break; + + case 1005: + reply = state->mouse_protocol == MOUSE_UTF8; + break; + + case 1006: + reply = state->mouse_protocol == MOUSE_SGR; + break; + + case 1015: + reply = state->mouse_protocol == MOUSE_RXVT; + break; + + case 1047: + reply = state->mode.alt_screen; + break; + + case 2004: + reply = state->mode.bracketpaste; + break; + + default: + vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "?%d;%d$y", num, 0); + return; + } + + vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "?%d;%d$y", num, reply ? 1 : 2); +} + +static void request_version_string(VTermState *state) +{ + vterm_push_output_sprintf_str(state->vt, C1_DCS, true, ">|libvterm(%d.%d)", + VTERM_VERSION_MAJOR, VTERM_VERSION_MINOR); +} + +static int on_csi(const char *leader, const long args[], int argcount, const char *intermed, char command, void *user) +{ + VTermState *state = user; + int leader_byte = 0; + int intermed_byte = 0; + int cancel_phantom = 1; + + if(leader && leader[0]) { + if(leader[1]) // longer than 1 char + return 0; + + switch(leader[0]) { + case '?': + case '>': + leader_byte = leader[0]; + break; + default: + return 0; + } + } + + if(intermed && intermed[0]) { + if(intermed[1]) // longer than 1 char + return 0; + + switch(intermed[0]) { + case ' ': + case '!': + case '"': + case '$': + case '\'': + intermed_byte = intermed[0]; + break; + default: + return 0; + } + } + + VTermPos oldpos = state->pos; + + // Some temporaries for later code + int count, val; + int row, col; + VTermRect rect; + int selective; + +#define LBOUND(v,min) if((v) < (min)) (v) = (min) +#define UBOUND(v,max) if((v) > (max)) (v) = (max) + +#define LEADER(l,b) ((l << 8) | b) +#define INTERMED(i,b) ((i << 16) | b) + + switch(intermed_byte << 16 | leader_byte << 8 | command) { + case 0x40: // ICH - ECMA-48 8.3.64 + count = CSI_ARG_COUNT(args[0]); + + if(!is_cursor_in_scrollregion(state)) + break; + + rect.start_row = state->pos.row; + rect.end_row = state->pos.row + 1; + rect.start_col = state->pos.col; + if(state->mode.leftrightmargin) + rect.end_col = SCROLLREGION_RIGHT(state); + else + rect.end_col = THISROWWIDTH(state); + + scroll(state, rect, 0, -count); + + break; + + case 0x41: // CUU - ECMA-48 8.3.22 + count = CSI_ARG_COUNT(args[0]); + state->pos.row -= count; + state->at_phantom = 0; + break; + + case 0x42: // CUD - ECMA-48 8.3.19 + count = CSI_ARG_COUNT(args[0]); + state->pos.row += count; + state->at_phantom = 0; + break; + + case 0x43: // CUF - ECMA-48 8.3.20 + count = CSI_ARG_COUNT(args[0]); + state->pos.col += count; + state->at_phantom = 0; + break; + + case 0x44: // CUB - ECMA-48 8.3.18 + count = CSI_ARG_COUNT(args[0]); + state->pos.col -= count; + state->at_phantom = 0; + break; + + case 0x45: // CNL - ECMA-48 8.3.12 + count = CSI_ARG_COUNT(args[0]); + state->pos.col = 0; + state->pos.row += count; + state->at_phantom = 0; + break; + + case 0x46: // CPL - ECMA-48 8.3.13 + count = CSI_ARG_COUNT(args[0]); + state->pos.col = 0; + state->pos.row -= count; + state->at_phantom = 0; + break; + + case 0x47: // CHA - ECMA-48 8.3.9 + val = CSI_ARG_OR(args[0], 1); + state->pos.col = val-1; + state->at_phantom = 0; + break; + + case 0x48: // CUP - ECMA-48 8.3.21 + row = CSI_ARG_OR(args[0], 1); + col = argcount < 2 || CSI_ARG_IS_MISSING(args[1]) ? 1 : CSI_ARG(args[1]); + // zero-based + state->pos.row = row-1; + state->pos.col = col-1; + if(state->mode.origin) { + state->pos.row += state->scrollregion_top; + state->pos.col += SCROLLREGION_LEFT(state); + } + state->at_phantom = 0; + break; + + case 0x49: // CHT - ECMA-48 8.3.10 + count = CSI_ARG_COUNT(args[0]); + tab(state, count, +1); + break; + + case 0x4a: // ED - ECMA-48 8.3.39 + case LEADER('?', 0x4a): // DECSED - Selective Erase in Display + selective = (leader_byte == '?'); + switch(CSI_ARG(args[0])) { + case CSI_ARG_MISSING: + case 0: + rect.start_row = state->pos.row; rect.end_row = state->pos.row + 1; + rect.start_col = state->pos.col; rect.end_col = state->cols; + if(rect.end_col > rect.start_col) + erase(state, rect, selective); + + rect.start_row = state->pos.row + 1; rect.end_row = state->rows; + rect.start_col = 0; + for(int row = rect.start_row; row < rect.end_row; row++) + set_lineinfo(state, row, FORCE, DWL_OFF, DHL_OFF); + if(rect.end_row > rect.start_row) + erase(state, rect, selective); + break; + + case 1: + rect.start_row = 0; rect.end_row = state->pos.row; + rect.start_col = 0; rect.end_col = state->cols; + for(int row = rect.start_row; row < rect.end_row; row++) + set_lineinfo(state, row, FORCE, DWL_OFF, DHL_OFF); + if(rect.end_col > rect.start_col) + erase(state, rect, selective); + + rect.start_row = state->pos.row; rect.end_row = state->pos.row + 1; + rect.end_col = state->pos.col + 1; + if(rect.end_row > rect.start_row) + erase(state, rect, selective); + break; + + case 2: + rect.start_row = 0; rect.end_row = state->rows; + rect.start_col = 0; rect.end_col = state->cols; + for(int row = rect.start_row; row < rect.end_row; row++) + set_lineinfo(state, row, FORCE, DWL_OFF, DHL_OFF); + erase(state, rect, selective); + break; + + case 3: + if(state->callbacks && state->callbacks->sb_clear) + if((*state->callbacks->sb_clear)(state->cbdata)) + return 1; + break; + } + break; + + case 0x4b: // EL - ECMA-48 8.3.41 + case LEADER('?', 0x4b): // DECSEL - Selective Erase in Line + selective = (leader_byte == '?'); + rect.start_row = state->pos.row; + rect.end_row = state->pos.row + 1; + + switch(CSI_ARG(args[0])) { + case CSI_ARG_MISSING: + case 0: + rect.start_col = state->pos.col; rect.end_col = THISROWWIDTH(state); break; + case 1: + rect.start_col = 0; rect.end_col = state->pos.col + 1; break; + case 2: + rect.start_col = 0; rect.end_col = THISROWWIDTH(state); break; + default: + return 0; + } + + if(rect.end_col > rect.start_col) + erase(state, rect, selective); + + break; + + case 0x4c: // IL - ECMA-48 8.3.67 + count = CSI_ARG_COUNT(args[0]); + + if(!is_cursor_in_scrollregion(state)) + break; + + rect.start_row = state->pos.row; + rect.end_row = SCROLLREGION_BOTTOM(state); + rect.start_col = SCROLLREGION_LEFT(state); + rect.end_col = SCROLLREGION_RIGHT(state); + + scroll(state, rect, -count, 0); + + break; + + case 0x4d: // DL - ECMA-48 8.3.32 + count = CSI_ARG_COUNT(args[0]); + + if(!is_cursor_in_scrollregion(state)) + break; + + rect.start_row = state->pos.row; + rect.end_row = SCROLLREGION_BOTTOM(state); + rect.start_col = SCROLLREGION_LEFT(state); + rect.end_col = SCROLLREGION_RIGHT(state); + + scroll(state, rect, count, 0); + + break; + + case 0x50: // DCH - ECMA-48 8.3.26 + count = CSI_ARG_COUNT(args[0]); + + if(!is_cursor_in_scrollregion(state)) + break; + + rect.start_row = state->pos.row; + rect.end_row = state->pos.row + 1; + rect.start_col = state->pos.col; + if(state->mode.leftrightmargin) + rect.end_col = SCROLLREGION_RIGHT(state); + else + rect.end_col = THISROWWIDTH(state); + + scroll(state, rect, 0, count); + + break; + + case 0x53: // SU - ECMA-48 8.3.147 + count = CSI_ARG_COUNT(args[0]); + + rect.start_row = state->scrollregion_top; + rect.end_row = SCROLLREGION_BOTTOM(state); + rect.start_col = SCROLLREGION_LEFT(state); + rect.end_col = SCROLLREGION_RIGHT(state); + + scroll(state, rect, count, 0); + + break; + + case 0x54: // SD - ECMA-48 8.3.113 + count = CSI_ARG_COUNT(args[0]); + + rect.start_row = state->scrollregion_top; + rect.end_row = SCROLLREGION_BOTTOM(state); + rect.start_col = SCROLLREGION_LEFT(state); + rect.end_col = SCROLLREGION_RIGHT(state); + + scroll(state, rect, -count, 0); + + break; + + case 0x58: // ECH - ECMA-48 8.3.38 + count = CSI_ARG_COUNT(args[0]); + + rect.start_row = state->pos.row; + rect.end_row = state->pos.row + 1; + rect.start_col = state->pos.col; + rect.end_col = state->pos.col + count; + UBOUND(rect.end_col, THISROWWIDTH(state)); + + erase(state, rect, 0); + break; + + case 0x5a: // CBT - ECMA-48 8.3.7 + count = CSI_ARG_COUNT(args[0]); + tab(state, count, -1); + break; + + case 0x60: // HPA - ECMA-48 8.3.57 + col = CSI_ARG_OR(args[0], 1); + state->pos.col = col-1; + state->at_phantom = 0; + break; + + case 0x61: // HPR - ECMA-48 8.3.59 + count = CSI_ARG_COUNT(args[0]); + state->pos.col += count; + state->at_phantom = 0; + break; + + case 0x62: { // REP - ECMA-48 8.3.103 + const int row_width = THISROWWIDTH(state); + count = CSI_ARG_COUNT(args[0]); + col = state->pos.col + count; + UBOUND(col, row_width); + while (state->pos.col < col) { + putglyph(state, state->combine_chars, state->combine_width, state->pos); + state->pos.col += state->combine_width; + } + if (state->pos.col + state->combine_width >= row_width) { + if (state->mode.autowrap) { + state->at_phantom = 1; + cancel_phantom = 0; + } + } + break; + } + + case 0x63: // DA - ECMA-48 8.3.24 + val = CSI_ARG_OR(args[0], 0); + if(val == 0) + // DEC VT100 response + vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "?1;2c"); + break; + + case LEADER('>', 0x63): // DEC secondary Device Attributes + vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, ">%d;%d;%dc", 0, 100, 0); + break; + + case 0x64: // VPA - ECMA-48 8.3.158 + row = CSI_ARG_OR(args[0], 1); + state->pos.row = row-1; + if(state->mode.origin) + state->pos.row += state->scrollregion_top; + state->at_phantom = 0; + break; + + case 0x65: // VPR - ECMA-48 8.3.160 + count = CSI_ARG_COUNT(args[0]); + state->pos.row += count; + state->at_phantom = 0; + break; + + case 0x66: // HVP - ECMA-48 8.3.63 + row = CSI_ARG_OR(args[0], 1); + col = argcount < 2 || CSI_ARG_IS_MISSING(args[1]) ? 1 : CSI_ARG(args[1]); + // zero-based + state->pos.row = row-1; + state->pos.col = col-1; + if(state->mode.origin) { + state->pos.row += state->scrollregion_top; + state->pos.col += SCROLLREGION_LEFT(state); + } + state->at_phantom = 0; + break; + + case 0x67: // TBC - ECMA-48 8.3.154 + val = CSI_ARG_OR(args[0], 0); + + switch(val) { + case 0: + clear_col_tabstop(state, state->pos.col); + break; + case 3: + case 5: + for(col = 0; col < state->cols; col++) + clear_col_tabstop(state, col); + break; + case 1: + case 2: + case 4: + break; + /* TODO: 1, 2 and 4 aren't meaningful yet without line tab stops */ + default: + return 0; + } + break; + + case 0x68: // SM - ECMA-48 8.3.125 + if(!CSI_ARG_IS_MISSING(args[0])) + set_mode(state, CSI_ARG(args[0]), 1); + break; + + case LEADER('?', 0x68): // DEC private mode set + for(int i = 0; i < argcount; i++) { + if(!CSI_ARG_IS_MISSING(args[i])) + set_dec_mode(state, CSI_ARG(args[i]), 1); + } + break; + + case 0x6a: // HPB - ECMA-48 8.3.58 + count = CSI_ARG_COUNT(args[0]); + state->pos.col -= count; + state->at_phantom = 0; + break; + + case 0x6b: // VPB - ECMA-48 8.3.159 + count = CSI_ARG_COUNT(args[0]); + state->pos.row -= count; + state->at_phantom = 0; + break; + + case 0x6c: // RM - ECMA-48 8.3.106 + if(!CSI_ARG_IS_MISSING(args[0])) + set_mode(state, CSI_ARG(args[0]), 0); + break; + + case LEADER('?', 0x6c): // DEC private mode reset + for(int i = 0; i < argcount; i++) { + if(!CSI_ARG_IS_MISSING(args[i])) + set_dec_mode(state, CSI_ARG(args[i]), 0); + } + break; + + case 0x6d: // SGR - ECMA-48 8.3.117 + vterm_state_setpen(state, args, argcount); + break; + + case LEADER('?', 0x6d): // DECSGR + /* No actual DEC terminal recognised these, but some printers did. These + * are alternative ways to request subscript/superscript/off + */ + for(int argi = 0; argi < argcount; argi++) { + long arg; + switch(arg = CSI_ARG(args[argi])) { + case 4: // Superscript on + arg = 73; + vterm_state_setpen(state, &arg, 1); + break; + case 5: // Subscript on + arg = 74; + vterm_state_setpen(state, &arg, 1); + break; + case 24: // Super+subscript off + arg = 75; + vterm_state_setpen(state, &arg, 1); + break; + } + } + break; + + case 0x6e: // DSR - ECMA-48 8.3.35 + case LEADER('?', 0x6e): // DECDSR + val = CSI_ARG_OR(args[0], 0); + + { + char *qmark = (leader_byte == '?') ? "?" : ""; + + switch(val) { + case 0: case 1: case 2: case 3: case 4: + // ignore - these are replies + break; + case 5: + vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "%s0n", qmark); + break; + case 6: // CPR - cursor position report + vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "%s%d;%dR", qmark, state->pos.row + 1, state->pos.col + 1); + break; + } + } + break; + + + case INTERMED('!', 0x70): // DECSTR - DEC soft terminal reset + vterm_state_reset(state, 0); + break; + + case LEADER('?', INTERMED('$', 0x70)): + request_dec_mode(state, CSI_ARG(args[0])); + break; + + case LEADER('>', 0x71): // XTVERSION - xterm query version string + request_version_string(state); + break; + + case INTERMED(' ', 0x71): // DECSCUSR - DEC set cursor shape + val = CSI_ARG_OR(args[0], 1); + + switch(val) { + case 0: case 1: + settermprop_bool(state, VTERM_PROP_CURSORBLINK, 1); + settermprop_int (state, VTERM_PROP_CURSORSHAPE, VTERM_PROP_CURSORSHAPE_BLOCK); + break; + case 2: + settermprop_bool(state, VTERM_PROP_CURSORBLINK, 0); + settermprop_int (state, VTERM_PROP_CURSORSHAPE, VTERM_PROP_CURSORSHAPE_BLOCK); + break; + case 3: + settermprop_bool(state, VTERM_PROP_CURSORBLINK, 1); + settermprop_int (state, VTERM_PROP_CURSORSHAPE, VTERM_PROP_CURSORSHAPE_UNDERLINE); + break; + case 4: + settermprop_bool(state, VTERM_PROP_CURSORBLINK, 0); + settermprop_int (state, VTERM_PROP_CURSORSHAPE, VTERM_PROP_CURSORSHAPE_UNDERLINE); + break; + case 5: + settermprop_bool(state, VTERM_PROP_CURSORBLINK, 1); + settermprop_int (state, VTERM_PROP_CURSORSHAPE, VTERM_PROP_CURSORSHAPE_BAR_LEFT); + break; + case 6: + settermprop_bool(state, VTERM_PROP_CURSORBLINK, 0); + settermprop_int (state, VTERM_PROP_CURSORSHAPE, VTERM_PROP_CURSORSHAPE_BAR_LEFT); + break; + } + + break; + + case INTERMED('"', 0x71): // DECSCA - DEC select character protection attribute + val = CSI_ARG_OR(args[0], 0); + + switch(val) { + case 0: case 2: + state->protected_cell = 0; + break; + case 1: + state->protected_cell = 1; + break; + } + + break; + + case 0x72: // DECSTBM - DEC custom + state->scrollregion_top = CSI_ARG_OR(args[0], 1) - 1; + state->scrollregion_bottom = argcount < 2 || CSI_ARG_IS_MISSING(args[1]) ? -1 : CSI_ARG(args[1]); + LBOUND(state->scrollregion_top, 0); + UBOUND(state->scrollregion_top, state->rows); + LBOUND(state->scrollregion_bottom, -1); + if(state->scrollregion_top == 0 && state->scrollregion_bottom == state->rows) + state->scrollregion_bottom = -1; + else + UBOUND(state->scrollregion_bottom, state->rows); + + if(SCROLLREGION_BOTTOM(state) <= state->scrollregion_top) { + // Invalid + state->scrollregion_top = 0; + state->scrollregion_bottom = -1; + } + + // Setting the scrolling region restores the cursor to the home position + state->pos.row = 0; + state->pos.col = 0; + if(state->mode.origin) { + state->pos.row += state->scrollregion_top; + state->pos.col += SCROLLREGION_LEFT(state); + } + + break; + + case 0x73: // DECSLRM - DEC custom + // Always allow setting these margins, just they won't take effect without DECVSSM + state->scrollregion_left = CSI_ARG_OR(args[0], 1) - 1; + state->scrollregion_right = argcount < 2 || CSI_ARG_IS_MISSING(args[1]) ? -1 : CSI_ARG(args[1]); + LBOUND(state->scrollregion_left, 0); + UBOUND(state->scrollregion_left, state->cols); + LBOUND(state->scrollregion_right, -1); + if(state->scrollregion_left == 0 && state->scrollregion_right == state->cols) + state->scrollregion_right = -1; + else + UBOUND(state->scrollregion_right, state->cols); + + if(state->scrollregion_right > -1 && + state->scrollregion_right <= state->scrollregion_left) { + // Invalid + state->scrollregion_left = 0; + state->scrollregion_right = -1; + } + + // Setting the scrolling region restores the cursor to the home position + state->pos.row = 0; + state->pos.col = 0; + if(state->mode.origin) { + state->pos.row += state->scrollregion_top; + state->pos.col += SCROLLREGION_LEFT(state); + } + + break; + + case INTERMED('\'', 0x7D): // DECIC + count = CSI_ARG_COUNT(args[0]); + + if(!is_cursor_in_scrollregion(state)) + break; + + rect.start_row = state->scrollregion_top; + rect.end_row = SCROLLREGION_BOTTOM(state); + rect.start_col = state->pos.col; + rect.end_col = SCROLLREGION_RIGHT(state); + + scroll(state, rect, 0, -count); + + break; + + case INTERMED('\'', 0x7E): // DECDC + count = CSI_ARG_COUNT(args[0]); + + if(!is_cursor_in_scrollregion(state)) + break; + + rect.start_row = state->scrollregion_top; + rect.end_row = SCROLLREGION_BOTTOM(state); + rect.start_col = state->pos.col; + rect.end_col = SCROLLREGION_RIGHT(state); + + scroll(state, rect, 0, count); + + break; + + default: + if(state->fallbacks && state->fallbacks->csi) + if((*state->fallbacks->csi)(leader, args, argcount, intermed, command, state->fbdata)) + return 1; + + return 0; + } + + if(state->mode.origin) { + LBOUND(state->pos.row, state->scrollregion_top); + UBOUND(state->pos.row, SCROLLREGION_BOTTOM(state)-1); + LBOUND(state->pos.col, SCROLLREGION_LEFT(state)); + UBOUND(state->pos.col, SCROLLREGION_RIGHT(state)-1); + } + else { + LBOUND(state->pos.row, 0); + UBOUND(state->pos.row, state->rows-1); + LBOUND(state->pos.col, 0); + UBOUND(state->pos.col, THISROWWIDTH(state)-1); + } + + updatecursor(state, &oldpos, cancel_phantom); + +#ifdef DEBUG + if(state->pos.row < 0 || state->pos.row >= state->rows || + state->pos.col < 0 || state->pos.col >= state->cols) { + fprintf(stderr, "Position out of bounds after CSI %c: (%d,%d)\n", + command, state->pos.row, state->pos.col); + abort(); + } + + if(SCROLLREGION_BOTTOM(state) <= state->scrollregion_top) { + fprintf(stderr, "Scroll region height out of bounds after CSI %c: %d <= %d\n", + command, SCROLLREGION_BOTTOM(state), state->scrollregion_top); + abort(); + } + + if(SCROLLREGION_RIGHT(state) <= SCROLLREGION_LEFT(state)) { + fprintf(stderr, "Scroll region width out of bounds after CSI %c: %d <= %d\n", + command, SCROLLREGION_RIGHT(state), SCROLLREGION_LEFT(state)); + abort(); + } +#endif + + return 1; +} + +static char base64_one(uint8_t b) +{ + if(b < 26) + return 'A' + b; + else if(b < 52) + return 'a' + b - 26; + else if(b < 62) + return '0' + b - 52; + else if(b == 62) + return '+'; + else if(b == 63) + return '/'; + return 0; +} + +static uint8_t unbase64one(char c) +{ + if(c >= 'A' && c <= 'Z') + return c - 'A'; + else if(c >= 'a' && c <= 'z') + return c - 'a' + 26; + else if(c >= '0' && c <= '9') + return c - '0' + 52; + else if(c == '+') + return 62; + else if(c == '/') + return 63; + + return 0xFF; +} + +static void osc_selection(VTermState *state, VTermStringFragment frag) +{ + if(frag.initial) { + state->tmp.selection.mask = 0; + state->tmp.selection.state = SELECTION_INITIAL; + } + + while(!state->tmp.selection.state && frag.len) { + /* Parse selection parameter */ + switch(frag.str[0]) { + case 'c': + state->tmp.selection.mask |= VTERM_SELECTION_CLIPBOARD; + break; + case 'p': + state->tmp.selection.mask |= VTERM_SELECTION_PRIMARY; + break; + case 'q': + state->tmp.selection.mask |= VTERM_SELECTION_SECONDARY; + break; + case 's': + state->tmp.selection.mask |= VTERM_SELECTION_SELECT; + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + state->tmp.selection.mask |= (VTERM_SELECTION_CUT0 << (frag.str[0] - '0')); + break; + + case ';': + state->tmp.selection.state = SELECTION_SELECTED; + if(!state->tmp.selection.mask) + state->tmp.selection.mask = VTERM_SELECTION_SELECT|VTERM_SELECTION_CUT0; + break; + } + + frag.str++; + frag.len--; + } + + if(!frag.len) { + /* Clear selection if we're already finished but didn't do anything */ + if(frag.final && state->selection.callbacks->set) { + (*state->selection.callbacks->set)(state->tmp.selection.mask, (VTermStringFragment){ + .str = NULL, + .len = 0, + .initial = state->tmp.selection.state != SELECTION_SET, + .final = true, + }, state->selection.user); + } + return; + } + + if(state->tmp.selection.state == SELECTION_SELECTED) { + if(frag.str[0] == '?') { + state->tmp.selection.state = SELECTION_QUERY; + } + else { + state->tmp.selection.state = SELECTION_SET_INITIAL; + state->tmp.selection.recvpartial = 0; + } + } + + if(state->tmp.selection.state == SELECTION_QUERY) { + if(state->selection.callbacks->query) + (*state->selection.callbacks->query)(state->tmp.selection.mask, state->selection.user); + return; + } + + if(state->tmp.selection.state == SELECTION_INVALID) + return; + + if(state->selection.callbacks->set) { + size_t bufcur = 0; + char *buffer = state->selection.buffer; + + uint32_t x = 0; /* Current decoding value */ + int n = 0; /* Number of sextets consumed */ + + if(state->tmp.selection.recvpartial) { + n = state->tmp.selection.recvpartial >> 24; + x = state->tmp.selection.recvpartial & 0x03FFFF; /* could be up to 18 bits of state in here */ + + state->tmp.selection.recvpartial = 0; + } + + while((state->selection.buflen - bufcur) >= 3 && frag.len) { + if(frag.str[0] == '=') { + if(n == 2) { + buffer[0] = (x >> 4) & 0xFF; + buffer += 1, bufcur += 1; + } + if(n == 3) { + buffer[0] = (x >> 10) & 0xFF; + buffer[1] = (x >> 2) & 0xFF; + buffer += 2, bufcur += 2; + } + + while(frag.len && frag.str[0] == '=') + frag.str++, frag.len--; + + n = 0; + } + else { + uint8_t b = unbase64one(frag.str[0]); + if(b == 0xFF) { + DEBUG_LOG("base64decode bad input %02X\n", (uint8_t)frag.str[0]); + + state->tmp.selection.state = SELECTION_INVALID; + if(state->selection.callbacks->set) { + (*state->selection.callbacks->set)(state->tmp.selection.mask, (VTermStringFragment){ + .str = NULL, + .len = 0, + .initial = true, + .final = true, + }, state->selection.user); + } + break; + } + + x = (x << 6) | b; + n++; + frag.str++, frag.len--; + + if(n == 4) { + buffer[0] = (x >> 16) & 0xFF; + buffer[1] = (x >> 8) & 0xFF; + buffer[2] = (x >> 0) & 0xFF; + + buffer += 3, bufcur += 3; + x = 0; + n = 0; + } + } + + if(!frag.len || (state->selection.buflen - bufcur) < 3) { + if(bufcur) { + (*state->selection.callbacks->set)(state->tmp.selection.mask, (VTermStringFragment){ + .str = state->selection.buffer, + .len = bufcur, + .initial = state->tmp.selection.state == SELECTION_SET_INITIAL, + .final = frag.final && !frag.len, + }, state->selection.user); + state->tmp.selection.state = SELECTION_SET; + } + + buffer = state->selection.buffer; + bufcur = 0; + } + } + + if(n) + state->tmp.selection.recvpartial = (n << 24) | x; + } +} + +static int on_osc(int command, VTermStringFragment frag, void *user) +{ + VTermState *state = user; + + switch(command) { + case 0: + settermprop_string(state, VTERM_PROP_ICONNAME, frag); + settermprop_string(state, VTERM_PROP_TITLE, frag); + return 1; + + case 1: + settermprop_string(state, VTERM_PROP_ICONNAME, frag); + return 1; + + case 2: + settermprop_string(state, VTERM_PROP_TITLE, frag); + return 1; + + case 52: + if(state->selection.callbacks) + osc_selection(state, frag); + + return 1; + + default: + if(state->fallbacks && state->fallbacks->osc) + if((*state->fallbacks->osc)(command, frag, state->fbdata)) + return 1; + } + + return 0; +} + +static void request_status_string(VTermState *state, VTermStringFragment frag) +{ + VTerm *vt = state->vt; + + char *tmp = state->tmp.decrqss; + + if(frag.initial) + tmp[0] = tmp[1] = tmp[2] = tmp[3] = 0; + + int i = 0; + while(i < sizeof(state->tmp.decrqss)-1 && tmp[i]) + i++; + while(i < sizeof(state->tmp.decrqss)-1 && frag.len--) + tmp[i++] = (frag.str++)[0]; + tmp[i] = 0; + + if(!frag.final) + return; + + switch(tmp[0] | tmp[1]<<8 | tmp[2]<<16) { + case 'm': { + // Query SGR + long args[20]; + int argc = vterm_state_getpen(state, args, sizeof(args)/sizeof(args[0])); + size_t cur = 0; + + cur += snprintf(vt->tmpbuffer + cur, vt->tmpbuffer_len - cur, + vt->mode.ctrl8bit ? "\x90" "1$r" : ESC_S "P" "1$r"); // DCS 1$r ... + if(cur >= vt->tmpbuffer_len) + return; + + for(int argi = 0; argi < argc; argi++) { + cur += snprintf(vt->tmpbuffer + cur, vt->tmpbuffer_len - cur, + argi == argc - 1 ? "%ld" : + CSI_ARG_HAS_MORE(args[argi]) ? "%ld:" : + "%ld;", + CSI_ARG(args[argi])); + if(cur >= vt->tmpbuffer_len) + return; + } + + cur += snprintf(vt->tmpbuffer + cur, vt->tmpbuffer_len - cur, + vt->mode.ctrl8bit ? "m" "\x9C" : "m" ESC_S "\\"); // ... m ST + if(cur >= vt->tmpbuffer_len) + return; + + vterm_push_output_bytes(vt, vt->tmpbuffer, cur); + return; + } + + case 'r': + // Query DECSTBM + vterm_push_output_sprintf_str(vt, C1_DCS, true, + "1$r%d;%dr", state->scrollregion_top+1, SCROLLREGION_BOTTOM(state)); + return; + + case 's': + // Query DECSLRM + vterm_push_output_sprintf_str(vt, C1_DCS, true, + "1$r%d;%ds", SCROLLREGION_LEFT(state)+1, SCROLLREGION_RIGHT(state)); + return; + + case ' '|('q'<<8): { + // Query DECSCUSR + int reply; + switch(state->mode.cursor_shape) { + case VTERM_PROP_CURSORSHAPE_BLOCK: reply = 2; break; + case VTERM_PROP_CURSORSHAPE_UNDERLINE: reply = 4; break; + case VTERM_PROP_CURSORSHAPE_BAR_LEFT: reply = 6; break; + } + if(state->mode.cursor_blink) + reply--; + vterm_push_output_sprintf_str(vt, C1_DCS, true, + "1$r%d q", reply); + return; + } + + case '\"'|('q'<<8): + // Query DECSCA + vterm_push_output_sprintf_str(vt, C1_DCS, true, + "1$r%d\"q", state->protected_cell ? 1 : 2); + return; + } + + vterm_push_output_sprintf_str(state->vt, C1_DCS, true, "0$r"); +} + +static int on_dcs(const char *command, size_t commandlen, VTermStringFragment frag, void *user) +{ + VTermState *state = user; + + if(commandlen == 2 && strneq(command, "$q", 2)) { + request_status_string(state, frag); + return 1; + } + else if(state->fallbacks && state->fallbacks->dcs) + if((*state->fallbacks->dcs)(command, commandlen, frag, state->fbdata)) + return 1; + + DEBUG_LOG("libvterm: Unhandled DCS %.*s\n", (int)commandlen, command); + return 0; +} + +static int on_apc(VTermStringFragment frag, void *user) +{ + VTermState *state = user; + + if(state->fallbacks && state->fallbacks->apc) + if((*state->fallbacks->apc)(frag, state->fbdata)) + return 1; + + /* No DEBUG_LOG because all APCs are unhandled */ + return 0; +} + +static int on_pm(VTermStringFragment frag, void *user) +{ + VTermState *state = user; + + if(state->fallbacks && state->fallbacks->pm) + if((*state->fallbacks->pm)(frag, state->fbdata)) + return 1; + + /* No DEBUG_LOG because all PMs are unhandled */ + return 0; +} + +static int on_sos(VTermStringFragment frag, void *user) +{ + VTermState *state = user; + + if(state->fallbacks && state->fallbacks->sos) + if((*state->fallbacks->sos)(frag, state->fbdata)) + return 1; + + /* No DEBUG_LOG because all SOSs are unhandled */ + return 0; +} + +static int on_resize(int rows, int cols, void *user) +{ + VTermState *state = user; + VTermPos oldpos = state->pos; + + if(cols != state->cols) { + unsigned char *newtabstops = vterm_allocator_malloc(state->vt, (cols + 7) / 8); + + /* TODO: This can all be done much more efficiently bytewise */ + int col; + for(col = 0; col < state->cols && col < cols; col++) { + unsigned char mask = 1 << (col & 7); + if(state->tabstops[col >> 3] & mask) + newtabstops[col >> 3] |= mask; + else + newtabstops[col >> 3] &= ~mask; + } + + for( ; col < cols; col++) { + unsigned char mask = 1 << (col & 7); + if(col % 8 == 0) + newtabstops[col >> 3] |= mask; + else + newtabstops[col >> 3] &= ~mask; + } + + vterm_allocator_free(state->vt, state->tabstops); + state->tabstops = newtabstops; + } + + state->rows = rows; + state->cols = cols; + + if(state->scrollregion_bottom > -1) + UBOUND(state->scrollregion_bottom, state->rows); + if(state->scrollregion_right > -1) + UBOUND(state->scrollregion_right, state->cols); + + VTermStateFields fields = { + .pos = state->pos, + .lineinfos = { [0] = state->lineinfos[0], [1] = state->lineinfos[1] }, + }; + + if(state->callbacks && state->callbacks->resize) { + (*state->callbacks->resize)(rows, cols, &fields, state->cbdata); + state->pos = fields.pos; + + state->lineinfos[0] = fields.lineinfos[0]; + state->lineinfos[1] = fields.lineinfos[1]; + } + else { + if(rows != state->rows) { + for(int bufidx = BUFIDX_PRIMARY; bufidx <= BUFIDX_ALTSCREEN; bufidx++) { + VTermLineInfo *oldlineinfo = state->lineinfos[bufidx]; + if(!oldlineinfo) + continue; + + VTermLineInfo *newlineinfo = vterm_allocator_malloc(state->vt, rows * sizeof(VTermLineInfo)); + + int row; + for(row = 0; row < state->rows && row < rows; row++) { + newlineinfo[row] = oldlineinfo[row]; + } + + for( ; row < rows; row++) { + newlineinfo[row] = (VTermLineInfo){ + .doublewidth = 0, + }; + } + + vterm_allocator_free(state->vt, state->lineinfos[bufidx]); + state->lineinfos[bufidx] = newlineinfo; + } + } + } + + state->lineinfo = state->lineinfos[state->mode.alt_screen ? BUFIDX_ALTSCREEN : BUFIDX_PRIMARY]; + + if(state->at_phantom && state->pos.col < cols-1) { + state->at_phantom = 0; + state->pos.col++; + } + + if(state->pos.row < 0) + state->pos.row = 0; + if(state->pos.row >= rows) + state->pos.row = rows - 1; + if(state->pos.col < 0) + state->pos.col = 0; + if(state->pos.col >= cols) + state->pos.col = cols - 1; + + updatecursor(state, &oldpos, 1); + + return 1; +} + +static const VTermParserCallbacks parser_callbacks = { + .text = on_text, + .control = on_control, + .escape = on_escape, + .csi = on_csi, + .osc = on_osc, + .dcs = on_dcs, + .apc = on_apc, + .pm = on_pm, + .sos = on_sos, + .resize = on_resize, +}; + +VTermState *vterm_obtain_state(VTerm *vt) +{ + if(vt->state) + return vt->state; + + VTermState *state = vterm_state_new(vt); + vt->state = state; + + vterm_parser_set_callbacks(vt, &parser_callbacks, state); + + return state; +} + +void vterm_state_reset(VTermState *state, int hard) +{ + state->scrollregion_top = 0; + state->scrollregion_bottom = -1; + state->scrollregion_left = 0; + state->scrollregion_right = -1; + + state->mode.keypad = 0; + state->mode.cursor = 0; + state->mode.autowrap = 1; + state->mode.insert = 0; + state->mode.newline = 0; + state->mode.alt_screen = 0; + state->mode.origin = 0; + state->mode.leftrightmargin = 0; + state->mode.bracketpaste = 0; + state->mode.report_focus = 0; + + state->mouse_flags = 0; + + state->vt->mode.ctrl8bit = 0; + + for(int col = 0; col < state->cols; col++) + if(col % 8 == 0) + set_col_tabstop(state, col); + else + clear_col_tabstop(state, col); + + for(int row = 0; row < state->rows; row++) + set_lineinfo(state, row, FORCE, DWL_OFF, DHL_OFF); + + if(state->callbacks && state->callbacks->initpen) + (*state->callbacks->initpen)(state->cbdata); + + vterm_state_resetpen(state); + + VTermEncoding *default_enc = state->vt->mode.utf8 ? + vterm_lookup_encoding(ENC_UTF8, 'u') : + vterm_lookup_encoding(ENC_SINGLE_94, 'B'); + + for(int i = 0; i < 4; i++) { + state->encoding[i].enc = default_enc; + if(default_enc->init) + (*default_enc->init)(default_enc, state->encoding[i].data); + } + + state->gl_set = 0; + state->gr_set = 1; + state->gsingle_set = 0; + + state->protected_cell = 0; + + // Initialise the props + settermprop_bool(state, VTERM_PROP_CURSORVISIBLE, 1); + settermprop_bool(state, VTERM_PROP_CURSORBLINK, 1); + settermprop_int (state, VTERM_PROP_CURSORSHAPE, VTERM_PROP_CURSORSHAPE_BLOCK); + + if(hard) { + state->pos.row = 0; + state->pos.col = 0; + state->at_phantom = 0; + + VTermRect rect = { 0, state->rows, 0, state->cols }; + erase(state, rect, 0); + } +} + +void vterm_state_get_cursorpos(const VTermState *state, VTermPos *cursorpos) +{ + *cursorpos = state->pos; +} + +void vterm_state_set_callbacks(VTermState *state, const VTermStateCallbacks *callbacks, void *user) +{ + if(callbacks) { + state->callbacks = callbacks; + state->cbdata = user; + + if(state->callbacks && state->callbacks->initpen) + (*state->callbacks->initpen)(state->cbdata); + } + else { + state->callbacks = NULL; + state->cbdata = NULL; + } +} + +void vterm_state_callbacks_has_premove(VTermState *state) +{ + state->callbacks_has_premove = true; +} + +void *vterm_state_get_cbdata(VTermState *state) +{ + return state->cbdata; +} + +void vterm_state_set_unrecognised_fallbacks(VTermState *state, const VTermStateFallbacks *fallbacks, void *user) +{ + if(fallbacks) { + state->fallbacks = fallbacks; + state->fbdata = user; + } + else { + state->fallbacks = NULL; + state->fbdata = NULL; + } +} + +void *vterm_state_get_unrecognised_fbdata(VTermState *state) +{ + return state->fbdata; +} + +int vterm_state_set_termprop(VTermState *state, VTermProp prop, VTermValue *val) +{ + /* Only store the new value of the property if usercode said it was happy. + * This is especially important for altscreen switching */ + if(state->callbacks && state->callbacks->settermprop) + if(!(*state->callbacks->settermprop)(prop, val, state->cbdata)) + return 0; + + switch(prop) { + case VTERM_PROP_TITLE: + case VTERM_PROP_ICONNAME: + // we don't store these, just transparently pass through + return 1; + case VTERM_PROP_CURSORVISIBLE: + state->mode.cursor_visible = val->boolean; + return 1; + case VTERM_PROP_CURSORBLINK: + state->mode.cursor_blink = val->boolean; + return 1; + case VTERM_PROP_CURSORSHAPE: + state->mode.cursor_shape = val->number; + return 1; + case VTERM_PROP_REVERSE: + state->mode.screen = val->boolean; + return 1; + case VTERM_PROP_ALTSCREEN: + state->mode.alt_screen = val->boolean; + state->lineinfo = state->lineinfos[state->mode.alt_screen ? BUFIDX_ALTSCREEN : BUFIDX_PRIMARY]; + if(state->mode.alt_screen) { + VTermRect rect = { + .start_row = 0, + .start_col = 0, + .end_row = state->rows, + .end_col = state->cols, + }; + erase(state, rect, 0); + } + return 1; + case VTERM_PROP_MOUSE: + state->mouse_flags = 0; + if(val->number) + state->mouse_flags |= MOUSE_WANT_CLICK; + if(val->number == VTERM_PROP_MOUSE_DRAG) + state->mouse_flags |= MOUSE_WANT_DRAG; + if(val->number == VTERM_PROP_MOUSE_MOVE) + state->mouse_flags |= MOUSE_WANT_MOVE; + return 1; + case VTERM_PROP_FOCUSREPORT: + state->mode.report_focus = val->boolean; + return 1; + + case VTERM_N_PROPS: + return 0; + } + + return 0; +} + +void vterm_state_focus_in(VTermState *state) +{ + if(state->mode.report_focus) + vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "I"); +} + +void vterm_state_focus_out(VTermState *state) +{ + if(state->mode.report_focus) + vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "O"); +} + +const VTermLineInfo *vterm_state_get_lineinfo(const VTermState *state, int row) +{ + return state->lineinfo + row; +} + +void vterm_state_set_selection_callbacks(VTermState *state, const VTermSelectionCallbacks *callbacks, void *user, + char *buffer, size_t buflen) +{ + if(buflen && !buffer) + buffer = vterm_allocator_malloc(state->vt, buflen); + + state->selection.callbacks = callbacks; + state->selection.user = user; + state->selection.buffer = buffer; + state->selection.buflen = buflen; +} + +void vterm_state_send_selection(VTermState *state, VTermSelectionMask mask, VTermStringFragment frag) +{ + VTerm *vt = state->vt; + + if(frag.initial) { + /* TODO: support sending more than one mask bit */ + const static char selection_chars[] = "cpqs"; + int idx; + for(idx = 0; idx < 4; idx++) + if(mask & (1 << idx)) + break; + + vterm_push_output_sprintf_str(vt, C1_OSC, false, "52;%c;", selection_chars[idx]); + + state->tmp.selection.sendpartial = 0; + } + + if(frag.len) { + size_t bufcur = 0; + char *buffer = state->selection.buffer; + + uint32_t x = 0; + int n = 0; + + if(state->tmp.selection.sendpartial) { + n = state->tmp.selection.sendpartial >> 24; + x = state->tmp.selection.sendpartial & 0xFFFFFF; + + state->tmp.selection.sendpartial = 0; + } + + while((state->selection.buflen - bufcur) >= 4 && frag.len) { + x = (x << 8) | frag.str[0]; + n++; + frag.str++, frag.len--; + + if(n == 3) { + buffer[0] = base64_one((x >> 18) & 0x3F); + buffer[1] = base64_one((x >> 12) & 0x3F); + buffer[2] = base64_one((x >> 6) & 0x3F); + buffer[3] = base64_one((x >> 0) & 0x3F); + + buffer += 4, bufcur += 4; + x = 0; + n = 0; + } + + if(!frag.len || (state->selection.buflen - bufcur) < 4) { + if(bufcur) + vterm_push_output_bytes(vt, state->selection.buffer, bufcur); + + buffer = state->selection.buffer; + bufcur = 0; + } + } + + if(n) + state->tmp.selection.sendpartial = (n << 24) | x; + } + + if(frag.final) { + if(state->tmp.selection.sendpartial) { + int n = state->tmp.selection.sendpartial >> 24; + uint32_t x = state->tmp.selection.sendpartial & 0xFFFFFF; + char *buffer = state->selection.buffer; + + /* n is either 1 or 2 now */ + x <<= (n == 1) ? 16 : 8; + + buffer[0] = base64_one((x >> 18) & 0x3F); + buffer[1] = base64_one((x >> 12) & 0x3F); + buffer[2] = (n == 1) ? '=' : base64_one((x >> 6) & 0x3F); + buffer[3] = '='; + + vterm_push_output_sprintf_str(vt, 0, true, "%.*s", 4, buffer); + } + else + vterm_push_output_sprintf_str(vt, 0, true, ""); + } +} diff --git a/third_party/libvterm/src/unicode.c b/third_party/libvterm/src/unicode.c new file mode 100644 index 0000000..269244f --- /dev/null +++ b/third_party/libvterm/src/unicode.c @@ -0,0 +1,313 @@ +#include "vterm_internal.h" + +// ### The following from http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c +// With modifications: +// made functions static +// moved 'combining' table to file scope, so other functions can see it +// ################################################################### + +/* + * This is an implementation of wcwidth() and wcswidth() (defined in + * IEEE Std 1002.1-2001) for Unicode. + * + * http://www.opengroup.org/onlinepubs/007904975/functions/wcwidth.html + * http://www.opengroup.org/onlinepubs/007904975/functions/wcswidth.html + * + * In fixed-width output devices, Latin characters all occupy a single + * "cell" position of equal width, whereas ideographic CJK characters + * occupy two such cells. Interoperability between terminal-line + * applications and (teletype-style) character terminals using the + * UTF-8 encoding requires agreement on which character should advance + * the cursor by how many cell positions. No established formal + * standards exist at present on which Unicode character shall occupy + * how many cell positions on character terminals. These routines are + * a first attempt of defining such behavior based on simple rules + * applied to data provided by the Unicode Consortium. + * + * For some graphical characters, the Unicode standard explicitly + * defines a character-cell width via the definition of the East Asian + * FullWidth (F), Wide (W), Half-width (H), and Narrow (Na) classes. + * In all these cases, there is no ambiguity about which width a + * terminal shall use. For characters in the East Asian Ambiguous (A) + * class, the width choice depends purely on a preference of backward + * compatibility with either historic CJK or Western practice. + * Choosing single-width for these characters is easy to justify as + * the appropriate long-term solution, as the CJK practice of + * displaying these characters as double-width comes from historic + * implementation simplicity (8-bit encoded characters were displayed + * single-width and 16-bit ones double-width, even for Greek, + * Cyrillic, etc.) and not any typographic considerations. + * + * Much less clear is the choice of width for the Not East Asian + * (Neutral) class. Existing practice does not dictate a width for any + * of these characters. It would nevertheless make sense + * typographically to allocate two character cells to characters such + * as for instance EM SPACE or VOLUME INTEGRAL, which cannot be + * represented adequately with a single-width glyph. The following + * routines at present merely assign a single-cell width to all + * neutral characters, in the interest of simplicity. This is not + * entirely satisfactory and should be reconsidered before + * establishing a formal standard in this area. At the moment, the + * decision which Not East Asian (Neutral) characters should be + * represented by double-width glyphs cannot yet be answered by + * applying a simple rule from the Unicode database content. Setting + * up a proper standard for the behavior of UTF-8 character terminals + * will require a careful analysis not only of each Unicode character, + * but also of each presentation form, something the author of these + * routines has avoided to do so far. + * + * http://www.unicode.org/unicode/reports/tr11/ + * + * Markus Kuhn -- 2007-05-26 (Unicode 5.0) + * + * Permission to use, copy, modify, and distribute this software + * for any purpose and without fee is hereby granted. The author + * disclaims all warranties with regard to this software. + * + * Latest version: http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c + */ + +struct interval { + int first; + int last; +}; + +/* sorted list of non-overlapping intervals of non-spacing characters */ +/* generated by "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c" */ +static const struct interval combining[] = { + { 0x0300, 0x036F }, { 0x0483, 0x0486 }, { 0x0488, 0x0489 }, + { 0x0591, 0x05BD }, { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 }, + { 0x05C4, 0x05C5 }, { 0x05C7, 0x05C7 }, { 0x0600, 0x0603 }, + { 0x0610, 0x0615 }, { 0x064B, 0x065E }, { 0x0670, 0x0670 }, + { 0x06D6, 0x06E4 }, { 0x06E7, 0x06E8 }, { 0x06EA, 0x06ED }, + { 0x070F, 0x070F }, { 0x0711, 0x0711 }, { 0x0730, 0x074A }, + { 0x07A6, 0x07B0 }, { 0x07EB, 0x07F3 }, { 0x0901, 0x0902 }, + { 0x093C, 0x093C }, { 0x0941, 0x0948 }, { 0x094D, 0x094D }, + { 0x0951, 0x0954 }, { 0x0962, 0x0963 }, { 0x0981, 0x0981 }, + { 0x09BC, 0x09BC }, { 0x09C1, 0x09C4 }, { 0x09CD, 0x09CD }, + { 0x09E2, 0x09E3 }, { 0x0A01, 0x0A02 }, { 0x0A3C, 0x0A3C }, + { 0x0A41, 0x0A42 }, { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D }, + { 0x0A70, 0x0A71 }, { 0x0A81, 0x0A82 }, { 0x0ABC, 0x0ABC }, + { 0x0AC1, 0x0AC5 }, { 0x0AC7, 0x0AC8 }, { 0x0ACD, 0x0ACD }, + { 0x0AE2, 0x0AE3 }, { 0x0B01, 0x0B01 }, { 0x0B3C, 0x0B3C }, + { 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B43 }, { 0x0B4D, 0x0B4D }, + { 0x0B56, 0x0B56 }, { 0x0B82, 0x0B82 }, { 0x0BC0, 0x0BC0 }, + { 0x0BCD, 0x0BCD }, { 0x0C3E, 0x0C40 }, { 0x0C46, 0x0C48 }, + { 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 }, { 0x0CBC, 0x0CBC }, + { 0x0CBF, 0x0CBF }, { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD }, + { 0x0CE2, 0x0CE3 }, { 0x0D41, 0x0D43 }, { 0x0D4D, 0x0D4D }, + { 0x0DCA, 0x0DCA }, { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 }, + { 0x0E31, 0x0E31 }, { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E }, + { 0x0EB1, 0x0EB1 }, { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC }, + { 0x0EC8, 0x0ECD }, { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 }, + { 0x0F37, 0x0F37 }, { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E }, + { 0x0F80, 0x0F84 }, { 0x0F86, 0x0F87 }, { 0x0F90, 0x0F97 }, + { 0x0F99, 0x0FBC }, { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 }, + { 0x1032, 0x1032 }, { 0x1036, 0x1037 }, { 0x1039, 0x1039 }, + { 0x1058, 0x1059 }, { 0x1160, 0x11FF }, { 0x135F, 0x135F }, + { 0x1712, 0x1714 }, { 0x1732, 0x1734 }, { 0x1752, 0x1753 }, + { 0x1772, 0x1773 }, { 0x17B4, 0x17B5 }, { 0x17B7, 0x17BD }, + { 0x17C6, 0x17C6 }, { 0x17C9, 0x17D3 }, { 0x17DD, 0x17DD }, + { 0x180B, 0x180D }, { 0x18A9, 0x18A9 }, { 0x1920, 0x1922 }, + { 0x1927, 0x1928 }, { 0x1932, 0x1932 }, { 0x1939, 0x193B }, + { 0x1A17, 0x1A18 }, { 0x1B00, 0x1B03 }, { 0x1B34, 0x1B34 }, + { 0x1B36, 0x1B3A }, { 0x1B3C, 0x1B3C }, { 0x1B42, 0x1B42 }, + { 0x1B6B, 0x1B73 }, { 0x1DC0, 0x1DCA }, { 0x1DFE, 0x1DFF }, + { 0x200B, 0x200F }, { 0x202A, 0x202E }, { 0x2060, 0x2063 }, + { 0x206A, 0x206F }, { 0x20D0, 0x20EF }, { 0x302A, 0x302F }, + { 0x3099, 0x309A }, { 0xA806, 0xA806 }, { 0xA80B, 0xA80B }, + { 0xA825, 0xA826 }, { 0xFB1E, 0xFB1E }, { 0xFE00, 0xFE0F }, + { 0xFE20, 0xFE23 }, { 0xFEFF, 0xFEFF }, { 0xFFF9, 0xFFFB }, + { 0x10A01, 0x10A03 }, { 0x10A05, 0x10A06 }, { 0x10A0C, 0x10A0F }, + { 0x10A38, 0x10A3A }, { 0x10A3F, 0x10A3F }, { 0x1D167, 0x1D169 }, + { 0x1D173, 0x1D182 }, { 0x1D185, 0x1D18B }, { 0x1D1AA, 0x1D1AD }, + { 0x1D242, 0x1D244 }, { 0xE0001, 0xE0001 }, { 0xE0020, 0xE007F }, + { 0xE0100, 0xE01EF } +}; + + +/* auxiliary function for binary search in interval table */ +static int bisearch(uint32_t ucs, const struct interval *table, int max) { + int min = 0; + int mid; + + if (ucs < table[0].first || ucs > table[max].last) + return 0; + while (max >= min) { + mid = (min + max) / 2; + if (ucs > table[mid].last) + min = mid + 1; + else if (ucs < table[mid].first) + max = mid - 1; + else + return 1; + } + + return 0; +} + + +/* The following two functions define the column width of an ISO 10646 + * character as follows: + * + * - The null character (U+0000) has a column width of 0. + * + * - Other C0/C1 control characters and DEL will lead to a return + * value of -1. + * + * - Non-spacing and enclosing combining characters (general + * category code Mn or Me in the Unicode database) have a + * column width of 0. + * + * - SOFT HYPHEN (U+00AD) has a column width of 1. + * + * - Other format characters (general category code Cf in the Unicode + * database) and ZERO WIDTH SPACE (U+200B) have a column width of 0. + * + * - Hangul Jamo medial vowels and final consonants (U+1160-U+11FF) + * have a column width of 0. + * + * - Spacing characters in the East Asian Wide (W) or East Asian + * Full-width (F) category as defined in Unicode Technical + * Report #11 have a column width of 2. + * + * - All remaining characters (including all printable + * ISO 8859-1 and WGL4 characters, Unicode control characters, + * etc.) have a column width of 1. + * + * This implementation assumes that uint32_t characters are encoded + * in ISO 10646. + */ + + +static int mk_wcwidth(uint32_t ucs) +{ + /* test for 8-bit control characters */ + if (ucs == 0) + return 0; + if (ucs < 32 || (ucs >= 0x7f && ucs < 0xa0)) + return -1; + + /* binary search in table of non-spacing characters */ + if (bisearch(ucs, combining, + sizeof(combining) / sizeof(struct interval) - 1)) + return 0; + + /* if we arrive here, ucs is not a combining or C0/C1 control character */ + + return 1 + + (ucs >= 0x1100 && + (ucs <= 0x115f || /* Hangul Jamo init. consonants */ + ucs == 0x2329 || ucs == 0x232a || + (ucs >= 0x2e80 && ucs <= 0xa4cf && + ucs != 0x303f) || /* CJK ... Yi */ + (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */ + (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility Ideographs */ + (ucs >= 0xfe10 && ucs <= 0xfe19) || /* Vertical forms */ + (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */ + (ucs >= 0xff00 && ucs <= 0xff60) || /* Fullwidth Forms */ + (ucs >= 0xffe0 && ucs <= 0xffe6) || + (ucs >= 0x20000 && ucs <= 0x2fffd) || + (ucs >= 0x30000 && ucs <= 0x3fffd))); +} + + +#ifdef USE_MK_WCWIDTH_CJK + +/* + * The following functions are the same as mk_wcwidth() and + * mk_wcswidth(), except that spacing characters in the East Asian + * Ambiguous (A) category as defined in Unicode Technical Report #11 + * have a column width of 2. This variant might be useful for users of + * CJK legacy encodings who want to migrate to UCS without changing + * the traditional terminal character-width behaviour. It is not + * otherwise recommended for general use. + */ +static int mk_wcwidth_cjk(uint32_t ucs) +{ + /* sorted list of non-overlapping intervals of East Asian Ambiguous + * characters, generated by "uniset +WIDTH-A -cat=Me -cat=Mn -cat=Cf c" */ + static const struct interval ambiguous[] = { + { 0x00A1, 0x00A1 }, { 0x00A4, 0x00A4 }, { 0x00A7, 0x00A8 }, + { 0x00AA, 0x00AA }, { 0x00AE, 0x00AE }, { 0x00B0, 0x00B4 }, + { 0x00B6, 0x00BA }, { 0x00BC, 0x00BF }, { 0x00C6, 0x00C6 }, + { 0x00D0, 0x00D0 }, { 0x00D7, 0x00D8 }, { 0x00DE, 0x00E1 }, + { 0x00E6, 0x00E6 }, { 0x00E8, 0x00EA }, { 0x00EC, 0x00ED }, + { 0x00F0, 0x00F0 }, { 0x00F2, 0x00F3 }, { 0x00F7, 0x00FA }, + { 0x00FC, 0x00FC }, { 0x00FE, 0x00FE }, { 0x0101, 0x0101 }, + { 0x0111, 0x0111 }, { 0x0113, 0x0113 }, { 0x011B, 0x011B }, + { 0x0126, 0x0127 }, { 0x012B, 0x012B }, { 0x0131, 0x0133 }, + { 0x0138, 0x0138 }, { 0x013F, 0x0142 }, { 0x0144, 0x0144 }, + { 0x0148, 0x014B }, { 0x014D, 0x014D }, { 0x0152, 0x0153 }, + { 0x0166, 0x0167 }, { 0x016B, 0x016B }, { 0x01CE, 0x01CE }, + { 0x01D0, 0x01D0 }, { 0x01D2, 0x01D2 }, { 0x01D4, 0x01D4 }, + { 0x01D6, 0x01D6 }, { 0x01D8, 0x01D8 }, { 0x01DA, 0x01DA }, + { 0x01DC, 0x01DC }, { 0x0251, 0x0251 }, { 0x0261, 0x0261 }, + { 0x02C4, 0x02C4 }, { 0x02C7, 0x02C7 }, { 0x02C9, 0x02CB }, + { 0x02CD, 0x02CD }, { 0x02D0, 0x02D0 }, { 0x02D8, 0x02DB }, + { 0x02DD, 0x02DD }, { 0x02DF, 0x02DF }, { 0x0391, 0x03A1 }, + { 0x03A3, 0x03A9 }, { 0x03B1, 0x03C1 }, { 0x03C3, 0x03C9 }, + { 0x0401, 0x0401 }, { 0x0410, 0x044F }, { 0x0451, 0x0451 }, + { 0x2010, 0x2010 }, { 0x2013, 0x2016 }, { 0x2018, 0x2019 }, + { 0x201C, 0x201D }, { 0x2020, 0x2022 }, { 0x2024, 0x2027 }, + { 0x2030, 0x2030 }, { 0x2032, 0x2033 }, { 0x2035, 0x2035 }, + { 0x203B, 0x203B }, { 0x203E, 0x203E }, { 0x2074, 0x2074 }, + { 0x207F, 0x207F }, { 0x2081, 0x2084 }, { 0x20AC, 0x20AC }, + { 0x2103, 0x2103 }, { 0x2105, 0x2105 }, { 0x2109, 0x2109 }, + { 0x2113, 0x2113 }, { 0x2116, 0x2116 }, { 0x2121, 0x2122 }, + { 0x2126, 0x2126 }, { 0x212B, 0x212B }, { 0x2153, 0x2154 }, + { 0x215B, 0x215E }, { 0x2160, 0x216B }, { 0x2170, 0x2179 }, + { 0x2190, 0x2199 }, { 0x21B8, 0x21B9 }, { 0x21D2, 0x21D2 }, + { 0x21D4, 0x21D4 }, { 0x21E7, 0x21E7 }, { 0x2200, 0x2200 }, + { 0x2202, 0x2203 }, { 0x2207, 0x2208 }, { 0x220B, 0x220B }, + { 0x220F, 0x220F }, { 0x2211, 0x2211 }, { 0x2215, 0x2215 }, + { 0x221A, 0x221A }, { 0x221D, 0x2220 }, { 0x2223, 0x2223 }, + { 0x2225, 0x2225 }, { 0x2227, 0x222C }, { 0x222E, 0x222E }, + { 0x2234, 0x2237 }, { 0x223C, 0x223D }, { 0x2248, 0x2248 }, + { 0x224C, 0x224C }, { 0x2252, 0x2252 }, { 0x2260, 0x2261 }, + { 0x2264, 0x2267 }, { 0x226A, 0x226B }, { 0x226E, 0x226F }, + { 0x2282, 0x2283 }, { 0x2286, 0x2287 }, { 0x2295, 0x2295 }, + { 0x2299, 0x2299 }, { 0x22A5, 0x22A5 }, { 0x22BF, 0x22BF }, + { 0x2312, 0x2312 }, { 0x2460, 0x24E9 }, { 0x24EB, 0x254B }, + { 0x2550, 0x2573 }, { 0x2580, 0x258F }, { 0x2592, 0x2595 }, + { 0x25A0, 0x25A1 }, { 0x25A3, 0x25A9 }, { 0x25B2, 0x25B3 }, + { 0x25B6, 0x25B7 }, { 0x25BC, 0x25BD }, { 0x25C0, 0x25C1 }, + { 0x25C6, 0x25C8 }, { 0x25CB, 0x25CB }, { 0x25CE, 0x25D1 }, + { 0x25E2, 0x25E5 }, { 0x25EF, 0x25EF }, { 0x2605, 0x2606 }, + { 0x2609, 0x2609 }, { 0x260E, 0x260F }, { 0x2614, 0x2615 }, + { 0x261C, 0x261C }, { 0x261E, 0x261E }, { 0x2640, 0x2640 }, + { 0x2642, 0x2642 }, { 0x2660, 0x2661 }, { 0x2663, 0x2665 }, + { 0x2667, 0x266A }, { 0x266C, 0x266D }, { 0x266F, 0x266F }, + { 0x273D, 0x273D }, { 0x2776, 0x277F }, { 0xE000, 0xF8FF }, + { 0xFFFD, 0xFFFD }, { 0xF0000, 0xFFFFD }, { 0x100000, 0x10FFFD } + }; + + /* binary search in table of non-spacing characters */ + if (bisearch(ucs, ambiguous, + sizeof(ambiguous) / sizeof(struct interval) - 1)) + return 2; + + return mk_wcwidth(ucs); +} + +#endif + +// ################################ +// ### The rest added by Paul Evans + +static const struct interval fullwidth[] = { +#include "fullwidth.inc" +}; + +INTERNAL int vterm_unicode_width(uint32_t codepoint) +{ + if(bisearch(codepoint, fullwidth, sizeof(fullwidth) / sizeof(fullwidth[0]) - 1)) + return 2; + + return mk_wcwidth(codepoint); +} + +INTERNAL int vterm_unicode_is_combining(uint32_t codepoint) +{ + return bisearch(codepoint, combining, sizeof(combining) / sizeof(struct interval) - 1); +} diff --git a/third_party/libvterm/src/utf8.h b/third_party/libvterm/src/utf8.h new file mode 100644 index 0000000..9a336d3 --- /dev/null +++ b/third_party/libvterm/src/utf8.h @@ -0,0 +1,39 @@ +/* The following functions copied and adapted from libtermkey + * + * http://www.leonerd.org.uk/code/libtermkey/ + */ +static inline unsigned int utf8_seqlen(long codepoint) +{ + if(codepoint < 0x0000080) return 1; + if(codepoint < 0x0000800) return 2; + if(codepoint < 0x0010000) return 3; + if(codepoint < 0x0200000) return 4; + if(codepoint < 0x4000000) return 5; + return 6; +} + +/* Does NOT NUL-terminate the buffer */ +static int fill_utf8(long codepoint, char *str) +{ + int nbytes = utf8_seqlen(codepoint); + + // This is easier done backwards + int b = nbytes; + while(b > 1) { + b--; + str[b] = 0x80 | (codepoint & 0x3f); + codepoint >>= 6; + } + + switch(nbytes) { + case 1: str[0] = (codepoint & 0x7f); break; + case 2: str[0] = 0xc0 | (codepoint & 0x1f); break; + case 3: str[0] = 0xe0 | (codepoint & 0x0f); break; + case 4: str[0] = 0xf0 | (codepoint & 0x07); break; + case 5: str[0] = 0xf8 | (codepoint & 0x03); break; + case 6: str[0] = 0xfc | (codepoint & 0x01); break; + } + + return nbytes; +} +/* end copy */ diff --git a/third_party/libvterm/src/vterm.c b/third_party/libvterm/src/vterm.c new file mode 100644 index 0000000..e1f676f --- /dev/null +++ b/third_party/libvterm/src/vterm.c @@ -0,0 +1,430 @@ +#include "vterm_internal.h" + +#include +#include +#include +#include + +/***************** + * API functions * + *****************/ + +static void *default_malloc(size_t size, void *allocdata) +{ + void *ptr = malloc(size); + if(ptr) + memset(ptr, 0, size); + return ptr; +} + +static void default_free(void *ptr, void *allocdata) +{ + free(ptr); +} + +static VTermAllocatorFunctions default_allocator = { + .malloc = &default_malloc, + .free = &default_free, +}; + +VTerm *vterm_new(int rows, int cols) +{ + return vterm_build(&(const struct VTermBuilder){ + .rows = rows, + .cols = cols, + }); +} + +VTerm *vterm_new_with_allocator(int rows, int cols, VTermAllocatorFunctions *funcs, void *allocdata) +{ + return vterm_build(&(const struct VTermBuilder){ + .rows = rows, + .cols = cols, + .allocator = funcs, + .allocdata = allocdata, + }); +} + +/* A handy macro for defaulting values out of builder fields */ +#define DEFAULT(v, def) ((v) ? (v) : (def)) + +VTerm *vterm_build(const struct VTermBuilder *builder) +{ + const VTermAllocatorFunctions *allocator = DEFAULT(builder->allocator, &default_allocator); + + /* Need to bootstrap using the allocator function directly */ + VTerm *vt = (*allocator->malloc)(sizeof(VTerm), builder->allocdata); + + vt->allocator = allocator; + vt->allocdata = builder->allocdata; + + vt->rows = builder->rows; + vt->cols = builder->cols; + + vt->parser.state = NORMAL; + + vt->parser.callbacks = NULL; + vt->parser.cbdata = NULL; + + vt->parser.emit_nul = false; + + vt->outfunc = NULL; + vt->outdata = NULL; + + vt->outbuffer_len = DEFAULT(builder->outbuffer_len, 4096); + vt->outbuffer_cur = 0; + vt->outbuffer = vterm_allocator_malloc(vt, vt->outbuffer_len); + + vt->tmpbuffer_len = DEFAULT(builder->tmpbuffer_len, 4096); + vt->tmpbuffer = vterm_allocator_malloc(vt, vt->tmpbuffer_len); + + return vt; +} + +void vterm_free(VTerm *vt) +{ + if(vt->screen) + vterm_screen_free(vt->screen); + + if(vt->state) + vterm_state_free(vt->state); + + vterm_allocator_free(vt, vt->outbuffer); + vterm_allocator_free(vt, vt->tmpbuffer); + + vterm_allocator_free(vt, vt); +} + +INTERNAL void *vterm_allocator_malloc(VTerm *vt, size_t size) +{ + return (*vt->allocator->malloc)(size, vt->allocdata); +} + +INTERNAL void vterm_allocator_free(VTerm *vt, void *ptr) +{ + (*vt->allocator->free)(ptr, vt->allocdata); +} + +void vterm_get_size(const VTerm *vt, int *rowsp, int *colsp) +{ + if(rowsp) + *rowsp = vt->rows; + if(colsp) + *colsp = vt->cols; +} + +void vterm_set_size(VTerm *vt, int rows, int cols) +{ + if(rows < 1 || cols < 1) + return; + + vt->rows = rows; + vt->cols = cols; + + if(vt->parser.callbacks && vt->parser.callbacks->resize) + (*vt->parser.callbacks->resize)(rows, cols, vt->parser.cbdata); +} + +int vterm_get_utf8(const VTerm *vt) +{ + return vt->mode.utf8; +} + +void vterm_set_utf8(VTerm *vt, int is_utf8) +{ + vt->mode.utf8 = is_utf8; +} + +void vterm_output_set_callback(VTerm *vt, VTermOutputCallback *func, void *user) +{ + vt->outfunc = func; + vt->outdata = user; +} + +INTERNAL void vterm_push_output_bytes(VTerm *vt, const char *bytes, size_t len) +{ + if(vt->outfunc) { + (vt->outfunc)(bytes, len, vt->outdata); + return; + } + + if(len > vt->outbuffer_len - vt->outbuffer_cur) + return; + + memcpy(vt->outbuffer + vt->outbuffer_cur, bytes, len); + vt->outbuffer_cur += len; +} + +INTERNAL void vterm_push_output_vsprintf(VTerm *vt, const char *format, va_list args) +{ + size_t len = vsnprintf(vt->tmpbuffer, vt->tmpbuffer_len, + format, args); + + vterm_push_output_bytes(vt, vt->tmpbuffer, len); +} + +INTERNAL void vterm_push_output_sprintf(VTerm *vt, const char *format, ...) +{ + va_list args; + va_start(args, format); + vterm_push_output_vsprintf(vt, format, args); + va_end(args); +} + +INTERNAL void vterm_push_output_sprintf_ctrl(VTerm *vt, unsigned char ctrl, const char *fmt, ...) +{ + size_t cur; + + if(ctrl >= 0x80 && !vt->mode.ctrl8bit) + cur = snprintf(vt->tmpbuffer, vt->tmpbuffer_len, + ESC_S "%c", ctrl - 0x40); + else + cur = snprintf(vt->tmpbuffer, vt->tmpbuffer_len, + "%c", ctrl); + + if(cur >= vt->tmpbuffer_len) + return; + + va_list args; + va_start(args, fmt); + cur += vsnprintf(vt->tmpbuffer + cur, vt->tmpbuffer_len - cur, + fmt, args); + va_end(args); + + if(cur >= vt->tmpbuffer_len) + return; + + vterm_push_output_bytes(vt, vt->tmpbuffer, cur); +} + +INTERNAL void vterm_push_output_sprintf_str(VTerm *vt, unsigned char ctrl, bool term, const char *fmt, ...) +{ + size_t cur = 0; + + if(ctrl) { + if(ctrl >= 0x80 && !vt->mode.ctrl8bit) + cur = snprintf(vt->tmpbuffer, vt->tmpbuffer_len, + ESC_S "%c", ctrl - 0x40); + else + cur = snprintf(vt->tmpbuffer, vt->tmpbuffer_len, + "%c", ctrl); + + if(cur >= vt->tmpbuffer_len) + return; + } + + va_list args; + va_start(args, fmt); + cur += vsnprintf(vt->tmpbuffer + cur, vt->tmpbuffer_len - cur, + fmt, args); + va_end(args); + + if(cur >= vt->tmpbuffer_len) + return; + + if(term) { + cur += snprintf(vt->tmpbuffer + cur, vt->tmpbuffer_len - cur, + vt->mode.ctrl8bit ? "\x9C" : ESC_S "\\"); // ST + + if(cur >= vt->tmpbuffer_len) + return; + } + + vterm_push_output_bytes(vt, vt->tmpbuffer, cur); +} + +size_t vterm_output_get_buffer_size(const VTerm *vt) +{ + return vt->outbuffer_len; +} + +size_t vterm_output_get_buffer_current(const VTerm *vt) +{ + return vt->outbuffer_cur; +} + +size_t vterm_output_get_buffer_remaining(const VTerm *vt) +{ + return vt->outbuffer_len - vt->outbuffer_cur; +} + +size_t vterm_output_read(VTerm *vt, char *buffer, size_t len) +{ + if(len > vt->outbuffer_cur) + len = vt->outbuffer_cur; + + memcpy(buffer, vt->outbuffer, len); + + if(len < vt->outbuffer_cur) + memmove(vt->outbuffer, vt->outbuffer + len, vt->outbuffer_cur - len); + + vt->outbuffer_cur -= len; + + return len; +} + +VTermValueType vterm_get_attr_type(VTermAttr attr) +{ + switch(attr) { + case VTERM_ATTR_BOLD: return VTERM_VALUETYPE_BOOL; + case VTERM_ATTR_UNDERLINE: return VTERM_VALUETYPE_INT; + case VTERM_ATTR_ITALIC: return VTERM_VALUETYPE_BOOL; + case VTERM_ATTR_BLINK: return VTERM_VALUETYPE_BOOL; + case VTERM_ATTR_REVERSE: return VTERM_VALUETYPE_BOOL; + case VTERM_ATTR_CONCEAL: return VTERM_VALUETYPE_BOOL; + case VTERM_ATTR_STRIKE: return VTERM_VALUETYPE_BOOL; + case VTERM_ATTR_FONT: return VTERM_VALUETYPE_INT; + case VTERM_ATTR_FOREGROUND: return VTERM_VALUETYPE_COLOR; + case VTERM_ATTR_BACKGROUND: return VTERM_VALUETYPE_COLOR; + case VTERM_ATTR_SMALL: return VTERM_VALUETYPE_BOOL; + case VTERM_ATTR_BASELINE: return VTERM_VALUETYPE_INT; + + case VTERM_N_ATTRS: return 0; + } + return 0; /* UNREACHABLE */ +} + +VTermValueType vterm_get_prop_type(VTermProp prop) +{ + switch(prop) { + case VTERM_PROP_CURSORVISIBLE: return VTERM_VALUETYPE_BOOL; + case VTERM_PROP_CURSORBLINK: return VTERM_VALUETYPE_BOOL; + case VTERM_PROP_ALTSCREEN: return VTERM_VALUETYPE_BOOL; + case VTERM_PROP_TITLE: return VTERM_VALUETYPE_STRING; + case VTERM_PROP_ICONNAME: return VTERM_VALUETYPE_STRING; + case VTERM_PROP_REVERSE: return VTERM_VALUETYPE_BOOL; + case VTERM_PROP_CURSORSHAPE: return VTERM_VALUETYPE_INT; + case VTERM_PROP_MOUSE: return VTERM_VALUETYPE_INT; + case VTERM_PROP_FOCUSREPORT: return VTERM_VALUETYPE_BOOL; + + case VTERM_N_PROPS: return 0; + } + return 0; /* UNREACHABLE */ +} + +void vterm_scroll_rect(VTermRect rect, + int downward, + int rightward, + int (*moverect)(VTermRect src, VTermRect dest, void *user), + int (*eraserect)(VTermRect rect, int selective, void *user), + void *user) +{ + VTermRect src; + VTermRect dest; + + if(abs(downward) >= rect.end_row - rect.start_row || + abs(rightward) >= rect.end_col - rect.start_col) { + /* Scroll more than area; just erase the lot */ + (*eraserect)(rect, 0, user); + return; + } + + if(rightward >= 0) { + /* rect: [XXX................] + * src: [----------------] + * dest: [----------------] + */ + dest.start_col = rect.start_col; + dest.end_col = rect.end_col - rightward; + src.start_col = rect.start_col + rightward; + src.end_col = rect.end_col; + } + else { + /* rect: [................XXX] + * src: [----------------] + * dest: [----------------] + */ + int leftward = -rightward; + dest.start_col = rect.start_col + leftward; + dest.end_col = rect.end_col; + src.start_col = rect.start_col; + src.end_col = rect.end_col - leftward; + } + + if(downward >= 0) { + dest.start_row = rect.start_row; + dest.end_row = rect.end_row - downward; + src.start_row = rect.start_row + downward; + src.end_row = rect.end_row; + } + else { + int upward = -downward; + dest.start_row = rect.start_row + upward; + dest.end_row = rect.end_row; + src.start_row = rect.start_row; + src.end_row = rect.end_row - upward; + } + + if(moverect) + (*moverect)(dest, src, user); + + if(downward > 0) + rect.start_row = rect.end_row - downward; + else if(downward < 0) + rect.end_row = rect.start_row - downward; + + if(rightward > 0) + rect.start_col = rect.end_col - rightward; + else if(rightward < 0) + rect.end_col = rect.start_col - rightward; + + (*eraserect)(rect, 0, user); +} + +void vterm_copy_cells(VTermRect dest, + VTermRect src, + void (*copycell)(VTermPos dest, VTermPos src, void *user), + void *user) +{ + int downward = src.start_row - dest.start_row; + int rightward = src.start_col - dest.start_col; + + int init_row, test_row, init_col, test_col; + int inc_row, inc_col; + + if(downward < 0) { + init_row = dest.end_row - 1; + test_row = dest.start_row - 1; + inc_row = -1; + } + else /* downward >= 0 */ { + init_row = dest.start_row; + test_row = dest.end_row; + inc_row = +1; + } + + if(rightward < 0) { + init_col = dest.end_col - 1; + test_col = dest.start_col - 1; + inc_col = -1; + } + else /* rightward >= 0 */ { + init_col = dest.start_col; + test_col = dest.end_col; + inc_col = +1; + } + + VTermPos pos; + for(pos.row = init_row; pos.row != test_row; pos.row += inc_row) + for(pos.col = init_col; pos.col != test_col; pos.col += inc_col) { + VTermPos srcpos = { pos.row + downward, pos.col + rightward }; + (*copycell)(pos, srcpos, user); + } +} + +void vterm_check_version(int major, int minor) +{ + if(major != VTERM_VERSION_MAJOR) { + fprintf(stderr, "libvterm major version mismatch; %d (wants) != %d (library)\n", + major, VTERM_VERSION_MAJOR); + exit(1); + } + + if(minor > VTERM_VERSION_MINOR) { + fprintf(stderr, "libvterm minor version mismatch; %d (wants) > %d (library)\n", + minor, VTERM_VERSION_MINOR); + exit(1); + } + + // Happy +} diff --git a/third_party/libvterm/src/vterm_internal.h b/third_party/libvterm/src/vterm_internal.h new file mode 100644 index 0000000..4761063 --- /dev/null +++ b/third_party/libvterm/src/vterm_internal.h @@ -0,0 +1,298 @@ +#ifndef __VTERM_INTERNAL_H__ +#define __VTERM_INTERNAL_H__ + +#include "vterm.h" + +#include + +#if defined(__GNUC__) +# define INTERNAL __attribute__((visibility("internal"))) +#else +# define INTERNAL +#endif + +#ifdef DEBUG +# define DEBUG_LOG(...) fprintf(stderr, __VA_ARGS__) +#else +# define DEBUG_LOG(...) +#endif + +#define ESC_S "\x1b" + +#define INTERMED_MAX 16 + +#define CSI_ARGS_MAX 16 +#define CSI_LEADER_MAX 16 + +#define BUFIDX_PRIMARY 0 +#define BUFIDX_ALTSCREEN 1 + +typedef struct VTermEncoding VTermEncoding; + +typedef struct { + VTermEncoding *enc; + + // This size should be increased if required by other stateful encodings + char data[4*sizeof(uint32_t)]; +} VTermEncodingInstance; + +struct VTermPen +{ + VTermColor fg; + VTermColor bg; + unsigned int bold:1; + unsigned int underline:2; + unsigned int italic:1; + unsigned int blink:1; + unsigned int reverse:1; + unsigned int conceal:1; + unsigned int strike:1; + unsigned int font:4; /* To store 0-9 */ + unsigned int small:1; + unsigned int baseline:2; +}; + +struct VTermState +{ + VTerm *vt; + + const VTermStateCallbacks *callbacks; + void *cbdata; + bool callbacks_has_premove; + + const VTermStateFallbacks *fallbacks; + void *fbdata; + + int rows; + int cols; + + /* Current cursor position */ + VTermPos pos; + + int at_phantom; /* True if we're on the "81st" phantom column to defer a wraparound */ + + int scrollregion_top; + int scrollregion_bottom; /* -1 means unbounded */ +#define SCROLLREGION_BOTTOM(state) ((state)->scrollregion_bottom > -1 ? (state)->scrollregion_bottom : (state)->rows) + int scrollregion_left; +#define SCROLLREGION_LEFT(state) ((state)->mode.leftrightmargin ? (state)->scrollregion_left : 0) + int scrollregion_right; /* -1 means unbounded */ +#define SCROLLREGION_RIGHT(state) ((state)->mode.leftrightmargin && (state)->scrollregion_right > -1 ? (state)->scrollregion_right : (state)->cols) + + /* Bitvector of tab stops */ + unsigned char *tabstops; + + /* Primary and Altscreen; lineinfos[1] is lazily allocated as needed */ + VTermLineInfo *lineinfos[2]; + + /* lineinfo will == lineinfos[0] or lineinfos[1], depending on altscreen */ + VTermLineInfo *lineinfo; +#define ROWWIDTH(state,row) ((state)->lineinfo[(row)].doublewidth ? ((state)->cols / 2) : (state)->cols) +#define THISROWWIDTH(state) ROWWIDTH(state, (state)->pos.row) + + /* Mouse state */ + int mouse_col, mouse_row; + int mouse_buttons; + int mouse_flags; +#define MOUSE_WANT_CLICK 0x01 +#define MOUSE_WANT_DRAG 0x02 +#define MOUSE_WANT_MOVE 0x04 + + enum { MOUSE_X10, MOUSE_UTF8, MOUSE_SGR, MOUSE_RXVT } mouse_protocol; + + /* Last glyph output, for Unicode recombining purposes */ + uint32_t *combine_chars; + size_t combine_chars_size; // Number of ELEMENTS in the above + int combine_width; // The width of the glyph above + VTermPos combine_pos; // Position before movement + + struct { + unsigned int keypad:1; + unsigned int cursor:1; + unsigned int autowrap:1; + unsigned int insert:1; + unsigned int newline:1; + unsigned int cursor_visible:1; + unsigned int cursor_blink:1; + unsigned int cursor_shape:2; + unsigned int alt_screen:1; + unsigned int origin:1; + unsigned int screen:1; + unsigned int leftrightmargin:1; + unsigned int bracketpaste:1; + unsigned int report_focus:1; + } mode; + + VTermEncodingInstance encoding[4], encoding_utf8; + int gl_set, gr_set, gsingle_set; + + struct VTermPen pen; + + VTermColor default_fg; + VTermColor default_bg; + VTermColor colors[16]; // Store the 8 ANSI and the 8 ANSI high-brights only + + int bold_is_highbright; + + unsigned int protected_cell : 1; + + /* Saved state under DEC mode 1048/1049 */ + struct { + VTermPos pos; + struct VTermPen pen; + + struct { + unsigned int cursor_visible:1; + unsigned int cursor_blink:1; + unsigned int cursor_shape:2; + } mode; + } saved; + + /* Temporary state for DECRQSS parsing */ + union { + char decrqss[4]; + struct { + uint16_t mask; + enum { + SELECTION_INITIAL, + SELECTION_SELECTED, + SELECTION_QUERY, + SELECTION_SET_INITIAL, + SELECTION_SET, + SELECTION_INVALID, + } state : 8; + uint32_t recvpartial; + uint32_t sendpartial; + } selection; + } tmp; + + struct { + const VTermSelectionCallbacks *callbacks; + void *user; + char *buffer; + size_t buflen; + } selection; +}; + +struct VTerm +{ + const VTermAllocatorFunctions *allocator; + void *allocdata; + + int rows; + int cols; + + struct { + unsigned int utf8:1; + unsigned int ctrl8bit:1; + } mode; + + struct { + enum VTermParserState { + NORMAL, + CSI_LEADER, + CSI_ARGS, + CSI_INTERMED, + DCS_COMMAND, + /* below here are the "string states" */ + OSC_COMMAND, + OSC, + DCS, + APC, + PM, + SOS, + } state; + + bool in_esc : 1; + + int intermedlen; + char intermed[INTERMED_MAX]; + + union { + struct { + int leaderlen; + char leader[CSI_LEADER_MAX]; + + int argi; + long args[CSI_ARGS_MAX]; + } csi; + struct { + int command; + } osc; + struct { + int commandlen; + char command[CSI_LEADER_MAX]; + } dcs; + } v; + + const VTermParserCallbacks *callbacks; + void *cbdata; + + bool string_initial; + + bool emit_nul; + } parser; + + /* len == malloc()ed size; cur == number of valid bytes */ + + VTermOutputCallback *outfunc; + void *outdata; + + char *outbuffer; + size_t outbuffer_len; + size_t outbuffer_cur; + + char *tmpbuffer; + size_t tmpbuffer_len; + + VTermState *state; + VTermScreen *screen; +}; + +struct VTermEncoding { + void (*init) (VTermEncoding *enc, void *data); + void (*decode)(VTermEncoding *enc, void *data, + uint32_t cp[], int *cpi, int cplen, + const char bytes[], size_t *pos, size_t len); +}; + +typedef enum { + ENC_UTF8, + ENC_SINGLE_94 +} VTermEncodingType; + +void *vterm_allocator_malloc(VTerm *vt, size_t size); +void vterm_allocator_free(VTerm *vt, void *ptr); + +void vterm_push_output_bytes(VTerm *vt, const char *bytes, size_t len); +void vterm_push_output_vsprintf(VTerm *vt, const char *format, va_list args); +void vterm_push_output_sprintf(VTerm *vt, const char *format, ...); +void vterm_push_output_sprintf_ctrl(VTerm *vt, unsigned char ctrl, const char *fmt, ...); +void vterm_push_output_sprintf_str(VTerm *vt, unsigned char ctrl, bool term, const char *fmt, ...); + +void vterm_state_free(VTermState *state); + +void vterm_state_newpen(VTermState *state); +void vterm_state_resetpen(VTermState *state); +void vterm_state_setpen(VTermState *state, const long args[], int argcount); +int vterm_state_getpen(VTermState *state, long args[], int argcount); +void vterm_state_savepen(VTermState *state, int save); + +enum { + C1_SS3 = 0x8f, + C1_DCS = 0x90, + C1_CSI = 0x9b, + C1_ST = 0x9c, + C1_OSC = 0x9d, +}; + +void vterm_state_push_output_sprintf_CSI(VTermState *vts, const char *format, ...); + +void vterm_screen_free(VTermScreen *screen); + +VTermEncoding *vterm_lookup_encoding(VTermEncodingType type, char designation); + +int vterm_unicode_width(uint32_t codepoint); +int vterm_unicode_is_combining(uint32_t codepoint); + +#endif