Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 35e957b326 | |||
| e7eb35626c | |||
| f9128a336d |
9
.idea/workspace.xml
generated
9
.idea/workspace.xml
generated
@@ -34,8 +34,9 @@
|
|||||||
</component>
|
</component>
|
||||||
<component name="ChangeListManager">
|
<component name="ChangeListManager">
|
||||||
<list default="true" id="e1fe3ab0-3650-4fca-8664-a247d5dfa457" name="Changes" comment="Actually add the screenshot.">
|
<list default="true" id="e1fe3ab0-3650-4fca-8664-a247d5dfa457" name="Changes" comment="Actually add the screenshot.">
|
||||||
<change beforePath="$PROJECT_DIR$/.github/workflows/release.yml" beforeDir="false" afterPath="$PROJECT_DIR$/.github/workflows/release.yml" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/CMakeLists.txt" beforeDir="false" afterPath="$PROJECT_DIR$/CMakeLists.txt" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/GUIRenderer.cc" beforeDir="false" afterPath="$PROJECT_DIR$/GUIRenderer.cc" afterDir="false" />
|
||||||
</list>
|
</list>
|
||||||
<option name="SHOW_DIALOG" value="false" />
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
@@ -128,9 +129,9 @@
|
|||||||
</key>
|
</key>
|
||||||
</component>
|
</component>
|
||||||
<component name="RunManager" selected="CMake Application.kge">
|
<component name="RunManager" selected="CMake Application.kge">
|
||||||
<configuration default="true" type="CLionExternalRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true">
|
<configuration default="true" type="CMakeRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true">
|
||||||
<method v="2">
|
<method v="2">
|
||||||
<option name="CLION.EXTERNAL.BUILD" enabled="true" />
|
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
</configuration>
|
</configuration>
|
||||||
<configuration name="imgui" type="CMakeRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="kte" TARGET_NAME="imgui" CONFIG_NAME="Debug">
|
<configuration name="imgui" type="CMakeRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="kte" TARGET_NAME="imgui" CONFIG_NAME="Debug">
|
||||||
@@ -169,7 +170,7 @@
|
|||||||
<workItem from="1764539556448" duration="156000" />
|
<workItem from="1764539556448" duration="156000" />
|
||||||
<workItem from="1764539725338" duration="1075000" />
|
<workItem from="1764539725338" duration="1075000" />
|
||||||
<workItem from="1764542392763" duration="3512000" />
|
<workItem from="1764542392763" duration="3512000" />
|
||||||
<workItem from="1764548345516" duration="9962000" />
|
<workItem from="1764548345516" duration="12773000" />
|
||||||
</task>
|
</task>
|
||||||
<task id="LOCAL-00001" summary="Add undo/redo infrastructure and buffer management additions.">
|
<task id="LOCAL-00001" summary="Add undo/redo infrastructure and buffer management additions.">
|
||||||
<option name="closed" value="true" />
|
<option name="closed" value="true" />
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ project(kte)
|
|||||||
include(GNUInstallDirs)
|
include(GNUInstallDirs)
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
set(KTE_VERSION "1.0.2")
|
set(KTE_VERSION "1.0.4")
|
||||||
|
|
||||||
# Default to terminal-only build to avoid SDL/OpenGL dependency by default.
|
# Default to terminal-only build to avoid SDL/OpenGL dependency by default.
|
||||||
# Enable with -DBUILD_GUI=ON when SDL2/OpenGL/Freetype are available.
|
# Enable with -DBUILD_GUI=ON when SDL2/OpenGL/Freetype are available.
|
||||||
@@ -201,5 +201,5 @@ if (${BUILD_GUI})
|
|||||||
endif ()
|
endif ()
|
||||||
# Install kge man page only when GUI is built
|
# Install kge man page only when GUI is built
|
||||||
install(FILES docs/kge.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
|
install(FILES docs/kge.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
|
||||||
install(FILES kge.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons)
|
install(FILES kge.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons)
|
||||||
endif ()
|
endif ()
|
||||||
|
|||||||
219
GUIRenderer.cc
219
GUIRenderer.cc
@@ -1,5 +1,7 @@
|
|||||||
|
#include <algorithm>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#include <string>
|
#include <string>
|
||||||
@@ -149,14 +151,14 @@ GUIRenderer::Draw(Editor &ed)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Handle mouse click before rendering to avoid dependent on drawn items
|
// Handle mouse click before rendering to avoid dependent on drawn items
|
||||||
if (ImGui::IsWindowHovered() && ImGui::IsMouseClicked(ImGuiMouseButton_Left)) {
|
if (ImGui::IsWindowHovered() && ImGui::IsMouseClicked(ImGuiMouseButton_Left)) {
|
||||||
ImVec2 mp = ImGui::GetIO().MousePos;
|
ImVec2 mp = ImGui::GetIO().MousePos;
|
||||||
// Compute viewport-relative row so (0) is top row of the visible area
|
// Compute viewport-relative row so (0) is top row of the visible area
|
||||||
float vy_f = (mp.y - list_origin.y - scroll_y) / row_h;
|
float vy_f = (mp.y - list_origin.y - scroll_y) / row_h;
|
||||||
long vy = static_cast<long>(vy_f);
|
long vy = static_cast<long>(vy_f);
|
||||||
if (vy < 0)
|
if (vy < 0)
|
||||||
vy = 0;
|
vy = 0;
|
||||||
|
|
||||||
// Clamp vy within visible content height to avoid huge jumps
|
// Clamp vy within visible content height to avoid huge jumps
|
||||||
ImVec2 cr_min = ImGui::GetWindowContentRegionMin();
|
ImVec2 cr_min = ImGui::GetWindowContentRegionMin();
|
||||||
@@ -168,70 +170,75 @@ GUIRenderer::Draw(Editor &ed)
|
|||||||
if (vy >= vis_rows)
|
if (vy >= vis_rows)
|
||||||
vy = vis_rows - 1;
|
vy = vis_rows - 1;
|
||||||
|
|
||||||
// Translate viewport row to buffer row using Buffer::Rowoffs
|
// Translate viewport row to buffer row using Buffer::Rowoffs
|
||||||
std::size_t by = buf->Rowoffs() + static_cast<std::size_t>(vy);
|
std::size_t by = buf->Rowoffs() + static_cast<std::size_t>(vy);
|
||||||
if (by >= lines.size()) {
|
if (by >= lines.size()) {
|
||||||
if (!lines.empty())
|
if (!lines.empty())
|
||||||
by = lines.size() - 1;
|
by = lines.size() - 1;
|
||||||
else
|
else
|
||||||
by = 0;
|
by = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compute desired pixel X inside the viewport content (subtract horizontal scroll)
|
// Compute desired pixel X inside the viewport content (subtract horizontal scroll)
|
||||||
float px = (mp.x - list_origin.x - scroll_x);
|
float px = (mp.x - list_origin.x - scroll_x);
|
||||||
if (px < 0.0f)
|
if (px < 0.0f)
|
||||||
px = 0.0f;
|
px = 0.0f;
|
||||||
|
|
||||||
// Convert pixel X to a render-column target including horizontal col offset
|
// Empty buffer guard: if there are no lines yet, just move to 0:0
|
||||||
// Use our own tab expansion of width 8 to match command layer logic.
|
if (lines.empty()) {
|
||||||
const std::string &line_clicked = lines[by];
|
Execute(ed, CommandId::MoveCursorTo, std::string("0:0"));
|
||||||
const std::size_t tabw = 8;
|
} else {
|
||||||
// We iterate source columns computing absolute rendered column (rx_abs) from 0,
|
// Convert pixel X to a render-column target including horizontal col offset
|
||||||
// then translate to viewport-space by subtracting Coloffs.
|
// Use our own tab expansion of width 8 to match command layer logic.
|
||||||
std::size_t coloffs = buf->Coloffs();
|
const std::string &line_clicked = lines[by];
|
||||||
std::size_t rx_abs = 0; // absolute rendered column
|
const std::size_t tabw = 8;
|
||||||
std::size_t i = 0; // source column iterator
|
// We iterate source columns computing absolute rendered column (rx_abs) from 0,
|
||||||
|
// then translate to viewport-space by subtracting Coloffs.
|
||||||
|
std::size_t coloffs = buf->Coloffs();
|
||||||
|
std::size_t rx_abs = 0; // absolute rendered column
|
||||||
|
std::size_t i = 0; // source column iterator
|
||||||
|
|
||||||
// Fast-forward i until rx_abs >= coloffs to align with leftmost visible column
|
// Fast-forward i until rx_abs >= coloffs to align with leftmost visible column
|
||||||
if (!line_clicked.empty() && coloffs > 0) {
|
if (!line_clicked.empty() && coloffs > 0) {
|
||||||
while (i < line_clicked.size() && rx_abs < coloffs) {
|
while (i < line_clicked.size() && rx_abs < coloffs) {
|
||||||
if (line_clicked[i] == '\t') {
|
if (line_clicked[i] == '\t') {
|
||||||
rx_abs += (tabw - (rx_abs % tabw));
|
rx_abs += (tabw - (rx_abs % tabw));
|
||||||
} else {
|
} else {
|
||||||
rx_abs += 1;
|
rx_abs += 1;
|
||||||
}
|
}
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now search for closest source column to clicked px within/after viewport
|
// Now search for closest source column to clicked px within/after viewport
|
||||||
std::size_t best_col = i; // default to first visible column
|
std::size_t best_col = i; // default to first visible column
|
||||||
float best_dist = std::numeric_limits<float>::infinity();
|
float best_dist = std::numeric_limits<float>::infinity();
|
||||||
while (true) {
|
while (true) {
|
||||||
// For i in [current..size], evaluate candidate including the implicit end position
|
// For i in [current..size], evaluate candidate including the implicit end position
|
||||||
std::size_t rx_view = (rx_abs >= coloffs) ? (rx_abs - coloffs) : 0;
|
std::size_t rx_view = (rx_abs >= coloffs) ? (rx_abs - coloffs) : 0;
|
||||||
float rx_px = static_cast<float>(rx_view) * space_w;
|
float rx_px = static_cast<float>(rx_view) * space_w;
|
||||||
float dist = std::fabs(px - rx_px);
|
float dist = std::fabs(px - rx_px);
|
||||||
if (dist <= best_dist) {
|
if (dist <= best_dist) {
|
||||||
best_dist = dist;
|
best_dist = dist;
|
||||||
best_col = i;
|
best_col = i;
|
||||||
}
|
}
|
||||||
if (i == line_clicked.size())
|
if (i == line_clicked.size())
|
||||||
break;
|
break;
|
||||||
// advance to next source column
|
// advance to next source column
|
||||||
if (line_clicked[i] == '\t') {
|
if (line_clicked[i] == '\t') {
|
||||||
rx_abs += (tabw - (rx_abs % tabw));
|
rx_abs += (tabw - (rx_abs % tabw));
|
||||||
} else {
|
} else {
|
||||||
rx_abs += 1;
|
rx_abs += 1;
|
||||||
}
|
}
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dispatch absolute buffer coordinates (row:col)
|
// Dispatch absolute buffer coordinates (row:col)
|
||||||
char tmp[64];
|
char tmp[64];
|
||||||
std::snprintf(tmp, sizeof(tmp), "%zu:%zu", by, best_col);
|
std::snprintf(tmp, sizeof(tmp), "%zu:%zu", by, best_col);
|
||||||
Execute(ed, CommandId::MoveCursorTo, std::string(tmp));
|
Execute(ed, CommandId::MoveCursorTo, std::string(tmp));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// Cache current horizontal offset in rendered columns
|
// Cache current horizontal offset in rendered columns
|
||||||
const std::size_t coloffs_now = buf->Coloffs();
|
const std::size_t coloffs_now = buf->Coloffs();
|
||||||
for (std::size_t i = rowoffs; i < lines.size(); ++i) {
|
for (std::size_t i = rowoffs; i < lines.size(); ++i) {
|
||||||
@@ -280,28 +287,59 @@ GUIRenderer::Draw(Editor &ed)
|
|||||||
}
|
}
|
||||||
ImGui::EndChild();
|
ImGui::EndChild();
|
||||||
|
|
||||||
// Status bar spanning full width
|
// Status bar spanning full width
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
|
|
||||||
// Build three segments: left (app/version/buffer/dirty), middle (message), right (cursor/mark)
|
// Compute full content width and draw a filled background rectangle
|
||||||
// Compute full content width and draw a filled background rectangle
|
ImVec2 win_pos = ImGui::GetWindowPos();
|
||||||
ImVec2 win_pos = ImGui::GetWindowPos();
|
ImVec2 cr_min = ImGui::GetWindowContentRegionMin();
|
||||||
ImVec2 cr_min = ImGui::GetWindowContentRegionMin();
|
ImVec2 cr_max = ImGui::GetWindowContentRegionMax();
|
||||||
ImVec2 cr_max = ImGui::GetWindowContentRegionMax();
|
float x0 = win_pos.x + cr_min.x;
|
||||||
float x0 = win_pos.x + cr_min.x;
|
float x1 = win_pos.x + cr_max.x;
|
||||||
float x1 = win_pos.x + cr_max.x;
|
ImVec2 cursor = ImGui::GetCursorScreenPos();
|
||||||
ImVec2 cursor = ImGui::GetCursorScreenPos();
|
float bar_h = ImGui::GetFrameHeight();
|
||||||
float bar_h = ImGui::GetFrameHeight();
|
ImVec2 p0(x0, cursor.y);
|
||||||
ImVec2 p0(x0, cursor.y);
|
ImVec2 p1(x1, cursor.y + bar_h);
|
||||||
ImVec2 p1(x1, cursor.y + bar_h);
|
ImU32 bg_col = ImGui::GetColorU32(ImGuiCol_HeaderActive);
|
||||||
ImU32 bg_col = ImGui::GetColorU32(ImGuiCol_HeaderActive);
|
ImGui::GetWindowDrawList()->AddRectFilled(p0, p1, bg_col);
|
||||||
ImGui::GetWindowDrawList()->AddRectFilled(p0, p1, bg_col);
|
// If a prompt is active, replace the entire status bar with the prompt text
|
||||||
// Build left text
|
if (ed.PromptActive()) {
|
||||||
std::string left;
|
std::string msg = ed.PromptLabel();
|
||||||
left.reserve(256);
|
if (!msg.empty()) msg += ": ";
|
||||||
left += "kge"; // GUI app name
|
std::string ptext = ed.PromptText();
|
||||||
left += " ";
|
auto kind = ed.CurrentPromptKind();
|
||||||
left += KTE_VERSION_STR;
|
if (kind == Editor::PromptKind::OpenFile || kind == Editor::PromptKind::SaveAs ||
|
||||||
|
kind == Editor::PromptKind::Chdir) {
|
||||||
|
const char *home_c = std::getenv("HOME");
|
||||||
|
if (home_c && *home_c) {
|
||||||
|
std::string home(home_c);
|
||||||
|
if (ptext.rfind(home, 0) == 0) {
|
||||||
|
std::string rest = ptext.substr(home.size());
|
||||||
|
if (rest.empty())
|
||||||
|
ptext = "~";
|
||||||
|
else if (!rest.empty() && (rest[0] == '/' || rest[0] == '\\'))
|
||||||
|
ptext = std::string("~") + rest;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
msg += ptext;
|
||||||
|
|
||||||
|
float pad = 6.f;
|
||||||
|
ImVec2 msg_sz = ImGui::CalcTextSize(msg.c_str());
|
||||||
|
float left_x = p0.x + pad;
|
||||||
|
ImGui::PushClipRect(ImVec2(p0.x, p0.y), ImVec2(p1.x, p1.y), true);
|
||||||
|
ImGui::SetCursorScreenPos(ImVec2(left_x, p0.y + (bar_h - msg_sz.y) * 0.5f));
|
||||||
|
ImGui::TextUnformatted(msg.c_str());
|
||||||
|
ImGui::PopClipRect();
|
||||||
|
// Advance cursor to after the bar to keep layout consistent
|
||||||
|
ImGui::Dummy(ImVec2(x1 - x0, bar_h));
|
||||||
|
} else {
|
||||||
|
// Build left text
|
||||||
|
std::string left;
|
||||||
|
left.reserve(256);
|
||||||
|
left += "kge"; // GUI app name
|
||||||
|
left += " ";
|
||||||
|
left += KTE_VERSION_STR;
|
||||||
std::string fname;
|
std::string fname;
|
||||||
try {
|
try {
|
||||||
fname = ed.DisplayNameFor(*buf);
|
fname = ed.DisplayNameFor(*buf);
|
||||||
@@ -400,8 +438,9 @@ GUIRenderer::Draw(Editor &ed)
|
|||||||
ImGui::PopClipRect();
|
ImGui::PopClipRect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Advance cursor to after the bar to keep layout consistent
|
// Advance cursor to after the bar to keep layout consistent
|
||||||
ImGui::Dummy(ImVec2(x1 - x0, bar_h));
|
ImGui::Dummy(ImVec2(x1 - x0, bar_h));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
|
#include <cstdlib>
|
||||||
#include <ncurses.h>
|
#include <ncurses.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
@@ -149,13 +150,50 @@ TerminalRenderer::Draw(Editor &ed)
|
|||||||
mvaddstr(0, 0, "[no buffer]");
|
mvaddstr(0, 0, "[no buffer]");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Status line (inverse) — left: app/version/buffer/dirty, middle: message, right: cursor/mark
|
// Status line (inverse)
|
||||||
move(rows - 1, 0);
|
move(rows - 1, 0);
|
||||||
attron(A_REVERSE);
|
attron(A_REVERSE);
|
||||||
|
|
||||||
// Fill the status line with spaces first
|
// Fill the status line with spaces first
|
||||||
for (int i = 0; i < cols; ++i)
|
for (int i = 0; i < cols; ++i)
|
||||||
addch(' ');
|
addch(' ');
|
||||||
|
|
||||||
|
// If a prompt is active, replace the status bar with the full prompt text
|
||||||
|
if (ed.PromptActive()) {
|
||||||
|
// Build prompt text: "Label: text" and shorten HOME path for file-related prompts
|
||||||
|
std::string msg = ed.PromptLabel();
|
||||||
|
if (!msg.empty())
|
||||||
|
msg += ": ";
|
||||||
|
std::string ptext = ed.PromptText();
|
||||||
|
auto kind = ed.CurrentPromptKind();
|
||||||
|
if (kind == Editor::PromptKind::OpenFile || kind == Editor::PromptKind::SaveAs ||
|
||||||
|
kind == Editor::PromptKind::Chdir) {
|
||||||
|
const char *home_c = std::getenv("HOME");
|
||||||
|
if (home_c && *home_c) {
|
||||||
|
std::string home(home_c);
|
||||||
|
// Ensure we match only at the start
|
||||||
|
if (ptext.rfind(home, 0) == 0) {
|
||||||
|
std::string rest = ptext.substr(home.size());
|
||||||
|
if (rest.empty())
|
||||||
|
ptext = "~";
|
||||||
|
else if (rest[0] == '/' || rest[0] == '\\')
|
||||||
|
ptext = std::string("~") + rest;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
msg += ptext;
|
||||||
|
|
||||||
|
// Draw left-aligned, clipped to width
|
||||||
|
if (!msg.empty())
|
||||||
|
mvaddnstr(rows - 1, 0, msg.c_str(), std::max(0, cols));
|
||||||
|
|
||||||
|
// End status rendering for prompt mode
|
||||||
|
attroff(A_REVERSE);
|
||||||
|
// Restore logical cursor position in content area
|
||||||
|
if (saved_cur_y >= 0 && saved_cur_x >= 0)
|
||||||
|
move(saved_cur_y, saved_cur_x);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Build left segment
|
// Build left segment
|
||||||
std::string left;
|
std::string left;
|
||||||
@@ -243,10 +281,10 @@ TerminalRenderer::Draw(Editor &ed)
|
|||||||
if (llen > 0)
|
if (llen > 0)
|
||||||
mvaddnstr(rows - 1, 0, left.c_str(), llen);
|
mvaddnstr(rows - 1, 0, left.c_str(), llen);
|
||||||
|
|
||||||
// Draw right, flush to end
|
// Draw right, flush to end
|
||||||
int rstart = std::max(0, cols - rlen);
|
int rstart = std::max(0, cols - rlen);
|
||||||
if (rlen > 0)
|
if (rlen > 0)
|
||||||
mvaddnstr(rows - 1, rstart, right.c_str(), rlen);
|
mvaddnstr(rows - 1, rstart, right.c_str(), rlen);
|
||||||
|
|
||||||
// Middle message
|
// Middle message
|
||||||
const std::string &msg = ed.Status();
|
const std::string &msg = ed.Status();
|
||||||
@@ -262,7 +300,7 @@ TerminalRenderer::Draw(Editor &ed)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
attroff(A_REVERSE);
|
attroff(A_REVERSE);
|
||||||
|
|
||||||
// Restore terminal cursor to the content position so a visible caret
|
// Restore terminal cursor to the content position so a visible caret
|
||||||
// remains in the editing area (not on the status line).
|
// remains in the editing area (not on the status line).
|
||||||
|
|||||||
@@ -45,6 +45,8 @@ stdenv.mkDerivation {
|
|||||||
installManPage ../docs/kte.1
|
installManPage ../docs/kte.1
|
||||||
installManPage ../docs/kge.1
|
installManPage ../docs/kge.1
|
||||||
|
|
||||||
|
mkdir -p $out/share/icons
|
||||||
|
cp ../kge.png $out/share/icons/
|
||||||
|
|
||||||
runHook postInstall
|
runHook postInstall
|
||||||
'';
|
'';
|
||||||
|
|||||||
@@ -45,6 +45,9 @@ stdenv.mkDerivation {
|
|||||||
installManPage ../docs/kte.1
|
installManPage ../docs/kte.1
|
||||||
installManPage ../docs/kge.1
|
installManPage ../docs/kge.1
|
||||||
|
|
||||||
|
mkdir -p $out/share/icons
|
||||||
|
cp ../kge.png $out/share/icons/
|
||||||
|
|
||||||
runHook postInstall
|
runHook postInstall
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
|
|||||||
10
flake.lock
generated
10
flake.lock
generated
@@ -2,15 +2,15 @@
|
|||||||
"nodes": {
|
"nodes": {
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1764242076,
|
"lastModified": 1764517877,
|
||||||
"narHash": "sha256-sKoIWfnijJ0+9e4wRvIgm/HgE27bzwQxcEmo2J/gNpI=",
|
"narHash": "sha256-pp3uT4hHijIC8JUK5MEqeAWmParJrgBVzHLNfJDZxg4=",
|
||||||
"owner": "nixos",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "2fad6eac6077f03fe109c4d4eb171cf96791faa4",
|
"rev": "2d293cbfa5a793b4c50d17c05ef9e385b90edf6c",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "nixos",
|
"owner": "NixOS",
|
||||||
"ref": "nixos-unstable",
|
"ref": "nixos-unstable",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
|
|||||||
29
flake.nix
29
flake.nix
@@ -1,21 +1,18 @@
|
|||||||
{
|
{
|
||||||
description = "Kyle's Text Editor";
|
description = "kyle's text editor";
|
||||||
|
|
||||||
inputs = {
|
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||||
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
|
|
||||||
};
|
|
||||||
|
|
||||||
outputs =
|
outputs = inputs @ { self, nixpkgs, ... }:
|
||||||
{ self, nixpkgs }:
|
|
||||||
let
|
let
|
||||||
pkgs = import nixpkgs { system = "x86_64-linux"; };
|
eachSystem = nixpkgs.lib.genAttrs nixpkgs.lib.systems.flakeExposed;
|
||||||
in
|
pkgsFor = system: import nixpkgs { inherit system; };
|
||||||
{
|
in {
|
||||||
packages.x86_64-linux = {
|
packages = eachSystem (system: {
|
||||||
default = pkgs.callPackage ./default-nogui.nix { };
|
default = (pkgsFor system).callPackage ./default-nogui.nix { };
|
||||||
kge = pkgs.callPackage ./default-gui.nix { };
|
kge = (pkgsFor system).callPackage ./default-gui.nix { };
|
||||||
kte = pkgs.callPackage ./default-nogui.nix { };
|
kte = (pkgsFor system).callPackage ./default-nogui.nix { };
|
||||||
full = pkgs.callPackage ./default.nix { };
|
full = (pkgsFor system).callPackage ./default.nix { };
|
||||||
};
|
});
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user