Create process, poll and send output to console buffer
This commit is contained in:
@@ -213,7 +213,7 @@ For(arr.reverse_iter()) {
|
|||||||
bool remove_item = false; \
|
bool remove_item = false; \
|
||||||
defer { \
|
defer { \
|
||||||
if (remove_item) { \
|
if (remove_item) { \
|
||||||
(a).ordered_remove(it); \
|
Remove(&(a), it); \
|
||||||
i -= 1; \
|
i -= 1; \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ struct Process {
|
|||||||
char platform[6 * 8];
|
char platform[6 * 8];
|
||||||
};
|
};
|
||||||
|
|
||||||
Process RunCmd(String command_line, String working_dir);
|
Process CreateCommandLineProcess(String command_line, String working_dir);
|
||||||
bool WaitForExit(Process *process);
|
bool WaitForExit(Process *process);
|
||||||
bool PollExitCode(Process *process);
|
bool PollExitCode(Process *process);
|
||||||
void KillProcess(Process *process);
|
void KillProcess(Process *process);
|
||||||
|
|||||||
@@ -318,7 +318,7 @@ static void Win32ProcessError(Process *process, String cmd) {
|
|||||||
Win32CloseProcess(process);
|
Win32CloseProcess(process);
|
||||||
}
|
}
|
||||||
|
|
||||||
Process RunCmd(String command_line, String working_dir) {
|
Process CreateCommandLineProcess(String command_line, String working_dir) {
|
||||||
Process process = {};
|
Process process = {};
|
||||||
Win32Process *p = (Win32Process *)process.platform;
|
Win32Process *p = (Win32Process *)process.platform;
|
||||||
|
|
||||||
|
|||||||
@@ -465,11 +465,13 @@ void AppendToConsole(String16 string) {
|
|||||||
View *view = FindView(buffer->id);
|
View *view = FindView(buffer->id);
|
||||||
Assert(view);
|
Assert(view);
|
||||||
|
|
||||||
Array<Caret> caret_copy = Copy(GetSystemAllocator(), view->carets);
|
// @todo: this prevents scrolling to end. what do we do with this? I want to adjust the
|
||||||
defer {
|
// cursor etc.
|
||||||
Dealloc(&view->carets);
|
// Array<Caret> caret_copy = Copy(GetSystemAllocator(), view->carets);
|
||||||
view->carets = caret_copy;
|
// defer {
|
||||||
};
|
// Dealloc(&view->carets);
|
||||||
|
// view->carets = caret_copy;
|
||||||
|
// };
|
||||||
|
|
||||||
bool scroll_to_end = false;
|
bool scroll_to_end = false;
|
||||||
if (view) {
|
if (view) {
|
||||||
|
|||||||
@@ -887,6 +887,8 @@ void WindowCommand(Event event, Window *window, View *view) {
|
|||||||
if (GetSize(caret.range) == 0) range = EncloseExecWord(buffer, GetFront(caret));
|
if (GetSize(caret.range) == 0) range = EncloseExecWord(buffer, GetFront(caret));
|
||||||
String16 string = GetString(*buffer, range);
|
String16 string = GetString(*buffer, range);
|
||||||
Command_EvalLua(view, string);
|
Command_EvalLua(view, string);
|
||||||
|
|
||||||
|
// Exec(string, GetCurrentBufferDir());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Ctrl(SDLK_W)) {
|
if (Ctrl(SDLK_W)) {
|
||||||
|
|||||||
27
src/text_editor/process.cpp
Normal file
27
src/text_editor/process.cpp
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
Array<Process> ActiveProcesses = {};
|
||||||
|
|
||||||
|
void Exec(String cmd, String working_dir) {
|
||||||
|
Process process = CreateCommandLineProcess(cmd, working_dir);
|
||||||
|
if (process.is_valid) Add(&ActiveProcesses, process);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Exec(String16 cmd16, String working_dir) {
|
||||||
|
Scratch scratch;
|
||||||
|
String cmd = ToString(scratch, cmd16);
|
||||||
|
Exec(cmd, working_dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Process_OnUpdate() {
|
||||||
|
Scratch scratch;
|
||||||
|
int64_t buffer_size = 4096;
|
||||||
|
char *buffer = AllocArray(scratch, char, buffer_size);
|
||||||
|
IterRemove(ActiveProcesses) {
|
||||||
|
IterRemovePrepare(ActiveProcesses);
|
||||||
|
StdoutPollInfo info = PollStdout(&it, buffer, buffer_size);
|
||||||
|
String string = {buffer, info.size_read};
|
||||||
|
if (string.len) AppendToConsole(string);
|
||||||
|
|
||||||
|
bool exited = PollExitCode(&it);
|
||||||
|
if (exited) remove_item = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -33,6 +33,7 @@ int FullScreenPositionX, FullScreenPositionY;
|
|||||||
|
|
||||||
#include "management.cpp"
|
#include "management.cpp"
|
||||||
#include "window.cpp"
|
#include "window.cpp"
|
||||||
|
#include "process.cpp"
|
||||||
#include "commands.cpp"
|
#include "commands.cpp"
|
||||||
#include "commands_clipboard.cpp"
|
#include "commands_clipboard.cpp"
|
||||||
#include "commands_window.cpp"
|
#include "commands_window.cpp"
|
||||||
@@ -164,6 +165,7 @@ void Update(Event event) {
|
|||||||
|
|
||||||
HandleEvent(event);
|
HandleEvent(event);
|
||||||
|
|
||||||
|
Process_OnUpdate();
|
||||||
ReloadLuaConfig();
|
ReloadLuaConfig();
|
||||||
ReplaceDebugData();
|
ReplaceDebugData();
|
||||||
|
|
||||||
@@ -237,7 +239,7 @@ int main()
|
|||||||
SDL_free(sdl_config_path.data);
|
SDL_free(sdl_config_path.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Process process = RunCmd("git log", WorkingDir);
|
// Process process = CreateCommandLineProcess("git log", WorkingDir);
|
||||||
// Scratch scratch;
|
// Scratch scratch;
|
||||||
// char *buffer = AllocArray(scratch, char, 4096);
|
// char *buffer = AllocArray(scratch, char, 4096);
|
||||||
// for (int i = 0; i < 4; i += 1) {
|
// for (int i = 0; i < 4; i += 1) {
|
||||||
@@ -313,7 +315,7 @@ int main()
|
|||||||
}
|
}
|
||||||
|
|
||||||
WaitForEvents = true;
|
WaitForEvents = true;
|
||||||
if (DocumentSelected || ScrollbarSelected) {
|
if (DocumentSelected || ScrollbarSelected || ActiveProcesses.len) {
|
||||||
WaitForEvents = false;
|
WaitForEvents = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -125,5 +125,6 @@ void Command_SelectEntireBuffer(View *view);
|
|||||||
void Command_Replace(View *view, String16 string);
|
void Command_Replace(View *view, String16 string);
|
||||||
void Command_SelectRangeOneCursor(View *view, Range range);
|
void Command_SelectRangeOneCursor(View *view, Range range);
|
||||||
|
|
||||||
|
void AppendToConsole(String string);
|
||||||
void ReportErrorf(const char *fmt, ...);
|
void ReportErrorf(const char *fmt, ...);
|
||||||
void ReportWarningf(const char *fmt, ...);
|
void ReportWarningf(const char *fmt, ...);
|
||||||
Reference in New Issue
Block a user