return FALSE;
}
-struct init_params {
- OFString *title;
- JubGtkChatUI *object;
- volatile BOOL *initialized;
-};
-
-static gboolean init(gpointer data)
+@implementation JubGtkChatUI
+- initWithTitle: (OFString*)title
+ closeBlock: (jub_close_block_t)closeBlock_
+ sendBlock: (jub_send_block_t)sendBlock_
{
- struct init_params *params = data;
-
- GtkTextView *chat_view;
- GtkEntry *chat_entry;
-
- GtkBuilder *builder = gtk_builder_new();
- gtk_builder_add_from_file(builder, "data/gtk/chat.ui", NULL);
+ self = [super init];
- params->object.chat_window = GTK_WIDGET(
- gtk_builder_get_object(builder, "ChatWindow"));
- g_signal_connect(params->object.chat_window, "destroy",
- G_CALLBACK(call_close_block), params->object.closeBlock);
+ @try {
+ __block volatile BOOL initialized = NO;
+ __block GtkWidget *chat_window_;
+ __block GtkTextBuffer *chat_buffer_;
+ closeBlock = [closeBlock_ copy];
+ sendBlock = [sendBlock_ copy];
+ bufferEmpty = YES;
- chat_view = GTK_TEXT_VIEW(
- gtk_builder_get_object(builder, "ChatTextView"));
- params->object.chat_buffer = gtk_text_view_get_buffer(chat_view);
- gtk_text_buffer_create_tag(params->object.chat_buffer, "bold",
- "weight", PANGO_WEIGHT_BOLD, NULL);
+ g_idle_add_block(^{
+ GtkTextView *chat_view;
+ GtkEntry *chat_entry;
- chat_entry = GTK_ENTRY(
- gtk_builder_get_object(builder, "ChatEntry"));
- struct call_send_block_params *send_params =
- [params->object allocMemoryWithSize: sizeof(*send_params)];
- send_params->block = params->object.sendBlock;
- send_params->chat = params->object;
- g_signal_connect(chat_entry, "key_release_event",
- G_CALLBACK(call_send_block), send_params);
+ GtkBuilder *builder = gtk_builder_new();
+ gtk_builder_add_from_file(builder, "data/gtk/chat.ui",
+ NULL);
- gtk_window_set_title(GTK_WINDOW(params->object.chat_window),
- [params->title UTF8String]);
- gtk_widget_show(params->object.chat_window);
+ chat_window_ = GTK_WIDGET(
+ gtk_builder_get_object(builder, "ChatWindow"));
+ g_signal_connect(chat_window_, "destroy",
+ G_CALLBACK(call_close_block), closeBlock);
- *params->initialized = YES;
+ chat_view = GTK_TEXT_VIEW(
+ gtk_builder_get_object(builder, "ChatTextView"));
+ chat_buffer_ = gtk_text_view_get_buffer(chat_view);
+ gtk_text_buffer_create_tag(chat_buffer_, "bold",
+ "weight", PANGO_WEIGHT_BOLD, NULL);
- g_object_unref(builder);
- [params->title release];
- free(params);
+ chat_entry = GTK_ENTRY(
+ gtk_builder_get_object(builder, "ChatEntry"));
+ struct call_send_block_params *send_params =
+ [self allocMemoryWithSize: sizeof(*send_params)];
+ send_params->block = sendBlock;
+ send_params->chat = self;
+ g_signal_connect(chat_entry, "key_release_event",
+ G_CALLBACK(call_send_block), send_params);
- return FALSE;
-}
+ gtk_window_set_title(GTK_WINDOW(chat_window_),
+ [title UTF8String]);
+ gtk_widget_show(chat_window_);
-@implementation JubGtkChatUI
-@synthesize chat_window;
-@synthesize chat_buffer;
-@synthesize sendBlock;
-@synthesize closeBlock;
+ initialized = YES;
-- initWithTitle: (OFString*)title
- closeBlock: (jub_close_block_t)closeBlock_
- sendBlock: (jub_send_block_t)sendBlock_
-{
- volatile BOOL initialized = NO;
- self = [super init];
+ g_object_unref(builder);
+ });
- @try {
- closeBlock = [closeBlock_ copy];
- sendBlock = [sendBlock_ copy];
- bufferEmpty = YES;
+ while (!initialized);
- struct init_params *params = malloc(sizeof(*params));
- params->initialized = &initialized;
- params->title = [title retain];
- params->object = self;
- g_idle_add(init, params);
+ chat_buffer = chat_buffer_;
+ chat_window = chat_window_;
} @catch (id e) {
[self release];
@throw e;
}
- while (!initialized);
-
return self;
}