39 #include <gio/gdesktopappinfo.h> 40 #include <gdk/gdkkeysyms.h> 41 #include <glib/gi18n.h> 67 #define RM_GET_OBJECT(object_name) gtk_builder_get_object(remminamain->builder, object_name) 84 "x-scheme-handler/rdp",
85 "x-scheme-handler/spice",
86 "x-scheme-handler/vnc",
87 "x-scheme-handler/remmina",
88 "application/x-remmina",
119 {
"text/uri-list", 0, 1 }
124 "RDP",
"VNC",
"SSH",
"NX",
"SPICE" 132 TRACE_CALL(__func__);
133 if ((gdk_window_get_state(gtk_widget_get_window(GTK_WIDGET(remminamain->
window))) & GDK_WINDOW_STATE_MAXIMIZED) == 0) {
143 TRACE_CALL(__func__);
157 TRACE_CALL(__func__);
174 if (!remminamain || !remminamain->
window)
186 TRACE_CALL(__func__);
193 TRACE_CALL(__func__);
197 remminamain->
window = NULL;
216 g_object_unref(remminamain->
builder);
219 g_free(remminamain->
priv);
229 TRACE_CALL(__func__);
242 TRACE_CALL(__func__);
253 GtkBuilder *dlgbuilder = NULL;
257 static gboolean shown_once = FALSE;
258 gboolean need_snap_interface_connections = FALSE;
267 g_print(
"Remmina is compiled as a SNAP package.\n");
269 if (remmina_secret_plugin == NULL) {
270 g_print(
" but we can’t find the secret plugin inside the SNAP.\n");
271 need_snap_interface_connections = TRUE;
274 g_print(
" but we can’t access a secret service. Secret service or SNAP interface connection is missing.\n");
275 need_snap_interface_connections = TRUE;
281 dsa = GTK_WIDGET(gtk_builder_get_object(dlgbuilder,
"dontshowagain"));
284 dlg = GTK_WIDGET(gtk_builder_get_object(dlgbuilder,
"snapwarndlg"));
286 gtk_window_set_transient_for(GTK_WINDOW(dlg), parent);
287 gtk_builder_connect_signals(dlgbuilder, NULL);
288 result = gtk_dialog_run(GTK_DIALOG(dlg));
293 gtk_widget_destroy(dlg);
294 g_object_unref(dlgbuilder);
303 gboolean path_currently_selected, gpointer user_data)
305 TRACE_CALL(__func__);
310 if (path_currently_selected)
313 if (!gtk_tree_model_get_iter(model, &iter, path))
321 context_id = gtk_statusbar_get_context_id(remminamain->
statusbar_main,
"status");
334 TRACE_CALL(__func__);
337 store = GTK_LIST_STORE(user_data);
341 gtk_list_store_append(store, &iter);
342 gtk_list_store_set(store, &iter,
356 TRACE_CALL(__func__);
364 iter = g_new0(GtkTreeIter, 1);
365 gtk_tree_store_append(store, iter, parent);
366 gtk_tree_store_set(store, iter,
374 for (child = g_node_first_child(node); child; child = g_node_next_sibling(child)) {
383 TRACE_CALL(__func__);
393 TRACE_CALL(__func__);
396 gchar *group, *filename;
404 if (filename == NULL) {
406 path = gtk_tree_model_get_path(tree, iter);
408 gtk_tree_path_free(path);
410 if (gtk_tree_model_iter_children(tree, &child, iter)) {
417 ret = gtk_tree_model_iter_next(tree, iter);
423 TRACE_CALL(__func__);
433 TRACE_CALL(__func__);
435 gchar *group, *filename;
442 match = (filename == NULL && g_strcmp0(group, match_group) == 0);
447 if (gtk_tree_model_iter_children(tree, &child, iter)) {
450 memcpy(iter, &child,
sizeof(GtkTreeIter));
454 ret = gtk_tree_model_iter_next(tree, iter);
461 TRACE_CALL(__func__);
462 GtkTreeIter iter, child;
467 store = GTK_TREE_STORE(user_data);
470 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter)) {
476 gtk_tree_store_append(store, &child, (found ? &iter : NULL));
477 gtk_tree_store_set(store, &child,
491 TRACE_CALL(__func__);
495 gtk_tree_sortable_get_sort_column_id(sortable, &columnid, &order);
503 TRACE_CALL(__func__);
505 gchar *protocol, *name, *group, *server, *plugin, *date, *s;
506 gboolean result = TRUE;
509 if (text && text[0]) {
510 gtk_tree_model_get(model, iter,
518 if (g_strcmp0(protocol,
"folder-symbolic") != 0) {
519 s = g_ascii_strdown(name ? name :
"", -1);
522 s = g_ascii_strdown(group ? group :
"", -1);
525 s = g_ascii_strdown(server ? server :
"", -1);
528 s = g_ascii_strdown(plugin ? plugin :
"", -1);
531 s = g_ascii_strdown(date ? date :
"", -1);
534 result = (strstr(name, text) || strstr(group, text) || strstr(server, text) || strstr(plugin, text) || strstr(date, text));
549 TRACE_CALL(__func__);
552 gchar *item_filename;
560 cmp = g_strcmp0(item_filename, filename);
561 g_free(item_filename);
563 gtk_tree_selection_select_iter(gtk_tree_view_get_selection(remminamain->
tree_files_list),
566 gtk_tree_view_scroll_to_cell(remminamain->
tree_files_list, path, NULL, TRUE, 0.5, 0.0);
567 gtk_tree_path_free(path);
577 TRACE_CALL(__func__);
582 char *save_selected_filename;
583 GtkTreeModel *newmodel;
602 switch (view_file_mode) {
605 newmodel = GTK_TREE_MODEL(gtk_tree_store_new(7, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING));
617 newmodel = GTK_TREE_MODEL(gtk_list_store_new(7, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING));
636 gtk_tree_sortable_set_sort_column_id( GTK_TREE_SORTABLE(remminamain->
priv->
file_model_sort),
644 if (save_selected_filename) {
646 g_free(save_selected_filename);
649 g_snprintf(buf,
sizeof(buf), ngettext(
"Total %i item.",
"Total %i items.", items_count), items_count);
650 context_id = gtk_statusbar_get_context_id(remminamain->
statusbar_main,
"status");
657 TRACE_CALL(__func__);
663 TRACE_CALL(__func__);
672 if (remminafile == NULL)
683 TRACE_CALL(__func__);
695 TRACE_CALL(__func__);
701 TRACE_CALL(__func__);
704 const gchar *username;
708 username = domain = group =
"";
713 if (remminafile != NULL) {
725 if (remminafile != NULL)
732 TRACE_CALL(__func__);
740 gtk_window_set_transient_for(GTK_WINDOW(widget), remminamain->
window);
741 gtk_widget_show(widget);
747 if (gtk_toggle_button_get_active(remminamain->
search_toggle)) {
748 gtk_search_bar_set_search_mode(remminamain->
search_bar, TRUE);
750 gtk_search_bar_set_search_mode(remminamain->
search_bar, FALSE);
775 TRACE_CALL(__func__);
787 gtk_window_set_transient_for(GTK_WINDOW(widget), remminamain->
window);
788 gtk_widget_show(widget);
798 TRACE_CALL(__func__);
809 gtk_window_set_transient_for(GTK_WINDOW(widget), remminamain->
window);
810 gtk_widget_show(widget);
820 TRACE_CALL(__func__);
830 dialog = gtk_message_dialog_new(remminamain->
window, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,
832 if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_YES) {
839 gtk_widget_destroy(dialog);
845 TRACE_CALL(__func__);
849 gtk_dialog_run(dialog);
850 gtk_widget_destroy(GTK_WIDGET(dialog));
855 TRACE_CALL(__func__);
856 g_autoptr(GError) error = NULL;
857 GDesktopAppInfo *desktop_info;
858 GAppInfo *info = NULL;
859 g_autofree gchar *
id = g_strconcat (REMMINA_APP_ID,
".desktop", NULL);
862 desktop_info = g_desktop_app_info_new (
id);
866 info = G_APP_INFO (desktop_info);
870 g_warning (
"Failed to set '%s' as the default application for secondary content type '%s': %s",
873 g_debug (
"Set '%s' as the default application for '%s'",
874 g_app_info_get_name (info),
882 TRACE_CALL(__func__);
883 g_debug (
"Quit intercept");
899 TRACE_CALL(__func__);
908 err = g_string_new(NULL);
910 for (element = files; element; element = element->next) {
911 path = (gchar*)element->data;
918 g_string_append(err, path);
919 g_string_append_c(err,
'\n');
930 dlg = gtk_message_dialog_new(remminamain->
window, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
931 _(
"Unable to import:\n%s"), err->str);
932 g_signal_connect(G_OBJECT(dlg),
"response", G_CALLBACK(gtk_widget_destroy), NULL);
933 gtk_widget_show(dlg);
935 g_string_free(err, TRUE);
943 TRACE_CALL(__func__);
946 if (response_id == GTK_RESPONSE_ACCEPT) {
947 files = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog));
950 gtk_widget_destroy(GTK_WIDGET(dialog));
955 TRACE_CALL(__func__);
958 dialog = gtk_file_chooser_dialog_new(_(
"Import"), remminamain->
window, GTK_FILE_CHOOSER_ACTION_OPEN,
"Import",
959 GTK_RESPONSE_ACCEPT, NULL);
960 gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), TRUE);
962 gtk_widget_show(dialog);
967 TRACE_CALL(__func__);
976 if (remminafile == NULL)
981 GTK_FILE_CHOOSER_ACTION_SAVE, _(
"_Save"), GTK_RESPONSE_ACCEPT, NULL);
982 if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
983 plugin->
export_func(remminafile, gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)));
985 gtk_widget_destroy(dialog);
987 dialog = gtk_message_dialog_new(remminamain->
window, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
988 _(
"This protocol does not support exporting."));
989 g_signal_connect(G_OBJECT(dialog),
"response", G_CALLBACK(gtk_widget_destroy), NULL);
990 gtk_widget_show(dialog);
997 TRACE_CALL(__func__);
1003 TRACE_CALL(__func__);
1004 g_app_info_launch_default_for_uri(
"https://www.remmina.org", NULL, NULL);
1009 TRACE_CALL(__func__);
1010 g_app_info_launch_default_for_uri(
"https://gitlab.com/Remmina/Remmina/wikis/home", NULL, NULL);
1015 TRACE_CALL(__func__);
1016 g_app_info_launch_default_for_uri(
"https://remmina.org/community", NULL, NULL);
1021 TRACE_CALL(__func__);
1022 g_app_info_launch_default_for_uri(
"https://www.remmina.org/donations", NULL, NULL);
1027 TRACE_CALL(__func__);
1033 TRACE_CALL(__func__);
1039 TRACE_CALL(__func__);
1047 TRACE_CALL(__func__);
1077 TRACE_CALL(__func__);
1092 TRACE_CALL(__func__);
1098 TRACE_CALL(__func__);
1105 TRACE_CALL(__func__);
1123 TRACE_CALL(__func__);
1124 if (event->button == MOUSE_BUTTON_RIGHT) {
1126 #if GTK_CHECK_VERSION(3, 22, 0) 1127 gtk_menu_popup_at_pointer(GTK_MENU(remminamain->
menu_popup), (GdkEvent*)event);
1129 gtk_menu_popup(remminamain->
menu_popup, NULL, NULL, NULL, NULL, event->button, event->time);
1140 TRACE_CALL(__func__);
1141 if (event->keyval == GDK_KEY_Menu) {
1142 #if GTK_CHECK_VERSION(3, 22, 0) 1143 gtk_menu_popup_at_widget(GTK_MENU(remminamain->
menu_popup), widget,
1144 GDK_GRAVITY_CENTER, GDK_GRAVITY_CENTER,
1147 gtk_menu_popup(remminamain->
menu_popup, NULL, NULL, NULL, NULL, 0, event->time);
1155 TRACE_CALL(__func__);
1156 if (icon_pos == GTK_ENTRY_ICON_SECONDARY) {
1157 gtk_entry_set_text(entry,
"");
1163 TRACE_CALL(__func__);
1182 GtkSelectionData *data, guint info, guint time, gpointer user_data)
1184 TRACE_CALL(__func__);
1186 GSList *files = NULL;
1189 uris = g_uri_list_extract_uris((
const gchar*)gtk_selection_data_get_data(data));
1190 for (i = 0; uris[i]; i++) {
1191 if (strncmp(uris[i],
"file://", 7) != 0)
1193 files = g_slist_append(files, g_strdup(uris[i] + 7));
1202 TRACE_CALL(__func__);
1204 GtkWidget *menuitem = gtk_menu_item_new_with_label(plugin->
description);
1206 gtk_widget_show(menuitem);
1207 gtk_menu_shell_append(GTK_MENU_SHELL(remminamain->
menu_popup_full), menuitem);
1208 g_signal_connect(G_OBJECT(menuitem),
"activate", G_CALLBACK(tool_plugin->
exec_func), NULL);
1214 TRACE_CALL(__func__);
1221 TRACE_CALL(__func__);
1222 int i, qcp_idx, qcp_actidx;
1228 gtk_window_set_title(remminamain->
window, _(
"Remmina Remote Desktop Client"));
1230 gtk_window_set_title(remminamain->
window, _(
"Remmina Kiosk"));
1235 gtk_window_maximize(remminamain->
window);
1240 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(RM_GET_OBJECT(
"search_toggle")), FALSE);
1246 qcp_idx = qcp_actidx = 0;
1252 qcp_actidx = qcp_idx;
1263 gtk_tree_selection_set_select_function(
1278 g_object_set_data(G_OBJECT(remminamain->
window),
"tag",
"remmina-main-window");
1285 TRACE_CALL(__func__);
1294 TRACE_CALL(__func__);
1295 GSimpleActionGroup *actions;
1296 GtkAccelGroup *accel_group = NULL;
1302 remminamain->
window = GTK_WINDOW(RM_GET_OBJECT(
"RemminaMain"));
1304 gtk_window_set_position(remminamain->
window, GTK_WIN_POS_CENTER_ALWAYS);
1305 gtk_window_set_default_size(remminamain->
window, 800, 400);
1306 gtk_window_set_resizable(remminamain->
window, FALSE);
1309 remminamain->
button_new = GTK_BUTTON(RM_GET_OBJECT(
"button_new"));
1311 gtk_widget_set_sensitive(GTK_WIDGET(remminamain->
button_new), FALSE);
1313 remminamain->
search_toggle = GTK_TOGGLE_BUTTON(RM_GET_OBJECT(
"search_toggle"));
1314 remminamain->
search_bar = GTK_SEARCH_BAR(RM_GET_OBJECT(
"search_bar"));
1316 remminamain->
view_toggle_button = GTK_TOGGLE_BUTTON(RM_GET_OBJECT(
"view_toggle_button"));
1321 remminamain->
menu_popup = GTK_MENU(RM_GET_OBJECT(
"menu_popup"));
1322 remminamain->
menu_header_button = GTK_MENU_BUTTON(RM_GET_OBJECT(
"menu_header_button"));
1323 remminamain->
menu_popup_full = GTK_MENU(RM_GET_OBJECT(
"menu_popup_full"));
1325 gtk_widget_set_sensitive(GTK_WIDGET(remminamain->
menu_popup_full), FALSE);
1338 remminamain->
tree_files_list = GTK_TREE_VIEW(RM_GET_OBJECT(
"tree_files_list"));
1340 remminamain->
statusbar_main = GTK_STATUSBAR(RM_GET_OBJECT(
"statusbar_main"));
1342 actions = g_simple_action_group_new();
1344 gtk_widget_insert_action_group(GTK_WIDGET(remminamain->
window),
"main", G_ACTION_GROUP(actions));
1345 g_object_unref(actions);
1347 accel_group = gtk_accel_group_new();
1348 gtk_window_add_accel_group(remminamain->
window, accel_group);
1349 gtk_accel_group_connect (accel_group, GDK_KEY_Q, GDK_CONTROL_MASK, 0,
1351 gtk_accel_group_connect (accel_group, GDK_KEY_P, GDK_CONTROL_MASK, 0,
1355 gtk_builder_connect_signals(remminamain->
builder, NULL);
1358 return GTK_WIDGET(remminamain->
window);
1365 if (!remminamain->
priv)
1369 remminamain->
window = GTK_WINDOW(RM_GET_OBJECT(
"RemminaMain"));
1370 return remminamain->
window;
1384 if (remminamain->
window) {
1385 dialog = gtk_message_dialog_new(remminamain->
window, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE,
1386 message, g_get_application_name());
1387 gtk_dialog_run(GTK_DIALOG(dialog));
1388 gtk_widget_destroy(dialog);
G_BEGIN_DECLS struct _RemminaGroupData RemminaGroupData
RemminaFile * remmina_file_load(const gchar *filename)
static RemminaSecretPlugin * remmina_secret_plugin
void remmina_log_start(void)
static GActionEntry main_actions[]
void remmina_file_free(RemminaFile *remminafile)
GtkToggleButton * search_toggle
const gchar * remmina_file_get_string(RemminaFile *remminafile, const gchar *setting)
GtkRadioMenuItem * menuitem_view_mode_list
static void remmina_main_load_file_tree_callback(RemminaFile *remminafile, gpointer user_data)
void remmina_main_on_action_help_homepage(GSimpleAction *action, GVariant *param, gpointer data)
static void remmina_main_show_snap_welcome()
GtkWindow * remmina_main_get_window()
gchar * selected_filename
GtkTreeModel * file_model
static void remmina_main_save_expanded_group(void)
static gboolean remmina_main_rmodestroy(gpointer data)
Called after the main window is destroyed, will cleanup remminamain object and related data...
const gchar * remmina_file_get_filename(RemminaFile *remminafile)
void remmina_main_on_action_connection_connect(GSimpleAction *action, GVariant *param, gpointer data)
void remmina_main_on_search_toggle()
typedefG_BEGIN_DECLS struct _RemminaFile RemminaFile
GtkRadioMenuItem * menuitem_view_mode_tree
const gchar * export_hints
void remmina_plugin_manager_for_each_plugin(RemminaPluginType type, RemminaPluginFunc func, gpointer data)
void remmina_main_load_files_cb()
gchar * last_quickconnect_protocol
gboolean remmina_main_file_list_on_button_press(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
static gboolean remmina_main_filter_visible_func(GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
RemminaFilePlugin * remmina_plugin_manager_get_export_file_handler(RemminaFile *remminafile)
void remmina_main_on_action_application_news(GSimpleAction *action, GVariant *param, gpointer data)
void remmina_file_manager_free_group_tree(GNode *node)
RemminaFilePlugin * remmina_plugin_manager_get_import_file_handler(const gchar *file)
void remmina_main_on_action_tools_import(GSimpleAction *action, GVariant *param, gpointer data)
RemminaSecretPlugin * remmina_plugin_manager_get_secret_plugin(void)
GtkBuilder * remmina_public_gtk_builder_new_from_file(gchar *filename)
static void remmina_main_save_size(void)
Save the Remmina Main Window size to assure the main geometry at each restart.
void remmina_main_on_action_application_mpchange(GSimpleAction *action, GVariant *param, gpointer data)
void remmina_main_on_view_toggle()
void remmina_icon_populate_menu(void)
gchar * remmina_file_get_datetime(RemminaFile *remminafile)
Return the string date of the last time a file has been modified.
static void remmina_main_file_model_on_sort(GtkTreeSortable *sortable, gpointer user_data)
GtkWidget * remmina_main_new(void)
void remmina_main_on_action_help_debug(GSimpleAction *action, GVariant *param, gpointer data)
gint remmina_string_array_find(RemminaStringArray *array, const gchar *str)
gboolean(* is_service_available)(void)
gchar * remmina_string_array_to_string(RemminaStringArray *array)
void remmina_file_generate_filename(RemminaFile *remminafile)
void remmina_main_save_before_destroy()
Save the Remmina Main Window size and the exapnded group before to close Remmina. ...
const gchar * description
static void remmina_main_load_file_list_callback(RemminaFile *remminafile, gpointer user_data)
static gboolean remmina_main_load_file_tree_traverse(GNode *node, GtkTreeStore *store, GtkTreeIter *parent)
GtkTreeModel * file_model_filter
static gboolean remmina_main_load_file_tree_find(GtkTreeModel *tree, GtkTreeIter *iter, const gchar *match_group)
void remmina_main_on_action_help_wiki(GSimpleAction *action, GVariant *param, gpointer data)
gboolean(* export_func)(RemminaFile *file, const gchar *to_file)
void remmina_main_on_action_application_default(GSimpleAction *action, GVariant *param, gpointer data)
gboolean remmina_main_on_window_state_event(GtkWidget *widget, GdkEventWindowState *event, gpointer user_data)
void remmina_debug(const gchar *fmt,...)
Print a string in the Remmina Debug Windows and in the terminal.
void remmina_main_update_file_datetime(RemminaFile *file)
GtkMenuButton * menu_header_button
static void remmina_main_load_file_tree_group(GtkTreeStore *store)
void remmina_main_on_action_connection_copy(GSimpleAction *action, GVariant *param, gpointer data)
void remmina_plugin_manager_show(GtkWindow *parent)
static void remmina_main_import_file_list(GSList *files)
void remmina_main_on_action_collapse(GSimpleAction *action, GVariant *param, gpointer data)
void remmina_main_on_action_help_donations(GSimpleAction *action, GVariant *param, gpointer data)
void remmina_mpchange_schedule(gboolean has_domain, const gchar *group, const gchar *domain, const gchar *username, const gchar *password)
GtkComboBoxText * combo_quick_connect_protocol
gboolean prevent_snap_welcome_message
GtkBox * box_quick_connect
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_show_warning_dialog(const gchar *message)
void remmina_main_on_action_connection_new(GSimpleAction *action, GVariant *param, gpointer data)
void remmina_main_quick_search_enter(GtkWidget *widget, gpointer user_data)
void remmina_file_delete(const gchar *filename)
GtkMenu * menu_popup_full
void remmina_string_array_free(RemminaStringArray *array)
GtkStatusbar * statusbar_main
void remmina_main_quick_search_on_changed(GtkEditable *editable, gpointer user_data)
void remmina_main_on_action_application_preferences(GSimpleAction *action, GVariant *param, gpointer data)
glong periodic_rmnews_get_count
void remmina_main_on_action_connection_delete(GSimpleAction *action, GVariant *param, gpointer data)
RemminaStringArray * remmina_string_array_new_from_string(const gchar *strs)
RemminaStringArray * remmina_string_array_new(void)
void remmina_file_touch(RemminaFile *remminafile)
Update the atime and mtime of a given filename.
GtkWidget * remmina_file_editor_new_from_filename(const gchar *filename)
static void remmina_main_save_expanded_group_func(GtkTreeView *tree_view, GtkTreePath *path, gpointer user_data)
void remmina_main_on_show(GtkWidget *w, gpointer user_data)
static void remmina_main_init(void)
GtkTreeView * tree_files_list
static void remmina_main_select_file(const gchar *filename)
gboolean remmina_main_on_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
void remmina_main_on_action_help_community(GSimpleAction *action, GVariant *param, gpointer data)
GtkToggleButton * view_toggle_button
void remmina_main_destroy()
Called when the main window is destroyed via a call from gtk_widget_destroy()
RemminaFile * remmina_file_new(void)
GtkTreeViewColumn * column_files_list_group
void remmina_main_file_list_on_row_activated(GtkTreeView *tree, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
static void remmina_main_expand_group_traverse(GtkTreeIter *iter)
RemminaStringArray * expanded_group
static gboolean remmina_main_selection_func(GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path, gboolean path_currently_selected, gpointer user_data)
void remmina_main_on_action_connection_external_tools(GSimpleAction *action, GVariant *param, gpointer data)
static void remmina_main_clear_selection_data(void)
void rcw_open_from_file(RemminaFile *remminafile)
void remmina_main_on_date_column_sort_clicked()
gboolean remmina_main_file_list_on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
void remmina_about_open(GtkWindow *parent)
GtkWidget * remmina_file_editor_new(void)
RemminaPlugin * remmina_plugin_manager_get_plugin(RemminaPluginType type, const gchar *name)
static gboolean remmina_main_add_tool_plugin(gchar *name, RemminaPlugin *plugin, gpointer user_data)
gboolean remmina_pref_save(void)
void remmina_main_on_action_connection_edit(GSimpleAction *action, GVariant *param, gpointer data)
GtkTreeModel * file_model_sort
gboolean rcw_open_from_filename(const gchar *filename)
static const gchar * supported_mime_types[]
void remmina_main_on_action_expand(GSimpleAction *action, GVariant *param, gpointer data)
void remmina_application_condexit(RemminaCondExitType why)
GtkDialog * remmina_pref_dialog_new(gint default_tab, GtkWindow *parent)
void remmina_file_set_string(RemminaFile *remminafile, const gchar *setting, const gchar *value)
static char * quick_connect_plugin_list[]
void remmina_file_save(RemminaFile *remminafile)
static gboolean remmina_main_quickconnect(void)
RemminaFile *(* import_func)(const gchar *from_file)
void remmina_string_array_add(RemminaStringArray *array, const gchar *str)
static GtkTargetEntry remmina_drop_types[]
GtkSearchBar * search_bar
static RemminaMain * remminamain
GtkWidget * remmina_file_editor_new_copy(const gchar *filename)
void remmina_main_on_action_application_quit(GSimpleAction *action, GVariant *param, gpointer data)
GtkEntry * entry_quick_connect_server
gint remmina_unlock_new(GtkWindow *parent)
const gchar * remmina_file_get_icon_name(RemminaFile *remminafile)
glong periodic_rmnews_last_get
GNode * remmina_file_manager_get_group_tree(void)
gboolean override_view_file_mode_to_list
void remmina_main_on_action_tools_export(GSimpleAction *action, GVariant *param, gpointer data)
static void remmina_main_file_editor_destroy(GtkWidget *widget, gpointer user_data)
gint remmina_file_manager_iterate(GFunc func, gpointer user_data)
static void remmina_main_expand_group(void)
void remmina_main_quick_search_on_icon_press(GtkEntry *entry, GtkEntryIconPosition icon_pos, GdkEvent *event, gpointer user_data)
static void remmina_main_load_files()
void remmina_main_on_action_application_about(GSimpleAction *action, GVariant *param, gpointer data)
static void remmina_main_action_tools_import_on_response(GtkDialog *dialog, gint response_id, gpointer user_data)
void remmina_main_on_action_application_plugins(GSimpleAction *action, GVariant *param, gpointer data)
static gboolean remmina_main_dexit(gpointer data)
Try to exit remmina after a delete window event.
gboolean remmina_main_quickconnect_on_click(GtkWidget *widget, gpointer user_data)