38 #include <glib/gi18n.h> 39 #include <gdk/gdkkeysyms.h> 57 g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING);
70 GtkTextBuffer* buffer;
72 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(window->
send_text));
73 gtk_text_buffer_set_text(buffer,
"", -1);
80 GtkTextBuffer* buffer;
83 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(window->
history_text));
84 gtk_text_buffer_get_end_iter(buffer, &iter);
85 gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(window->
history_text), &iter, 0.0, FALSE, 0.0, 0.0);
94 GtkTextBuffer* buffer;
98 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(window->
history_text));
101 ptr = g_strdup_printf(
"(%s) ", name);
102 gtk_text_buffer_get_end_iter(buffer, &iter);
104 gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, ptr, -1, tagname, NULL);
106 gtk_text_buffer_insert(buffer, &iter, ptr, -1);
111 if (text && text[0] != 0) {
112 gtk_text_buffer_get_end_iter(buffer, &iter);
113 if (text[strlen(text) - 1] ==
'\n') {
114 gtk_text_buffer_insert(buffer, &iter, text, -1);
116 ptr = g_strdup_printf(
"%s\n", text);
117 gtk_text_buffer_insert(buffer, &iter, ptr, -1);
128 TRACE_CALL(__func__);
129 GtkTextBuffer* buffer;
130 GtkTextIter start, end;
133 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(window->
send_text));
134 gtk_text_buffer_get_bounds(buffer, &start, &end);
135 text = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
137 if (!text || text[0] ==
'\0')
140 g_signal_emit_by_name(G_OBJECT(window),
"send", text);
151 TRACE_CALL(__func__);
152 if (event->keyval == GDK_KEY_Return) {
162 TRACE_CALL(__func__);
166 GtkWidget* scrolledwindow;
169 GtkTextBuffer* buffer;
171 window = REMMINA_CHAT_WINDOW(g_object_new(REMMINA_TYPE_CHAT_WINDOW, NULL));
174 gtk_window_set_transient_for(GTK_WINDOW(window), parent);
178 g_snprintf(buf,
sizeof(buf), _(
"Chat with %s"), chat_with);
179 gtk_window_set_title(GTK_WINDOW(window), buf);
180 gtk_window_set_default_size(GTK_WINDOW(window), 450, 300);
183 grid = gtk_grid_new();
184 gtk_widget_show(grid);
185 gtk_grid_set_row_spacing(GTK_GRID(grid), 4);
186 gtk_grid_set_column_spacing(GTK_GRID(grid), 4);
187 gtk_container_set_border_width(GTK_CONTAINER(grid), 8);
188 gtk_container_add(GTK_CONTAINER(window), grid);
191 scrolledwindow = gtk_scrolled_window_new(NULL, NULL);
192 gtk_widget_show(scrolledwindow);
193 gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scrolledwindow), 100);
194 gtk_widget_set_hexpand(GTK_WIDGET(scrolledwindow), TRUE);
195 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
196 gtk_grid_attach(GTK_GRID(grid), scrolledwindow, 0, 0, 3, 1);
198 widget = gtk_text_view_new();
199 gtk_widget_show(widget);
200 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(widget), GTK_WRAP_WORD_CHAR);
201 gtk_text_view_set_editable(GTK_TEXT_VIEW(widget), FALSE);
202 gtk_container_add(GTK_CONTAINER(scrolledwindow), widget);
204 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget));
205 gtk_text_buffer_create_tag(buffer,
"sender-foreground",
"foreground",
"blue", NULL);
206 gtk_text_buffer_create_tag(buffer,
"receiver-foreground",
"foreground",
"red", NULL);
211 scrolledwindow = gtk_scrolled_window_new(NULL, NULL);
212 gtk_widget_show(scrolledwindow);
213 gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scrolledwindow), 100);
214 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
215 gtk_widget_set_hexpand(GTK_WIDGET(scrolledwindow), TRUE);
216 gtk_grid_attach(GTK_GRID(grid), scrolledwindow, 0, 1, 3, 1);
218 widget = gtk_text_view_new();
219 gtk_widget_show(widget);
220 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(widget), GTK_WRAP_WORD_CHAR);
221 gtk_container_add(GTK_CONTAINER(scrolledwindow), widget);
227 image = gtk_image_new_from_icon_name(
"remmina-document-send-symbolic", GTK_ICON_SIZE_BUTTON);
228 gtk_widget_show(image);
230 widget = gtk_button_new_with_mnemonic(_(
"_Send"));
231 gtk_widget_show(widget);
232 gtk_button_set_image(GTK_BUTTON(widget), image);
233 gtk_grid_attach(GTK_GRID(grid), widget, 2, 2, 1, 1);
237 image = gtk_image_new_from_icon_name(
"edit-clear", GTK_ICON_SIZE_BUTTON);
238 gtk_widget_show(image);
240 widget = gtk_button_new_with_mnemonic(_(
"_Clear"));
241 gtk_widget_show(widget);
242 gtk_button_set_image(GTK_BUTTON(widget), image);
243 gtk_grid_attach(GTK_GRID(grid), widget, 1, 2, 1, 1);
246 gtk_widget_grab_focus(window->
send_text);
248 return GTK_WIDGET(window);
253 TRACE_CALL(__func__);
static void remmina_chat_window_append_text(RemminaChatWindow *window, const gchar *name, const gchar *tagname, const gchar *text)
static guint remmina_chat_window_signals[LAST_SIGNAL]
static void remmina_chat_window_send(GtkWidget *widget, RemminaChatWindow *window)
G_DEFINE_TYPE(RemminaChatWindow, remmina_chat_window, GTK_TYPE_WINDOW)
static gboolean remmina_chat_window_send_text_on_key(GtkWidget *widget, GdkEventKey *event, RemminaChatWindow *window)
static void remmina_chat_window_class_init(RemminaChatWindowClass *klass)
static void remmina_chat_window_init(RemminaChatWindow *window)
static gboolean remmina_chat_window_scroll_proc(RemminaChatWindow *window)
static void remmina_chat_window_clear_send_text(GtkWidget *widget, RemminaChatWindow *window)
void remmina_chat_window_receive(RemminaChatWindow *window, const gchar *name, const gchar *text)
GtkWidget * remmina_chat_window_new(GtkWindow *parent, const gchar *chat_with)