37 #include <glib/gi18n.h>
38 #include <gdk/gdkkeysyms.h>
56 g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING);
69 GtkTextBuffer* buffer;
71 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(window->
send_text));
72 gtk_text_buffer_set_text(buffer,
"", -1);
79 GtkTextBuffer* buffer;
82 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(window->
history_text));
83 gtk_text_buffer_get_end_iter(buffer, &iter);
84 gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(window->
history_text), &iter, 0.0, FALSE, 0.0, 0.0);
93 GtkTextBuffer* buffer;
97 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(window->
history_text));
100 ptr = g_strdup_printf(
"(%s) ", name);
101 gtk_text_buffer_get_end_iter(buffer, &iter);
103 gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, ptr, -1, tagname, NULL);
105 gtk_text_buffer_insert(buffer, &iter, ptr, -1);
110 if (text && text[0] != 0) {
111 gtk_text_buffer_get_end_iter(buffer, &iter);
112 if (text[strlen(text) - 1] ==
'\n') {
113 gtk_text_buffer_insert(buffer, &iter, text, -1);
115 ptr = g_strdup_printf(
"%s\n", text);
116 gtk_text_buffer_insert(buffer, &iter, ptr, -1);
127 TRACE_CALL(__func__);
128 GtkTextBuffer* buffer;
129 GtkTextIter start, end;
132 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(window->
send_text));
133 gtk_text_buffer_get_bounds(buffer, &start, &end);
134 text = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
136 if (!text || text[0] ==
'\0')
139 g_signal_emit_by_name(G_OBJECT(window),
"send", text);
150 TRACE_CALL(__func__);
151 if (event->keyval == GDK_KEY_Return) {
161 TRACE_CALL(__func__);
165 GtkWidget* scrolledwindow;
168 GtkTextBuffer* buffer;
170 window = REMMINA_CHAT_WINDOW(g_object_new(REMMINA_TYPE_CHAT_WINDOW, NULL));
173 gtk_window_set_transient_for(GTK_WINDOW(window), parent);
177 g_snprintf(buf,
sizeof(buf), _(
"Chat with %s"), chat_with);
178 gtk_window_set_title(GTK_WINDOW(window), buf);
179 gtk_window_set_default_size(GTK_WINDOW(window), 450, 300);
182 grid = gtk_grid_new();
183 gtk_widget_show(grid);
184 gtk_grid_set_row_spacing(GTK_GRID(grid), 4);
185 gtk_grid_set_column_spacing(GTK_GRID(grid), 4);
186 gtk_container_set_border_width(GTK_CONTAINER(grid), 8);
187 gtk_container_add(GTK_CONTAINER(window), grid);
190 scrolledwindow = gtk_scrolled_window_new(NULL, NULL);
191 gtk_widget_show(scrolledwindow);
192 gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scrolledwindow), 100);
193 gtk_widget_set_hexpand(GTK_WIDGET(scrolledwindow), TRUE);
194 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
195 gtk_grid_attach(GTK_GRID(grid), scrolledwindow, 0, 0, 3, 1);
197 widget = gtk_text_view_new();
198 gtk_widget_show(widget);
199 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(widget), GTK_WRAP_WORD_CHAR);
200 gtk_text_view_set_editable(GTK_TEXT_VIEW(widget), FALSE);
201 gtk_container_add(GTK_CONTAINER(scrolledwindow), widget);
203 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget));
204 gtk_text_buffer_create_tag(buffer,
"sender-foreground",
"foreground",
"blue", NULL);
205 gtk_text_buffer_create_tag(buffer,
"receiver-foreground",
"foreground",
"red", NULL);
210 scrolledwindow = gtk_scrolled_window_new(NULL, NULL);
211 gtk_widget_show(scrolledwindow);
212 gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scrolledwindow), 100);
213 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
214 gtk_widget_set_hexpand(GTK_WIDGET(scrolledwindow), TRUE);
215 gtk_grid_attach(GTK_GRID(grid), scrolledwindow, 0, 1, 3, 1);
217 widget = gtk_text_view_new();
218 gtk_widget_show(widget);
219 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(widget), GTK_WRAP_WORD_CHAR);
220 gtk_container_add(GTK_CONTAINER(scrolledwindow), widget);
226 image = gtk_image_new_from_icon_name(
"org.remmina.Remmina-document-send-symbolic", GTK_ICON_SIZE_BUTTON);
227 gtk_widget_show(image);
229 widget = gtk_button_new_with_mnemonic(_(
"_Send"));
230 gtk_widget_show(widget);
231 gtk_button_set_image(GTK_BUTTON(widget), image);
232 gtk_grid_attach(GTK_GRID(grid), widget, 2, 2, 1, 1);
236 image = gtk_image_new_from_icon_name(
"edit-clear", GTK_ICON_SIZE_BUTTON);
237 gtk_widget_show(image);
239 widget = gtk_button_new_with_mnemonic(_(
"_Clear"));
240 gtk_widget_show(widget);
241 gtk_button_set_image(GTK_BUTTON(widget), image);
242 gtk_grid_attach(GTK_GRID(grid), widget, 1, 2, 1, 1);
245 gtk_widget_grab_focus(window->
send_text);
247 return GTK_WIDGET(window);
252 TRACE_CALL(__func__);
static void remmina_chat_window_class_init(RemminaChatWindowClass *klass)
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)
static guint remmina_chat_window_signals[LAST_SIGNAL]
static gboolean remmina_chat_window_send_text_on_key(GtkWidget *widget, GdkEventKey *event, RemminaChatWindow *window)
GtkWidget * remmina_chat_window_new(GtkWindow *parent, const gchar *chat_with)
static void remmina_chat_window_send(GtkWidget *widget, RemminaChatWindow *window)
static void remmina_chat_window_init(RemminaChatWindow *window)
G_DEFINE_TYPE(RemminaChatWindow, remmina_chat_window, GTK_TYPE_WINDOW)
static void remmina_chat_window_append_text(RemminaChatWindow *window, const gchar *name, const gchar *tagname, const gchar *text)