Make it possible to have implementations in different toolkits.

Also, make it possible to share the headers.
This commit is contained in:
Jonathan Schleifer 2011-12-27 23:38:07 +01:00
parent b5f40d159e
commit 73e7da5fb7
16 changed files with 3 additions and 3 deletions

21
gtk/Makefile Normal file
View file

@ -0,0 +1,21 @@
PREFIX ?= /usr/local
all:
@objfw-compile -Wall -g --lib 0.0 -o objgui -I../headers \
`pkg-config --cflags --libs gtk+-3.0` \
`ls *.m | fgrep -v test.m`
test:
@objfw-compile -Wall -g -o test -I../headers \
`pkg-config --cflags --libs gtk+-3.0` \
*.m
install:
mkdir -p ${PREFIX}/include/ObjGUI
cp ../headers/*.h ${PREFIX}/include/ObjGUI/
cp libobjgui.so ${PREFIX}/lib/libobjgui.so.0.0
ln -sf libobjgui.so.0.0 ${PREFIX}/lib/libobjgui.so.0
ln -sf libobjgui.so.0 ${PREFIX}/lib/libobjgui.so
clean:
rm -f test *.so *.o *~

36
gtk/OGApplication.m Normal file
View file

@ -0,0 +1,36 @@
#import "OGApplication.h"
OF_APPLICATION_DELEGATE(OGApplication)
extern Class og_application_delegate(void);
@implementation OGApplication
+ (void)quit
{
gtk_main_quit();
}
- (void)applicationDidFinishLaunching
{
OFAutoreleasePool *pool;
int *argc;
char ***argv;
delegate = [[og_application_delegate() alloc] init];
[[OFApplication sharedApplication] getArgumentCount: &argc
andArgumentValues: &argv];
gtk_init(argc, argv);
pool = [OFAutoreleasePool new];
[delegate applicationDidFinishLaunching];
[pool release];
gtk_main();
}
- (void)applicationWillTerminate
{
[delegate applicationWillTerminate];
}
@end

42
gtk/OGBox.m Normal file
View file

@ -0,0 +1,42 @@
#import "OGBox.h"
@implementation OGBox
+ box
{
return [[[self alloc] init] autorelease];
}
- init
{
self = [super init];
@try {
if (isa == [OGBox class])
@throw [OFNotImplementedException
exceptionWithClass: isa
selector: _cmd];
} @catch (id e) {
[self release];
@throw e;
}
return self;
}
- (void)appendChild: (OGWidget*)child
expand: (BOOL)expand
fill: (BOOL)fill
padding: (float)padding
{
gtk_box_pack_start(GTK_BOX(widget), child->widget, expand, fill,
padding);
}
- (void)prependChild: (OGWidget*)child
expand: (BOOL)expand
fill: (BOOL)fill
padding: (float)padding
{
gtk_box_pack_end(GTK_BOX(widget), child->widget, expand, fill, padding);
}
@end

56
gtk/OGButton.m Normal file
View file

@ -0,0 +1,56 @@
#import "OGButton.h"
@interface OGButton ()
- (void)OG_clicked;
@end
static void
clicked(GtkWidget *widget, gpointer data)
{
[(OGButton*)data OG_clicked];
}
@implementation OGButton
@synthesize delegate;
+ button
{
return [[[self alloc] init] autorelease];
}
- init
{
self = [super init];
widget = gtk_button_new();
g_signal_connect(G_OBJECT(widget), "clicked", G_CALLBACK(clicked),
self);
g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(og_destroy),
self);
[self retain];
return self;
}
- (OFString*)label
{
return [OFString stringWithUTF8String:
gtk_button_get_label(GTK_BUTTON(widget))];
}
- (void)setLabel: (OFString*)label
{
gtk_button_set_label(GTK_BUTTON(widget), [label UTF8String]);
}
- (void)OG_clicked
{
OFAutoreleasePool *pool = [OFAutoreleasePool new];
if ([delegate respondsToSelector: @selector(buttonWasClicked:)])
[delegate buttonWasClicked: self];
[pool release];
}
@end

16
gtk/OGHBox.m Normal file
View file

@ -0,0 +1,16 @@
#import "OGHBox.h"
@implementation OGHBox
- init
{
self = [super init];
widget = gtk_hbox_new(FALSE, 0);
g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(og_destroy),
self);
[self retain];
return self;
}
@end

16
gtk/OGVBox.m Normal file
View file

@ -0,0 +1,16 @@
#import "OGVBox.h"
@implementation OGVBox
- init
{
self = [super init];
widget = gtk_vbox_new(FALSE, 0);
g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(og_destroy),
self);
[self retain];
return self;
}
@end

35
gtk/OGWidget.m Normal file
View file

@ -0,0 +1,35 @@
#include "OGWidget.h"
void og_destroy(GtkWidget *widget, OGWidget *object)
{
[object release];
}
@implementation OGWidget
- init
{
self = [super init];
@try {
if (isa == [OGWidget class])
@throw [OFNotImplementedException
exceptionWithClass: isa
selector: @selector(init)];
} @catch (id e) {
[self release];
@throw e;
}
return self;
}
- (void)show
{
gtk_widget_show_all(widget);
}
- (void)hide
{
gtk_widget_hide(widget);
}
@end

92
gtk/OGWindow.m Normal file
View file

@ -0,0 +1,92 @@
#import "OGWindow.h"
@interface OGWindow ()
- (BOOL)OG_willClose;
@end
static gboolean
willClose(GtkWidget *widget, GdkEvent *event, gpointer data)
{
return ([(OGWindow*)data OG_willClose] ? FALSE : TRUE);
}
@implementation OGWindow
@synthesize delegate;
+ window
{
return [[[self alloc] init] autorelease];
}
- init
{
self = [super init];
widget = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(G_OBJECT(widget), "delete-event",
G_CALLBACK(willClose), self);
g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(og_destroy),
self);
[self retain];
return self;
}
- (OFString*)title
{
return [OFString stringWithUTF8String:
gtk_window_get_title(GTK_WINDOW(widget))];
}
- (void)setTitle: (OFString*)title
{
gtk_window_set_title(GTK_WINDOW(widget), [title UTF8String]);
}
- (of_point_t)position
{
gint x, y;
gtk_window_get_position(GTK_WINDOW(widget), &x, &y);
return of_point(x, y);
}
- (void)setPosition: (of_point_t)position
{
gtk_window_move(GTK_WINDOW(widget), position.x, position.y);
}
- (of_dimension_t)dimension
{
gint width, height;
gtk_window_get_size(GTK_WINDOW(widget), &width, &height);
return of_dimension(width, height);
}
- (void)setDimension: (of_dimension_t)dimension
{
gtk_window_resize(GTK_WINDOW(widget),
dimension.width, dimension.height);
}
- (void)addChild: (OGWidget*)child
{
gtk_container_add(GTK_CONTAINER(widget), child->widget);
}
- (BOOL)OG_willClose
{
OFAutoreleasePool *pool = [OFAutoreleasePool new];
if ([delegate respondsToSelector: @selector(windowWillClose:)])
return [delegate windowWillClose: self];
[pool release];
return YES;
}
@end

74
gtk/test.m Normal file
View file

@ -0,0 +1,74 @@
#import "OGApplication.h"
#import "OGWindow.h"
#import "OGButton.h"
#import "OGHBox.h"
#import "OGVBox.h"
@interface Test: OFObject <OGApplicationDelegate, OGWindowDelegate,
OGButtonDelegate>
@end
OG_APPLICATION_DELEGATE(Test)
@implementation Test
- (void)applicationDidFinishLaunching
{
OGWindow *w = [OGWindow window];
w.title = @"Hallo Welt!";
w.position = of_point(100, 100);
w.dimension = of_dimension(600, 400);
w.delegate = self;
OGVBox *vbox = [OGVBox box];
[w addChild: vbox];
OGButton *b = [OGButton button];
b.label = @"Klick mich!";
b.delegate = self;
[vbox appendChild: b
expand: YES
fill: YES
padding: 0];
OGHBox *hbox = [OGHBox box];
[vbox appendChild: hbox
expand: NO
fill: NO
padding: 0];
OGButton *b1 = [OGButton button];
b1.label = @"Ich";
[hbox appendChild: b1
expand: YES
fill: YES
padding: 0];
OGButton *b2 = [OGButton button];
b2.label = @"mach";
[hbox appendChild: b2
expand: YES
fill: YES
padding: 0];
OGButton *b3 = [OGButton button];
b3.label = @"nix";
[hbox appendChild: b3
expand: YES
fill: YES
padding: 0];
[w show];
}
- (BOOL)windowWillClose: (OGWindow*)window
{
[OGApplication quit];
return YES;
}
- (void)buttonWasClicked: (OGButton*)button
{
of_log(@"Hallo!");
}
@end