git-svn-id: svn://db.shs.com.ru/pip@256 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
This commit is contained in:
@@ -45,78 +45,78 @@ PIKbdListener * PIKbdListener::_object = 0;
|
|||||||
|
|
||||||
|
|
||||||
#ifndef WINDOWS
|
#ifndef WINDOWS
|
||||||
struct EscSeq {
|
|
||||||
const char * seq;
|
|
||||||
int key;
|
|
||||||
int mod;
|
|
||||||
// 1 - shift
|
|
||||||
// 2 - alt
|
|
||||||
// 4 - ctrl
|
|
||||||
};
|
|
||||||
// unix
|
// unix
|
||||||
const EscSeq esc_seq[] = {
|
const PIKbdListener::EscSeq PIKbdListener::esc_seq[] = {
|
||||||
{"[1A", PIKbdListener::UpArrow, 0},
|
{"OA", PIKbdListener::UpArrow, 0, 0 , 1 },
|
||||||
{"[A", PIKbdListener::UpArrow, 0},
|
{"OA", PIKbdListener::UpArrow, 4, 0 , 0 },
|
||||||
{"OA", PIKbdListener::UpArrow, 4},
|
{"[1A", PIKbdListener::UpArrow, 0, 0 , 0 },
|
||||||
{"[1B", PIKbdListener::DownArrow, 0},
|
{"[A", PIKbdListener::UpArrow, 0, vt_all , 0 },
|
||||||
{"[B", PIKbdListener::DownArrow, 0},
|
{"OB", PIKbdListener::DownArrow, 0, 0 , 1 },
|
||||||
{"OB", PIKbdListener::DownArrow, 4},
|
{"OB", PIKbdListener::DownArrow, 4, 0 , 0 },
|
||||||
{"[1C", PIKbdListener::RightArrow, 0},
|
{"[1B", PIKbdListener::DownArrow, 0, 0 , 0 },
|
||||||
{"[C", PIKbdListener::RightArrow, 0},
|
{"[B", PIKbdListener::DownArrow, 0, vt_all , 0 },
|
||||||
{"OC", PIKbdListener::RightArrow, 4},
|
{"OC", PIKbdListener::RightArrow, 0, 0 , 1 },
|
||||||
{"[1D", PIKbdListener::LeftArrow, 0},
|
{"OC", PIKbdListener::RightArrow, 4, 0 , 0 },
|
||||||
{"[D", PIKbdListener::LeftArrow, 0},
|
{"[1C", PIKbdListener::RightArrow, 0, 0 , 0 },
|
||||||
{"OD", PIKbdListener::LeftArrow, 0},
|
{"[C", PIKbdListener::RightArrow, 0, vt_all , 0 },
|
||||||
{"[H", PIKbdListener::Home, 0},
|
{"OD", PIKbdListener::LeftArrow, 0, 0 , 1 },
|
||||||
{"[1H", PIKbdListener::Home, 0},
|
{"OD", PIKbdListener::LeftArrow, 4, 0 , 0 },
|
||||||
{"[1~", PIKbdListener::Home, 0},
|
{"[1D", PIKbdListener::LeftArrow, 0, 0 , 0 },
|
||||||
{"[F", PIKbdListener::End, 0},
|
{"[D", PIKbdListener::LeftArrow, 0, vt_all , 0 },
|
||||||
{"[1F", PIKbdListener::End, 0},
|
{"[H", PIKbdListener::Home, 0, vt_xterm , 0 },
|
||||||
{"[4~", PIKbdListener::End, 0},
|
{"[1H", PIKbdListener::Home, 0, 0 , 0 },
|
||||||
{"[2~", PIKbdListener::Insert, 0},
|
{"OH", PIKbdListener::Home, 0, 0 , 1 },
|
||||||
{"[3~", PIKbdListener::Delete, 0},
|
{"[1~", PIKbdListener::Home, 0, vt_linux , 0 },
|
||||||
{"[5~", PIKbdListener::PageUp, 0},
|
{"[F", PIKbdListener::End, 0, vt_xterm , 0 },
|
||||||
{"[6~", PIKbdListener::PageDown, 0},
|
{"[1F", PIKbdListener::End, 0, 0 , 0 },
|
||||||
{"[Z", PIKbdListener::Tab, 1},
|
{"OF", PIKbdListener::End, 0, 0 , 1 },
|
||||||
{"OP", PIKbdListener::F1, 0},
|
{"[4~", PIKbdListener::End, 0, vt_linux , 0 },
|
||||||
{"[[A", PIKbdListener::F1, 0},
|
{"[2~", PIKbdListener::Insert, 0, vt_all , 0 },
|
||||||
{"[11~", PIKbdListener::F1, 0},
|
{"[3~", PIKbdListener::Delete, 0, vt_all , 0 },
|
||||||
{"OQ", PIKbdListener::F2, 0},
|
{"[5~", PIKbdListener::PageUp, 0, vt_all , 0 },
|
||||||
{"[[B", PIKbdListener::F2, 0},
|
{"[6~", PIKbdListener::PageDown, 0, vt_all , 0 },
|
||||||
{"[12~", PIKbdListener::F2, 0},
|
{"[Z", PIKbdListener::Tab, 1, vt_xterm , 0 },
|
||||||
{"OR", PIKbdListener::F3, 0},
|
{"OP", PIKbdListener::F1, 0, vt_xterm , 0 },
|
||||||
{"[[C", PIKbdListener::F3, 0},
|
{"[[A", PIKbdListener::F1, 0, vt_linux , 0 },
|
||||||
{"[13~", PIKbdListener::F3, 0},
|
{"[11~", PIKbdListener::F1, 0, 0 , 0 },
|
||||||
{"[25~", PIKbdListener::F3, 1},
|
{"[25~", PIKbdListener::F1, 1, vt_linux , 0 },
|
||||||
{"OS", PIKbdListener::F4, 0},
|
{"OQ", PIKbdListener::F2, 0, vt_xterm , 0 },
|
||||||
{"[[D", PIKbdListener::F4, 0},
|
{"[[B", PIKbdListener::F2, 0, vt_linux , 0 },
|
||||||
{"[14~", PIKbdListener::F4, 0},
|
{"[12~", PIKbdListener::F2, 0, 0 , 0 },
|
||||||
{"[26~", PIKbdListener::F4, 1},
|
{"[26~", PIKbdListener::F2, 1, vt_linux , 0 },
|
||||||
{"[[E", PIKbdListener::F5, 0},
|
{"OR", PIKbdListener::F3, 0, vt_xterm , 0 },
|
||||||
{"OT", PIKbdListener::F5, 0},
|
{"[[C", PIKbdListener::F3, 0, vt_linux , 0 },
|
||||||
{"[15~", PIKbdListener::F5, 0},
|
{"[13~", PIKbdListener::F3, 0, 0 , 0 },
|
||||||
{"[28~", PIKbdListener::F5, 1},
|
{"[28~", PIKbdListener::F3, 1, vt_linux , 0 },
|
||||||
{"OU", PIKbdListener::F6, 0},
|
{"OS", PIKbdListener::F4, 0, vt_xterm , 0 },
|
||||||
{"[17~", PIKbdListener::F6, 0},
|
{"[[D", PIKbdListener::F4, 0, vt_linux , 0 },
|
||||||
{"[29~", PIKbdListener::F6, 1},
|
{"[14~", PIKbdListener::F4, 0, 0 , 0 },
|
||||||
{"OV", PIKbdListener::F7, 0},
|
{"[29~", PIKbdListener::F4, 1, vt_linux , 0 },
|
||||||
{"[18~", PIKbdListener::F7, 0},
|
{"[[E", PIKbdListener::F5, 0, vt_linux , 0 },
|
||||||
{"[31~", PIKbdListener::F7, 1},
|
{"OT", PIKbdListener::F5, 0, 0 , 0 },
|
||||||
{"OW", PIKbdListener::F8, 0},
|
{"[15~", PIKbdListener::F5, 0, vt_xterm , 0 },
|
||||||
{"[19~", PIKbdListener::F8, 0},
|
{"[31~", PIKbdListener::F5, 1, vt_linux , 0 },
|
||||||
{"[32~", PIKbdListener::F8, 1},
|
{"OU", PIKbdListener::F6, 0, 0 , 0 },
|
||||||
{"OX", PIKbdListener::F9, 0},
|
{"[17~", PIKbdListener::F6, 0, vt_all , 0 },
|
||||||
{"[20~", PIKbdListener::F9, 0},
|
{"[32~", PIKbdListener::F6, 1, vt_linux , 0 },
|
||||||
{"[33~", PIKbdListener::F9, 1},
|
{"OV", PIKbdListener::F7, 0, 0 , 0 },
|
||||||
{"OY", PIKbdListener::F10, 0},
|
{"[18~", PIKbdListener::F7, 0, vt_all , 0 },
|
||||||
{"[21~", PIKbdListener::F10, 0},
|
{"[33~", PIKbdListener::F7, 1, vt_linux , 0 },
|
||||||
{"[34~", PIKbdListener::F10, 1},
|
{"OW", PIKbdListener::F8, 0, 0 , 0 },
|
||||||
{"OZ", PIKbdListener::F11, 0},
|
{"[19~", PIKbdListener::F8, 0, vt_all , 0 },
|
||||||
{"[23~", PIKbdListener::F11, 0},
|
{"[34~", PIKbdListener::F8, 1, vt_linux , 0 },
|
||||||
{"O[", PIKbdListener::F12, 0},
|
{"OX", PIKbdListener::F9, 0, 0 , 0 },
|
||||||
{"[24~", PIKbdListener::F12, 0},
|
{"[20~", PIKbdListener::F9, 0, vt_all , 0 },
|
||||||
|
{"[35~", PIKbdListener::F9, 1, vt_linux , 0 },
|
||||||
|
{"OY", PIKbdListener::F10, 0, 0 , 0 },
|
||||||
|
{"[21~", PIKbdListener::F10, 0, vt_all , 0 },
|
||||||
|
{"[36~", PIKbdListener::F10, 1, vt_linux , 0 },
|
||||||
|
{"OZ", PIKbdListener::F11, 0, 0 , 0 },
|
||||||
|
{"[23~", PIKbdListener::F11, 0, vt_all , 0 },
|
||||||
|
{"O[", PIKbdListener::F12, 0, 0 , 0 },
|
||||||
|
{"[24~", PIKbdListener::F12, 0, vt_all , 0 },
|
||||||
// End
|
// End
|
||||||
{0, 0, 0},
|
{0, 0, 0, 0, 0},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -242,8 +242,8 @@ void PIKbdListener::readKeyboard() {
|
|||||||
#else
|
#else
|
||||||
tcsetattr(0, TCSANOW, &PRIVATE->tterm);
|
tcsetattr(0, TCSANOW, &PRIVATE->tterm);
|
||||||
ret = read(0, rc, 8);
|
ret = read(0, rc, 8);
|
||||||
/*piCout << NewLine << "read" << ret;
|
//piCout << "key" << PIString(rc).replaceAll("\e", "\\e");
|
||||||
for (int i = 0; i < ret; ++i)
|
/*for (int i = 0; i < ret; ++i)
|
||||||
cout << std::hex << int(((uchar * )&rc)[i]) << ' ';
|
cout << std::hex << int(((uchar * )&rc)[i]) << ' ';
|
||||||
cout << endl;
|
cout << endl;
|
||||||
for (int i = 0; i < ret; ++i)
|
for (int i = 0; i < ret; ++i)
|
||||||
@@ -288,6 +288,7 @@ void PIKbdListener::readKeyboard() {
|
|||||||
}
|
}
|
||||||
for (int i = 0; ; ++i) {
|
for (int i = 0; ; ++i) {
|
||||||
if (!esc_seq[i].seq) break;
|
if (!esc_seq[i].seq) break;
|
||||||
|
//piCout << "search" << rc[1] << esc_seq[i].seq;
|
||||||
if (strcmp(esc_seq[i].seq, &(rc[1])) == 0) {
|
if (strcmp(esc_seq[i].seq, &(rc[1])) == 0) {
|
||||||
ke.key = esc_seq[i].key;
|
ke.key = esc_seq[i].key;
|
||||||
mod |= esc_seq[i].mod;
|
mod |= esc_seq[i].mod;
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ class PIP_EXPORT PIKbdListener: public PIThread
|
|||||||
{
|
{
|
||||||
PIOBJECT_SUBCLASS(PIKbdListener, PIThread)
|
PIOBJECT_SUBCLASS(PIKbdListener, PIThread)
|
||||||
friend class PIConsole;
|
friend class PIConsole;
|
||||||
|
friend class PITerminal;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
//! Special keyboard keys
|
//! Special keyboard keys
|
||||||
@@ -152,6 +153,28 @@ private:
|
|||||||
void run() {readKeyboard();}
|
void run() {readKeyboard();}
|
||||||
void end();
|
void end();
|
||||||
|
|
||||||
|
#ifndef WINDOWS
|
||||||
|
struct EscSeq {
|
||||||
|
const char * seq;
|
||||||
|
int key;
|
||||||
|
int mod;
|
||||||
|
int vt;
|
||||||
|
int flags;
|
||||||
|
// 1 - shift
|
||||||
|
// 2 - alt
|
||||||
|
// 4 - ctrl
|
||||||
|
};
|
||||||
|
|
||||||
|
enum VTType {
|
||||||
|
vt_none,
|
||||||
|
vt_xterm = 0x1,
|
||||||
|
vt_linux = 0x2,
|
||||||
|
vt_all = 0xFF
|
||||||
|
};
|
||||||
|
|
||||||
|
static const EscSeq esc_seq[];
|
||||||
|
#endif
|
||||||
|
|
||||||
PRIVATE_DECLARATION
|
PRIVATE_DECLARATION
|
||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
DWORD
|
DWORD
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
# include <wincon.h>
|
# include <wincon.h>
|
||||||
# include <winuser.h>
|
# include <winuser.h>
|
||||||
#else
|
#else
|
||||||
|
# include "piprocess.h"
|
||||||
# include <csignal>
|
# include <csignal>
|
||||||
# include <pty.h>
|
# include <pty.h>
|
||||||
# include <fcntl.h>
|
# include <fcntl.h>
|
||||||
@@ -48,6 +49,9 @@ struct PITerminalAuxData {
|
|||||||
};
|
};
|
||||||
#else
|
#else
|
||||||
# define BUFFER_SIZE 4096
|
# define BUFFER_SIZE 4096
|
||||||
|
enum DECType {
|
||||||
|
CKM = 1
|
||||||
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -62,11 +66,13 @@ PRIVATE_DEFINITION_START(PITerminal)
|
|||||||
PIString shell;
|
PIString shell;
|
||||||
PIByteArray read_buf, tmp_buf;
|
PIByteArray read_buf, tmp_buf;
|
||||||
PIScreenTypes::CellFormat cur_format;
|
PIScreenTypes::CellFormat cur_format;
|
||||||
|
int term_type;
|
||||||
int fd, cur_x, cur_y;
|
int fd, cur_x, cur_y;
|
||||||
int save_cur_x, save_cur_y;
|
int save_cur_x, save_cur_y;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
PIString esc_seq;
|
PIString esc_seq;
|
||||||
bool is_esc_seq, last_read;
|
bool is_esc_seq, last_read;
|
||||||
|
PIMap<int, bool> DEC;
|
||||||
termios desc;
|
termios desc;
|
||||||
#endif
|
#endif
|
||||||
PRIVATE_DEFINITION_END(PITerminal)
|
PRIVATE_DEFINITION_END(PITerminal)
|
||||||
@@ -131,9 +137,9 @@ void PITerminal::write(PIKbdListener::SpecialKey k, PIKbdListener::KeyModifiers
|
|||||||
PIByteArray ba;
|
PIByteArray ba;
|
||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
switch (k) {
|
switch (k) {
|
||||||
case PIKbdListener::Tab: ba << uchar('\t'); break;
|
case PIKbdListener::Tab: ba << uchar('\t'); break;
|
||||||
case PIKbdListener::Return: ba << uchar('\r') << uchar('\n'); break;
|
case PIKbdListener::Return: ba << uchar('\r') << uchar('\n'); break;
|
||||||
case PIKbdListener::Space: ba << uchar(' '); break;
|
case PIKbdListener::Space: ba << uchar(' '); break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
//piCout << "write" << ba.size();
|
//piCout << "write" << ba.size();
|
||||||
@@ -146,35 +152,57 @@ void PITerminal::write(PIKbdListener::SpecialKey k, PIKbdListener::KeyModifiers
|
|||||||
writePipe(PRIVATE->pipe, msg);
|
writePipe(PRIVATE->pipe, msg);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
int term = PRIVATE->term_type;
|
||||||
|
int flags = 0;
|
||||||
switch (k) {
|
switch (k) {
|
||||||
case PIKbdListener::Tab: ba << uchar('\t'); break;
|
case PIKbdListener::Tab: ba << uchar('\t'); break;
|
||||||
case PIKbdListener::Return: ba << uchar('\n'); break;
|
case PIKbdListener::Return: ba << uchar('\n'); break;
|
||||||
case PIKbdListener::Esc: ba << uchar('\e'); break;
|
case PIKbdListener::Esc: ba << uchar('\e'); break;
|
||||||
case PIKbdListener::Space: ba << uchar(' '); break;
|
case PIKbdListener::Space: ba << uchar(' '); break;
|
||||||
case PIKbdListener::Backspace: ba << uchar(0x7f); break;
|
case PIKbdListener::Backspace: ba << uchar(0x7f); break;
|
||||||
case PIKbdListener::UpArrow: ba << uchar('\e') << uchar('[') /*<< uchar('1')*/ << uchar('A'); break;
|
case PIKbdListener::UpArrow:
|
||||||
case PIKbdListener::DownArrow: ba << uchar('\e') << uchar('[') /*<< uchar('1')*/ << uchar('B'); break;
|
case PIKbdListener::DownArrow:
|
||||||
case PIKbdListener::RightArrow: ba << uchar('\e') << uchar('[') /*<< uchar('1')*/ << uchar('C'); break;
|
case PIKbdListener::RightArrow:
|
||||||
case PIKbdListener::LeftArrow: ba << uchar('\e') << uchar('[') /*<< uchar('1')*/ << uchar('D'); break;
|
case PIKbdListener::LeftArrow: if (PRIVATE->DEC.value(CKM, false)) flags = 1;
|
||||||
case PIKbdListener::Home: break;
|
/*case PIKbdListener::Home: //break;
|
||||||
case PIKbdListener::End: break;
|
case PIKbdListener::End: //break;
|
||||||
case PIKbdListener::PageUp: ba << uchar('\e') << uchar('[') << uchar('5') << uchar('~'); break;
|
case PIKbdListener::PageUp: //ba << uchar('\e') << uchar('[') << uchar('5') << uchar('~'); break;
|
||||||
case PIKbdListener::PageDown: ba << uchar('\e') << uchar('[') << uchar('6') << uchar('~'); break;
|
case PIKbdListener::PageDown: //ba << uchar('\e') << uchar('[') << uchar('6') << uchar('~'); break;
|
||||||
case PIKbdListener::Insert: ba << uchar('\e') << uchar('[') << uchar('2') << uchar('~'); break;
|
case PIKbdListener::Insert: //ba << uchar('\e') << uchar('[') << uchar('2') << uchar('~'); break;
|
||||||
case PIKbdListener::Delete: ba << uchar('\e') << uchar('[') << uchar('3') << uchar('~'); break;
|
case PIKbdListener::Delete: //ba << uchar('\e') << uchar('[') << uchar('3') << uchar('~'); break;
|
||||||
case PIKbdListener::F1: break;
|
case PIKbdListener::F1: //break;
|
||||||
case PIKbdListener::F2: break;
|
case PIKbdListener::F2: //break;
|
||||||
case PIKbdListener::F3: break;
|
case PIKbdListener::F3: //break;
|
||||||
case PIKbdListener::F4: break;
|
case PIKbdListener::F4: //break;
|
||||||
case PIKbdListener::F5: break;
|
case PIKbdListener::F5: //break;
|
||||||
case PIKbdListener::F6: break;
|
case PIKbdListener::F6: //break;
|
||||||
case PIKbdListener::F7: break;
|
case PIKbdListener::F7: //break;
|
||||||
case PIKbdListener::F8: break;
|
case PIKbdListener::F8: //break;
|
||||||
case PIKbdListener::F9: break;
|
case PIKbdListener::F9: //break;
|
||||||
case PIKbdListener::F10: break;
|
case PIKbdListener::F10: //break;
|
||||||
case PIKbdListener::F11: break;
|
case PIKbdListener::F11: //break;
|
||||||
case PIKbdListener::F12: break;
|
case PIKbdListener::F12: //break;
|
||||||
default: break;
|
*/
|
||||||
|
default: {
|
||||||
|
//piCout << flags;
|
||||||
|
int mod = 0;
|
||||||
|
if (m[PIKbdListener::Shift]) m |= 1;
|
||||||
|
if (m[PIKbdListener::Alt]) m |= 2;
|
||||||
|
if (m[PIKbdListener::Ctrl]) m |= 4;
|
||||||
|
for (int i = 0; ; ++i) {
|
||||||
|
const PIKbdListener::EscSeq & e(PIKbdListener::esc_seq[i]);
|
||||||
|
if (!e.seq) break;
|
||||||
|
//piCout << "search" << rc[1] << esc_seq[i].seq;
|
||||||
|
if (e.key == k && e.mod == m) {
|
||||||
|
if (((e.vt & term) == term) || (((e.flags & flags) == flags) && (flags != 0))) {
|
||||||
|
//piCout << "found key" << PIString(e.seq).replaceAll("\e", "\\e");
|
||||||
|
PIByteArray d = ("\e" + PIString(e.seq)).toByteArray();
|
||||||
|
write(d);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} break;
|
||||||
}
|
}
|
||||||
//piCout << "write" << ba.size();
|
//piCout << "write" << ba.size();
|
||||||
if (!ba.isEmpty()) write(ba);
|
if (!ba.isEmpty()) write(ba);
|
||||||
@@ -188,7 +216,11 @@ void PITerminal::write(PIKbdListener::KeyEvent ke) {
|
|||||||
if (isSpecialKey(ke.key)) write((PIKbdListener::SpecialKey)ke.key, ke.modifiers);
|
if (isSpecialKey(ke.key)) write((PIKbdListener::SpecialKey)ke.key, ke.modifiers);
|
||||||
else {
|
else {
|
||||||
PIByteArray ba;
|
PIByteArray ba;
|
||||||
|
#ifdef WINDOWS
|
||||||
ba << uchar(PIChar(ke.key).toConcole1Byte());
|
ba << uchar(PIChar(ke.key).toConcole1Byte());
|
||||||
|
#else
|
||||||
|
ba = PIString(PIChar(ke.key)).toUTF8();
|
||||||
|
#endif
|
||||||
write(ba);
|
write(ba);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -196,7 +228,6 @@ void PITerminal::write(PIKbdListener::KeyEvent ke) {
|
|||||||
|
|
||||||
PIVector<PIVector<PIScreenTypes::Cell> > PITerminal::content() {
|
PIVector<PIVector<PIScreenTypes::Cell> > PITerminal::content() {
|
||||||
readConsole();
|
readConsole();
|
||||||
getCursor(cursor_x, cursor_y);
|
|
||||||
PIVector<PIVector<PIScreenTypes::Cell> > ret = cells;
|
PIVector<PIVector<PIScreenTypes::Cell> > ret = cells;
|
||||||
if (cursor_blink && cursor_visible)
|
if (cursor_blink && cursor_visible)
|
||||||
if (cursor_x >= 0 && cursor_x < size_x)
|
if (cursor_x >= 0 && cursor_x < size_x)
|
||||||
@@ -253,6 +284,7 @@ void PITerminal::initPrivate() {
|
|||||||
PRIVATE->fd = PRIVATE->cur_x = PRIVATE->cur_y = 0;
|
PRIVATE->fd = PRIVATE->cur_x = PRIVATE->cur_y = 0;
|
||||||
PRIVATE->save_cur_x = PRIVATE->save_cur_y = 0;
|
PRIVATE->save_cur_x = PRIVATE->save_cur_y = 0;
|
||||||
PRIVATE->pid = 0;
|
PRIVATE->pid = 0;
|
||||||
|
PRIVATE->term_type = 0;
|
||||||
PRIVATE->is_esc_seq = false;
|
PRIVATE->is_esc_seq = false;
|
||||||
PRIVATE->last_read = true;
|
PRIVATE->last_read = true;
|
||||||
PRIVATE->esc_seq.clear();
|
PRIVATE->esc_seq.clear();
|
||||||
@@ -311,12 +343,10 @@ uchar PITerminal::invertColor(uchar c) {
|
|||||||
|
|
||||||
|
|
||||||
void PITerminal::run() {
|
void PITerminal::run() {
|
||||||
|
getCursor(cursor_x, cursor_y);
|
||||||
if (cursor_tm.elapsed_m() >= 500) {
|
if (cursor_tm.elapsed_m() >= 500) {
|
||||||
cursor_tm.reset();
|
cursor_tm.reset();
|
||||||
cursor_blink = !cursor_blink;
|
cursor_blink = !cursor_blink;
|
||||||
if (cursor_blink) {
|
|
||||||
getCursor(cursor_x, cursor_y);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#ifndef WINDOWS
|
#ifndef WINDOWS
|
||||||
if (PRIVATE->fd == 0) return;
|
if (PRIVATE->fd == 0) return;
|
||||||
@@ -326,7 +356,7 @@ void PITerminal::run() {
|
|||||||
if (readed > 0) {
|
if (readed > 0) {
|
||||||
PRIVATE->last_read = true;
|
PRIVATE->last_read = true;
|
||||||
//piCoutObj << "readed" << readed << PIString(PRIVATE->tmp_buf.resized(readed)).replaceAll("\e", "\\e");
|
//piCoutObj << "readed" << readed << PIString(PRIVATE->tmp_buf.resized(readed)).replaceAll("\e", "\\e");
|
||||||
piCoutObj << "readed" << readed << (PRIVATE->tmp_buf.resized(readed));
|
//piCoutObj << "readed" << readed << (PRIVATE->tmp_buf.resized(readed));
|
||||||
PRIVATE->read_buf.append(PRIVATE->tmp_buf.resized(readed));
|
PRIVATE->read_buf.append(PRIVATE->tmp_buf.resized(readed));
|
||||||
for (;;) {
|
for (;;) {
|
||||||
int ind = -1;
|
int ind = -1;
|
||||||
@@ -340,7 +370,11 @@ void PITerminal::run() {
|
|||||||
parseInput(PIString((const char *)PRIVATE->read_buf.data(), ind));
|
parseInput(PIString((const char *)PRIVATE->read_buf.data(), ind));
|
||||||
PRIVATE->read_buf.remove(0, ind);
|
PRIVATE->read_buf.remove(0, ind);
|
||||||
}
|
}
|
||||||
if (PRIVATE->read_buf.size_s() >= BUFFER_SIZE) {
|
bool parse = PRIVATE->read_buf.size_s() >= BUFFER_SIZE;
|
||||||
|
if (PRIVATE->read_buf.size_s() == 1)
|
||||||
|
if (PRIVATE->read_buf[0] < 0x80)
|
||||||
|
parse = true;
|
||||||
|
if (parse) {
|
||||||
parseInput(PIString(PRIVATE->read_buf));
|
parseInput(PIString(PRIVATE->read_buf));
|
||||||
PRIVATE->read_buf.clear();
|
PRIVATE->read_buf.clear();
|
||||||
}
|
}
|
||||||
@@ -414,12 +448,19 @@ bool PITerminal::isCompleteEscSeq(const PIString & es) {
|
|||||||
|
|
||||||
|
|
||||||
void PITerminal::applyEscSeq(PIString es) {
|
void PITerminal::applyEscSeq(PIString es) {
|
||||||
piCoutObj << es;
|
//piCoutObj << es;
|
||||||
if (es.size_s() < 2) return;
|
if (es.size_s() < 2) return;
|
||||||
if (es[1] == '?' && es.size_s() >= 2) { // cursor
|
if (es[1] == '?' && es.size_s() >= 2) {
|
||||||
PIString c = es.mid(2);
|
char a = es.takeRight(1)[0].toAscii();
|
||||||
if (c == "25l") cursor_visible = false;
|
bool val = false;
|
||||||
if (c == "25h") cursor_visible = true;
|
if (a == 'l') val = false;
|
||||||
|
if (a == 'h') val = true;
|
||||||
|
int dec = es.mid(2).toInt();
|
||||||
|
//piCoutObj << "DEC" << dec << val;
|
||||||
|
switch (dec) {
|
||||||
|
case 25: cursor_visible = val; break;
|
||||||
|
default: PRIVATE->DEC[dec] = val; break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
PIScreenTypes::Cell def_cell = PIScreenTypes::Cell(' ', PRIVATE->cur_format);
|
PIScreenTypes::Cell def_cell = PIScreenTypes::Cell(' ', PRIVATE->cur_format);
|
||||||
if (es[0] == '[') { // CSI
|
if (es[0] == '[') { // CSI
|
||||||
@@ -590,6 +631,13 @@ void PITerminal::moveCursor(int dx, int dy) {
|
|||||||
cells[y].fill(PIScreenTypes::Cell());
|
cells[y].fill(PIScreenTypes::Cell());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int PITerminal::termType(const PIString & t) {
|
||||||
|
if (t == "xterm") return PIKbdListener::vt_xterm;
|
||||||
|
else if (t == "linux") return PIKbdListener::vt_linux;
|
||||||
|
return PIKbdListener::vt_none;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -665,6 +713,13 @@ bool PITerminal::initialize() {
|
|||||||
winsize ws;
|
winsize ws;
|
||||||
ws.ws_col = dsize_x;
|
ws.ws_col = dsize_x;
|
||||||
ws.ws_row = dsize_y;
|
ws.ws_row = dsize_y;
|
||||||
|
PIStringList env = PIProcess::currentEnvironment();
|
||||||
|
piForeachC (PIString & e, env)
|
||||||
|
if (e.startsWith("TERM=")) {
|
||||||
|
PRIVATE->term_type = termType(e.mid(5).trim().toLowerCase());
|
||||||
|
//piCout << PRIVATE->term_type;
|
||||||
|
piBreak;
|
||||||
|
}
|
||||||
pid_t fr = forkpty(&(PRIVATE->fd), pty, 0, &ws);
|
pid_t fr = forkpty(&(PRIVATE->fd), pty, 0, &ws);
|
||||||
//piCoutObj << fr << PRIVATE->fd << pty;
|
//piCoutObj << fr << PRIVATE->fd << pty;
|
||||||
if (fr == 0) {
|
if (fr == 0) {
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ private:
|
|||||||
bool isCompleteEscSeq(const PIString & es);
|
bool isCompleteEscSeq(const PIString & es);
|
||||||
void applyEscSeq(PIString es);
|
void applyEscSeq(PIString es);
|
||||||
void moveCursor(int dx, int dy);
|
void moveCursor(int dx, int dy);
|
||||||
|
int termType(const PIString & t);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
PRIVATE_DECLARATION
|
PRIVATE_DECLARATION
|
||||||
|
|||||||
Reference in New Issue
Block a user