/[rdesktop]/sourceforge.net/trunk/rdesktop/uiports/qtwin.cpp
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /sourceforge.net/trunk/rdesktop/uiports/qtwin.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 727 - (show annotations)
Sun Jun 27 19:08:35 2004 UTC (19 years, 11 months ago) by jsorg71
File size: 39869 byte(s)
added new functions and files needed by persistant bitmap caching

1 /*
2 rdesktop: A Remote Desktop Protocol client.
3 User interface services - QT Window System
4 Copyright (C) Matthew Chapman 1999-2002
5 qtwin.cpp by Jay Sorg
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22 #include "../rdesktop.h"
23
24 #include <qapplication.h>
25 #include <qmainwindow.h>
26 #include <qwidget.h>
27 #include <qpainter.h>
28 #include <qpixmap.h>
29 #include <qbrush.h>
30 #include <qimage.h>
31 #include <qbitmap.h>
32 #include <qcursor.h>
33 #include <qsocketnotifier.h>
34 #include <qscrollview.h>
35 #include <qfile.h>
36
37 #include "qtwin.h"
38 #include <unistd.h> // gethostname
39 #include <pwd.h> // getpwuid
40 #include <stdarg.h> // va_list va_start va_end
41
42 /* rdesktop globals */
43 extern int g_tcp_port_rdp;
44 int g_use_rdp5 = 0;
45 char g_hostname[16];
46 char g_username[64];
47 int g_height = 600;
48 int g_width = 800;
49 int g_server_bpp = 8;
50 int g_encryption = 1;
51 int g_desktop_save =1;
52 int g_bitmap_cache = 1;
53 int g_bitmap_cache_persist_enable = False;
54 int g_bitmap_cache_precache = True;
55 int g_bitmap_compression = 1;
56 int g_rdp5_performanceflags = 0;
57 int g_console_session = 0;
58 int g_keylayout = 0x409; /* Defaults to US keyboard layout */
59
60 /* hack globals */
61 int g_argc = 0;
62 char** g_argv = 0;
63 int UpAndRunning = 0;
64 int g_sock = 0;
65 int deactivated = 0;
66 uint32 ext_disc_reason = 0;
67 char g_servername[128];
68 char g_title[128] = "";
69
70 /* qt globals */
71 QSocketNotifier* SocketNotifier;
72 QApplication* App;
73 QMyMainWindow* MW;
74 QMyScrollView* SV;
75 QPixmap* BS;
76 QPixmap* DS;
77 QPainter* P1;
78 QPainter* P2;
79 QColor Color1;
80 QColor Color2;
81 struct QColorMap
82 {
83 uint32 RGBColors[256];
84 int NumColors;
85 };
86 QColorMap* CM = 0;
87 QRegion* ClipRect;
88
89 Qt::RasterOp OpCodes[16] = {
90 Qt::ClearROP, // BLACKNESS 0
91 Qt::NorROP, // NOTSRCERASE DSon
92 Qt::NotAndROP, // DSna
93 Qt::NotCopyROP, // NOTSRCCOPY Sn
94 Qt::AndNotROP, // SRCERASE SDna
95 Qt::NotROP, // DSTINVERT Dn
96 Qt::XorROP, // SRCINVERT DSx
97 Qt::NandROP, // DSan
98 Qt::AndROP, // SRCAND DSa
99 Qt::NotXorROP, // DSxn
100 Qt::NopROP, // D
101 Qt::NotOrROP, // MERGEPAINT DSno
102 Qt::CopyROP, // SRCCOPY S
103 Qt::OrNotROP, // SDno
104 Qt::OrROP, // SRCPAINT DSo
105 Qt::SetROP}; // WHITENESS 1
106
107 //*****************************************************************************
108 uint32 Color15to32(uint32 InColor)
109 {
110 uint32 r, g, b;
111 r = (InColor & 0x7c00) >> 10;
112 r = (r * 0xff) / 0x1f;
113 g = (InColor & 0x03e0) >> 5;
114 g = (g * 0xff) / 0x1f;
115 b = (InColor & 0x001f);
116 b = (b * 0xff) / 0x1f;
117 return (r << 16) | (g << 8) | b;
118 }
119
120 //*****************************************************************************
121 uint32 Color16to32(uint32 InColor)
122 {
123 uint32 r, g, b;
124 r = (InColor & 0xf800) >> 11;
125 r = (r * 0xff) / 0x1f;
126 g = (InColor & 0x07e0) >> 5;
127 g = (g * 0xff) / 0x3f;
128 b = (InColor & 0x001f);
129 b = (b * 0xff) / 0x1f;
130 return (r << 16) | (g << 8) | b;
131 }
132
133 //*****************************************************************************
134 uint32 Color24to32(uint32 InColor)
135 {
136 return ((InColor & 0x00ff0000) >> 16) | ((InColor & 0x000000ff) << 16) |
137 (InColor & 0x0000ff00);
138 }
139
140 //*****************************************************************************
141 void SetColorx(QColor* Color, uint32 InColor)
142 {
143 switch (g_server_bpp)
144 {
145 case 8:
146 if (CM == NULL || InColor > 255)
147 {
148 Color->setRgb(0);
149 return;
150 }
151 Color->setRgb(CM->RGBColors[InColor]);
152 break;
153 case 15:
154 Color->setRgb(Color15to32(InColor));
155 break;
156 case 16:
157 Color->setRgb(Color16to32(InColor));
158 break;
159 case 24:
160 Color->setRgb(Color24to32(InColor));
161 break;
162 default:
163 Color->setRgb(0);
164 }
165 }
166
167 //*****************************************************************************
168 void SetOpCode(int opcode)
169 {
170 if (opcode >= 0 && opcode < 16)
171 {
172 Qt::RasterOp op = OpCodes[opcode];
173 if (op != Qt::CopyROP)
174 {
175 P1->setRasterOp(op);
176 P2->setRasterOp(op);
177 }
178 }
179 }
180
181 //*****************************************************************************
182 void ResetOpCode(int opcode)
183 {
184 if (opcode >= 0 && opcode < 16)
185 {
186 Qt::RasterOp op = OpCodes[opcode];
187 if (op != Qt::CopyROP)
188 {
189 P1->setRasterOp(Qt::CopyROP);
190 P2->setRasterOp(Qt::CopyROP);
191 }
192 }
193 }
194
195 /*****************************************************************************/
196 QMyMainWindow::QMyMainWindow() : QWidget()
197 {
198 }
199
200 /*****************************************************************************/
201 QMyMainWindow::~QMyMainWindow()
202 {
203 }
204
205 //*****************************************************************************
206 void QMyMainWindow::mouseMoveEvent(QMouseEvent* e)
207 {
208 if (!UpAndRunning)
209 return;
210 rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_MOVE, e->x(), e->y());
211 }
212
213 //*****************************************************************************
214 void QMyMainWindow::mousePressEvent(QMouseEvent* e)
215 {
216 if (!UpAndRunning)
217 return;
218 if (e->button() == LeftButton)
219 rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_DOWN | MOUSE_FLAG_BUTTON1,
220 e->x(), e->y());
221 else if (e->button() == RightButton)
222 rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_DOWN | MOUSE_FLAG_BUTTON2,
223 e->x(), e->y());
224 else if (e->button() == MidButton)
225 rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_DOWN | MOUSE_FLAG_BUTTON3,
226 e->x(), e->y());
227 }
228
229 //*****************************************************************************
230 void QMyMainWindow::mouseReleaseEvent(QMouseEvent* e)
231 {
232 if (!UpAndRunning)
233 return;
234 if (e->button() == LeftButton)
235 rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_BUTTON1, e->x(), e->y());
236 else if (e->button() == RightButton)
237 rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_BUTTON2, e->x(), e->y());
238 else if (e->button() == MidButton)
239 rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_BUTTON3, e->x(), e->y());
240 }
241
242 //*****************************************************************************
243 void QMyMainWindow::wheelEvent(QWheelEvent* e)
244 {
245 if (!UpAndRunning)
246 return;
247 if (e->delta() > 0)
248 rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_BUTTON4, e->x(), e->y());
249 else if (e->delta() < 0)
250 rdp_send_input(0, RDP_INPUT_MOUSE, MOUSE_FLAG_BUTTON5, e->x(), e->y());
251 }
252
253 //*****************************************************************************
254 int GetScanCode(QKeyEvent* e)
255 {
256 int Key = e->key();
257 int ScanCode = 0;
258 Qt::ButtonState bs = e->state();
259 if (!(bs & Qt::ShiftButton)) // shift is not down
260 {
261 if (Key == 42) // *
262 return 0x37;
263 if (Key == 43) // +
264 return 0x4e;
265 }
266 switch (Key)
267 {
268 case 4100: ScanCode = 0x1c; break; // enter
269 case 4101: ScanCode = 0x1c; break;
270 case 4117: ScanCode = 0xd0; break; // down arrow
271 case 4115: ScanCode = 0xc8; break; // up arrow
272 case 4114: ScanCode = 0xcb; break; // left arrow
273 case 4116: ScanCode = 0xcd; break; // right arrow
274 case 4112: ScanCode = 0xc7; break; // home
275 case 4113: ScanCode = 0xcf; break; // end
276 case 4102: ScanCode = 0xd2; break; // insert
277 case 4103: ScanCode = 0xd3; break; // delete
278 case 4118: ScanCode = 0xc9; break; // page up
279 case 4119: ScanCode = 0xd1; break; // page down
280 case 4143: ScanCode = 0x00; break; // num lock
281 case 47: ScanCode = 0x35; break; // /
282 case 42: ScanCode = 0x37; break; // *
283 case 45: ScanCode = 0x0c; break; // -
284 case 95: ScanCode = 0x0c; break; // _
285 case 43: ScanCode = 0x0d; break; // +
286 case 46: ScanCode = 0x34; break; // .
287 case 48: ScanCode = 0x0b; break; // 0
288 case 41: ScanCode = 0x0b; break; // )
289 case 49: ScanCode = 0x02; break; // 1
290 case 33: ScanCode = 0x02; break; // !
291 case 50: ScanCode = 0x03; break; // 2
292 case 64: ScanCode = 0x03; break; // @
293 case 51: ScanCode = 0x04; break; // 3
294 case 35: ScanCode = 0x04; break; // #
295 case 52: ScanCode = 0x05; break; // 4
296 case 36: ScanCode = 0x05; break; // $
297 case 53: ScanCode = 0x06; break; // 5
298 case 37: ScanCode = 0x06; break; // %
299 case 54: ScanCode = 0x07; break; // 6
300 case 94: ScanCode = 0x07; break; // ^
301 case 55: ScanCode = 0x08; break; // 7
302 case 38: ScanCode = 0x08; break; // &
303 case 56: ScanCode = 0x09; break; // 8
304 case 57: ScanCode = 0x0a; break; // 9
305 case 40: ScanCode = 0x0a; break; // (
306 case 61: ScanCode = 0x0d; break; // =
307 case 65: ScanCode = 0x1e; break; // a
308 case 66: ScanCode = 0x30; break; // b
309 case 67: ScanCode = 0x2e; break; // c
310 case 68: ScanCode = 0x20; break; // d
311 case 69: ScanCode = 0x12; break; // e
312 case 70: ScanCode = 0x21; break; // f
313 case 71: ScanCode = 0x22; break; // g
314 case 72: ScanCode = 0x23; break; // h
315 case 73: ScanCode = 0x17; break; // i
316 case 74: ScanCode = 0x24; break; // j
317 case 75: ScanCode = 0x25; break; // k
318 case 76: ScanCode = 0x26; break; // l
319 case 77: ScanCode = 0x32; break; // m
320 case 78: ScanCode = 0x31; break; // n
321 case 79: ScanCode = 0x18; break; // o
322 case 80: ScanCode = 0x19; break; // p
323 case 81: ScanCode = 0x10; break; // q
324 case 82: ScanCode = 0x13; break; // r
325 case 83: ScanCode = 0x1f; break; // s
326 case 84: ScanCode = 0x14; break; // t
327 case 85: ScanCode = 0x16; break; // u
328 case 86: ScanCode = 0x2f; break; // v
329 case 87: ScanCode = 0x11; break; // w
330 case 88: ScanCode = 0x2d; break; // x
331 case 89: ScanCode = 0x15; break; // y
332 case 90: ScanCode = 0x2c; break; // z
333 case 32: ScanCode = 0x39; break; // space
334 case 44: ScanCode = 0x33; break; // ,
335 case 60: ScanCode = 0x33; break; // <
336 case 62: ScanCode = 0x34; break; // >
337 case 63: ScanCode = 0x35; break; // ?
338 case 92: ScanCode = 0x2b; break; // backslash
339 case 124: ScanCode = 0x2b; break; // bar
340 case 4097: ScanCode = 0x0f; break; // tab
341 case 4132: ScanCode = 0x3a; break; // caps lock
342 case 4096: ScanCode = 0x01; break; // esc
343 case 59: ScanCode = 0x27; break; // ;
344 case 58: ScanCode = 0x27; break; // :
345 case 39: ScanCode = 0x28; break; // '
346 case 34: ScanCode = 0x28; break; // "
347 case 91: ScanCode = 0x1a; break; // [
348 case 123: ScanCode = 0x1a; break; // {
349 case 93: ScanCode = 0x1b; break; // ]
350 case 125: ScanCode = 0x1b; break; // }
351 case 4144: ScanCode = 0x3b; break; // f1
352 case 4145: ScanCode = 0x3c; break; // f2
353 case 4146: ScanCode = 0x3d; break; // f3
354 case 4147: ScanCode = 0x3e; break; // f4
355 case 4148: ScanCode = 0x3f; break; // f5
356 case 4149: ScanCode = 0x40; break; // f6
357 case 4150: ScanCode = 0x41; break; // f7
358 case 4151: ScanCode = 0x42; break; // f8
359 case 4152: ScanCode = 0x43; break; // f9
360 case 4153: ScanCode = 0x44; break; // f10
361 case 4154: ScanCode = 0x57; break; // f11
362 case 4155: ScanCode = 0x58; break; // f12
363 case 4128: ScanCode = 0x2a; break; // shift
364 case 4131: ScanCode = 0x38; break; // alt
365 case 4129: ScanCode = 0x1d; break; // ctrl
366 case 96: ScanCode = 0x29; break; // `
367 case 126: ScanCode = 0x29; break; // ~
368 case 4099: ScanCode = 0x0e; break; // backspace
369 }
370 // if (ScanCode == 0)
371 // printf("key %d scancode %d\n", Key, ScanCode);
372 return ScanCode;
373 }
374
375 //*****************************************************************************
376 void QMyMainWindow::keyPressEvent(QKeyEvent* e)
377 {
378 if (!UpAndRunning)
379 return;
380 int ScanCode = GetScanCode(e);
381 if (ScanCode != 0)
382 {
383 rdp_send_input(0, RDP_INPUT_SCANCODE, RDP_KEYPRESS, ScanCode, 0);
384 e->accept();
385 }
386 }
387
388 //*****************************************************************************
389 void QMyMainWindow::keyReleaseEvent(QKeyEvent* e)
390 {
391 if (!UpAndRunning)
392 return;
393 int ScanCode = GetScanCode(e);
394 if (ScanCode != 0)
395 {
396 rdp_send_input(0, RDP_INPUT_SCANCODE, RDP_KEYRELEASE, ScanCode, 0);
397 e->accept();
398 }
399 }
400
401 //*****************************************************************************
402 void QMyMainWindow::paintEvent(QPaintEvent* pe)
403 {
404 QRect Rect;
405 Rect = pe->rect();
406 bitBlt(this, Rect.left(), Rect.top(), BS, Rect.left(), Rect.top(),
407 Rect.width(), Rect.height());
408 }
409
410 //*****************************************************************************
411 void QMyMainWindow::closeEvent(QCloseEvent* e)
412 {
413 e->accept();
414 }
415
416 //*****************************************************************************
417 bool QMyMainWindow::event(QEvent* e)
418 {
419 return QWidget::event(e);
420 }
421
422 //*****************************************************************************
423 void QMyMainWindow::dataReceived()
424 {
425 if (!rdp_loop(&deactivated, &ext_disc_reason))
426 SV->close();
427 }
428
429 //*****************************************************************************
430 void QMyScrollView::keyPressEvent(QKeyEvent* e)
431 {
432 MW->keyPressEvent(e);
433 }
434
435 //*****************************************************************************
436 void QMyScrollView::keyReleaseEvent(QKeyEvent* e)
437 {
438 MW->keyReleaseEvent(e);
439 }
440
441
442 //*****************************************************************************
443 void ui_begin_update(void)
444 {
445 P1->begin(MW);
446 P2->begin(BS);
447 }
448
449 //*****************************************************************************
450 void ui_end_update(void)
451 {
452 P1->end();
453 P2->end();
454 }
455
456 /*****************************************************************************/
457 int ui_init(void)
458 {
459 App = new QApplication(g_argc, g_argv);
460 return 1;
461 }
462
463 /*****************************************************************************/
464 void ui_deinit(void)
465 {
466 delete App;
467 }
468
469 /*****************************************************************************/
470 int ui_create_window(void)
471 {
472 int w, h;
473 MW = new QMyMainWindow();
474 SV = new QMyScrollView();
475 SV->addChild(MW);
476 BS = new QPixmap(g_width, g_height);
477 QPainter* P = new QPainter(BS);
478 P->fillRect(0, 0, g_width, g_height, QBrush(QColor("white")));
479 P->fillRect(0, 0, g_width, g_height, QBrush(QBrush::CrossPattern));
480 delete P;
481 DS = new QPixmap(480, 480);
482 P1 = new QPainter();
483 P2 = new QPainter();
484 ClipRect = new QRegion(0, 0, g_width, g_height);
485 QWidget* d = QApplication::desktop();
486 w = d->width(); // returns screen width
487 h = d->height(); // returns screen height
488 MW->resize(g_width, g_height);
489 if (w < g_width || h < g_height)
490 SV->resize(w, h);
491 else
492 SV->resize(g_width + 4, g_height + 4);
493 SV->setMaximumWidth(g_width + 4);
494 SV->setMaximumHeight(g_height + 4);
495 App->setMainWidget(SV);
496 SV->show();
497 MW->setMouseTracking(true);
498 if (g_title[0] != 0)
499 SV->setCaption(g_title);
500
501 /* XGrayKey(0, 64, AnyModifie, SV->winId(), 0, GrabModeAsync, GrabModeAsync);
502 XGrayKey(0, 113, AnyModifie, SV->winId(), 0, GrabModeAsync, GrabModeAsync);
503 XGrayKey(0, 37, AnyModifie, SV-winId(), 0, GrabModeAsync, GrabModeAsync);
504 XGrayKey(0, 109, AnyModifie, SV->winId(), 0, GrabModeAsync, GrabModeAsync);
505 XGrayKey(0, 115, AnyModifie, SV->winId(), 0, GrabModeAsync, GrabModeAsync);
506 XGrayKey(0, 116, AnyModifie, SV->winId(), 0, GrabModeAsync, GrabModeAsync);
507 XGrayKey(0, 117, AnyModifie, SV->winId(), 0, GrabModeAsync, GrabModeAsync);
508 XGrayKey(0, 62, AnyModifie, SV->winId(), 0, GrabModeAsync, GrabModeAsync);
509 XGrayKey(0, 50, AnyModifie, SV->winId(), 0, GrabModeAsync, GrabModeAsync);*/
510
511 return 1;
512 }
513
514 //*****************************************************************************
515 void ui_main_loop(void)
516 {
517 // connect
518 if (!rdp_connect(g_servername, RDP_LOGON_NORMAL, "", "", "", ""))
519 return;
520 printf("connected\n");
521 // start notifier
522 SocketNotifier = new QSocketNotifier(g_sock, QSocketNotifier::Read, MW);
523 MW->connect(SocketNotifier, SIGNAL(activated(int)), MW, SLOT(dataReceived()));
524 UpAndRunning = 1;
525 // app main loop
526 App->exec();
527 }
528
529 //*****************************************************************************
530 void ui_destroy_window(void)
531 {
532 delete MW;
533 delete SV;
534 delete BS;
535 delete DS;
536 delete P1;
537 delete P2;
538 delete ClipRect;
539 }
540
541 /*****************************************************************************/
542 void ui_bell(void)
543 {
544 }
545
546 /*****************************************************************************/
547 int ui_select(int in_val)
548 {
549 g_sock = in_val;
550 return 1;
551 }
552
553 /*****************************************************************************/
554 void ui_destroy_cursor(void* cursor)
555 {
556 QCursor* Cursor;
557 Cursor = (QCursor*)cursor;
558 if (Cursor != NULL)
559 delete Cursor;
560 }
561
562 /*****************************************************************************/
563 void* ui_create_glyph(int width, int height, uint8* data)
564 {
565 QBitmap* Bitmap;
566 Bitmap = new QBitmap(width, height, data);
567 Bitmap->setMask(*Bitmap);
568 return (HGLYPH)Bitmap;
569 }
570
571 /*****************************************************************************/
572 void ui_destroy_glyph(void* glyph)
573 {
574 QBitmap* Bitmap;
575 Bitmap = (QBitmap*)glyph;
576 delete Bitmap;
577 }
578
579 /*****************************************************************************/
580 void ui_destroy_bitmap(void* bmp)
581 {
582 QPixmap* Pixmap;
583 Pixmap = (QPixmap*)bmp;
584 delete Pixmap;
585 }
586
587 /*****************************************************************************/
588 void ui_reset_clip(void)
589 {
590 P1->setClipRect(0, 0, g_width, g_height);
591 P2->setClipRect(0, 0, g_width, g_height);
592 delete ClipRect;
593 ClipRect = new QRegion(0, 0, g_width, g_height);
594 }
595
596 /*****************************************************************************/
597 void ui_set_clip(int x, int y, int cx, int cy)
598 {
599 P1->setClipRect(x, y, cx, cy);
600 P2->setClipRect(x, y, cx, cy);
601 delete ClipRect;
602 ClipRect = new QRegion(x, y, cx, cy);
603 }
604
605 /*****************************************************************************/
606 void* ui_create_colourmap(COLOURMAP* colours)
607 {
608 QColorMap* LCM;
609 int i, r, g, b;
610 LCM = (QColorMap*)malloc(sizeof(QColorMap));
611 memset(LCM, 0, sizeof(QColorMap));
612 i = 0;
613 while (i < colours->ncolours && i < 256)
614 {
615 r = colours->colours[i].red;
616 g = colours->colours[i].green;
617 b = colours->colours[i].blue;
618 LCM->RGBColors[i] = (r << 16) | (g << 8) | b;
619 i++;
620 }
621 LCM->NumColors = colours->ncolours;
622 return LCM;
623 }
624
625 //*****************************************************************************
626 // todo, does this leak at end of program
627 void ui_destroy_colourmap(HCOLOURMAP map)
628 {
629 QColorMap* LCM;
630 LCM = (QColorMap*)map;
631 if (LCM == NULL)
632 return;
633 free(LCM);
634 }
635
636 /*****************************************************************************/
637 void ui_set_colourmap(void* map)
638 {
639 // destoy old colormap
640 ui_destroy_colourmap(CM);
641 CM = (QColorMap*)map;
642 }
643
644 /*****************************************************************************/
645 HBITMAP ui_create_bitmap(int width, int height, uint8* data)
646 {
647 QImage* Image = NULL;
648 QPixmap* Pixmap;
649 uint32* d = NULL;
650 uint16* s;
651 switch (g_server_bpp)
652 {
653 case 8:
654 Image = new QImage(data, width, height, 8, (QRgb*)&CM->RGBColors,
655 CM->NumColors, QImage::IgnoreEndian);
656 break;
657 case 15:
658 d = (uint32*)malloc(width * height * 4);
659 s = (uint16*)data;
660 for (int i = 0; i < width * height; i++)
661 d[i] = Color15to32(s[i]);
662 Image = new QImage((uint8*)d, width, height, 32, NULL,
663 0, QImage::IgnoreEndian);
664 break;
665 case 16:
666 d = (uint32*)malloc(width * height * 4);
667 s = (uint16*)data;
668 for (int i = 0; i < width * height; i++)
669 d[i] = Color16to32(s[i]);
670 Image = new QImage((uint8*)d, width, height, 32, NULL,
671 0, QImage::IgnoreEndian);
672 break;
673 case 24:
674 d = (uint32*)malloc(width * height * 4);
675 memset(d, 0, width * height * 4);
676 for (int i = 0; i < width * height; i++)
677 memcpy(d + i, data + i * 3, 3);
678 Image = new QImage((uint8*)d, width, height, 32, NULL,
679 0, QImage::IgnoreEndian);
680 //Image = new QImage(data, width, height, 24, NULL,
681 // 0, QImage::IgnoreEndian);
682 break;
683 }
684 if (Image == NULL)
685 return NULL;
686 Pixmap = new QPixmap();
687 Pixmap->convertFromImage(*Image);
688 delete Image;
689 if (d != NULL)
690 free(d);
691 return (HBITMAP)Pixmap;
692 }
693
694 //******************************************************************************
695 // adjust coordinates for cliping rect
696 BOOL WarpCoords(int* x, int* y, int* cx, int* cy, int* srcx, int* srcy)
697 {
698 int dx, dy;
699 QRect InRect(*x, *y, *cx, *cy);
700 QRect OutRect;
701 QRect CRect = ClipRect->boundingRect();
702 OutRect = InRect.intersect(CRect);
703 if (OutRect.isEmpty())
704 return False;
705 dx = OutRect.x() - InRect.x();
706 dy = OutRect.y() - InRect.y();
707 *x = OutRect.x();
708 *y = OutRect.y();
709 *cx = OutRect.width();
710 *cy = OutRect.height();
711 *srcx = *srcx + dx;
712 *srcy = *srcy + dy;
713 return True;
714 }
715
716 //******************************************************************************
717 // needed because bitBlt don't seem to care about clipping rects
718 // also has 2 dsts and src can be nil
719 void bitBltClip(QPaintDevice* dst1, QPaintDevice* dst2, int dx, int dy,
720 QPaintDevice* src, int sx, int sy, int sw, int sh,
721 Qt::RasterOp rop, bool im)
722 {
723 if (WarpCoords(&dx, &dy, &sw, &sh, &sx, &sy))
724 {
725 if (dst1 != NULL)
726 if (src == NULL)
727 bitBlt(dst1, dx, dy, dst1, sx, sy, sw, sh, rop, im);
728 else
729 bitBlt(dst1, dx, dy, src, sx, sy, sw, sh, rop, im);
730 if (dst2 != NULL)
731 if (src == NULL)
732 bitBlt(dst2, dx, dy, dst2, sx, sy, sw, sh, rop, im);
733 else
734 bitBlt(dst2, dx, dy, src, sx, sy, sw, sh, rop, im);
735 }
736 }
737
738 #define DO_GLYPH(ttext,idx) \
739 {\
740 glyph = cache_get_font (font, ttext[idx]);\
741 if (!(flags & TEXT2_IMPLICIT_X))\
742 {\
743 xyoffset = ttext[++idx];\
744 if ((xyoffset & 0x80))\
745 {\
746 if (flags & TEXT2_VERTICAL) \
747 y += ttext[idx+1] | (ttext[idx+2] << 8);\
748 else\
749 x += ttext[idx+1] | (ttext[idx+2] << 8);\
750 idx += 2;\
751 }\
752 else\
753 {\
754 if (flags & TEXT2_VERTICAL) \
755 y += xyoffset;\
756 else\
757 x += xyoffset;\
758 }\
759 }\
760 if (glyph != NULL)\
761 {\
762 P2->drawPixmap(x + glyph->offset, y + glyph->baseline, *((QBitmap*)glyph->pixmap)); \
763 if (flags & TEXT2_IMPLICIT_X)\
764 x += glyph->width;\
765 }\
766 }
767
768 //*****************************************************************************
769 void ui_draw_text(uint8 font, uint8 flags, int mixmode,
770 int x, int y, int clipx, int clipy,
771 int clipcx, int clipcy, int boxx,
772 int boxy, int boxcx, int boxcy, int bgcolour,
773 int fgcolour, uint8 * text, uint8 length)
774 {
775 FONTGLYPH *glyph;
776 int i, j, xyoffset;
777 DATABLOB *entry;
778
779 SetColorx(&Color1, fgcolour);
780 SetColorx(&Color2, bgcolour);
781 P2->setBackgroundColor(Color2);
782 P2->setPen(Color1);
783 if (boxcx > 1)
784 P2->fillRect(boxx, boxy, boxcx, boxcy, QBrush(Color2));
785 else if (mixmode == MIX_OPAQUE)
786 P2->fillRect(clipx, clipy, clipcx, clipcy, QBrush(Color2));
787
788 /* Paint text, character by character */
789 for (i = 0; i < length;)
790 {
791 switch (text[i])
792 {
793 case 0xff:
794 if (i + 2 < length)
795 cache_put_text(text[i + 1], text, text[i + 2]);
796 else
797 {
798 error("this shouldn't be happening\n");
799 exit(1);
800 }
801 /* this will move pointer from start to first character after FF command */
802 length -= i + 3;
803 text = &(text[i + 3]);
804 i = 0;
805 break;
806
807 case 0xfe:
808 entry = cache_get_text(text[i + 1]);
809 if (entry != NULL)
810 {
811 if ((((uint8 *) (entry->data))[1] == 0) && (!(flags & TEXT2_IMPLICIT_X)))
812 {
813 if (flags & TEXT2_VERTICAL)
814 y += text[i + 2];
815 else
816 x += text[i + 2];
817 }
818 for (j = 0; j < entry->size; j++)
819 DO_GLYPH(((uint8 *) (entry->data)), j);
820 }
821 if (i + 2 < length)
822 i += 3;
823 else
824 i += 2;
825 length -= i;
826 /* this will move pointer from start to first character after FE command */
827 text = &(text[i]);
828 i = 0;
829 break;
830
831 default:
832 DO_GLYPH(text, i);
833 i++;
834 break;
835 }
836 }
837 if (boxcx > 1)
838 bitBltClip(MW, NULL, boxx, boxy, BS, boxx, boxy, boxcx, boxcy, Qt::CopyROP, true);
839 else
840 bitBltClip(MW, NULL, clipx, clipy, BS, clipx, clipy, clipcx, clipcy, Qt::CopyROP, true);
841 }
842
843 /*****************************************************************************/
844 void ui_line(uint8 opcode, int startx, int starty, int endx, int endy,
845 PEN* pen)
846 {
847 SetColorx(&Color1, pen->colour);
848 SetOpCode(opcode);
849 P1->setPen(Color1);
850 P1->moveTo(startx, starty);
851 P1->lineTo(endx, endy);
852 P2->setPen(Color1);
853 P2->moveTo(startx, starty);
854 P2->lineTo(endx, endy);
855 ResetOpCode(opcode);
856 }
857
858 /*****************************************************************************/
859 void ui_triblt(uint8 opcode, int x, int y, int cx, int cy,
860 HBITMAP src, int srcx, int srcy,
861 BRUSH* brush, int bgcolour, int fgcolour)
862 {
863 }
864
865 /*****************************************************************************/
866 void ui_memblt(uint8 opcode, int x, int y, int cx, int cy,
867 HBITMAP src, int srcx, int srcy)
868 {
869 QPixmap* Pixmap;
870 Pixmap = (QPixmap*)src;
871 if (Pixmap != NULL)
872 {
873 SetOpCode(opcode);
874 P1->drawPixmap(x, y, *Pixmap, srcx, srcy, cx, cy);
875 P2->drawPixmap(x, y, *Pixmap, srcx, srcy, cx, cy);
876 ResetOpCode(opcode);
877 }
878 }
879
880 //******************************************************************************
881 void CommonDeskSave(QPixmap* Pixmap1, QPixmap* Pixmap2, int Offset, int x,
882 int y, int cx, int cy, int dir)
883 {
884 int lx;
885 int ly;
886 int x1;
887 int y1;
888 int width;
889 int lcx;
890 int right;
891 int bottom;
892 lx = Offset % 480;
893 ly = Offset / 480;
894 y1 = y;
895 right = x + cx;
896 bottom = y + cy;
897 while (y1 < bottom)
898 {
899 x1 = x;
900 lcx = cx;
901 while (x1 < right)
902 {
903 width = 480 - lx;
904 if (width > lcx)
905 width = lcx;
906 if (dir == 0)
907 bitBlt(Pixmap1, lx, ly, Pixmap2, x1, y1, width, 1, Qt::CopyROP, true);
908 else
909 bitBlt(Pixmap2, x1, y1, Pixmap1, lx, ly, width, 1, Qt::CopyROP, true);
910 lx = lx + width;
911 if (lx >= 480)
912 {
913 lx = 0;
914 ly++;
915 if (ly >= 480)
916 ly = 0;
917 }
918 lcx = lcx - width;
919 x1 = x1 + width;
920 }
921 y1++;
922 }
923 }
924
925 /*****************************************************************************/
926 void ui_desktop_restore(uint32 offset, int x, int y, int cx, int cy)
927 {
928 QPixmap* Pixmap;
929 Pixmap = new QPixmap(cx, cy);
930 CommonDeskSave(DS, Pixmap, offset, 0, 0, cx, cy, 1);
931 bitBltClip(MW, BS, x, y, Pixmap, 0, 0, cx, cy, Qt::CopyROP, true);
932 delete Pixmap;
933 }
934
935 /*****************************************************************************/
936 void ui_desktop_save(uint32 offset, int x, int y, int cx, int cy)
937 {
938 CommonDeskSave(DS, BS, offset, x, y, cx, cy, 0);
939 }
940
941 /*****************************************************************************/
942 void ui_rect(int x, int y, int cx, int cy, int colour)
943 {
944 SetColorx(&Color1, colour);
945 P1->fillRect(x, y, cx, cy, QBrush(Color1));
946 P2->fillRect(x, y, cx, cy, QBrush(Color1));
947 }
948
949 /*****************************************************************************/
950 void ui_screenblt(uint8 opcode, int x, int y, int cx, int cy,
951 int srcx, int srcy)
952 {
953 SetOpCode(opcode);
954 bitBltClip(MW, BS, x, y, NULL, srcx, srcy, cx, cy, Qt::CopyROP, true);
955 ResetOpCode(opcode);
956 }
957
958 /*****************************************************************************/
959 void ui_patblt(uint8 opcode, int x, int y, int cx, int cy,
960 BRUSH* brush, int bgcolour, int fgcolour)
961 {
962 QBitmap* Bitmap;
963 QBrush* Brush;
964 uint8 ipattern[8], i;
965 SetOpCode(opcode);
966 switch (brush->style)
967 {
968 case 0:
969 SetColorx(&Color1, fgcolour);
970 P2->fillRect(x, y, cx, cy, QBrush(Color1));
971 break;
972 case 3:
973 SetColorx(&Color1, fgcolour);
974 SetColorx(&Color2, bgcolour);
975 for (i = 0; i != 8; i++)
976 ipattern[7 - i] = ~brush->pattern[i];
977 Bitmap = new QBitmap(8, 8, ipattern);
978 Brush = new QBrush(Color1, *Bitmap);
979 P2->setBackgroundMode(Qt::OpaqueMode);
980 P2->setBrushOrigin(brush->xorigin, brush->yorigin);
981 P2->setBackgroundColor(Color2);
982 P2->fillRect(x, y, cx, cy, *Brush);
983 delete Brush;
984 delete Bitmap;
985 P2->setBackgroundMode(Qt::TransparentMode);
986 P2->setBrushOrigin(0, 0);
987 break;
988 }
989 ResetOpCode(opcode);
990 bitBltClip(MW, NULL, x, y, BS, x, y, cx, cy, Qt::CopyROP, true);
991 }
992
993 /*****************************************************************************/
994 void ui_destblt(uint8 opcode, int x, int y, int cx, int cy)
995 {
996 SetOpCode(opcode);
997 P1->fillRect(x, y, cx, cy, QBrush(QColor("black")));
998 P2->fillRect(x, y, cx, cy, QBrush(QColor("black")));
999 ResetOpCode(opcode);
1000 }
1001
1002 /*****************************************************************************/
1003 void ui_move_pointer(int x, int y)
1004 {
1005 }
1006
1007 /*****************************************************************************/
1008 void ui_set_null_cursor(void)
1009 {
1010 }
1011
1012 /*****************************************************************************/
1013 void ui_paint_bitmap(int x, int y, int cx, int cy,
1014 int width, int height, uint8* data)
1015 {
1016 QImage* Image = NULL;
1017 QPixmap* Pixmap;
1018 uint32* d = NULL;
1019 uint16* s;
1020 switch (g_server_bpp)
1021 {
1022 case 8:
1023 Image = new QImage(data, width, height, 8, (QRgb*)&CM->RGBColors,
1024 CM->NumColors, QImage::IgnoreEndian);
1025 break;
1026 case 15:
1027 d = (uint32*)malloc(width * height * 4);
1028 s = (uint16*)data;
1029 for (int i = 0; i < width * height; i++)
1030 d[i] = Color15to32(s[i]);
1031 Image = new QImage((uint8*)d, width, height, 32, NULL,
1032 0, QImage::IgnoreEndian);
1033 break;
1034 case 16:
1035 d = (uint32*)malloc(width * height * 4);
1036 s = (uint16*)data;
1037 for (int i = 0; i < width * height; i++)
1038 d[i] = Color16to32(s[i]);
1039 Image = new QImage((uint8*)d, width, height, 32, NULL,
1040 0, QImage::IgnoreEndian);
1041 break;
1042 case 24:
1043 d = (uint32*)malloc(width * height * 4);
1044 memset(d, 0, width * height * 4);
1045 for (int i = 0; i < width * height; i++)
1046 memcpy(d + i, data + i * 3, 3);
1047 Image = new QImage((uint8*)d, width, height, 32, NULL,
1048 0, QImage::IgnoreEndian);
1049 break;
1050 }
1051 if (Image == NULL)
1052 return;
1053 Pixmap = new QPixmap();
1054 Pixmap->convertFromImage(*Image);
1055 P1->drawPixmap(x, y, *Pixmap, 0, 0, cx, cy);
1056 P2->drawPixmap(x, y, *Pixmap, 0, 0, cx, cy);
1057 delete Image;
1058 delete Pixmap;
1059 if (d != NULL)
1060 free(d);
1061 }
1062
1063 //******************************************************************************
1064 BOOL Is24On(uint8* Data, int X, int Y)
1065 {
1066 uint8 R, G, B;
1067 int Start;
1068 Start = Y * 32 * 3 + X * 3;
1069 R = Data[Start];
1070 G = Data[Start + 1];
1071 B = Data[Start + 2];
1072 return !((R == 0) && (G == 0) && (B == 0));
1073 }
1074
1075 //******************************************************************************
1076 BOOL Is1On(uint8* Data, int X, int Y)
1077 {
1078 int Start;
1079 int Shift;
1080 Start = (Y * 32) / 8 + X / 8;
1081 Shift = X % 8;
1082 return (Data[Start] & (0x80 >> Shift)) == 0;
1083 }
1084
1085 //******************************************************************************
1086 void Set1(uint8* Data, int X, int Y)
1087 {
1088 int Start;
1089 int Shift;
1090 Start = (Y * 32) / 8 + X / 8;
1091 Shift = X % 8;
1092 Data[Start] = Data[Start] | (0x80 >> Shift);
1093 }
1094
1095 //******************************************************************************
1096 void FlipOver(uint8* Data)
1097 {
1098 uint8 AData[128];
1099 int Index;
1100 memcpy(AData, Data, 128);
1101 for (Index = 0; Index <= 31; Index++)
1102 {
1103 Data[127 - (Index * 4 + 3)] = AData[Index * 4];
1104 Data[127 - (Index * 4 + 2)] = AData[Index * 4 + 1];
1105 Data[127 - (Index * 4 + 1)] = AData[Index * 4 + 2];
1106 Data[127 - Index * 4] = AData[Index * 4 + 3];
1107 }
1108 }
1109
1110 /*****************************************************************************/
1111 void ui_set_cursor(HCURSOR cursor)
1112 {
1113 QCursor* Cursor;
1114 Cursor = (QCursor*)cursor;
1115 if (Cursor != NULL)
1116 MW->setCursor(*Cursor);
1117 }
1118
1119 /*****************************************************************************/
1120 HCURSOR ui_create_cursor(unsigned int x, unsigned int y,
1121 int width, int height,
1122 uint8* andmask, uint8* xormask)
1123 {
1124 uint8 AData[128];
1125 uint8 AMask[128];
1126 QBitmap* DataBitmap;
1127 QBitmap* MaskBitmap;
1128 QCursor* Cursor;
1129 int I1;
1130 int I2;
1131 BOOL BOn;
1132 BOOL MOn;
1133 if (width != 32 || height != 32)
1134 return 0;
1135 memset(AData, 0, 128);
1136 memset(AMask, 0, 128);
1137 for (I1 = 0; I1 <= 31; I1++)
1138 for (I2 = 0; I2 <= 31; I2++)
1139 {
1140 MOn = Is24On(xormask, I1, I2);
1141 BOn = Is1On(andmask, I1, I2);
1142 if (BOn ^ MOn) // xor
1143 {
1144 Set1(AData, I1, I2);
1145 if (!MOn)
1146 Set1(AMask, I1, I2);
1147 }
1148 if (MOn)
1149 Set1(AMask, I1, I2);
1150 }
1151 FlipOver(AData);
1152 FlipOver(AMask);
1153 DataBitmap = new QBitmap(32, 32, AData);
1154 MaskBitmap = new QBitmap(32, 32, AMask);
1155 Cursor = new QCursor(*DataBitmap, *MaskBitmap, x, y);
1156 delete DataBitmap;
1157 delete MaskBitmap;
1158 return Cursor;
1159 }
1160
1161 /*****************************************************************************/
1162 uint16 ui_get_numlock_state(unsigned int state)
1163 {
1164 return 0;
1165 }
1166
1167 /*****************************************************************************/
1168 unsigned int read_keyboard_state(void)
1169 {
1170 return 0;
1171 }
1172
1173 /*****************************************************************************/
1174 void ui_resize_window(void)
1175 {
1176 }
1177
1178 /*****************************************************************************/
1179 void generate_random(uint8* random)
1180 {
1181 QFile File("/dev/random");
1182 File.open(IO_ReadOnly);
1183 if (File.readBlock((char*)random, 32) == 32)
1184 return;
1185 warning("no /dev/random\n");
1186 memcpy(random, "12345678901234567890123456789012", 32);
1187 }
1188
1189 /*****************************************************************************/
1190 void save_licence(uint8* data, int length)
1191 {
1192 }
1193
1194 /*****************************************************************************/
1195 int load_licence(uint8** data)
1196 {
1197 return 0;
1198 }
1199
1200 /*****************************************************************************/
1201 void* xrealloc(void* in_val, int size)
1202 {
1203 return realloc(in_val, size);
1204 }
1205
1206 /*****************************************************************************/
1207 void* xmalloc(int size)
1208 {
1209 return malloc(size);
1210 }
1211
1212 /*****************************************************************************/
1213 void xfree(void* in_val)
1214 {
1215 free(in_val);
1216 }
1217
1218 /*****************************************************************************/
1219 void warning(char* format, ...)
1220 {
1221 va_list ap;
1222
1223 fprintf(stderr, "WARNING: ");
1224 va_start(ap, format);
1225 vfprintf(stderr, format, ap);
1226 va_end(ap);
1227 }
1228
1229 /*****************************************************************************/
1230 void unimpl(char* format, ...)
1231 {
1232 va_list ap;
1233
1234 fprintf(stderr, "NOT IMPLEMENTED: ");
1235 va_start(ap, format);
1236 vfprintf(stderr, format, ap);
1237 va_end(ap);
1238 }
1239
1240 /*****************************************************************************/
1241 void error(char* format, ...)
1242 {
1243 va_list ap;
1244
1245 fprintf(stderr, "ERROR: ");
1246 va_start(ap, format);
1247 vfprintf(stderr, format, ap);
1248 va_end(ap);
1249 }
1250
1251 /*****************************************************************************/
1252 /* produce a hex dump */
1253 void hexdump(unsigned char *p, unsigned int len)
1254 {
1255 unsigned char *line = p;
1256 int i, thisline;
1257 unsigned int offset = 0;
1258
1259 while (offset < len)
1260 {
1261 printf("%04x ", offset);
1262 thisline = len - offset;
1263 if (thisline > 16)
1264 thisline = 16;
1265 for (i = 0; i < thisline; i++)
1266 printf("%02x ", line[i]);
1267 for (; i < 16; i++)
1268 printf(" ");
1269 for (i = 0; i < thisline; i++)
1270 printf("%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.');
1271 printf("\n");
1272 offset += thisline;
1273 line += thisline;
1274 }
1275 }
1276
1277 BOOL rd_pstcache_mkdir(void)
1278 {
1279 return 0;
1280 }
1281
1282 /*****************************************************************************/
1283 int rd_open_file(char *filename)
1284 {
1285 return 0;
1286 }
1287
1288 /*****************************************************************************/
1289 void rd_close_file(int fd)
1290 {
1291 return;
1292 }
1293
1294 /*****************************************************************************/
1295 int rd_read_file(int fd, void *ptr, int len)
1296 {
1297 return 0;
1298 }
1299
1300 /*****************************************************************************/
1301 int rd_write_file(int fd, void* ptr, int len)
1302 {
1303 return 0;
1304 }
1305
1306 /*****************************************************************************/
1307 int rd_lseek_file(int fd, int offset)
1308 {
1309 return 0;
1310 }
1311
1312 /*****************************************************************************/
1313 BOOL rd_lock_file(int fd, int start, int len)
1314 {
1315 return False;
1316 }
1317
1318 /*****************************************************************************/
1319 void get_username_and_hostname(void)
1320 {
1321 char fullhostname[64];
1322 char* p;
1323 struct passwd* pw;
1324
1325 STRNCPY(g_username, "unknown", sizeof(g_username));
1326 STRNCPY(g_hostname, "unknown", sizeof(g_hostname));
1327 pw = getpwuid(getuid());
1328 if (pw != NULL && pw->pw_name != NULL)
1329 {
1330 STRNCPY(g_username, pw->pw_name, sizeof(g_username));
1331 }
1332 if (gethostname(fullhostname, sizeof(fullhostname)) != -1)
1333 {
1334 p = strchr(fullhostname, '.');
1335 if (p != NULL)
1336 *p = 0;
1337 STRNCPY(g_hostname, fullhostname, sizeof(g_hostname));
1338 }
1339 }
1340
1341 /*****************************************************************************/
1342 int parse_parameters(int in_argc, char** in_argv)
1343 {
1344 int i;
1345 char* p;
1346
1347 if (in_argc <= 1)
1348 return 0;
1349 g_argc = in_argc;
1350 g_argv = in_argv;
1351 for (i = 1; i < in_argc; i++)
1352 {
1353 strcpy(g_servername, in_argv[i]);
1354 if (strcmp(in_argv[i], "-g") == 0)
1355 {
1356 g_width = strtol(in_argv[i + 1], &p, 10);
1357 if (g_width <= 0)
1358 {
1359 error("invalid geometry\n");
1360 return 0;
1361 }
1362 if (*p == 'x')
1363 g_height = strtol(p + 1, NULL, 10);
1364 if (g_height <= 0)
1365 {
1366 error("invalid geometry\n");
1367 return 0;
1368 }
1369 g_width = (g_width + 3) & ~3;
1370 }
1371 else if (strcmp(in_argv[i], "-T") == 0)
1372 strcpy(g_title, in_argv[i + 1]);
1373 else if (strcmp(in_argv[i], "-4") == 0)
1374 g_use_rdp5 = 0;
1375 else if (strcmp(in_argv[i], "-5") == 0)
1376 g_use_rdp5 = 1;
1377 else if (strcmp(in_argv[i], "-a") == 0)
1378 {
1379 g_server_bpp = strtol(in_argv[i + 1], &p, 10);
1380 if (g_server_bpp != 8 && g_server_bpp != 15 &&
1381 g_server_bpp != 16 && g_server_bpp != 24)
1382 {
1383 error("invalid bpp\n");
1384 return 0;
1385 }
1386 }
1387 else if (strcmp(in_argv[i], "-t") == 0)
1388 g_tcp_port_rdp = strtol(in_argv[i + 1], &p, 10);
1389 }
1390 return 1;
1391 }
1392
1393 /*****************************************************************************/
1394 int main(int in_argc, char** in_argv)
1395 {
1396 get_username_and_hostname();
1397 if (!parse_parameters(in_argc, in_argv))
1398 return 0;
1399 if (!ui_init())
1400 return 1;
1401 if (!ui_create_window())
1402 return 1;
1403 ui_main_loop();
1404 ui_destroy_window();
1405 ui_deinit();
1406 return 0;
1407 }

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26