43 #include <gio/gdesktopappinfo.h>
45 #include <gdk/gdkkeysyms.h>
46 #include <glib/gi18n.h>
73 #define RM_GET_OBJECT(object_name) gtk_builder_get_object(remminamain->builder, object_name)
90 "x-scheme-handler/rdp",
91 "x-scheme-handler/spice",
92 "x-scheme-handler/vnc",
93 "x-scheme-handler/remmina",
94 "application/x-remmina",
131 {
"text/uri-list", 0, 1 }
136 "RDP",
"VNC",
"SSH",
"NX",
"SPICE",
"X2GO"
144 TRACE_CALL(__func__);
145 if ((gdk_window_get_state(gtk_widget_get_window(GTK_WIDGET(
remminamain->
window))) & GDK_WINDOW_STATE_MAXIMIZED) == 0) {
155 TRACE_CALL(__func__);
169 TRACE_CALL(__func__);
185 TRACE_CALL(__func__);
198 TRACE_CALL(__func__);
223 TRACE_CALL(__func__);
230 TRACE_CALL(__func__);
240 TRACE_CALL(__func__);
245 return G_SOURCE_REMOVE;
253 TRACE_CALL(__func__);
266 TRACE_CALL(__func__);
277 GtkBuilder *dlgbuilder = NULL;
281 static gboolean shown_once = FALSE;
282 gboolean need_snap_interface_connections = FALSE;
291 g_print(
"Remmina is compiled as a SNAP package.\n");
294 g_print(
" but we can’t find the secret plugin inside the SNAP.\n");
295 need_snap_interface_connections = TRUE;
298 g_print(
" but we can’t access a secret service. Secret service or SNAP interface connection is missing.\n");
299 need_snap_interface_connections = TRUE;
305 dsa = GTK_WIDGET(gtk_builder_get_object(dlgbuilder,
"dontshowagain"));
308 dlg = GTK_WIDGET(gtk_builder_get_object(dlgbuilder,
"SnapInfoDlg"));
310 gtk_window_set_transient_for(GTK_WINDOW(dlg), parent);
311 gtk_builder_connect_signals(dlgbuilder, NULL);
312 result = gtk_dialog_run(GTK_DIALOG(dlg));
317 gtk_widget_destroy(dlg);
318 g_object_unref(dlgbuilder);
326 gboolean path_currently_selected, gpointer user_data)
328 TRACE_CALL(__func__);
333 if (path_currently_selected)
336 if (!gtk_tree_model_get_iter(model, &iter, path))
341 gtk_tree_model_get(model, &iter,
360 TRACE_CALL(__func__);
364 store = GTK_LIST_STORE(user_data);
368 gtk_list_store_append(store, &iter);
369 gtk_list_store_set(store, &iter,
385 TRACE_CALL(__func__);
393 iter = g_new0(GtkTreeIter, 1);
394 gtk_tree_store_append(store, iter, parent);
395 gtk_tree_store_set(store, iter,
404 for (child = g_node_first_child(
node); child; child = g_node_next_sibling(child))
412 TRACE_CALL(__func__);
422 TRACE_CALL(__func__);
425 gchar *group, *filename;
433 if (filename == NULL) {
435 path = gtk_tree_model_get_path(tree, iter);
437 gtk_tree_path_free(path);
439 if (gtk_tree_model_iter_children(tree, &child, iter))
445 ret = gtk_tree_model_iter_next(tree, iter);
451 TRACE_CALL(__func__);
460 TRACE_CALL(__func__);
462 gchar *group, *filename;
469 match = (filename == NULL && g_strcmp0(group, match_group) == 0);
474 if (gtk_tree_model_iter_children(tree, &child, iter)) {
477 memcpy(iter, &child,
sizeof(GtkTreeIter));
481 ret = gtk_tree_model_iter_next(tree, iter);
488 TRACE_CALL(__func__);
489 GtkTreeIter iter, child;
492 gchar *datetime = NULL;
494 store = GTK_TREE_STORE(user_data);
497 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter))
503 gtk_tree_store_append(store, &child, (found ? &iter : NULL));
504 gtk_tree_store_set(store, &child,
520 TRACE_CALL(__func__);
524 gtk_tree_sortable_get_sort_column_id(sortable, &columnid, &order);
532 TRACE_CALL(__func__);
534 gchar *protocol, *name, *labels, *group, *server, *plugin, *date, *s;
535 gboolean result = TRUE;
538 if (text && text[0]) {
539 gtk_tree_model_get(model, iter,
548 if (g_strcmp0(protocol,
"folder-symbolic") != 0) {
549 s = g_ascii_strdown(name ? name :
"", -1);
552 s = g_ascii_strdown(group ? group :
"", -1);
555 s = g_ascii_strdown(server ? server :
"", -1);
558 s = g_ascii_strdown(plugin ? plugin :
"", -1);
561 s = g_ascii_strdown(date ? date :
"", -1);
564 result = (strstr(name, text) || strstr(group, text) || strstr(server, text) || strstr(plugin, text) || strstr(date, text));
568 s = g_ascii_strdown(labels ? labels :
"", -1);
572 if (strlen(labels) > 0) {
573 gboolean labels_result = TRUE;
574 gchar **labels_array = g_strsplit(labels,
",", -1);
575 gchar **text_array = g_strsplit(text,
",", -1);
577 for (
int t = 0; (NULL != text_array[t]); t++) {
578 if (0 == strlen(text_array[t])) {
582 gboolean text_result = FALSE;
584 for (
int l = 0; (NULL != labels_array[l]); l++) {
585 if (0 == strlen(labels_array[l])) {
589 text_result = (text_result || strstr(labels_array[l], text_array[t]));
596 labels_result = (labels_result && text_result);
598 if (!labels_result) {
603 result = (result || labels_result);
605 g_strfreev(labels_array);
606 g_strfreev(text_array);
623 TRACE_CALL(__func__);
626 gchar *item_filename;
634 cmp = g_strcmp0(item_filename, filename);
635 g_free(item_filename);
641 gtk_tree_path_free(path);
651 TRACE_CALL(__func__);
656 gboolean always_show_notes;
657 char *save_selected_filename;
658 GtkTreeModel *newmodel;
659 const gchar *neticon;
660 const gchar *connection_tooltip;
679 switch (view_file_mode) {
682 newmodel = GTK_TREE_MODEL(gtk_tree_store_new(9, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING));
694 newmodel = GTK_TREE_MODEL(gtk_list_store_new(9, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING));
704 if (!always_show_notes){
727 if (save_selected_filename) {
729 g_free(save_selected_filename);
735 gtk_widget_set_tooltip_text(GTK_WIDGET(label),
736 _(
"The latest successful connection attempt, or a pre-computed date"));
738 g_snprintf(buf,
sizeof(buf), ngettext(
"Total %i item.",
"Total %i items.", items_count), items_count);
745 neticon = g_strdup(
"network-transmit-receive-symbolic");
746 connection_tooltip = g_strdup(_(
"Network status: fully online"));
748 neticon = g_strdup(
"network-offline-symbolic");
749 connection_tooltip = g_strdup(_(
"Network status: offline"));
754 GIcon *icon = g_themed_icon_new (neticon);
758 g_object_unref (icon);
767 TRACE_CALL(__func__);
773 TRACE_CALL(__func__);
782 if (remminafile == NULL)
801 TRACE_CALL(__func__);
810 TRACE_CALL(__func__);
819 TRACE_CALL(__func__);
822 const gchar *username;
825 const gchar *gatewayusername;
826 const gchar *gatewaydomain;
828 username = domain = group = gatewayusername = gatewaydomain =
"";
839 if (remminafile != NULL) {
850 if (remminafile != NULL)
856 TRACE_CALL(__func__);
870 gtk_widget_show(widget);
876 TRACE_CALL(__func__);
877 if (event->keyval == GDK_KEY_Escape) {
879 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(RM_GET_OBJECT(
"search_toggle")), FALSE);
887 TRACE_CALL(__func__);
888 if (gtk_tree_view_row_expanded(tree, path))
889 gtk_tree_view_collapse_row(tree, path);
891 gtk_tree_view_expand_row(tree, path, FALSE);
916 TRACE_CALL(__func__);
943 gtk_widget_show(widget);
952 TRACE_CALL(__func__);
974 gtk_widget_show(widget);
983 TRACE_CALL(__func__);
1002 dialog = gtk_message_dialog_new(
remminamain->
window, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,
1004 if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_YES) {
1007 g_free(delfilename), delfilename = NULL;
1011 gtk_widget_destroy(dialog);
1017 TRACE_CALL(__func__);
1021 GList *list = gtk_tree_selection_get_selected_rows(sel, &model);
1022 gchar *file_to_delete;
1024 dialog = gtk_message_dialog_new(
remminamain->
window, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,
1025 _(
"Are you sure you want to delete the selected files?"));
1028 if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_YES) {
1030 GtkTreePath *path = list->data;
1033 if (!gtk_tree_model_get_iter(model, &iter, path)) {
1034 GtkWidget *dialog_warning;
1035 dialog_warning = gtk_message_dialog_new(
remminamain->
window, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
1036 _(
"Failed to delete files!"));
1037 gtk_dialog_run(GTK_DIALOG(dialog_warning));
1038 gtk_widget_destroy(dialog_warning);
1039 gtk_widget_destroy(dialog);
1044 gtk_tree_model_get(model, &iter,
1060 gchar *delfilename = g_strdup(file_to_delete);
1062 g_free(delfilename), delfilename = NULL;
1065 list = g_list_next(list);
1069 gtk_widget_destroy(dialog);
1075 TRACE_CALL(__func__);
1076 GVariant *v = g_variant_new(
"i", 0);
1083 GtkSettings *settings;
1084 settings = gtk_settings_get_default();
1099 TRACE_CALL(__func__);
1101 REMMINA_DEBUG(
"Opening the preferences");
1105 REMMINA_DEBUG(
"Parameter passed to preferences of type %s", g_variant_get_type_string(param));
1106 tab_num = g_variant_get_int32(param);
1107 REMMINA_DEBUG(
"We got a parameter for the preferences: %d", tab_num);
1118 gtk_widget_show(widget);
1123 TRACE_CALL(__func__);
1125 g_autoptr(GError) error = NULL;
1126 GDesktopAppInfo *desktop_info;
1127 GAppInfo *info = NULL;
1128 g_autofree gchar *
id = g_strconcat(REMMINA_APP_ID,
".desktop", NULL);
1131 desktop_info = g_desktop_app_info_new(
id);
1135 info = G_APP_INFO(desktop_info);
1139 g_warning(
"Failed to set '%s' as the default application for secondary content type '%s': %s",
1142 g_debug(
"Set '%s' as the default application for '%s'",
1143 g_app_info_get_name(info),
1152 TRACE_CALL(__func__);
1153 g_debug(
"Quit intercept");
1169 GtkWindow *mainwindow;
1170 gboolean visible = gtk_entry_get_visibility(GTK_ENTRY(widget));
1177 gtk_entry_set_visibility(GTK_ENTRY(widget), FALSE);
1178 gtk_entry_set_icon_from_icon_name(GTK_ENTRY(widget), GTK_ENTRY_ICON_SECONDARY,
"org.remmina.Remmina-password-reveal-symbolic");
1180 gtk_entry_set_visibility(GTK_ENTRY(widget), TRUE);
1181 gtk_entry_set_icon_from_icon_name(GTK_ENTRY(widget), GTK_ENTRY_ICON_SECONDARY,
"org.remmina.Remmina-password-conceal-symbolic");
1187 TRACE_CALL(__func__);
1196 err = g_string_new(NULL);
1198 for (element = files; element; element = element->next) {
1199 path = (gchar *)element->data;
1206 g_string_append(err, path);
1207 g_string_append_c(err,
'\n');
1215 g_slist_free(files);
1218 dlg = gtk_message_dialog_new(
remminamain->
window, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
1219 _(
"Unable to import:\n%s"), err->str);
1220 g_signal_connect(G_OBJECT(dlg),
"response", G_CALLBACK(gtk_widget_destroy), NULL);
1221 gtk_widget_show(dlg);
1223 g_string_free(err, TRUE);
1230 TRACE_CALL(__func__);
1233 if (response_id == GTK_RESPONSE_ACCEPT) {
1234 files = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog));
1237 gtk_native_dialog_destroy(dialog);
1242 GtkFileFilter *filter;
1244 g_return_if_fail(GTK_IS_FILE_CHOOSER(chooser));
1246 filter = gtk_file_filter_new();
1247 gtk_file_filter_set_name(filter, _(
"RDP Files"));
1248 gtk_file_filter_add_pattern(filter,
"*.rdp");
1249 gtk_file_filter_add_pattern(filter,
"*.rdpx");
1250 gtk_file_filter_add_pattern(filter,
"*.RDP");
1251 gtk_file_filter_add_pattern(filter,
"*.RDPX");
1252 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), filter);
1253 gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(chooser), filter);
1255 filter = gtk_file_filter_new();
1256 gtk_file_filter_set_name(filter, _(
"All Files"));
1257 gtk_file_filter_add_pattern(filter,
"*");
1258 gtk_file_chooser_add_filter(chooser, filter);
1263 TRACE_CALL(__func__);
1264 GtkFileChooserNative *chooser;
1267 GTK_FILE_CHOOSER_ACTION_OPEN, _(
"Import"), _(
"_Cancel"));
1268 gtk_native_dialog_set_modal(GTK_NATIVE_DIALOG(chooser), TRUE);
1270 gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(chooser), TRUE);
1272 gtk_native_dialog_show(GTK_NATIVE_DIALOG(chooser));
1277 if (response == GTK_RESPONSE_ACCEPT) {
1280 gchar *path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
1286 gtk_native_dialog_destroy(GTK_NATIVE_DIALOG(dialog));
1291 TRACE_CALL(__func__);
1295 GtkFileChooserNative *chooser;
1299 dialog = gtk_message_dialog_new(
remminamain->
window, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
1300 _(
"Select the connection profile."));
1301 g_signal_connect(G_OBJECT(dialog),
"response", G_CALLBACK(gtk_widget_destroy), NULL);
1302 gtk_widget_show(dialog);
1307 if (remminafile == NULL) {
1308 dialog = gtk_message_dialog_new(
remminamain->
window, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
1309 _(
"Remmina couldn't export."));
1310 g_signal_connect(G_OBJECT(dialog),
"response", G_CALLBACK(gtk_widget_destroy), NULL);
1311 gtk_widget_show(dialog);
1318 GTK_FILE_CHOOSER_ACTION_SAVE, _(
"_Save"), _(
"_Cancel"));
1319 gtk_native_dialog_set_modal(GTK_NATIVE_DIALOG(chooser), TRUE);
1321 gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(chooser), TRUE);
1323 gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(chooser), export_name);
1324 g_free(export_name);
1326 gtk_native_dialog_show(GTK_NATIVE_DIALOG(chooser));
1330 dialog = gtk_message_dialog_new(
remminamain->
window, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
1331 _(
"This protocol does not support exporting."));
1332 g_signal_connect(G_OBJECT(dialog),
"response", G_CALLBACK(gtk_widget_destroy), NULL);
1333 gtk_widget_show(dialog);
1340 TRACE_CALL(__func__);
1347 TRACE_CALL(__func__);
1348 GtkSettings *settings;
1350 settings = gtk_settings_get_default();
1363 TRACE_CALL(__func__);
1364 g_app_info_launch_default_for_uri(
"https://www.remmina.org", NULL, NULL);
1369 TRACE_CALL(__func__);
1370 g_app_info_launch_default_for_uri(
"https://gitlab.com/Remmina/Remmina/wikis/home", NULL, NULL);
1375 TRACE_CALL(__func__);
1376 g_app_info_launch_default_for_uri(
"https://remmina.org/community", NULL, NULL);
1381 TRACE_CALL(__func__);
1382 g_app_info_launch_default_for_uri(
"https://www.remmina.org/donations", NULL, NULL);
1387 TRACE_CALL(__func__);
1393 TRACE_CALL(__func__);
1399 TRACE_CALL(__func__);
1408 if (!isspace((
unsigned char)*s))
1417 TRACE_CALL(__func__);
1420 gchar *server_trimmed;
1434 if (g_hostname_to_ascii(server) == NULL)
1440 if (g_strrstr(server,
"/") != NULL)
1448 server_trimmed = g_strdup(server);
1449 g_strstrip(server_trimmed);
1450 gchar **strings = g_strsplit(server_trimmed,
":", 2);
1452 if (strings[0] != NULL)
1453 if (g_hostname_is_ip_address(strings[0]))
1454 g_stpcpy(server, server_trimmed);
1461 g_free(server_trimmed);
1471 TRACE_CALL(__func__);
1486 TRACE_CALL(__func__);
1492 TRACE_CALL(__func__);
1493 REMMINA_DEBUG(
"Search toggle triggered");
1498 if (toggle_status) {
1499 REMMINA_DEBUG(
"Search toggle is active");
1502 REMMINA_DEBUG(
"Search toggle is not active, focus is tree_files_list");
1509 TRACE_CALL(__func__);
1515 TRACE_CALL(__func__);
1522 TRACE_CALL(__func__);
1540 TRACE_CALL(__func__);
1541 if (event->button == MOUSE_BUTTON_RIGHT) {
1543 #if GTK_CHECK_VERSION(3, 22, 0)
1547 return GDK_EVENT_STOP;
1563 TRACE_CALL(__func__);
1564 if (event->keyval == GDK_KEY_Menu) {
1565 #if GTK_CHECK_VERSION(3, 22, 0)
1567 GDK_GRAVITY_CENTER, GDK_GRAVITY_CENTER,
1578 TRACE_CALL(__func__);
1579 if (icon_pos == GTK_ENTRY_ICON_SECONDARY)
1580 gtk_entry_set_text(entry,
"");
1585 TRACE_CALL(__func__);
1604 GtkSelectionData *data, guint info, guint time, gpointer user_data)
1606 TRACE_CALL(__func__);
1608 GSList *files = NULL;
1611 uris = g_uri_list_extract_uris((
const gchar *)gtk_selection_data_get_data(data));
1612 for (i = 0; uris[i]; i++) {
1613 if (strncmp(uris[i],
"file://", 7) != 0)
1615 files = g_slist_append(files, g_strdup(uris[i] + 7));
1624 TRACE_CALL(__func__);
1626 GtkWidget *menuitem = gtk_menu_item_new_with_label(plugin->
description);
1628 gtk_widget_show(menuitem);
1630 g_signal_connect(G_OBJECT(menuitem),
"activate", G_CALLBACK(tool_plugin->
exec_func), tool_plugin);
1636 TRACE_CALL(__func__);
1643 TRACE_CALL(__func__);
1644 int i, qcp_idx, qcp_actidx;
1646 GtkSettings *settings;
1648 REMMINA_DEBUG(
"Initializing the Remmina main window");
1650 settings = gtk_settings_get_default();
1653 REMMINA_DEBUG (
"Initializing monitor");
1668 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(RM_GET_OBJECT(
"search_toggle")), FALSE);
1674 qcp_idx = qcp_actidx = 0;
1680 qcp_actidx = qcp_idx;
1691 gtk_tree_selection_set_select_function(
1715 TRACE_CALL(__func__);
1724 TRACE_CALL(__func__);
1725 GSimpleActionGroup *actions;
1726 GtkAccelGroup *accel_group = NULL;
1782 actions = g_simple_action_group_new();
1784 gtk_widget_insert_action_group(GTK_WIDGET(
remminamain->
window),
"app", G_ACTION_GROUP(actions));
1786 gtk_widget_insert_action_group(GTK_WIDGET(
remminamain->
window),
"main", G_ACTION_GROUP(actions));
1787 g_object_unref(actions);
1789 accel_group = gtk_accel_group_new();
1791 gtk_accel_group_connect(accel_group, GDK_KEY_Q, GDK_CONTROL_MASK, 0,
1794 gtk_accel_group_connect(accel_group, GDK_KEY_P, GDK_CONTROL_MASK, 0,
1796 gtk_accel_group_connect(accel_group, GDK_KEY_F, GDK_CONTROL_MASK, 0,
1829 dialog = gtk_message_dialog_new(
remminamain->
window, GTK_DIALOG_MODAL, msg, buttons,
"%s", message);
1830 gtk_dialog_run(GTK_DIALOG(dialog));
1831 gtk_widget_destroy(dialog);
1839 dialog = gtk_message_dialog_new(
remminamain->
window, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE,
1840 message, g_get_application_name());
1841 gtk_dialog_run(GTK_DIALOG(dialog));
1842 gtk_widget_destroy(dialog);
@ REMMINA_PLUGIN_TYPE_PROTOCOL
@ REMMINA_PLUGIN_TYPE_TOOL
void rcw_open_from_file(RemminaFile *remminafile)
gboolean rcw_open_from_filename(const gchar *filename)
void remmina_about_open(GtkWindow *parent)
void remmina_bug_report_open(GtkWindow *parent)
void remmina_application_condexit(RemminaCondExitType why)
@ REMMINA_CONDEXIT_ONQUIT
@ REMMINA_CONDEXIT_ONMAINWINDELETE
const gchar * remmina_file_get_icon_name(RemminaFile *remminafile)
void remmina_file_touch(RemminaFile *remminafile)
Update the atime and mtime of a given filename.
gint remmina_file_get_int(RemminaFile *remminafile, const gchar *setting, gint default_value)
void remmina_file_delete(const gchar *filename)
RemminaFile * remmina_file_new(void)
void remmina_file_set_string(RemminaFile *remminafile, const gchar *setting, const gchar *value)
void remmina_file_save(RemminaFile *remminafile)
const gchar * remmina_file_get_string(RemminaFile *remminafile, const gchar *setting)
gchar * remmina_file_get_datetime(RemminaFile *remminafile)
Return the string date of the last time a Remmina state file has been modified.
void remmina_file_free(RemminaFile *remminafile)
RemminaFile * remmina_file_load(const gchar *filename)
void remmina_file_generate_filename(RemminaFile *remminafile)
Generate a new Remmina connection profile file name.
const gchar * remmina_file_get_filename(RemminaFile *remminafile)
GtkWidget * remmina_file_editor_new(void)
GtkWidget * remmina_file_editor_new_copy(const gchar *filename)
GtkWidget * remmina_file_editor_new_from_filename(const gchar *filename)
void remmina_file_manager_free_group_tree(GNode *node)
gint remmina_file_manager_iterate(GFunc func, gpointer user_data)
GNode * remmina_file_manager_get_group_tree(void)
G_BEGIN_DECLS struct _RemminaGroupData RemminaGroupData
void remmina_icon_populate_menu(void)
void remmina_log_start(void)
void remmina_main_save_before_destroy()
Save the Remmina Main Window size and the expanded group before to close Remmina.
void remmina_main_on_action_application_default(GSimpleAction *action, GVariant *param, gpointer data)
void remmina_main_on_action_help_wiki(GSimpleAction *action, GVariant *param, gpointer data)
void remmina_main_on_action_collapse(GSimpleAction *action, GVariant *param, gpointer data)
void remmina_main_on_action_connection_delete(GSimpleAction *action, GVariant *param, gpointer data)
void remmina_main_reload_preferences()
void remmina_main_quick_search_on_changed(GtkEditable *editable, gpointer user_data)
void remmina_main_on_accel_application_preferences(GSimpleAction *action, GVariant *param, gpointer data)
static gboolean is_empty(const gchar *s)
gboolean remmina_main_quickconnect_on_click(GtkWidget *widget, gpointer user_data)
void remmina_main_on_action_application_bug_report(GSimpleAction *action, GVariant *param, gpointer data)
static void remmina_set_file_chooser_filters(GtkFileChooser *chooser)
void remmina_main_on_action_help_donations(GSimpleAction *action, GVariant *param, gpointer data)
static gboolean remmina_main_load_file_tree_traverse(GNode *node, GtkTreeStore *store, GtkTreeIter *parent)
gboolean remmina_main_file_list_on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
static gboolean remmina_main_dexit(gpointer data)
Try to exit remmina after a delete window event.
static void remmina_main_load_files()
static gboolean remmina_main_selection_func(GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path, gboolean path_currently_selected, gpointer user_data)
void remmina_main_on_date_column_sort_clicked()
gboolean remmina_main_on_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
static gboolean remmina_main_tree_row_activated(GtkTreeView *tree, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
void remmina_main_on_action_connection_copy(GSimpleAction *action, GVariant *param, gpointer data)
static void remmina_main_expand_group(void)
void remmina_main_on_action_tools_import(GSimpleAction *action, GVariant *param, gpointer data)
static void remmina_main_save_expanded_group_func(GtkTreeView *tree_view, GtkTreePath *path, gpointer user_data)
void remmina_main_on_action_connection_new(GSimpleAction *action, GVariant *param, gpointer data)
void remmina_main_on_action_application_quit(GSimpleAction *action, GVariant *param, gpointer data)
static void remmina_main_action_tools_import_on_response(GtkNativeDialog *dialog, gint response_id, gpointer user_data)
void remmina_main_update_file_datetime(RemminaFile *file)
void remmina_main_on_action_help_debug(GSimpleAction *action, GVariant *param, gpointer data)
void remmina_main_load_files_cb(GtkEntry *entry, char *string, gpointer user_data)
static void remmina_main_file_editor_destroy(GtkWidget *widget, gpointer user_data)
void remmina_main_on_action_connection_connect(GSimpleAction *action, GVariant *param, gpointer data)
void remmina_main_quick_search_enter(GtkWidget *widget, gpointer user_data)
void remmina_main_on_action_application_preferences(GSimpleAction *action, GVariant *param, gpointer data)
void remmina_main_on_action_help_homepage(GSimpleAction *action, GVariant *param, gpointer data)
static void remmina_main_load_file_list_callback(RemminaFile *remminafile, gpointer user_data)
static void remmina_main_file_model_on_sort(GtkTreeSortable *sortable, gpointer user_data)
static void remmina_main_expand_group_traverse(GtkTreeIter *iter)
GtkWindow * remmina_main_get_window()
static gboolean remmina_main_add_tool_plugin(gchar *name, RemminaPlugin *plugin, gpointer user_data)
static gboolean remmina_main_quickconnect(void)
gboolean remmina_main_idle_destroy(gpointer data)
static gboolean remmina_main_load_file_tree_find(GtkTreeModel *tree, GtkTreeIter *iter, const gchar *match_group)
gboolean remmina_main_on_window_state_event(GtkWidget *widget, GdkEventWindowState *event, gpointer user_data)
static GtkTargetEntry remmina_drop_types[]
static const gchar * supported_mime_types[]
void remmina_main_on_action_application_dark_theme(GSimpleAction *action, GVariant *param, gpointer data)
static GActionEntry app_actions[]
void remmina_main_destroy()
void remmina_main_on_action_search_toggle(GSimpleAction *action, GVariant *param, gpointer data)
static void on_export_save_response(GtkFileChooserNative *dialog, int response, RemminaFile *remminafile)
static void remmina_main_clear_selection_data(void)
static void remmina_main_select_file(const gchar *filename)
static void remmina_main_load_file_tree_group(GtkTreeStore *store)
void remmina_main_on_show(GtkWidget *w, gpointer user_data)
void remmina_main_on_action_application_about(GSimpleAction *action, GVariant *param, gpointer data)
void remmina_main_on_action_help_community(GSimpleAction *action, GVariant *param, gpointer data)
void remmina_main_toggle_password_view(GtkWidget *widget, gpointer data)
static char * quick_connect_plugin_list[]
static void remmina_main_show_snap_welcome()
static gboolean remmina_main_filter_visible_func(GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
void remmina_main_on_action_tools_export(GSimpleAction *action, GVariant *param, gpointer data)
void remmina_main_show_dialog(GtkMessageType msg, GtkButtonsType buttons, const gchar *message)
static RemminaMain * remminamain
void remmina_main_on_action_expand(GSimpleAction *action, GVariant *param, gpointer data)
void remmina_main_file_list_on_row_activated(GtkTreeView *tree, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
void remmina_main_on_action_connection_external_tools(GSimpleAction *action, GVariant *param, gpointer data)
void remmina_main_on_action_application_mpchange(GSimpleAction *action, GVariant *param, gpointer data)
void remmina_main_on_view_toggle()
static void remmina_main_save_size(void)
Save the Remmina Main Window size to assure the main geometry at each restart.
static void remmina_main_import_file_list(GSList *files)
gboolean remmina_main_file_list_on_button_press(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
static void remmina_main_save_expanded_group(void)
void remmina_main_show_warning_dialog(const gchar *message)
void remmina_main_on_drag_data_received(GtkWidget *widget, GdkDragContext *drag_context, gint x, gint y, GtkSelectionData *data, guint info, guint time, gpointer user_data)
void remmina_main_on_action_application_plugins(GSimpleAction *action, GVariant *param, gpointer data)
void remmina_main_on_action_connection_edit(GSimpleAction *action, GVariant *param, gpointer data)
static void remmina_main_load_file_tree_callback(RemminaFile *remminafile, gpointer user_data)
void remmina_main_on_accel_search_toggle(RemminaMain *remminamain)
void remmina_main_on_destroy_event()
Called when the remminamain->window widget is destroyed (glade event handler)
static gboolean remmina_main_search_key_event(GtkWidget *search_entry, GdkEventKey *event, gpointer user_data)
static GActionEntry main_actions[]
GtkWidget * remmina_main_new(void)
void remmina_main_quick_search_on_icon_press(GtkEntry *entry, GtkEntryIconPosition icon_pos, GdkEvent *event, gpointer user_data)
void remmina_main_on_action_connection_delete_multiple(GSimpleAction *action, GVariant *param, gpointer data)
static void remmina_main_init(void)
RemminaMonitor * remmina_network_monitor_new()
gboolean remmina_network_monitor_status(RemminaMonitor *rm_monitor)
void remmina_mpchange_schedule(gboolean has_domain, const gchar *group, const gchar *domain, const gchar *username, const gchar *password, const gchar *gatewayusername, const gchar *gatewaydomain, const gchar *gatewaypassword)
void remmina_plugin_manager_for_each_plugin(RemminaPluginType type, RemminaPluginFunc func, gpointer data)
RemminaPlugin * remmina_plugin_manager_get_plugin(RemminaPluginType type, const gchar *name)
static RemminaSecretPlugin * remmina_secret_plugin
RemminaFilePlugin * remmina_plugin_manager_get_import_file_handler(const gchar *file)
RemminaSecretPlugin * remmina_plugin_manager_get_secret_plugin(void)
void * remmina_plugin_manager_get_available_plugins()
void remmina_plugin_manager_show(GtkWindow *parent)
RemminaFilePlugin * remmina_plugin_manager_get_export_file_handler(RemminaFile *remminafile)
gboolean remmina_pref_get_boolean(const gchar *key)
gboolean remmina_pref_save(void)
GtkWidget * remmina_pref_dialog_new(gint default_tab, GtkWindow *parent)
GtkBuilder * remmina_public_gtk_builder_new_from_resource(gchar *resource)
void remmina_string_array_add(RemminaStringArray *array, const gchar *str)
RemminaStringArray * remmina_string_array_new_from_string(const gchar *strs)
void remmina_string_array_free(RemminaStringArray *array)
gchar * remmina_string_array_to_string(RemminaStringArray *array)
gint remmina_string_array_find(RemminaStringArray *array, const gchar *str)
RemminaStringArray * remmina_string_array_new(void)
gint remmina_unlock_new(GtkWindow *parent)
RemminaFile *(* import_func)(struct _RemminaFilePlugin *instance, const gchar *from_file)
gboolean(* export_func)(struct _RemminaFilePlugin *instance, RemminaFile *file, const gchar *to_file)
const gchar * export_hints
GtkMenu * menu_popup_full
GtkTreeViewColumn * column_files_list_date
GtkComboBoxText * combo_quick_connect_protocol
GtkTreeViewColumn * column_files_list_group
GtkRadioMenuItem * menuitem_view_mode_list
GtkRadioMenuItem * menuitem_view_mode_tree
GtkBox * box_quick_connect
GtkTreeViewColumn * column_files_list_server
GtkTreeView * tree_files_list
GtkTreeViewColumn * column_files_list_plugin
GtkSwitch * switch_dark_mode
GtkMenu * menu_popup_delete_rc
GtkTreeViewColumn * column_files_list_name
GtkMenuButton * menu_header_button
GtkTreeViewColumn * column_files_list_notes
GtkEntry * entry_quick_connect_server
GtkStatusbar * statusbar_main
GtkToggleButton * search_toggle
GtkToggleButton * view_toggle_button
GtkSearchBar * search_bar
gboolean override_view_file_mode_to_list
gchar * selected_filename
RemminaStringArray * expanded_group
GtkTreeModel * file_model_sort
GtkTreeModel * file_model_filter
GtkTreeModel * file_model
const gchar * description
gboolean prevent_snap_welcome_message
gboolean always_show_notes
gchar * last_quickconnect_protocol
gboolean(* is_service_available)(struct _RemminaSecretPlugin *instance)
typedefG_BEGIN_DECLS struct _RemminaFile RemminaFile