38 #include <glib/gi18n.h> 48 #define REMMINA_TYPE_LOG_WINDOW (remmina_log_window_get_type()) 49 #define REMMINA_LOG_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), REMMINA_TYPE_LOG_WINDOW, RemminaLogWindow)) 50 #define REMMINA_LOG_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), REMMINA_TYPE_LOG_WINDOW, RemminaLogWindowClass)) 51 #define REMMINA_IS_LOG_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), REMMINA_TYPE_LOG_WINDOW)) 52 #define REMMINA_IS_LOG_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), REMMINA_TYPE_LOG_WINDOW)) 53 #define REMMINA_LOG_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), REMMINA_TYPE_LOG_WINDOW, RemminaLogWindowClass)) 71 void remmina_log_stats()
79 JsonGenerator *g = json_generator_new();
80 json_generator_set_pretty (g, TRUE);
81 json_generator_set_root(g, n);
83 g_autofree gchar *s = json_generator_to_data(g, NULL);
84 REMMINA_DEBUG(
"STATS: JSON data%s\n", s);
100 TRACE_CALL(__func__);
101 return GTK_WIDGET(g_object_new(REMMINA_TYPE_LOG_WINDOW, NULL));
106 TRACE_CALL(__func__);
112 TRACE_CALL(__func__);
118 TRACE_CALL(__func__);
123 gtk_window_set_default_size(GTK_WINDOW(
log_window), 640, 480);
124 gtk_window_set_resizable (GTK_WINDOW(
log_window), TRUE);
125 gtk_window_set_decorated (GTK_WINDOW(
log_window), TRUE);
128 GtkWidget *header = gtk_header_bar_new ();
129 gtk_header_bar_set_show_close_button (GTK_HEADER_BAR (header), TRUE);
130 gtk_header_bar_set_title (GTK_HEADER_BAR (header), _(
"Remmina debugging window"));
131 gtk_header_bar_set_has_subtitle (GTK_HEADER_BAR (header), FALSE);
133 GtkWidget *getstat = gtk_button_new ();
134 gtk_widget_set_tooltip_text (getstat, _(
"Paste system info in the Remmina debugging window"));
135 GIcon *icon = g_themed_icon_new (
"edit-paste-symbolic");
136 GtkWidget *image = gtk_image_new_from_gicon (icon, GTK_ICON_SIZE_BUTTON);
137 g_object_unref (icon);
138 gtk_container_add (GTK_CONTAINER (getstat), image);
139 gtk_header_bar_pack_start (GTK_HEADER_BAR (header), getstat);
141 GtkWidget *start = gtk_switch_new ();
143 gtk_switch_set_active (GTK_SWITCH(start),
logstart);
144 gtk_widget_set_valign (start, GTK_ALIGN_CENTER);
145 gtk_header_bar_pack_start (GTK_HEADER_BAR (header), start);
147 gtk_window_set_titlebar (GTK_WINDOW (
log_window), header);
149 g_signal_connect(getstat,
"button-press-event", G_CALLBACK(remmina_log_stats), NULL);
156 "You can stop and start the logging at any moment using the On/Off switch.\n" 157 "The stats button (Ctrl+T), can be useful to gather system info you may share when reporting a bug.\n" 158 "There is more info about debugging Remmina on https://gitlab.com/Remmina/Remmina/-/wikis/Usage/Remmina-debugging\n" 164 TRACE_CALL(__func__);
170 TRACE_CALL(__func__);
175 gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(REMMINA_LOG_WINDOW(
log_window)->
log_view), &iter, 0.0, FALSE, 0.0,
183 TRACE_CALL(__func__);
188 gtk_text_buffer_insert(REMMINA_LOG_WINDOW(
log_window)->
log_buffer, &iter, (
const gchar*)data, -1);
199 TRACE_CALL(__func__);
208 TRACE_CALL(__func__);
211 g_autofree gchar *text;
213 text = g_strdup_vprintf(fmt, args);
219 g_autofree gchar *buf_tmp = g_strconcat(text,
"\n", NULL);
221 gchar *bufn = g_strconcat(
"(INFO) - ", buf_tmp, NULL);
232 TRACE_CALL(__func__);
235 g_autofree gchar *text;
237 text = g_strdup_vprintf(fmt, args);
241 g_message (
"%s", text);
247 g_autofree gchar *buf_tmp = g_strconcat(text,
"\n", NULL);
249 gchar *bufn = g_strconcat(
"(MESSAGE) - ", buf_tmp, NULL);
261 TRACE_CALL(__func__);
266 text = g_strdup_vprintf(fmt, args);
269 g_autofree gchar *buf = g_strconcat(
"(", fun,
") - ", text, NULL);
279 g_autofree gchar *buf_tmp = g_strconcat(buf,
"\n", NULL);
281 gchar *bufn = g_strconcat(
"(DEBUG) - ", buf_tmp, NULL);
288 TRACE_CALL(__func__);
293 text = g_strdup_vprintf(fmt, args);
296 g_autofree gchar *buf = g_strconcat(
"(", fun,
") - ", text, NULL);
300 g_warning (
"%s", buf);
306 g_autofree gchar *buf_tmp = g_strconcat(buf,
"\n", NULL);
308 gchar *bufn = g_strconcat(
"(WARN) - ", buf_tmp, NULL);
315 TRACE_CALL(__func__);
318 gchar *text = g_strdup_vprintf(fmt, args);
321 #if GLIB_CHECK_VERSION(2,62,0) 322 GDateTime* tv = g_date_time_new_now_local();
323 gchar *isodate = g_date_time_format_iso8601(tv);
324 g_date_time_unref(tv);
327 g_get_current_time(&tv);
328 gchar *isodate = g_time_val_to_iso8601(&tv);
331 g_autofree gchar *buf = g_strdup(
"");
336 "[", isodate,
"] - ",
357 TRACE_CALL(__func__);
362 text = g_strdup_vprintf(fmt, args);
365 g_autofree gchar *buf = g_strconcat(
"(", fun,
") - ", text, NULL);
375 g_autofree gchar *buf_tmp = g_strconcat(buf,
"\n", NULL);
377 gchar *bufn = g_strconcat(
"(ERROR) - ", buf_tmp, NULL);
384 TRACE_CALL(__func__);
389 text = g_strdup_vprintf(fmt, args);
392 g_autofree gchar *buf = g_strconcat(
"(", fun,
") - ", text, NULL);
396 g_critical (
"%s", buf);
402 g_autofree gchar *buf_tmp = g_strconcat(buf,
"\n", NULL);
404 gchar *bufn = g_strconcat(
"(CRIT) - ", buf_tmp, NULL);
413 TRACE_CALL(__func__);
420 text = g_strdup_vprintf(fmt, args);
428 TRACE_CALL(__func__);
433 GdkEventKey *e = (GdkEventKey *)event;
435 if ((e->state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK) {
436 if (e->keyval == GDK_KEY_t) {
447 TRACE_CALL(__func__);
448 GtkWidget *scrolledwindow;
451 gtk_container_set_border_width(GTK_CONTAINER(logwin), 4);
453 scrolledwindow = gtk_scrolled_window_new(NULL, NULL);
454 gtk_widget_show(scrolledwindow);
455 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
456 gtk_container_add(GTK_CONTAINER(logwin), scrolledwindow);
458 widget = gtk_text_view_new();
459 gtk_widget_show(widget);
460 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(widget), GTK_WRAP_WORD_CHAR);
461 gtk_text_view_set_editable(GTK_TEXT_VIEW(widget), FALSE);
462 gtk_text_view_set_monospace(GTK_TEXT_VIEW(widget), TRUE);
463 gtk_container_add(GTK_CONTAINER(scrolledwindow), widget);
465 logwin->
log_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget));
void remmina_log_start(void)
void _remmina_critical(const gchar *fun, const gchar *fmt,...)
static void remmina_log_start_stop(GtkSwitch *logswitch, gpointer user_data)
void _remmina_warning(const gchar *fun, const gchar *fmt,...)
void _remmina_audit(const gchar *fun, const gchar *fmt,...)
static gboolean remmina_log_print_real(gpointer data)
struct _RemminaLogWindowClass RemminaLogWindowClass
static gboolean remmina_log_scroll_to_end(gpointer data)
void _remmina_debug(const gchar *fun, const gchar *fmt,...)
Print a string in the Remmina Debug Windows and in the terminal.
GtkTextBuffer * log_buffer
gboolean remmina_log_running(void)
G_DEFINE_TYPE(RemminaConnectionWindow, rcw, GTK_TYPE_WINDOW)
gboolean remmina_pref_get_boolean(const gchar *key)
static void remmina_log_window_init(RemminaLogWindow *logwin)
void _remmina_info(const gchar *fmt,...)
static gboolean remmina_log_on_keypress(GtkWidget *widget, GdkEvent *event, gpointer user_data)
GType remmina_log_window_get_type(void)
static GtkWidget * remmina_log_window_new(void)
JsonNode * remmina_stats_get_all()
Get all statistics in JSON format to send periodically to the PHP server.
struct _RemminaLogWindow RemminaLogWindow
static GtkWidget * log_window
void remmina_log_printf(const gchar *fmt,...)
static void remmina_log_window_class_init(RemminaLogWindowClass *klass)
void remmina_log_print(const gchar *text)
void _remmina_message(const gchar *fmt,...)
static void remmina_log_end(GtkWidget *widget, gpointer data)
void _remmina_error(const gchar *fun, const gchar *fmt,...)
GtkWindowClass parent_class