Object
|
+---DTextDrawable
|
+---DTextScreen
The DTextScreen class implements a class to use the text screen. On unix it is a wrapper for the ncurses library. For obvious reasons there can be only one text screen object in any application.
#include <stdio.h>
#include "ofc/DTextScreen.h"
#ifdef HAVE_DTEXTSCREEN
@interface MyScreen : DTextScreen <DScreenHandler> // Class for the screen and its events
{
DColor *fgc;
DColor *bgc;
}
- (MyScreen *) init;
- (BOOL) open;
- (void) draw :(const char *) key;
- (BOOL) keyPress :(DKey *) key :(int) state; // Callbacks
- (BOOL) mouseMove :(unsigned) x :(unsigned) y;
- (BOOL) mouseButtonPress :(DKey *) button :(int) state;
- (BOOL) screenResize :(unsigned) maxX :(unsigned) maxY;
- (BOOL) screenFocus :(BOOL) focus;
- (BOOL) screenRedraw :(unsigned) minX :(unsigned) maxX :(unsigned) minY :(unsigned) maxY;
@end
@implementation MyScreen
- (MyScreen *) init
{
[super init];
fgc = [DColor new];
bgc = [DColor new];
return self;
}
- (BOOL) open // Open the screen with ..
{
BOOL ok = NO;
[fgc textColor :DCLR_YELLOW]; // .. foreground and background color
[bgc textColor :DCLR_BLUE];
ok = [self open :fgc :bgc];
if (ok)
{
[self screenHandler :self]; // Object is handling its events itself
}
return ok;
}
- (void) draw :(const char *) key // Screen drawing
{
int maxX = [self maxX]; // Dimensions of screen
int maxY = [self maxY];
char hello[] = "Hello World";
char quit[] = "Press q to quit";
[self startDrawing]; // Start drawing
[self clear];
[self drawHLine :1 :1 :maxX-1]; // Draw a some lines
[self drawHLine :maxX-1 :maxY-1 :1];
// Write some text
[self cursor :((maxX - strlen(hello))/2) :((maxY-2)/2)];
[self writeText :hello];
[self cursor :((maxX - strlen(quit))/2) :((maxY+2)/2)];
[self writeText :quit];
if (key != NULL)
{
[self cursor :3 :maxY-3];
[self writeText :"Key pressed:"];
[self writeText :key];
}
[self stopDrawing];
}
// Callback for pressed key
- (BOOL) keyPress :(DKey *) key :(int) state
{
if ([key key] != 'q')
{
DText *info = [key toText];
[self draw :[info cstring]];
[info free];
}
return ([key key] != 'q');
}
// Callback for moved mouse
- (BOOL) mouseMove :(unsigned) x :(unsigned) y
{
return YES;
}
// Callback for pressed mouse button
- (BOOL) mouseButtonPress :(DKey *) button :(int) state
{
return YES;
}
// Callback for screen resize
- (BOOL) screenResize :(unsigned) maxX :(unsigned) maxY
{
[self draw :NULL];
return YES;
}
// Callback for lost and gained screen focus
- (BOOL) screenFocus :(BOOL) focus
{
[self draw :NULL];
return YES;
}
// Callback for screen redraw
- (BOOL) screenRedraw :(unsigned) minX :(unsigned) maxX :(unsigned) minY :(unsigned) maxY
{
[self draw :NULL];
return YES;
}
@end
#endif
int main(int argc, char *argv[])
{
#ifdef HAVE_DTEXTSCREEN
MyScreen *screen = [MyScreen new];
if ([screen open]) // Open the screen
{
[screen draw :NULL]; // Draw the screen
[screen waitEvents]; // Wait for and process events
}
else
printf("Could not open the screen..\n");
[screen free]; // Cleanup
#else
printf("DTextScreen is not present in the library.\n");
#endif
return 0;
}