1 #import "JubGtkChatUI.h"
3 struct show_chat_params {
8 static gboolean show_chat(gpointer data)
10 struct show_chat_params *params = data;
12 gtk_window_set_title(GTK_WINDOW(params->window),
13 [params->title UTF8String]);
14 gtk_widget_show(params->window);
16 g_object_unref(params->window);
17 [params->title release];
23 struct add_text_params {
26 GtkTextBuffer *buffer;
30 static gboolean add_text(gpointer data)
33 struct add_text_params *params = data;
35 if (OF_LIKELY(!params->first))
36 gtk_text_buffer_insert_at_cursor(params->buffer, "\n", 1);
38 gtk_text_buffer_get_end_iter(params->buffer, &endIter);
39 gtk_text_buffer_insert_with_tags_by_name(params->buffer, &endIter,
40 [params->name UTF8String], [params->name UTF8StringLength], "bold",
42 gtk_text_buffer_get_end_iter(params->buffer, &endIter);
43 gtk_text_buffer_insert_with_tags_by_name(params->buffer, &endIter,
44 ": ", 2, "bold", NULL);
46 gtk_text_buffer_insert_at_cursor(params->buffer,
47 [params->text UTF8String], [params->text UTF8StringLength]);
49 [params->name release];
50 [params->text release];
51 g_object_unref(params->buffer);
57 static gboolean call_send_block(GtkEntry *entry, GdkEventKey *event,
60 if (event->keyval != GDK_KEY_Return) return TRUE;
62 jub_send_block_t block = data;
64 [[OFString alloc] initWithUTF8String: gtk_entry_get_text(entry)];
65 gtk_entry_set_text(entry, "");
72 static gboolean add_tags(gpointer data) {
73 gtk_text_buffer_create_tag(data, "bold", "weight",
74 PANGO_WEIGHT_BOLD, NULL);
79 @implementation JubGtkChatUI
80 - initWithTitle: (OFString*)title
81 sendBlock: (jub_send_block_t)sendBlock_
86 GtkTextView *chat_view;
88 GtkBuilder *builder = gtk_builder_new();
90 sendBlock = [sendBlock_ copy];
93 gtk_builder_add_from_file(builder, "data/gtk/chat.ui", NULL);
95 chat_window = GTK_WIDGET(
96 gtk_builder_get_object(builder, "ChatWindow"));
98 chat_view = GTK_TEXT_VIEW(
99 gtk_builder_get_object(builder, "ChatTextView"));
101 chat_entry = GTK_ENTRY(
102 gtk_builder_get_object(builder, "ChatEntry"));
104 g_signal_connect(chat_entry, "key_release_event",
105 G_CALLBACK(call_send_block), sendBlock);
107 chat_buffer = gtk_text_view_get_buffer(chat_view);
108 g_idle_add(add_tags, chat_buffer);
110 struct show_chat_params *params = malloc(sizeof(*params));
111 params->window = g_object_ref(chat_window);
112 params->title = [title retain];
113 g_idle_add(show_chat, params);
115 g_object_unref(builder);
126 gtk_widget_destroy(chat_window);
132 - (void)addMessage: (OFString*)text
133 sender: (OFString*)sender;
135 struct add_text_params *params = malloc(sizeof(*params));
136 params->name = [sender retain];
137 params->text = [text retain];
138 params->buffer = g_object_ref(chat_buffer);
139 params->first = bufferEmpty;
140 g_idle_add(add_text, params);
141 if (OF_UNLIKELY(bufferEmpty)) bufferEmpty = NO;