/[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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 729 - (hide annotations)
Sun Jun 27 19:38:18 2004 UTC (20 years ago) by jsorg71
File size: 40591 byte(s)
out supported parameters when passing none

1 jsorg71 715 /*
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 jsorg71 727 int g_bitmap_cache_persist_enable = False;
54     int g_bitmap_cache_precache = True;
55 jsorg71 715 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     // start notifier
521     SocketNotifier = new QSocketNotifier(g_sock, QSocketNotifier::Read, MW);
522     MW->connect(SocketNotifier, SIGNAL(activated(int)), MW, SLOT(dataReceived()));
523     UpAndRunning = 1;
524     // app main loop
525     App->exec();
526     }
527    
528     //*****************************************************************************
529     void ui_destroy_window(void)
530     {
531     delete MW;
532     delete SV;
533     delete BS;
534     delete DS;
535     delete P1;
536     delete P2;
537     delete ClipRect;
538     }
539    
540     /*****************************************************************************/
541     void ui_bell(void)
542     {
543     }
544    
545     /*****************************************************************************/
546     int ui_select(int in_val)
547     {
548     g_sock = in_val;
549     return 1;
550     }
551    
552     /*****************************************************************************/
553     void ui_destroy_cursor(void* cursor)
554     {
555     QCursor* Cursor;
556     Cursor = (QCursor*)cursor;
557     if (Cursor != NULL)
558     delete Cursor;
559     }
560    
561     /*****************************************************************************/
562     void* ui_create_glyph(int width, int height, uint8* data)
563     {
564     QBitmap* Bitmap;
565     Bitmap = new QBitmap(width, height, data);
566     Bitmap->setMask(*Bitmap);
567     return (HGLYPH)Bitmap;
568     }
569    
570     /*****************************************************************************/
571     void ui_destroy_glyph(void* glyph)
572     {
573     QBitmap* Bitmap;
574     Bitmap = (QBitmap*)glyph;
575     delete Bitmap;
576     }
577    
578     /*****************************************************************************/
579     void ui_destroy_bitmap(void* bmp)
580     {
581     QPixmap* Pixmap;
582     Pixmap = (QPixmap*)bmp;
583     delete Pixmap;
584     }
585    
586     /*****************************************************************************/
587     void ui_reset_clip(void)
588     {
589     P1->setClipRect(0, 0, g_width, g_height);
590     P2->setClipRect(0, 0, g_width, g_height);
591     delete ClipRect;
592     ClipRect = new QRegion(0, 0, g_width, g_height);
593     }
594    
595     /*****************************************************************************/
596     void ui_set_clip(int x, int y, int cx, int cy)
597     {
598     P1->setClipRect(x, y, cx, cy);
599     P2->setClipRect(x, y, cx, cy);
600     delete ClipRect;
601     ClipRect = new QRegion(x, y, cx, cy);
602     }
603    
604     /*****************************************************************************/
605     void* ui_create_colourmap(COLOURMAP* colours)
606     {
607     QColorMap* LCM;
608     int i, r, g, b;
609     LCM = (QColorMap*)malloc(sizeof(QColorMap));
610     memset(LCM, 0, sizeof(QColorMap));
611     i = 0;
612     while (i < colours->ncolours && i < 256)
613     {
614     r = colours->colours[i].red;
615     g = colours->colours[i].green;
616     b = colours->colours[i].blue;
617     LCM->RGBColors[i] = (r << 16) | (g << 8) | b;
618     i++;
619     }
620     LCM->NumColors = colours->ncolours;
621     return LCM;
622     }
623    
624     //*****************************************************************************
625     // todo, does this leak at end of program
626     void ui_destroy_colourmap(HCOLOURMAP map)
627     {
628     QColorMap* LCM;
629     LCM = (QColorMap*)map;
630     if (LCM == NULL)
631     return;
632     free(LCM);
633     }
634    
635     /*****************************************************************************/
636     void ui_set_colourmap(void* map)
637     {
638     // destoy old colormap
639     ui_destroy_colourmap(CM);
640     CM = (QColorMap*)map;
641     }
642    
643     /*****************************************************************************/
644     HBITMAP ui_create_bitmap(int width, int height, uint8* data)
645     {
646     QImage* Image = NULL;
647     QPixmap* Pixmap;
648     uint32* d = NULL;
649     uint16* s;
650     switch (g_server_bpp)
651     {
652     case 8:
653     Image = new QImage(data, width, height, 8, (QRgb*)&CM->RGBColors,
654     CM->NumColors, QImage::IgnoreEndian);
655     break;
656     case 15:
657     d = (uint32*)malloc(width * height * 4);
658     s = (uint16*)data;
659     for (int i = 0; i < width * height; i++)
660     d[i] = Color15to32(s[i]);
661     Image = new QImage((uint8*)d, width, height, 32, NULL,
662     0, QImage::IgnoreEndian);
663     break;
664     case 16:
665     d = (uint32*)malloc(width * height * 4);
666     s = (uint16*)data;
667     for (int i = 0; i < width * height; i++)
668     d[i] = Color16to32(s[i]);
669     Image = new QImage((uint8*)d, width, height, 32, NULL,
670     0, QImage::IgnoreEndian);
671     break;
672     case 24:
673     d = (uint32*)malloc(width * height * 4);
674     memset(d, 0, width * height * 4);
675     for (int i = 0; i < width * height; i++)
676     memcpy(d + i, data + i * 3, 3);
677     Image = new QImage((uint8*)d, width, height, 32, NULL,
678     0, QImage::IgnoreEndian);
679     //Image = new QImage(data, width, height, 24, NULL,
680     // 0, QImage::IgnoreEndian);
681     break;
682     }
683     if (Image == NULL)
684     return NULL;
685     Pixmap = new QPixmap();
686     Pixmap->convertFromImage(*Image);
687     delete Image;
688     if (d != NULL)
689     free(d);
690     return (HBITMAP)Pixmap;
691     }
692    
693     //******************************************************************************
694     // adjust coordinates for cliping rect
695     BOOL WarpCoords(int* x, int* y, int* cx, int* cy, int* srcx, int* srcy)
696     {
697     int dx, dy;
698     QRect InRect(*x, *y, *cx, *cy);
699     QRect OutRect;
700     QRect CRect = ClipRect->boundingRect();
701     OutRect = InRect.intersect(CRect);
702     if (OutRect.isEmpty())
703     return False;
704     dx = OutRect.x() - InRect.x();
705     dy = OutRect.y() - InRect.y();
706     *x = OutRect.x();
707     *y = OutRect.y();
708     *cx = OutRect.width();
709     *cy = OutRect.height();
710     *srcx = *srcx + dx;
711     *srcy = *srcy + dy;
712     return True;
713     }
714    
715     //******************************************************************************
716     // needed because bitBlt don't seem to care about clipping rects
717     // also has 2 dsts and src can be nil
718     void bitBltClip(QPaintDevice* dst1, QPaintDevice* dst2, int dx, int dy,
719     QPaintDevice* src, int sx, int sy, int sw, int sh,
720     Qt::RasterOp rop, bool im)
721     {
722     if (WarpCoords(&dx, &dy, &sw, &sh, &sx, &sy))
723     {
724     if (dst1 != NULL)
725     if (src == NULL)
726     bitBlt(dst1, dx, dy, dst1, sx, sy, sw, sh, rop, im);
727     else
728     bitBlt(dst1, dx, dy, src, sx, sy, sw, sh, rop, im);
729     if (dst2 != NULL)
730     if (src == NULL)
731     bitBlt(dst2, dx, dy, dst2, sx, sy, sw, sh, rop, im);
732     else
733     bitBlt(dst2, dx, dy, src, sx, sy, sw, sh, rop, im);
734     }
735     }
736    
737     #define DO_GLYPH(ttext,idx) \
738     {\
739     glyph = cache_get_font (font, ttext[idx]);\
740     if (!(flags & TEXT2_IMPLICIT_X))\
741     {\
742     xyoffset = ttext[++idx];\
743     if ((xyoffset & 0x80))\
744     {\
745     if (flags & TEXT2_VERTICAL) \
746     y += ttext[idx+1] | (ttext[idx+2] << 8);\
747     else\
748     x += ttext[idx+1] | (ttext[idx+2] << 8);\
749     idx += 2;\
750     }\
751     else\
752     {\
753     if (flags & TEXT2_VERTICAL) \
754     y += xyoffset;\
755     else\
756     x += xyoffset;\
757     }\
758     }\
759     if (glyph != NULL)\
760     {\
761     P2->drawPixmap(x + glyph->offset, y + glyph->baseline, *((QBitmap*)glyph->pixmap)); \
762     if (flags & TEXT2_IMPLICIT_X)\
763     x += glyph->width;\
764     }\
765     }
766    
767     //*****************************************************************************
768     void ui_draw_text(uint8 font, uint8 flags, int mixmode,
769     int x, int y, int clipx, int clipy,
770     int clipcx, int clipcy, int boxx,
771     int boxy, int boxcx, int boxcy, int bgcolour,
772     int fgcolour, uint8 * text, uint8 length)
773     {
774     FONTGLYPH *glyph;
775     int i, j, xyoffset;
776     DATABLOB *entry;
777    
778     SetColorx(&Color1, fgcolour);
779     SetColorx(&Color2, bgcolour);
780     P2->setBackgroundColor(Color2);
781     P2->setPen(Color1);
782     if (boxcx > 1)
783     P2->fillRect(boxx, boxy, boxcx, boxcy, QBrush(Color2));
784     else if (mixmode == MIX_OPAQUE)
785     P2->fillRect(clipx, clipy, clipcx, clipcy, QBrush(Color2));
786    
787     /* Paint text, character by character */
788     for (i = 0; i < length;)
789     {
790     switch (text[i])
791     {
792     case 0xff:
793     if (i + 2 < length)
794     cache_put_text(text[i + 1], text, text[i + 2]);
795     else
796     {
797     error("this shouldn't be happening\n");
798     exit(1);
799     }
800     /* this will move pointer from start to first character after FF command */
801     length -= i + 3;
802     text = &(text[i + 3]);
803     i = 0;
804     break;
805    
806     case 0xfe:
807     entry = cache_get_text(text[i + 1]);
808     if (entry != NULL)
809     {
810     if ((((uint8 *) (entry->data))[1] == 0) && (!(flags & TEXT2_IMPLICIT_X)))
811     {
812     if (flags & TEXT2_VERTICAL)
813     y += text[i + 2];
814     else
815     x += text[i + 2];
816     }
817     for (j = 0; j < entry->size; j++)
818     DO_GLYPH(((uint8 *) (entry->data)), j);
819     }
820     if (i + 2 < length)
821     i += 3;
822     else
823     i += 2;
824     length -= i;
825     /* this will move pointer from start to first character after FE command */
826     text = &(text[i]);
827     i = 0;
828     break;
829    
830     default:
831     DO_GLYPH(text, i);
832     i++;
833     break;
834     }
835     }
836     if (boxcx > 1)
837     bitBltClip(MW, NULL, boxx, boxy, BS, boxx, boxy, boxcx, boxcy, Qt::CopyROP, true);
838     else
839     bitBltClip(MW, NULL, clipx, clipy, BS, clipx, clipy, clipcx, clipcy, Qt::CopyROP, true);
840     }
841    
842     /*****************************************************************************/
843     void ui_line(uint8 opcode, int startx, int starty, int endx, int endy,
844     PEN* pen)
845     {
846     SetColorx(&Color1, pen->colour);
847     SetOpCode(opcode);
848     P1->setPen(Color1);
849     P1->moveTo(startx, starty);
850     P1->lineTo(endx, endy);
851     P2->setPen(Color1);
852     P2->moveTo(startx, starty);
853     P2->lineTo(endx, endy);
854     ResetOpCode(opcode);
855     }
856    
857     /*****************************************************************************/
858     void ui_triblt(uint8 opcode, int x, int y, int cx, int cy,
859     HBITMAP src, int srcx, int srcy,
860     BRUSH* brush, int bgcolour, int fgcolour)
861     {
862     }
863    
864     /*****************************************************************************/
865     void ui_memblt(uint8 opcode, int x, int y, int cx, int cy,
866     HBITMAP src, int srcx, int srcy)
867     {
868     QPixmap* Pixmap;
869     Pixmap = (QPixmap*)src;
870     if (Pixmap != NULL)
871     {
872     SetOpCode(opcode);
873     P1->drawPixmap(x, y, *Pixmap, srcx, srcy, cx, cy);
874     P2->drawPixmap(x, y, *Pixmap, srcx, srcy, cx, cy);
875     ResetOpCode(opcode);
876     }
877     }
878    
879     //******************************************************************************
880     void CommonDeskSave(QPixmap* Pixmap1, QPixmap* Pixmap2, int Offset, int x,
881     int y, int cx, int cy, int dir)
882     {
883     int lx;
884     int ly;
885     int x1;
886     int y1;
887     int width;
888     int lcx;
889     int right;
890     int bottom;
891     lx = Offset % 480;
892     ly = Offset / 480;
893     y1 = y;
894     right = x + cx;
895     bottom = y + cy;
896     while (y1 < bottom)
897     {
898     x1 = x;
899     lcx = cx;
900     while (x1 < right)
901     {
902     width = 480 - lx;
903     if (width > lcx)
904     width = lcx;
905     if (dir == 0)
906     bitBlt(Pixmap1, lx, ly, Pixmap2, x1, y1, width, 1, Qt::CopyROP, true);
907     else
908     bitBlt(Pixmap2, x1, y1, Pixmap1, lx, ly, width, 1, Qt::CopyROP, true);
909     lx = lx + width;
910     if (lx >= 480)
911     {
912     lx = 0;
913     ly++;
914     if (ly >= 480)
915     ly = 0;
916     }
917     lcx = lcx - width;
918     x1 = x1 + width;
919     }
920     y1++;
921     }
922     }
923    
924     /*****************************************************************************/
925     void ui_desktop_restore(uint32 offset, int x, int y, int cx, int cy)
926     {
927     QPixmap* Pixmap;
928     Pixmap = new QPixmap(cx, cy);
929     CommonDeskSave(DS, Pixmap, offset, 0, 0, cx, cy, 1);
930     bitBltClip(MW, BS, x, y, Pixmap, 0, 0, cx, cy, Qt::CopyROP, true);
931     delete Pixmap;
932     }
933    
934     /*****************************************************************************/
935     void ui_desktop_save(uint32 offset, int x, int y, int cx, int cy)
936     {
937     CommonDeskSave(DS, BS, offset, x, y, cx, cy, 0);
938     }
939    
940     /*****************************************************************************/
941     void ui_rect(int x, int y, int cx, int cy, int colour)
942     {
943     SetColorx(&Color1, colour);
944     P1->fillRect(x, y, cx, cy, QBrush(Color1));
945     P2->fillRect(x, y, cx, cy, QBrush(Color1));
946     }
947    
948     /*****************************************************************************/
949     void ui_screenblt(uint8 opcode, int x, int y, int cx, int cy,
950     int srcx, int srcy)
951     {
952     SetOpCode(opcode);
953     bitBltClip(MW, BS, x, y, NULL, srcx, srcy, cx, cy, Qt::CopyROP, true);
954     ResetOpCode(opcode);
955     }
956    
957     /*****************************************************************************/
958     void ui_patblt(uint8 opcode, int x, int y, int cx, int cy,
959     BRUSH* brush, int bgcolour, int fgcolour)
960     {
961     QBitmap* Bitmap;
962     QBrush* Brush;
963     uint8 ipattern[8], i;
964     SetOpCode(opcode);
965     switch (brush->style)
966     {
967     case 0:
968     SetColorx(&Color1, fgcolour);
969     P2->fillRect(x, y, cx, cy, QBrush(Color1));
970     break;
971     case 3:
972     SetColorx(&Color1, fgcolour);
973     SetColorx(&Color2, bgcolour);
974     for (i = 0; i != 8; i++)
975     ipattern[7 - i] = ~brush->pattern[i];
976     Bitmap = new QBitmap(8, 8, ipattern);
977     Brush = new QBrush(Color1, *Bitmap);
978     P2->setBackgroundMode(Qt::OpaqueMode);
979     P2->setBrushOrigin(brush->xorigin, brush->yorigin);
980     P2->setBackgroundColor(Color2);
981     P2->fillRect(x, y, cx, cy, *Brush);
982     delete Brush;
983     delete Bitmap;
984     P2->setBackgroundMode(Qt::TransparentMode);
985     P2->setBrushOrigin(0, 0);
986     break;
987     }
988     ResetOpCode(opcode);
989     bitBltClip(MW, NULL, x, y, BS, x, y, cx, cy, Qt::CopyROP, true);
990     }
991    
992     /*****************************************************************************/
993     void ui_destblt(uint8 opcode, int x, int y, int cx, int cy)
994     {
995     SetOpCode(opcode);
996     P1->fillRect(x, y, cx, cy, QBrush(QColor("black")));
997     P2->fillRect(x, y, cx, cy, QBrush(QColor("black")));
998     ResetOpCode(opcode);
999     }
1000    
1001     /*****************************************************************************/
1002     void ui_move_pointer(int x, int y)
1003     {
1004     }
1005    
1006     /*****************************************************************************/
1007     void ui_set_null_cursor(void)
1008     {
1009     }
1010    
1011     /*****************************************************************************/
1012     void ui_paint_bitmap(int x, int y, int cx, int cy,
1013     int width, int height, uint8* data)
1014     {
1015     QImage* Image = NULL;
1016     QPixmap* Pixmap;
1017     uint32* d = NULL;
1018     uint16* s;
1019     switch (g_server_bpp)
1020     {
1021     case 8:
1022     Image = new QImage(data, width, height, 8, (QRgb*)&CM->RGBColors,
1023     CM->NumColors, QImage::IgnoreEndian);
1024     break;
1025     case 15:
1026     d = (uint32*)malloc(width * height * 4);
1027     s = (uint16*)data;
1028     for (int i = 0; i < width * height; i++)
1029     d[i] = Color15to32(s[i]);
1030     Image = new QImage((uint8*)d, width, height, 32, NULL,
1031     0, QImage::IgnoreEndian);
1032     break;
1033     case 16:
1034     d = (uint32*)malloc(width * height * 4);
1035     s = (uint16*)data;
1036     for (int i = 0; i < width * height; i++)
1037     d[i] = Color16to32(s[i]);
1038     Image = new QImage((uint8*)d, width, height, 32, NULL,
1039     0, QImage::IgnoreEndian);
1040     break;
1041     case 24:
1042     d = (uint32*)malloc(width * height * 4);
1043     memset(d, 0, width * height * 4);
1044     for (int i = 0; i < width * height; i++)
1045     memcpy(d + i, data + i * 3, 3);
1046     Image = new QImage((uint8*)d, width, height, 32, NULL,
1047     0, QImage::IgnoreEndian);
1048     break;
1049     }
1050     if (Image == NULL)
1051     return;
1052     Pixmap = new QPixmap();
1053     Pixmap->convertFromImage(*Image);
1054     P1->drawPixmap(x, y, *Pixmap, 0, 0, cx, cy);
1055     P2->drawPixmap(x, y, *Pixmap, 0, 0, cx, cy);
1056     delete Image;
1057     delete Pixmap;
1058     if (d != NULL)
1059     free(d);
1060     }
1061    
1062     //******************************************************************************
1063     BOOL Is24On(uint8* Data, int X, int Y)
1064     {
1065     uint8 R, G, B;
1066     int Start;
1067     Start = Y * 32 * 3 + X * 3;
1068     R = Data[Start];
1069     G = Data[Start + 1];
1070     B = Data[Start + 2];
1071     return !((R == 0) && (G == 0) && (B == 0));
1072     }
1073    
1074     //******************************************************************************
1075     BOOL Is1On(uint8* Data, int X, int Y)
1076     {
1077     int Start;
1078     int Shift;
1079     Start = (Y * 32) / 8 + X / 8;
1080     Shift = X % 8;
1081     return (Data[Start] & (0x80 >> Shift)) == 0;
1082     }
1083    
1084     //******************************************************************************
1085     void Set1(uint8* Data, int X, int Y)
1086     {
1087     int Start;
1088     int Shift;
1089     Start = (Y * 32) / 8 + X / 8;
1090     Shift = X % 8;
1091     Data[Start] = Data[Start] | (0x80 >> Shift);
1092     }
1093    
1094     //******************************************************************************
1095     void FlipOver(uint8* Data)
1096     {
1097     uint8 AData[128];
1098     int Index;
1099     memcpy(AData, Data, 128);
1100     for (Index = 0; Index <= 31; Index++)
1101     {
1102     Data[127 - (Index * 4 + 3)] = AData[Index * 4];
1103     Data[127 - (Index * 4 + 2)] = AData[Index * 4 + 1];
1104     Data[127 - (Index * 4 + 1)] = AData[Index * 4 + 2];
1105     Data[127 - Index * 4] = AData[Index * 4 + 3];
1106     }
1107     }
1108    
1109     /*****************************************************************************/
1110     void ui_set_cursor(HCURSOR cursor)
1111     {
1112     QCursor* Cursor;
1113     Cursor = (QCursor*)cursor;
1114     if (Cursor != NULL)
1115     MW->setCursor(*Cursor);
1116     }
1117    
1118     /*****************************************************************************/
1119     HCURSOR ui_create_cursor(unsigned int x, unsigned int y,
1120     int width, int height,
1121     uint8* andmask, uint8* xormask)
1122     {
1123     uint8 AData[128];
1124     uint8 AMask[128];
1125     QBitmap* DataBitmap;
1126     QBitmap* MaskBitmap;
1127     QCursor* Cursor;
1128     int I1;
1129     int I2;
1130     BOOL BOn;
1131     BOOL MOn;
1132     if (width != 32 || height != 32)
1133     return 0;
1134     memset(AData, 0, 128);
1135     memset(AMask, 0, 128);
1136     for (I1 = 0; I1 <= 31; I1++)
1137     for (I2 = 0; I2 <= 31; I2++)
1138     {
1139     MOn = Is24On(xormask, I1, I2);
1140     BOn = Is1On(andmask, I1, I2);
1141     if (BOn ^ MOn) // xor
1142     {
1143     Set1(AData, I1, I2);
1144     if (!MOn)
1145     Set1(AMask, I1, I2);
1146     }
1147     if (MOn)
1148     Set1(AMask, I1, I2);
1149     }
1150     FlipOver(AData);
1151     FlipOver(AMask);
1152     DataBitmap = new QBitmap(32, 32, AData);
1153     MaskBitmap = new QBitmap(32, 32, AMask);
1154     Cursor = new QCursor(*DataBitmap, *MaskBitmap, x, y);
1155     delete DataBitmap;
1156     delete MaskBitmap;
1157     return Cursor;
1158     }
1159    
1160     /*****************************************************************************/
1161     uint16 ui_get_numlock_state(unsigned int state)
1162     {
1163     return 0;
1164     }
1165    
1166     /*****************************************************************************/
1167     unsigned int read_keyboard_state(void)
1168     {
1169     return 0;
1170     }
1171    
1172     /*****************************************************************************/
1173     void ui_resize_window(void)
1174     {
1175     }
1176    
1177     /*****************************************************************************/
1178     void generate_random(uint8* random)
1179     {
1180     QFile File("/dev/random");
1181     File.open(IO_ReadOnly);
1182     if (File.readBlock((char*)random, 32) == 32)
1183     return;
1184     warning("no /dev/random\n");
1185     memcpy(random, "12345678901234567890123456789012", 32);
1186     }
1187    
1188     /*****************************************************************************/
1189     void save_licence(uint8* data, int length)
1190     {
1191     }
1192    
1193     /*****************************************************************************/
1194     int load_licence(uint8** data)
1195     {
1196     return 0;
1197     }
1198    
1199     /*****************************************************************************/
1200     void* xrealloc(void* in_val, int size)
1201     {
1202     return realloc(in_val, size);
1203     }
1204    
1205     /*****************************************************************************/
1206     void* xmalloc(int size)
1207     {
1208     return malloc(size);
1209     }
1210    
1211     /*****************************************************************************/
1212     void xfree(void* in_val)
1213     {
1214     free(in_val);
1215     }
1216    
1217     /*****************************************************************************/
1218     void warning(char* format, ...)
1219     {
1220     va_list ap;
1221    
1222     fprintf(stderr, "WARNING: ");
1223     va_start(ap, format);
1224     vfprintf(stderr, format, ap);
1225     va_end(ap);
1226     }
1227    
1228     /*****************************************************************************/
1229     void unimpl(char* format, ...)
1230     {
1231     va_list ap;
1232    
1233     fprintf(stderr, "NOT IMPLEMENTED: ");
1234     va_start(ap, format);
1235     vfprintf(stderr, format, ap);
1236     va_end(ap);
1237     }
1238    
1239     /*****************************************************************************/
1240     void error(char* format, ...)
1241     {
1242     va_list ap;
1243    
1244     fprintf(stderr, "ERROR: ");
1245     va_start(ap, format);
1246     vfprintf(stderr, format, ap);
1247     va_end(ap);
1248     }
1249    
1250     /*****************************************************************************/
1251 jsorg71 729 void out_params(void)
1252     {
1253     fprintf(stderr, "rdesktop: A Remote Desktop Protocol client.\n");
1254     fprintf(stderr, "Version " VERSION ". Copyright (C) 1999-2003 Matt Chapman.\n");
1255     fprintf(stderr, "See http://www.rdesktop.org/ for more information.\n\n");
1256     fprintf(stderr, "Usage: qtrdesktop [options] server\n");
1257     fprintf(stderr, " -g: desktop geometry (WxH)\n");
1258     fprintf(stderr, " -4: use RDP version 4\n");
1259     fprintf(stderr, " -5: use RDP version 5 (default)\n");
1260     fprintf(stderr, " -t: tcp port)\n");
1261     fprintf(stderr, " -a: connection colour depth\n");
1262     fprintf(stderr, " -T: window title\n");
1263     fprintf(stderr, "\n");
1264     }
1265    
1266     /*****************************************************************************/
1267 jsorg71 715 /* produce a hex dump */
1268     void hexdump(unsigned char *p, unsigned int len)
1269     {
1270     unsigned char *line = p;
1271     int i, thisline;
1272     unsigned int offset = 0;
1273    
1274     while (offset < len)
1275     {
1276     printf("%04x ", offset);
1277     thisline = len - offset;
1278     if (thisline > 16)
1279     thisline = 16;
1280     for (i = 0; i < thisline; i++)
1281     printf("%02x ", line[i]);
1282     for (; i < 16; i++)
1283     printf(" ");
1284     for (i = 0; i < thisline; i++)
1285     printf("%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.');
1286     printf("\n");
1287     offset += thisline;
1288     line += thisline;
1289     }
1290     }
1291    
1292 jsorg71 727 BOOL rd_pstcache_mkdir(void)
1293     {
1294     return 0;
1295     }
1296    
1297 jsorg71 715 /*****************************************************************************/
1298 jsorg71 727 int rd_open_file(char *filename)
1299     {
1300     return 0;
1301     }
1302    
1303     /*****************************************************************************/
1304     void rd_close_file(int fd)
1305     {
1306     return;
1307     }
1308    
1309     /*****************************************************************************/
1310     int rd_read_file(int fd, void *ptr, int len)
1311     {
1312     return 0;
1313     }
1314    
1315     /*****************************************************************************/
1316     int rd_write_file(int fd, void* ptr, int len)
1317     {
1318     return 0;
1319     }
1320    
1321     /*****************************************************************************/
1322     int rd_lseek_file(int fd, int offset)
1323     {
1324     return 0;
1325     }
1326    
1327     /*****************************************************************************/
1328     BOOL rd_lock_file(int fd, int start, int len)
1329     {
1330     return False;
1331     }
1332    
1333     /*****************************************************************************/
1334 jsorg71 715 void get_username_and_hostname(void)
1335     {
1336     char fullhostname[64];
1337     char* p;
1338     struct passwd* pw;
1339    
1340     STRNCPY(g_username, "unknown", sizeof(g_username));
1341     STRNCPY(g_hostname, "unknown", sizeof(g_hostname));
1342     pw = getpwuid(getuid());
1343     if (pw != NULL && pw->pw_name != NULL)
1344     {
1345     STRNCPY(g_username, pw->pw_name, sizeof(g_username));
1346     }
1347     if (gethostname(fullhostname, sizeof(fullhostname)) != -1)
1348     {
1349     p = strchr(fullhostname, '.');
1350     if (p != NULL)
1351     *p = 0;
1352     STRNCPY(g_hostname, fullhostname, sizeof(g_hostname));
1353     }
1354     }
1355    
1356     /*****************************************************************************/
1357     int parse_parameters(int in_argc, char** in_argv)
1358     {
1359     int i;
1360     char* p;
1361    
1362     if (in_argc <= 1)
1363 jsorg71 729 {
1364     out_params();
1365 jsorg71 715 return 0;
1366 jsorg71 729 }
1367 jsorg71 715 g_argc = in_argc;
1368     g_argv = in_argv;
1369     for (i = 1; i < in_argc; i++)
1370     {
1371     strcpy(g_servername, in_argv[i]);
1372     if (strcmp(in_argv[i], "-g") == 0)
1373     {
1374     g_width = strtol(in_argv[i + 1], &p, 10);
1375     if (g_width <= 0)
1376     {
1377     error("invalid geometry\n");
1378     return 0;
1379     }
1380     if (*p == 'x')
1381     g_height = strtol(p + 1, NULL, 10);
1382     if (g_height <= 0)
1383     {
1384     error("invalid geometry\n");
1385     return 0;
1386     }
1387     g_width = (g_width + 3) & ~3;
1388     }
1389     else if (strcmp(in_argv[i], "-T") == 0)
1390     strcpy(g_title, in_argv[i + 1]);
1391     else if (strcmp(in_argv[i], "-4") == 0)
1392     g_use_rdp5 = 0;
1393     else if (strcmp(in_argv[i], "-5") == 0)
1394     g_use_rdp5 = 1;
1395     else if (strcmp(in_argv[i], "-a") == 0)
1396     {
1397     g_server_bpp = strtol(in_argv[i + 1], &p, 10);
1398     if (g_server_bpp != 8 && g_server_bpp != 15 &&
1399     g_server_bpp != 16 && g_server_bpp != 24)
1400     {
1401     error("invalid bpp\n");
1402     return 0;
1403     }
1404     }
1405     else if (strcmp(in_argv[i], "-t") == 0)
1406     g_tcp_port_rdp = strtol(in_argv[i + 1], &p, 10);
1407     }
1408     return 1;
1409     }
1410    
1411     /*****************************************************************************/
1412     int main(int in_argc, char** in_argv)
1413     {
1414     get_username_and_hostname();
1415     if (!parse_parameters(in_argc, in_argv))
1416     return 0;
1417     if (!ui_init())
1418     return 1;
1419     if (!ui_create_window())
1420     return 1;
1421     ui_main_loop();
1422     ui_destroy_window();
1423     ui_deinit();
1424     return 0;
1425     }

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26