-rw-r--r-- | noncore/net/opierdesktop/qtwin.cpp | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/noncore/net/opierdesktop/qtwin.cpp b/noncore/net/opierdesktop/qtwin.cpp index 54a5a03..71ba5a5 100644 --- a/noncore/net/opierdesktop/qtwin.cpp +++ b/noncore/net/opierdesktop/qtwin.cpp @@ -1,1204 +1,1204 @@ /* rdesktop: A Remote Desktop Protocol client. User interface services - X Window System Copyright (C) Matthew Chapman 1999-2002 qt.cpp by Jay Sorg This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "rdesktop.h" #include <qpe/qpeapplication.h> #include <qmainwindow.h> #include <qwidget.h> #include <qpainter.h> #include <qimage.h> #include <qsocketnotifier.h> #include <qscrollview.h> #include <qmessagebox.h> #include <qpushbutton.h> #include <qlineedit.h> #include <qcombobox.h> #include <qlabel.h> #include <qfile.h> #include <qcheckbox.h> #include <qpopupmenu.h> #include "qtwin.h" #include <stdlib.h> uint32 flags; char server[64] = ""; char domain[16] = ""; char password[16] = ""; char shell[128] = ""; char directory[32] = ""; extern int g_width; extern int g_height; extern int server_bpp; extern BOOL fullscreen; extern char username[]; int global_sock; QSocketNotifier* SocketNotifier; QPEApplication* App; QMyMainWindow* MW; QMyScrollView* SV; struct QColorMap { uint32 RGBColors[256]; int NumColors; }; QColorMap* CM; uint8* BS; int clipx; int clipy; int clipcx; int clipcy; struct bitmap { int w; int h; uint8* data; }; BOOL owncolmap = False; //***************************************************************************** void CleanString(QString* Item) { int i; i = Item->length() - 1; while (i >= 0) { if (Item->at(i) == 10 || Item->at(i) == 13) Item->remove(i, 1); i--; } } //***************************************************************************** QMyDialog::QMyDialog(QWidget* parent) : QDialog(parent, "Settings", true) { setCaption( tr( "Configuration" ) ); int i, j; char* home; char Text[256]; QString Line; QString ItemName; QString ItemValue; // resize dialog resize(230, 270); // main list box ListBox = new QListBox(this); ListBox->move(10, 10); ListBox->resize(200, 100); connect(ListBox, SIGNAL(selectionChanged()), this, SLOT(ListBoxChanged())); connect(ListBox, SIGNAL(selected(int)), this, SLOT(ListBoxSelected(int))); // server Label1 = new QLabel(this); - Label1->setText("Server Desc"); + Label1->setText( tr("Server Desc") ); Label1->move(10, 120); Label1->resize(100, 20); ServerNameEdit = new QLineEdit(this); ServerNameEdit->move(75, 120); ServerNameEdit->resize(100, 20); // username Label2 = new QLabel(this); - Label2->setText("User Name"); + Label2->setText( tr("User Name") ); Label2->move(10, 150); Label2->resize(100, 20); UserNameEdit = new QLineEdit(this); UserNameEdit->move(75, 150); UserNameEdit->resize(100, 20); // ip Label3 = new QLabel(this); - Label3->setText("Server IP"); + Label3->setText( tr("Server Address") ); Label3->move(10, 180); Label3->resize(100, 20); IPEdit = new QLineEdit(this); IPEdit->move(75, 180); IPEdit->resize(100, 20); // width and height WidthHeightBox = new QComboBox(this); WidthHeightBox->move(10, 210); WidthHeightBox->resize(100, 20); WidthHeightBox->insertItem("240x320"); WidthHeightBox->insertItem("640x480"); WidthHeightBox->insertItem("800x600"); connect(WidthHeightBox, SIGNAL(activated(int)), this, SLOT(ComboChanged(int))); WidthHeightBox->setCurrentItem(1); WidthEdit = new QLineEdit(this); WidthEdit->move(110, 210); WidthEdit->resize(30, 20); WidthEdit->setText("800"); HeightEdit = new QLineEdit(this); HeightEdit->move(140, 210); HeightEdit->resize(30, 20); HeightEdit->setText("600"); // add to list button AddButton = new QPushButton(this); AddButton->move(180, 120); AddButton->resize(50, 20); - AddButton->setText("Add"); + AddButton->setText(tr("Add", "Add Connection")); connect(AddButton, SIGNAL(clicked()), this, SLOT(AddClicked())); // change list item button EditButton = new QPushButton(this); EditButton->move(180, 140); EditButton->resize(50, 20); - EditButton->setText("Edit"); + EditButton->setText(tr("Edit")); connect(EditButton, SIGNAL(clicked()), this, SLOT(EditClicked())); // save to file button SaveButton = new QPushButton(this); SaveButton->move(180, 160); SaveButton->resize(50, 20); - SaveButton->setText("Save"); + SaveButton->setText(tr("Save")); connect(SaveButton, SIGNAL(clicked()), this, SLOT(SaveClicked())); // remove an item button RemoveButton = new QPushButton(this); RemoveButton->move(180, 180); RemoveButton->resize(50, 20); - RemoveButton->setText("Remove"); + RemoveButton->setText(tr("Remove")); connect(RemoveButton, SIGNAL(clicked()), this, SLOT(RemoveClicked())); // full screen check box FullScreenCheckBox = new QCheckBox(this, "Full Screen"); - FullScreenCheckBox->setText("Full Screen"); + FullScreenCheckBox->setText(tr("Full Screen")); FullScreenCheckBox->move(10, 230); // ok button for (i = 0; i < 10; i++) { ConnectionList[i] = new QMyConnectionItem; ConnectionList[i]->ServerName = ""; ConnectionList[i]->UserName = ""; ConnectionList[i]->ServerIP = ""; ConnectionList[i]->Width = 0; ConnectionList[i]->Height = 0; ConnectionList[i]->FullScreen = 0; } home = getenv("HOME"); if (home != NULL) { sprintf(Text, "%s/rdesktop.ini", home); QFile* File = new QFile(Text); if (File->open(IO_ReadOnly)) { i = -1; while (!File->atEnd()) { File->readLine(Line, 255); j = Line.find("="); if (j > 0) { ItemName = Line.mid(0, j); CleanString(&ItemName); ItemValue = Line.mid(j + 1); CleanString(&ItemValue); if (ItemName == "Server") { i++; ConnectionList[i]->ServerName = ItemValue; ListBox->insertItem(ItemValue); } else if (ItemName == "UserName") ConnectionList[i]->UserName = ItemValue; else if (ItemName == "Width") ConnectionList[i]->Width = ItemValue.toInt(); else if (ItemName == "Height") ConnectionList[i]->Height = ItemValue.toInt(); else if (ItemName == "IP") ConnectionList[i]->ServerIP = ItemValue; else if (ItemName == "FullScreen") ConnectionList[i]->FullScreen = (ItemValue != "0"); } } } delete File; } } //***************************************************************************** QMyDialog::~QMyDialog() { QMyConnectionItem* Item; int i; for (i = 0; i < 10; i++) { Item = ConnectionList[i]; delete Item; } } //***************************************************************************** void QMyDialog::ComboChanged(int index) { if (index == 0) { WidthEdit->setText("240"); HeightEdit->setText("320"); } if (index == 1) { WidthEdit->setText("640"); HeightEdit->setText("480"); } else if (index == 2) { WidthEdit->setText("800"); HeightEdit->setText("600"); } } //***************************************************************************** void QMyDialog::accept() { ServerName = ServerNameEdit->text(); UserName = UserNameEdit->text(); Width = WidthEdit->text().toInt(); Height = HeightEdit->text().toInt(); ServerIP = IPEdit->text(); FullScreen = FullScreenCheckBox->isChecked(); QDialog::accept(); } //***************************************************************************** void QMyDialog::AddClicked() { int i; QMyConnectionItem* Item; i = ListBox->count(); if (i < 10) { ListBox->insertItem(ServerNameEdit->text()); Item = ConnectionList[i]; Item->ServerName = ServerNameEdit->text(); Item->UserName = UserNameEdit->text(); Item->Width = WidthEdit->text().toInt(); Item->Height = HeightEdit->text().toInt(); Item->ServerIP = IPEdit->text(); Item->FullScreen = FullScreenCheckBox->isChecked(); } } //***************************************************************************** void QMyDialog::EditClicked() { int i; QMyConnectionItem* Item; i = ListBox->currentItem(); if (i >= 0) { Item = ConnectionList[i]; Item->ServerName = ServerNameEdit->text(); Item->UserName = UserNameEdit->text(); Item->Width = WidthEdit->text().toInt(); Item->Height = HeightEdit->text().toInt(); Item->ServerIP = IPEdit->text(); Item->FullScreen = FullScreenCheckBox->isChecked(); ListBox->changeItem(ServerNameEdit->text(), i); } } //***************************************************************************** void WriteString(QFile* File, QString* Line) { File->writeBlock((const char*)(*Line), Line->length()); } //***************************************************************************** void QMyDialog::SaveClicked() { int i, j; QMyConnectionItem* Item; QString Line; char* home; char Text[256]; QFile* File; home = getenv("HOME"); if (home != NULL) { sprintf(Text, "%s/rdesktop.ini", home); File = new QFile(Text); if (File->open(IO_Truncate | IO_ReadWrite)) { i = ListBox->count(); for (j = 0; j < i; j++) { Item = ConnectionList[j]; Line = "Server="; Line += Item->ServerName; Line += (char)10; WriteString(File, &Line); Line = "UserName="; Line += Item->UserName; Line += (char)10; WriteString(File, &Line); Line = "Width="; sprintf(Text, "%d", Item->Width); Line += Text; Line += (char)10; WriteString(File, &Line); Line = "Height="; sprintf(Text, "%d", Item->Height); Line += Text; Line += (char)10; WriteString(File, &Line); Line = "IP="; Line += Item->ServerIP; Line += (char)10; WriteString(File, &Line); Line = "FullScreen="; if (Item->FullScreen) Line += "1"; else Line += "0"; Line += (char)10; WriteString(File, &Line); } } File->flush(); File->close(); delete File; } } //***************************************************************************** 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) { QScrollView::timerEvent(e); killTimer(timer_id); QMyDialog* d; QWidget* Desktop; int dw; int dh; d = new QMyDialog(this); if (d->exec() == 1) // ok clicked { flags = RDP_LOGON_NORMAL; g_width = d->Width; g_height = d->Height; fullscreen = d->FullScreen; sprintf(server, "%s", (const char*)d->ServerIP); sprintf(username, "%s", (const char*)d->UserName); if (!rdp_connect(server, flags, domain, password, shell, directory)) { delete d; SV->close(); return; } BS = (uint8*)xmalloc(g_width * g_height); memset(BS, 0, g_width * g_height); clipx = 0; clipy = 0; clipcx = g_width; clipcy = g_height; CM = (QColorMap*)xmalloc(sizeof(struct QColorMap)); memset(CM, 0, sizeof(struct QColorMap)); CM->NumColors = 256; MW = new QMyMainWindow(); MW->resize(g_width, g_height); MW->show(); SV->addChild(MW); MW->setMouseTracking(true); SocketNotifier = new QSocketNotifier(global_sock, QSocketNotifier::Read, MW); MW->connect(SocketNotifier, SIGNAL(activated(int)), MW, SLOT(dataReceived())); if (fullscreen) { Desktop = App->desktop(); dw = Desktop->width(); dh = Desktop->height(); if (dw == g_width && dh == g_height) MW->resize(g_width - 4, g_height - 4); SV->showFullScreen(); } delete d; } else // cancel clicked { delete d; SV->close(); } } //***************************************************************************** QMyMainWindow::QMyMainWindow() : QWidget(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; } //***************************************************************************** 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, mx, my); // if in fullscreen, take it out or the menu won't work if (fullscreen) { fullscreen = 0; SV->showNormal(); 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, mx, my); rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_BUTTON2, mx, my); } else if (MenuID == 2) // toggle full screen { fullscreen = ~fullscreen; if (fullscreen) { Desktop = App->desktop(); dw = Desktop->width(); dh = Desktop->height(); if (dw == g_width && dh == g_height) MW->resize(g_width - 4, g_height - 4); SV->showFullScreen(); } else { SV->showNormal(); SV->showMaximized(); MW->resize(g_width, g_height); } } else if (MenuID == 3) // reset keyboard { rdp_send_input(0, RDP_INPUT_SCANCODE, RDP_KEYRELEASE, 0x2a, 0); // shift rdp_send_input(0, RDP_INPUT_SCANCODE, RDP_KEYRELEASE, 0x1d, 0); // control rdp_send_input(0, RDP_INPUT_SCANCODE, RDP_KEYRELEASE, 0x38, 0); // alt } else if (MenuID == 4) // double click { rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_DOWN | MOUSE_FLAG_BUTTON1, mx, my); rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_BUTTON1, mx, my); rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_DOWN | MOUSE_FLAG_BUTTON1, mx, my); rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_BUTTON1, mx, my); } } //***************************************************************************** void QMyMainWindow::mouseMoveEvent(QMouseEvent* e) { int x; int y; x = e->x(); y = e->y(); if (timer_id) { x = x - mx; y = y - my; if (x < -10 || x > 10 || y < -10 || y > 10) { killTimer(timer_id); timer_id = 0; } } rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_MOVE, e->x(), e->y()); } //***************************************************************************** void QMyMainWindow::mousePressEvent(QMouseEvent* e) { timer_id = startTimer(1000); mx = e->x(); my = e->y(); if (e->button() == LeftButton) rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_DOWN | MOUSE_FLAG_BUTTON1, e->x(), e->y()); else if (e->button() == RightButton) rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_DOWN | MOUSE_FLAG_BUTTON2, e->x(), e->y()); else if (e->button() == MidButton) rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_DOWN | MOUSE_FLAG_BUTTON3, e->x(), e->y()); } //***************************************************************************** void QMyMainWindow::mouseReleaseEvent(QMouseEvent* e) { killTimer(timer_id); timer_id = 0; if (e->button() == LeftButton) rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_BUTTON1, e->x(), e->y()); else if (e->button() == RightButton) rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_BUTTON2, e->x(), e->y()); else if (e->button() == MidButton) rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_BUTTON3, e->x(), e->y()); } //***************************************************************************** void QMyMainWindow::wheelEvent(QWheelEvent* e) { if (e->delta() > 0) rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_BUTTON4, e->x(), e->y()); else if (e->delta() < 0) rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_BUTTON5, e->x(), e->y()); } #define NOT(x) (255-(x)) //***************************************************************************** uint8 rop(int rop, uint8 src, uint8 dst) { switch (rop) { case 0x0: return 0; case 0x1: return NOT (src | dst); case 0x2: return NOT (src) & dst; case 0x3: return NOT (src); case 0x4: return src & NOT (dst); case 0x5: return NOT (dst); case 0x6: return src ^ dst; case 0x7: return NOT (src & dst); case 0x8: return src & dst; case 0x9: return NOT (src) ^ dst; case 0xa: return dst; case 0xb: return NOT (src) | dst; case 0xc: return src; case 0xd: return src | NOT (dst); case 0xe: return src | dst; case 0xf: return NOT (0); } return dst; } //***************************************************************************** uint8 get_pixel(int x, int y) { if (x >= 0 && x < g_width && y >= 0 && y < g_height) return BS[y * g_width + x]; else return 0; } //***************************************************************************** void set_pixel(int x, int y, uint8 pixel, int op = 0xc) { if (x >= clipx && x < (clipx + clipcx) && y >= clipy && y < (clipy + clipcy)) if (x >= 0 && x < g_width && y >= 0 && y < g_height) if (op == 0xc) BS[y * g_width + x] = pixel; else BS[y * g_width + x] = rop(op, pixel, BS[y * g_width + x]); } //****************************************************************************** // adjust coordinates for cliping rect bool WarpCoords(int* x, int* y, int* cx, int* cy, int* srcx, int* srcy) { int dx, dy; QRect InRect(*x, *y, *cx, *cy); QRect OutRect; QRect CRect(clipx, clipy, clipcx, clipcy); OutRect = InRect.intersect(CRect); if (OutRect.isEmpty()) return false; dx = OutRect.x() - InRect.x(); dy = OutRect.y() - InRect.y(); *x = OutRect.x(); *y = OutRect.y(); *cx = OutRect.width(); *cy = OutRect.height(); if (srcx != NULL) *srcx = *srcx + dx; if (srcy != NULL) *srcy = *srcy + dy; return true; } //***************************************************************************** void QMyMainWindow::paintEvent(QPaintEvent* pe) { QImage* Image; QPainter* Painter; QRect Rect; int i, j, w, h, l, t; uint8* data; if (!testWFlags(WRepaintNoErase)) setWFlags(WRepaintNoErase); if (CM != NULL) { Rect = pe->rect(); l = Rect.left(); t = Rect.top(); w = Rect.width(); h = Rect.height(); if (w > 0 && h > 0 && CM->NumColors > 0) { data = (uint8*)xmalloc(w * h); for (i = 0; i < h; i++) for (j = 0; j < w; j++) data[i * w + j] = get_pixel(l + j, t + i); Image = new QImage(data, w, h, 8,(QRgb*)CM->RGBColors, CM->NumColors, QImage::IgnoreEndian); Painter = new QPainter(this); Painter->drawImage(l, t, *Image, 0, 0, w, h); xfree(data); delete Painter; delete Image; } } } //***************************************************************************** void QMyMainWindow::closeEvent(QCloseEvent* e) { e->accept(); } //***************************************************************************** void QMyMainWindow::dataReceived() { if (rdp_main_loop()) return; else SV->close(); } //***************************************************************************** void redraw(int x, int y, int cx, int cy) { if (WarpCoords(&x, &y, &cx, &cy, NULL, NULL)) { MW->update(x, y, cx, cy); } } /* BOOL ui_init(void) { QWidget* d; CM = NULL; BS = NULL; App = new QPEApplication(g_argc, g_argv); if (fullscreen) { d = QApplication::desktop(); width = d->width(); // returns screen width height = d->height(); // returns screen height } return True; } */ /* void ui_deinit(void) { delete App; } */ /* BOOL ui_create_window(void) { MW = new QMyMainWindow(); MW->resize(width, height); SV = new QMyScrollView(); SV->resize(width + 4, height + 4); App->setMainWidget(SV); SV->addChild(MW); MW->setMouseTracking(true); SocketNotifier = new QSocketNotifier(global_sock, QSocketNotifier::Read, MW); MW->connect(SocketNotifier, SIGNAL(activated(int)), MW, SLOT(dataReceived())); if (fullscreen) SV->showFullScreen(); else SV->showMaximized(); BS = (uint8*)xmalloc(width * height); memset(BS, 0, width * height); clipx = 0; clipy = 0; clipcx = width; clipcy = height; CM = (QColorMap*)xmalloc(sizeof(struct QColorMap)); memset(CM, 0, sizeof(struct QColorMap)); SV->timer_id = SV->startTimer(1000); return True; } */ /* void ui_destroy_window(void) { delete MW; delete SV; xfree(BS); xfree(CM); } */ //***************************************************************************** /* Returns 0 after user quit, 1 otherwise */ int ui_select(int rdp_socket) { global_sock = rdp_socket; return 1; } //***************************************************************************** void ui_move_pointer(int /*x*/, int /*y*/) { } //***************************************************************************** HBITMAP ui_create_bitmap(int width, int height, uint8 * data) { struct bitmap* the_bitmap; uint8* bitmap_data; int i, j; // printf("width %d height %d times %d\n", width, height, width * height); bitmap_data = (uint8*)xmalloc(width * height); the_bitmap = (struct bitmap*)xmalloc(sizeof(struct bitmap)); the_bitmap->w = width; the_bitmap->h = height; the_bitmap->data = bitmap_data; for (i = 0; i < height; i++) for (j = 0; j < width; j++) bitmap_data[i * width + j] = data[i * width + j]; return the_bitmap; } //***************************************************************************** void ui_paint_bitmap(int x, int y, int cx, int cy, int width, int height, uint8 * data) { int i, j; for (i = 0; i < cy; i++) for (j = 0; j < cx; j++) if (i < height) if (j < width) set_pixel(x + j, y + i, data[i * width + j]); redraw(x, y, cx, cy); } //***************************************************************************** void ui_destroy_bitmap(HBITMAP bmp) { struct bitmap* the_bitmap; the_bitmap = (struct bitmap*)bmp; if (the_bitmap != NULL) { if (the_bitmap->data != NULL) xfree(the_bitmap->data); xfree(the_bitmap); } } //***************************************************************************** bool is_pixel_on(uint8* data, int x, int y, int width, int bpp) { int start, shift; if (bpp == 1) { width = (width + 7) / 8; start = (y * width) + x / 8; shift = x % 8; return (data[start] & (0x80 >> shift)) != 0; } else if (bpp == 8) return data[y * width + x] != 0; else return false; } //***************************************************************************** void set_pixel_on(uint8* data, int x, int y, int width, int bpp, uint8 pixel) { if (bpp == 8) data[y * width + x] = pixel; } //***************************************************************************** HGLYPH ui_create_glyph(int width, int height, uint8 * data) { int i, j; uint8* glyph_data; struct bitmap* the_glyph; glyph_data = (uint8*)xmalloc(width * height); the_glyph = (struct bitmap*)xmalloc(sizeof(struct bitmap)); the_glyph->w = width; the_glyph->h = height; the_glyph->data = glyph_data; memset(glyph_data, 0, width * height); for (i = 0; i < height; i++) for (j = 0; j < width; j++) if (is_pixel_on(data, j, i, width, 1)) set_pixel_on(glyph_data, j, i, width, 8, 255); return the_glyph; } //***************************************************************************** void ui_destroy_glyph(HGLYPH glyph) { struct bitmap* the_glyph; the_glyph = (struct bitmap*)glyph; if (the_glyph != NULL) { if (the_glyph->data != NULL) xfree(the_glyph->data); xfree(the_glyph); } } //***************************************************************************** HCURSOR ui_create_cursor(unsigned int /*x*/, unsigned int /*y*/, int /*width*/, int /*height*/, uint8 * /*andmask*/, uint8 * /*xormask*/) { return (void*)1; } //***************************************************************************** void ui_set_cursor(HCURSOR /*cursor*/) { } //***************************************************************************** void ui_destroy_cursor(HCURSOR /*cursor*/) { } //***************************************************************************** HCOLOURMAP ui_create_colourmap(COLOURMAP * colours) { |