#include <string.h>
#include <stdio.h>
#include <FL/Fl.H>
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Native_File_Chooser.H>
#ifdef _WIN32
#define popen _popen
#define pclose _pclose
#endif
//
// Simple terminal simulator (PROOF OF CONCEPT)
// 1.00 erco 07/30/2009 -- initial implementation
// 1.10 erco 09/06/2009 -- use Fl::event_text() to handle non-ascii codes
//
char filename[FL_PATH_MAX] = "";
class MyTerminal : public Fl_Text_Editor {
Fl_Text_Buffer *buff;
char cmd[1024];
public:
MyTerminal(int X,int Y,int W,int H,const char* L=0) :
Fl_Text_Editor(X,Y,W,H,L) {
buff = new Fl_Text_Buffer();
buffer(buff);
textfont(FL_HELVETICA_BOLD);
textsize(15);
cmd[0] = 0;
}
// Append to buffer, keep cursor at end
void append(const char*s) {
buff->append(s);
// Go to end of line
insert_position(buffer()->length());
scroll(count_lines(0, buffer()->length(), 1), 0);
}
// Run the specified command in the shell, append output to terminal
void RunCommand(const char *command) {
append("\n");
fprintf(stderr, "Run: '%s'\n", command);
FILE *fp = popen(command, "r");
if ( fp == 0 ) {
append("Fail '");
append(command);
append("'\n");
} else {
char s[1024];
while ( fgets(s, sizeof(s)-1, fp) ) {
append(s);
}
pclose(fp);
}
}
// Handle events in the Fl_Text_Editor
int handle(int e) {
switch (e) {
case FL_KEYUP: {
int key = Fl::event_key();
if ( key == FL_Enter ) return(1); // hide Enter
from editor
if ( key == FL_BackSpace && cmd[0] == 0 ) return(0);
break;
}
case FL_KEYDOWN: {
int key = Fl::event_key();
// Enter key? Execute the command, clear command buffer
if ( key == FL_Enter ) {
// Execute your commands here
strcat(cmd, " 2>&1&"); // stderr + stdout
RunCommand(cmd);
cmd[0] = 0;
append("\n");
return(1); // hide 'Enter' from
text widget
}
if ( key == FL_BackSpace ) {
// Remove a character from end of command buffer
if ( cmd[0] ) {
cmd[strlen(cmd)-1] = 0;
break;
} else {
return(0);
}
} else {
// Append text to our 'command' buffer
strncat(cmd, Fl::event_text(), sizeof(cmd)-1);
cmd[sizeof(cmd)-1] = 0;
}
break;
}
}
return(Fl_Text_Editor::handle(e));
}
};
int main() {
Fl_Double_Window win(700,800,"");
MyTerminal edit(0,0,win.w()-350,win.h()-0);
edit.append("");
Fl_Text_Buffer *buff = new Fl_Text_Buffer();
Fl_Text_Editor *ledit = new Fl_Text_Editor(350,0,win.w()-0,win.h()-0);
ledit->buffer(buff); // attach the text buffer to our editor
widget
win.resizable(win);
win.show();
return(Fl::run());
}
_______________________________________________
fltk-dev mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk-dev