📄 qtewin.cpp
字号:
}
}
/******************************************************************************/
void QMyDialog::RemoveClicked()
{
int i, j, c;
QMyConnectionItem * Item1;
QMyConnectionItem * Item2;
i = ListBox->currentItem();
if (i >= 0)
{
c = ListBox->count();
for (j = i; j < c - 1; j++)
{
Item1 = ConnectionList[i];
Item2 = ConnectionList[i + 1];
Item1->ServerName = Item2->ServerName;
Item1->UserName = Item2->UserName;
Item1->Width = Item2->Width;
Item1->Height = Item2->Height;
Item1->ServerIP = Item2->ServerIP;
Item1->FullScreen = Item2->FullScreen;
}
ListBox->removeItem(i);
}
}
/******************************************************************************/
void QMyDialog::ListBoxChanged()
{
int i;
QMyConnectionItem * Item;
char Text[100];
i = ListBox->currentItem();
if (i >= 0 && i < 10)
{
Item = ConnectionList[i];
ServerNameEdit->setText(Item->ServerName);
UserNameEdit->setText(Item->UserName);
sprintf(Text, "%d", Item->Width);
WidthEdit->setText(Text);
sprintf(Text, "%d", Item->Height);
HeightEdit->setText(Text);
IPEdit->setText(Item->ServerIP);
FullScreenCheckBox->setChecked(Item->FullScreen != 0);
}
}
/******************************************************************************/
void QMyDialog::ListBoxSelected(int /*index*/)
{
}
/******************************************************************************/
void GetScanCode(QKeyEvent * e, int * ScanCode, int * code)
{
int key;
int mod;
int ascii;
key = e->key();
mod = e->state();
ascii = e->ascii();
*ScanCode = 0;
*code = mod; // 8 shift, 16 control, 32 alt
switch (key)
{
case 4096: // esc
case 4097: // tab
case 4099: // backspace
case 4100: // enter
case 4101: // enter
case 4103: // delete
ascii = 0;
}
if (ascii == 0)
{
switch (key)
{
case 4096: *ScanCode = 0x01; break; // esc
case 4097: *ScanCode = 0x0f; break; // tab
case 4099: *ScanCode = 0x0e; break; // backspace
case 4100: *ScanCode = 0x1c; break; // enter
case 4101: *ScanCode = 0x1c; break; // enter
case 4112: *ScanCode = 0xc7; break; // home
case 4113: *ScanCode = 0xcf; break; // end
case 4102: *ScanCode = 0xd2; break; // insert
case 4103: *ScanCode = 0xd3; break; // delete
case 4118: *ScanCode = 0xc9; break; // page up
case 4119: *ScanCode = 0xd1; break; // page down
case 4117: *ScanCode = 0xd0; break; // down arrow
case 4115: *ScanCode = 0xc8; break; // up arrow
case 4114: *ScanCode = 0xcb; break; // left arrow
case 4116: *ScanCode = 0xcd; break; // right arrow
case 4128: *ScanCode = 0x2a; break; // shift
case 4131: *ScanCode = 0x38; break; // alt
case 4129: *ScanCode = 0x1d; break; // ctrl
}
if (*ScanCode != 0)
return;
}
switch (ascii)
{
// first row
case 'q': *ScanCode = 0x10; break;
case 'Q': *ScanCode = 0x10; *code |= 8; break;
case '1': *ScanCode = 0x02; break;
case 'w': *ScanCode = 0x11; break;
case 'W': *ScanCode = 0x11; *code |= 8; break;
case '2': *ScanCode = 0x03; break;
case 'e': *ScanCode = 0x12; break;
case 'E': *ScanCode = 0x12; *code |= 8; break;
case '3': *ScanCode = 0x04; break;
case 'r': *ScanCode = 0x13; break;
case 'R': *ScanCode = 0x13; *code |= 8; break;
case '4': *ScanCode = 0x05; break;
case 't': *ScanCode = 0x14; break;
case 'T': *ScanCode = 0x14; *code |= 8; break;
case '5': *ScanCode = 0x06; break;
case 'y': *ScanCode = 0x15; break;
case 'Y': *ScanCode = 0x15; *code |= 8; break;
case '6': *ScanCode = 0x07; break;
case 'u': *ScanCode = 0x16; break;
case 'U': *ScanCode = 0x16; *code |= 8; break;
case '7': *ScanCode = 0x08; break;
case 'i': *ScanCode = 0x17; break;
case 'I': *ScanCode = 0x17; *code |= 8; break;
case '8': *ScanCode = 0x09; break;
case 'o': *ScanCode = 0x18; break;
case 'O': *ScanCode = 0x18; *code |= 8; break;
case '9': *ScanCode = 0x0a; break;
case 'p': *ScanCode = 0x19; break;
case 'P': *ScanCode = 0x19; *code |= 8; break;
case '0': *ScanCode = 0x0b; break;
// second row
case 'a': *ScanCode = 0x1e; break;
case 'A': *ScanCode = 0x1e; *code |= 8; break;
case '!': *ScanCode = 0x02; *code |= 8; break;
case 's': *ScanCode = 0x1f; break;
case 'S': *ScanCode = 0x1f; *code |= 8; break;
case '@': *ScanCode = 0x03; *code |= 8; break;
case 'd': *ScanCode = 0x20; break;
case 'D': *ScanCode = 0x20; *code |= 8; break;
case '#': *ScanCode = 0x04; *code |= 8; break;
case 'f': *ScanCode = 0x21; break;
case 'F': *ScanCode = 0x21; *code |= 8; break;
case '$': *ScanCode = 0x05; *code |= 8; break;
case 'g': *ScanCode = 0x22; break;
case 'G': *ScanCode = 0x22; *code |= 8; break;
case '%': *ScanCode = 0x06; *code |= 8; break;
case 'h': *ScanCode = 0x23; break;
case 'H': *ScanCode = 0x23; *code |= 8; break;
case '_': *ScanCode = 0x0c; *code |= 8; break;
case 'j': *ScanCode = 0x24; break;
case 'J': *ScanCode = 0x24; *code |= 8; break;
case '&': *ScanCode = 0x08; *code |= 8; break;
case 'k': *ScanCode = 0x25; break;
case 'K': *ScanCode = 0x25; *code |= 8; break;
case '*': *ScanCode = 0x09; *code |= 8; break;
case 'l': *ScanCode = 0x26; break;
case 'L': *ScanCode = 0x26; *code |= 8; break;
case '(': *ScanCode = 0x0a; *code |= 8; break;
// case 8: *ScanCode = 0x0e; break; // backspace
// third row
case 'z': *ScanCode = 0x2c; break;
case 'Z': *ScanCode = 0x2c; *code |= 8; break;
case 'x': *ScanCode = 0x2d; break;
case 'X': *ScanCode = 0x2d; *code |= 8; break;
case 'c': *ScanCode = 0x2e; break;
case 'C': *ScanCode = 0x2e; *code |= 8; break;
case 'v': *ScanCode = 0x2f; break;
case 'V': *ScanCode = 0x2f; *code |= 8; break;
case 'b': *ScanCode = 0x30; break;
case 'B': *ScanCode = 0x30; *code |= 8; break;
case '-': *ScanCode = 0x0c; break;
case 'n': *ScanCode = 0x31; break;
case 'N': *ScanCode = 0x31; *code |= 8; break;
case '+': *ScanCode = 0x0d; *code |= 8; break;
case 'm': *ScanCode = 0x32; break;
case 'M': *ScanCode = 0x32; *code |= 8; break;
case '=': *ScanCode = 0x0d; break;
case ',': *ScanCode = 0x33; break;
case ';': *ScanCode = 0x27; break;
case ')': *ScanCode = 0x0b; *code |= 8; break;
// fourth row
// case 9: *ScanCode = 0x0f; break; // tab
case '/': *ScanCode = 0x35; break;
case '?': *ScanCode = 0x35; *code |= 8; break;
case ' ': *ScanCode = 0x39; break;
case '\'': *ScanCode = 0x28; break;
case '"': *ScanCode = 0x28; *code |= 8; break;
case '~': *ScanCode = 0x29; *code |= 8; break;
case '.': *ScanCode = 0x34; break;
case ':': *ScanCode = 0x27; *code |= 8; break;
case '<': *ScanCode = 0x33; *code |= 8; break;
// case 13: *ScanCode = 0x1c; break; // enter
case '>': *ScanCode = 0x34; *code |= 8; break;
// others
// case 27: *ScanCode = 0x01; break; // esc
case '`': *ScanCode = 0x29; break;
case '^': *ScanCode = 0x07; *code |= 8; break;
case '[': *ScanCode = 0x1a; break;
case '{': *ScanCode = 0x1a; *code |= 8; break;
case ']': *ScanCode = 0x1b; break;
case '}': *ScanCode = 0x1b; *code |= 8; break;
case '\\': *ScanCode = 0x2b; break;
case '|': *ScanCode = 0x2b; *code |= 8; break;
// ctrl keys
case 1: *ScanCode = 0x1e; *code |= 16; break; // a
case 2: *ScanCode = 0x30; *code |= 16; break; // b
}
if (*ScanCode == 0 && key < 3000)
printf("unknown key %d mod %d ascii %d\n", key, mod, ascii);
}
/******************************************************************************/
QMyScrollView::QMyScrollView() : QScrollView()
{
}
/******************************************************************************/
QMyScrollView::~QMyScrollView()
{
}
/******************************************************************************/
void QMyScrollView::keyPressEvent(QKeyEvent* e)
{
int ScanCode, code;
GetScanCode(e, &ScanCode, &code);
if (ScanCode != 0)
{
if (code & 8) // send shift
rdp_send_input(0, RDP_INPUT_SCANCODE, RDP_KEYPRESS, 0x2a, 0);
if (code & 16) // send control
rdp_send_input(0, RDP_INPUT_SCANCODE, RDP_KEYPRESS, 0x1d, 0);
if (code & 32) // send alt
rdp_send_input(0, RDP_INPUT_SCANCODE, RDP_KEYPRESS, 0x38, 0);
rdp_send_input(0, RDP_INPUT_SCANCODE, RDP_KEYPRESS, ScanCode, 0);
e->accept();
}
}
/******************************************************************************/
void QMyScrollView::keyReleaseEvent(QKeyEvent* e)
{
int ScanCode, code;
GetScanCode(e, &ScanCode, &code);
if (ScanCode != 0)
{
rdp_send_input(0, RDP_INPUT_SCANCODE, RDP_KEYRELEASE, ScanCode, 0);
if (code & 8) // send shift
rdp_send_input(0, RDP_INPUT_SCANCODE, RDP_KEYRELEASE, 0x2a, 0);
if (code & 16) // send control
rdp_send_input(0, RDP_INPUT_SCANCODE, RDP_KEYRELEASE, 0x1d, 0);
if (code & 32) // send alt
rdp_send_input(0, RDP_INPUT_SCANCODE, RDP_KEYRELEASE, 0x38, 0);
e->accept();
}
}
/******************************************************************************/
void QMyScrollView::showEvent(QShowEvent* e)
{
QScrollView::showEvent(e);
}
/******************************************************************************/
void QMyScrollView::show()
{
QScrollView::show();
}
/******************************************************************************/
void QMyScrollView::polish()
{
QScrollView::polish();
}
/******************************************************************************/
void QMyScrollView::timerEvent(QTimerEvent * e)
{
QMyDialog * d;
QWidget * Desktop;
int dw;
int dh;
QScrollView::timerEvent(e);
killTimer(timer_id);
d = new QMyDialog(this);
if (d->exec() == 1) // ok clicked
{
g_width = d->Width;
g_height = d->Height;
g_client_width = g_width;
g_client_height = g_height;
g_fullscreen = d->FullScreen;
sprintf(g_server, "%s", (const char*)d->ServerIP);
sprintf(g_username, "%s", (const char*)d->UserName);
#ifdef WITH_RDPSND
// init sound
if (g_rdpsnd)
{
rdpsnd_init();
}
#endif
if (!rdp_connect(g_server, g_flags, g_domain, g_password, g_shell,
g_directory))
{
delete d;
g_SV->close();
return;
}
g_BS = (uint8*)xmalloc(g_width * g_height * 4);
memset(g_BS, 0, g_width * g_height * 4);
g_clipx = 0;
g_clipy = 0;
g_clipcx = g_width;
g_clipcy = g_height;
g_CM = (QColorMap*)xmalloc(sizeof(struct QColorMap));
memset(g_CM, 0, sizeof(struct QColorMap));
g_CM->NumColors = 256;
g_MW = new QMyMainWindow();
g_MW->resize(g_client_width, g_client_height);
g_MW->show();
g_SV->addChild(g_MW);
g_MW->setMouseTracking(true);
g_MW->setCursor((int)10); /* Qt::BlankCursor */
g_SocketNotifier = new QSocketNotifier(g_global_sock,
QSocketNotifier::Read,
g_MW);
g_MW->connect(g_SocketNotifier, SIGNAL(activated(int)), g_MW,
SLOT(dataReceived()));
if (g_fullscreen)
{
Desktop = g_App->desktop();
dw = Desktop->width();
dh = Desktop->height();
if (dw == g_client_width && dh == g_client_height)
{
g_MW->resize(g_client_width - 4, g_client_height - 4);
}
g_SV->showFullScreen();
}
delete d;
}
else // cancel clicked
{
delete d;
g_SV->close();
}
}
/******************************************************************************/
QMyMainWindow::QMyMainWindow() : QWidget(g_SV->viewport())
{
PopupMenu = new QPopupMenu(this);
PopupMenu->insertItem("Right click", 1, 0);
PopupMenu->insertItem("Toggle fullscreen", 2, 1);
PopupMenu->insertItem("Reset keyboard", 3, 2);
PopupMenu->insertItem("Double click", 4, 3);
connect(PopupMenu, SIGNAL(activated(int)), this, SLOT(MemuClicked(int)));
}
/******************************************************************************/
QMyMainWindow::~QMyMainWindow()
{
delete PopupMenu;
}
/******************************************************************************/
int rd(double in)
{
return (int)(in + 0.50);
}
/******************************************************************************/
int c2sx(int cx)
{
double sx;
sx = (double)g_client_width / (double)g_width;
return rd(cx / sx);
}
/******************************************************************************/
int c2sy(int cy)
{
double sy;
sy = (double)g_client_height / (double)g_height;
return rd(cy / sy);
}
/******************************************************************************/
void QMyMainWindow::timerEvent(QTimerEvent * e)
{
QWidget::timerEvent(e);
if (e->timerId() == timer_id)
{
// send mouse up
rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_BUTTON1,
rd(c2sx(mx)), rd(c2sy(my)));
// if in fullscreen, take it out or the menu won't work
if (g_fullscreen)
{
g_fullscreen = 0;
g_SV->showNormal();
g_SV->showMaximized();
}
else
PopupMenu->popup(mapToGlobal(QPoint(mx, my)));
}
killTimer(timer_id);
}
/******************************************************************************/
void QMyMainWindow::MemuClicked(int MenuID)
{
QWidget * Desktop;
int dw;
int dh;
if (MenuID == 1) // right click
{
rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_DOWN | MOUSE_FLAG_BUTTON2,
rd(c2sx(mx)), rd(c2sy(my)));
rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_BUTTON2,
rd(c2sx(mx)), rd(c2sy(my)));
}
else if (MenuID == 2) // toggle full screen
{
g_fullscreen = ~g_fullscreen;
if (g_fullscreen)
{
Desktop = g_App->desktop();
dw = Desktop->width();
dh = Desktop->height();
if (dw == g_client_width && dh == g_client_height)
g_MW->resize(g_client_width - 4, g_client_height - 4);
g_SV->showFullScreen();
}
else
{
g_SV->showNormal();
g_SV->showMaximized();
g_MW->resize(g_client_width, g_client_height);
}
}
else if (MenuID == 3) // reset keyboard
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -