My Project
X11Gui.h
Go to the documentation of this file.
1#ifndef __cxxtest__X11Gui_h__
2#define __cxxtest__X11Gui_h__
3
4//
5// X11Gui displays a simple progress bar using X11
6//
7// It accepts the following command-line arguments:
8// -title <title> - Sets the application title
9// -fn or -font <font> - Sets the font
10// -bg or -background <color> - Sets the background color (default=Grey)
11// -fg or -foreground <color> - Sets the text color (default=Black)
12// -green/-yellow/-red <color> - Sets the colors of the bar
13//
14
15#include <cxxtest/Gui.h>
16
17#include <X11/Xlib.h>
18#include <X11/Xutil.h>
19#include <stdio.h>
20#include <stdlib.h>
21#include <string.h>
22
23namespace CxxTest
24{
25 class X11Gui : public GuiListener
26 {
27 public:
28 void enterGui( int &argc, char **argv )
29 {
30 parseCommandLine( argc, argv );
31 }
32
33 void enterWorld( const WorldDescription &wd )
34 {
36 if ( _display ) {
39 createGc();
40 createFont();
43 initializeBar( wd );
45 }
46 }
47
48 void guiEnterTest( const char *suiteName, const char *testName )
49 {
50 if ( _display ) {
51 ++ _testsDone;
52 setWindowName( suiteName, testName );
53 redraw();
54 }
55 }
56
57 void yellowBar()
58 {
59 if ( _display ) {
63 }
64 }
65
66 void redBar()
67 {
68 if ( _display ) {
72 }
73 }
74
75 void leaveGui()
76 {
77 if ( _display ) {
79 destroyGc();
82 }
83 }
84
85 private:
86 const char *_programName;
87 Display *_display;
88 Window _window;
95 GC _gc;
96 const char *_fontName;
98 XFontStruct *_fontInfo;
101 Colormap _colormap;
102
103 void parseCommandLine( int &argc, char **argv )
104 {
105 _programName = argv[0];
106
107 _fontName = 0;
108 _foregroundName = "Black";
109 _backgroundName = "Grey";
110 _greenName = "Green";
111 _yellowName = "Yellow";
112 _redName = "Red";
113
114 for ( int i = 1; i + 1 < argc; ++ i ) {
115 if ( !strcmp( argv[i], "-title" ) )
116 _programName = argv[++ i];
117 else if ( !strcmp( argv[i], "-fn" ) || !strcmp( argv[i], "-font" ) )
118 _fontName = argv[++ i];
119 else if ( !strcmp( argv[i], "-fg" ) || !strcmp( argv[i], "-foreground" ) )
120 _foregroundName = argv[++ i];
121 else if ( !strcmp( argv[i], "-bg" ) || !strcmp( argv[i], "-background" ) )
122 _backgroundName = argv[++ i];
123 else if ( !strcmp( argv[i], "-green" ) )
124 _greenName = argv[++ i];
125 else if ( !strcmp( argv[i], "-yellow" ) )
126 _yellowName = argv[++ i];
127 else if ( !strcmp( argv[i], "-red" ) )
128 _redName = argv[++ i];
129 }
130 }
131
133 {
134 _display = XOpenDisplay( NULL );
135 }
136
138 {
139 _colormap = DefaultColormap( _display, 0 );
142 }
143
144 unsigned long getColor( const char *colorName )
145 {
146 XColor color;
147 XParseColor( _display, _colormap, colorName, &color );
148 XAllocColor( _display, _colormap, &color );
149 return color.pixel;
150 }
151
153 {
154 _window = XCreateSimpleWindow( _display, RootWindow( _display, 0 ), 0, 0, 1, 1, 0, 0, _background );
155 }
156
157 void createGc()
158 {
159 _gc = XCreateGC( _display, _window, 0, 0 );
160 }
161
163 {
164 if ( !loadFont() )
166 getFontInfo();
167 _textHeight = _fontInfo->ascent + _fontInfo->descent;
168 _textDescent = _fontInfo->descent;
169 }
170
171 bool loadFont()
172 {
173 if ( !_fontName )
174 return false;
175 _fontId = XLoadFont( _display, _fontName );
176 return (XSetFont( _display, _gc, _fontId ) == Success);
177 }
178
180 {
181 _fontId = XGContextFromGC( _gc );
182 }
183
185 {
186 _fontInfo = XQueryFont( _display, _fontId );
187 }
188
190 {
191 XFreeFontInfo( NULL, _fontInfo, 1 );
192 }
193
195 {
196 _eventMask = ExposureMask;
197 XSelectInput( _display, _window, _eventMask );
198 }
199
201 {
202 getTotalTests( wd );
203 _testsDone = 0;
205 }
206
208 {
209 getTotalTests( tracker().world() );
210 }
211
213 {
216 }
217
219 {
220 XMapWindow( _display, _window );
221
222 Screen *screen = XDefaultScreenOfDisplay( _display );
223 int screenWidth = WidthOfScreen( screen );
224 int screenHeight = HeightOfScreen( screen );
225 int xCenter = screenWidth / 2;
226 int yCenter = screenHeight / 2;
227
228 _width = (screenWidth * 4) / 5;
229 _height = screenHeight / 14;
230
231 XMoveResizeWindow( _display, _window, xCenter - (_width / 2), yCenter - (_height / 2), _width, _height );
232 }
233
235 {
236 redraw();
237
238 XEvent event;
239 while( XCheckMaskEvent( _display, _eventMask, &event ) )
240 redraw();
241 }
242
243 void setWindowName( const char *suiteName, const char *testName )
244 {
245 unsigned length = strlen( _programName ) + strlen( suiteName ) + strlen( testName ) + sizeof( " - ::()" );
246 char *name = (char *)malloc( length );
247 sprintf( name, "%s - %s::%s()", _programName, suiteName, testName );
248 XSetStandardProperties( _display, _window, name, 0, 0, 0, 0, 0 );
249 free( name );
250 }
251
252 void redraw()
253 {
255 drawSolidBar();
256 drawDividers();
258 flush();
259 }
260
262 {
263 XWindowAttributes attributes;
264 XGetWindowAttributes( _display, _window, &attributes );
265 _width = attributes.width;
266 _height = attributes.height;
267 }
268
270 {
271 unsigned barWidth = (_width * _testsDone) / _numTotalTests;
272
273 XSetForeground( _display, _gc, _barColor );
274 XFillRectangle( _display, _window, _gc, 0, 0, barWidth, _height );
275
276 XSetForeground( _display, _gc, _background );
277 XFillRectangle( _display, _window, _gc, barWidth, 0, _width + 1 - barWidth, _height );
278 }
279
281 {
282 if(_width / _numTotalTests < 5)
283 return;
284 for ( unsigned i = 1; i < _testsDone; ++ i ) {
285 int x = (_width * i) / _numTotalTests;
286 XDrawLine( _display, _window, _gc, x, 0, x, _height);
287 }
288 }
289
291 {
292 XSetForeground( _display, _gc, _foreground );
293
294 char str[sizeof("1000000000 of ") + sizeof(_strTotalTests) + sizeof(" (100%)")];
295 sprintf( str, "%u of %s (%u%%)", _testsDone, _strTotalTests, (_testsDone * 100) / _numTotalTests );
296 unsigned len = strlen( str );
297
298 int textWidth = XTextWidth( _fontInfo, str, len );
299
300 XDrawString( _display, _window, _gc,
301 (_width - textWidth) / 2, ((_height + _textHeight) / 2) - _textDescent,
302 str, len );
303 }
304
305 void flush()
306 {
307 XFlush( _display );
308 }
309
311 {
312 XFreeGC( _display, _gc );
313 }
314
316 {
317 XDestroyWindow( _display, _window );
318 }
319
321 {
322 XCloseDisplay( _display );
323 }
324 };
325};
326
327#endif //__cxxtest__X11Gui_h__
int i
Definition: cfEzgcd.cc:132
Variable x
Definition: cfModGcd.cc:4082
char * strTotalTests(char *) const
virtual unsigned numTotalTests(void) const =0
void leaveGui()
Definition: X11Gui.h:75
unsigned _testsDone
Definition: X11Gui.h:89
void enterWorld(const WorldDescription &wd)
Definition: X11Gui.h:33
void createColors()
Definition: X11Gui.h:137
void redraw()
Definition: X11Gui.h:252
long _eventMask
Definition: X11Gui.h:100
void getFontInfo()
Definition: X11Gui.h:184
void closeDisplay()
Definition: X11Gui.h:320
void initializeEvents()
Definition: X11Gui.h:194
void destroyGc()
Definition: X11Gui.h:310
char _strTotalTests[WorldDescription::MAX_STRLEN_TOTAL_TESTS]
Definition: X11Gui.h:90
void processEvents()
Definition: X11Gui.h:234
void useDefaultFont()
Definition: X11Gui.h:179
const char * _greenName
Definition: X11Gui.h:92
void guiEnterTest(const char *suiteName, const char *testName)
Definition: X11Gui.h:48
int _textHeight
Definition: X11Gui.h:99
void drawPercentage()
Definition: X11Gui.h:290
unsigned long _foreground
Definition: X11Gui.h:93
void drawSolidBar()
Definition: X11Gui.h:269
void redBar()
Definition: X11Gui.h:66
void freeFontInfo()
Definition: X11Gui.h:189
void createGc()
Definition: X11Gui.h:157
Display * _display
Definition: X11Gui.h:87
unsigned _numTotalTests
Definition: X11Gui.h:89
void setWindowName(const char *suiteName, const char *testName)
Definition: X11Gui.h:243
Colormap _colormap
Definition: X11Gui.h:101
void parseCommandLine(int &argc, char **argv)
Definition: X11Gui.h:103
void centerWindow()
Definition: X11Gui.h:218
Window _window
Definition: X11Gui.h:88
const char * _fontName
Definition: X11Gui.h:96
void initializeBar(const WorldDescription &wd)
Definition: X11Gui.h:200
unsigned long _barColor
Definition: X11Gui.h:93
void flush()
Definition: X11Gui.h:305
unsigned long _background
Definition: X11Gui.h:93
void getTotalTests(const WorldDescription &wd)
Definition: X11Gui.h:212
XFontStruct * _fontInfo
Definition: X11Gui.h:98
void createWindow()
Definition: X11Gui.h:152
bool loadFont()
Definition: X11Gui.h:171
unsigned long getColor(const char *colorName)
Definition: X11Gui.h:144
void destroyWindow()
Definition: X11Gui.h:315
int _textDescent
Definition: X11Gui.h:99
const char * _backgroundName
Definition: X11Gui.h:91
void drawDividers()
Definition: X11Gui.h:280
const char * _yellowName
Definition: X11Gui.h:92
void openDisplay()
Definition: X11Gui.h:132
const char * _programName
Definition: X11Gui.h:86
void enterGui(int &argc, char **argv)
Definition: X11Gui.h:28
void createFont()
Definition: X11Gui.h:162
const char * _redName
Definition: X11Gui.h:92
const char * _foregroundName
Definition: X11Gui.h:91
void getTotalTests()
Definition: X11Gui.h:207
void yellowBar()
Definition: X11Gui.h:57
void getWindowSize()
Definition: X11Gui.h:261
char name(const Variable &v)
Definition: factory.h:189
static BOOLEAN length(leftv result, leftv arg)
Definition: interval.cc:257
TestTracker & tracker()
Definition: TestTracker.h:111
char * str(leftv arg)
Definition: shared.cc:704
#define free
Definition: omAllocFunc.c:14
#define NULL
Definition: omList.c:12
void * malloc(size_t size)
Definition: omalloc.c:85