git-svn-id: svn://db.shs.com.ru/pip@529 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
This commit is contained in:
@@ -117,6 +117,11 @@ const PIKbdListener::EscSeq PIKbdListener::esc_seq[] = {
|
|||||||
// End
|
// End
|
||||||
{0, 0, 0, 0, 0},
|
{0, 0, 0, 0, 0},
|
||||||
};
|
};
|
||||||
|
void setupTerminal(bool on) {
|
||||||
|
printf("\e[?1000"); printf(on ? "h" : "l");
|
||||||
|
printf("\e[?1002"); printf(on ? "h" : "l");
|
||||||
|
fflush(0);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -172,6 +177,7 @@ void PIKbdListener::begin() {
|
|||||||
term.c_lflag |= NOFLSH | IEXTEN;
|
term.c_lflag |= NOFLSH | IEXTEN;
|
||||||
PRIVATE->tterm = term;
|
PRIVATE->tterm = term;
|
||||||
tcsetattr(0, TCSANOW, &term);
|
tcsetattr(0, TCSANOW, &term);
|
||||||
|
setupTerminal(true);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -310,10 +316,10 @@ void PIKbdListener::readKeyboard() {
|
|||||||
#else
|
#else
|
||||||
tcsetattr(0, TCSANOW, &PRIVATE->tterm);
|
tcsetattr(0, TCSANOW, &PRIVATE->tterm);
|
||||||
PRIVATE->ret = read(0, rc, 8);
|
PRIVATE->ret = read(0, rc, 8);
|
||||||
//piCout << "key" << PIString(rc).replaceAll("\e", "\\e");
|
/*piCout << "key" << PIString(rc).replaceAll("\e", "\\e");
|
||||||
/*for (int i = 0; i < PRIVATE->ret; ++i)
|
for (int i = 0; i < PRIVATE->ret; ++i)
|
||||||
cout << std::hex << int(((uchar * )&rc)[i]) << ' ';
|
PICout(0) << PICoutManipulators::Hex << int(((uchar * )&rc)[i]) << ' ';
|
||||||
cout << endl;
|
PICout(0) << "\n";
|
||||||
for (int i = 0; i < PRIVATE->ret; ++i)
|
for (int i = 0; i < PRIVATE->ret; ++i)
|
||||||
cout << "'" << (char)(rc[i]) << "' ";
|
cout << "'" << (char)(rc[i]) << "' ";
|
||||||
cout << endl;*/
|
cout << endl;*/
|
||||||
@@ -337,14 +343,45 @@ void PIKbdListener::readKeyboard() {
|
|||||||
PRIVATE->ret--;
|
PRIVATE->ret--;
|
||||||
}
|
}
|
||||||
if (rc[1] == '[') {
|
if (rc[1] == '[') {
|
||||||
for (int i = 2; i < 7; ++i) // search for modifier
|
if (rc[2] == 'M') { // mouse
|
||||||
if (rc[i] == ';') {
|
if (PRIVATE->ret >= 5) {
|
||||||
mod |= rc[i + 1] - '0' - 1;
|
me.x = uchar(rc[4] - '!');
|
||||||
for (int j = i; j < 6; ++j) rc[j] = rc[j + 2];
|
me.y = uchar(rc[5] - '!');
|
||||||
rc[6] = rc[7] = 0;
|
int b = rc[3] & 0x7, a = rc[3] & 0x60;
|
||||||
PRIVATE->ret -= 2;
|
if (a == 0x60) {
|
||||||
break;
|
memcpy(&we, &me, sizeof(me));
|
||||||
|
we.action = MouseWheel;
|
||||||
|
we.direction = (b == 0);
|
||||||
|
piCout << "wheel" << we.direction;
|
||||||
|
wheelEvent(we, kbddata_);
|
||||||
|
} else {
|
||||||
|
switch (b) {
|
||||||
|
case 0: me.buttons = MouseLeft; break;
|
||||||
|
case 1: me.buttons = MouseMiddle; break;
|
||||||
|
case 2: me.buttons = MouseRight; break;
|
||||||
|
}
|
||||||
|
if (a == 0x20) {
|
||||||
|
if (b == 3) me.action = MouseButtonRelease;
|
||||||
|
else me.action = MouseButtonPress;
|
||||||
|
}
|
||||||
|
if (a == 0x40) me.action = MouseMove;
|
||||||
|
PIString _s[] = {"press", "release", "move"};
|
||||||
|
piCoutObj << _s[me.action] << me.buttons << ":" << me.x << me.y;
|
||||||
|
mouseEvent(me, kbddata_);
|
||||||
|
}
|
||||||
|
//piCout << me.x << me.y << PICoutManipulators::Hex << b << a;
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
for (int i = 2; i < 7; ++i) // search for modifier
|
||||||
|
if (rc[i] == ';') {
|
||||||
|
mod |= rc[i + 1] - '0' - 1;
|
||||||
|
for (int j = i; j < 6; ++j) rc[j] = rc[j + 2];
|
||||||
|
rc[6] = rc[7] = 0;
|
||||||
|
PRIVATE->ret -= 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (PRIVATE->ret >= 3 && rc[1] == 'O') { // search for modifier (F1-F4)
|
if (PRIVATE->ret >= 3 && rc[1] == 'O') { // search for modifier (F1-F4)
|
||||||
if (rc[2] >= '1' && rc[2] <= '8') {
|
if (rc[2] >= '1' && rc[2] <= '8') {
|
||||||
@@ -397,6 +434,7 @@ void PIKbdListener::end() {
|
|||||||
SetConsoleMode(PRIVATE->hIn, PRIVATE->smode);
|
SetConsoleMode(PRIVATE->hIn, PRIVATE->smode);
|
||||||
#else
|
#else
|
||||||
tcsetattr(0, TCSANOW, &PRIVATE->sterm);
|
tcsetattr(0, TCSANOW, &PRIVATE->sterm);
|
||||||
|
setupTerminal(false);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -408,12 +446,14 @@ void PIKbdListener::setActive(bool yes) {
|
|||||||
SetConsoleMode(PRIVATE->hIn, PRIVATE->tmode);
|
SetConsoleMode(PRIVATE->hIn, PRIVATE->tmode);
|
||||||
#else
|
#else
|
||||||
tcsetattr(0, TCSANOW, &PRIVATE->tterm);
|
tcsetattr(0, TCSANOW, &PRIVATE->tterm);
|
||||||
|
setupTerminal(true);
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
SetConsoleMode(PRIVATE->hIn, PRIVATE->smode);
|
SetConsoleMode(PRIVATE->hIn, PRIVATE->smode);
|
||||||
#else
|
#else
|
||||||
tcsetattr(0, TCSANOW, &PRIVATE->sterm);
|
tcsetattr(0, TCSANOW, &PRIVATE->sterm);
|
||||||
|
setupTerminal(false);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user