From 6cabdd246b601c8bd28fc340cd1fc8c6fe30f5af Mon Sep 17 00:00:00 2001 From: Antenore Gatta Date: Wed, 3 May 2023 11:31:27 +0000 Subject: Automatic doc build by remmina-ci --- public/functions_f.html | 4 +- public/functions_m.html | 3 + public/functions_vars_f.html | 6 +- public/functions_vars_m.html | 3 + public/globals_func_r.html | 316 +++++++++++------------ public/globals_r.html | 332 +++++++++++++------------ public/navtreedata.js | 22 +- public/navtreeindex0.js | 2 +- public/navtreeindex10.js | 6 +- public/navtreeindex11.js | 6 +- public/navtreeindex12.js | 38 +-- public/navtreeindex13.js | 8 +- public/navtreeindex14.js | 8 +- public/navtreeindex15.js | 8 +- public/navtreeindex16.js | 8 +- public/navtreeindex17.js | 8 +- public/navtreeindex18.js | 3 + public/navtreeindex6.js | 58 ++--- public/navtreeindex7.js | 70 +++--- public/navtreeindex8.js | 6 +- public/navtreeindex9.js | 6 +- public/rcw_8c_source.html | 2 +- public/remmina__exec_8c_source.html | 8 +- public/remmina__file_8c_source.html | 4 +- public/remmina__file__editor_8c_source.html | 2 +- public/remmina__main_8c.html | 241 ++++++++++-------- public/remmina__main_8c.js | 1 + public/remmina__main_8c_source.html | 220 ++++++++-------- public/remmina__main_8h.html | 102 +++++--- public/remmina__main_8h.js | 1 + public/remmina__main_8h_source.html | 136 +++++----- public/remmina__mpchange_8c_source.html | 2 +- public/remmina__plugin__manager_8c_source.html | 4 +- public/remmina__pref__dialog_8c_source.html | 2 +- public/search/all_12.js | 7 +- public/search/all_6.js | 2 +- public/search/all_d.js | 1 + public/search/functions_11.js | 1 + public/search/variables_6.js | 2 +- public/search/variables_c.js | 1 + public/struct___remmina_main.html | 70 ++++-- public/struct___remmina_main.js | 1 + public/struct___remmina_main_priv.html | 18 +- 43 files changed, 934 insertions(+), 815 deletions(-) (limited to 'public') diff --git a/public/functions_f.html b/public/functions_f.html index 3ada38d38..8b32943d4 100644 --- a/public/functions_f.html +++ b/public/functions_f.html @@ -169,13 +169,11 @@ $(document).ready(function(){initNavTree('functions_f.html','');});
  • flags : _DialogData , PyGObject +, remmina_plugin_rdp_event
  • Flags : remmina_plugin_rdp_event
  • -
  • flags -: remmina_plugin_rdp_event -
  • flags_add : _PyGObject_Functions
  • diff --git a/public/functions_m.html b/public/functions_m.html index 360b41f9e..831fa0460 100644 --- a/public/functions_m.html +++ b/public/functions_m.html @@ -128,6 +128,9 @@ $(document).ready(function(){initNavTree('functions_m.html','');});
  • menu_popup : _RemminaMain
  • +
  • menu_popup_delete_rc +: _RemminaMain +
  • menu_popup_full : _RemminaMain
  • diff --git a/public/functions_vars_f.html b/public/functions_vars_f.html index d21170a7e..7462defa8 100644 --- a/public/functions_vars_f.html +++ b/public/functions_vars_f.html @@ -169,13 +169,11 @@ $(document).ready(function(){initNavTree('functions_vars_f.html','');});
  • flags : _DialogData , PyGObject +, remmina_plugin_rdp_event
  • Flags : remmina_plugin_rdp_event
  • -
  • flags -: remmina_plugin_rdp_event -
  • flags_add : _PyGObject_Functions
  • @@ -226,7 +224,7 @@ $(document).ready(function(){initNavTree('functions_vars_f.html','');}); : _RemminaPref
  • func -: onMainThread_cb_data +: onMainThread_cb_data , remmina_masterthread_exec_data , RemminaPluginLoader
  • diff --git a/public/functions_vars_m.html b/public/functions_vars_m.html index ac9001ed0..8dd284b35 100644 --- a/public/functions_vars_m.html +++ b/public/functions_vars_m.html @@ -128,6 +128,9 @@ $(document).ready(function(){initNavTree('functions_vars_m.html','');});
  • menu_popup : _RemminaMain
  • +
  • menu_popup_delete_rc +: _RemminaMain +
  • menu_popup_full : _RemminaMain
  • diff --git a/public/globals_func_r.html b/public/globals_func_r.html index 54f28b3e6..dbf61bc88 100644 --- a/public/globals_func_r.html +++ b/public/globals_func_r.html @@ -1432,6 +1432,10 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); : remmina_main.c , remmina_main.h +
  • remmina_main_on_action_connection_delete_multiple() +: remmina_main.c +, remmina_main.h +
  • remmina_main_on_action_connection_edit() : remmina_main.c , remmina_main.h @@ -2202,12 +2206,12 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); : www_plugin.c
  • remmina_plugin_www_decide_nav() -: www_plugin.h -, www_plugin.c +: www_plugin.c +, www_plugin.h
  • remmina_plugin_www_decide_newwin() -: www_plugin.c -, www_plugin.h +: www_plugin.h +, www_plugin.c
  • remmina_plugin_www_decide_policy_cb() : www_plugin.c @@ -2252,12 +2256,12 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); : www_plugin.c
  • remmina_pref_add_recent() -: remmina_pref.h -, remmina_pref.c +: remmina_pref.c +, remmina_pref.h
  • remmina_pref_clear_recent() -: remmina_pref.c -, remmina_pref.h +: remmina_pref.h +, remmina_pref.c
  • remmina_pref_dialog_add_pref_plugin() : remmina_pref_dialog.c @@ -2276,12 +2280,12 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); : remmina_pref_dialog.c
  • remmina_pref_dialog_new() -: remmina_pref_dialog.c -, remmina_pref_dialog.h +: remmina_pref_dialog.h +, remmina_pref_dialog.c
  • remmina_pref_dialog_on_action_close() -: remmina_pref_dialog.h -, remmina_pref_dialog.c +: remmina_pref_dialog.c +, remmina_pref_dialog.h
  • remmina_pref_dialog_on_close_clicked() : remmina_pref_dialog.c @@ -2324,8 +2328,8 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); : python_wrapper_remmina.c
  • remmina_pref_get_ssh_loglevel() -: remmina_pref.c -, remmina_pref.h +: remmina_pref.h +, remmina_pref.c
  • remmina_pref_get_ssh_loglevel_wrapper() : python_wrapper_remmina.c @@ -2338,8 +2342,8 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); : python_wrapper_remmina.c
  • remmina_pref_get_ssh_tcp_keepcnt() -: remmina_pref.h -, remmina_pref.c +: remmina_pref.c +, remmina_pref.h
  • remmina_pref_get_ssh_tcp_keepidle() : remmina_pref.c @@ -2350,12 +2354,12 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); , remmina_pref.h
  • remmina_pref_get_ssh_tcp_usrtimeout() -: remmina_pref.c -, remmina_pref.h +: remmina_pref.h +, remmina_pref.c
  • remmina_pref_get_sshtunnel_port() -: remmina_pref.h -, remmina_pref.c +: remmina_pref.c +, remmina_pref.h
  • remmina_pref_get_sshtunnel_port_wrapper() : python_wrapper_remmina.c @@ -2368,8 +2372,8 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); : python_wrapper_remmina.c
  • remmina_pref_init() -: remmina_pref.c -, remmina_pref.h +: remmina_pref.h +, remmina_pref.c
  • remmina_pref_init_keymap() : remmina_pref.c @@ -2386,12 +2390,12 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); : python_wrapper_remmina.c
  • remmina_pref_keymap_get_table() -: remmina_pref.c -, remmina_pref.h +: remmina_pref.h +, remmina_pref.c
  • remmina_pref_keymap_groups() -: remmina_pref.h -, remmina_pref.c +: remmina_pref.c +, remmina_pref.h
  • remmina_pref_on_button_keystrokes_clicked() : remmina_pref_dialog.c @@ -2406,12 +2410,12 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); : remmina_pref_dialog.c
  • remmina_pref_save() -: remmina_pref.c -, remmina_pref.h +: remmina_pref.h +, remmina_pref.c
  • remmina_pref_set_value() -: remmina_pref.h -, remmina_pref.c +: remmina_pref.c +, remmina_pref.h
  • remmina_pref_set_value_wrapper() : python_wrapper_remmina.c @@ -2480,12 +2484,12 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); : remmina_protocol_widget.c
  • remmina_protocol_widget_chat_open() -: remmina_protocol_widget.c -, remmina_protocol_widget.h +: remmina_protocol_widget.h +, remmina_protocol_widget.c
  • remmina_protocol_widget_chat_receive() -: remmina_protocol_widget.h -, remmina_protocol_widget.c +: remmina_protocol_widget.c +, remmina_protocol_widget.h
  • remmina_protocol_widget_class_init() : remmina_protocol_widget.c @@ -2494,8 +2498,8 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); : remmina_protocol_widget.c
  • remmina_protocol_widget_close_connection() -: remmina_protocol_widget.h -, remmina_protocol_widget.c +: remmina_protocol_widget.c +, remmina_protocol_widget.h
  • remmina_protocol_widget_desktop_resize() : remmina_protocol_widget.c @@ -2582,8 +2586,8 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); : python_wrapper_remmina.c
  • remmina_protocol_widget_get_profile_remote_width() -: remmina_protocol_widget.c -, remmina_protocol_widget.h +: remmina_protocol_widget.h +, remmina_protocol_widget.c
  • remmina_protocol_widget_get_profile_remote_width_wrapper() : python_wrapper_remmina.c @@ -2596,8 +2600,8 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); : remmina_protocol_widget.h
  • remmina_protocol_widget_get_username() -: remmina_protocol_widget.h -, remmina_protocol_widget.c +: remmina_protocol_widget.c +, remmina_protocol_widget.h
  • remmina_protocol_widget_get_width() : remmina_protocol_widget.c @@ -2608,12 +2612,12 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); , remmina_protocol_widget.h
  • remmina_protocol_widget_gtkviewport() -: remmina_protocol_widget.c -, remmina_protocol_widget.h +: remmina_protocol_widget.h +, remmina_protocol_widget.c
  • remmina_protocol_widget_has_error() -: remmina_protocol_widget.h -, remmina_protocol_widget.c +: remmina_protocol_widget.c +, remmina_protocol_widget.h
  • remmina_protocol_widget_init() : remmina_protocol_widget.c @@ -2622,16 +2626,16 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); : remmina_protocol_widget.c
  • remmina_protocol_widget_is_closed() -: remmina_protocol_widget.h -, remmina_protocol_widget.c +: remmina_protocol_widget.c +, remmina_protocol_widget.h
  • remmina_protocol_widget_lock_dynres() -: remmina_protocol_widget.c -, remmina_protocol_widget.h +: remmina_protocol_widget.h +, remmina_protocol_widget.c
  • remmina_protocol_widget_map_event() -: remmina_protocol_widget.h -, remmina_protocol_widget.c +: remmina_protocol_widget.c +, remmina_protocol_widget.h
  • remmina_protocol_widget_mpdestroy() : remmina_protocol_widget.c @@ -2659,16 +2663,16 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); : remmina_protocol_widget.c
  • remmina_protocol_widget_panel_auth() -: remmina_protocol_widget.h -, remmina_protocol_widget.c +: remmina_protocol_widget.c +, remmina_protocol_widget.h
  • remmina_protocol_widget_panel_authuserpwd_ssh_tunnel() -: remmina_protocol_widget.c -, remmina_protocol_widget.h +: remmina_protocol_widget.h +, remmina_protocol_widget.c
  • remmina_protocol_widget_panel_authx509() -: remmina_protocol_widget.h -, remmina_protocol_widget.c +: remmina_protocol_widget.c +, remmina_protocol_widget.h
  • remmina_protocol_widget_panel_changed_certificate() : remmina_protocol_widget.c @@ -2729,12 +2733,12 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); : remmina_protocol_widget.c
  • remmina_protocol_widget_send_clipboard() -: remmina_protocol_widget.c -, remmina_protocol_widget.h +: remmina_protocol_widget.h +, remmina_protocol_widget.c
  • remmina_protocol_widget_send_keys_signals() -: remmina_protocol_widget.h -, remmina_protocol_widget.c +: remmina_protocol_widget.c +, remmina_protocol_widget.h
  • remmina_protocol_widget_send_keystrokes() : remmina_protocol_widget.c @@ -2745,28 +2749,28 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); , remmina_protocol_widget.h
  • remmina_protocol_widget_set_display() -: remmina_protocol_widget.c -, remmina_protocol_widget.h +: remmina_protocol_widget.h +, remmina_protocol_widget.c
  • remmina_protocol_widget_set_error() -: remmina_protocol_widget.h -, remmina_protocol_widget.c +: remmina_protocol_widget.c +, remmina_protocol_widget.h
  • remmina_protocol_widget_set_expand() -: remmina_protocol_widget.c -, remmina_protocol_widget.h +: remmina_protocol_widget.h +, remmina_protocol_widget.c
  • remmina_protocol_widget_set_height() -: remmina_protocol_widget.h -, remmina_protocol_widget.c +: remmina_protocol_widget.c +, remmina_protocol_widget.h
  • remmina_protocol_widget_set_hostkey_func() -: remmina_protocol_widget.c -, remmina_protocol_widget.h +: remmina_protocol_widget.h +, remmina_protocol_widget.c
  • remmina_protocol_widget_set_width() -: remmina_protocol_widget.h -, remmina_protocol_widget.c +: remmina_protocol_widget.c +, remmina_protocol_widget.h
  • remmina_protocol_widget_setup() : remmina_protocol_widget.c @@ -2777,24 +2781,24 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); , remmina_protocol_widget.h
  • remmina_protocol_widget_signal_connection_opened() -: remmina_protocol_widget.c -, remmina_protocol_widget.h +: remmina_protocol_widget.h +, remmina_protocol_widget.c
  • remmina_protocol_widget_ssh_exec() -: remmina_protocol_widget.h -, remmina_protocol_widget.c +: remmina_protocol_widget.c +, remmina_protocol_widget.h
  • remmina_protocol_widget_start_direct_tunnel() -: remmina_protocol_widget.c -, remmina_protocol_widget.h +: remmina_protocol_widget.h +, remmina_protocol_widget.c
  • remmina_protocol_widget_start_reverse_tunnel() -: remmina_protocol_widget.h -, remmina_protocol_widget.c +: remmina_protocol_widget.c +, remmina_protocol_widget.h
  • remmina_protocol_widget_start_xport_tunnel() -: remmina_protocol_widget.c -, remmina_protocol_widget.h +: remmina_protocol_widget.h +, remmina_protocol_widget.c
  • remmina_protocol_widget_tunnel_destroy() : remmina_protocol_widget.c @@ -2815,8 +2819,8 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); : rcw.c
  • remmina_protocol_widget_update_remote_resolution() -: remmina_protocol_widget.c -, remmina_protocol_widget.h +: remmina_protocol_widget.h +, remmina_protocol_widget.c
  • remmina_protocol_widget_xport_tunnel_connect_callback() : remmina_protocol_widget.c @@ -2832,8 +2836,8 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); , remmina_public.h
  • remmina_public_combo_get_active_text() -: remmina_public.h -, remmina_public.c +: remmina_public.c +, remmina_public.h
  • remmina_public_create_combo() : remmina_public.c @@ -2864,8 +2868,8 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); , remmina_public.h
  • remmina_public_get_modifier_for_keycode() -: remmina_public.h -, remmina_public.c +: remmina_public.c +, remmina_public.h
  • remmina_public_get_server_port() : remmina_public.c @@ -2879,8 +2883,8 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); : python_wrapper_remmina.c
  • remmina_public_get_xauth_cookie() -: remmina_public.c -, remmina_public.h +: remmina_public.h +, remmina_public.c
  • remmina_public_gtk_builder_new_from_file() : remmina_public.h @@ -2899,16 +2903,16 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); , remmina_public.c
  • remmina_public_open_unix_sock() -: remmina_public.h -, remmina_public.c +: remmina_public.c +, remmina_public.h
  • remmina_public_open_xdisplay() -: remmina_public.c -, remmina_public.h +: remmina_public.h +, remmina_public.c
  • remmina_public_popup_position() -: remmina_public.h -, remmina_public.c +: remmina_public.c +, remmina_public.h
  • remmina_public_resolution_validation_func() : remmina_public.h @@ -2975,8 +2979,8 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); : rdp_cliprdr.c
  • remmina_rdp_cliprdr_init() -: rdp_cliprdr.c -, rdp_cliprdr.h +: rdp_cliprdr.h +, rdp_cliprdr.c
  • remmina_rdp_cliprdr_monitor_ready() : rdp_cliprdr.c @@ -3115,8 +3119,8 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); , rdp_event.c
  • remmina_rdp_event_queue_ui_sync_retptr() -: rdp_event.c -, rdp_event.h +: rdp_event.h +, rdp_event.c
  • remmina_rdp_event_reconnect_progress() : rdp_event.c @@ -3187,8 +3191,8 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); : rdp_file.c
  • remmina_rdp_file_import_test() -: rdp_file.h -, rdp_file.c +: rdp_file.c +, rdp_file.h
  • remmina_rdp_find_prdriver() : rdp_plugin.c @@ -3218,8 +3222,8 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); : rdp_plugin.c
  • remmina_rdp_monitor_get() -: rdp_monitor.h -, rdp_monitor.c +: rdp_monitor.c +, rdp_monitor.h
  • remmina_rdp_OnChannelConnectedEventHandler() : rdp_channels.c @@ -3261,8 +3265,8 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); , rdp_settings.c
  • remmina_rdp_settings_get_orientation_scale_prefs() -: rdp_settings.h -, rdp_settings.c +: rdp_settings.c +, rdp_settings.h
  • remmina_rdp_settings_grid_destroy() : rdp_settings.c @@ -3293,8 +3297,8 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); : rdp_settings.c
  • remmina_rdp_settings_new() -: rdp_settings.h -, rdp_settings.c +: rdp_settings.c +, rdp_settings.h
  • remmina_rdp_settings_quality_on_changed() : rdp_settings.c @@ -3364,8 +3368,8 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); : remmina_scrolled_viewport.c
  • remmina_scrolled_viewport_new() -: remmina_scrolled_viewport.c -, remmina_scrolled_viewport.h +: remmina_scrolled_viewport.h +, remmina_scrolled_viewport.c
  • remmina_scrolled_viewport_remove_motion() : remmina_scrolled_viewport.h @@ -3387,8 +3391,8 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); : remmina_ssh_plugin.c
  • remmina_sftp_client_confirm_resume() -: remmina_sftp_client.c -, remmina_sftp_client.h +: remmina_sftp_client.h +, remmina_sftp_client.c
  • remmina_sftp_client_destroy() : remmina_sftp_client.c @@ -3475,8 +3479,8 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); , remmina_sftp_plugin.h
  • remmina_sha1_file() -: remmina_utils.c -, remmina_utils.h +: remmina_utils.h +, remmina_utils.c
  • remmina_sodium_init() : remmina_sodium.c @@ -3487,16 +3491,16 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); , remmina_sodium.h
  • remmina_sodium_pwhash_str() -: remmina_sodium.c -, remmina_sodium.h +: remmina_sodium.h +, remmina_sodium.c
  • remmina_sodium_pwhash_str_verify() : remmina_sodium.c , remmina_sodium.h
  • remmina_ssh_auth() -: remmina_ssh.c -, remmina_ssh.h +: remmina_ssh.h +, remmina_ssh.c
  • remmina_ssh_auth_agent() : remmina_ssh.c @@ -3551,8 +3555,8 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); : remmina_ssh.h
  • remmina_ssh_identity_path() -: remmina_ssh.h -, remmina_ssh.c +: remmina_ssh.c +, remmina_ssh.h
  • remmina_ssh_init_from_file() : remmina_ssh.h @@ -3574,8 +3578,8 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); , remmina_ssh_plugin.h
  • remmina_ssh_plugin_register() -: remmina_ssh_plugin.c -, remmina_ssh_plugin.h +: remmina_ssh_plugin.h +, remmina_ssh_plugin.c
  • remmina_ssh_search_item() : remmina_ssh.c @@ -3585,8 +3589,8 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); , remmina_ssh.h
  • remmina_ssh_set_error() -: remmina_ssh.c -, remmina_ssh.h +: remmina_ssh.h +, remmina_ssh.c
  • remmina_ssh_set_nodelay() : remmina_ssh.c @@ -3687,8 +3691,8 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); : remmina_string_array.c
  • remmina_string_array_find() -: remmina_string_array.c -, remmina_string_array.h +: remmina_string_array.h +, remmina_string_array.c
  • remmina_string_array_free() : remmina_string_array.c @@ -3699,16 +3703,16 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); , remmina_string_array.h
  • remmina_string_array_new() -: remmina_string_array.h -, remmina_string_array.c +: remmina_string_array.c +, remmina_string_array.h
  • remmina_string_array_new_from_allocated_string() : remmina_string_array.h , remmina_string_array.c
  • remmina_string_array_new_from_string() -: remmina_string_array.h -, remmina_string_array.c +: remmina_string_array.c +, remmina_string_array.h
  • remmina_string_array_remove() : remmina_string_array.c @@ -3719,8 +3723,8 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); , remmina_string_array.h
  • remmina_string_array_sort() -: remmina_string_array.c -, remmina_string_array.h +: remmina_string_array.h +, remmina_string_array.c
  • remmina_string_array_to_string() : remmina_string_array.h @@ -3764,8 +3768,8 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); , remmina_string_list.h
  • remmina_string_list_set_validation_func() -: remmina_string_list.c -, remmina_string_list.h +: remmina_string_list.h +, remmina_string_list.c
  • remmina_string_list_update_buttons_state() : remmina_string_list.c @@ -3810,8 +3814,8 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); : telepathy_channel_handler.c
  • remmina_tp_channel_handler_new() -: telepathy_channel_handler.h -, telepathy_channel_handler.c +: telepathy_channel_handler.c +, telepathy_channel_handler.h
  • remmina_tp_channel_handler_on_disconnect() : telepathy_channel_handler.c @@ -3870,20 +3874,20 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); , remmina_utils.h
  • remmina_utils_get_kernel_release() -: remmina_utils.h -, remmina_utils.c +: remmina_utils.c +, remmina_utils.h
  • remmina_utils_get_lang() : remmina_utils.h , remmina_utils.c
  • remmina_utils_get_lsb_codename() -: remmina_utils.h -, remmina_utils.c +: remmina_utils.c +, remmina_utils.h
  • remmina_utils_get_lsb_description() -: remmina_utils.c -, remmina_utils.h +: remmina_utils.h +, remmina_utils.c
  • remmina_utils_get_lsb_id() : remmina_utils.c @@ -3894,23 +3898,23 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); , remmina_utils.h
  • remmina_utils_get_os_info() -: remmina_utils.h -, remmina_utils.c +: remmina_utils.c +, remmina_utils.h
  • remmina_utils_read_distrofile() : remmina_utils.c
  • remmina_utils_string_find() -: remmina_utils.c -, remmina_utils.h +: remmina_utils.h +, remmina_utils.c
  • remmina_utils_string_replace() -: remmina_utils.c -, remmina_utils.h +: remmina_utils.h +, remmina_utils.c
  • remmina_utils_string_replace_all() -: remmina_utils.h -, remmina_utils.c +: remmina_utils.c +, remmina_utils.h
  • remmina_utils_string_strip() : remmina_utils.h @@ -3932,19 +3936,19 @@ $(document).ready(function(){initNavTree('globals_func_r.html','');}); , remmina_widget_pool.h
  • remmina_widget_pool_foreach() -: remmina_widget_pool.h -, remmina_widget_pool.c +: remmina_widget_pool.c +, remmina_widget_pool.h
  • remmina_widget_pool_init() -: remmina_widget_pool.c -, remmina_widget_pool.h +: remmina_widget_pool.h +, remmina_widget_pool.c
  • remmina_widget_pool_on_widget_destroy() : remmina_widget_pool.c
  • remmina_widget_pool_register() -: remmina_widget_pool.c -, remmina_widget_pool.h +: remmina_widget_pool.h +, remmina_widget_pool.c
  • remmina_widget_pool_register_wrapper() : python_wrapper_remmina.c diff --git a/public/globals_r.html b/public/globals_r.html index 5dbd38db1..83a399e95 100644 --- a/public/globals_r.html +++ b/public/globals_r.html @@ -1657,6 +1657,10 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); : remmina_main.c , remmina_main.h
  • +
  • remmina_main_on_action_connection_delete_multiple() +: remmina_main.c +, remmina_main.h +
  • remmina_main_on_action_connection_edit() : remmina_main.c , remmina_main.h @@ -2703,8 +2707,8 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); : remmina_pref_dialog.h
  • remmina_pref_clear_recent() -: remmina_pref.h -, remmina_pref.c +: remmina_pref.c +, remmina_pref.h
  • remmina_pref_dialog : remmina_pref_dialog.c @@ -2767,12 +2771,12 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); : remmina_pref.c
  • remmina_pref_get_recent() -: remmina_pref.c -, remmina_pref.h +: remmina_pref.h +, remmina_pref.c
  • remmina_pref_get_scale_quality() -: remmina_pref.h -, remmina_pref.c +: remmina_pref.c +, remmina_pref.h
  • remmina_pref_get_scale_quality_wrapper() : python_wrapper_remmina.c @@ -2815,8 +2819,8 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); : python_wrapper_remmina.c
  • remmina_pref_get_value() -: remmina_pref.h -, remmina_pref.c +: remmina_pref.c +, remmina_pref.h
  • remmina_pref_get_value_wrapper() : python_wrapper_remmina.c @@ -2829,12 +2833,12 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); : remmina_pref.c
  • remmina_pref_is_rw() -: remmina_pref.c -, remmina_pref.h +: remmina_pref.h +, remmina_pref.c
  • remmina_pref_keymap_get_keyval() -: remmina_pref.h -, remmina_pref.c +: remmina_pref.c +, remmina_pref.h
  • remmina_pref_keymap_get_keyval_wrapper() : python_wrapper_remmina.c @@ -2867,8 +2871,8 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); , remmina_pref.h
  • remmina_pref_set_value() -: remmina_pref.c -, remmina_pref.h +: remmina_pref.h +, remmina_pref.c
  • remmina_pref_set_value_wrapper() : python_wrapper_remmina.c @@ -3007,12 +3011,12 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); , remmina_protocol_widget.h
  • remmina_protocol_widget_call_feature_by_type() -: remmina_protocol_widget.c -, remmina_protocol_widget.h +: remmina_protocol_widget.h +, remmina_protocol_widget.c
  • remmina_protocol_widget_chat_close() -: remmina_protocol_widget.h -, remmina_protocol_widget.c +: remmina_protocol_widget.c +, remmina_protocol_widget.h
  • remmina_protocol_widget_chat_on_destroy() : remmina_protocol_widget.c @@ -3049,24 +3053,24 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); : remmina_protocol_widget.c
  • remmina_protocol_widget_emit_signal() -: remmina_protocol_widget.h -, remmina_protocol_widget.c +: remmina_protocol_widget.c +, remmina_protocol_widget.h
  • remmina_protocol_widget_get_cacert() -: remmina_protocol_widget.c -, remmina_protocol_widget.h +: remmina_protocol_widget.h +, remmina_protocol_widget.c
  • remmina_protocol_widget_get_cacrl() -: remmina_protocol_widget.h -, remmina_protocol_widget.c +: remmina_protocol_widget.c +, remmina_protocol_widget.h
  • remmina_protocol_widget_get_clientcert() -: remmina_protocol_widget.c -, remmina_protocol_widget.h +: remmina_protocol_widget.h +, remmina_protocol_widget.c
  • remmina_protocol_widget_get_clientkey() -: remmina_protocol_widget.h -, remmina_protocol_widget.c +: remmina_protocol_widget.c +, remmina_protocol_widget.h
  • remmina_protocol_widget_get_current_scale_mode() : remmina_protocol_widget.c @@ -3077,28 +3081,28 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); , remmina_protocol_widget.h
  • remmina_protocol_widget_get_error_message() -: remmina_protocol_widget.c -, remmina_protocol_widget.h +: remmina_protocol_widget.h +, remmina_protocol_widget.c
  • remmina_protocol_widget_get_expand() -: remmina_protocol_widget.h -, remmina_protocol_widget.c +: remmina_protocol_widget.c +, remmina_protocol_widget.h
  • remmina_protocol_widget_get_features() -: remmina_protocol_widget.c -, remmina_protocol_widget.h +: remmina_protocol_widget.h +, remmina_protocol_widget.c
  • remmina_protocol_widget_get_file() -: remmina_protocol_widget.h -, remmina_protocol_widget.c +: remmina_protocol_widget.c +, remmina_protocol_widget.h
  • remmina_protocol_widget_get_gtkwindow() -: remmina_protocol_widget.c -, remmina_protocol_widget.h +: remmina_protocol_widget.h +, remmina_protocol_widget.c
  • remmina_protocol_widget_get_height() -: remmina_protocol_widget.h -, remmina_protocol_widget.c +: remmina_protocol_widget.c +, remmina_protocol_widget.h
  • remmina_protocol_widget_get_multimon() : remmina_protocol_widget.c @@ -3109,12 +3113,12 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); , remmina_protocol_widget.h
  • remmina_protocol_widget_get_password() -: remmina_protocol_widget.c -, remmina_protocol_widget.h +: remmina_protocol_widget.h +, remmina_protocol_widget.c
  • remmina_protocol_widget_get_profile_remote_height() -: remmina_protocol_widget.h -, remmina_protocol_widget.c +: remmina_protocol_widget.c +, remmina_protocol_widget.h
  • remmina_protocol_widget_get_profile_remote_height_wrapper() : python_wrapper_remmina.c @@ -3127,8 +3131,8 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); : python_wrapper_remmina.c
  • remmina_protocol_widget_get_savepassword() -: remmina_protocol_widget.c -, remmina_protocol_widget.h +: remmina_protocol_widget.h +, remmina_protocol_widget.c
  • remmina_protocol_widget_get_type() : remmina_protocol_widget.h @@ -3197,12 +3201,12 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); : remmina_protocol_widget.c
  • remmina_protocol_widget_panel_auth() -: remmina_protocol_widget.c -, remmina_protocol_widget.h +: remmina_protocol_widget.h +, remmina_protocol_widget.c
  • remmina_protocol_widget_panel_authuserpwd_ssh_tunnel() -: remmina_protocol_widget.h -, remmina_protocol_widget.c +: remmina_protocol_widget.c +, remmina_protocol_widget.h
  • remmina_protocol_widget_panel_authx509() : remmina_protocol_widget.c @@ -3331,12 +3335,12 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); : remmina_protocol_widget.c
  • remmina_protocol_widget_ssh_exec() -: remmina_protocol_widget.c -, remmina_protocol_widget.h +: remmina_protocol_widget.h +, remmina_protocol_widget.c
  • remmina_protocol_widget_start_direct_tunnel() -: remmina_protocol_widget.h -, remmina_protocol_widget.c +: remmina_protocol_widget.c +, remmina_protocol_widget.h
  • remmina_protocol_widget_start_reverse_tunnel() : remmina_protocol_widget.c @@ -3365,8 +3369,8 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); : rcw.c
  • remmina_protocol_widget_update_remote_resolution() -: remmina_protocol_widget.c -, remmina_protocol_widget.h +: remmina_protocol_widget.h +, remmina_protocol_widget.c
  • remmina_protocol_widget_xport_tunnel_connect_callback() : remmina_protocol_widget.c @@ -3429,16 +3433,16 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); : python_wrapper_remmina.c
  • remmina_public_get_xauth_cookie() -: remmina_public.h -, remmina_public.c +: remmina_public.c +, remmina_public.h
  • remmina_public_gtk_builder_new_from_file() -: remmina_public.c -, remmina_public.h +: remmina_public.h +, remmina_public.c
  • remmina_public_gtk_builder_new_from_resource() -: remmina_public.h -, remmina_public.c +: remmina_public.c +, remmina_public.h
  • remmina_public_gtk_widget_reparent() : remmina_public.c @@ -3449,28 +3453,28 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); , remmina_public.h
  • remmina_public_open_unix_sock() -: remmina_public.c -, remmina_public.h +: remmina_public.h +, remmina_public.c
  • remmina_public_open_xdisplay() -: remmina_public.h -, remmina_public.c +: remmina_public.c +, remmina_public.h
  • remmina_public_popup_position() -: remmina_public.c -, remmina_public.h +: remmina_public.h +, remmina_public.c
  • remmina_public_resolution_validation_func() -: remmina_public.h -, remmina_public.c +: remmina_public.c +, remmina_public.h
  • remmina_public_send_notification() -: remmina_public.c -, remmina_public.h +: remmina_public.h +, remmina_public.c
  • remmina_public_split_resolution_string() -: remmina_public.h -, remmina_public.c +: remmina_public.c +, remmina_public.h
  • remmina_public_str_replace() : remmina_public.c @@ -3516,15 +3520,15 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); , rdp_cliprdr.h
  • remmina_rdp_clipboard_init() -: rdp_cliprdr.h -, rdp_cliprdr.c +: rdp_cliprdr.c +, rdp_cliprdr.h
  • remmina_rdp_cliprdr_cached_clipboard_free() : rdp_cliprdr.c
  • remmina_rdp_cliprdr_detach_owner() -: rdp_cliprdr.c -, rdp_cliprdr.h +: rdp_cliprdr.h +, rdp_cliprdr.c
  • remmina_rdp_cliprdr_empty_clipboard() : rdp_cliprdr.c @@ -3543,8 +3547,8 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); : rdp_cliprdr.c
  • remmina_rdp_cliprdr_init() -: rdp_cliprdr.c -, rdp_cliprdr.h +: rdp_cliprdr.h +, rdp_cliprdr.c
  • remmina_rdp_cliprdr_monitor_ready() : rdp_cliprdr.c @@ -3678,8 +3682,8 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); : rdp_event.c
  • remmina_rdp_event_queue_ui_async() -: rdp_event.h -, rdp_event.c +: rdp_event.c +, rdp_event.h
  • remmina_rdp_event_queue_ui_sync_retint() : rdp_event.c @@ -3740,8 +3744,8 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); , rdp_event.h
  • remmina_rdp_event_uninit() -: rdp_event.h -, rdp_event.c +: rdp_event.c +, rdp_event.h
  • remmina_rdp_event_update_rect() : rdp_event.h @@ -3772,8 +3776,8 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); , rdp_file.c
  • remmina_rdp_file_import() -: rdp_file.h -, rdp_file.c +: rdp_file.c +, rdp_file.h
  • remmina_rdp_file_import_channel() : rdp_file.c @@ -3817,12 +3821,12 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); , rdp_monitor.h
  • remmina_rdp_OnChannelConnectedEventHandler() -: rdp_channels.c -, rdp_channels.h +: rdp_channels.h +, rdp_channels.c
  • remmina_rdp_OnChannelDisconnectedEventHandler() -: rdp_channels.c -, rdp_channels.h +: rdp_channels.h +, rdp_channels.c
  • remmina_rdp_open_connection() : rdp_plugin.c @@ -3906,8 +3910,8 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); : rdp_settings.c
  • remmina_rdp_settings_new() -: rdp_settings.h -, rdp_settings.c +: rdp_settings.c +, rdp_settings.h
  • remmina_rdp_settings_quality_on_changed() : rdp_settings.c @@ -3948,12 +3952,12 @@ $(document).ready(function(){initNavTree('globals_r.html','');});
  • remmina_rdp_ui_event_destroy_cairo_surface() : rdp_event.c
  • -
  • remmina_rdp_ui_event_update_scale() -: rdp_event.c -
  • REMMINA_RDP_UI_EVENT_UPDATE_SCALE : rdp_plugin.h
  • +
  • remmina_rdp_ui_event_update_scale() +: rdp_event.c +
  • REMMINA_RDP_UI_NOCODEC : rdp_plugin.h
  • @@ -4023,8 +4027,8 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); , remmina_scrolled_viewport.c
  • remmina_scrolled_viewport_remove_motion() -: remmina_scrolled_viewport.h -, remmina_scrolled_viewport.c +: remmina_scrolled_viewport.c +, remmina_scrolled_viewport.h
  • remmina_search_widget_search_backward() : remmina_ssh_plugin.c @@ -4077,8 +4081,8 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); : remmina_sftp_client.c
  • remmina_sftp_client_open() -: remmina_sftp_client.h -, remmina_sftp_client.c +: remmina_sftp_client.c +, remmina_sftp_client.h
  • remmina_sftp_client_refresh() : remmina_sftp_client.c @@ -4148,8 +4152,8 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); , remmina_sodium.h
  • remmina_sodium_pwhash_str() -: remmina_sodium.h -, remmina_sodium.c +: remmina_sodium.c +, remmina_sodium.h
  • remmina_sodium_pwhash_str_verify() : remmina_sodium.c @@ -4159,8 +4163,8 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); : remmina_ssh_plugin.c
  • remmina_ssh_auth() -: remmina_ssh.h -, remmina_ssh.c +: remmina_ssh.c +, remmina_ssh.h
  • REMMINA_SSH_AUTH_AGAIN : remmina_ssh.h @@ -4238,8 +4242,8 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); : remmina_ssh.c
  • remmina_ssh_find_identity() -: remmina_ssh.h -, remmina_ssh.c +: remmina_ssh.c +, remmina_ssh.h
  • remmina_ssh_free() : remmina_ssh.h @@ -4312,27 +4316,27 @@ $(document).ready(function(){initNavTree('globals_r.html','');});
  • remmina_ssh_tunnel_new_from_file() : remmina_ssh.h
  • -
  • remmina_ssh_tunnel_open() -: remmina_ssh.h -
  • REMMINA_SSH_TUNNEL_OPEN : remmina_ssh.h
  • -
  • remmina_ssh_tunnel_reverse() -: remmina_ssh.h +
  • remmina_ssh_tunnel_open() +: remmina_ssh.h
  • REMMINA_SSH_TUNNEL_REVERSE : remmina_ssh.h
  • +
  • remmina_ssh_tunnel_reverse() +: remmina_ssh.h +
  • remmina_ssh_tunnel_terminated() : remmina_ssh.h
  • -
  • REMMINA_SSH_TUNNEL_XPORT -: remmina_ssh.h -
  • remmina_ssh_tunnel_xport() : remmina_ssh.h
  • +
  • REMMINA_SSH_TUNNEL_XPORT +: remmina_ssh.h +
  • remmina_ssh_unconvert() : remmina_ssh.h
  • @@ -4346,8 +4350,8 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); : remmina_ssh.c
  • remmina_stats_get_all() -: remmina_stats.c -, remmina_stats.h +: remmina_stats.h +, remmina_stats.c
  • remmina_stats_get_gtk_backend() : remmina_stats.c @@ -4390,48 +4394,48 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); : remmina_string_array.c
  • remmina_string_array_find() -: remmina_string_array.h -, remmina_string_array.c +: remmina_string_array.c +, remmina_string_array.h
  • remmina_string_array_free() -: remmina_string_array.h -, remmina_string_array.c +: remmina_string_array.c +, remmina_string_array.h
  • remmina_string_array_intersect() : remmina_string_array.h , remmina_string_array.c
  • remmina_string_array_new() -: remmina_string_array.h -, remmina_string_array.c +: remmina_string_array.c +, remmina_string_array.h
  • remmina_string_array_new_from_allocated_string() -: remmina_string_array.c -, remmina_string_array.h +: remmina_string_array.h +, remmina_string_array.c
  • remmina_string_array_new_from_string() : remmina_string_array.c , remmina_string_array.h
  • remmina_string_array_remove() -: remmina_string_array.h -, remmina_string_array.c +: remmina_string_array.c +, remmina_string_array.h
  • remmina_string_array_remove_index() -: remmina_string_array.h -, remmina_string_array.c +: remmina_string_array.c +, remmina_string_array.h
  • remmina_string_array_sort() -: remmina_string_array.c -, remmina_string_array.h +: remmina_string_array.h +, remmina_string_array.c
  • remmina_string_array_to_string() : remmina_string_array.c , remmina_string_array.h
  • remmina_string_list_get_text() -: remmina_string_list.h -, remmina_string_list.c +: remmina_string_list.c +, remmina_string_list.h
  • remmina_string_list_init() : remmina_string_list.c @@ -4467,15 +4471,15 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); , remmina_string_list.h
  • remmina_string_list_set_validation_func() -: remmina_string_list.c -, remmina_string_list.h +: remmina_string_list.h +, remmina_string_list.c
  • remmina_string_list_update_buttons_state() : remmina_string_list.c
  • remmina_sysinfo_get_gnome_shell_version() -: remmina_sysinfo.h -, remmina_sysinfo.c +: remmina_sysinfo.c +, remmina_sysinfo.h
  • remmina_sysinfo_get_wm_name() : remmina_sysinfo.h @@ -4525,8 +4529,8 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); : telepathy_channel_handler.c
  • remmina_tp_channel_handler_new() -: telepathy_channel_handler.c -, telepathy_channel_handler.h +: telepathy_channel_handler.h +, telepathy_channel_handler.c
  • remmina_tp_channel_handler_on_disconnect() : telepathy_channel_handler.c @@ -4550,8 +4554,8 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); : telepathy_handler.c
  • remmina_tp_handler_new() -: telepathy_handler.h -, telepathy_handler.c +: telepathy_handler.c +, telepathy_handler.h
  • remmina_tp_handler_register() : telepathy_handler.c @@ -4615,20 +4619,20 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); , remmina_utils.h
  • remmina_utils_get_kernel_release() -: remmina_utils.c -, remmina_utils.h +: remmina_utils.h +, remmina_utils.c
  • remmina_utils_get_lang() : remmina_utils.c , remmina_utils.h
  • remmina_utils_get_lsb_codename() -: remmina_utils.c -, remmina_utils.h +: remmina_utils.h +, remmina_utils.c
  • remmina_utils_get_lsb_description() -: remmina_utils.c -, remmina_utils.h +: remmina_utils.h +, remmina_utils.c
  • remmina_utils_get_lsb_id() : remmina_utils.c @@ -4650,16 +4654,16 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); , remmina_utils.h
  • remmina_utils_string_replace() -: remmina_utils.c -, remmina_utils.h +: remmina_utils.h +, remmina_utils.c
  • remmina_utils_string_replace_all() -: remmina_utils.h -, remmina_utils.c +: remmina_utils.c +, remmina_utils.h
  • remmina_utils_string_strip() -: remmina_utils.c -, remmina_utils.h +: remmina_utils.h +, remmina_utils.c
  • remmina_utils_strpos() : remmina_utils.c @@ -4674,24 +4678,24 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); : remmina_widget_pool.c
  • remmina_widget_pool_count() -: remmina_widget_pool.c -, remmina_widget_pool.h +: remmina_widget_pool.h +, remmina_widget_pool.c
  • remmina_widget_pool_find() -: remmina_widget_pool.h -, remmina_widget_pool.c +: remmina_widget_pool.c +, remmina_widget_pool.h
  • remmina_widget_pool_find_by_window() : remmina_widget_pool.c , remmina_widget_pool.h
  • remmina_widget_pool_foreach() -: remmina_widget_pool.c -, remmina_widget_pool.h +: remmina_widget_pool.h +, remmina_widget_pool.c
  • remmina_widget_pool_init() -: remmina_widget_pool.c -, remmina_widget_pool.h +: remmina_widget_pool.h +, remmina_widget_pool.c
  • remmina_widget_pool_on_widget_destroy() : remmina_widget_pool.c @@ -4842,12 +4846,12 @@ $(document).ready(function(){initNavTree('globals_r.html','');});
  • RemminaLogWindowClass : remmina_log.c
  • -
  • remminamain -: remmina_main.c -
  • RemminaMain : remmina_main.h
  • +
  • remminamain +: remmina_main.c +
  • RemminaMainPriv : remmina_main.h
  • @@ -4972,8 +4976,8 @@ $(document).ready(function(){initNavTree('globals_r.html','');}); : types.h
  • RemminaProtocolPlugin -: remmina_protocol_widget.h -, plugin.h +: plugin.h +, remmina_protocol_widget.h
  • RemminaProtocolSetting : types.h diff --git a/public/navtreedata.js b/public/navtreedata.js index 47053e5ca..a77565630 100644 --- a/public/navtreedata.js +++ b/public/navtreedata.js @@ -95,17 +95,17 @@ var NAVTREEINDEX = "remmina__crypt_8c.html#aa02cf0fed3eb68d6a89815c3ba3bf7b1", "remmina__ftp__client_8c.html#a3cb68d802d3c35dff5cee970d3c33bd5", "remmina__main_8c.html#ab2a1a54320992fb796850ffbd6a63589", -"remmina__pref_8c.html#a23aaa111a41eb1c80df5e85af25e7e44", -"remmina__protocol__widget_8h.html#a278e13b53a4fdb65498e00e908edb98d", -"remmina__ssh_8h.html#a1500d65d1f0751812f237c1cb4d15188", -"remmina__utils_8h.html#a57603aa88df56e77e1a6de0f215f21aa", -"struct___remmina_color_pref.html#aa4a65b76fbdc0b3e97d3046f0b48e1ff", -"struct___remmina_plugin_service.html#a4eac7cd317ef677917c2fa7b1859a189", -"struct___remmina_pref.html#aa1544a98f03088dc260ed98f2deac94f", -"struct___remmina_s_s_h.html#a3a8dc7679e22208bbdf076c520f25bbb", -"structmpchanger__params.html#a44429b8b620590ed1e1e015af6191719", -"structrf__context.html#adf05df0bd656d71f2a95c39ea96b7c6e", -"www__plugin_8c.html#af1e5c3cccf8fcfb51c4518462b9b61ea" +"remmina__pref_8c.html#a12e52ee4ab89912280605e36ee069267", +"remmina__protocol__widget_8h.html#a25bcb2ae99449624fed6f770218e3d25", +"remmina__ssh_8h.html", +"remmina__utils_8h.html#a3ce53eeb3b090f86cfcdbce3e7cf71be", +"struct___remmina_color_pref.html#a8d7f02ac9b6890ad675b702708bc4af9", +"struct___remmina_plugin_service.html#a4880fb57479708bc1cb47bf6b4dcabc3", +"struct___remmina_pref.html#a99a34af002da68036758fab3ceb08259", +"struct___remmina_s_s_h.html#a0b3e071eb2c6011efdcea3f65f8e7fa0", +"structmpchanger__params.html#a3cb4141ca61b0b9a5584239386dbbe46", +"structrf__context.html#ad4ea260ce64d09deea422b9067ee70b4", +"www__plugin_8c.html#ae8ced85169ca68aae1ed7f14b488e5b8" ]; var SYNCONMSG = 'click to disable panel synchronisation'; diff --git a/public/navtreeindex0.js b/public/navtreeindex0.js index f1cd4c62e..5c40a604b 100644 --- a/public/navtreeindex0.js +++ b/public/navtreeindex0.js @@ -160,8 +160,8 @@ var NAVTREEINDEX0 = "globals_type.html":[61,1,3], "globals_u.html":[61,1,0,21], "globals_v.html":[61,1,0,22], -"globals_vars.html":[61,1,2,0], "globals_vars.html":[61,1,2], +"globals_vars.html":[61,1,2,0], "globals_vars_a.html":[61,1,2,1], "globals_vars_b.html":[61,1,2,2], "globals_vars_c.html":[61,1,2,3], diff --git a/public/navtreeindex10.js b/public/navtreeindex10.js index 850c6860f..c7b3b822a 100644 --- a/public/navtreeindex10.js +++ b/public/navtreeindex10.js @@ -1,5 +1,7 @@ var NAVTREEINDEX10 = { +"remmina__ssh_8h.html":[61,0,134], +"remmina__ssh_8h.html#a09bd4aee40b6e8d6ba8ffaa84dc95330":[61,0,134,21], "remmina__ssh_8h.html#a1500d65d1f0751812f237c1cb4d15188":[61,0,134,17], "remmina__ssh_8h.html#a1c095a955af21b3ed9952ba2ea94691b":[61,0,134,32], "remmina__ssh_8h.html#a1dd627c6195e879ba5ca12f5d590b10d":[61,0,134,7], @@ -247,7 +249,5 @@ var NAVTREEINDEX10 = "remmina__utils_8h.html":[61,0,150], "remmina__utils_8h.html#a0f10e190a6dd212fcb0cf36ce81c8324":[61,0,150,5], "remmina__utils_8h.html#a116e7cd4565386fe531d3a6d1a3d3730":[61,0,150,2], -"remmina__utils_8h.html#a2b4dbb0da7c8ba4bd86877097b85d10c":[61,0,150,6], -"remmina__utils_8h.html#a3ce53eeb3b090f86cfcdbce3e7cf71be":[61,0,150,11], -"remmina__utils_8h.html#a54cee350c4ecc6e77af835c4ba90df4c":[61,0,150,1] +"remmina__utils_8h.html#a2b4dbb0da7c8ba4bd86877097b85d10c":[61,0,150,6] }; diff --git a/public/navtreeindex11.js b/public/navtreeindex11.js index 21db0851a..de5ea0aaf 100644 --- a/public/navtreeindex11.js +++ b/public/navtreeindex11.js @@ -1,5 +1,7 @@ var NAVTREEINDEX11 = { +"remmina__utils_8h.html#a3ce53eeb3b090f86cfcdbce3e7cf71be":[61,0,150,11], +"remmina__utils_8h.html#a54cee350c4ecc6e77af835c4ba90df4c":[61,0,150,1], "remmina__utils_8h.html#a57603aa88df56e77e1a6de0f215f21aa":[61,0,150,4], "remmina__utils_8h.html#a5ee50df5d7585d229a154a712c9161ca":[61,0,150,9], "remmina__utils_8h.html#aa6859a61aa28f46591750c9afdef66f4":[61,0,150,12], @@ -247,7 +249,5 @@ var NAVTREEINDEX11 = "struct___remmina_color_pref.html#a5ae99dc78a80baa14e0407983077c500":[60,0,15,18], "struct___remmina_color_pref.html#a5d92875f0034e5fc3d360d97d5992bd4":[60,0,15,15], "struct___remmina_color_pref.html#a675a8004488715429fa540dffb330d49":[60,0,15,0], -"struct___remmina_color_pref.html#a8c109e8479617a5e6da0fcaccf511c60":[60,0,15,8], -"struct___remmina_color_pref.html#a8d7f02ac9b6890ad675b702708bc4af9":[60,0,15,13], -"struct___remmina_color_pref.html#aa495bd5170c952a7dccff4e2504f5867":[60,0,15,20] +"struct___remmina_color_pref.html#a8c109e8479617a5e6da0fcaccf511c60":[60,0,15,8] }; diff --git a/public/navtreeindex12.js b/public/navtreeindex12.js index a4647fd67..51b743a2a 100644 --- a/public/navtreeindex12.js +++ b/public/navtreeindex12.js @@ -1,5 +1,7 @@ var NAVTREEINDEX12 = { +"struct___remmina_color_pref.html#a8d7f02ac9b6890ad675b702708bc4af9":[60,0,15,13], +"struct___remmina_color_pref.html#aa495bd5170c952a7dccff4e2504f5867":[60,0,15,20], "struct___remmina_color_pref.html#aa4a65b76fbdc0b3e97d3046f0b48e1ff":[60,0,15,2], "struct___remmina_color_pref.html#aaff337efd0f03b496a2203068218da7f":[60,0,15,19], "struct___remmina_color_pref.html#ab2b41853bdaaefa3968017819c19d316":[60,0,15,10], @@ -113,37 +115,38 @@ var NAVTREEINDEX12 = "struct___remmina_log_window_class.html":[60,0,33], "struct___remmina_log_window_class.html#af63588f4d71726fcda17ae5c2adcf2af":[60,0,33,0], "struct___remmina_main.html":[60,0,34], -"struct___remmina_main.html#a0995d06fd3cad6098f0ecfaca9ed616f":[60,0,34,21], +"struct___remmina_main.html#a0995d06fd3cad6098f0ecfaca9ed616f":[60,0,34,22], "struct___remmina_main.html#a0baa48aa1ed260cead7af434c3f69549":[60,0,34,0], -"struct___remmina_main.html#a0e6602776373cf6a198d249df6e87150":[60,0,34,20], -"struct___remmina_main.html#a1575015519fedca001bb26e129331b62":[60,0,34,16], +"struct___remmina_main.html#a0e6602776373cf6a198d249df6e87150":[60,0,34,21], +"struct___remmina_main.html#a1575015519fedca001bb26e129331b62":[60,0,34,17], "struct___remmina_main.html#a1ffeff8198ae0dc7c2461001118fcc5a":[60,0,34,6], "struct___remmina_main.html#a2d6960ab62869638a77d2fe5bd72c7f6":[60,0,34,15], "struct___remmina_main.html#a35f10af8065b3b64ba6f26db60061d39":[60,0,34,12], -"struct___remmina_main.html#a37436a0fbd3d64082192826328fe063a":[60,0,34,17], -"struct___remmina_main.html#a45e6df8230d849a78e547fd542d76980":[60,0,34,22], +"struct___remmina_main.html#a37436a0fbd3d64082192826328fe063a":[60,0,34,18], +"struct___remmina_main.html#a45e6df8230d849a78e547fd542d76980":[60,0,34,23], "struct___remmina_main.html#a4db5c4960c9dbe3e798528bacb31456e":[60,0,34,4], "struct___remmina_main.html#a56ac6ffe61c0d3663ebc6b26e65a8cbc":[60,0,34,7], -"struct___remmina_main.html#a6288ed69d372d1047ce94c74e77e0fd4":[60,0,34,18], +"struct___remmina_main.html#a6288ed69d372d1047ce94c74e77e0fd4":[60,0,34,19], "struct___remmina_main.html#a641297035bda72ca18ffe13816a44b21":[60,0,34,3], -"struct___remmina_main.html#a670425eaf7430854a172ee0f41c4e5e0":[60,0,34,19], +"struct___remmina_main.html#a670425eaf7430854a172ee0f41c4e5e0":[60,0,34,20], "struct___remmina_main.html#a7b03d239c21141a202d0698492cfae95":[60,0,34,1], "struct___remmina_main.html#a7db532834f4fd6360956cb0e2383b0fb":[60,0,34,11], -"struct___remmina_main.html#a81f987e527d521be54aaf3f46dfe7ced":[60,0,34,27], -"struct___remmina_main.html#a82aa6f22340fc4f3df185aba7b01afc2":[60,0,34,30], +"struct___remmina_main.html#a81f987e527d521be54aaf3f46dfe7ced":[60,0,34,28], +"struct___remmina_main.html#a82aa6f22340fc4f3df185aba7b01afc2":[60,0,34,31], "struct___remmina_main.html#a8e21f782dd6e0a6d80f0f622898b2a48":[60,0,34,10], -"struct___remmina_main.html#a912f2057752ad0779485c3303e3e9b04":[60,0,34,26], -"struct___remmina_main.html#aa1e811e50525f5a74bb781f8c8a10670":[60,0,34,28], +"struct___remmina_main.html#a912f2057752ad0779485c3303e3e9b04":[60,0,34,27], +"struct___remmina_main.html#a98a1ddd6aebc35c131f8de819a3d861f":[60,0,34,16], +"struct___remmina_main.html#aa1e811e50525f5a74bb781f8c8a10670":[60,0,34,29], "struct___remmina_main.html#aa2b3c232b59da2278215d446b93db0e5":[60,0,34,8], "struct___remmina_main.html#ab3be770af5f21758fa641b274ca967ec":[60,0,34,14], "struct___remmina_main.html#ab743fa626843d8fbb669fbd01819aea9":[60,0,34,9], "struct___remmina_main.html#ab7c6aebff1b06ef97c36bfa9d360b0c1":[60,0,34,2], "struct___remmina_main.html#ac2eff9c56cc7830bcf9ca4bfdf216095":[60,0,34,13], -"struct___remmina_main.html#acacd90f3e6df6a864154edba01464ae2":[60,0,34,25], -"struct___remmina_main.html#acd8f3437eee668a2b8d905a16a16be72":[60,0,34,24], -"struct___remmina_main.html#ae3c2c0b9855bb44b5b9a27a3178d32e7":[60,0,34,29], +"struct___remmina_main.html#acacd90f3e6df6a864154edba01464ae2":[60,0,34,26], +"struct___remmina_main.html#acd8f3437eee668a2b8d905a16a16be72":[60,0,34,25], +"struct___remmina_main.html#ae3c2c0b9855bb44b5b9a27a3178d32e7":[60,0,34,30], "struct___remmina_main.html#aebb188bd83f8dcfb80cad10e43181774":[60,0,34,5], -"struct___remmina_main.html#aecb54d7c3dd1e86a16e24ea2e00d4ddd":[60,0,34,23], +"struct___remmina_main.html#aecb54d7c3dd1e86a16e24ea2e00d4ddd":[60,0,34,24], "struct___remmina_main_priv.html":[60,0,35], "struct___remmina_main_priv.html#a0307278dd7770ab490f4687f2eb00e76":[60,0,35,5], "struct___remmina_main_priv.html#a092aebd62ba9fe50c899e416361c1d00":[60,0,35,6], @@ -246,8 +249,5 @@ var NAVTREEINDEX12 = "struct___remmina_plugin_service.html#a45416583767fafcac3fe3a9ac50d400f":[60,0,43,104], "struct___remmina_plugin_service.html#a4558dbff70064da3de58a6d684611fad":[60,0,43,67], "struct___remmina_plugin_service.html#a46433bff9d6f3ea25b67115031e94e9b":[60,0,43,89], -"struct___remmina_plugin_service.html#a48651c1147371e7e9069eb1fd06a9e4f":[60,0,43,3], -"struct___remmina_plugin_service.html#a4880fb57479708bc1cb47bf6b4dcabc3":[60,0,43,14], -"struct___remmina_plugin_service.html#a4d39a5300472a230a65d44ac16391186":[60,0,43,39], -"struct___remmina_plugin_service.html#a4da50fa364ddf1fcf22def341f61a7cb":[60,0,43,13] +"struct___remmina_plugin_service.html#a48651c1147371e7e9069eb1fd06a9e4f":[60,0,43,3] }; diff --git a/public/navtreeindex13.js b/public/navtreeindex13.js index 9743e48d4..bb706782a 100644 --- a/public/navtreeindex13.js +++ b/public/navtreeindex13.js @@ -1,5 +1,8 @@ var NAVTREEINDEX13 = { +"struct___remmina_plugin_service.html#a4880fb57479708bc1cb47bf6b4dcabc3":[60,0,43,14], +"struct___remmina_plugin_service.html#a4d39a5300472a230a65d44ac16391186":[60,0,43,39], +"struct___remmina_plugin_service.html#a4da50fa364ddf1fcf22def341f61a7cb":[60,0,43,13], "struct___remmina_plugin_service.html#a4eac7cd317ef677917c2fa7b1859a189":[60,0,43,61], "struct___remmina_plugin_service.html#a529cc64f67b16f13f0445add690a8df2":[60,0,43,123], "struct___remmina_plugin_service.html#a54c773d5581087b272a9377893b92999":[60,0,43,46], @@ -246,8 +249,5 @@ var NAVTREEINDEX13 = "struct___remmina_pref.html#a9258f6c3c18f14b4abb148aa43e6bc0e":[60,0,54,22], "struct___remmina_pref.html#a97ad6670df5c399df233f0a74f5c148f":[60,0,54,19], "struct___remmina_pref.html#a994425a04b78282ff40a05580cc9355c":[60,0,54,29], -"struct___remmina_pref.html#a999b74e3aab2e7fbc4431e803511b568":[60,0,54,4], -"struct___remmina_pref.html#a99a34af002da68036758fab3ceb08259":[60,0,54,46], -"struct___remmina_pref.html#a9c5171c5d8a61cc48171065644613cad":[60,0,54,86], -"struct___remmina_pref.html#a9da302463dbefeecf192fd3460de1658":[60,0,54,32] +"struct___remmina_pref.html#a999b74e3aab2e7fbc4431e803511b568":[60,0,54,4] }; diff --git a/public/navtreeindex14.js b/public/navtreeindex14.js index 56e4b53e0..7d0727a25 100644 --- a/public/navtreeindex14.js +++ b/public/navtreeindex14.js @@ -1,5 +1,8 @@ var NAVTREEINDEX14 = { +"struct___remmina_pref.html#a99a34af002da68036758fab3ceb08259":[60,0,54,46], +"struct___remmina_pref.html#a9c5171c5d8a61cc48171065644613cad":[60,0,54,86], +"struct___remmina_pref.html#a9da302463dbefeecf192fd3460de1658":[60,0,54,32], "struct___remmina_pref.html#aa1544a98f03088dc260ed98f2deac94f":[60,0,54,40], "struct___remmina_pref.html#aa3dc5f8676c4747f2fcaf9a68d16d11b":[60,0,54,58], "struct___remmina_pref.html#aa8d4c923cb9ca1be451436d1790e8ee5":[60,0,54,16], @@ -246,8 +249,5 @@ var NAVTREEINDEX14 = "struct___remmina_s_f_t_p_client_class.html":[60,0,71], "struct___remmina_s_f_t_p_client_class.html#ac7786b1cfca2fcc92c85f10e4939f80d":[60,0,71,0], "struct___remmina_s_s_h.html":[60,0,72], -"struct___remmina_s_s_h.html#a0b35a5a573abb5e8b8a27a91434a00a5":[60,0,72,4], -"struct___remmina_s_s_h.html#a0b3e071eb2c6011efdcea3f65f8e7fa0":[60,0,72,5], -"struct___remmina_s_s_h.html#a345d41b54490dd39e35280122d22feed":[60,0,72,11], -"struct___remmina_s_s_h.html#a37cb349f88211ed4a65a3486f8523eaa":[60,0,72,3] +"struct___remmina_s_s_h.html#a0b35a5a573abb5e8b8a27a91434a00a5":[60,0,72,4] }; diff --git a/public/navtreeindex15.js b/public/navtreeindex15.js index c390aa9a8..046576578 100644 --- a/public/navtreeindex15.js +++ b/public/navtreeindex15.js @@ -1,5 +1,8 @@ var NAVTREEINDEX15 = { +"struct___remmina_s_s_h.html#a0b3e071eb2c6011efdcea3f65f8e7fa0":[60,0,72,5], +"struct___remmina_s_s_h.html#a345d41b54490dd39e35280122d22feed":[60,0,72,11], +"struct___remmina_s_s_h.html#a37cb349f88211ed4a65a3486f8523eaa":[60,0,72,3], "struct___remmina_s_s_h.html#a3a8dc7679e22208bbdf076c520f25bbb":[60,0,72,23], "struct___remmina_s_s_h.html#a3aaebd7f03b7d8601818fabc46b787ed":[60,0,72,7], "struct___remmina_s_s_h.html#a46cdb47db9c0ce8c1ac267cb3d10bbb3":[60,0,72,18], @@ -246,8 +249,5 @@ var NAVTREEINDEX15 = "structmpchanger__params.html":[60,0,87], "structmpchanger__params.html#a00a888f26c1609e064367bb5095c71f4":[60,0,87,13], "structmpchanger__params.html#a098952d194a183d4a505aa065797864b":[60,0,87,16], -"structmpchanger__params.html#a170ffe7965540ab152a4a95945482c87":[60,0,87,20], -"structmpchanger__params.html#a3cb4141ca61b0b9a5584239386dbbe46":[60,0,87,17], -"structmpchanger__params.html#a3f0a338901d8e6195eb872b0f2098e73":[60,0,87,22], -"structmpchanger__params.html#a41f51745fc0e63d75d15fc80aaa4a29e":[60,0,87,18] +"structmpchanger__params.html#a170ffe7965540ab152a4a95945482c87":[60,0,87,20] }; diff --git a/public/navtreeindex16.js b/public/navtreeindex16.js index 7fd30fb8c..3a9b67ade 100644 --- a/public/navtreeindex16.js +++ b/public/navtreeindex16.js @@ -1,5 +1,8 @@ var NAVTREEINDEX16 = { +"structmpchanger__params.html#a3cb4141ca61b0b9a5584239386dbbe46":[60,0,87,17], +"structmpchanger__params.html#a3f0a338901d8e6195eb872b0f2098e73":[60,0,87,22], +"structmpchanger__params.html#a41f51745fc0e63d75d15fc80aaa4a29e":[60,0,87,18], "structmpchanger__params.html#a44429b8b620590ed1e1e015af6191719":[60,0,87,1], "structmpchanger__params.html#a59187ffb045f62b334ff972331f960b6":[60,0,87,14], "structmpchanger__params.html#a5c5b14d537a1b0685027d50d2a4cf9be":[60,0,87,11], @@ -246,8 +249,5 @@ var NAVTREEINDEX16 = "structrf__context.html#ac1f3330674d320c9d0ae408c551be6b8":[60,0,113,50], "structrf__context.html#acacad775c2c168f900deaa6c90481319":[60,0,113,51], "structrf__context.html#acee2095e72fb2428c498f62e21800026":[60,0,113,15], -"structrf__context.html#ad06c1d1a2295fbdf455df0250dfb2523":[60,0,113,9], -"structrf__context.html#ad4ea260ce64d09deea422b9067ee70b4":[60,0,113,25], -"structrf__context.html#ada1ddaadc15cc017185d7114cbea4d56":[60,0,113,26], -"structrf__context.html#adeee1ea1db2e19b99e4deb80b8a6a960":[60,0,113,23] +"structrf__context.html#ad06c1d1a2295fbdf455df0250dfb2523":[60,0,113,9] }; diff --git a/public/navtreeindex17.js b/public/navtreeindex17.js index 835538d99..35100e958 100644 --- a/public/navtreeindex17.js +++ b/public/navtreeindex17.js @@ -1,5 +1,8 @@ var NAVTREEINDEX17 = { +"structrf__context.html#ad4ea260ce64d09deea422b9067ee70b4":[60,0,113,25], +"structrf__context.html#ada1ddaadc15cc017185d7114cbea4d56":[60,0,113,26], +"structrf__context.html#adeee1ea1db2e19b99e4deb80b8a6a960":[60,0,113,23], "structrf__context.html#adf05df0bd656d71f2a95c39ea96b7c6e":[60,0,113,43], "structrf__context.html#ae6190d1c82045bcd08e22ff6e98148a3":[60,0,113,48], "structrf__context.html#ae62cc5547984bf11865f93c7d63afdf0":[60,0,113,47], @@ -246,8 +249,5 @@ var NAVTREEINDEX17 = "www__plugin_8c.html#ac6b72af8913086b2ec590a675473f2a1":[61,0,169,23], "www__plugin_8c.html#adb58ee650d75d952dd5802fbba9e9b0e":[61,0,169,9], "www__plugin_8c.html#ae38b4f2efc412b6256221d9a33a03cd4":[61,0,169,19], -"www__plugin_8c.html#ae6ccaf3df9ea3201521eb62dd9943b00":[61,0,169,11], -"www__plugin_8c.html#ae8ced85169ca68aae1ed7f14b488e5b8":[61,0,169,25], -"www__plugin_8c.html#ae91c9382d5bb29416eab7de18c6d6b8d":[61,0,169,13], -"www__plugin_8c.html#ae9973fcef32044b1238648c4695c3f23":[61,0,169,14] +"www__plugin_8c.html#ae6ccaf3df9ea3201521eb62dd9943b00":[61,0,169,11] }; diff --git a/public/navtreeindex18.js b/public/navtreeindex18.js index c91a2cd3d..f2b263e41 100644 --- a/public/navtreeindex18.js +++ b/public/navtreeindex18.js @@ -1,5 +1,8 @@ var NAVTREEINDEX18 = { +"www__plugin_8c.html#ae8ced85169ca68aae1ed7f14b488e5b8":[61,0,169,25], +"www__plugin_8c.html#ae91c9382d5bb29416eab7de18c6d6b8d":[61,0,169,13], +"www__plugin_8c.html#ae9973fcef32044b1238648c4695c3f23":[61,0,169,14], "www__plugin_8c.html#af1e5c3cccf8fcfb51c4518462b9b61ea":[61,0,169,3], "www__plugin_8c.html#af4c8fa778acc2d2f7dd9418e48c99f19":[61,0,169,8], "www__plugin_8c_source.html":[61,0,169], diff --git a/public/navtreeindex6.js b/public/navtreeindex6.js index ace32e4c6..8d166d8c4 100644 --- a/public/navtreeindex6.js +++ b/public/navtreeindex6.js @@ -181,17 +181,17 @@ var NAVTREEINDEX6 = "remmina__log_8h.html#ae439b5fb61045d22c9474b32d0158185":[61,0,93,5], "remmina__log_8h_source.html":[61,0,93], "remmina__main_8c.html":[61,0,94], -"remmina__main_8c.html#a009f32092bd1d8dcd8e783d25416f3df":[61,0,94,74], +"remmina__main_8c.html#a009f32092bd1d8dcd8e783d25416f3df":[61,0,94,75], "remmina__main_8c.html#a05dbb6ce820f3a137949b919d0efa6a1":[61,0,94,40], -"remmina__main_8c.html#a0c32fe66988056b353220128611b9116":[61,0,94,57], +"remmina__main_8c.html#a0c32fe66988056b353220128611b9116":[61,0,94,58], "remmina__main_8c.html#a0edcc1d7dc3adcbb7bb36aa0f62dec3a":[61,0,94,45], "remmina__main_8c.html#a10e574723222f5df9db456977e62a093":[61,0,94,48], -"remmina__main_8c.html#a1bdf3fe7a3de2371f80adcbdcf50381d":[61,0,94,73], -"remmina__main_8c.html#a1cac4199e40e35bf3fcdb98841615657":[61,0,94,69], +"remmina__main_8c.html#a1bdf3fe7a3de2371f80adcbdcf50381d":[61,0,94,74], +"remmina__main_8c.html#a1cac4199e40e35bf3fcdb98841615657":[61,0,94,70], "remmina__main_8c.html#a1e8b7e8c0f7a47dc0409ae6eb18cfc6a":[61,0,94,36], "remmina__main_8c.html#a1f5f9a964a75214d500e7a9fca1bd8a6":[61,0,94,10], -"remmina__main_8c.html#a210e9e04c7c97cc86412044de31f659d":[61,0,94,72], -"remmina__main_8c.html#a2704d643ee15702a84a1c76219dd5277":[61,0,94,55], +"remmina__main_8c.html#a210e9e04c7c97cc86412044de31f659d":[61,0,94,73], +"remmina__main_8c.html#a2704d643ee15702a84a1c76219dd5277":[61,0,94,56], "remmina__main_8c.html#a2a6ba822ef89ef8ad9f19340c2c8b7f5":[61,0,94,32], "remmina__main_8c.html#a31102f8ca7440a22c1514bca17933193":[61,0,94,20], "remmina__main_8c.html#a33ef5745d8b934ef52379c277d3a1ab2":[61,0,94,15], @@ -206,48 +206,48 @@ var NAVTREEINDEX6 = "remmina__main_8c.html#a385c44f6fb256e5716a2302a5b940388a8c5d264253ed2fc8f96ffcee508db93d":[61,0,94,6], "remmina__main_8c.html#a385c44f6fb256e5716a2302a5b940388ac70d28409ca79aa291cc0e58244f1fe4":[61,0,94,9], "remmina__main_8c.html#a385c44f6fb256e5716a2302a5b940388ad68c7d7d2f1cfe0321e87c4a833a0756":[61,0,94,4], -"remmina__main_8c.html#a3c5043279b5d98d4d08635d33402ea66":[61,0,94,80], -"remmina__main_8c.html#a3d60de4c121cae0c82e60b13873073db":[61,0,94,61], -"remmina__main_8c.html#a40493bb60c169e53e2e08a0d0a808302":[61,0,94,62], -"remmina__main_8c.html#a4477897686d091d6f57e7f9401674a8c":[61,0,94,84], +"remmina__main_8c.html#a3c5043279b5d98d4d08635d33402ea66":[61,0,94,81], +"remmina__main_8c.html#a3d60de4c121cae0c82e60b13873073db":[61,0,94,62], +"remmina__main_8c.html#a40493bb60c169e53e2e08a0d0a808302":[61,0,94,63], +"remmina__main_8c.html#a4477897686d091d6f57e7f9401674a8c":[61,0,94,85], "remmina__main_8c.html#a44eb44c6391f53a19c6f1fdf9a39a8c1":[61,0,94,47], "remmina__main_8c.html#a4a4733c243f20c3ffc27105003f5e30e":[61,0,94,16], -"remmina__main_8c.html#a4b4f0bbdb9e487d6c3809e8a57dc1d1c":[61,0,94,60], -"remmina__main_8c.html#a51880fc109db6457a5d0fc543c2deaf2":[61,0,94,76], -"remmina__main_8c.html#a52cc21537ff003b9d0fbdb9040c811af":[61,0,94,51], +"remmina__main_8c.html#a4b4f0bbdb9e487d6c3809e8a57dc1d1c":[61,0,94,61], +"remmina__main_8c.html#a51880fc109db6457a5d0fc543c2deaf2":[61,0,94,77], +"remmina__main_8c.html#a52cc21537ff003b9d0fbdb9040c811af":[61,0,94,52], "remmina__main_8c.html#a5445e5568a6fc04d08b620829a59334a":[61,0,94,44], -"remmina__main_8c.html#a5ae0372dafe41f96a09097c07d1b270a":[61,0,94,85], -"remmina__main_8c.html#a5db4436cc72b9d5ea3e498f8519efecc":[61,0,94,54], +"remmina__main_8c.html#a5ae0372dafe41f96a09097c07d1b270a":[61,0,94,86], +"remmina__main_8c.html#a5db4436cc72b9d5ea3e498f8519efecc":[61,0,94,55], "remmina__main_8c.html#a627eb26ab02f0093365ed6b10dab0320":[61,0,94,34], "remmina__main_8c.html#a6a466d0b07944e619bd9b0e473c8a5bd":[61,0,94,18], "remmina__main_8c.html#a6b30ed832369f3a7153aa63f98873c9d":[61,0,94,46], -"remmina__main_8c.html#a6c69b2fa6a56869c54f58d7ebae89427":[61,0,94,68], +"remmina__main_8c.html#a6c69b2fa6a56869c54f58d7ebae89427":[61,0,94,69], "remmina__main_8c.html#a6ed9f6a588a2d9e3a6cf6884c8d07f92":[61,0,94,43], -"remmina__main_8c.html#a7049d977154921f651cc1538f59c5b7a":[61,0,94,56], +"remmina__main_8c.html#a7049d977154921f651cc1538f59c5b7a":[61,0,94,57], "remmina__main_8c.html#a71f485dba1b11bf8cba129920767b5e6":[61,0,94,28], "remmina__main_8c.html#a71fbe206a9c2abb8f348ee598d7751b7":[61,0,94,22], "remmina__main_8c.html#a74cb130b886c2b905f651e777644a08c":[61,0,94,17], "remmina__main_8c.html#a7740488de65c0e642895cc9dfba07b6e":[61,0,94,24], "remmina__main_8c.html#a7be10e330f0c2a3f74e119cde443786f":[61,0,94,12], -"remmina__main_8c.html#a802458852abacebfb16f1f4295806a01":[61,0,94,71], +"remmina__main_8c.html#a802458852abacebfb16f1f4295806a01":[61,0,94,72], "remmina__main_8c.html#a829d3ad1468d780380ae1ad693532e82":[61,0,94,25], "remmina__main_8c.html#a847424fdb97ffe35d060409d4d738497":[61,0,94,30], "remmina__main_8c.html#a85aa313453e0ecaa17bcce233973998d":[61,0,94,11], -"remmina__main_8c.html#a861de52d1b5ec54591d0592de6289d79":[61,0,94,67], -"remmina__main_8c.html#a8ccd8303ada6e26880504fc58812fbda":[61,0,94,89], -"remmina__main_8c.html#a8ebbcba2c07af0938b3c29e316747d12":[61,0,94,91], +"remmina__main_8c.html#a861de52d1b5ec54591d0592de6289d79":[61,0,94,68], +"remmina__main_8c.html#a8ccd8303ada6e26880504fc58812fbda":[61,0,94,90], +"remmina__main_8c.html#a8ebbcba2c07af0938b3c29e316747d12":[61,0,94,92], "remmina__main_8c.html#a91f22c2834ac7f38d201d8d678f8c57b":[61,0,94,39], -"remmina__main_8c.html#a923b3e2712d969eb59d9291e99f933e8":[61,0,94,86], +"remmina__main_8c.html#a923b3e2712d969eb59d9291e99f933e8":[61,0,94,87], "remmina__main_8c.html#a95532ac6d110eeeb2e41d4b2a329797c":[61,0,94,14], -"remmina__main_8c.html#a9896df7a92402b5a61e58420235c515a":[61,0,94,58], +"remmina__main_8c.html#a9896df7a92402b5a61e58420235c515a":[61,0,94,59], "remmina__main_8c.html#a9e60326026d7de56882bc83c0084fd12":[61,0,94,13], -"remmina__main_8c.html#aa20963aed43242994c88d5a97a546355":[61,0,94,79], +"remmina__main_8c.html#aa20963aed43242994c88d5a97a546355":[61,0,94,80], "remmina__main_8c.html#aa46e6b815c241d32a476a29053dbf296":[61,0,94,31], -"remmina__main_8c.html#aa4d9b76d32fa500f4b9f39a19e4eaaf2":[61,0,94,65], +"remmina__main_8c.html#aa4d9b76d32fa500f4b9f39a19e4eaaf2":[61,0,94,66], "remmina__main_8c.html#aac0bb51159be042fecab0103e73a54dc":[61,0,94,38], -"remmina__main_8c.html#aac3aa116a8d8b527f1aa61b7395b4b32":[61,0,94,53], -"remmina__main_8c.html#aace9ecdd0b74d392ad6ed541bd605c1c":[61,0,94,88], -"remmina__main_8c.html#ab08aae433b625c3a84330630fe2bd2d5":[61,0,94,82], +"remmina__main_8c.html#aac3aa116a8d8b527f1aa61b7395b4b32":[61,0,94,54], +"remmina__main_8c.html#aace9ecdd0b74d392ad6ed541bd605c1c":[61,0,94,89], +"remmina__main_8c.html#ab08aae433b625c3a84330630fe2bd2d5":[61,0,94,83], "remmina__main_8c.html#ab0d22f0e3571eb80886acb0c68005800":[61,0,94,23], -"remmina__main_8c.html#ab203476099a5ad6e889f91c8e05d577d":[61,0,94,59] +"remmina__main_8c.html#ab203476099a5ad6e889f91c8e05d577d":[61,0,94,60] }; diff --git a/public/navtreeindex7.js b/public/navtreeindex7.js index ecdfcf3b8..caf993667 100644 --- a/public/navtreeindex7.js +++ b/public/navtreeindex7.js @@ -1,64 +1,66 @@ var NAVTREEINDEX7 = { -"remmina__main_8c.html#ab2a1a54320992fb796850ffbd6a63589":[61,0,94,81], -"remmina__main_8c.html#ab7c680e1f6ffeef21cb928a083d36d89":[61,0,94,90], -"remmina__main_8c.html#ab98d51c96a87fddaa2d5d6d4614bafa8":[61,0,94,52], +"remmina__main_8c.html#ab2a1a54320992fb796850ffbd6a63589":[61,0,94,82], +"remmina__main_8c.html#ab7c680e1f6ffeef21cb928a083d36d89":[61,0,94,91], +"remmina__main_8c.html#ab98d51c96a87fddaa2d5d6d4614bafa8":[61,0,94,53], "remmina__main_8c.html#aba1a89a2400c5cc8373c6bd34602ac10":[61,0,94,21], -"remmina__main_8c.html#abcf8bd8ca57b389264ff9739a61efdc1":[61,0,94,50], +"remmina__main_8c.html#abcf8bd8ca57b389264ff9739a61efdc1":[61,0,94,51], "remmina__main_8c.html#abf51d42fa2c5ce84164b5514b4634229":[61,0,94,41], -"remmina__main_8c.html#ac1a3a51f6d7f6a2411f9b38de860d766":[61,0,94,66], -"remmina__main_8c.html#ac448c53d7a2066763d2b747d269f60ee":[61,0,94,77], +"remmina__main_8c.html#ac1a3a51f6d7f6a2411f9b38de860d766":[61,0,94,67], +"remmina__main_8c.html#ac448c53d7a2066763d2b747d269f60ee":[61,0,94,78], "remmina__main_8c.html#ac767825cb87a34531306cfb587216d20":[61,0,94,26], "remmina__main_8c.html#ace72fa8f7198020464623e7117a351a9":[61,0,94,19], -"remmina__main_8c.html#ad8744dc59ba8072ffdf557b6c94e9f40":[61,0,94,75], -"remmina__main_8c.html#ad99b9c0bf2fa8c166a8b4a09e06ffdf7":[61,0,94,83], -"remmina__main_8c.html#adf073486149762f547504020484bff70":[61,0,94,64], +"remmina__main_8c.html#ad8744dc59ba8072ffdf557b6c94e9f40":[61,0,94,76], +"remmina__main_8c.html#ad99b9c0bf2fa8c166a8b4a09e06ffdf7":[61,0,94,84], +"remmina__main_8c.html#adf073486149762f547504020484bff70":[61,0,94,65], "remmina__main_8c.html#adf59ad5b0a0ef68e58bbea3701929efc":[61,0,94,42], -"remmina__main_8c.html#adfbfc580d25b58d09770a7d33ffe03cc":[61,0,94,49], +"remmina__main_8c.html#adfbfc580d25b58d09770a7d33ffe03cc":[61,0,94,50], "remmina__main_8c.html#ae32574ebe06b1a24f135af9379e663b4":[61,0,94,29], "remmina__main_8c.html#aea426b2e8fc03f963bb2b98cb8649adf":[61,0,94,37], -"remmina__main_8c.html#aeb74f36e5fd58ceab9f13a184bfb2029":[61,0,94,63], -"remmina__main_8c.html#af129aea3f5f3ec56b061187a81d43e4c":[61,0,94,78], -"remmina__main_8c.html#af146cc1f982c98a9c8a5ac43cc1508f3":[61,0,94,87], +"remmina__main_8c.html#aeb74f36e5fd58ceab9f13a184bfb2029":[61,0,94,64], +"remmina__main_8c.html#af129aea3f5f3ec56b061187a81d43e4c":[61,0,94,79], +"remmina__main_8c.html#af146cc1f982c98a9c8a5ac43cc1508f3":[61,0,94,88], "remmina__main_8c.html#af14b1942a754d7b2f5c10266208ebe01":[61,0,94,35], -"remmina__main_8c.html#af51fc7233eb2397a5074ba37b5c5275f":[61,0,94,70], +"remmina__main_8c.html#af51fc7233eb2397a5074ba37b5c5275f":[61,0,94,71], +"remmina__main_8c.html#af56bada711b2fc9c50af83b8b62dfe8b":[61,0,94,49], "remmina__main_8c.html#afefc1b651e1c546e949dbe6df72b0300":[61,0,94,27], "remmina__main_8c_source.html":[61,0,94], "remmina__main_8h.html":[61,0,95], "remmina__main_8h.html#a05dbb6ce820f3a137949b919d0efa6a1":[61,0,95,9], "remmina__main_8h.html#a0c322c3136c4225d5f8d4cee318afce7":[61,0,95,6], -"remmina__main_8h.html#a0c32fe66988056b353220128611b9116":[61,0,95,26], +"remmina__main_8h.html#a0c32fe66988056b353220128611b9116":[61,0,95,27], "remmina__main_8h.html#a0edcc1d7dc3adcbb7bb36aa0f62dec3a":[61,0,95,14], "remmina__main_8h.html#a10e574723222f5df9db456977e62a093":[61,0,95,17], -"remmina__main_8h.html#a1bdf3fe7a3de2371f80adcbdcf50381d":[61,0,95,31], -"remmina__main_8h.html#a2704d643ee15702a84a1c76219dd5277":[61,0,95,24], +"remmina__main_8h.html#a1bdf3fe7a3de2371f80adcbdcf50381d":[61,0,95,32], +"remmina__main_8h.html#a2704d643ee15702a84a1c76219dd5277":[61,0,95,25], "remmina__main_8h.html#a3948142732379a3d165f3b0b4d5f5abc":[61,0,95,5], "remmina__main_8h.html#a44eb44c6391f53a19c6f1fdf9a39a8c1":[61,0,95,16], "remmina__main_8h.html#a49e7c1b5d4dcfd155886e39d78b3d052":[61,0,95,3], -"remmina__main_8h.html#a4b4f0bbdb9e487d6c3809e8a57dc1d1c":[61,0,95,29], -"remmina__main_8h.html#a4d2d08c3fed3f72ea7f4c0600fec7ed5":[61,0,95,30], -"remmina__main_8h.html#a52cc21537ff003b9d0fbdb9040c811af":[61,0,95,20], +"remmina__main_8h.html#a4b4f0bbdb9e487d6c3809e8a57dc1d1c":[61,0,95,30], +"remmina__main_8h.html#a4d2d08c3fed3f72ea7f4c0600fec7ed5":[61,0,95,31], +"remmina__main_8h.html#a52cc21537ff003b9d0fbdb9040c811af":[61,0,95,21], "remmina__main_8h.html#a5445e5568a6fc04d08b620829a59334a":[61,0,95,13], -"remmina__main_8h.html#a5ae0372dafe41f96a09097c07d1b270a":[61,0,95,35], -"remmina__main_8h.html#a5db4436cc72b9d5ea3e498f8519efecc":[61,0,95,23], +"remmina__main_8h.html#a5ae0372dafe41f96a09097c07d1b270a":[61,0,95,36], +"remmina__main_8h.html#a5db4436cc72b9d5ea3e498f8519efecc":[61,0,95,24], "remmina__main_8h.html#a6b30ed832369f3a7153aa63f98873c9d":[61,0,95,15], "remmina__main_8h.html#a6ed9f6a588a2d9e3a6cf6884c8d07f92":[61,0,95,12], -"remmina__main_8h.html#a7049d977154921f651cc1538f59c5b7a":[61,0,95,25], +"remmina__main_8h.html#a7049d977154921f651cc1538f59c5b7a":[61,0,95,26], "remmina__main_8h.html#a77d974da2ddd1ea7c87f8b9bb1eedda8":[61,0,95,4], "remmina__main_8h.html#a91f22c2834ac7f38d201d8d678f8c57b":[61,0,95,8], -"remmina__main_8h.html#a95cedb0d631aacbd1b4a5ee1e10a40a5":[61,0,95,32], -"remmina__main_8h.html#a9896df7a92402b5a61e58420235c515a":[61,0,95,27], +"remmina__main_8h.html#a95cedb0d631aacbd1b4a5ee1e10a40a5":[61,0,95,33], +"remmina__main_8h.html#a9896df7a92402b5a61e58420235c515a":[61,0,95,28], "remmina__main_8h.html#aac0bb51159be042fecab0103e73a54dc":[61,0,95,7], -"remmina__main_8h.html#aac3aa116a8d8b527f1aa61b7395b4b32":[61,0,95,22], -"remmina__main_8h.html#ab203476099a5ad6e889f91c8e05d577d":[61,0,95,28], -"remmina__main_8h.html#ab2a1a54320992fb796850ffbd6a63589":[61,0,95,33], -"remmina__main_8h.html#ab98d51c96a87fddaa2d5d6d4614bafa8":[61,0,95,21], -"remmina__main_8h.html#abcf8bd8ca57b389264ff9739a61efdc1":[61,0,95,19], +"remmina__main_8h.html#aac3aa116a8d8b527f1aa61b7395b4b32":[61,0,95,23], +"remmina__main_8h.html#ab203476099a5ad6e889f91c8e05d577d":[61,0,95,29], +"remmina__main_8h.html#ab2a1a54320992fb796850ffbd6a63589":[61,0,95,34], +"remmina__main_8h.html#ab98d51c96a87fddaa2d5d6d4614bafa8":[61,0,95,22], +"remmina__main_8h.html#abcf8bd8ca57b389264ff9739a61efdc1":[61,0,95,20], "remmina__main_8h.html#abf51d42fa2c5ce84164b5514b4634229":[61,0,95,10], "remmina__main_8h.html#ad17d9a48f2b3f84e17baa91104bc6cb1":[61,0,95,2], -"remmina__main_8h.html#ad99b9c0bf2fa8c166a8b4a09e06ffdf7":[61,0,95,34], +"remmina__main_8h.html#ad99b9c0bf2fa8c166a8b4a09e06ffdf7":[61,0,95,35], "remmina__main_8h.html#adf59ad5b0a0ef68e58bbea3701929efc":[61,0,95,11], -"remmina__main_8h.html#adfbfc580d25b58d09770a7d33ffe03cc":[61,0,95,18], +"remmina__main_8h.html#adfbfc580d25b58d09770a7d33ffe03cc":[61,0,95,19], +"remmina__main_8h.html#af56bada711b2fc9c50af83b8b62dfe8b":[61,0,95,18], "remmina__main_8h_source.html":[61,0,95], "remmina__marshals_8c.html":[61,0,96], "remmina__marshals_8c.html#a01460bf2694cb9ef62f1409d465ae70b":[61,0,96,1], @@ -247,7 +249,5 @@ var NAVTREEINDEX7 = "remmina__pref_8c.html#a0208d5dc8197423da67e5967aafb7a05":[61,0,115,7], "remmina__pref_8c.html#a0296a8f5b359547a0aa4cbffb914edd3":[61,0,115,6], "remmina__pref_8c.html#a0dd25f5b3a055b936a5fa327bc71f19c":[61,0,115,19], -"remmina__pref_8c.html#a10b667eb7a100d6ac8d9544697f22743":[61,0,115,28], -"remmina__pref_8c.html#a12e52ee4ab89912280605e36ee069267":[61,0,115,9], -"remmina__pref_8c.html#a1a695b64e75d6f49de220dc777e57714":[61,0,115,14] +"remmina__pref_8c.html#a10b667eb7a100d6ac8d9544697f22743":[61,0,115,28] }; diff --git a/public/navtreeindex8.js b/public/navtreeindex8.js index 22458aa23..2efa9d006 100644 --- a/public/navtreeindex8.js +++ b/public/navtreeindex8.js @@ -1,5 +1,7 @@ var NAVTREEINDEX8 = { +"remmina__pref_8c.html#a12e52ee4ab89912280605e36ee069267":[61,0,115,9], +"remmina__pref_8c.html#a1a695b64e75d6f49de220dc777e57714":[61,0,115,14], "remmina__pref_8c.html#a23aaa111a41eb1c80df5e85af25e7e44":[61,0,115,25], "remmina__pref_8c.html#a316f4290c083d28bd3492ee979278290":[61,0,115,27], "remmina__pref_8c.html#a37cd589f00c94cb28eabb1bce4646d0b":[61,0,115,8], @@ -247,7 +249,5 @@ var NAVTREEINDEX8 = "remmina__protocol__widget_8h.html#a1cae52cad394f317c712eb4fd709d261":[61,0,120,72], "remmina__protocol__widget_8h.html#a2067c19b160eb43bddda6c6c6e8d6045":[61,0,120,35], "remmina__protocol__widget_8h.html#a2506e80d482c34532d0e534856452069":[61,0,120,22], -"remmina__protocol__widget_8h.html#a2551dd6f53480609596d2695040fba5d":[61,0,120,78], -"remmina__protocol__widget_8h.html#a25bcb2ae99449624fed6f770218e3d25":[61,0,120,20], -"remmina__protocol__widget_8h.html#a262d75d6b535bd8c623e607805db4084":[61,0,120,50] +"remmina__protocol__widget_8h.html#a2551dd6f53480609596d2695040fba5d":[61,0,120,78] }; diff --git a/public/navtreeindex9.js b/public/navtreeindex9.js index 4a799b9af..b7d738a6c 100644 --- a/public/navtreeindex9.js +++ b/public/navtreeindex9.js @@ -1,5 +1,7 @@ var NAVTREEINDEX9 = { +"remmina__protocol__widget_8h.html#a25bcb2ae99449624fed6f770218e3d25":[61,0,120,20], +"remmina__protocol__widget_8h.html#a262d75d6b535bd8c623e607805db4084":[61,0,120,50], "remmina__protocol__widget_8h.html#a278e13b53a4fdb65498e00e908edb98d":[61,0,120,53], "remmina__protocol__widget_8h.html#a2830f756dfc3d735b57b0c5753c429e3":[61,0,120,37], "remmina__protocol__widget_8h.html#a290eb68f0e86de1b7b82e2d98a1494d1":[61,0,120,34], @@ -247,7 +249,5 @@ var NAVTREEINDEX9 = "remmina__ssh_8c.html#ad6f3f5c196175412049af0c440414e65":[61,0,133,7], "remmina__ssh_8c.html#adfe0e9338fec4a1c03677595c15514d1":[61,0,133,18], "remmina__ssh_8c.html#af39f90e2343e62348226aed0d7496dda":[61,0,133,19], -"remmina__ssh_8c_source.html":[61,0,133], -"remmina__ssh_8h.html":[61,0,134], -"remmina__ssh_8h.html#a09bd4aee40b6e8d6ba8ffaa84dc95330":[61,0,134,21] +"remmina__ssh_8c_source.html":[61,0,133] }; diff --git a/public/rcw_8c_source.html b/public/rcw_8c_source.html index 3256e5937..696206fd7 100644 --- a/public/rcw_8c_source.html +++ b/public/rcw_8c_source.html @@ -117,7 +117,7 @@ $(document).ready(function(){initNavTree('rcw_8c_source.html','');});
    gchar * remmina_pref_file
    Definition: rcw.c:78
    static void rcw_toolbar_fullscreen(GtkToolItem *toggle, RemminaConnectionWindow *cnnwin)
    Definition: rcw.c:1351
    static void rcw_on_switch_page(GtkNotebook *notebook, GtkWidget *newpage, guint page_num, RemminaConnectionWindow *cnnwin)
    Definition: rcw.c:3653
    -
    GtkWindow * remmina_main_get_window()
    +
    GtkWindow * remmina_main_get_window()
    gint remmina_protocol_widget_get_width(RemminaProtocolWidget *gp)
    static gboolean rcw_hostkey_func(RemminaProtocolWidget *gp, guint keyval, gboolean release)
    Definition: rcw.c:4053
    void remmina_scrolled_viewport_remove_motion(RemminaScrolledViewport *gsv)
    diff --git a/public/remmina__exec_8c_source.html b/public/remmina__exec_8c_source.html index 06450d1d9..65af2afd9 100644 --- a/public/remmina__exec_8c_source.html +++ b/public/remmina__exec_8c_source.html @@ -89,7 +89,7 @@ $(document).ready(function(){initNavTree('remmina__exec_8c_source.html','');}); Go to the documentation of this file.
    1 /*
    2  * Remmina - The GTK+ Remote Desktop Client
    3  * Copyright (C) 2010 Vic Lee
    4  * Copyright (C) 2014-2015 Antenore Gatta, Fabio Castelli, Giovanni Panozzo
    5  * Copyright (C) 2016-2023 Antenore Gatta, Giovanni Panozzo
    6  *
    7  * This program is free software; you can redistribute it and/or modify
    8  * it under the terms of the GNU General Public License as published by
    9  * the Free Software Foundation; either version 2 of the License, or
    10  * (at your option) any later version.
    11  *
    12  * This program is distributed in the hope that it will be useful,
    13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    15  * GNU General Public License for more details.
    16  *
    17  * You should have received a copy of the GNU General Public License
    18  * along with this program; if not, write to the Free Software
    19  * Foundation, Inc., 51 Franklin Street, Fifth Floor,
    20  * Boston, MA 02110-1301, USA.
    21  *
    22  * In addition, as a special exception, the copyright holders give
    23  * permission to link the code of portions of this program with the
    24  * OpenSSL library under certain conditions as described in each
    25  * individual source file, and distribute linked combinations
    26  * including the two.
    27  * You must obey the GNU General Public License in all respects
    28  * for all of the code used other than OpenSSL. * If you modify
    29  * file(s) with this exception, you may extend this exception to your
    30  * version of the file(s), but you are not obligated to do so. * If you
    31  * do not wish to do so, delete this exception statement from your
    32  * version. * If you delete this exception statement from all source
    33  * files in the program, then also delete it here.
    34  *
    35  */
    36 
    37 #include "config.h"
    38 #include "buildflags.h"
    39 #include <glib/gi18n.h>
    40 #include <stdlib.h>
    41 #include "remmina.h"
    42 #include "remmina_main.h"
    43 #include "remmina_log.h"
    44 #include "remmina_pref.h"
    45 #include "remmina_widget_pool.h"
    46 #include "remmina_unlock.h"
    47 #include "remmina_pref_dialog.h"
    48 #include "remmina_file.h"
    49 #include "remmina_file_manager.h"
    50 #include "remmina_file_editor.h"
    51 #include "rcw.h"
    52 #include "remmina_about.h"
    53 #include "remmina_plugin_manager.h"
    54 #include "remmina_exec.h"
    56 #include "remmina_file_manager.h"
    57 #include "remmina_crypt.h"
    58 
    59 #include "remmina_icon.h"
    60 
    61 #ifdef SNAP_BUILD
    62 # define ISSNAP "- SNAP Build -"
    63 #else
    64 # define ISSNAP "-"
    65 #endif
    66 
    67 static gboolean cb_closewidget(GtkWidget *widget, gpointer data)
    68 {
    69  TRACE_CALL(__func__);
    70  /* The correct way to close a rcw is to send
    71  * it a "delete-event" signal. Simply destroying it will not close
    72  * all network connections */
    73  if (REMMINA_IS_CONNECTION_WINDOW(widget))
    74  return rcw_delete(RCW(widget));
    75  return TRUE;
    76 }
    77 
    79 {
    80  static const gchar build_config[] =
    81  "Build configuration: " BUILD_CONFIG "\n"
    82  "Build type: " BUILD_TYPE "\n"
    83  "CFLAGS: " CFLAGS "\n"
    84  "Compiler: " COMPILER_ID ", " COMPILER_VERSION "\n"
    85  "Target architecture: " TARGET_ARCH "\n";
    86  return build_config;
    87 }
    88 
    90 {
    91  TRACE_CALL(__func__);
    92 
    93  /* Save main window state/position */
    95 
    96  /* Delete all widgets, main window not included */
    98 
    99 #ifdef HAVE_LIBAPPINDICATOR
    100  /* Remove systray menu */
    102 #endif
    103 
    104  /* close/destroy main window struct and window */
    106 
    107  /* Exit from Remmina */
    108  g_application_quit(g_application_get_default());
    109 }
    110 
    111 static gboolean disable_rcw_delete_confirm_cb(GtkWidget *widget, gpointer data)
    112 {
    113  TRACE_CALL(__func__);
    115 
    116  if (REMMINA_IS_CONNECTION_WINDOW(widget)) {
    117  rcw = (RemminaConnectionWindow*)widget;
    119  }
    120  return TRUE;
    121 }
    122 
    124 {
    125  TRACE_CALL(__func__);
    126 
    127  /* Exit remmina only if there are no interesting windows left:
    128  * no main window, no systray menu, no connection window.
    129  * This function is usually called after a disconnection */
    130 
    131  switch (why) {
    133  // A connection has disconnected, should we exit remmina ?
    136  break;
    138  /* If we are in Kiosk mode, we just exit */
    139  if (kioskmode && kioskmode == TRUE)
    141  // Main window has been deleted
    144  break;
    146  // Quit command has been sent from main window or appindicator/systray menu
    147  // quit means QUIT.
    150  break;
    151  }
    152 }
    153 
    154 
    155 static void newline_remove(char *s)
    156 {
    157  char c;
    158  while((c = *s) != 0 && c != '\r' && c != '\n')
    159  s++;
    160  *s = 0;
    161 }
    162 
    163 /* used for commandline parameter --update-profile X --set-option Y --set-option Z
    164  * return a status code for exit()
    165  */
    166 int remmina_exec_set_setting(gchar *profilefilename, gchar **settings)
    167 {
    168  RemminaFile *remminafile;
    169  int i;
    170  gchar **tk, *value = NULL;
    171  char *line = NULL;
    172  size_t len = 0;
    173  ssize_t read;
    174  gboolean abort = FALSE;
    175 
    176  remminafile = remmina_file_manager_load_file(profilefilename);
    177 
    178  if (!remminafile) {
    179  g_print("Unable to open profile file %s\n", profilefilename);
    180  return 2;
    181  }
    182 
    183  for(i = 0; settings[i] != NULL && !abort; i++) {
    184  if (strlen(settings[i]) > 0) {
    185  tk = g_strsplit(settings[i], "=", 2);
    186  if (tk[1] == NULL) {
    187  read = getline(&line, &len, stdin);
    188  if (read > 0) {
    189  newline_remove(line);
    190  value = line;
    191  } else {
    192  g_print("Error: an extra line of standard input is needed\n");
    193  abort = TRUE;
    194  }
    195  } else
    196  value = tk[1];
    197  remmina_file_set_string(remminafile, tk[0], value);
    198  g_strfreev(tk);
    199  }
    200  }
    201 
    202  if (line) free(line);
    203 
    204  if (!abort) remmina_file_save(remminafile);
    205 
    206  return 0;
    207 
    208 }
    209 
    210 static void remmina_exec_autostart_cb(RemminaFile *remminafile, gpointer user_data)
    211 {
    212  TRACE_CALL(__func__);
    213 
    214  if (remmina_file_get_int(remminafile, "enable-autostart", FALSE)) {
    215  REMMINA_DEBUG ("Profile %s is set to autostart", remminafile->filename);
    216  rcw_open_from_filename(remminafile->filename);
    217  }
    218 
    219 }
    220 
    221 static void remmina_exec_connect(const gchar *data)
    222 {
    223  TRACE_CALL(__func__);
    224 
    225  gchar *protocol;
    226  gchar **protocolserver;
    227  gchar *server;
    228  RemminaFile *remminafile;
    229  gchar **userat;
    230  gchar **userpass;
    231  gchar *user;
    232  gchar *password;
    233  gchar **domainuser;
    234  gchar **serverquery;
    235  gchar **querystring;
    236  gchar **querystringpart;
    237  gchar **querystringpartkv;
    238  gchar *value;
    239  gchar *temp;
    240  GError *error = NULL;
    241 
    242  protocol = NULL;
    243  if (strncmp("rdp://", data, 6) == 0 || strncmp("RDP://", data, 6) == 0)
    244  protocol = "RDP";
    245  else if (strncmp("vnc://", data, 6) == 0 || strncmp("VNC://", data, 6) == 0)
    246  protocol = "VNC";
    247  else if (strncmp("ssh://", data, 6) == 0 || strncmp("SSH://", data, 6) == 0)
    248  protocol = "SSH";
    249  else if (strncmp("spice://", data, 8) == 0 || strncmp("SPICE://", data, 8) == 0)
    250  protocol = "SPICE";
    251 
    252  if (strncmp("file://", data, 6) == 0) {
    253  gchar *filename = g_filename_from_uri (data, NULL, &error);
    254  if (filename != NULL) {
    255  rcw_open_from_filename(filename);
    256  } else
    257  REMMINA_DEBUG ("Opening URI %s failed with error %s", data, error->message);
    258  g_error_free(error);
    259  return;
    260  }
    261 
    262  if (protocol == NULL) {
    264  return;
    265  }
    266 
    267  protocolserver = g_strsplit(data, "://", 2);
    268  server = g_strdup(protocolserver[1]);
    269 
    270  // Support loading .remmina files using handler
    271  if ((temp = strrchr(server, '.')) != NULL && g_strcmp0(temp + 1, "remmina") == 0) {
    272  g_strfreev(protocolserver);
    273  temp = g_uri_unescape_string(server, NULL);
    274  g_free(server);
    275  server = temp;
    276  rcw_open_from_filename(server);
    277  return;
    278  }
    279 
    280  remminafile = remmina_file_new();
    281 
    282  // Check for username@server
    283  if ((strcmp(protocol, "RDP") == 0 || strcmp(protocol, "VNC") == 0 || strcmp(protocol, "SSH") == 0) && strstr(server, "@") != NULL) {
    284  userat = g_strsplit(server, "@", 2);
    285 
    286  // Check for username:password
    287  if (strstr(userat[0], ":") != NULL) {
    288  userpass = g_strsplit(userat[0], ":", 2);
    289  user = g_uri_unescape_string(userpass[0], NULL);
    290  password = g_uri_unescape_string(userpass[1], NULL);
    291 
    292  // Try to decrypt the password field if it contains =
    293  temp = password != NULL && strrchr(password, '=') != NULL ? remmina_crypt_decrypt(password) : NULL;
    294  if (temp != NULL) {
    295  g_free(password);
    296  password = temp;
    297  }
    298  remmina_file_set_string(remminafile, "password", password);
    299  g_free(password);
    300  g_strfreev(userpass);
    301  } else {
    302  user = g_uri_unescape_string(userat[0], NULL);
    303  }
    304 
    305  // Check for domain\user for RDP connections
    306  if (strcmp(protocol, "RDP") == 0 && strstr(user, "\\") != NULL) {
    307  domainuser = g_strsplit(user, "\\", 2);
    308  remmina_file_set_string(remminafile, "domain", domainuser[0]);
    309  g_free(user);
    310  user = g_strdup(domainuser[1]);
    311  }
    312 
    313  remmina_file_set_string(remminafile, "username", user);
    314  g_free(user);
    315  g_free(server);
    316  server = g_strdup(userat[1]);
    317  g_strfreev(userat);
    318  }
    319 
    320  if (strcmp(protocol, "VNC") == 0 && strstr(server, "?") != NULL) {
    321  // https://tools.ietf.org/html/rfc7869
    322  // VncUsername, VncPassword and ColorLevel supported for vnc-params
    323 
    324  // Check for query string parameters
    325  serverquery = g_strsplit(server, "?", 2);
    326  querystring = g_strsplit(serverquery[1], "&", -1);
    327  for (querystringpart = querystring; *querystringpart; querystringpart++) {
    328  if (strstr(*querystringpart, "=") == NULL)
    329  continue;
    330  querystringpartkv = g_strsplit(*querystringpart, "=", 2);
    331  value = g_uri_unescape_string(querystringpartkv[1], NULL);
    332  if (strcmp(querystringpartkv[0], "VncPassword") == 0) {
    333  // Try to decrypt password field if it contains =
    334  temp = value != NULL && strrchr(value, '=') != NULL ? remmina_crypt_decrypt(value) : NULL;
    335  if (temp != NULL) {
    336  g_free(value);
    337  value = temp;
    338  }
    339  remmina_file_set_string(remminafile, "password", value);
    340  } else if (strcmp(querystringpartkv[0], "VncUsername") == 0) {
    341  remmina_file_set_string(remminafile, "username", value);
    342  } else if (strcmp(querystringpartkv[0], "ColorLevel") == 0) {
    343  remmina_file_set_string(remminafile, "colordepth", value);
    344  }
    345  g_free(value);
    346  g_strfreev(querystringpartkv);
    347  }
    348  g_strfreev(querystring);
    349  g_free(server);
    350  server = g_strdup(serverquery[0]);
    351  g_strfreev(serverquery);
    352  }
    353 
    354  // Unescape server
    355  temp = g_uri_unescape_string(server, NULL);
    356  g_free(server);
    357  server = temp;
    358 
    359  remmina_file_set_string(remminafile, "server", server);
    360  remmina_file_set_string(remminafile, "name", server);
    361  remmina_file_set_string(remminafile, "sound", "off");
    362  remmina_file_set_string(remminafile, "protocol", protocol);
    363  g_free(server);
    364  g_strfreev(protocolserver);
    365  rcw_open_from_file(remminafile);
    366 }
    367 
    368 void remmina_exec_command(RemminaCommandType command, const gchar* data)
    369 {
    370  TRACE_CALL(__func__);
    371  gchar *s1;
    372  gchar *s2;
    373  gchar *temp;
    374  GtkWidget *widget;
    375  GtkWindow *mainwindow;
    376  GtkWidget *prefdialog;
    377  RemminaEntryPlugin *plugin;
    378  int i;
    379  int ch;
    380  mainwindow = remmina_main_get_window();
    381 
    382  switch (command) {
    385  break;
    386 
    388  if (mainwindow) {
    389  gtk_window_present(mainwindow);
    390  gtk_window_deiconify(GTK_WINDOW(mainwindow));
    391  }else {
    392  widget = remmina_main_new();
    393  gtk_widget_show(widget);
    394  }
    395  break;
    396 
    398  if (remmina_pref_get_boolean("use_primary_password")
    399  && remmina_unlock_new(mainwindow) == 0)
    400  break;
    401  prefdialog = remmina_pref_dialog_get_dialog();
    402  if (prefdialog) {
    403  gtk_window_present(GTK_WINDOW(prefdialog));
    404  gtk_window_deiconify(GTK_WINDOW(prefdialog));
    405  }else {
    406  /* Create a new preference dialog */
    407  widget = remmina_pref_dialog_new(atoi(data), NULL);
    408  gtk_widget_show(widget);
    409  }
    410  break;
    411 
    412  case REMMINA_COMMAND_NEW:
    413  if (remmina_pref_get_boolean("lock_edit")
    414  && remmina_pref_get_boolean("use_primary_password"))
    415  if (remmina_unlock_new(mainwindow) == 0)
    416  break;
    417  s1 = (data ? strchr(data, ',') : NULL);
    418  if (s1) {
    419  s1 = g_strdup(data);
    420  s2 = strchr(s1, ',');
    421  *s2++ = '\0';
    422  widget = remmina_file_editor_new_full(s2, s1);
    423  g_free(s1);
    424  }else {
    425  widget = remmina_file_editor_new_full(NULL, data);
    426  }
    427  gtk_widget_show(widget);
    428  break;
    429 
    431  REMMINA_DEBUG ("Initiating connection");
    436  if (remmina_pref_get_boolean("lock_connect")
    437  && remmina_pref_get_boolean("use_primary_password"))
    438  if (remmina_unlock_new(mainwindow) == 0)
    439  break;
    440  remmina_exec_connect(data);
    441  break;
    442 
    444  if (remmina_pref_get_boolean("lock_edit")
    445  && remmina_pref_get_boolean("use_primary_password"))
    446  if (remmina_unlock_new(mainwindow) == 0)
    447  break;
    449  if (widget)
    450  gtk_widget_show(widget);
    451  break;
    452 
    454  remmina_about_open(NULL);
    455  break;
    456 
    458  mainwindow = remmina_main_get_window();
    459  if (mainwindow) {
    460  remmina_about_open(NULL);
    461  }else {
    462  g_print("%s %s %s (git %s)\n", g_get_application_name(), ISSNAP, VERSION, REMMINA_GIT_REVISION);
    463  /* As we do not use the "handle-local-options" signal, we have to exit Remmina */
    465  }
    466 
    467  break;
    468 
    470  mainwindow = remmina_main_get_window();
    471  if (mainwindow) {
    472  /* Show th widget with the list of plugins and versions */
    473  remmina_plugin_manager_show(mainwindow);
    474  }else {
    475  g_print("\n%s %s %s (git %s)\n\n", g_get_application_name(), ISSNAP, VERSION, REMMINA_GIT_REVISION);
    476 
    478  g_print("\n%s\n", remmina_exec_get_build_config());
    480  }
    481 
    482  break;
    483 
    484 
    487  if (plugin) {
    488  plugin->entry_func(plugin);
    489  }else {
    490  widget = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
    491  _("Plugin %s is not registered."), data);
    492  g_signal_connect(G_OBJECT(widget), "response", G_CALLBACK(gtk_widget_destroy), NULL);
    493  gtk_widget_show(widget);
    495  }
    496  break;
    497 
    499  i = 0;
    500  g_print("Enter the password you want to encrypt: ");
    501  temp = (char *)g_malloc(255 * sizeof(char));
    502  while ((ch = getchar()) != EOF && ch != '\n') {
    503  if (i < 254) {
    504  temp[i] = ch;
    505  i++;
    506  }
    507  }
    508  temp[i] = '\0';
    509  s1 = remmina_crypt_encrypt(temp);
    510  s2 = g_uri_escape_string(s1, NULL, TRUE);
    511  g_print("\nEncrypted password: %s\n\n", s1);
    512  g_print("Usage:\n");
    513  g_print("rdp://username:%s@server\n", s1);
    514  g_print("vnc://username:%s@server\n", s1);
    515  g_print("vnc://server?VncUsername=user\\&VncPassword=%s\n", s2);
    516  g_free(s1);
    517  g_free(s2);
    518  g_free(temp);
    520  break;
    521 
    525  break;
    526 
    527  default:
    528  break;
    529  }
    530 }
    int remmina_exec_set_setting(gchar *profilefilename, gchar **settings)
    Definition: remmina_exec.c:166
    RemminaCondExitType
    Definition: remmina_exec.h:58
    -
    GtkWindow * remmina_main_get_window()
    +
    GtkWindow * remmina_main_get_window()
    gchar * remmina_crypt_decrypt(const gchar *str)
    @@ -105,8 +105,8 @@ $(document).ready(function(){initNavTree('remmina__exec_8c_source.html','');});
    gboolean remmina_icon_is_available(void)
    Determine whenever the Remmina icon is available.
    Definition: remmina_icon.c:318
    GtkWidget * remmina_file_editor_new_full(const gchar *server, const gchar *protocol)
    -
    GtkWidget * remmina_main_new(void)
    -
    void remmina_main_save_before_destroy()
    Save the Remmina Main Window size and the expanded group before to close Remmina. ...
    Definition: remmina_main.c:179
    +
    GtkWidget * remmina_main_new(void)
    +
    void remmina_main_save_before_destroy()
    Save the Remmina Main Window size and the expanded group before to close Remmina. ...
    Definition: remmina_main.c:180
    const gchar * remmina_exec_get_build_config(void)
    Definition: remmina_exec.c:78
    Definition: plugin.h:90
    @@ -130,7 +130,7 @@ $(document).ready(function(){initNavTree('remmina__exec_8c_source.html','');});
    gboolean remmina_pref_get_boolean(const gchar *key)
    GtkWidget * remmina_file_editor_new_from_filename(const gchar *filename)
    -
    void remmina_main_destroy()
    Definition: remmina_main.c:192
    +
    void remmina_main_destroy()
    Definition: remmina_main.c:193
    RemminaFile * remmina_file_new(void)
    Definition: remmina_file.c:93
    void rcw_open_from_file(RemminaFile *remminafile)
    Definition: rcw.c:4446
    diff --git a/public/remmina__file_8c_source.html b/public/remmina__file_8c_source.html index 16e7c4341..ad1a85f7e 100644 --- a/public/remmina__file_8c_source.html +++ b/public/remmina__file_8c_source.html @@ -122,7 +122,7 @@ $(document).ready(function(){initNavTree('remmina__file_8c_source.html','');});
    gchar * remmina_file_format_properties(RemminaFile *remminafile, const gchar *setting)
    Definition: remmina_file.c:561
    const RemminaProtocolSetting * find_protocol_setting(const gchar *name, RemminaProtocolPlugin *protocol_plugin)
    Definition: remmina_file.c:235
    -
    void remmina_main_update_file_datetime(RemminaFile *file)
    +
    void remmina_main_update_file_datetime(RemminaFile *file)
    const gchar * icon_name_ssh
    Definition: plugin.h:73
    gint remmina_file_get_state_int(RemminaFile *remminafile, const gchar *setting, gint default_value)
    Definition: remmina_file.c:615
    void remmina_file_state_last_success(RemminaFile *remminafile)
    Definition: remmina_file.c:946
    @@ -135,7 +135,7 @@ $(document).ready(function(){initNavTree('remmina__file_8c_source.html','');});
    gchar * remmina_crypt_encrypt(const gchar *str)
    Definition: remmina_crypt.c:93
    gdouble remmina_file_get_state_double(RemminaFile *remminafile, const gchar *setting, gdouble default_value)
    Definition: remmina_file.c:655
    -
    void remmina_main_show_warning_dialog(const gchar *message)
    +
    void remmina_main_show_warning_dialog(const gchar *message)
    void remmina_file_set_int(RemminaFile *remminafile, const gchar *setting, gint value)
    Definition: remmina_file.c:585
    static GKeyFile * remmina_file_get_keyfile(RemminaFile *remminafile)
    Definition: remmina_file.c:680
    diff --git a/public/remmina__file__editor_8c_source.html b/public/remmina__file__editor_8c_source.html index 918f1cbd7..7b4565f41 100644 --- a/public/remmina__file__editor_8c_source.html +++ b/public/remmina__file__editor_8c_source.html @@ -106,7 +106,7 @@ $(document).ready(function(){initNavTree('remmina__file__editor_8c_source.html',
    static void remmina_file_editor_on_connect(GtkWidget *button, RemminaFileEditor *gfe)
    gchar * remmina_pref_file
    Definition: rcw.c:78
    -
    GtkWindow * remmina_main_get_window()
    +
    GtkWindow * remmina_main_get_window()
    void remmina_string_list_set_validation_func(RemminaStringListValidationFunc func)
    G_DEFINE_TYPE(RemminaFileEditor, remmina_file_editor, GTK_TYPE_DIALOG)
    diff --git a/public/remmina__main_8c.html b/public/remmina__main_8c.html index 7b9470588..2514870b5 100644 --- a/public/remmina__main_8c.html +++ b/public/remmina__main_8c.html @@ -188,6 +188,8 @@ Functions   void remmina_main_on_action_connection_delete (GSimpleAction *action, GVariant *param, gpointer data)   +void remmina_main_on_action_connection_delete_multiple (GSimpleAction *action, GVariant *param, gpointer data) +  void remmina_main_on_accel_application_preferences (GSimpleAction *action, GVariant *param, gpointer data)   void remmina_main_reload_preferences () @@ -340,7 +342,7 @@ Variables
    -

    Definition at line 1253 of file remmina_main.c.

    +

    Definition at line 1312 of file remmina_main.c.

    @@ -384,7 +386,7 @@ Variables
    -

    Definition at line 1142 of file remmina_main.c.

    +

    Definition at line 1201 of file remmina_main.c.

    @@ -428,7 +430,7 @@ Variables
    -

    Definition at line 1465 of file remmina_main.c.

    +

    Definition at line 1532 of file remmina_main.c.

    @@ -456,7 +458,7 @@ Variables
    -

    Definition at line 260 of file remmina_main.c.

    +

    Definition at line 261 of file remmina_main.c.

    @@ -476,7 +478,7 @@ Variables
    -

    Definition at line 192 of file remmina_main.c.

    +

    Definition at line 193 of file remmina_main.c.

    @@ -506,7 +508,7 @@ Variables

    Try to exit remmina after a delete window event.

    -

    Definition at line 217 of file remmina_main.c.

    +

    Definition at line 218 of file remmina_main.c.

    @@ -534,7 +536,7 @@ Variables
    -

    Definition at line 445 of file remmina_main.c.

    +

    Definition at line 446 of file remmina_main.c.

    @@ -562,7 +564,7 @@ Variables
    -

    Definition at line 416 of file remmina_main.c.

    +

    Definition at line 417 of file remmina_main.c.

    @@ -600,7 +602,7 @@ Variables
    -

    Definition at line 804 of file remmina_main.c.

    +

    Definition at line 805 of file remmina_main.c.

    @@ -636,7 +638,7 @@ Variables
    -

    Definition at line 1389 of file remmina_main.c.

    +

    Definition at line 1448 of file remmina_main.c.

    @@ -672,7 +674,7 @@ Variables
    -

    Definition at line 1404 of file remmina_main.c.

    +

    Definition at line 1471 of file remmina_main.c.

    @@ -714,7 +716,7 @@ Variables
    -

    Definition at line 1371 of file remmina_main.c.

    +

    Definition at line 1430 of file remmina_main.c.

    @@ -752,7 +754,7 @@ Variables
    -

    Definition at line 514 of file remmina_main.c.

    +

    Definition at line 515 of file remmina_main.c.

    @@ -796,7 +798,7 @@ Variables
    -

    Definition at line 526 of file remmina_main.c.

    +

    Definition at line 527 of file remmina_main.c.

    @@ -816,7 +818,7 @@ Variables
    -

    Definition at line 1648 of file remmina_main.c.

    +

    Definition at line 1716 of file remmina_main.c.

    @@ -836,7 +838,7 @@ Variables
    -

    Definition at line 234 of file remmina_main.c.

    +

    Definition at line 235 of file remmina_main.c.

    @@ -864,7 +866,7 @@ Variables
    -

    Definition at line 1099 of file remmina_main.c.

    +

    Definition at line 1158 of file remmina_main.c.

    @@ -893,7 +895,7 @@ Variables
    Todo:
    Set entry_quick_connect_server as default search entry. Weirdly. This does not work yet.
    -

    Definition at line 1484 of file remmina_main.c.

    +

    Definition at line 1551 of file remmina_main.c.

    @@ -931,7 +933,7 @@ Variables
    -

    Definition at line 354 of file remmina_main.c.

    +

    Definition at line 355 of file remmina_main.c.

    @@ -969,7 +971,7 @@ Variables
    -

    Definition at line 482 of file remmina_main.c.

    +

    Definition at line 483 of file remmina_main.c.

    @@ -1013,7 +1015,7 @@ Variables
    -

    Definition at line 454 of file remmina_main.c.

    +

    Definition at line 455 of file remmina_main.c.

    @@ -1041,7 +1043,7 @@ Variables
    -

    Definition at line 406 of file remmina_main.c.

    +

    Definition at line 407 of file remmina_main.c.

    @@ -1085,7 +1087,7 @@ Variables
    -

    Definition at line 379 of file remmina_main.c.

    +

    Definition at line 380 of file remmina_main.c.

    @@ -1112,7 +1114,7 @@ Variables
    -

    Definition at line 645 of file remmina_main.c.

    +

    Definition at line 646 of file remmina_main.c.

    @@ -1148,7 +1150,7 @@ Variables
    -

    Definition at line 761 of file remmina_main.c.

    +

    Definition at line 762 of file remmina_main.c.

    @@ -1168,7 +1170,7 @@ Variables
    -

    Definition at line 1565 of file remmina_main.c.

    +

    Definition at line 1632 of file remmina_main.c.

    @@ -1204,7 +1206,7 @@ Variables
    -

    Definition at line 1010 of file remmina_main.c.

    +

    Definition at line 1069 of file remmina_main.c.

    @@ -1224,7 +1226,7 @@ Variables
    -

    Definition at line 1358 of file remmina_main.c.

    +

    Definition at line 1417 of file remmina_main.c.

    @@ -1260,7 +1262,7 @@ Variables
    -

    Definition at line 1247 of file remmina_main.c.

    +

    Definition at line 1306 of file remmina_main.c.

    @@ -1296,7 +1298,7 @@ Variables
    -

    Definition at line 1201 of file remmina_main.c.

    +

    Definition at line 1260 of file remmina_main.c.

    @@ -1332,7 +1334,7 @@ Variables
    -

    Definition at line 1053 of file remmina_main.c.

    +

    Definition at line 1112 of file remmina_main.c.

    @@ -1368,7 +1370,7 @@ Variables
    -

    Definition at line 813 of file remmina_main.c.

    +

    Definition at line 814 of file remmina_main.c.

    @@ -1404,7 +1406,7 @@ Variables
    -

    Definition at line 1195 of file remmina_main.c.

    +

    Definition at line 1254 of file remmina_main.c.

    @@ -1440,7 +1442,7 @@ Variables
    -

    Definition at line 1027 of file remmina_main.c.

    +

    Definition at line 1086 of file remmina_main.c.

    @@ -1476,7 +1478,7 @@ Variables
    -

    Definition at line 1081 of file remmina_main.c.

    +

    Definition at line 1140 of file remmina_main.c.

    @@ -1512,7 +1514,7 @@ Variables
    -

    Definition at line 1334 of file remmina_main.c.

    +

    Definition at line 1393 of file remmina_main.c.

    @@ -1548,7 +1550,7 @@ Variables
    -

    Definition at line 767 of file remmina_main.c.

    +

    Definition at line 768 of file remmina_main.c.

    @@ -1584,7 +1586,7 @@ Variables
    -

    Definition at line 909 of file remmina_main.c.

    +

    Definition at line 910 of file remmina_main.c.

    @@ -1620,7 +1622,43 @@ Variables
    -

    Definition at line 976 of file remmina_main.c.

    +

    Definition at line 977 of file remmina_main.c.

    + +
    + + +

    ◆ remmina_main_on_action_connection_delete_multiple()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void remmina_main_on_action_connection_delete_multiple (GSimpleAction * action,
    GVariant * param,
    gpointer data 
    )
    +
    + +

    Definition at line 1011 of file remmina_main.c.

    @@ -1656,7 +1694,7 @@ Variables
    -

    Definition at line 945 of file remmina_main.c.

    +

    Definition at line 946 of file remmina_main.c.

    @@ -1692,7 +1730,7 @@ Variables
    -

    Definition at line 795 of file remmina_main.c.

    +

    Definition at line 796 of file remmina_main.c.

    @@ -1728,7 +1766,7 @@ Variables
    -

    Definition at line 850 of file remmina_main.c.

    +

    Definition at line 851 of file remmina_main.c.

    @@ -1764,7 +1802,7 @@ Variables
    -

    Definition at line 1364 of file remmina_main.c.

    +

    Definition at line 1423 of file remmina_main.c.

    @@ -1800,7 +1838,7 @@ Variables
    -

    Definition at line 1229 of file remmina_main.c.

    +

    Definition at line 1288 of file remmina_main.c.

    @@ -1836,7 +1874,7 @@ Variables
    -

    Definition at line 1241 of file remmina_main.c.

    +

    Definition at line 1300 of file remmina_main.c.

    @@ -1872,7 +1910,7 @@ Variables
    -

    Definition at line 1235 of file remmina_main.c.

    +

    Definition at line 1294 of file remmina_main.c.

    @@ -1908,7 +1946,7 @@ Variables
    -

    Definition at line 1217 of file remmina_main.c.

    +

    Definition at line 1276 of file remmina_main.c.

    @@ -1944,7 +1982,7 @@ Variables
    -

    Definition at line 1223 of file remmina_main.c.

    +

    Definition at line 1282 of file remmina_main.c.

    @@ -1980,7 +2018,7 @@ Variables
    -

    Definition at line 1340 of file remmina_main.c.

    +

    Definition at line 1399 of file remmina_main.c.

    @@ -2016,7 +2054,7 @@ Variables
    -

    Definition at line 1166 of file remmina_main.c.

    +

    Definition at line 1225 of file remmina_main.c.

    @@ -2052,7 +2090,7 @@ Variables
    -

    Definition at line 1154 of file remmina_main.c.

    +

    Definition at line 1213 of file remmina_main.c.

    @@ -2071,7 +2109,7 @@ Variables
    -

    Definition at line 1089 of file remmina_main.c.

    +

    Definition at line 1148 of file remmina_main.c.

    @@ -2107,7 +2145,7 @@ Variables
    -

    Definition at line 224 of file remmina_main.c.

    +

    Definition at line 225 of file remmina_main.c.

    @@ -2129,7 +2167,7 @@ Variables

    Called when the remminamain->window widget is destroyed (glade event handler)

    -

    Definition at line 247 of file remmina_main.c.

    +

    Definition at line 248 of file remmina_main.c.

    @@ -2195,7 +2233,7 @@ Variables
    -

    Definition at line 1446 of file remmina_main.c.

    +

    Definition at line 1513 of file remmina_main.c.

    @@ -2225,7 +2263,7 @@ Variables
    -

    Definition at line 1556 of file remmina_main.c.

    +

    Definition at line 1623 of file remmina_main.c.

    @@ -2244,7 +2282,7 @@ Variables
    -

    Definition at line 890 of file remmina_main.c.

    +

    Definition at line 891 of file remmina_main.c.

    @@ -2280,7 +2318,7 @@ Variables
    -

    Definition at line 1477 of file remmina_main.c.

    +

    Definition at line 1544 of file remmina_main.c.

    @@ -2310,7 +2348,7 @@ Variables
    -

    Definition at line 1328 of file remmina_main.c.

    +

    Definition at line 1387 of file remmina_main.c.

    @@ -2340,7 +2378,7 @@ Variables
    -

    Definition at line 1426 of file remmina_main.c.

    +

    Definition at line 1493 of file remmina_main.c.

    @@ -2382,7 +2420,7 @@ Variables
    -

    Definition at line 1419 of file remmina_main.c.

    +

    Definition at line 1486 of file remmina_main.c.

    @@ -2410,7 +2448,7 @@ Variables
    -

    Definition at line 1265 of file remmina_main.c.

    +

    Definition at line 1324 of file remmina_main.c.

    @@ -2440,7 +2478,7 @@ Variables
    -

    Definition at line 1319 of file remmina_main.c.

    +

    Definition at line 1378 of file remmina_main.c.

    @@ -2459,7 +2497,7 @@ Variables
    -

    Definition at line 1018 of file remmina_main.c.

    +

    Definition at line 1077 of file remmina_main.c.

    @@ -2482,7 +2520,7 @@ Variables

    Save the Remmina Main Window size and the expanded group before to close Remmina.

    This function uses remmina_main_save_size and remmina_main_save_expanded_group.

    -

    Definition at line 179 of file remmina_main.c.

    +

    Definition at line 180 of file remmina_main.c.

    @@ -2510,7 +2548,7 @@ Variables
    -

    Definition at line 163 of file remmina_main.c.

    +

    Definition at line 164 of file remmina_main.c.

    @@ -2554,7 +2592,7 @@ Variables
    -

    Definition at line 149 of file remmina_main.c.

    +

    Definition at line 150 of file remmina_main.c.

    @@ -2584,7 +2622,7 @@ Variables

    Save the Remmina Main Window size to assure the main geometry at each restart.

    -

    Definition at line 138 of file remmina_main.c.

    +

    Definition at line 139 of file remmina_main.c.

    @@ -2628,7 +2666,7 @@ Variables
    -

    Definition at line 869 of file remmina_main.c.

    +

    Definition at line 870 of file remmina_main.c.

    @@ -2656,7 +2694,7 @@ Variables
    -

    Definition at line 617 of file remmina_main.c.

    +

    Definition at line 618 of file remmina_main.c.

    @@ -2712,7 +2750,7 @@ Variables
    -

    Definition at line 321 of file remmina_main.c.

    +

    Definition at line 322 of file remmina_main.c.

    @@ -2748,7 +2786,7 @@ Variables
    -

    Definition at line 1667 of file remmina_main.c.

    +

    Definition at line 1735 of file remmina_main.c.

    @@ -2775,7 +2813,7 @@ Variables
    -

    Definition at line 271 of file remmina_main.c.

    +

    Definition at line 272 of file remmina_main.c.

    @@ -2795,7 +2833,7 @@ Variables
    -

    Definition at line 1677 of file remmina_main.c.

    +

    Definition at line 1745 of file remmina_main.c.

    @@ -2845,7 +2883,7 @@ Variables
    -

    Definition at line 880 of file remmina_main.c.

    +

    Definition at line 881 of file remmina_main.c.

    @@ -2865,7 +2903,7 @@ Variables
    -

    Definition at line 1660 of file remmina_main.c.

    +

    Definition at line 1728 of file remmina_main.c.

    @@ -2889,18 +2927,18 @@ Variables
    -Initial value:
    = {
    { "about", remmina_main_on_action_application_about, NULL, NULL, NULL },
    { "default", remmina_main_on_action_application_default, NULL, NULL, NULL },
    { "mpchange", remmina_main_on_action_application_mpchange, NULL, NULL, NULL },
    { "plugins", remmina_main_on_action_application_plugins, NULL, NULL, NULL },
    { "preferences", remmina_main_on_action_application_preferences, "i", NULL, NULL },
    { "dark", remmina_main_on_action_application_dark_theme, NULL, NULL, NULL },
    { "debug", remmina_main_on_action_help_debug, NULL, NULL, NULL },
    { "community", remmina_main_on_action_help_community, NULL, NULL, NULL },
    { "donations", remmina_main_on_action_help_donations, NULL, NULL, NULL },
    { "homepage", remmina_main_on_action_help_homepage, NULL, NULL, NULL },
    { "wiki", remmina_main_on_action_help_wiki, NULL, NULL, NULL },
    { "quit", remmina_main_on_action_application_quit, NULL, NULL, NULL },
    }
    void remmina_main_on_action_help_homepage(GSimpleAction *action, GVariant *param, gpointer data)
    -
    void remmina_main_on_action_application_mpchange(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:813
    -
    void remmina_main_on_action_help_debug(GSimpleAction *action, GVariant *param, gpointer data)
    -
    void remmina_main_on_action_help_wiki(GSimpleAction *action, GVariant *param, gpointer data)
    -
    void remmina_main_on_action_application_default(GSimpleAction *action, GVariant *param, gpointer data)
    -
    void remmina_main_on_action_help_donations(GSimpleAction *action, GVariant *param, gpointer data)
    -
    void remmina_main_on_action_application_preferences(GSimpleAction *action, GVariant *param, gpointer data)
    -
    void remmina_main_on_action_help_community(GSimpleAction *action, GVariant *param, gpointer data)
    -
    void remmina_main_on_action_application_dark_theme(GSimpleAction *action, GVariant *param, gpointer data)
    -
    void remmina_main_on_action_application_quit(GSimpleAction *action, GVariant *param, gpointer data)
    -
    void remmina_main_on_action_application_about(GSimpleAction *action, GVariant *param, gpointer data)
    -
    void remmina_main_on_action_application_plugins(GSimpleAction *action, GVariant *param, gpointer data)
    +Initial value:
    = {
    { "about", remmina_main_on_action_application_about, NULL, NULL, NULL },
    { "default", remmina_main_on_action_application_default, NULL, NULL, NULL },
    { "mpchange", remmina_main_on_action_application_mpchange, NULL, NULL, NULL },
    { "plugins", remmina_main_on_action_application_plugins, NULL, NULL, NULL },
    { "preferences", remmina_main_on_action_application_preferences, "i", NULL, NULL },
    { "dark", remmina_main_on_action_application_dark_theme, NULL, NULL, NULL },
    { "debug", remmina_main_on_action_help_debug, NULL, NULL, NULL },
    { "community", remmina_main_on_action_help_community, NULL, NULL, NULL },
    { "donations", remmina_main_on_action_help_donations, NULL, NULL, NULL },
    { "homepage", remmina_main_on_action_help_homepage, NULL, NULL, NULL },
    { "wiki", remmina_main_on_action_help_wiki, NULL, NULL, NULL },
    { "quit", remmina_main_on_action_application_quit, NULL, NULL, NULL },
    }
    void remmina_main_on_action_help_homepage(GSimpleAction *action, GVariant *param, gpointer data)
    +
    void remmina_main_on_action_application_mpchange(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:814
    +
    void remmina_main_on_action_help_debug(GSimpleAction *action, GVariant *param, gpointer data)
    +
    void remmina_main_on_action_help_wiki(GSimpleAction *action, GVariant *param, gpointer data)
    +
    void remmina_main_on_action_application_default(GSimpleAction *action, GVariant *param, gpointer data)
    +
    void remmina_main_on_action_help_donations(GSimpleAction *action, GVariant *param, gpointer data)
    +
    void remmina_main_on_action_application_preferences(GSimpleAction *action, GVariant *param, gpointer data)
    +
    void remmina_main_on_action_help_community(GSimpleAction *action, GVariant *param, gpointer data)
    +
    void remmina_main_on_action_application_dark_theme(GSimpleAction *action, GVariant *param, gpointer data)
    +
    void remmina_main_on_action_application_quit(GSimpleAction *action, GVariant *param, gpointer data)
    +
    void remmina_main_on_action_application_about(GSimpleAction *action, GVariant *param, gpointer data)
    +
    void remmina_main_on_action_application_plugins(GSimpleAction *action, GVariant *param, gpointer data)

    Definition at line 96 of file remmina_main.c.

    @@ -2925,17 +2963,18 @@ Variables
    -Initial value:
    = {
    { "connect", remmina_main_on_action_connection_connect, NULL, NULL, NULL },
    { "copy", remmina_main_on_action_connection_copy, NULL, NULL, NULL },
    { "delete", remmina_main_on_action_connection_delete, NULL, NULL, NULL },
    { "edit", remmina_main_on_action_connection_edit, NULL, NULL, NULL },
    { "exttools", remmina_main_on_action_connection_external_tools, NULL, NULL, NULL },
    { "new", remmina_main_on_action_connection_new, NULL, NULL, NULL },
    { "export", remmina_main_on_action_tools_export, NULL, NULL, NULL },
    { "import", remmina_main_on_action_tools_import, NULL, NULL, NULL },
    { "expand", remmina_main_on_action_expand, NULL, NULL, NULL },
    { "collapse", remmina_main_on_action_collapse, NULL, NULL, NULL },
    { "search", remmina_main_on_action_search_toggle, NULL, NULL, NULL },
    }
    void remmina_main_on_action_connection_connect(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:767
    -
    void remmina_main_on_action_tools_import(GSimpleAction *action, GVariant *param, gpointer data)
    -
    void remmina_main_on_action_connection_copy(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:909
    -
    void remmina_main_on_action_collapse(GSimpleAction *action, GVariant *param, gpointer data)
    -
    void remmina_main_on_action_connection_new(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:850
    -
    void remmina_main_on_action_connection_delete(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:976
    -
    void remmina_main_on_action_connection_external_tools(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:795
    -
    void remmina_main_on_action_connection_edit(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:945
    -
    void remmina_main_on_action_expand(GSimpleAction *action, GVariant *param, gpointer data)
    -
    void remmina_main_on_action_search_toggle(GSimpleAction *action, GVariant *param, gpointer data)
    -
    void remmina_main_on_action_tools_export(GSimpleAction *action, GVariant *param, gpointer data)
    +Initial value:
    = {
    { "connect", remmina_main_on_action_connection_connect, NULL, NULL, NULL },
    { "copy", remmina_main_on_action_connection_copy, NULL, NULL, NULL },
    { "delete", remmina_main_on_action_connection_delete, NULL, NULL, NULL },
    { "delete_multiple", remmina_main_on_action_connection_delete_multiple, NULL, NULL, NULL },
    { "edit", remmina_main_on_action_connection_edit, NULL, NULL, NULL },
    { "exttools", remmina_main_on_action_connection_external_tools, NULL, NULL, NULL },
    { "new", remmina_main_on_action_connection_new, NULL, NULL, NULL },
    { "export", remmina_main_on_action_tools_export, NULL, NULL, NULL },
    { "import", remmina_main_on_action_tools_import, NULL, NULL, NULL },
    { "expand", remmina_main_on_action_expand, NULL, NULL, NULL },
    { "collapse", remmina_main_on_action_collapse, NULL, NULL, NULL },
    { "search", remmina_main_on_action_search_toggle, NULL, NULL, NULL },
    }
    void remmina_main_on_action_connection_connect(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:768
    +
    void remmina_main_on_action_tools_import(GSimpleAction *action, GVariant *param, gpointer data)
    +
    void remmina_main_on_action_connection_delete_multiple(GSimpleAction *action, GVariant *param, gpointer data)
    +
    void remmina_main_on_action_connection_copy(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:910
    +
    void remmina_main_on_action_collapse(GSimpleAction *action, GVariant *param, gpointer data)
    +
    void remmina_main_on_action_connection_new(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:851
    +
    void remmina_main_on_action_connection_delete(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:977
    +
    void remmina_main_on_action_connection_external_tools(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:796
    +
    void remmina_main_on_action_connection_edit(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:946
    +
    void remmina_main_on_action_expand(GSimpleAction *action, GVariant *param, gpointer data)
    +
    void remmina_main_on_action_search_toggle(GSimpleAction *action, GVariant *param, gpointer data)
    +
    void remmina_main_on_action_tools_export(GSimpleAction *action, GVariant *param, gpointer data)

    Definition at line 111 of file remmina_main.c.

    @@ -2961,7 +3000,7 @@ Variables
    Initial value:
    =
    {
    "RDP", "VNC", "SSH", "NX", "SPICE", "X2GO"
    }
    -

    Definition at line 130 of file remmina_main.c.

    +

    Definition at line 131 of file remmina_main.c.

    @@ -2985,7 +3024,7 @@ Variables
    Initial value:
    =
    {
    { "text/uri-list", 0, 1 }
    }
    -

    Definition at line 125 of file remmina_main.c.

    +

    Definition at line 126 of file remmina_main.c.

    diff --git a/public/remmina__main_8c.js b/public/remmina__main_8c.js index 6baf00f3f..51814edf0 100644 --- a/public/remmina__main_8c.js +++ b/public/remmina__main_8c.js @@ -49,6 +49,7 @@ var remmina__main_8c = [ "remmina_main_on_action_connection_connect", "remmina__main_8c.html#a6b30ed832369f3a7153aa63f98873c9d", null ], [ "remmina_main_on_action_connection_copy", "remmina__main_8c.html#a44eb44c6391f53a19c6f1fdf9a39a8c1", null ], [ "remmina_main_on_action_connection_delete", "remmina__main_8c.html#a10e574723222f5df9db456977e62a093", null ], + [ "remmina_main_on_action_connection_delete_multiple", "remmina__main_8c.html#af56bada711b2fc9c50af83b8b62dfe8b", null ], [ "remmina_main_on_action_connection_edit", "remmina__main_8c.html#adfbfc580d25b58d09770a7d33ffe03cc", null ], [ "remmina_main_on_action_connection_external_tools", "remmina__main_8c.html#abcf8bd8ca57b389264ff9739a61efdc1", null ], [ "remmina_main_on_action_connection_new", "remmina__main_8c.html#a52cc21537ff003b9d0fbdb9040c811af", null ], diff --git a/public/remmina__main_8c_source.html b/public/remmina__main_8c_source.html index 096d940b9..56548d7b0 100644 --- a/public/remmina__main_8c_source.html +++ b/public/remmina__main_8c_source.html @@ -86,7 +86,7 @@ $(document).ready(function(){initNavTree('remmina__main_8c_source.html','');});
    remmina_main.c
    -Go to the documentation of this file.
    1 /*
    2  * Remmina - The GTK+ Remote Desktop Client
    3  * Copyright (C) 2009-2011 Vic Lee
    4  * Copyright (C) 2014-2015 Antenore Gatta, Fabio Castelli, Giovanni Panozzo
    5  * Copyright (C) 2016-2022 Antenore Gatta, Giovanni Panozzo
    6  * Copyright (C) 2022-2023 Antenore Gatta, Giovanni Panozzo, Hiroyuki Tanaka
    7  *
    8  * This program is free software; you can redistribute it and/or modify
    9  * it under the terms of the GNU General Public License as published by
    10  * the Free Software Foundation; either version 2 of the License, or
    11  * (at your option) any later version.
    12  *
    13  * This program is distributed in the hope that it will be useful,
    14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    16  * GNU General Public License for more details.
    17  *
    18  * You should have received a copy of the GNU General Public License
    19  * along with this program; if not, write to the Free Software
    20  * Foundation, Inc., 51 Franklin Street, Fifth Floor,
    21  * Boston, MA 02110-1301, USA.
    22  *
    23  * In addition, as a special exception, the copyright holders give
    24  * permission to link the code of portions of this program with the
    25  * OpenSSL library under certain conditions as described in each
    26  * individual source file, and distribute linked combinations
    27  * including the two.
    28  * You must obey the GNU General Public License in all respects
    29  * for all of the code used other than OpenSSL. * If you modify
    30  * file(s) with this exception, you may extend this exception to your
    31  * version of the file(s), but you are not obligated to do so. * If you
    32  * do not wish to do so, delete this exception statement from your
    33  * version. * If you delete this exception statement from all source
    34  * files in the program, then also delete it here.
    35  *
    36  */
    37 
    38 #include "config.h"
    39 #include <ctype.h>
    40 #include <gio/gio.h>
    41 #ifndef __APPLE__
    42 #include <gio/gdesktopappinfo.h>
    43 #endif
    44 #include <gdk/gdkkeysyms.h>
    45 #include <glib/gi18n.h>
    46 #include <gtk/gtk.h>
    47 
    48 #include "remmina.h"
    49 #include "remmina_string_array.h"
    50 #include "remmina_public.h"
    51 #include "remmina_file.h"
    52 #include "remmina_file_manager.h"
    53 #include "remmina_file_editor.h"
    54 #include "rcw.h"
    55 #include "remmina_about.h"
    56 #include "remmina_pref.h"
    57 #include "remmina_pref_dialog.h"
    58 #include "remmina_widget_pool.h"
    59 #include "remmina_plugin_manager.h"
    60 #include "remmina_log.h"
    61 #include "remmina_icon.h"
    62 #include "remmina_main.h"
    63 #include "remmina_exec.h"
    64 #include "remmina_mpchange.h"
    65 #include "remmina_external_tools.h"
    66 #include "remmina_unlock.h"
    68 
    70 
    71 #define RM_GET_OBJECT(object_name) gtk_builder_get_object(remminamain->builder, object_name)
    72 
    73 enum {
    84 };
    85 
    86 static
    87 const gchar *supported_mime_types[] = {
    88  "x-scheme-handler/rdp",
    89  "x-scheme-handler/spice",
    90  "x-scheme-handler/vnc",
    91  "x-scheme-handler/remmina",
    92  "application/x-remmina",
    93  NULL
    94 };
    95 
    96 static GActionEntry app_actions[] = {
    97  { "about", remmina_main_on_action_application_about, NULL, NULL, NULL },
    98  { "default", remmina_main_on_action_application_default, NULL, NULL, NULL },
    99  { "mpchange", remmina_main_on_action_application_mpchange, NULL, NULL, NULL },
    100  { "plugins", remmina_main_on_action_application_plugins, NULL, NULL, NULL },
    101  { "preferences", remmina_main_on_action_application_preferences, "i", NULL, NULL },
    102  { "dark", remmina_main_on_action_application_dark_theme, NULL, NULL, NULL },
    103  { "debug", remmina_main_on_action_help_debug, NULL, NULL, NULL },
    104  { "community", remmina_main_on_action_help_community, NULL, NULL, NULL },
    105  { "donations", remmina_main_on_action_help_donations, NULL, NULL, NULL },
    106  { "homepage", remmina_main_on_action_help_homepage, NULL, NULL, NULL },
    107  { "wiki", remmina_main_on_action_help_wiki, NULL, NULL, NULL },
    108  { "quit", remmina_main_on_action_application_quit, NULL, NULL, NULL },
    109 };
    110 
    111 static GActionEntry main_actions[] = {
    112  { "connect", remmina_main_on_action_connection_connect, NULL, NULL, NULL },
    113  { "copy", remmina_main_on_action_connection_copy, NULL, NULL, NULL },
    114  { "delete", remmina_main_on_action_connection_delete, NULL, NULL, NULL },
    115  { "edit", remmina_main_on_action_connection_edit, NULL, NULL, NULL },
    116  { "exttools", remmina_main_on_action_connection_external_tools, NULL, NULL, NULL },
    117  { "new", remmina_main_on_action_connection_new, NULL, NULL, NULL },
    118  { "export", remmina_main_on_action_tools_export, NULL, NULL, NULL },
    119  { "import", remmina_main_on_action_tools_import, NULL, NULL, NULL },
    120  { "expand", remmina_main_on_action_expand, NULL, NULL, NULL },
    121  { "collapse", remmina_main_on_action_collapse, NULL, NULL, NULL },
    122  { "search", remmina_main_on_action_search_toggle, NULL, NULL, NULL },
    123 };
    124 
    125 static GtkTargetEntry remmina_drop_types[] =
    126 {
    127  { "text/uri-list", 0, 1 }
    128 };
    129 
    131 {
    132  "RDP", "VNC", "SSH", "NX", "SPICE", "X2GO"
    133 };
    134 
    138 static void remmina_main_save_size(void)
    139 {
    140  TRACE_CALL(__func__);
    141  if ((gdk_window_get_state(gtk_widget_get_window(GTK_WIDGET(remminamain->window))) & GDK_WINDOW_STATE_MAXIMIZED) == 0) {
    142  gtk_window_get_size(remminamain->window, &remmina_pref.main_width, &remmina_pref.main_height);
    143  remmina_pref.main_maximize = FALSE;
    144  } else {
    146  }
    147 }
    148 
    149 static void remmina_main_save_expanded_group_func(GtkTreeView *tree_view, GtkTreePath *path, gpointer user_data)
    150 {
    151  TRACE_CALL(__func__);
    152  GtkTreeIter iter;
    153  gchar *group;
    154 
    155  gtk_tree_model_get_iter(remminamain->priv->file_model_sort, &iter, path);
    156  gtk_tree_model_get(remminamain->priv->file_model_sort, &iter, GROUP_COLUMN, &group, -1);
    157  if (group) {
    158  remmina_string_array_add(remminamain->priv->expanded_group, group);
    159  g_free(group);
    160  }
    161 }
    162 
    164 {
    165  TRACE_CALL(__func__);
    166  if (GTK_IS_TREE_STORE(remminamain->priv->file_model)) {
    167  if (remminamain->priv->expanded_group)
    169  remminamain->priv->expanded_group = remmina_string_array_new();
    170  gtk_tree_view_map_expanded_rows(remminamain->tree_files_list,
    171  (GtkTreeViewMappingFunc)remmina_main_save_expanded_group_func, NULL);
    172  }
    173 }
    174 
    180 {
    181  TRACE_CALL(__func__);
    182  if (!remminamain || !remminamain->window)
    183  return;
    184 
    190 }
    191 
    193 {
    194  TRACE_CALL(__func__);
    195 
    196  if (remminamain) {
    197  if (remminamain->window)
    198  gtk_widget_destroy(GTK_WIDGET(remminamain->window));
    199 
    200  g_object_unref(remminamain->builder);
    202  remminamain->priv->expanded_group = NULL;
    203  if (remminamain->priv->file_model)
    204  g_object_unref(G_OBJECT(remminamain->priv->file_model));
    205  g_object_unref(G_OBJECT(remminamain->priv->file_model_filter));
    206  g_free(remminamain->priv->selected_filename);
    207  g_free(remminamain->priv->selected_name);
    208  g_free(remminamain->priv);
    209  g_free(remminamain);
    210  remminamain = NULL;
    211  }
    212 }
    213 
    217 static gboolean remmina_main_dexit(gpointer data)
    218 {
    219  TRACE_CALL(__func__);
    221  return FALSE;
    222 }
    223 
    224 gboolean remmina_main_on_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
    225 {
    226  TRACE_CALL(__func__);
    228 
    229  g_idle_add(remmina_main_dexit, NULL);
    230 
    231  return FALSE;
    232 }
    233 
    234 gboolean remmina_main_idle_destroy(gpointer data)
    235 {
    236  TRACE_CALL(__func__);
    237 
    238  if (remminamain)
    240 
    241  return G_SOURCE_REMOVE;
    242 }
    243 
    248 {
    249  TRACE_CALL(__func__);
    250 
    251  if (remminamain) {
    252  /* Invalidate remminamain->window to avoid multiple destructions */
    253  remminamain->window = NULL;
    254  /* Destroy remminamain struct, later. We can't destroy
    255  * important objects like the builder now */
    256  g_idle_add(remmina_main_idle_destroy, NULL);
    257  }
    258 }
    259 
    261 {
    262  TRACE_CALL(__func__);
    263  g_free(remminamain->priv->selected_filename);
    264  g_free(remminamain->priv->selected_name);
    265  remminamain->priv->selected_filename = NULL;
    266  remminamain->priv->selected_name = NULL;
    267 }
    268 
    269 #ifdef SNAP_BUILD
    270 
    272 {
    273  GtkBuilder *dlgbuilder = NULL;
    274  GtkWidget *dlg;
    275  GtkWindow *parent;
    276  int result;
    277  static gboolean shown_once = FALSE;
    278  gboolean need_snap_interface_connections = FALSE;
    279  GtkWidget *dsa;
    281 
    282  if (shown_once)
    283  return;
    284  else
    285  shown_once = TRUE;
    286 
    287  g_print("Remmina is compiled as a SNAP package.\n");
    288  remmina_secret_plugin = remmina_plugin_manager_get_secret_plugin();
    289  if (remmina_secret_plugin == NULL) {
    290  g_print(" but we can’t find the secret plugin inside the SNAP.\n");
    291  need_snap_interface_connections = TRUE;
    292  } else {
    293  if (!remmina_secret_plugin->is_service_available(remmina_secret_plugin)) {
    294  g_print(" but we can’t access a secret service. Secret service or SNAP interface connection is missing.\n");
    295  need_snap_interface_connections = TRUE;
    296  }
    297  }
    298 
    299  if (need_snap_interface_connections && !remmina_pref.prevent_snap_welcome_message) {
    300  dlgbuilder = remmina_public_gtk_builder_new_from_resource("/org/remmina/Remmina/src/../data/ui/remmina_snap_info_dialog.glade");
    301  dsa = GTK_WIDGET(gtk_builder_get_object(dlgbuilder, "dontshowagain"));
    302  if (dlgbuilder) {
    303  parent = remmina_main_get_window();
    304  dlg = GTK_WIDGET(gtk_builder_get_object(dlgbuilder, "SnapInfoDlg"));
    305  if (parent)
    306  gtk_window_set_transient_for(GTK_WINDOW(dlg), parent);
    307  gtk_builder_connect_signals(dlgbuilder, NULL);
    308  result = gtk_dialog_run(GTK_DIALOG(dlg));
    309  if (result == 1) {
    310  remmina_pref.prevent_snap_welcome_message = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dsa));
    312  }
    313  gtk_widget_destroy(dlg);
    314  g_object_unref(dlgbuilder);
    315  }
    316  }
    317 }
    318 #endif
    319 
    320 
    321 static gboolean remmina_main_selection_func(GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path,
    322  gboolean path_currently_selected, gpointer user_data)
    323 {
    324  TRACE_CALL(__func__);
    325  guint context_id;
    326  GtkTreeIter iter;
    327  gchar buf[1000];
    328 
    329  if (path_currently_selected)
    330  return TRUE;
    331 
    332  if (!gtk_tree_model_get_iter(model, &iter, path))
    333  return TRUE;
    334 
    336 
    337  gtk_tree_model_get(model, &iter,
    338  NAME_COLUMN, &remminamain->priv->selected_name,
    339  FILENAME_COLUMN, &remminamain->priv->selected_filename,
    340  -1);
    341 
    342  context_id = gtk_statusbar_get_context_id(remminamain->statusbar_main, "status");
    343  gtk_statusbar_pop(remminamain->statusbar_main, context_id);
    344  if (remminamain->priv->selected_filename) {
    345  g_snprintf(buf, sizeof(buf), "%s (%s)", remminamain->priv->selected_name, remminamain->priv->selected_filename);
    346  gtk_statusbar_push(remminamain->statusbar_main, context_id, buf);
    347  } else {
    348  gtk_statusbar_push(remminamain->statusbar_main, context_id, remminamain->priv->selected_name);
    349  }
    350 
    351  return TRUE;
    352 }
    353 
    354 static void remmina_main_load_file_list_callback(RemminaFile *remminafile, gpointer user_data)
    355 {
    356  TRACE_CALL(__func__);
    357  GtkTreeIter iter;
    358  GtkListStore *store;
    359 
    360  store = GTK_LIST_STORE(user_data);
    361  gchar *datetime;
    362 
    363  datetime = remmina_file_get_datetime(remminafile);
    364  gtk_list_store_append(store, &iter);
    365  gtk_list_store_set(store, &iter,
    367  NAME_COLUMN, remmina_file_get_string(remminafile, "name"),
    368  NOTES_COLUMN, g_uri_unescape_string(remmina_file_get_string(remminafile, "notes_text"), NULL),
    369  GROUP_COLUMN, remmina_file_get_string(remminafile, "group"),
    370  SERVER_COLUMN, remmina_file_get_string(remminafile, "server"),
    371  PLUGIN_COLUMN, remmina_file_get_string(remminafile, "protocol"),
    372  DATE_COLUMN, datetime,
    374  LABELS_COLUMN, remmina_file_get_string(remminafile, "labels"),
    375  -1);
    376  g_free(datetime);
    377 }
    378 
    379 static gboolean remmina_main_load_file_tree_traverse(GNode *node, GtkTreeStore *store, GtkTreeIter *parent)
    380 {
    381  TRACE_CALL(__func__);
    382  GtkTreeIter *iter;
    383  RemminaGroupData *data;
    384  GNode *child;
    385 
    386  iter = NULL;
    387  if (node->data) {
    388  data = (RemminaGroupData *)node->data;
    389  iter = g_new0(GtkTreeIter, 1);
    390  gtk_tree_store_append(store, iter, parent);
    391  gtk_tree_store_set(store, iter,
    392  PROTOCOL_COLUMN, "folder-symbolic",
    393  NAME_COLUMN, data->name,
    394  GROUP_COLUMN, data->group,
    395  DATE_COLUMN, data->datetime,
    396  FILENAME_COLUMN, NULL,
    397  LABELS_COLUMN, data->labels,
    398  -1);
    399  }
    400  for (child = g_node_first_child(node); child; child = g_node_next_sibling(child))
    401  remmina_main_load_file_tree_traverse(child, store, iter);
    402  g_free(iter);
    403  return FALSE;
    404 }
    405 
    406 static void remmina_main_load_file_tree_group(GtkTreeStore *store)
    407 {
    408  TRACE_CALL(__func__);
    409  GNode *root;
    410 
    412  remmina_main_load_file_tree_traverse(root, store, NULL);
    414 }
    415 
    416 static void remmina_main_expand_group_traverse(GtkTreeIter *iter)
    417 {
    418  TRACE_CALL(__func__);
    419  GtkTreeModel *tree;
    420  gboolean ret;
    421  gchar *group, *filename;
    422  GtkTreeIter child;
    423  GtkTreePath *path;
    424 
    425  tree = remminamain->priv->file_model_sort;
    426  ret = TRUE;
    427  while (ret) {
    428  gtk_tree_model_get(tree, iter, GROUP_COLUMN, &group, FILENAME_COLUMN, &filename, -1);
    429  if (filename == NULL) {
    430  if (remmina_string_array_find(remminamain->priv->expanded_group, group) >= 0) {
    431  path = gtk_tree_model_get_path(tree, iter);
    432  gtk_tree_view_expand_row(remminamain->tree_files_list, path, FALSE);
    433  gtk_tree_path_free(path);
    434  }
    435  if (gtk_tree_model_iter_children(tree, &child, iter))
    437  }
    438  g_free(group);
    439  g_free(filename);
    440 
    441  ret = gtk_tree_model_iter_next(tree, iter);
    442  }
    443 }
    444 
    445 static void remmina_main_expand_group(void)
    446 {
    447  TRACE_CALL(__func__);
    448  GtkTreeIter iter;
    449 
    450  if (gtk_tree_model_get_iter_first(remminamain->priv->file_model_sort, &iter))
    452 }
    453 
    454 static gboolean remmina_main_load_file_tree_find(GtkTreeModel *tree, GtkTreeIter *iter, const gchar *match_group)
    455 {
    456  TRACE_CALL(__func__);
    457  gboolean ret, match;
    458  gchar *group, *filename;
    459  GtkTreeIter child;
    460 
    461  match = FALSE;
    462  ret = TRUE;
    463  while (ret) {
    464  gtk_tree_model_get(tree, iter, GROUP_COLUMN, &group, FILENAME_COLUMN, &filename, -1);
    465  match = (filename == NULL && g_strcmp0(group, match_group) == 0);
    466  g_free(group);
    467  g_free(filename);
    468  if (match)
    469  break;
    470  if (gtk_tree_model_iter_children(tree, &child, iter)) {
    471  match = remmina_main_load_file_tree_find(tree, &child, match_group);
    472  if (match) {
    473  memcpy(iter, &child, sizeof(GtkTreeIter));
    474  break;
    475  }
    476  }
    477  ret = gtk_tree_model_iter_next(tree, iter);
    478  }
    479  return match;
    480 }
    481 
    482 static void remmina_main_load_file_tree_callback(RemminaFile *remminafile, gpointer user_data)
    483 {
    484  TRACE_CALL(__func__);
    485  GtkTreeIter iter, child;
    486  GtkTreeStore *store;
    487  gboolean found;
    488  gchar *datetime = NULL;
    489 
    490  store = GTK_TREE_STORE(user_data);
    491 
    492  found = FALSE;
    493  if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter))
    494  found = remmina_main_load_file_tree_find(GTK_TREE_MODEL(store), &iter,
    495  remmina_file_get_string(remminafile, "group"));
    496 
    497  datetime = remmina_file_get_datetime(remminafile);
    498  //REMMINA_DEBUG("The date is %s", datetime);
    499  gtk_tree_store_append(store, &child, (found ? &iter : NULL));
    500  gtk_tree_store_set(store, &child,
    502  NAME_COLUMN, remmina_file_get_string(remminafile, "name"),
    503  NOTES_COLUMN, g_uri_unescape_string(remmina_file_get_string(remminafile, "notes_text"), NULL),
    504  GROUP_COLUMN, remmina_file_get_string(remminafile, "group"),
    505  SERVER_COLUMN, remmina_file_get_string(remminafile, "server"),
    506  PLUGIN_COLUMN, remmina_file_get_string(remminafile, "protocol"),
    507  DATE_COLUMN, datetime,
    509  LABELS_COLUMN, remmina_file_get_string(remminafile, "labels"),
    510  -1);
    511  g_free(datetime);
    512 }
    513 
    514 static void remmina_main_file_model_on_sort(GtkTreeSortable *sortable, gpointer user_data)
    515 {
    516  TRACE_CALL(__func__);
    517  gint columnid;
    518  GtkSortType order;
    519 
    520  gtk_tree_sortable_get_sort_column_id(sortable, &columnid, &order);
    524 }
    525 
    526 static gboolean remmina_main_filter_visible_func(GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
    527 {
    528  TRACE_CALL(__func__);
    529  gchar *text;
    530  gchar *protocol, *name, *labels, *group, *server, *plugin, *date, *s;
    531  gboolean result = TRUE;
    532 
    533  text = g_ascii_strdown(gtk_entry_get_text(remminamain->entry_quick_connect_server), -1);
    534  if (text && text[0]) {
    535  gtk_tree_model_get(model, iter,
    536  PROTOCOL_COLUMN, &protocol,
    537  NAME_COLUMN, &name,
    538  GROUP_COLUMN, &group,
    539  SERVER_COLUMN, &server,
    540  PLUGIN_COLUMN, &plugin,
    541  DATE_COLUMN, &date,
    542  LABELS_COLUMN, &labels,
    543  -1);
    544  if (g_strcmp0(protocol, "folder-symbolic") != 0) {
    545  s = g_ascii_strdown(name ? name : "", -1);
    546  g_free(name);
    547  name = s;
    548  s = g_ascii_strdown(group ? group : "", -1);
    549  g_free(group);
    550  group = s;
    551  s = g_ascii_strdown(server ? server : "", -1);
    552  g_free(server);
    553  server = s;
    554  s = g_ascii_strdown(plugin ? plugin : "", -1);
    555  g_free(plugin);
    556  plugin = s;
    557  s = g_ascii_strdown(date ? date : "", -1);
    558  g_free(date);
    559  date = s;
    560  result = (strstr(name, text) || strstr(group, text) || strstr(server, text) || strstr(plugin, text) || strstr(date, text));
    561 
    562  // Filter by labels
    563 
    564  s = g_ascii_strdown(labels ? labels : "", -1);
    565  g_free(labels);
    566  labels = s;
    567 
    568  if (strlen(labels) > 0) {
    569  gboolean labels_result = TRUE;
    570  gchar **labels_array = g_strsplit(labels, ",", -1);
    571  gchar **text_array = g_strsplit(text, ",", -1);
    572 
    573  for (int t = 0; (NULL != text_array[t]); t++) {
    574  if (0 == strlen(text_array[t])) {
    575  continue;
    576  }
    577 
    578  gboolean text_result = FALSE;
    579 
    580  for (int l = 0; (NULL != labels_array[l]); l++) {
    581  if (0 == strlen(labels_array[l])) {
    582  continue;
    583  }
    584 
    585  text_result = (text_result || strstr(labels_array[l], text_array[t]));
    586 
    587  if (text_result) {
    588  break;
    589  }
    590  }
    591 
    592  labels_result = (labels_result && text_result);
    593 
    594  if (!labels_result) {
    595  break;
    596  }
    597  }
    598 
    599  result = (result || labels_result);
    600 
    601  g_strfreev(labels_array);
    602  g_strfreev(text_array);
    603  }
    604  }
    605  g_free(protocol);
    606  g_free(name);
    607  g_free(labels);
    608  g_free(group);
    609  g_free(server);
    610  g_free(plugin);
    611  g_free(date);
    612  }
    613  g_free(text);
    614  return result;
    615 }
    616 
    617 static void remmina_main_select_file(const gchar *filename)
    618 {
    619  TRACE_CALL(__func__);
    620  GtkTreeIter iter;
    621  GtkTreePath *path;
    622  gchar *item_filename;
    623  gboolean cmp;
    624 
    625  if (!gtk_tree_model_get_iter_first(remminamain->priv->file_model_sort, &iter))
    626  return;
    627 
    628  while (TRUE) {
    629  gtk_tree_model_get(remminamain->priv->file_model_sort, &iter, FILENAME_COLUMN, &item_filename, -1);
    630  cmp = g_strcmp0(item_filename, filename);
    631  g_free(item_filename);
    632  if (cmp == 0) {
    633  gtk_tree_selection_select_iter(gtk_tree_view_get_selection(remminamain->tree_files_list),
    634  &iter);
    635  path = gtk_tree_model_get_path(remminamain->priv->file_model_sort, &iter);
    636  gtk_tree_view_scroll_to_cell(remminamain->tree_files_list, path, NULL, TRUE, 0.5, 0.0);
    637  gtk_tree_path_free(path);
    638  return;
    639  }
    640  if (!gtk_tree_model_iter_next(remminamain->priv->file_model_sort, &iter))
    641  return;
    642  }
    643 }
    644 
    646 {
    647  TRACE_CALL(__func__);
    648  gint items_count;
    649  gchar buf[200];
    650  guint context_id;
    651  gint view_file_mode;
    652  gboolean always_show_notes;
    653  char *save_selected_filename;
    654  GtkTreeModel *newmodel;
    655  const gchar *neticon;
    656  const gchar *connection_tooltip;
    657 
    658  save_selected_filename = g_strdup(remminamain->priv->selected_filename);
    660 
    661  view_file_mode = remmina_pref.view_file_mode;
    662  if (remminamain->priv->override_view_file_mode_to_list)
    663  view_file_mode = REMMINA_VIEW_FILE_LIST;
    664 
    665  switch (remmina_pref.view_file_mode) {
    667  gtk_toggle_button_set_active(remminamain->view_toggle_button, FALSE);
    668  break;
    670  default:
    671  gtk_toggle_button_set_active(remminamain->view_toggle_button, TRUE);
    672  break;
    673  }
    674 
    675  switch (view_file_mode) {
    677  /* Create new GtkTreeStore model */
    678  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));
    679  /* Hide the Group column in the tree view mode */
    680  gtk_tree_view_column_set_visible(remminamain->column_files_list_group, FALSE);
    681  /* Load groups first */
    682  remmina_main_load_file_tree_group(GTK_TREE_STORE(newmodel));
    683  /* Load files list */
    684  items_count = remmina_file_manager_iterate((GFunc)remmina_main_load_file_tree_callback, (gpointer)newmodel);
    685  break;
    686 
    688  default:
    689  /* Create new GtkListStore model */
    690  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));
    691  /* Show the Group column in the list view mode */
    692  gtk_tree_view_column_set_visible(remminamain->column_files_list_group, TRUE);
    693  /* Load files list */
    694  items_count = remmina_file_manager_iterate((GFunc)remmina_main_load_file_list_callback, (gpointer)newmodel);
    695  break;
    696  }
    697 
    698  /* Set note column visibility*/
    699  always_show_notes = remmina_pref.always_show_notes;
    700  if (!always_show_notes){
    701  gtk_tree_view_column_set_visible(remminamain->column_files_list_notes, FALSE);
    702  }
    703 
    704  /* Unset old model */
    705  gtk_tree_view_set_model(remminamain->tree_files_list, NULL);
    706 
    707  /* Destroy the old model and save the new one */
    708  remminamain->priv->file_model = newmodel;
    709 
    710  /* Create a sorted filtered model based on newmodel and apply it to the TreeView */
    711  remminamain->priv->file_model_filter = gtk_tree_model_filter_new(remminamain->priv->file_model, NULL);
    712  gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(remminamain->priv->file_model_filter),
    713  (GtkTreeModelFilterVisibleFunc)remmina_main_filter_visible_func, NULL, NULL);
    714  remminamain->priv->file_model_sort = gtk_tree_model_sort_new_with_model(remminamain->priv->file_model_filter);
    715  gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(remminamain->priv->file_model_sort),
    718  gtk_tree_view_set_model(remminamain->tree_files_list, remminamain->priv->file_model_sort);
    719  g_signal_connect(G_OBJECT(remminamain->priv->file_model_sort), "sort-column-changed",
    720  G_CALLBACK(remmina_main_file_model_on_sort), NULL);
    722  /* Select the file previously selected */
    723  if (save_selected_filename) {
    724  remmina_main_select_file(save_selected_filename);
    725  g_free(save_selected_filename);
    726  }
    727  gtk_tree_view_column_set_widget(remminamain->column_files_list_date, NULL);
    728 
    729  GtkWidget *label = gtk_tree_view_column_get_button(remminamain->column_files_list_date);
    730 
    731  gtk_widget_set_tooltip_text(GTK_WIDGET(label),
    732  _("The latest successful connection attempt, or a pre-computed date"));
    733  /* Show in the status bar the total number of connections found */
    734  g_snprintf(buf, sizeof(buf), ngettext("Total %i item.", "Total %i items.", items_count), items_count);
    735  context_id = gtk_statusbar_get_context_id(remminamain->statusbar_main, "status");
    736  gtk_statusbar_pop(remminamain->statusbar_main, context_id);
    737  gtk_statusbar_push(remminamain->statusbar_main, context_id, buf);
    738 
    740  if (remminamain->monitor->connected){
    741  neticon = g_strdup("network-transmit-receive-symbolic");
    742  connection_tooltip = g_strdup(_("Network status: fully online"));
    743  } else {
    744  neticon = g_strdup("network-offline-symbolic");
    745  connection_tooltip = g_strdup(_("Network status: offline"));
    746  }
    747 
    748  if (GTK_IS_WIDGET(remminamain->network_icon))
    749  gtk_widget_destroy(remminamain->network_icon);
    750  GIcon *icon = g_themed_icon_new (neticon);
    751  remminamain->network_icon = gtk_image_new_from_gicon (icon, GTK_ICON_SIZE_BUTTON);
    752  gtk_widget_set_tooltip_text (remminamain->network_icon, connection_tooltip);
    753 
    754  g_object_unref (icon);
    755 
    756  gtk_box_pack_start (GTK_BOX(remminamain->statusbar_main), remminamain->network_icon, FALSE, FALSE, 0);
    757  gtk_widget_show (remminamain->network_icon);
    758 
    759 }
    760 
    761 void remmina_main_load_files_cb(GtkEntry *entry, char *string, gpointer user_data)
    762 {
    763  TRACE_CALL(__func__);
    765 }
    766 
    767 void remmina_main_on_action_connection_connect(GSimpleAction *action, GVariant *param, gpointer data)
    768 {
    769  TRACE_CALL(__func__);
    770 
    771  RemminaFile *remminafile;
    772 
    773  if (!remminamain->priv->selected_filename)
    774  return;
    775 
    776  remminafile = remmina_file_load(remminamain->priv->selected_filename);
    777 
    778  if (remminafile == NULL)
    779  return;
    780 
    781  if (remmina_pref_get_boolean("use_primary_password")
    782  && remmina_pref_get_boolean("lock_connect")
    783  && remmina_unlock_new(remminamain->window) == 0)
    784  return;
    785  if (remmina_file_get_int (remminafile, "profile-lock", FALSE) == 1
    786  && remmina_unlock_new(remminamain->window) == 0)
    787  return;
    788 
    789  remmina_file_touch(remminafile);
    791 
    792  remmina_file_free(remminafile);
    793 }
    794 
    795 void remmina_main_on_action_connection_external_tools(GSimpleAction *action, GVariant *param, gpointer data)
    796 {
    797  TRACE_CALL(__func__);
    798  if (!remminamain->priv->selected_filename)
    799  return;
    800 
    801  remmina_external_tools_from_filename(remminamain, remminamain->priv->selected_filename);
    802 }
    803 
    804 static void remmina_main_file_editor_destroy(GtkWidget *widget, gpointer user_data)
    805 {
    806  TRACE_CALL(__func__);
    807 
    808  if (!remminamain)
    809  return;
    811 }
    812 
    813 void remmina_main_on_action_application_mpchange(GSimpleAction *action, GVariant *param, gpointer data)
    814 {
    815  TRACE_CALL(__func__);
    816  RemminaFile *remminafile;
    817 
    818  const gchar *username;
    819  const gchar *domain;
    820  const gchar *group;
    821  const gchar *gatewayusername;
    822  const gchar *gatewaydomain;
    823 
    824  username = domain = group = gatewayusername = gatewaydomain = "";
    825 
    826  remminafile = NULL;
    827 
    828  if (remmina_pref_get_boolean("use_primary_password")
    829  && remmina_pref_get_boolean("lock_edit")
    830  && remmina_unlock_new(remminamain->window) == 0)
    831  return;
    832 
    833  if (remminamain->priv->selected_filename) {
    834  remminafile = remmina_file_load(remminamain->priv->selected_filename);
    835  if (remminafile != NULL) {
    836  username = remmina_file_get_string(remminafile, "username");
    837  domain = remmina_file_get_string(remminafile, "domain");
    838  group = remmina_file_get_string(remminafile, "group");
    839  gatewayusername = remmina_file_get_string(remminafile, "gateway_username");
    840  gatewaydomain = remmina_file_get_string(remminafile, "gateway_domain");
    841  }
    842  }
    843 
    844  remmina_mpchange_schedule(TRUE, group, domain, username, "", gatewayusername, gatewaydomain, "");
    845 
    846  if (remminafile != NULL)
    847  remmina_file_free(remminafile);
    848 }
    849 
    850 void remmina_main_on_action_connection_new(GSimpleAction *action, GVariant *param, gpointer data)
    851 {
    852  TRACE_CALL(__func__);
    853  if (kioskmode && kioskmode == TRUE)
    854  return;
    855  GtkWidget *widget;
    856 
    857  if (remmina_pref_get_boolean("use_primary_password")
    858  && remmina_pref_get_boolean("lock_edit")
    859  && remmina_unlock_new(remminamain->window) == 0)
    860  return;
    861 
    862  widget = remmina_file_editor_new();
    863  g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(remmina_main_file_editor_destroy), remminamain);
    864  gtk_window_set_transient_for(GTK_WINDOW(widget), remminamain->window);
    865  gtk_widget_show(widget);
    867 }
    868 
    869 static gboolean remmina_main_search_key_event(GtkWidget *search_entry, GdkEventKey *event, gpointer user_data)
    870 {
    871  TRACE_CALL(__func__);
    872  if (event->keyval == GDK_KEY_Escape) {
    873  gtk_entry_set_text(remminamain->entry_quick_connect_server, "");
    874  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(RM_GET_OBJECT("search_toggle")), FALSE);
    875  return TRUE;
    876  }
    877  return FALSE;
    878 }
    879 
    880 static gboolean remmina_main_tree_row_activated(GtkTreeView *tree, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
    881 {
    882  TRACE_CALL(__func__);
    883  if (gtk_tree_view_row_expanded(tree, path))
    884  gtk_tree_view_collapse_row(tree, path);
    885  else
    886  gtk_tree_view_expand_row(tree, path, FALSE);
    887  return TRUE;
    888 }
    889 
    891 {
    892  if (gtk_toggle_button_get_active(remminamain->view_toggle_button)) {
    895  gtk_entry_set_text(remminamain->entry_quick_connect_server, "");
    898  }
    899  } else {
    902  gtk_entry_set_text(remminamain->entry_quick_connect_server, "");
    905  }
    906  }
    907 }
    908 
    909 void remmina_main_on_action_connection_copy(GSimpleAction *action, GVariant *param, gpointer data)
    910 {
    911  TRACE_CALL(__func__);
    912  GtkWidget *widget;
    913 
    914  if (remmina_pref_get_boolean("use_primary_password")
    915  && remmina_unlock_new(remminamain->window) == 0)
    916  return;
    917 
    918  if (!remminamain->priv->selected_filename)
    919  return;
    920 
    921  RemminaFile *remminafile = remmina_file_load(remminamain->priv->selected_filename);
    922 
    923  if (((remmina_pref_get_boolean("lock_edit")
    924  && remmina_pref_get_boolean("use_primary_password"))
    925  || remmina_file_get_int (remminafile, "profile-lock", FALSE))
    926  && remmina_unlock_new(remminamain->window) == 0)
    927  return;
    928 
    929  if (remminafile) {
    930  remmina_file_free(remminafile);
    931  remminafile = NULL;
    932  }
    933 
    934  widget = remmina_file_editor_new_copy(remminamain->priv->selected_filename);
    935  if (widget) {
    936  g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(remmina_main_file_editor_destroy), remminamain);
    937  gtk_window_set_transient_for(GTK_WINDOW(widget), remminamain->window);
    938  gtk_widget_show(widget);
    939  }
    940  /* Select the file previously selected */
    941  if (remminamain->priv->selected_filename)
    943 }
    944 
    945 void remmina_main_on_action_connection_edit(GSimpleAction *action, GVariant *param, gpointer data)
    946 {
    947  TRACE_CALL(__func__);
    948  GtkWidget *widget;
    949 
    950  if (!remminamain->priv->selected_filename)
    951  return;
    952 
    953  RemminaFile *remminafile = remmina_file_load(remminamain->priv->selected_filename);
    954 
    955  if (remmina_pref_get_boolean("use_primary_password")
    956  && (remmina_pref_get_boolean("lock_edit")
    957  || remmina_file_get_int (remminafile, "profile-lock", FALSE))
    958  && remmina_unlock_new(remminamain->window) == 0)
    959  return;
    960 
    961  if (remminafile) {
    962  remmina_file_free(remminafile);
    963  remminafile = NULL;
    964  }
    965 
    967  if (widget) {
    968  gtk_window_set_transient_for(GTK_WINDOW(widget), remminamain->window);
    969  gtk_widget_show(widget);
    970  }
    971 /* Select the file previously selected */
    972  if (remminamain->priv->selected_filename)
    974 }
    975 
    976 void remmina_main_on_action_connection_delete(GSimpleAction *action, GVariant *param, gpointer data)
    977 {
    978  TRACE_CALL(__func__);
    979  GtkWidget *dialog;
    980 
    981  if (!remminamain->priv->selected_filename)
    982  return;
    983 
    984  RemminaFile *remminafile = remmina_file_load(remminamain->priv->selected_filename);
    985 
    986  if (((remmina_pref_get_boolean("lock_edit")
    987  && remmina_pref_get_boolean("use_primary_password"))
    988  || remmina_file_get_int (remminafile, "profile-lock", FALSE))
    989  && remmina_unlock_new(remminamain->window) == 0)
    990  return;
    991 
    992  if (remminafile) {
    993  remmina_file_free(remminafile);
    994  remminafile = NULL;
    995  }
    996 
    997  dialog = gtk_message_dialog_new(remminamain->window, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,
    998  _("Are you sure you want to delete “%s”?"), remminamain->priv->selected_name);
    999  if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_YES) {
    1000  gchar *delfilename = g_strdup(remminamain->priv->selected_filename);
    1001  remmina_file_delete(delfilename);
    1002  g_free(delfilename), delfilename = NULL;
    1005  }
    1006  gtk_widget_destroy(dialog);
    1008 }
    1009 
    1010 void remmina_main_on_accel_application_preferences(GSimpleAction *action, GVariant *param, gpointer data)
    1011 {
    1012  TRACE_CALL(__func__);
    1013  GVariant *v = g_variant_new("i", 0);
    1014 
    1016 }
    1017 
    1019 {
    1020  GtkSettings *settings;
    1021  settings = gtk_settings_get_default();
    1022  g_object_set(settings, "gtk-application-prefer-dark-theme", remmina_pref.dark_theme, NULL);
    1023  remmina_main_on_action_search_toggle(NULL,NULL,NULL);
    1024  gtk_tree_view_column_set_visible(remminamain->column_files_list_notes, remmina_pref.always_show_notes);
    1025 }
    1026 
    1027 void remmina_main_on_action_application_preferences(GSimpleAction *action, GVariant *param, gpointer data)
    1028 {
    1029  TRACE_CALL(__func__);
    1030 
    1031  REMMINA_DEBUG("Opening the preferences");
    1032  gint32 tab_num;
    1033 
    1034  if (param) {
    1035  REMMINA_DEBUG("Parameter passed to preferences of type %s", g_variant_get_type_string(param));
    1036  tab_num = g_variant_get_int32(param);
    1037  REMMINA_DEBUG("We got a parameter for the preferences: %d", tab_num);
    1038  } else {
    1039  tab_num = 0;
    1040  }
    1041 
    1042  if (remmina_pref_get_boolean("use_primary_password")
    1043  && remmina_unlock_new(remminamain->window) == 0)
    1044  return;
    1045 
    1046  GtkWidget *widget = remmina_pref_dialog_new(tab_num, remminamain->window);
    1047 
    1048  gtk_widget_show_all(widget);
    1049  /* Reload to use new preferences */
    1051 }
    1052 
    1053 void remmina_main_on_action_application_default(GSimpleAction *action, GVariant *param, gpointer data)
    1054 {
    1055  TRACE_CALL(__func__);
    1056 #ifndef __APPLE__
    1057  g_autoptr(GError) error = NULL;
    1058  GDesktopAppInfo *desktop_info;
    1059  GAppInfo *info = NULL;
    1060  g_autofree gchar *id = g_strconcat(REMMINA_APP_ID, ".desktop", NULL);
    1061  int i;
    1062 
    1063  desktop_info = g_desktop_app_info_new(id);
    1064  if (!desktop_info)
    1065  return;
    1066 
    1067  info = G_APP_INFO(desktop_info);
    1068 
    1069  for (i = 0; supported_mime_types[i]; i++) {
    1070  if (!g_app_info_set_as_default_for_type(info, supported_mime_types[i], &error))
    1071  g_warning("Failed to set '%s' as the default application for secondary content type '%s': %s",
    1072  g_app_info_get_name(info), supported_mime_types[i], error->message);
    1073  else
    1074  g_debug("Set '%s' as the default application for '%s'",
    1075  g_app_info_get_name(info),
    1077  }
    1078 #endif
    1079 }
    1080 
    1081 void remmina_main_on_action_application_quit(GSimpleAction *action, GVariant *param, gpointer data)
    1082 {
    1083  // Called by quit signal in remmina_main.glade
    1084  TRACE_CALL(__func__);
    1085  g_debug("Quit intercept");
    1087 }
    1088 
    1090 {
    1093  gtk_entry_set_text(remminamain->entry_quick_connect_server, "");
    1096  }
    1097 }
    1098 
    1099 static void remmina_main_import_file_list(GSList *files)
    1100 {
    1101  TRACE_CALL(__func__);
    1102  GtkWidget *dlg;
    1103  GSList *element;
    1104  gchar *path;
    1105  RemminaFilePlugin *plugin;
    1106  GString *err;
    1107  RemminaFile *remminafile = NULL;
    1108  gboolean imported;
    1109 
    1110  err = g_string_new(NULL);
    1111  imported = FALSE;
    1112  for (element = files; element; element = element->next) {
    1113  path = (gchar *)element->data;
    1115  if (plugin && (remminafile = plugin->import_func(plugin, path)) != NULL && remmina_file_get_string(remminafile, "name")) {
    1116  remmina_file_generate_filename(remminafile);
    1117  remmina_file_save(remminafile);
    1118  imported = TRUE;
    1119  } else {
    1120  g_string_append(err, path);
    1121  g_string_append_c(err, '\n');
    1122  }
    1123  if (remminafile) {
    1124  remmina_file_free(remminafile);
    1125  remminafile = NULL;
    1126  }
    1127  g_free(path);
    1128  }
    1129  g_slist_free(files);
    1130  if (err->len > 0) {
    1131  // TRANSLATORS: The placeholder %s is an error message
    1132  dlg = gtk_message_dialog_new(remminamain->window, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
    1133  _("Unable to import:\n%s"), err->str);
    1134  g_signal_connect(G_OBJECT(dlg), "response", G_CALLBACK(gtk_widget_destroy), NULL);
    1135  gtk_widget_show(dlg);
    1136  }
    1137  g_string_free(err, TRUE);
    1138  if (imported)
    1140 }
    1141 
    1142 static void remmina_main_action_tools_import_on_response(GtkDialog *dialog, gint response_id, gpointer user_data)
    1143 {
    1144  TRACE_CALL(__func__);
    1145  GSList *files;
    1146 
    1147  if (response_id == GTK_RESPONSE_ACCEPT) {
    1148  files = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog));
    1150  }
    1151  gtk_widget_destroy(GTK_WIDGET(dialog));
    1152 }
    1153 
    1154 void remmina_main_on_action_tools_import(GSimpleAction *action, GVariant *param, gpointer data)
    1155 {
    1156  TRACE_CALL(__func__);
    1157  GtkWidget *dialog;
    1158 
    1159  dialog = gtk_file_chooser_dialog_new(_("Import"), remminamain->window, GTK_FILE_CHOOSER_ACTION_OPEN, "Import",
    1160  GTK_RESPONSE_ACCEPT, NULL);
    1161  gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), TRUE);
    1162  g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(remmina_main_action_tools_import_on_response), NULL);
    1163  gtk_widget_show(dialog);
    1164 }
    1165 
    1166 void remmina_main_on_action_tools_export(GSimpleAction *action, GVariant *param, gpointer data)
    1167 {
    1168  TRACE_CALL(__func__);
    1169  RemminaFilePlugin *plugin;
    1170  RemminaFile *remminafile;
    1171  GtkWidget *dialog;
    1172 
    1173  if (!remminamain->priv->selected_filename)
    1174  return;
    1175 
    1176  remminafile = remmina_file_load(remminamain->priv->selected_filename);
    1177  if (remminafile == NULL)
    1178  return;
    1179  plugin = remmina_plugin_manager_get_export_file_handler(remminafile);
    1180  if (plugin) {
    1181  dialog = gtk_file_chooser_dialog_new(plugin->export_hints, remminamain->window,
    1182  GTK_FILE_CHOOSER_ACTION_SAVE, _("_Save"), GTK_RESPONSE_ACCEPT, NULL);
    1183  if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
    1184  plugin->export_func(plugin, remminafile, gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)));
    1185  gtk_widget_destroy(dialog);
    1186  } else {
    1187  dialog = gtk_message_dialog_new(remminamain->window, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
    1188  _("This protocol does not support exporting."));
    1189  g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(gtk_widget_destroy), NULL);
    1190  gtk_widget_show(dialog);
    1191  }
    1192  remmina_file_free(remminafile);
    1193 }
    1194 
    1195 void remmina_main_on_action_application_plugins(GSimpleAction *action, GVariant *param, gpointer data)
    1196 {
    1197  TRACE_CALL(__func__);
    1198  remmina_plugin_manager_show(remminamain->window);
    1199 }
    1200 
    1201 void remmina_main_on_action_application_dark_theme(GSimpleAction *action, GVariant *param, gpointer data)
    1202 {
    1203  TRACE_CALL(__func__);
    1204  GtkSettings *settings;
    1205 
    1206  settings = gtk_settings_get_default();
    1207 
    1208  if (gtk_switch_get_active(remminamain->switch_dark_mode))
    1210  else
    1213 
    1214  g_object_set(settings, "gtk-application-prefer-dark-theme", remmina_pref.dark_theme, NULL);
    1215 }
    1216 
    1217 void remmina_main_on_action_help_homepage(GSimpleAction *action, GVariant *param, gpointer data)
    1218 {
    1219  TRACE_CALL(__func__);
    1220  g_app_info_launch_default_for_uri("https://www.remmina.org", NULL, NULL);
    1221 }
    1222 
    1223 void remmina_main_on_action_help_wiki(GSimpleAction *action, GVariant *param, gpointer data)
    1224 {
    1225  TRACE_CALL(__func__);
    1226  g_app_info_launch_default_for_uri("https://gitlab.com/Remmina/Remmina/wikis/home", NULL, NULL);
    1227 }
    1228 
    1229 void remmina_main_on_action_help_community(GSimpleAction *action, GVariant *param, gpointer data)
    1230 {
    1231  TRACE_CALL(__func__);
    1232  g_app_info_launch_default_for_uri("https://remmina.org/community", NULL, NULL);
    1233 }
    1234 
    1235 void remmina_main_on_action_help_donations(GSimpleAction *action, GVariant *param, gpointer data)
    1236 {
    1237  TRACE_CALL(__func__);
    1238  g_app_info_launch_default_for_uri("https://www.remmina.org/donations", NULL, NULL);
    1239 }
    1240 
    1241 void remmina_main_on_action_help_debug(GSimpleAction *action, GVariant *param, gpointer data)
    1242 {
    1243  TRACE_CALL(__func__);
    1245 }
    1246 
    1247 void remmina_main_on_action_application_about(GSimpleAction *action, GVariant *param, gpointer data)
    1248 {
    1249  TRACE_CALL(__func__);
    1250  remmina_about_open(remminamain->window);
    1251 };
    1252 
    1253 static gboolean is_empty(const gchar *s)
    1254 {
    1255  if (s == NULL)
    1256  return TRUE;
    1257  while (*s != 0) {
    1258  if (!isspace((unsigned char)*s))
    1259  return FALSE;
    1260  s++;
    1261  }
    1262  return TRUE;
    1263 }
    1264 
    1265 static gboolean remmina_main_quickconnect(void)
    1266 {
    1267  TRACE_CALL(__func__);
    1268  RemminaFile *remminafile;
    1269  gchar *server;
    1270  gchar *server_trimmed;
    1271  gchar *qcp;
    1272 
    1273 
    1274  /* Save quick connect protocol if different from the previous one */
    1275  qcp = gtk_combo_box_text_get_active_text(remminamain->combo_quick_connect_protocol);
    1276  if (qcp && strcmp(qcp, remmina_pref.last_quickconnect_protocol) != 0) {
    1278  remmina_pref.last_quickconnect_protocol = g_strdup(qcp);
    1280  }
    1281 
    1282  remminafile = remmina_file_new();
    1283  server = g_strdup(gtk_entry_get_text(remminamain->entry_quick_connect_server));
    1284  if (g_hostname_to_ascii(server) == NULL)
    1285  return FALSE;
    1286  /* If server contain /, e.g. vnc://, it won't connect
    1287  * We could search for an array of invalid characters, but
    1288  * it's better to find a way to correctly parse and validate addresses
    1289  */
    1290  if (g_strrstr(server, "/") != NULL)
    1291  return FALSE;
    1292  //if (g_str_has_suffix (server, "/"))
    1293  //return FALSE;
    1294  if (is_empty(server))
    1295  return FALSE;
    1296 
    1297  /* check if server is an IP address and trim whitespace if so */
    1298  server_trimmed = g_strdup(server);
    1299  g_strstrip(server_trimmed);
    1300  gchar **strings = g_strsplit(server_trimmed, ":", 2);
    1301 
    1302  if (strings[0] != NULL)
    1303  if (g_hostname_is_ip_address(strings[0]))
    1304  g_stpcpy(server, server_trimmed);
    1305 
    1306  remmina_file_set_string(remminafile, "sound", "off");
    1307  remmina_file_set_string(remminafile, "server", server);
    1308  remmina_file_set_string(remminafile, "name", server);
    1309  remmina_file_set_string(remminafile, "protocol", qcp);
    1310  g_free(server);
    1311  g_free(server_trimmed);
    1312  g_free(qcp);
    1313 
    1314  rcw_open_from_file(remminafile);
    1315 
    1316  return FALSE;
    1317 }
    1318 
    1319 gboolean remmina_main_quickconnect_on_click(GtkWidget *widget, gpointer user_data)
    1320 {
    1321  TRACE_CALL(__func__);
    1322  if (!kioskmode && kioskmode == FALSE)
    1323  return remmina_main_quickconnect();
    1324  return FALSE;
    1325 }
    1326 
    1327 /* Select all the text inside the quick search box if there is anything */
    1328 void remmina_main_quick_search_enter(GtkWidget *widget, gpointer user_data)
    1329 {
    1330  if (gtk_entry_get_text(remminamain->entry_quick_connect_server))
    1331  gtk_editable_select_region(GTK_EDITABLE(remminamain->entry_quick_connect_server), 0, -1);
    1332 }
    1333 
    1334 void remmina_main_on_action_collapse(GSimpleAction *action, GVariant *param, gpointer data)
    1335 {
    1336  TRACE_CALL(__func__);
    1337  gtk_tree_view_collapse_all(remminamain->tree_files_list);
    1338 }
    1339 
    1340 void remmina_main_on_action_search_toggle(GSimpleAction *action, GVariant *param, gpointer data)
    1341 {
    1342  TRACE_CALL(__func__);
    1343  REMMINA_DEBUG("Search toggle triggered");
    1344  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remminamain->search_toggle), !remmina_pref.hide_searchbar);
    1345 
    1346  gboolean toggle_status = gtk_toggle_button_get_active(remminamain->search_toggle);
    1347 
    1348  gtk_search_bar_set_search_mode(remminamain->search_bar, toggle_status);
    1349  if (toggle_status) {
    1350  REMMINA_DEBUG("Search toggle is active");
    1351  gtk_widget_grab_focus(GTK_WIDGET(remminamain->entry_quick_connect_server));
    1352  } else {
    1353  REMMINA_DEBUG("Search toggle is not active, focus is tree_files_list");
    1354  gtk_widget_grab_focus(GTK_WIDGET(remminamain->tree_files_list));
    1355  }
    1356 }
    1357 
    1359 {
    1360  TRACE_CALL(__func__);
    1361  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remminamain->search_toggle), TRUE);
    1362 }
    1363 
    1364 void remmina_main_on_action_expand(GSimpleAction *action, GVariant *param, gpointer data)
    1365 {
    1366  TRACE_CALL(__func__);
    1367  gtk_tree_view_expand_all(remminamain->tree_files_list);
    1368 }
    1369 
    1370 /* Handle double click on a row in the connections list */
    1371 void remmina_main_file_list_on_row_activated(GtkTreeView *tree, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
    1372 {
    1373  TRACE_CALL(__func__);
    1374 /* If a connection was selected then execute the default action */
    1375  if (remminamain->priv->selected_filename) {
    1376  switch (remmina_pref.default_action) {
    1377  case REMMINA_ACTION_EDIT:
    1378  remmina_main_on_action_connection_edit(NULL, NULL, NULL);
    1379  break;
    1381  default:
    1383  break;
    1384  }
    1385  }
    1386 }
    1387 
    1388 /* Show the popup menu by the right button mouse click */
    1389 gboolean remmina_main_file_list_on_button_press(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
    1390 {
    1391  TRACE_CALL(__func__);
    1392  if (event->button == MOUSE_BUTTON_RIGHT) {
    1393  if (!kioskmode && kioskmode == FALSE)
    1394 #if GTK_CHECK_VERSION(3, 22, 0)
    1395  gtk_menu_popup_at_pointer(GTK_MENU(remminamain->menu_popup), (GdkEvent *)event);
    1396 #else
    1397  gtk_menu_popup(remminamain->menu_popup, NULL, NULL, NULL, NULL, event->button, event->time);
    1398 #endif
    1399  }
    1400  return FALSE;
    1401 }
    1402 
    1403 /* Show the popup menu by the menu key */
    1404 gboolean remmina_main_file_list_on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
    1405 {
    1406  TRACE_CALL(__func__);
    1407  if (event->keyval == GDK_KEY_Menu) {
    1408 #if GTK_CHECK_VERSION(3, 22, 0)
    1409  gtk_menu_popup_at_widget(GTK_MENU(remminamain->menu_popup), widget,
    1410  GDK_GRAVITY_CENTER, GDK_GRAVITY_CENTER,
    1411  (GdkEvent *)event);
    1412 #else
    1413  gtk_menu_popup(remminamain->menu_popup, NULL, NULL, NULL, NULL, 0, event->time);
    1414 #endif
    1415  }
    1416  return FALSE;
    1417 }
    1418 
    1419 void remmina_main_quick_search_on_icon_press(GtkEntry *entry, GtkEntryIconPosition icon_pos, GdkEvent *event, gpointer user_data)
    1420 {
    1421  TRACE_CALL(__func__);
    1422  if (icon_pos == GTK_ENTRY_ICON_SECONDARY)
    1423  gtk_entry_set_text(entry, "");
    1424 }
    1425 
    1426 void remmina_main_quick_search_on_changed(GtkEditable *editable, gpointer user_data)
    1427 {
    1428  TRACE_CALL(__func__);
    1429  /* If a search text was input then temporary set the file mode to list */
    1430  if (gtk_entry_get_text_length(remminamain->entry_quick_connect_server)) {
    1431  if (GTK_IS_TREE_STORE(remminamain->priv->file_model)) {
    1432  /* File view mode changed, put it to override and reload list */
    1433  remminamain->priv->override_view_file_mode_to_list = TRUE;
    1435  }
    1436  } else {
    1437  if (remminamain->priv->override_view_file_mode_to_list) {
    1438  /* File view mode changed, put it to default (disable override) and reload list */
    1439  remminamain->priv->override_view_file_mode_to_list = FALSE;
    1441  }
    1442  }
    1443  gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(remminamain->priv->file_model_filter));
    1444 }
    1445 
    1446 void remmina_main_on_drag_data_received(GtkWidget *widget, GdkDragContext *drag_context, gint x, gint y,
    1447  GtkSelectionData *data, guint info, guint time, gpointer user_data)
    1448 {
    1449  TRACE_CALL(__func__);
    1450  gchar **uris;
    1451  GSList *files = NULL;
    1452  gint i;
    1453 
    1454  uris = g_uri_list_extract_uris((const gchar *)gtk_selection_data_get_data(data));
    1455  for (i = 0; uris[i]; i++) {
    1456  if (strncmp(uris[i], "file://", 7) != 0)
    1457  continue;
    1458  files = g_slist_append(files, g_strdup(uris[i] + 7));
    1459  }
    1460  g_strfreev(uris);
    1462 }
    1463 
    1464 /* Add a new menuitem to the Tools menu */
    1465 static gboolean remmina_main_add_tool_plugin(gchar *name, RemminaPlugin *plugin, gpointer user_data)
    1466 {
    1467  TRACE_CALL(__func__);
    1468  RemminaToolPlugin *tool_plugin = (RemminaToolPlugin *)plugin;
    1469  GtkWidget *menuitem = gtk_menu_item_new_with_label(plugin->description);
    1470 
    1471  gtk_widget_show(menuitem);
    1472  gtk_menu_shell_append(GTK_MENU_SHELL(remminamain->menu_popup_full), menuitem);
    1473  g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(tool_plugin->exec_func), tool_plugin);
    1474  return FALSE;
    1475 }
    1476 
    1477 gboolean remmina_main_on_window_state_event(GtkWidget *widget, GdkEventWindowState *event, gpointer user_data)
    1478 {
    1479  TRACE_CALL(__func__);
    1480  return FALSE;
    1481 }
    1482 
    1483 /* Remmina main window initialization */
    1484 static void remmina_main_init(void)
    1485 {
    1486  TRACE_CALL(__func__);
    1487  int i, qcp_idx, qcp_actidx;
    1488  char *name;
    1489  GtkSettings *settings;
    1490 
    1491  REMMINA_DEBUG("Initializing the Remmina main window");
    1492  /* Switch to a dark theme if the user enabled it */
    1493  settings = gtk_settings_get_default();
    1494  g_object_set(settings, "gtk-application-prefer-dark-theme", remmina_pref.dark_theme, NULL);
    1495 
    1496  REMMINA_DEBUG ("Initializing monitor");
    1497  remminamain->monitor = remmina_network_monitor_new();
    1498 
    1500  if (!kioskmode && kioskmode == FALSE)
    1501  gtk_window_set_title(remminamain->window, _("Remmina Remote Desktop Client"));
    1502  else
    1503  gtk_window_set_title(remminamain->window, _("Remmina Kiosk"));
    1504  if (!kioskmode && kioskmode == FALSE) {
    1505  gtk_window_set_default_size(remminamain->window, remmina_pref.main_width, remmina_pref.main_height);
    1507  gtk_window_maximize(remminamain->window);
    1508  }
    1509  /* Honor global preferences Search Bar visibility */
    1511  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(RM_GET_OBJECT("search_toggle")), FALSE);
    1512 
    1513  /* Add a GtkMenuItem to the Tools menu for each plugin of type REMMINA_PLUGIN_TYPE_TOOL */
    1515 
    1516  /* Add available quick connect protocols to remminamain->combo_quick_connect_protocol */
    1517  qcp_idx = qcp_actidx = 0;
    1518  for (i = 0; i < sizeof(quick_connect_plugin_list) / sizeof(quick_connect_plugin_list[0]); i++) {
    1519  name = quick_connect_plugin_list[i];
    1521  gtk_combo_box_text_append(remminamain->combo_quick_connect_protocol, name, name);
    1523  qcp_actidx = qcp_idx;
    1524  qcp_idx++;
    1525  }
    1526  }
    1527  gtk_combo_box_set_active(GTK_COMBO_BOX(remminamain->combo_quick_connect_protocol), qcp_actidx);
    1528 
    1529  /* Connect the group accelerators to the GtkWindow */
    1530  //gtk_window_add_accel_group(remminamain->window, remminamain->accelgroup_shortcuts);
    1531  /* Set the Quick Connection */
    1532  gtk_entry_set_activates_default(remminamain->entry_quick_connect_server, TRUE);
    1533  /* Set the TreeView for the files list */
    1534  gtk_tree_selection_set_select_function(
    1535  gtk_tree_view_get_selection(remminamain->tree_files_list),
    1536  remmina_main_selection_func, NULL, NULL);
    1538  gtk_tree_view_set_search_entry(remminamain->tree_files_list, GTK_ENTRY(remminamain->entry_quick_connect_server));
    1540  gtk_widget_grab_focus(GTK_WIDGET(remminamain->tree_files_list));
    1541  /* Load the files list */
    1543 
    1544  /* Drag-n-drop support */
    1545  gtk_drag_dest_set(GTK_WIDGET(remminamain->window), GTK_DEST_DEFAULT_ALL, remmina_drop_types, 1, GDK_ACTION_COPY);
    1546 
    1547  /* Finish initialization */
    1548  remminamain->priv->initialized = TRUE;
    1549 
    1550  /* Register the window in remmina_widget_pool with GType=GTK_WINDOW and TAG=remmina-main-window */
    1551  g_object_set_data(G_OBJECT(remminamain->window), "tag", "remmina-main-window");
    1552  remmina_widget_pool_register(GTK_WIDGET(remminamain->window));
    1553 }
    1554 
    1555 /* Signal handler for "show" on remminamain->window */
    1556 void remmina_main_on_show(GtkWidget *w, gpointer user_data)
    1557 {
    1558  TRACE_CALL(__func__);
    1559 #ifdef SNAP_BUILD
    1561 #endif
    1562 }
    1563 
    1564 /* RemminaMain instance */
    1565 GtkWidget *remmina_main_new(void)
    1566 {
    1567  TRACE_CALL(__func__);
    1568  GSimpleActionGroup *actions;
    1569  GtkAccelGroup *accel_group = NULL;
    1570 
    1571  remminamain = g_new0(RemminaMain, 1);
    1572  remminamain->priv = g_new0(RemminaMainPriv, 1);
    1573  /* Assign UI widgets to the private members */
    1574  remminamain->builder = remmina_public_gtk_builder_new_from_resource("/org/remmina/Remmina/src/../data/ui/remmina_main.glade");
    1575  remminamain->window = GTK_WINDOW(RM_GET_OBJECT("RemminaMain"));
    1576  if (kioskmode && kioskmode == TRUE) {
    1577  gtk_window_set_position(remminamain->window, GTK_WIN_POS_CENTER_ALWAYS);
    1578  gtk_window_set_default_size(remminamain->window, 800, 400);
    1579  gtk_window_set_resizable(remminamain->window, FALSE);
    1580  }
    1581  /* New Button */
    1582  remminamain->button_new = GTK_BUTTON(RM_GET_OBJECT("button_new"));
    1583  if (kioskmode && kioskmode == TRUE)
    1584  gtk_widget_set_sensitive(GTK_WIDGET(remminamain->button_new), FALSE);
    1585  /* Search bar */
    1586  remminamain->search_toggle = GTK_TOGGLE_BUTTON(RM_GET_OBJECT("search_toggle"));
    1587  remminamain->search_bar = GTK_SEARCH_BAR(RM_GET_OBJECT("search_bar"));
    1588  /* view mode list/tree */
    1589  remminamain->view_toggle_button = GTK_TOGGLE_BUTTON(RM_GET_OBJECT("view_toggle_button"));
    1590  if (kioskmode && kioskmode == TRUE)
    1591  gtk_widget_set_sensitive(GTK_WIDGET(remminamain->view_toggle_button), FALSE);
    1592 
    1593  /* Menu widgets */
    1594  remminamain->menu_popup = GTK_MENU(RM_GET_OBJECT("menu_popup"));
    1595  remminamain->menu_header_button = GTK_MENU_BUTTON(RM_GET_OBJECT("menu_header_button"));
    1596  remminamain->menu_popup_full = GTK_MENU(RM_GET_OBJECT("menu_popup_full"));
    1597  if (kioskmode && kioskmode == TRUE) {
    1598  gtk_widget_set_sensitive(GTK_WIDGET(remminamain->menu_popup_full), FALSE);
    1599  gtk_widget_set_sensitive(GTK_WIDGET(remminamain->menu_header_button), FALSE);
    1600  }
    1601  /* View mode radios */
    1602  remminamain->menuitem_view_mode_list = GTK_RADIO_MENU_ITEM(RM_GET_OBJECT("menuitem_view_mode_list"));
    1603  remminamain->menuitem_view_mode_tree = GTK_RADIO_MENU_ITEM(RM_GET_OBJECT("menuitem_view_mode_tree"));
    1604  /* Quick connect objects */
    1605  remminamain->box_quick_connect = GTK_BOX(RM_GET_OBJECT("box_quick_connect"));
    1606  remminamain->combo_quick_connect_protocol = GTK_COMBO_BOX_TEXT(RM_GET_OBJECT("combo_quick_connect_protocol"));
    1607  if (kioskmode && kioskmode == TRUE)
    1608  gtk_widget_set_sensitive(GTK_WIDGET(remminamain->combo_quick_connect_protocol), FALSE);
    1609  remminamain->entry_quick_connect_server = GTK_ENTRY(RM_GET_OBJECT("entry_quick_connect_server"));
    1610  /* Other widgets */
    1611  remminamain->tree_files_list = GTK_TREE_VIEW(RM_GET_OBJECT("tree_files_list"));
    1612  remminamain->column_files_list_name = GTK_TREE_VIEW_COLUMN(RM_GET_OBJECT("column_files_list_name"));
    1613  remminamain->column_files_list_group = GTK_TREE_VIEW_COLUMN(RM_GET_OBJECT("column_files_list_group"));
    1614  remminamain->column_files_list_server = GTK_TREE_VIEW_COLUMN(RM_GET_OBJECT("column_files_list_server"));
    1615  remminamain->column_files_list_plugin = GTK_TREE_VIEW_COLUMN(RM_GET_OBJECT("column_files_list_plugin"));
    1616  remminamain->column_files_list_date = GTK_TREE_VIEW_COLUMN(RM_GET_OBJECT("column_files_list_date"));
    1617  remminamain->column_files_list_notes = GTK_TREE_VIEW_COLUMN(RM_GET_OBJECT("column_files_list_notes"));
    1618  gtk_tree_view_column_set_fixed_width(remminamain->column_files_list_notes, 100);
    1619  remminamain->statusbar_main = GTK_STATUSBAR(RM_GET_OBJECT("statusbar_main"));
    1620  /* signals */
    1621  g_signal_connect(remminamain->entry_quick_connect_server, "key-release-event", G_CALLBACK(remmina_main_search_key_event), NULL);
    1622  g_signal_connect(remminamain->tree_files_list, "row-activated", G_CALLBACK(remmina_main_tree_row_activated), NULL);
    1623  /* Non widget objects */
    1624  actions = g_simple_action_group_new();
    1625  g_action_map_add_action_entries(G_ACTION_MAP(actions), app_actions, G_N_ELEMENTS(app_actions), remminamain->window);
    1626  gtk_widget_insert_action_group(GTK_WIDGET(remminamain->window), "app", G_ACTION_GROUP(actions));
    1627  g_action_map_add_action_entries(G_ACTION_MAP(actions), main_actions, G_N_ELEMENTS(main_actions), remminamain->window);
    1628  gtk_widget_insert_action_group(GTK_WIDGET(remminamain->window), "main", G_ACTION_GROUP(actions));
    1629  g_object_unref(actions);
    1630  /* Accelerators */
    1631  accel_group = gtk_accel_group_new();
    1632  gtk_window_add_accel_group(remminamain->window, accel_group);
    1633  gtk_accel_group_connect(accel_group, GDK_KEY_Q, GDK_CONTROL_MASK, 0,
    1634  g_cclosure_new_swap(G_CALLBACK(remmina_main_on_action_application_quit), NULL, NULL));
    1635  // TODO: This crash remmina because the function doesn't receive the parameter we expect
    1636  gtk_accel_group_connect(accel_group, GDK_KEY_P, GDK_CONTROL_MASK, 0,
    1637  g_cclosure_new_swap(G_CALLBACK(remmina_main_on_accel_application_preferences), NULL, NULL));
    1638  gtk_accel_group_connect(accel_group, GDK_KEY_F, GDK_CONTROL_MASK, 0,
    1639  g_cclosure_new_swap(G_CALLBACK(remmina_main_on_accel_search_toggle), remminamain, NULL));
    1640 
    1641  /* Connect signals */
    1642  gtk_builder_connect_signals(remminamain->builder, NULL);
    1643  /* Initialize the window and load the preferences */
    1645  return GTK_WIDGET(remminamain->window);
    1646 }
    1647 
    1649 {
    1650  if (!remminamain)
    1651  return NULL;
    1652  if (!remminamain->priv)
    1653  return NULL;
    1654  if (!remminamain->priv->initialized)
    1655  return NULL;
    1656  remminamain->window = GTK_WINDOW(RM_GET_OBJECT("RemminaMain"));
    1657  return remminamain->window;
    1658 }
    1659 
    1661 {
    1662  if (!remminamain)
    1663  return;
    1665 }
    1666 
    1667 void remmina_main_show_dialog(GtkMessageType msg, GtkButtonsType buttons, const gchar* message) {
    1668  GtkWidget *dialog;
    1669 
    1670  if (remminamain->window) {
    1671  dialog = gtk_message_dialog_new(remminamain->window, GTK_DIALOG_MODAL, msg, buttons, "%s", message);
    1672  gtk_dialog_run(GTK_DIALOG(dialog));
    1673  gtk_widget_destroy(dialog);
    1674  }
    1675 }
    1676 
    1677 void remmina_main_show_warning_dialog(const gchar *message) {
    1678  GtkWidget *dialog;
    1679 
    1680  if (remminamain->window) {
    1681  dialog = gtk_message_dialog_new(remminamain->window, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE,
    1682  message, g_get_application_name());
    1683  gtk_dialog_run(GTK_DIALOG(dialog));
    1684  gtk_widget_destroy(dialog);
    1685  }
    1686 }
    G_BEGIN_DECLS struct _RemminaGroupData RemminaGroupData
    +Go to the documentation of this file.
    1 /*
    2  * Remmina - The GTK+ Remote Desktop Client
    3  * Copyright (C) 2009-2011 Vic Lee
    4  * Copyright (C) 2014-2015 Antenore Gatta, Fabio Castelli, Giovanni Panozzo
    5  * Copyright (C) 2016-2022 Antenore Gatta, Giovanni Panozzo
    6  * Copyright (C) 2022-2023 Antenore Gatta, Giovanni Panozzo, Hiroyuki Tanaka
    7  *
    8  * This program is free software; you can redistribute it and/or modify
    9  * it under the terms of the GNU General Public License as published by
    10  * the Free Software Foundation; either version 2 of the License, or
    11  * (at your option) any later version.
    12  *
    13  * This program is distributed in the hope that it will be useful,
    14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    16  * GNU General Public License for more details.
    17  *
    18  * You should have received a copy of the GNU General Public License
    19  * along with this program; if not, write to the Free Software
    20  * Foundation, Inc., 51 Franklin Street, Fifth Floor,
    21  * Boston, MA 02110-1301, USA.
    22  *
    23  * In addition, as a special exception, the copyright holders give
    24  * permission to link the code of portions of this program with the
    25  * OpenSSL library under certain conditions as described in each
    26  * individual source file, and distribute linked combinations
    27  * including the two.
    28  * You must obey the GNU General Public License in all respects
    29  * for all of the code used other than OpenSSL. * If you modify
    30  * file(s) with this exception, you may extend this exception to your
    31  * version of the file(s), but you are not obligated to do so. * If you
    32  * do not wish to do so, delete this exception statement from your
    33  * version. * If you delete this exception statement from all source
    34  * files in the program, then also delete it here.
    35  *
    36  */
    37 
    38 #include "config.h"
    39 #include <ctype.h>
    40 #include <gio/gio.h>
    41 #ifndef __APPLE__
    42 #include <gio/gdesktopappinfo.h>
    43 #endif
    44 #include <gdk/gdkkeysyms.h>
    45 #include <glib/gi18n.h>
    46 #include <gtk/gtk.h>
    47 
    48 #include "remmina.h"
    49 #include "remmina_string_array.h"
    50 #include "remmina_public.h"
    51 #include "remmina_file.h"
    52 #include "remmina_file_manager.h"
    53 #include "remmina_file_editor.h"
    54 #include "rcw.h"
    55 #include "remmina_about.h"
    56 #include "remmina_pref.h"
    57 #include "remmina_pref_dialog.h"
    58 #include "remmina_widget_pool.h"
    59 #include "remmina_plugin_manager.h"
    60 #include "remmina_log.h"
    61 #include "remmina_icon.h"
    62 #include "remmina_main.h"
    63 #include "remmina_exec.h"
    64 #include "remmina_mpchange.h"
    65 #include "remmina_external_tools.h"
    66 #include "remmina_unlock.h"
    68 
    70 
    71 #define RM_GET_OBJECT(object_name) gtk_builder_get_object(remminamain->builder, object_name)
    72 
    73 enum {
    84 };
    85 
    86 static
    87 const gchar *supported_mime_types[] = {
    88  "x-scheme-handler/rdp",
    89  "x-scheme-handler/spice",
    90  "x-scheme-handler/vnc",
    91  "x-scheme-handler/remmina",
    92  "application/x-remmina",
    93  NULL
    94 };
    95 
    96 static GActionEntry app_actions[] = {
    97  { "about", remmina_main_on_action_application_about, NULL, NULL, NULL },
    98  { "default", remmina_main_on_action_application_default, NULL, NULL, NULL },
    99  { "mpchange", remmina_main_on_action_application_mpchange, NULL, NULL, NULL },
    100  { "plugins", remmina_main_on_action_application_plugins, NULL, NULL, NULL },
    101  { "preferences", remmina_main_on_action_application_preferences, "i", NULL, NULL },
    102  { "dark", remmina_main_on_action_application_dark_theme, NULL, NULL, NULL },
    103  { "debug", remmina_main_on_action_help_debug, NULL, NULL, NULL },
    104  { "community", remmina_main_on_action_help_community, NULL, NULL, NULL },
    105  { "donations", remmina_main_on_action_help_donations, NULL, NULL, NULL },
    106  { "homepage", remmina_main_on_action_help_homepage, NULL, NULL, NULL },
    107  { "wiki", remmina_main_on_action_help_wiki, NULL, NULL, NULL },
    108  { "quit", remmina_main_on_action_application_quit, NULL, NULL, NULL },
    109 };
    110 
    111 static GActionEntry main_actions[] = {
    112  { "connect", remmina_main_on_action_connection_connect, NULL, NULL, NULL },
    113  { "copy", remmina_main_on_action_connection_copy, NULL, NULL, NULL },
    114  { "delete", remmina_main_on_action_connection_delete, NULL, NULL, NULL },
    115  { "delete_multiple", remmina_main_on_action_connection_delete_multiple, NULL, NULL, NULL },
    116  { "edit", remmina_main_on_action_connection_edit, NULL, NULL, NULL },
    117  { "exttools", remmina_main_on_action_connection_external_tools, NULL, NULL, NULL },
    118  { "new", remmina_main_on_action_connection_new, NULL, NULL, NULL },
    119  { "export", remmina_main_on_action_tools_export, NULL, NULL, NULL },
    120  { "import", remmina_main_on_action_tools_import, NULL, NULL, NULL },
    121  { "expand", remmina_main_on_action_expand, NULL, NULL, NULL },
    122  { "collapse", remmina_main_on_action_collapse, NULL, NULL, NULL },
    123  { "search", remmina_main_on_action_search_toggle, NULL, NULL, NULL },
    124 };
    125 
    126 static GtkTargetEntry remmina_drop_types[] =
    127 {
    128  { "text/uri-list", 0, 1 }
    129 };
    130 
    132 {
    133  "RDP", "VNC", "SSH", "NX", "SPICE", "X2GO"
    134 };
    135 
    139 static void remmina_main_save_size(void)
    140 {
    141  TRACE_CALL(__func__);
    142  if ((gdk_window_get_state(gtk_widget_get_window(GTK_WIDGET(remminamain->window))) & GDK_WINDOW_STATE_MAXIMIZED) == 0) {
    143  gtk_window_get_size(remminamain->window, &remmina_pref.main_width, &remmina_pref.main_height);
    144  remmina_pref.main_maximize = FALSE;
    145  } else {
    147  }
    148 }
    149 
    150 static void remmina_main_save_expanded_group_func(GtkTreeView *tree_view, GtkTreePath *path, gpointer user_data)
    151 {
    152  TRACE_CALL(__func__);
    153  GtkTreeIter iter;
    154  gchar *group;
    155 
    156  gtk_tree_model_get_iter(remminamain->priv->file_model_sort, &iter, path);
    157  gtk_tree_model_get(remminamain->priv->file_model_sort, &iter, GROUP_COLUMN, &group, -1);
    158  if (group) {
    159  remmina_string_array_add(remminamain->priv->expanded_group, group);
    160  g_free(group);
    161  }
    162 }
    163 
    165 {
    166  TRACE_CALL(__func__);
    167  if (GTK_IS_TREE_STORE(remminamain->priv->file_model)) {
    168  if (remminamain->priv->expanded_group)
    170  remminamain->priv->expanded_group = remmina_string_array_new();
    171  gtk_tree_view_map_expanded_rows(remminamain->tree_files_list,
    172  (GtkTreeViewMappingFunc)remmina_main_save_expanded_group_func, NULL);
    173  }
    174 }
    175 
    181 {
    182  TRACE_CALL(__func__);
    183  if (!remminamain || !remminamain->window)
    184  return;
    185 
    191 }
    192 
    194 {
    195  TRACE_CALL(__func__);
    196 
    197  if (remminamain) {
    198  if (remminamain->window)
    199  gtk_widget_destroy(GTK_WIDGET(remminamain->window));
    200 
    201  g_object_unref(remminamain->builder);
    203  remminamain->priv->expanded_group = NULL;
    204  if (remminamain->priv->file_model)
    205  g_object_unref(G_OBJECT(remminamain->priv->file_model));
    206  g_object_unref(G_OBJECT(remminamain->priv->file_model_filter));
    207  g_free(remminamain->priv->selected_filename);
    208  g_free(remminamain->priv->selected_name);
    209  g_free(remminamain->priv);
    210  g_free(remminamain);
    211  remminamain = NULL;
    212  }
    213 }
    214 
    218 static gboolean remmina_main_dexit(gpointer data)
    219 {
    220  TRACE_CALL(__func__);
    222  return FALSE;
    223 }
    224 
    225 gboolean remmina_main_on_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
    226 {
    227  TRACE_CALL(__func__);
    229 
    230  g_idle_add(remmina_main_dexit, NULL);
    231 
    232  return FALSE;
    233 }
    234 
    235 gboolean remmina_main_idle_destroy(gpointer data)
    236 {
    237  TRACE_CALL(__func__);
    238 
    239  if (remminamain)
    241 
    242  return G_SOURCE_REMOVE;
    243 }
    244 
    249 {
    250  TRACE_CALL(__func__);
    251 
    252  if (remminamain) {
    253  /* Invalidate remminamain->window to avoid multiple destructions */
    254  remminamain->window = NULL;
    255  /* Destroy remminamain struct, later. We can't destroy
    256  * important objects like the builder now */
    257  g_idle_add(remmina_main_idle_destroy, NULL);
    258  }
    259 }
    260 
    262 {
    263  TRACE_CALL(__func__);
    264  g_free(remminamain->priv->selected_filename);
    265  g_free(remminamain->priv->selected_name);
    266  remminamain->priv->selected_filename = NULL;
    267  remminamain->priv->selected_name = NULL;
    268 }
    269 
    270 #ifdef SNAP_BUILD
    271 
    273 {
    274  GtkBuilder *dlgbuilder = NULL;
    275  GtkWidget *dlg;
    276  GtkWindow *parent;
    277  int result;
    278  static gboolean shown_once = FALSE;
    279  gboolean need_snap_interface_connections = FALSE;
    280  GtkWidget *dsa;
    282 
    283  if (shown_once)
    284  return;
    285  else
    286  shown_once = TRUE;
    287 
    288  g_print("Remmina is compiled as a SNAP package.\n");
    289  remmina_secret_plugin = remmina_plugin_manager_get_secret_plugin();
    290  if (remmina_secret_plugin == NULL) {
    291  g_print(" but we can’t find the secret plugin inside the SNAP.\n");
    292  need_snap_interface_connections = TRUE;
    293  } else {
    294  if (!remmina_secret_plugin->is_service_available(remmina_secret_plugin)) {
    295  g_print(" but we can’t access a secret service. Secret service or SNAP interface connection is missing.\n");
    296  need_snap_interface_connections = TRUE;
    297  }
    298  }
    299 
    300  if (need_snap_interface_connections && !remmina_pref.prevent_snap_welcome_message) {
    301  dlgbuilder = remmina_public_gtk_builder_new_from_resource("/org/remmina/Remmina/src/../data/ui/remmina_snap_info_dialog.glade");
    302  dsa = GTK_WIDGET(gtk_builder_get_object(dlgbuilder, "dontshowagain"));
    303  if (dlgbuilder) {
    304  parent = remmina_main_get_window();
    305  dlg = GTK_WIDGET(gtk_builder_get_object(dlgbuilder, "SnapInfoDlg"));
    306  if (parent)
    307  gtk_window_set_transient_for(GTK_WINDOW(dlg), parent);
    308  gtk_builder_connect_signals(dlgbuilder, NULL);
    309  result = gtk_dialog_run(GTK_DIALOG(dlg));
    310  if (result == 1) {
    311  remmina_pref.prevent_snap_welcome_message = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dsa));
    313  }
    314  gtk_widget_destroy(dlg);
    315  g_object_unref(dlgbuilder);
    316  }
    317  }
    318 }
    319 #endif
    320 
    321 
    322 static gboolean remmina_main_selection_func(GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path,
    323  gboolean path_currently_selected, gpointer user_data)
    324 {
    325  TRACE_CALL(__func__);
    326  guint context_id;
    327  GtkTreeIter iter;
    328  gchar buf[1000];
    329 
    330  if (path_currently_selected)
    331  return TRUE;
    332 
    333  if (!gtk_tree_model_get_iter(model, &iter, path))
    334  return TRUE;
    335 
    337 
    338  gtk_tree_model_get(model, &iter,
    339  NAME_COLUMN, &remminamain->priv->selected_name,
    340  FILENAME_COLUMN, &remminamain->priv->selected_filename,
    341  -1);
    342 
    343  context_id = gtk_statusbar_get_context_id(remminamain->statusbar_main, "status");
    344  gtk_statusbar_pop(remminamain->statusbar_main, context_id);
    345  if (remminamain->priv->selected_filename) {
    346  g_snprintf(buf, sizeof(buf), "%s (%s)", remminamain->priv->selected_name, remminamain->priv->selected_filename);
    347  gtk_statusbar_push(remminamain->statusbar_main, context_id, buf);
    348  } else {
    349  gtk_statusbar_push(remminamain->statusbar_main, context_id, remminamain->priv->selected_name);
    350  }
    351 
    352  return TRUE;
    353 }
    354 
    355 static void remmina_main_load_file_list_callback(RemminaFile *remminafile, gpointer user_data)
    356 {
    357  TRACE_CALL(__func__);
    358  GtkTreeIter iter;
    359  GtkListStore *store;
    360 
    361  store = GTK_LIST_STORE(user_data);
    362  gchar *datetime;
    363 
    364  datetime = remmina_file_get_datetime(remminafile);
    365  gtk_list_store_append(store, &iter);
    366  gtk_list_store_set(store, &iter,
    368  NAME_COLUMN, remmina_file_get_string(remminafile, "name"),
    369  NOTES_COLUMN, g_uri_unescape_string(remmina_file_get_string(remminafile, "notes_text"), NULL),
    370  GROUP_COLUMN, remmina_file_get_string(remminafile, "group"),
    371  SERVER_COLUMN, remmina_file_get_string(remminafile, "server"),
    372  PLUGIN_COLUMN, remmina_file_get_string(remminafile, "protocol"),
    373  DATE_COLUMN, datetime,
    375  LABELS_COLUMN, remmina_file_get_string(remminafile, "labels"),
    376  -1);
    377  g_free(datetime);
    378 }
    379 
    380 static gboolean remmina_main_load_file_tree_traverse(GNode *node, GtkTreeStore *store, GtkTreeIter *parent)
    381 {
    382  TRACE_CALL(__func__);
    383  GtkTreeIter *iter;
    384  RemminaGroupData *data;
    385  GNode *child;
    386 
    387  iter = NULL;
    388  if (node->data) {
    389  data = (RemminaGroupData *)node->data;
    390  iter = g_new0(GtkTreeIter, 1);
    391  gtk_tree_store_append(store, iter, parent);
    392  gtk_tree_store_set(store, iter,
    393  PROTOCOL_COLUMN, "folder-symbolic",
    394  NAME_COLUMN, data->name,
    395  GROUP_COLUMN, data->group,
    396  DATE_COLUMN, data->datetime,
    397  FILENAME_COLUMN, NULL,
    398  LABELS_COLUMN, data->labels,
    399  -1);
    400  }
    401  for (child = g_node_first_child(node); child; child = g_node_next_sibling(child))
    402  remmina_main_load_file_tree_traverse(child, store, iter);
    403  g_free(iter);
    404  return FALSE;
    405 }
    406 
    407 static void remmina_main_load_file_tree_group(GtkTreeStore *store)
    408 {
    409  TRACE_CALL(__func__);
    410  GNode *root;
    411 
    413  remmina_main_load_file_tree_traverse(root, store, NULL);
    415 }
    416 
    417 static void remmina_main_expand_group_traverse(GtkTreeIter *iter)
    418 {
    419  TRACE_CALL(__func__);
    420  GtkTreeModel *tree;
    421  gboolean ret;
    422  gchar *group, *filename;
    423  GtkTreeIter child;
    424  GtkTreePath *path;
    425 
    426  tree = remminamain->priv->file_model_sort;
    427  ret = TRUE;
    428  while (ret) {
    429  gtk_tree_model_get(tree, iter, GROUP_COLUMN, &group, FILENAME_COLUMN, &filename, -1);
    430  if (filename == NULL) {
    431  if (remmina_string_array_find(remminamain->priv->expanded_group, group) >= 0) {
    432  path = gtk_tree_model_get_path(tree, iter);
    433  gtk_tree_view_expand_row(remminamain->tree_files_list, path, FALSE);
    434  gtk_tree_path_free(path);
    435  }
    436  if (gtk_tree_model_iter_children(tree, &child, iter))
    438  }
    439  g_free(group);
    440  g_free(filename);
    441 
    442  ret = gtk_tree_model_iter_next(tree, iter);
    443  }
    444 }
    445 
    446 static void remmina_main_expand_group(void)
    447 {
    448  TRACE_CALL(__func__);
    449  GtkTreeIter iter;
    450 
    451  if (gtk_tree_model_get_iter_first(remminamain->priv->file_model_sort, &iter))
    453 }
    454 
    455 static gboolean remmina_main_load_file_tree_find(GtkTreeModel *tree, GtkTreeIter *iter, const gchar *match_group)
    456 {
    457  TRACE_CALL(__func__);
    458  gboolean ret, match;
    459  gchar *group, *filename;
    460  GtkTreeIter child;
    461 
    462  match = FALSE;
    463  ret = TRUE;
    464  while (ret) {
    465  gtk_tree_model_get(tree, iter, GROUP_COLUMN, &group, FILENAME_COLUMN, &filename, -1);
    466  match = (filename == NULL && g_strcmp0(group, match_group) == 0);
    467  g_free(group);
    468  g_free(filename);
    469  if (match)
    470  break;
    471  if (gtk_tree_model_iter_children(tree, &child, iter)) {
    472  match = remmina_main_load_file_tree_find(tree, &child, match_group);
    473  if (match) {
    474  memcpy(iter, &child, sizeof(GtkTreeIter));
    475  break;
    476  }
    477  }
    478  ret = gtk_tree_model_iter_next(tree, iter);
    479  }
    480  return match;
    481 }
    482 
    483 static void remmina_main_load_file_tree_callback(RemminaFile *remminafile, gpointer user_data)
    484 {
    485  TRACE_CALL(__func__);
    486  GtkTreeIter iter, child;
    487  GtkTreeStore *store;
    488  gboolean found;
    489  gchar *datetime = NULL;
    490 
    491  store = GTK_TREE_STORE(user_data);
    492 
    493  found = FALSE;
    494  if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter))
    495  found = remmina_main_load_file_tree_find(GTK_TREE_MODEL(store), &iter,
    496  remmina_file_get_string(remminafile, "group"));
    497 
    498  datetime = remmina_file_get_datetime(remminafile);
    499  //REMMINA_DEBUG("The date is %s", datetime);
    500  gtk_tree_store_append(store, &child, (found ? &iter : NULL));
    501  gtk_tree_store_set(store, &child,
    503  NAME_COLUMN, remmina_file_get_string(remminafile, "name"),
    504  NOTES_COLUMN, g_uri_unescape_string(remmina_file_get_string(remminafile, "notes_text"), NULL),
    505  GROUP_COLUMN, remmina_file_get_string(remminafile, "group"),
    506  SERVER_COLUMN, remmina_file_get_string(remminafile, "server"),
    507  PLUGIN_COLUMN, remmina_file_get_string(remminafile, "protocol"),
    508  DATE_COLUMN, datetime,
    510  LABELS_COLUMN, remmina_file_get_string(remminafile, "labels"),
    511  -1);
    512  g_free(datetime);
    513 }
    514 
    515 static void remmina_main_file_model_on_sort(GtkTreeSortable *sortable, gpointer user_data)
    516 {
    517  TRACE_CALL(__func__);
    518  gint columnid;
    519  GtkSortType order;
    520 
    521  gtk_tree_sortable_get_sort_column_id(sortable, &columnid, &order);
    525 }
    526 
    527 static gboolean remmina_main_filter_visible_func(GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
    528 {
    529  TRACE_CALL(__func__);
    530  gchar *text;
    531  gchar *protocol, *name, *labels, *group, *server, *plugin, *date, *s;
    532  gboolean result = TRUE;
    533 
    534  text = g_ascii_strdown(gtk_entry_get_text(remminamain->entry_quick_connect_server), -1);
    535  if (text && text[0]) {
    536  gtk_tree_model_get(model, iter,
    537  PROTOCOL_COLUMN, &protocol,
    538  NAME_COLUMN, &name,
    539  GROUP_COLUMN, &group,
    540  SERVER_COLUMN, &server,
    541  PLUGIN_COLUMN, &plugin,
    542  DATE_COLUMN, &date,
    543  LABELS_COLUMN, &labels,
    544  -1);
    545  if (g_strcmp0(protocol, "folder-symbolic") != 0) {
    546  s = g_ascii_strdown(name ? name : "", -1);
    547  g_free(name);
    548  name = s;
    549  s = g_ascii_strdown(group ? group : "", -1);
    550  g_free(group);
    551  group = s;
    552  s = g_ascii_strdown(server ? server : "", -1);
    553  g_free(server);
    554  server = s;
    555  s = g_ascii_strdown(plugin ? plugin : "", -1);
    556  g_free(plugin);
    557  plugin = s;
    558  s = g_ascii_strdown(date ? date : "", -1);
    559  g_free(date);
    560  date = s;
    561  result = (strstr(name, text) || strstr(group, text) || strstr(server, text) || strstr(plugin, text) || strstr(date, text));
    562 
    563  // Filter by labels
    564 
    565  s = g_ascii_strdown(labels ? labels : "", -1);
    566  g_free(labels);
    567  labels = s;
    568 
    569  if (strlen(labels) > 0) {
    570  gboolean labels_result = TRUE;
    571  gchar **labels_array = g_strsplit(labels, ",", -1);
    572  gchar **text_array = g_strsplit(text, ",", -1);
    573 
    574  for (int t = 0; (NULL != text_array[t]); t++) {
    575  if (0 == strlen(text_array[t])) {
    576  continue;
    577  }
    578 
    579  gboolean text_result = FALSE;
    580 
    581  for (int l = 0; (NULL != labels_array[l]); l++) {
    582  if (0 == strlen(labels_array[l])) {
    583  continue;
    584  }
    585 
    586  text_result = (text_result || strstr(labels_array[l], text_array[t]));
    587 
    588  if (text_result) {
    589  break;
    590  }
    591  }
    592 
    593  labels_result = (labels_result && text_result);
    594 
    595  if (!labels_result) {
    596  break;
    597  }
    598  }
    599 
    600  result = (result || labels_result);
    601 
    602  g_strfreev(labels_array);
    603  g_strfreev(text_array);
    604  }
    605  }
    606  g_free(protocol);
    607  g_free(name);
    608  g_free(labels);
    609  g_free(group);
    610  g_free(server);
    611  g_free(plugin);
    612  g_free(date);
    613  }
    614  g_free(text);
    615  return result;
    616 }
    617 
    618 static void remmina_main_select_file(const gchar *filename)
    619 {
    620  TRACE_CALL(__func__);
    621  GtkTreeIter iter;
    622  GtkTreePath *path;
    623  gchar *item_filename;
    624  gboolean cmp;
    625 
    626  if (!gtk_tree_model_get_iter_first(remminamain->priv->file_model_sort, &iter))
    627  return;
    628 
    629  while (TRUE) {
    630  gtk_tree_model_get(remminamain->priv->file_model_sort, &iter, FILENAME_COLUMN, &item_filename, -1);
    631  cmp = g_strcmp0(item_filename, filename);
    632  g_free(item_filename);
    633  if (cmp == 0) {
    634  gtk_tree_selection_select_iter(gtk_tree_view_get_selection(remminamain->tree_files_list),
    635  &iter);
    636  path = gtk_tree_model_get_path(remminamain->priv->file_model_sort, &iter);
    637  gtk_tree_view_scroll_to_cell(remminamain->tree_files_list, path, NULL, TRUE, 0.5, 0.0);
    638  gtk_tree_path_free(path);
    639  return;
    640  }
    641  if (!gtk_tree_model_iter_next(remminamain->priv->file_model_sort, &iter))
    642  return;
    643  }
    644 }
    645 
    647 {
    648  TRACE_CALL(__func__);
    649  gint items_count;
    650  gchar buf[200];
    651  guint context_id;
    652  gint view_file_mode;
    653  gboolean always_show_notes;
    654  char *save_selected_filename;
    655  GtkTreeModel *newmodel;
    656  const gchar *neticon;
    657  const gchar *connection_tooltip;
    658 
    659  save_selected_filename = g_strdup(remminamain->priv->selected_filename);
    661 
    662  view_file_mode = remmina_pref.view_file_mode;
    663  if (remminamain->priv->override_view_file_mode_to_list)
    664  view_file_mode = REMMINA_VIEW_FILE_LIST;
    665 
    666  switch (remmina_pref.view_file_mode) {
    668  gtk_toggle_button_set_active(remminamain->view_toggle_button, FALSE);
    669  break;
    671  default:
    672  gtk_toggle_button_set_active(remminamain->view_toggle_button, TRUE);
    673  break;
    674  }
    675 
    676  switch (view_file_mode) {
    678  /* Create new GtkTreeStore model */
    679  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));
    680  /* Hide the Group column in the tree view mode */
    681  gtk_tree_view_column_set_visible(remminamain->column_files_list_group, FALSE);
    682  /* Load groups first */
    683  remmina_main_load_file_tree_group(GTK_TREE_STORE(newmodel));
    684  /* Load files list */
    685  items_count = remmina_file_manager_iterate((GFunc)remmina_main_load_file_tree_callback, (gpointer)newmodel);
    686  break;
    687 
    689  default:
    690  /* Create new GtkListStore model */
    691  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));
    692  /* Show the Group column in the list view mode */
    693  gtk_tree_view_column_set_visible(remminamain->column_files_list_group, TRUE);
    694  /* Load files list */
    695  items_count = remmina_file_manager_iterate((GFunc)remmina_main_load_file_list_callback, (gpointer)newmodel);
    696  break;
    697  }
    698 
    699  /* Set note column visibility*/
    700  always_show_notes = remmina_pref.always_show_notes;
    701  if (!always_show_notes){
    702  gtk_tree_view_column_set_visible(remminamain->column_files_list_notes, FALSE);
    703  }
    704 
    705  /* Unset old model */
    706  gtk_tree_view_set_model(remminamain->tree_files_list, NULL);
    707 
    708  /* Destroy the old model and save the new one */
    709  remminamain->priv->file_model = newmodel;
    710 
    711  /* Create a sorted filtered model based on newmodel and apply it to the TreeView */
    712  remminamain->priv->file_model_filter = gtk_tree_model_filter_new(remminamain->priv->file_model, NULL);
    713  gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(remminamain->priv->file_model_filter),
    714  (GtkTreeModelFilterVisibleFunc)remmina_main_filter_visible_func, NULL, NULL);
    715  remminamain->priv->file_model_sort = gtk_tree_model_sort_new_with_model(remminamain->priv->file_model_filter);
    716  gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(remminamain->priv->file_model_sort),
    719  gtk_tree_view_set_model(remminamain->tree_files_list, remminamain->priv->file_model_sort);
    720  g_signal_connect(G_OBJECT(remminamain->priv->file_model_sort), "sort-column-changed",
    721  G_CALLBACK(remmina_main_file_model_on_sort), NULL);
    723  /* Select the file previously selected */
    724  if (save_selected_filename) {
    725  remmina_main_select_file(save_selected_filename);
    726  g_free(save_selected_filename);
    727  }
    728  gtk_tree_view_column_set_widget(remminamain->column_files_list_date, NULL);
    729 
    730  GtkWidget *label = gtk_tree_view_column_get_button(remminamain->column_files_list_date);
    731 
    732  gtk_widget_set_tooltip_text(GTK_WIDGET(label),
    733  _("The latest successful connection attempt, or a pre-computed date"));
    734  /* Show in the status bar the total number of connections found */
    735  g_snprintf(buf, sizeof(buf), ngettext("Total %i item.", "Total %i items.", items_count), items_count);
    736  context_id = gtk_statusbar_get_context_id(remminamain->statusbar_main, "status");
    737  gtk_statusbar_pop(remminamain->statusbar_main, context_id);
    738  gtk_statusbar_push(remminamain->statusbar_main, context_id, buf);
    739 
    741  if (remminamain->monitor->connected){
    742  neticon = g_strdup("network-transmit-receive-symbolic");
    743  connection_tooltip = g_strdup(_("Network status: fully online"));
    744  } else {
    745  neticon = g_strdup("network-offline-symbolic");
    746  connection_tooltip = g_strdup(_("Network status: offline"));
    747  }
    748 
    749  if (GTK_IS_WIDGET(remminamain->network_icon))
    750  gtk_widget_destroy(remminamain->network_icon);
    751  GIcon *icon = g_themed_icon_new (neticon);
    752  remminamain->network_icon = gtk_image_new_from_gicon (icon, GTK_ICON_SIZE_BUTTON);
    753  gtk_widget_set_tooltip_text (remminamain->network_icon, connection_tooltip);
    754 
    755  g_object_unref (icon);
    756 
    757  gtk_box_pack_start (GTK_BOX(remminamain->statusbar_main), remminamain->network_icon, FALSE, FALSE, 0);
    758  gtk_widget_show (remminamain->network_icon);
    759 
    760 }
    761 
    762 void remmina_main_load_files_cb(GtkEntry *entry, char *string, gpointer user_data)
    763 {
    764  TRACE_CALL(__func__);
    766 }
    767 
    768 void remmina_main_on_action_connection_connect(GSimpleAction *action, GVariant *param, gpointer data)
    769 {
    770  TRACE_CALL(__func__);
    771 
    772  RemminaFile *remminafile;
    773 
    774  if (!remminamain->priv->selected_filename)
    775  return;
    776 
    777  remminafile = remmina_file_load(remminamain->priv->selected_filename);
    778 
    779  if (remminafile == NULL)
    780  return;
    781 
    782  if (remmina_pref_get_boolean("use_primary_password")
    783  && remmina_pref_get_boolean("lock_connect")
    784  && remmina_unlock_new(remminamain->window) == 0)
    785  return;
    786  if (remmina_file_get_int (remminafile, "profile-lock", FALSE) == 1
    787  && remmina_unlock_new(remminamain->window) == 0)
    788  return;
    789 
    790  remmina_file_touch(remminafile);
    792 
    793  remmina_file_free(remminafile);
    794 }
    795 
    796 void remmina_main_on_action_connection_external_tools(GSimpleAction *action, GVariant *param, gpointer data)
    797 {
    798  TRACE_CALL(__func__);
    799  if (!remminamain->priv->selected_filename)
    800  return;
    801 
    802  remmina_external_tools_from_filename(remminamain, remminamain->priv->selected_filename);
    803 }
    804 
    805 static void remmina_main_file_editor_destroy(GtkWidget *widget, gpointer user_data)
    806 {
    807  TRACE_CALL(__func__);
    808 
    809  if (!remminamain)
    810  return;
    812 }
    813 
    814 void remmina_main_on_action_application_mpchange(GSimpleAction *action, GVariant *param, gpointer data)
    815 {
    816  TRACE_CALL(__func__);
    817  RemminaFile *remminafile;
    818 
    819  const gchar *username;
    820  const gchar *domain;
    821  const gchar *group;
    822  const gchar *gatewayusername;
    823  const gchar *gatewaydomain;
    824 
    825  username = domain = group = gatewayusername = gatewaydomain = "";
    826 
    827  remminafile = NULL;
    828 
    829  if (remmina_pref_get_boolean("use_primary_password")
    830  && remmina_pref_get_boolean("lock_edit")
    831  && remmina_unlock_new(remminamain->window) == 0)
    832  return;
    833 
    834  if (remminamain->priv->selected_filename) {
    835  remminafile = remmina_file_load(remminamain->priv->selected_filename);
    836  if (remminafile != NULL) {
    837  username = remmina_file_get_string(remminafile, "username");
    838  domain = remmina_file_get_string(remminafile, "domain");
    839  group = remmina_file_get_string(remminafile, "group");
    840  gatewayusername = remmina_file_get_string(remminafile, "gateway_username");
    841  gatewaydomain = remmina_file_get_string(remminafile, "gateway_domain");
    842  }
    843  }
    844 
    845  remmina_mpchange_schedule(TRUE, group, domain, username, "", gatewayusername, gatewaydomain, "");
    846 
    847  if (remminafile != NULL)
    848  remmina_file_free(remminafile);
    849 }
    850 
    851 void remmina_main_on_action_connection_new(GSimpleAction *action, GVariant *param, gpointer data)
    852 {
    853  TRACE_CALL(__func__);
    854  if (kioskmode && kioskmode == TRUE)
    855  return;
    856  GtkWidget *widget;
    857 
    858  if (remmina_pref_get_boolean("use_primary_password")
    859  && remmina_pref_get_boolean("lock_edit")
    860  && remmina_unlock_new(remminamain->window) == 0)
    861  return;
    862 
    863  widget = remmina_file_editor_new();
    864  g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(remmina_main_file_editor_destroy), remminamain);
    865  gtk_window_set_transient_for(GTK_WINDOW(widget), remminamain->window);
    866  gtk_widget_show(widget);
    868 }
    869 
    870 static gboolean remmina_main_search_key_event(GtkWidget *search_entry, GdkEventKey *event, gpointer user_data)
    871 {
    872  TRACE_CALL(__func__);
    873  if (event->keyval == GDK_KEY_Escape) {
    874  gtk_entry_set_text(remminamain->entry_quick_connect_server, "");
    875  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(RM_GET_OBJECT("search_toggle")), FALSE);
    876  return TRUE;
    877  }
    878  return FALSE;
    879 }
    880 
    881 static gboolean remmina_main_tree_row_activated(GtkTreeView *tree, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
    882 {
    883  TRACE_CALL(__func__);
    884  if (gtk_tree_view_row_expanded(tree, path))
    885  gtk_tree_view_collapse_row(tree, path);
    886  else
    887  gtk_tree_view_expand_row(tree, path, FALSE);
    888  return TRUE;
    889 }
    890 
    892 {
    893  if (gtk_toggle_button_get_active(remminamain->view_toggle_button)) {
    896  gtk_entry_set_text(remminamain->entry_quick_connect_server, "");
    899  }
    900  } else {
    903  gtk_entry_set_text(remminamain->entry_quick_connect_server, "");
    906  }
    907  }
    908 }
    909 
    910 void remmina_main_on_action_connection_copy(GSimpleAction *action, GVariant *param, gpointer data)
    911 {
    912  TRACE_CALL(__func__);
    913  GtkWidget *widget;
    914 
    915  if (remmina_pref_get_boolean("use_primary_password")
    916  && remmina_unlock_new(remminamain->window) == 0)
    917  return;
    918 
    919  if (!remminamain->priv->selected_filename)
    920  return;
    921 
    922  RemminaFile *remminafile = remmina_file_load(remminamain->priv->selected_filename);
    923 
    924  if (((remmina_pref_get_boolean("lock_edit")
    925  && remmina_pref_get_boolean("use_primary_password"))
    926  || remmina_file_get_int (remminafile, "profile-lock", FALSE))
    927  && remmina_unlock_new(remminamain->window) == 0)
    928  return;
    929 
    930  if (remminafile) {
    931  remmina_file_free(remminafile);
    932  remminafile = NULL;
    933  }
    934 
    935  widget = remmina_file_editor_new_copy(remminamain->priv->selected_filename);
    936  if (widget) {
    937  g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(remmina_main_file_editor_destroy), remminamain);
    938  gtk_window_set_transient_for(GTK_WINDOW(widget), remminamain->window);
    939  gtk_widget_show(widget);
    940  }
    941  /* Select the file previously selected */
    942  if (remminamain->priv->selected_filename)
    944 }
    945 
    946 void remmina_main_on_action_connection_edit(GSimpleAction *action, GVariant *param, gpointer data)
    947 {
    948  TRACE_CALL(__func__);
    949  GtkWidget *widget;
    950 
    951  if (!remminamain->priv->selected_filename)
    952  return;
    953 
    954  RemminaFile *remminafile = remmina_file_load(remminamain->priv->selected_filename);
    955 
    956  if (remmina_pref_get_boolean("use_primary_password")
    957  && (remmina_pref_get_boolean("lock_edit")
    958  || remmina_file_get_int (remminafile, "profile-lock", FALSE))
    959  && remmina_unlock_new(remminamain->window) == 0)
    960  return;
    961 
    962  if (remminafile) {
    963  remmina_file_free(remminafile);
    964  remminafile = NULL;
    965  }
    966 
    968  if (widget) {
    969  gtk_window_set_transient_for(GTK_WINDOW(widget), remminamain->window);
    970  gtk_widget_show(widget);
    971  }
    972 /* Select the file previously selected */
    973  if (remminamain->priv->selected_filename)
    975 }
    976 
    977 void remmina_main_on_action_connection_delete(GSimpleAction *action, GVariant *param, gpointer data)
    978 {
    979  TRACE_CALL(__func__);
    980  GtkWidget *dialog;
    981 
    982  if (!remminamain->priv->selected_filename)
    983  return;
    984 
    985  RemminaFile *remminafile = remmina_file_load(remminamain->priv->selected_filename);
    986 
    987  if (((remmina_pref_get_boolean("lock_edit")
    988  && remmina_pref_get_boolean("use_primary_password"))
    989  || remmina_file_get_int (remminafile, "profile-lock", FALSE))
    990  && remmina_unlock_new(remminamain->window) == 0)
    991  return;
    992 
    993  if (remminafile) {
    994  remmina_file_free(remminafile);
    995  remminafile = NULL;
    996  }
    997 
    998  dialog = gtk_message_dialog_new(remminamain->window, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,
    999  _("Are you sure you want to delete “%s”?"), remminamain->priv->selected_name);
    1000  if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_YES) {
    1001  gchar *delfilename = g_strdup(remminamain->priv->selected_filename);
    1002  remmina_file_delete(delfilename);
    1003  g_free(delfilename), delfilename = NULL;
    1006  }
    1007  gtk_widget_destroy(dialog);
    1009 }
    1010 
    1011 void remmina_main_on_action_connection_delete_multiple(GSimpleAction *action, GVariant *param, gpointer data)
    1012 {
    1013  TRACE_CALL(__func__);
    1014  GtkWidget *dialog;
    1015  GtkTreeSelection *sel = gtk_tree_view_get_selection(remminamain->tree_files_list);
    1016  GtkTreeModel *model = gtk_tree_view_get_model(remminamain->tree_files_list);
    1017  GList *list = gtk_tree_selection_get_selected_rows(sel, &model);
    1018  gchar *file_to_delete;
    1019 
    1020  dialog = gtk_message_dialog_new(remminamain->window, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,
    1021  _("Are you sure you want to delete the selected files?"));
    1022 
    1023  // Delete files if Yes is clicked
    1024  if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_YES) {
    1025  while (list) {
    1026  GtkTreePath *path = list->data;
    1027  GtkTreeIter iter;
    1028 
    1029  if (!gtk_tree_model_get_iter(model, &iter, path)) {
    1030  GtkWidget *dialog_warning;
    1031  dialog_warning = gtk_message_dialog_new(remminamain->window, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
    1032  _("Failed to delete files!"));
    1033  gtk_dialog_run(GTK_DIALOG(dialog_warning));
    1034  gtk_widget_destroy(dialog_warning);
    1035  gtk_widget_destroy(dialog);
    1037  return;
    1038  }
    1039 
    1040  gtk_tree_model_get(model, &iter,
    1041  FILENAME_COLUMN, &file_to_delete, -1);
    1042 
    1043  RemminaFile *remminafile = remmina_file_load(file_to_delete);
    1044 
    1045  if (((remmina_pref_get_boolean("lock_edit")
    1046  && remmina_pref_get_boolean("use_primary_password"))
    1047  || remmina_file_get_int (remminafile, "profile-lock", FALSE))
    1048  && remmina_unlock_new(remminamain->window) == 0)
    1049  return;
    1050 
    1051  if (remminafile) {
    1052  remmina_file_free(remminafile);
    1053  remminafile = NULL;
    1054  }
    1055 
    1056  gchar *delfilename = g_strdup(file_to_delete);
    1057  remmina_file_delete(delfilename);
    1058  g_free(delfilename), delfilename = NULL;
    1061  list = g_list_next(list);
    1062  }
    1063  }
    1064 
    1065  gtk_widget_destroy(dialog);
    1067 }
    1068 
    1069 void remmina_main_on_accel_application_preferences(GSimpleAction *action, GVariant *param, gpointer data)
    1070 {
    1071  TRACE_CALL(__func__);
    1072  GVariant *v = g_variant_new("i", 0);
    1073 
    1075 }
    1076 
    1078 {
    1079  GtkSettings *settings;
    1080  settings = gtk_settings_get_default();
    1081  g_object_set(settings, "gtk-application-prefer-dark-theme", remmina_pref.dark_theme, NULL);
    1082  remmina_main_on_action_search_toggle(NULL,NULL,NULL);
    1083  gtk_tree_view_column_set_visible(remminamain->column_files_list_notes, remmina_pref.always_show_notes);
    1084 }
    1085 
    1086 void remmina_main_on_action_application_preferences(GSimpleAction *action, GVariant *param, gpointer data)
    1087 {
    1088  TRACE_CALL(__func__);
    1089 
    1090  REMMINA_DEBUG("Opening the preferences");
    1091  gint32 tab_num;
    1092 
    1093  if (param) {
    1094  REMMINA_DEBUG("Parameter passed to preferences of type %s", g_variant_get_type_string(param));
    1095  tab_num = g_variant_get_int32(param);
    1096  REMMINA_DEBUG("We got a parameter for the preferences: %d", tab_num);
    1097  } else {
    1098  tab_num = 0;
    1099  }
    1100 
    1101  if (remmina_pref_get_boolean("use_primary_password")
    1102  && remmina_unlock_new(remminamain->window) == 0)
    1103  return;
    1104 
    1105  GtkWidget *widget = remmina_pref_dialog_new(tab_num, remminamain->window);
    1106 
    1107  gtk_widget_show_all(widget);
    1108  /* Reload to use new preferences */
    1110 }
    1111 
    1112 void remmina_main_on_action_application_default(GSimpleAction *action, GVariant *param, gpointer data)
    1113 {
    1114  TRACE_CALL(__func__);
    1115 #ifndef __APPLE__
    1116  g_autoptr(GError) error = NULL;
    1117  GDesktopAppInfo *desktop_info;
    1118  GAppInfo *info = NULL;
    1119  g_autofree gchar *id = g_strconcat(REMMINA_APP_ID, ".desktop", NULL);
    1120  int i;
    1121 
    1122  desktop_info = g_desktop_app_info_new(id);
    1123  if (!desktop_info)
    1124  return;
    1125 
    1126  info = G_APP_INFO(desktop_info);
    1127 
    1128  for (i = 0; supported_mime_types[i]; i++) {
    1129  if (!g_app_info_set_as_default_for_type(info, supported_mime_types[i], &error))
    1130  g_warning("Failed to set '%s' as the default application for secondary content type '%s': %s",
    1131  g_app_info_get_name(info), supported_mime_types[i], error->message);
    1132  else
    1133  g_debug("Set '%s' as the default application for '%s'",
    1134  g_app_info_get_name(info),
    1136  }
    1137 #endif
    1138 }
    1139 
    1140 void remmina_main_on_action_application_quit(GSimpleAction *action, GVariant *param, gpointer data)
    1141 {
    1142  // Called by quit signal in remmina_main.glade
    1143  TRACE_CALL(__func__);
    1144  g_debug("Quit intercept");
    1146 }
    1147 
    1149 {
    1152  gtk_entry_set_text(remminamain->entry_quick_connect_server, "");
    1155  }
    1156 }
    1157 
    1158 static void remmina_main_import_file_list(GSList *files)
    1159 {
    1160  TRACE_CALL(__func__);
    1161  GtkWidget *dlg;
    1162  GSList *element;
    1163  gchar *path;
    1164  RemminaFilePlugin *plugin;
    1165  GString *err;
    1166  RemminaFile *remminafile = NULL;
    1167  gboolean imported;
    1168 
    1169  err = g_string_new(NULL);
    1170  imported = FALSE;
    1171  for (element = files; element; element = element->next) {
    1172  path = (gchar *)element->data;
    1174  if (plugin && (remminafile = plugin->import_func(plugin, path)) != NULL && remmina_file_get_string(remminafile, "name")) {
    1175  remmina_file_generate_filename(remminafile);
    1176  remmina_file_save(remminafile);
    1177  imported = TRUE;
    1178  } else {
    1179  g_string_append(err, path);
    1180  g_string_append_c(err, '\n');
    1181  }
    1182  if (remminafile) {
    1183  remmina_file_free(remminafile);
    1184  remminafile = NULL;
    1185  }
    1186  g_free(path);
    1187  }
    1188  g_slist_free(files);
    1189  if (err->len > 0) {
    1190  // TRANSLATORS: The placeholder %s is an error message
    1191  dlg = gtk_message_dialog_new(remminamain->window, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
    1192  _("Unable to import:\n%s"), err->str);
    1193  g_signal_connect(G_OBJECT(dlg), "response", G_CALLBACK(gtk_widget_destroy), NULL);
    1194  gtk_widget_show(dlg);
    1195  }
    1196  g_string_free(err, TRUE);
    1197  if (imported)
    1199 }
    1200 
    1201 static void remmina_main_action_tools_import_on_response(GtkDialog *dialog, gint response_id, gpointer user_data)
    1202 {
    1203  TRACE_CALL(__func__);
    1204  GSList *files;
    1205 
    1206  if (response_id == GTK_RESPONSE_ACCEPT) {
    1207  files = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog));
    1209  }
    1210  gtk_widget_destroy(GTK_WIDGET(dialog));
    1211 }
    1212 
    1213 void remmina_main_on_action_tools_import(GSimpleAction *action, GVariant *param, gpointer data)
    1214 {
    1215  TRACE_CALL(__func__);
    1216  GtkWidget *dialog;
    1217 
    1218  dialog = gtk_file_chooser_dialog_new(_("Import"), remminamain->window, GTK_FILE_CHOOSER_ACTION_OPEN, "Import",
    1219  GTK_RESPONSE_ACCEPT, NULL);
    1220  gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), TRUE);
    1221  g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(remmina_main_action_tools_import_on_response), NULL);
    1222  gtk_widget_show(dialog);
    1223 }
    1224 
    1225 void remmina_main_on_action_tools_export(GSimpleAction *action, GVariant *param, gpointer data)
    1226 {
    1227  TRACE_CALL(__func__);
    1228  RemminaFilePlugin *plugin;
    1229  RemminaFile *remminafile;
    1230  GtkWidget *dialog;
    1231 
    1232  if (!remminamain->priv->selected_filename)
    1233  return;
    1234 
    1235  remminafile = remmina_file_load(remminamain->priv->selected_filename);
    1236  if (remminafile == NULL)
    1237  return;
    1238  plugin = remmina_plugin_manager_get_export_file_handler(remminafile);
    1239  if (plugin) {
    1240  dialog = gtk_file_chooser_dialog_new(plugin->export_hints, remminamain->window,
    1241  GTK_FILE_CHOOSER_ACTION_SAVE, _("_Save"), GTK_RESPONSE_ACCEPT, NULL);
    1242  if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
    1243  plugin->export_func(plugin, remminafile, gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)));
    1244  gtk_widget_destroy(dialog);
    1245  } else {
    1246  dialog = gtk_message_dialog_new(remminamain->window, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
    1247  _("This protocol does not support exporting."));
    1248  g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(gtk_widget_destroy), NULL);
    1249  gtk_widget_show(dialog);
    1250  }
    1251  remmina_file_free(remminafile);
    1252 }
    1253 
    1254 void remmina_main_on_action_application_plugins(GSimpleAction *action, GVariant *param, gpointer data)
    1255 {
    1256  TRACE_CALL(__func__);
    1257  remmina_plugin_manager_show(remminamain->window);
    1258 }
    1259 
    1260 void remmina_main_on_action_application_dark_theme(GSimpleAction *action, GVariant *param, gpointer data)
    1261 {
    1262  TRACE_CALL(__func__);
    1263  GtkSettings *settings;
    1264 
    1265  settings = gtk_settings_get_default();
    1266 
    1267  if (gtk_switch_get_active(remminamain->switch_dark_mode))
    1269  else
    1272 
    1273  g_object_set(settings, "gtk-application-prefer-dark-theme", remmina_pref.dark_theme, NULL);
    1274 }
    1275 
    1276 void remmina_main_on_action_help_homepage(GSimpleAction *action, GVariant *param, gpointer data)
    1277 {
    1278  TRACE_CALL(__func__);
    1279  g_app_info_launch_default_for_uri("https://www.remmina.org", NULL, NULL);
    1280 }
    1281 
    1282 void remmina_main_on_action_help_wiki(GSimpleAction *action, GVariant *param, gpointer data)
    1283 {
    1284  TRACE_CALL(__func__);
    1285  g_app_info_launch_default_for_uri("https://gitlab.com/Remmina/Remmina/wikis/home", NULL, NULL);
    1286 }
    1287 
    1288 void remmina_main_on_action_help_community(GSimpleAction *action, GVariant *param, gpointer data)
    1289 {
    1290  TRACE_CALL(__func__);
    1291  g_app_info_launch_default_for_uri("https://remmina.org/community", NULL, NULL);
    1292 }
    1293 
    1294 void remmina_main_on_action_help_donations(GSimpleAction *action, GVariant *param, gpointer data)
    1295 {
    1296  TRACE_CALL(__func__);
    1297  g_app_info_launch_default_for_uri("https://www.remmina.org/donations", NULL, NULL);
    1298 }
    1299 
    1300 void remmina_main_on_action_help_debug(GSimpleAction *action, GVariant *param, gpointer data)
    1301 {
    1302  TRACE_CALL(__func__);
    1304 }
    1305 
    1306 void remmina_main_on_action_application_about(GSimpleAction *action, GVariant *param, gpointer data)
    1307 {
    1308  TRACE_CALL(__func__);
    1309  remmina_about_open(remminamain->window);
    1310 };
    1311 
    1312 static gboolean is_empty(const gchar *s)
    1313 {
    1314  if (s == NULL)
    1315  return TRUE;
    1316  while (*s != 0) {
    1317  if (!isspace((unsigned char)*s))
    1318  return FALSE;
    1319  s++;
    1320  }
    1321  return TRUE;
    1322 }
    1323 
    1324 static gboolean remmina_main_quickconnect(void)
    1325 {
    1326  TRACE_CALL(__func__);
    1327  RemminaFile *remminafile;
    1328  gchar *server;
    1329  gchar *server_trimmed;
    1330  gchar *qcp;
    1331 
    1332 
    1333  /* Save quick connect protocol if different from the previous one */
    1334  qcp = gtk_combo_box_text_get_active_text(remminamain->combo_quick_connect_protocol);
    1335  if (qcp && strcmp(qcp, remmina_pref.last_quickconnect_protocol) != 0) {
    1337  remmina_pref.last_quickconnect_protocol = g_strdup(qcp);
    1339  }
    1340 
    1341  remminafile = remmina_file_new();
    1342  server = g_strdup(gtk_entry_get_text(remminamain->entry_quick_connect_server));
    1343  if (g_hostname_to_ascii(server) == NULL)
    1344  return FALSE;
    1345  /* If server contain /, e.g. vnc://, it won't connect
    1346  * We could search for an array of invalid characters, but
    1347  * it's better to find a way to correctly parse and validate addresses
    1348  */
    1349  if (g_strrstr(server, "/") != NULL)
    1350  return FALSE;
    1351  //if (g_str_has_suffix (server, "/"))
    1352  //return FALSE;
    1353  if (is_empty(server))
    1354  return FALSE;
    1355 
    1356  /* check if server is an IP address and trim whitespace if so */
    1357  server_trimmed = g_strdup(server);
    1358  g_strstrip(server_trimmed);
    1359  gchar **strings = g_strsplit(server_trimmed, ":", 2);
    1360 
    1361  if (strings[0] != NULL)
    1362  if (g_hostname_is_ip_address(strings[0]))
    1363  g_stpcpy(server, server_trimmed);
    1364 
    1365  remmina_file_set_string(remminafile, "sound", "off");
    1366  remmina_file_set_string(remminafile, "server", server);
    1367  remmina_file_set_string(remminafile, "name", server);
    1368  remmina_file_set_string(remminafile, "protocol", qcp);
    1369  g_free(server);
    1370  g_free(server_trimmed);
    1371  g_free(qcp);
    1372 
    1373  rcw_open_from_file(remminafile);
    1374 
    1375  return FALSE;
    1376 }
    1377 
    1378 gboolean remmina_main_quickconnect_on_click(GtkWidget *widget, gpointer user_data)
    1379 {
    1380  TRACE_CALL(__func__);
    1381  if (!kioskmode && kioskmode == FALSE)
    1382  return remmina_main_quickconnect();
    1383  return FALSE;
    1384 }
    1385 
    1386 /* Select all the text inside the quick search box if there is anything */
    1387 void remmina_main_quick_search_enter(GtkWidget *widget, gpointer user_data)
    1388 {
    1389  if (gtk_entry_get_text(remminamain->entry_quick_connect_server))
    1390  gtk_editable_select_region(GTK_EDITABLE(remminamain->entry_quick_connect_server), 0, -1);
    1391 }
    1392 
    1393 void remmina_main_on_action_collapse(GSimpleAction *action, GVariant *param, gpointer data)
    1394 {
    1395  TRACE_CALL(__func__);
    1396  gtk_tree_view_collapse_all(remminamain->tree_files_list);
    1397 }
    1398 
    1399 void remmina_main_on_action_search_toggle(GSimpleAction *action, GVariant *param, gpointer data)
    1400 {
    1401  TRACE_CALL(__func__);
    1402  REMMINA_DEBUG("Search toggle triggered");
    1403  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remminamain->search_toggle), !remmina_pref.hide_searchbar);
    1404 
    1405  gboolean toggle_status = gtk_toggle_button_get_active(remminamain->search_toggle);
    1406 
    1407  gtk_search_bar_set_search_mode(remminamain->search_bar, toggle_status);
    1408  if (toggle_status) {
    1409  REMMINA_DEBUG("Search toggle is active");
    1410  gtk_widget_grab_focus(GTK_WIDGET(remminamain->entry_quick_connect_server));
    1411  } else {
    1412  REMMINA_DEBUG("Search toggle is not active, focus is tree_files_list");
    1413  gtk_widget_grab_focus(GTK_WIDGET(remminamain->tree_files_list));
    1414  }
    1415 }
    1416 
    1418 {
    1419  TRACE_CALL(__func__);
    1420  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remminamain->search_toggle), TRUE);
    1421 }
    1422 
    1423 void remmina_main_on_action_expand(GSimpleAction *action, GVariant *param, gpointer data)
    1424 {
    1425  TRACE_CALL(__func__);
    1426  gtk_tree_view_expand_all(remminamain->tree_files_list);
    1427 }
    1428 
    1429 /* Handle double click on a row in the connections list */
    1430 void remmina_main_file_list_on_row_activated(GtkTreeView *tree, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
    1431 {
    1432  TRACE_CALL(__func__);
    1433 /* If a connection was selected then execute the default action */
    1434  if (remminamain->priv->selected_filename) {
    1435  switch (remmina_pref.default_action) {
    1436  case REMMINA_ACTION_EDIT:
    1437  remmina_main_on_action_connection_edit(NULL, NULL, NULL);
    1438  break;
    1440  default:
    1442  break;
    1443  }
    1444  }
    1445 }
    1446 
    1447 /* Show the popup menu by the right button mouse click */
    1448 gboolean remmina_main_file_list_on_button_press(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
    1449 {
    1450  TRACE_CALL(__func__);
    1451  if (event->button == MOUSE_BUTTON_RIGHT) {
    1452  if (!kioskmode && kioskmode == FALSE) {
    1453 #if GTK_CHECK_VERSION(3, 22, 0)
    1454  // For now, if more than one selected row, display only a delete menu option
    1455  if (gtk_tree_selection_count_selected_rows(gtk_tree_view_get_selection(remminamain->tree_files_list)) > 1) {
    1456  gtk_menu_popup_at_pointer(GTK_MENU(remminamain->menu_popup_delete_rc), (GdkEvent *)event);
    1457  return GDK_EVENT_STOP;
    1458  }
    1459  else {
    1460  gtk_menu_popup_at_pointer(GTK_MENU(remminamain->menu_popup), (GdkEvent *)event);
    1461  }
    1462 #else
    1463  gtk_menu_popup(remminamain->menu_popup, NULL, NULL, NULL, NULL, event->button, event->time);
    1464 #endif
    1465  }
    1466  }
    1467  return FALSE;
    1468 }
    1469 
    1470 /* Show the popup menu by the menu key */
    1471 gboolean remmina_main_file_list_on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
    1472 {
    1473  TRACE_CALL(__func__);
    1474  if (event->keyval == GDK_KEY_Menu) {
    1475 #if GTK_CHECK_VERSION(3, 22, 0)
    1476  gtk_menu_popup_at_widget(GTK_MENU(remminamain->menu_popup), widget,
    1477  GDK_GRAVITY_CENTER, GDK_GRAVITY_CENTER,
    1478  (GdkEvent *)event);
    1479 #else
    1480  gtk_menu_popup(remminamain->menu_popup, NULL, NULL, NULL, NULL, 0, event->time);
    1481 #endif
    1482  }
    1483  return FALSE;
    1484 }
    1485 
    1486 void remmina_main_quick_search_on_icon_press(GtkEntry *entry, GtkEntryIconPosition icon_pos, GdkEvent *event, gpointer user_data)
    1487 {
    1488  TRACE_CALL(__func__);
    1489  if (icon_pos == GTK_ENTRY_ICON_SECONDARY)
    1490  gtk_entry_set_text(entry, "");
    1491 }
    1492 
    1493 void remmina_main_quick_search_on_changed(GtkEditable *editable, gpointer user_data)
    1494 {
    1495  TRACE_CALL(__func__);
    1496  /* If a search text was input then temporary set the file mode to list */
    1497  if (gtk_entry_get_text_length(remminamain->entry_quick_connect_server)) {
    1498  if (GTK_IS_TREE_STORE(remminamain->priv->file_model)) {
    1499  /* File view mode changed, put it to override and reload list */
    1500  remminamain->priv->override_view_file_mode_to_list = TRUE;
    1502  }
    1503  } else {
    1504  if (remminamain->priv->override_view_file_mode_to_list) {
    1505  /* File view mode changed, put it to default (disable override) and reload list */
    1506  remminamain->priv->override_view_file_mode_to_list = FALSE;
    1508  }
    1509  }
    1510  gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(remminamain->priv->file_model_filter));
    1511 }
    1512 
    1513 void remmina_main_on_drag_data_received(GtkWidget *widget, GdkDragContext *drag_context, gint x, gint y,
    1514  GtkSelectionData *data, guint info, guint time, gpointer user_data)
    1515 {
    1516  TRACE_CALL(__func__);
    1517  gchar **uris;
    1518  GSList *files = NULL;
    1519  gint i;
    1520 
    1521  uris = g_uri_list_extract_uris((const gchar *)gtk_selection_data_get_data(data));
    1522  for (i = 0; uris[i]; i++) {
    1523  if (strncmp(uris[i], "file://", 7) != 0)
    1524  continue;
    1525  files = g_slist_append(files, g_strdup(uris[i] + 7));
    1526  }
    1527  g_strfreev(uris);
    1529 }
    1530 
    1531 /* Add a new menuitem to the Tools menu */
    1532 static gboolean remmina_main_add_tool_plugin(gchar *name, RemminaPlugin *plugin, gpointer user_data)
    1533 {
    1534  TRACE_CALL(__func__);
    1535  RemminaToolPlugin *tool_plugin = (RemminaToolPlugin *)plugin;
    1536  GtkWidget *menuitem = gtk_menu_item_new_with_label(plugin->description);
    1537 
    1538  gtk_widget_show(menuitem);
    1539  gtk_menu_shell_append(GTK_MENU_SHELL(remminamain->menu_popup_full), menuitem);
    1540  g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(tool_plugin->exec_func), tool_plugin);
    1541  return FALSE;
    1542 }
    1543 
    1544 gboolean remmina_main_on_window_state_event(GtkWidget *widget, GdkEventWindowState *event, gpointer user_data)
    1545 {
    1546  TRACE_CALL(__func__);
    1547  return FALSE;
    1548 }
    1549 
    1550 /* Remmina main window initialization */
    1551 static void remmina_main_init(void)
    1552 {
    1553  TRACE_CALL(__func__);
    1554  int i, qcp_idx, qcp_actidx;
    1555  char *name;
    1556  GtkSettings *settings;
    1557 
    1558  REMMINA_DEBUG("Initializing the Remmina main window");
    1559  /* Switch to a dark theme if the user enabled it */
    1560  settings = gtk_settings_get_default();
    1561  g_object_set(settings, "gtk-application-prefer-dark-theme", remmina_pref.dark_theme, NULL);
    1562 
    1563  REMMINA_DEBUG ("Initializing monitor");
    1564  remminamain->monitor = remmina_network_monitor_new();
    1565 
    1567  if (!kioskmode && kioskmode == FALSE)
    1568  gtk_window_set_title(remminamain->window, _("Remmina Remote Desktop Client"));
    1569  else
    1570  gtk_window_set_title(remminamain->window, _("Remmina Kiosk"));
    1571  if (!kioskmode && kioskmode == FALSE) {
    1572  gtk_window_set_default_size(remminamain->window, remmina_pref.main_width, remmina_pref.main_height);
    1574  gtk_window_maximize(remminamain->window);
    1575  }
    1576  /* Honor global preferences Search Bar visibility */
    1578  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(RM_GET_OBJECT("search_toggle")), FALSE);
    1579 
    1580  /* Add a GtkMenuItem to the Tools menu for each plugin of type REMMINA_PLUGIN_TYPE_TOOL */
    1582 
    1583  /* Add available quick connect protocols to remminamain->combo_quick_connect_protocol */
    1584  qcp_idx = qcp_actidx = 0;
    1585  for (i = 0; i < sizeof(quick_connect_plugin_list) / sizeof(quick_connect_plugin_list[0]); i++) {
    1586  name = quick_connect_plugin_list[i];
    1588  gtk_combo_box_text_append(remminamain->combo_quick_connect_protocol, name, name);
    1590  qcp_actidx = qcp_idx;
    1591  qcp_idx++;
    1592  }
    1593  }
    1594  gtk_combo_box_set_active(GTK_COMBO_BOX(remminamain->combo_quick_connect_protocol), qcp_actidx);
    1595 
    1596  /* Connect the group accelerators to the GtkWindow */
    1597  //gtk_window_add_accel_group(remminamain->window, remminamain->accelgroup_shortcuts);
    1598  /* Set the Quick Connection */
    1599  gtk_entry_set_activates_default(remminamain->entry_quick_connect_server, TRUE);
    1600  /* Set the TreeView for the files list */
    1601  gtk_tree_selection_set_select_function(
    1602  gtk_tree_view_get_selection(remminamain->tree_files_list),
    1603  remmina_main_selection_func, NULL, NULL);
    1605  gtk_tree_view_set_search_entry(remminamain->tree_files_list, GTK_ENTRY(remminamain->entry_quick_connect_server));
    1607  gtk_widget_grab_focus(GTK_WIDGET(remminamain->tree_files_list));
    1608  /* Load the files list */
    1610 
    1611  /* Drag-n-drop support */
    1612  gtk_drag_dest_set(GTK_WIDGET(remminamain->window), GTK_DEST_DEFAULT_ALL, remmina_drop_types, 1, GDK_ACTION_COPY);
    1613 
    1614  /* Finish initialization */
    1615  remminamain->priv->initialized = TRUE;
    1616 
    1617  /* Register the window in remmina_widget_pool with GType=GTK_WINDOW and TAG=remmina-main-window */
    1618  g_object_set_data(G_OBJECT(remminamain->window), "tag", "remmina-main-window");
    1619  remmina_widget_pool_register(GTK_WIDGET(remminamain->window));
    1620 }
    1621 
    1622 /* Signal handler for "show" on remminamain->window */
    1623 void remmina_main_on_show(GtkWidget *w, gpointer user_data)
    1624 {
    1625  TRACE_CALL(__func__);
    1626 #ifdef SNAP_BUILD
    1628 #endif
    1629 }
    1630 
    1631 /* RemminaMain instance */
    1632 GtkWidget *remmina_main_new(void)
    1633 {
    1634  TRACE_CALL(__func__);
    1635  GSimpleActionGroup *actions;
    1636  GtkAccelGroup *accel_group = NULL;
    1637 
    1638  remminamain = g_new0(RemminaMain, 1);
    1639  remminamain->priv = g_new0(RemminaMainPriv, 1);
    1640  /* Assign UI widgets to the private members */
    1641  remminamain->builder = remmina_public_gtk_builder_new_from_resource("/org/remmina/Remmina/src/../data/ui/remmina_main.glade");
    1642  remminamain->window = GTK_WINDOW(RM_GET_OBJECT("RemminaMain"));
    1643  if (kioskmode && kioskmode == TRUE) {
    1644  gtk_window_set_position(remminamain->window, GTK_WIN_POS_CENTER_ALWAYS);
    1645  gtk_window_set_default_size(remminamain->window, 800, 400);
    1646  gtk_window_set_resizable(remminamain->window, FALSE);
    1647  }
    1648  /* New Button */
    1649  remminamain->button_new = GTK_BUTTON(RM_GET_OBJECT("button_new"));
    1650  if (kioskmode && kioskmode == TRUE)
    1651  gtk_widget_set_sensitive(GTK_WIDGET(remminamain->button_new), FALSE);
    1652  /* Search bar */
    1653  remminamain->search_toggle = GTK_TOGGLE_BUTTON(RM_GET_OBJECT("search_toggle"));
    1654  remminamain->search_bar = GTK_SEARCH_BAR(RM_GET_OBJECT("search_bar"));
    1655  /* view mode list/tree */
    1656  remminamain->view_toggle_button = GTK_TOGGLE_BUTTON(RM_GET_OBJECT("view_toggle_button"));
    1657  if (kioskmode && kioskmode == TRUE)
    1658  gtk_widget_set_sensitive(GTK_WIDGET(remminamain->view_toggle_button), FALSE);
    1659 
    1660  /* Menu widgets */
    1661  remminamain->menu_popup = GTK_MENU(RM_GET_OBJECT("menu_popup"));
    1662  remminamain->menu_header_button = GTK_MENU_BUTTON(RM_GET_OBJECT("menu_header_button"));
    1663  remminamain->menu_popup_full = GTK_MENU(RM_GET_OBJECT("menu_popup_full"));
    1664  remminamain->menu_popup_delete_rc = GTK_MENU(RM_GET_OBJECT("menu_popup_delete_rc"));
    1665  if (kioskmode && kioskmode == TRUE) {
    1666  gtk_widget_set_sensitive(GTK_WIDGET(remminamain->menu_popup_full), FALSE);
    1667  gtk_widget_set_sensitive(GTK_WIDGET(remminamain->menu_header_button), FALSE);
    1668  }
    1669  /* View mode radios */
    1670  remminamain->menuitem_view_mode_list = GTK_RADIO_MENU_ITEM(RM_GET_OBJECT("menuitem_view_mode_list"));
    1671  remminamain->menuitem_view_mode_tree = GTK_RADIO_MENU_ITEM(RM_GET_OBJECT("menuitem_view_mode_tree"));
    1672  /* Quick connect objects */
    1673  remminamain->box_quick_connect = GTK_BOX(RM_GET_OBJECT("box_quick_connect"));
    1674  remminamain->combo_quick_connect_protocol = GTK_COMBO_BOX_TEXT(RM_GET_OBJECT("combo_quick_connect_protocol"));
    1675  if (kioskmode && kioskmode == TRUE)
    1676  gtk_widget_set_sensitive(GTK_WIDGET(remminamain->combo_quick_connect_protocol), FALSE);
    1677  remminamain->entry_quick_connect_server = GTK_ENTRY(RM_GET_OBJECT("entry_quick_connect_server"));
    1678  /* Other widgets */
    1679  remminamain->tree_files_list = GTK_TREE_VIEW(RM_GET_OBJECT("tree_files_list"));
    1680  remminamain->column_files_list_name = GTK_TREE_VIEW_COLUMN(RM_GET_OBJECT("column_files_list_name"));
    1681  remminamain->column_files_list_group = GTK_TREE_VIEW_COLUMN(RM_GET_OBJECT("column_files_list_group"));
    1682  remminamain->column_files_list_server = GTK_TREE_VIEW_COLUMN(RM_GET_OBJECT("column_files_list_server"));
    1683  remminamain->column_files_list_plugin = GTK_TREE_VIEW_COLUMN(RM_GET_OBJECT("column_files_list_plugin"));
    1684  remminamain->column_files_list_date = GTK_TREE_VIEW_COLUMN(RM_GET_OBJECT("column_files_list_date"));
    1685  remminamain->column_files_list_notes = GTK_TREE_VIEW_COLUMN(RM_GET_OBJECT("column_files_list_notes"));
    1686  gtk_tree_view_column_set_fixed_width(remminamain->column_files_list_notes, 100);
    1687  remminamain->statusbar_main = GTK_STATUSBAR(RM_GET_OBJECT("statusbar_main"));
    1688  /* signals */
    1689  g_signal_connect(remminamain->entry_quick_connect_server, "key-release-event", G_CALLBACK(remmina_main_search_key_event), NULL);
    1690  g_signal_connect(remminamain->tree_files_list, "row-activated", G_CALLBACK(remmina_main_tree_row_activated), NULL);
    1691  /* Non widget objects */
    1692  actions = g_simple_action_group_new();
    1693  g_action_map_add_action_entries(G_ACTION_MAP(actions), app_actions, G_N_ELEMENTS(app_actions), remminamain->window);
    1694  gtk_widget_insert_action_group(GTK_WIDGET(remminamain->window), "app", G_ACTION_GROUP(actions));
    1695  g_action_map_add_action_entries(G_ACTION_MAP(actions), main_actions, G_N_ELEMENTS(main_actions), remminamain->window);
    1696  gtk_widget_insert_action_group(GTK_WIDGET(remminamain->window), "main", G_ACTION_GROUP(actions));
    1697  g_object_unref(actions);
    1698  /* Accelerators */
    1699  accel_group = gtk_accel_group_new();
    1700  gtk_window_add_accel_group(remminamain->window, accel_group);
    1701  gtk_accel_group_connect(accel_group, GDK_KEY_Q, GDK_CONTROL_MASK, 0,
    1702  g_cclosure_new_swap(G_CALLBACK(remmina_main_on_action_application_quit), NULL, NULL));
    1703  // TODO: This crash remmina because the function doesn't receive the parameter we expect
    1704  gtk_accel_group_connect(accel_group, GDK_KEY_P, GDK_CONTROL_MASK, 0,
    1705  g_cclosure_new_swap(G_CALLBACK(remmina_main_on_accel_application_preferences), NULL, NULL));
    1706  gtk_accel_group_connect(accel_group, GDK_KEY_F, GDK_CONTROL_MASK, 0,
    1707  g_cclosure_new_swap(G_CALLBACK(remmina_main_on_accel_search_toggle), remminamain, NULL));
    1708 
    1709  /* Connect signals */
    1710  gtk_builder_connect_signals(remminamain->builder, NULL);
    1711  /* Initialize the window and load the preferences */
    1713  return GTK_WIDGET(remminamain->window);
    1714 }
    1715 
    1717 {
    1718  if (!remminamain)
    1719  return NULL;
    1720  if (!remminamain->priv)
    1721  return NULL;
    1722  if (!remminamain->priv->initialized)
    1723  return NULL;
    1724  remminamain->window = GTK_WINDOW(RM_GET_OBJECT("RemminaMain"));
    1725  return remminamain->window;
    1726 }
    1727 
    1729 {
    1730  if (!remminamain)
    1731  return;
    1733 }
    1734 
    1735 void remmina_main_show_dialog(GtkMessageType msg, GtkButtonsType buttons, const gchar* message) {
    1736  GtkWidget *dialog;
    1737 
    1738  if (remminamain->window) {
    1739  dialog = gtk_message_dialog_new(remminamain->window, GTK_DIALOG_MODAL, msg, buttons, "%s", message);
    1740  gtk_dialog_run(GTK_DIALOG(dialog));
    1741  gtk_widget_destroy(dialog);
    1742  }
    1743 }
    1744 
    1745 void remmina_main_show_warning_dialog(const gchar *message) {
    1746  GtkWidget *dialog;
    1747 
    1748  if (remminamain->window) {
    1749  dialog = gtk_message_dialog_new(remminamain->window, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE,
    1750  message, g_get_application_name());
    1751  gtk_dialog_run(GTK_DIALOG(dialog));
    1752  gtk_widget_destroy(dialog);
    1753  }
    1754 }
    G_BEGIN_DECLS struct _RemminaGroupData RemminaGroupData
    RemminaFile * remmina_file_load(const gchar *filename)
    Definition: remmina_file.c:350
    static RemminaSecretPlugin * remmina_secret_plugin
    void remmina_log_start(void)
    Definition: remmina_log.c:116
    @@ -95,40 +95,41 @@ $(document).ready(function(){initNavTree('remmina__main_8c_source.html','');});
    void remmina_file_free(RemminaFile *remminafile)
    Definition: remmina_file.c:709
    -
    GtkToggleButton * search_toggle
    Definition: remmina_main.h:62
    +
    GtkToggleButton * search_toggle
    Definition: remmina_main.h:63
    const gchar * remmina_file_get_string(RemminaFile *remminafile, const gchar *setting)
    Definition: remmina_file.c:516
    -
    GtkRadioMenuItem * menuitem_view_mode_list
    Definition: remmina_main.h:55
    -
    static void remmina_main_load_file_tree_callback(RemminaFile *remminafile, gpointer user_data)
    Definition: remmina_main.c:482
    +
    GtkRadioMenuItem * menuitem_view_mode_list
    Definition: remmina_main.h:56
    +
    static void remmina_main_load_file_tree_callback(RemminaFile *remminafile, gpointer user_data)
    Definition: remmina_main.c:483
    -
    void remmina_main_on_action_help_homepage(GSimpleAction *action, GVariant *param, gpointer data)
    -
    GtkWidget * network_icon
    Definition: remmina_main.h:81
    +
    void remmina_main_on_action_help_homepage(GSimpleAction *action, GVariant *param, gpointer data)
    +
    GtkWidget * network_icon
    Definition: remmina_main.h:82
    gint default_action
    Definition: remmina_pref.h:141
    -
    static void remmina_main_show_snap_welcome()
    Definition: remmina_main.c:271
    -
    GtkWindow * remmina_main_get_window()
    -
    gchar * selected_filename
    Definition: remmina_main.h:95
    -
    GtkTreeModel * file_model
    Definition: remmina_main.h:89
    -
    static void remmina_main_save_expanded_group(void)
    Definition: remmina_main.c:163
    +
    static void remmina_main_show_snap_welcome()
    Definition: remmina_main.c:272
    +
    GtkWindow * remmina_main_get_window()
    +
    gchar * selected_filename
    Definition: remmina_main.h:96
    +
    GtkTreeModel * file_model
    Definition: remmina_main.h:90
    +
    static void remmina_main_save_expanded_group(void)
    Definition: remmina_main.c:164
    gboolean remmina_external_tools_from_filename(RemminaMain *remminamain, gchar *remminafilename)
    -
    RemminaMainPriv * priv
    Definition: remmina_main.h:84
    -
    void remmina_main_reload_preferences()
    +
    RemminaMainPriv * priv
    Definition: remmina_main.h:85
    +
    void remmina_main_reload_preferences()
    const gchar * remmina_file_get_filename(RemminaFile *remminafile)
    Definition: remmina_file.c:210
    -
    void remmina_main_on_action_connection_connect(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:767
    +
    void remmina_main_on_action_connection_connect(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:768
    typedefG_BEGIN_DECLS struct _RemminaFile RemminaFile
    Definition: types.h:44
    -
    GtkRadioMenuItem * menuitem_view_mode_tree
    Definition: remmina_main.h:56
    -
    GtkTreeViewColumn * column_files_list_name
    Definition: remmina_main.h:74
    +
    GtkRadioMenuItem * menuitem_view_mode_tree
    Definition: remmina_main.h:57
    +
    GtkTreeViewColumn * column_files_list_name
    Definition: remmina_main.h:75
    const gchar * export_hints
    Definition: plugin.h:111
    void remmina_plugin_manager_for_each_plugin(RemminaPluginType type, RemminaPluginFunc func, gpointer data)
    +
    GtkMenu * menu_popup_delete_rc
    Definition: remmina_main.h:55
    void remmina_widget_pool_register(GtkWidget *widget)
    gchar * last_quickconnect_protocol
    Definition: remmina_pref.h:227
    -
    gboolean remmina_main_file_list_on_button_press(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
    +
    gboolean remmina_main_file_list_on_button_press(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
    RemminaFile *(* import_func)(struct _RemminaFilePlugin *instance, const gchar *from_file)
    Definition: plugin.h:108
    -
    static gboolean remmina_main_filter_visible_func(GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
    Definition: remmina_main.c:526
    +
    static gboolean remmina_main_filter_visible_func(GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
    Definition: remmina_main.c:527
    gboolean remmina_network_monitor_status(RemminaMonitor *rm_monitor)
    RemminaFilePlugin * remmina_plugin_manager_get_export_file_handler(RemminaFile *remminafile)
    @@ -136,97 +137,98 @@ $(document).ready(function(){initNavTree('remmina__main_8c_source.html','');});
    void remmina_file_manager_free_group_tree(GNode *node)
    RemminaFilePlugin * remmina_plugin_manager_get_import_file_handler(const gchar *file)
    -
    static gboolean remmina_main_search_key_event(GtkWidget *search_entry, GdkEventKey *event, gpointer user_data)
    Definition: remmina_main.c:869
    -
    void remmina_main_on_action_tools_import(GSimpleAction *action, GVariant *param, gpointer data)
    +
    static gboolean remmina_main_search_key_event(GtkWidget *search_entry, GdkEventKey *event, gpointer user_data)
    Definition: remmina_main.c:870
    +
    void remmina_main_on_action_tools_import(GSimpleAction *action, GVariant *param, gpointer data)
    RemminaMonitor * remmina_network_monitor_new()
    RemminaSecretPlugin * remmina_plugin_manager_get_secret_plugin(void)
    -
    static void remmina_main_save_size(void)
    Save the Remmina Main Window size to assure the main geometry at each restart.
    Definition: remmina_main.c:138
    +
    static void remmina_main_save_size(void)
    Save the Remmina Main Window size to assure the main geometry at each restart.
    Definition: remmina_main.c:139
    -
    void remmina_main_on_action_application_mpchange(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:813
    +
    void remmina_main_on_action_application_mpchange(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:814
    static GActionEntry app_actions[]
    Definition: remmina_main.c:96
    void(* exec_func)(GtkMenuItem *item, struct _RemminaToolPlugin *instance)
    Definition: plugin.h:121
    -
    void remmina_main_on_view_toggle()
    Definition: remmina_main.c:890
    +
    void remmina_main_on_view_toggle()
    Definition: remmina_main.c:891
    gboolean(* is_service_available)(struct _RemminaSecretPlugin *instance)
    Definition: plugin.h:144
    void remmina_icon_populate_menu(void)
    Definition: remmina_icon.c:250
    +
    void remmina_main_on_action_connection_delete_multiple(GSimpleAction *action, GVariant *param, gpointer data)
    gchar * remmina_file_get_datetime(RemminaFile *remminafile)
    Return the string date of the last time a Remmina state file has been modified.
    -
    static void remmina_main_file_model_on_sort(GtkTreeSortable *sortable, gpointer user_data)
    Definition: remmina_main.c:514
    +
    static void remmina_main_file_model_on_sort(GtkTreeSortable *sortable, gpointer user_data)
    Definition: remmina_main.c:515
    -
    GtkWidget * remmina_main_new(void)
    -
    void remmina_main_on_action_help_debug(GSimpleAction *action, GVariant *param, gpointer 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)
    gchar * remmina_string_array_to_string(RemminaStringArray *array)
    -
    GtkSwitch * switch_dark_mode
    Definition: remmina_main.h:63
    -
    void remmina_main_on_destroy_event()
    Called when the remminamain->window widget is destroyed (glade event handler)
    Definition: remmina_main.c:247
    +
    GtkSwitch * switch_dark_mode
    Definition: remmina_main.h:64
    +
    void remmina_main_on_destroy_event()
    Called when the remminamain->window widget is destroyed (glade event handler)
    Definition: remmina_main.c:248
    node_t * node
    Definition: remmina_ssh.c:142
    void remmina_file_generate_filename(RemminaFile *remminafile)
    Generate a new Remmina connection profile file name.
    Definition: remmina_file.c:114
    -
    void remmina_main_save_before_destroy()
    Save the Remmina Main Window size and the expanded group before to close Remmina. ...
    Definition: remmina_main.c:179
    +
    void remmina_main_save_before_destroy()
    Save the Remmina Main Window size and the expanded group before to close Remmina. ...
    Definition: remmina_main.c:180
    const gchar * description
    Definition: plugin.h:59
    -
    void remmina_main_on_accel_application_preferences(GSimpleAction *action, GVariant *param, gpointer data)
    -
    static void remmina_main_load_file_list_callback(RemminaFile *remminafile, gpointer user_data)
    Definition: remmina_main.c:354
    -
    static gboolean remmina_main_load_file_tree_traverse(GNode *node, GtkTreeStore *store, GtkTreeIter *parent)
    Definition: remmina_main.c:379
    -
    GtkTreeModel * file_model_filter
    Definition: remmina_main.h:90
    -
    static gboolean remmina_main_load_file_tree_find(GtkTreeModel *tree, GtkTreeIter *iter, const gchar *match_group)
    Definition: remmina_main.c:454
    +
    void remmina_main_on_accel_application_preferences(GSimpleAction *action, GVariant *param, gpointer data)
    +
    static void remmina_main_load_file_list_callback(RemminaFile *remminafile, gpointer user_data)
    Definition: remmina_main.c:355
    +
    static gboolean remmina_main_load_file_tree_traverse(GNode *node, GtkTreeStore *store, GtkTreeIter *parent)
    Definition: remmina_main.c:380
    +
    GtkTreeModel * file_model_filter
    Definition: remmina_main.h:91
    +
    static gboolean remmina_main_load_file_tree_find(GtkTreeModel *tree, GtkTreeIter *iter, const gchar *match_group)
    Definition: remmina_main.c:455
    -
    gchar * selected_name
    Definition: remmina_main.h:96
    -
    void remmina_main_on_action_help_wiki(GSimpleAction *action, GVariant *param, gpointer data)
    -
    RemminaMonitor * monitor
    Definition: remmina_main.h:85
    +
    gchar * selected_name
    Definition: remmina_main.h:97
    +
    void remmina_main_on_action_help_wiki(GSimpleAction *action, GVariant *param, gpointer data)
    +
    RemminaMonitor * monitor
    Definition: remmina_main.h:86
    gint main_sort_order
    Definition: remmina_pref.h:221
    -
    void remmina_main_on_action_application_default(GSimpleAction *action, GVariant *param, gpointer data)
    +
    void remmina_main_on_action_application_default(GSimpleAction *action, GVariant *param, gpointer data)
    -
    void remmina_main_load_files_cb(GtkEntry *entry, char *string, gpointer user_data)
    Definition: remmina_main.c:761
    -
    gboolean remmina_main_on_window_state_event(GtkWidget *widget, GdkEventWindowState *event, gpointer user_data)
    +
    void remmina_main_load_files_cb(GtkEntry *entry, char *string, gpointer user_data)
    Definition: remmina_main.c:762
    +
    gboolean remmina_main_on_window_state_event(GtkWidget *widget, GdkEventWindowState *event, gpointer user_data)
    -
    void remmina_main_update_file_datetime(RemminaFile *file)
    +
    void remmina_main_update_file_datetime(RemminaFile *file)
    GtkMenuButton * menu_header_button
    Definition: remmina_main.h:53
    -
    static void remmina_main_load_file_tree_group(GtkTreeStore *store)
    Definition: remmina_main.c:406
    -
    void remmina_main_on_action_connection_copy(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:909
    +
    static void remmina_main_load_file_tree_group(GtkTreeStore *store)
    Definition: remmina_main.c:407
    +
    void remmina_main_on_action_connection_copy(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:910
    void remmina_plugin_manager_show(GtkWindow *parent)
    -
    static void remmina_main_import_file_list(GSList *files)
    +
    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_collapse(GSimpleAction *action, GVariant *param, gpointer data)
    GtkMenu * menu_popup
    Definition: remmina_main.h:52
    -
    gboolean remmina_main_idle_destroy(gpointer data)
    Definition: remmina_main.c:234
    -
    static gboolean remmina_main_tree_row_activated(GtkTreeView *tree, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
    Definition: remmina_main.c:880
    -
    void remmina_main_on_action_help_donations(GSimpleAction *action, GVariant *param, gpointer data)
    +
    gboolean remmina_main_idle_destroy(gpointer data)
    Definition: remmina_main.c:235
    +
    static gboolean remmina_main_tree_row_activated(GtkTreeView *tree, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
    Definition: remmina_main.c:881
    +
    void remmina_main_on_action_help_donations(GSimpleAction *action, GVariant *param, gpointer data)
    -
    void remmina_main_show_dialog(GtkMessageType msg, GtkButtonsType buttons, const gchar *message)
    -
    gboolean initialized
    Definition: remmina_main.h:93
    +
    void remmina_main_show_dialog(GtkMessageType msg, GtkButtonsType buttons, const gchar *message)
    +
    gboolean initialized
    Definition: remmina_main.h:94
    -
    GtkComboBoxText * combo_quick_connect_protocol
    Definition: remmina_main.h:69
    +
    GtkComboBoxText * combo_quick_connect_protocol
    Definition: remmina_main.h:70
    gboolean prevent_snap_welcome_message
    Definition: remmina_pref.h:226
    gchar * expanded_group
    Definition: remmina_pref.h:222
    -
    GtkBox * box_quick_connect
    Definition: remmina_main.h:68
    -
    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)
    -
    GtkTreeViewColumn * column_files_list_server
    Definition: remmina_main.h:76
    -
    void remmina_main_show_warning_dialog(const gchar *message)
    -
    void remmina_main_on_action_connection_new(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:850
    -
    void remmina_main_quick_search_enter(GtkWidget *widget, gpointer user_data)
    +
    GtkBox * box_quick_connect
    Definition: remmina_main.h:69
    +
    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)
    +
    GtkTreeViewColumn * column_files_list_server
    Definition: remmina_main.h:77
    +
    void remmina_main_show_warning_dialog(const gchar *message)
    +
    void remmina_main_on_action_connection_new(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:851
    +
    void remmina_main_quick_search_enter(GtkWidget *widget, gpointer user_data)
    void remmina_file_delete(const gchar *filename)
    Definition: remmina_file.c:909
    -
    GtkButton * button_new
    Definition: remmina_main.h:59
    +
    GtkButton * button_new
    Definition: remmina_main.h:60
    GtkMenu * menu_popup_full
    Definition: remmina_main.h:54
    void remmina_string_array_free(RemminaStringArray *array)
    gint main_sort_column_id
    Definition: remmina_pref.h:220
    gboolean main_maximize
    Definition: remmina_pref.h:219
    -
    GtkStatusbar * statusbar_main
    Definition: remmina_main.h:80
    -
    GtkTreeViewColumn * column_files_list_plugin
    Definition: remmina_main.h:77
    -
    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)
    +
    GtkStatusbar * statusbar_main
    Definition: remmina_main.h:81
    +
    GtkTreeViewColumn * column_files_list_plugin
    Definition: remmina_main.h:78
    +
    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)
    GtkBuilder * builder
    Definition: remmina_main.h:49
    - +
    GtkBuilder * remmina_public_gtk_builder_new_from_resource(gchar *resource)
    -
    void remmina_main_on_action_connection_delete(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:976
    -
    static gboolean is_empty(const gchar *s)
    +
    void remmina_main_on_action_connection_delete(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:977
    +
    static gboolean is_empty(const gchar *s)
    RemminaStringArray * remmina_string_array_new_from_string(const gchar *strs)
    gboolean remmina_pref_get_boolean(const gchar *key)
    gint view_file_mode
    Definition: remmina_pref.h:213
    @@ -234,64 +236,64 @@ $(document).ready(function(){initNavTree('remmina__main_8c_source.html','');});
    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)
    Definition: remmina_main.c:149
    -
    void remmina_main_on_show(GtkWidget *w, gpointer user_data)
    -
    static void remmina_main_init(void)
    -
    GtkTreeView * tree_files_list
    Definition: remmina_main.h:73
    -
    static void remmina_main_select_file(const gchar *filename)
    Definition: remmina_main.c:617
    -
    gboolean remmina_main_on_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
    Definition: remmina_main.c:224
    -
    void remmina_main_on_action_help_community(GSimpleAction *action, GVariant *param, gpointer data)
    -
    GtkToggleButton * view_toggle_button
    Definition: remmina_main.h:64
    -
    void remmina_main_destroy()
    Definition: remmina_main.c:192
    +
    static void remmina_main_save_expanded_group_func(GtkTreeView *tree_view, GtkTreePath *path, gpointer user_data)
    Definition: remmina_main.c:150
    +
    void remmina_main_on_show(GtkWidget *w, gpointer user_data)
    +
    static void remmina_main_init(void)
    +
    GtkTreeView * tree_files_list
    Definition: remmina_main.h:74
    +
    static void remmina_main_select_file(const gchar *filename)
    Definition: remmina_main.c:618
    +
    gboolean remmina_main_on_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
    Definition: remmina_main.c:225
    +
    void remmina_main_on_action_help_community(GSimpleAction *action, GVariant *param, gpointer data)
    +
    GtkToggleButton * view_toggle_button
    Definition: remmina_main.h:65
    +
    void remmina_main_destroy()
    Definition: remmina_main.c:193
    RemminaFile * remmina_file_new(void)
    Definition: remmina_file.c:93
    -
    GtkTreeViewColumn * column_files_list_group
    Definition: remmina_main.h:75
    -
    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)
    Definition: remmina_main.c:416
    -
    RemminaStringArray * expanded_group
    Definition: remmina_main.h:98
    -
    static gboolean remmina_main_selection_func(GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path, gboolean path_currently_selected, gpointer user_data)
    Definition: remmina_main.c:321
    -
    void remmina_main_on_action_connection_external_tools(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:795
    -
    static void remmina_main_clear_selection_data(void)
    Definition: remmina_main.c:260
    +
    GtkTreeViewColumn * column_files_list_group
    Definition: remmina_main.h:76
    +
    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)
    Definition: remmina_main.c:417
    +
    RemminaStringArray * expanded_group
    Definition: remmina_main.h:99
    +
    static gboolean remmina_main_selection_func(GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path, gboolean path_currently_selected, gpointer user_data)
    Definition: remmina_main.c:322
    +
    void remmina_main_on_action_connection_external_tools(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:796
    +
    static void remmina_main_clear_selection_data(void)
    Definition: remmina_main.c:261
    void rcw_open_from_file(RemminaFile *remminafile)
    Definition: rcw.c:4446
    -
    void remmina_main_on_date_column_sort_clicked()
    +
    void remmina_main_on_date_column_sort_clicked()
    RemminaPref remmina_pref
    Definition: rcw.c:79
    -
    gboolean remmina_main_file_list_on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
    +
    gboolean remmina_main_file_list_on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
    gint remmina_file_get_int(RemminaFile *remminafile, const gchar *setting, gint default_value)
    Definition: remmina_file.c:603
    -
    void remmina_main_on_action_application_dark_theme(GSimpleAction *action, GVariant *param, gpointer data)
    +
    void remmina_main_on_action_application_dark_theme(GSimpleAction *action, GVariant *param, gpointer data)
    void remmina_about_open(GtkWindow *parent)
    Definition: remmina_about.c:44
    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)
    +
    static gboolean remmina_main_add_tool_plugin(gchar *name, RemminaPlugin *plugin, gpointer user_data)
    gboolean remmina_pref_save(void)
    Definition: remmina_pref.c:777
    -
    void remmina_main_on_action_connection_edit(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:945
    -
    GtkTreeModel * file_model_sort
    Definition: remmina_main.h:91
    +
    void remmina_main_on_action_connection_edit(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:946
    +
    GtkTreeModel * file_model_sort
    Definition: remmina_main.h:92
    gboolean rcw_open_from_filename(const gchar *filename)
    Definition: rcw.c:4398
    static const gchar * supported_mime_types[]
    Definition: remmina_main.c:87
    -
    void remmina_main_on_action_expand(GSimpleAction *action, GVariant *param, gpointer data)
    +
    void remmina_main_on_action_expand(GSimpleAction *action, GVariant *param, gpointer data)
    gboolean(* export_func)(struct _RemminaFilePlugin *instance, RemminaFile *file, const gchar *to_file)
    Definition: plugin.h:110
    gboolean kioskmode
    Definition: remmina.c:87
    GtkWindow * window
    Definition: remmina_main.h:50
    void remmina_application_condexit(RemminaCondExitType why)
    Definition: remmina_exec.c:123
    void remmina_file_set_string(RemminaFile *remminafile, const gchar *setting, const gchar *value)
    Definition: remmina_file.c:469
    -
    static char * quick_connect_plugin_list[]
    Definition: remmina_main.c:130
    +
    static char * quick_connect_plugin_list[]
    Definition: remmina_main.c:131
    void remmina_file_save(RemminaFile *remminafile)
    Definition: remmina_file.c:728
    -
    GtkTreeViewColumn * column_files_list_notes
    Definition: remmina_main.h:79
    -
    static gboolean remmina_main_quickconnect(void)
    +
    GtkTreeViewColumn * column_files_list_notes
    Definition: remmina_main.h:80
    +
    static gboolean remmina_main_quickconnect(void)
    gboolean always_show_notes
    Definition: remmina_pref.h:153
    void remmina_string_array_add(RemminaStringArray *array, const gchar *str)
    -
    static GtkTargetEntry remmina_drop_types[]
    Definition: remmina_main.c:125
    -
    GtkSearchBar * search_bar
    Definition: remmina_main.h:66
    +
    static GtkTargetEntry remmina_drop_types[]
    Definition: remmina_main.c:126
    +
    GtkSearchBar * search_bar
    Definition: remmina_main.h:67
    static RemminaMain * remminamain
    Definition: remmina_main.c:69
    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
    Definition: remmina_main.h:70
    +
    void remmina_main_on_action_application_quit(GSimpleAction *action, GVariant *param, gpointer data)
    +
    GtkEntry * entry_quick_connect_server
    Definition: remmina_main.h:71
    gint remmina_unlock_new(GtkWindow *parent)
    const gchar * remmina_file_get_icon_name(RemminaFile *remminafile)
    Definition: remmina_file.c:883
    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)
    @@ -301,24 +303,24 @@ $(document).ready(function(){initNavTree('remmina__main_8c_source.html','');});
    GtkWidget * remmina_pref_dialog_new(gint default_tab, GtkWindow *parent)
    GNode * remmina_file_manager_get_group_tree(void)
    -
    void remmina_main_on_action_search_toggle(GSimpleAction *action, GVariant *param, gpointer data)
    -
    gboolean override_view_file_mode_to_list
    Definition: remmina_main.h:97
    -
    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)
    Definition: remmina_main.c:804
    +
    void remmina_main_on_action_search_toggle(GSimpleAction *action, GVariant *param, gpointer data)
    +
    gboolean override_view_file_mode_to_list
    Definition: remmina_main.h:98
    +
    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)
    Definition: remmina_main.c:805
    gint remmina_file_manager_iterate(GFunc func, gpointer user_data)
    gboolean dark_theme
    Definition: remmina_pref.h:149
    -
    static void remmina_main_expand_group(void)
    Definition: remmina_main.c:445
    -
    void remmina_main_quick_search_on_icon_press(GtkEntry *entry, GtkEntryIconPosition icon_pos, GdkEvent *event, gpointer user_data)
    -
    void remmina_main_on_accel_search_toggle(RemminaMain *remminamain)
    +
    static void remmina_main_expand_group(void)
    Definition: remmina_main.c:446
    +
    void remmina_main_quick_search_on_icon_press(GtkEntry *entry, GtkEntryIconPosition icon_pos, GdkEvent *event, gpointer user_data)
    +
    void remmina_main_on_accel_search_toggle(RemminaMain *remminamain)
    -
    static void remmina_main_load_files()
    Definition: remmina_main.c:645
    -
    GtkTreeViewColumn * column_files_list_date
    Definition: remmina_main.h:78
    -
    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.
    Definition: remmina_main.c:217
    -
    gboolean remmina_main_quickconnect_on_click(GtkWidget *widget, gpointer user_data)
    +
    static void remmina_main_load_files()
    Definition: remmina_main.c:646
    +
    GtkTreeViewColumn * column_files_list_date
    Definition: remmina_main.h:79
    +
    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.
    Definition: remmina_main.c:218
    +
    gboolean remmina_main_quickconnect_on_click(GtkWidget *widget, gpointer user_data)
    diff --git a/public/remmina__main_8h.html b/public/remmina__main_8h.html index 35e222103..b96b1186f 100644 --- a/public/remmina__main_8h.html +++ b/public/remmina__main_8h.html @@ -147,6 +147,8 @@ Functions   void remmina_main_on_action_connection_delete (GSimpleAction *action, GVariant *param, gpointer data)   +void remmina_main_on_action_connection_delete_multiple (GSimpleAction *action, GVariant *param, gpointer data) +  void remmina_main_on_action_connection_edit (GSimpleAction *action, GVariant *param, gpointer data)   void remmina_main_on_action_connection_external_tools (GSimpleAction *action, GVariant *param, gpointer data) @@ -224,7 +226,7 @@ Functions
    -

    Definition at line 192 of file remmina_main.c.

    +

    Definition at line 193 of file remmina_main.c.

    @@ -244,7 +246,7 @@ Functions
    -

    Definition at line 1648 of file remmina_main.c.

    +

    Definition at line 1716 of file remmina_main.c.

    @@ -264,7 +266,7 @@ Functions
    -

    Definition at line 1565 of file remmina_main.c.

    +

    Definition at line 1632 of file remmina_main.c.

    @@ -300,7 +302,7 @@ Functions
    -

    Definition at line 1247 of file remmina_main.c.

    +

    Definition at line 1306 of file remmina_main.c.

    @@ -336,7 +338,7 @@ Functions
    -

    Definition at line 1201 of file remmina_main.c.

    +

    Definition at line 1260 of file remmina_main.c.

    @@ -372,7 +374,7 @@ Functions
    -

    Definition at line 1053 of file remmina_main.c.

    +

    Definition at line 1112 of file remmina_main.c.

    @@ -408,7 +410,7 @@ Functions
    -

    Definition at line 813 of file remmina_main.c.

    +

    Definition at line 814 of file remmina_main.c.

    @@ -444,7 +446,7 @@ Functions
    -

    Definition at line 1195 of file remmina_main.c.

    +

    Definition at line 1254 of file remmina_main.c.

    @@ -480,7 +482,7 @@ Functions
    -

    Definition at line 1027 of file remmina_main.c.

    +

    Definition at line 1086 of file remmina_main.c.

    @@ -516,7 +518,7 @@ Functions
    -

    Definition at line 1081 of file remmina_main.c.

    +

    Definition at line 1140 of file remmina_main.c.

    @@ -552,7 +554,7 @@ Functions
    -

    Definition at line 1334 of file remmina_main.c.

    +

    Definition at line 1393 of file remmina_main.c.

    @@ -588,7 +590,7 @@ Functions
    -

    Definition at line 767 of file remmina_main.c.

    +

    Definition at line 768 of file remmina_main.c.

    @@ -624,7 +626,7 @@ Functions
    -

    Definition at line 909 of file remmina_main.c.

    +

    Definition at line 910 of file remmina_main.c.

    @@ -660,7 +662,43 @@ Functions
    -

    Definition at line 976 of file remmina_main.c.

    +

    Definition at line 977 of file remmina_main.c.

    + +
    + + +

    ◆ remmina_main_on_action_connection_delete_multiple()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void remmina_main_on_action_connection_delete_multiple (GSimpleAction * action,
    GVariant * param,
    gpointer data 
    )
    +
    + +

    Definition at line 1011 of file remmina_main.c.

    @@ -696,7 +734,7 @@ Functions
    -

    Definition at line 945 of file remmina_main.c.

    +

    Definition at line 946 of file remmina_main.c.

    @@ -732,7 +770,7 @@ Functions
    -

    Definition at line 795 of file remmina_main.c.

    +

    Definition at line 796 of file remmina_main.c.

    @@ -768,7 +806,7 @@ Functions
    -

    Definition at line 850 of file remmina_main.c.

    +

    Definition at line 851 of file remmina_main.c.

    @@ -804,7 +842,7 @@ Functions
    -

    Definition at line 1364 of file remmina_main.c.

    +

    Definition at line 1423 of file remmina_main.c.

    @@ -840,7 +878,7 @@ Functions
    -

    Definition at line 1229 of file remmina_main.c.

    +

    Definition at line 1288 of file remmina_main.c.

    @@ -876,7 +914,7 @@ Functions
    -

    Definition at line 1241 of file remmina_main.c.

    +

    Definition at line 1300 of file remmina_main.c.

    @@ -912,7 +950,7 @@ Functions
    -

    Definition at line 1235 of file remmina_main.c.

    +

    Definition at line 1294 of file remmina_main.c.

    @@ -948,7 +986,7 @@ Functions
    -

    Definition at line 1217 of file remmina_main.c.

    +

    Definition at line 1276 of file remmina_main.c.

    @@ -984,7 +1022,7 @@ Functions
    -

    Definition at line 1223 of file remmina_main.c.

    +

    Definition at line 1282 of file remmina_main.c.

    @@ -1020,7 +1058,7 @@ Functions
    -

    Definition at line 1340 of file remmina_main.c.

    +

    Definition at line 1399 of file remmina_main.c.

    @@ -1056,7 +1094,7 @@ Functions
    -

    Definition at line 1166 of file remmina_main.c.

    +

    Definition at line 1225 of file remmina_main.c.

    @@ -1092,7 +1130,7 @@ Functions
    -

    Definition at line 1154 of file remmina_main.c.

    +

    Definition at line 1213 of file remmina_main.c.

    @@ -1114,7 +1152,7 @@ Functions

    Called when the remminamain->window widget is destroyed (glade event handler)

    -

    Definition at line 247 of file remmina_main.c.

    +

    Definition at line 248 of file remmina_main.c.

    @@ -1133,7 +1171,7 @@ Functions
    -

    Definition at line 1018 of file remmina_main.c.

    +

    Definition at line 1077 of file remmina_main.c.

    @@ -1156,7 +1194,7 @@ Functions

    Save the Remmina Main Window size and the expanded group before to close Remmina.

    This function uses remmina_main_save_size and remmina_main_save_expanded_group.

    -

    Definition at line 179 of file remmina_main.c.

    +

    Definition at line 180 of file remmina_main.c.

    @@ -1192,7 +1230,7 @@ Functions
    -

    Definition at line 1667 of file remmina_main.c.

    +

    Definition at line 1735 of file remmina_main.c.

    @@ -1212,7 +1250,7 @@ Functions
    -

    Definition at line 1677 of file remmina_main.c.

    +

    Definition at line 1745 of file remmina_main.c.

    @@ -1232,7 +1270,7 @@ Functions
    -

    Definition at line 1660 of file remmina_main.c.

    +

    Definition at line 1728 of file remmina_main.c.

    diff --git a/public/remmina__main_8h.js b/public/remmina__main_8h.js index 83c0c06a7..470985bce 100644 --- a/public/remmina__main_8h.js +++ b/public/remmina__main_8h.js @@ -18,6 +18,7 @@ var remmina__main_8h = [ "remmina_main_on_action_connection_connect", "remmina__main_8h.html#a6b30ed832369f3a7153aa63f98873c9d", null ], [ "remmina_main_on_action_connection_copy", "remmina__main_8h.html#a44eb44c6391f53a19c6f1fdf9a39a8c1", null ], [ "remmina_main_on_action_connection_delete", "remmina__main_8h.html#a10e574723222f5df9db456977e62a093", null ], + [ "remmina_main_on_action_connection_delete_multiple", "remmina__main_8h.html#af56bada711b2fc9c50af83b8b62dfe8b", null ], [ "remmina_main_on_action_connection_edit", "remmina__main_8h.html#adfbfc580d25b58d09770a7d33ffe03cc", null ], [ "remmina_main_on_action_connection_external_tools", "remmina__main_8h.html#abcf8bd8ca57b389264ff9739a61efdc1", null ], [ "remmina_main_on_action_connection_new", "remmina__main_8h.html#a52cc21537ff003b9d0fbdb9040c811af", null ], diff --git a/public/remmina__main_8h_source.html b/public/remmina__main_8h_source.html index b92dd9547..14ad10baa 100644 --- a/public/remmina__main_8h_source.html +++ b/public/remmina__main_8h_source.html @@ -86,86 +86,88 @@ $(document).ready(function(){initNavTree('remmina__main_8h_source.html','');});
    remmina_main.h
    -Go to the documentation of this file.
    1 /*
    2  * Remmina - The GTK+ Remote Desktop Client
    3  * Copyright (C) 2009-2011 Vic Lee
    4  * Copyright (C) 2014-2015 Antenore Gatta, Fabio Castelli, Giovanni Panozzo
    5  * Copyright (C) 2016-2022 Antenore Gatta, Giovanni Panozzo
    6  * Copyright (C) 2022-2023 Antenore Gatta, Giovanni Panozzo, Hiroyuki Tanaka
    7  *
    8  * This program is free software; you can redistribute it and/or modify
    9  * it under the terms of the GNU General Public License as published by
    10  * the Free Software Foundation; either version 2 of the License, or
    11  * (at your option) any later version.
    12  *
    13  * This program is distributed in the hope that it will be useful,
    14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    16  * GNU General Public License for more details.
    17  *
    18  * You should have received a copy of the GNU General Public License
    19  * along with this program; if not, write to the Free Software
    20  * Foundation, Inc., 51 Franklin Street, Fifth Floor,
    21  * Boston, MA 02110-1301, USA.
    22  *
    23  * In addition, as a special exception, the copyright holders give
    24  * permission to link the code of portions of this program with the
    25  * OpenSSL library under certain conditions as described in each
    26  * individual source file, and distribute linked combinations
    27  * including the two.
    28  * You must obey the GNU General Public License in all respects
    29  * for all of the code used other than OpenSSL. * If you modify
    30  * file(s) with this exception, you may extend this exception to your
    31  * version of the file(s), but you are not obligated to do so. * If you
    32  * do not wish to do so, delete this exception statement from your
    33  * version. * If you delete this exception statement from all source
    34  * files in the program, then also delete it here.
    35  *
    36  */
    37 
    38 #pragma once
    39 
    40 #include "remmina_file.h"
    41 #include "remmina_monitor.h"
    42 #include <gtk/gtk.h>
    43 
    44 #include "remmina_string_array.h"
    45 
    47 
    48 typedef struct _RemminaMain {
    49  GtkBuilder * builder;
    50  GtkWindow * window;
    51  /* Menu widgets */
    52  GtkMenu * menu_popup;
    53  GtkMenuButton * menu_header_button;
    54  GtkMenu * menu_popup_full;
    55  GtkRadioMenuItem * menuitem_view_mode_list;
    56  GtkRadioMenuItem * menuitem_view_mode_tree;
    57  GtkMenuItem * menuitem_connection_quit;
    58  /* Button new */
    59  GtkButton * button_new;
    60  GtkButton * button_make_default;
    61  /* Search bar objects */
    62  GtkToggleButton * search_toggle;
    63  GtkSwitch * switch_dark_mode;
    64  GtkToggleButton * view_toggle_button;
    65  GtkToggleButton * ustats_toggle;
    66  GtkSearchBar * search_bar;
    67  /* Quick connect objects */
    69  GtkComboBoxText * combo_quick_connect_protocol;
    71  GtkButton * button_quick_connect;
    72  /* Other widgets */
    73  GtkTreeView * tree_files_list;
    74  GtkTreeViewColumn * column_files_list_name;
    75  GtkTreeViewColumn * column_files_list_group;
    76  GtkTreeViewColumn * column_files_list_server;
    77  GtkTreeViewColumn * column_files_list_plugin;
    78  GtkTreeViewColumn * column_files_list_date;
    79  GtkTreeViewColumn * column_files_list_notes;
    80  GtkStatusbar * statusbar_main;
    81  GtkWidget * network_icon;
    82  /* Non widget objects */
    83  GtkAccelGroup * accelgroup_shortcuts;
    86 } RemminaMain;
    87 
    89  GtkTreeModel * file_model;
    90  GtkTreeModel * file_model_filter;
    91  GtkTreeModel * file_model_sort;
    92 
    93  gboolean initialized;
    94 
    96  gchar * selected_name;
    99 };
    100 
    101 G_BEGIN_DECLS
    102 
    103 /* Create the remminamain struct and the remmina main Remmina window */
    104 GtkWidget *remmina_main_new(void);
    105 /* Get the current main GTK window or NULL if not initialized */
    106 GtkWindow *remmina_main_get_window(void);
    107 
    109 
    110 void remmina_main_destroy(void);
    113 
    114 void remmina_main_show_dialog(GtkMessageType msg, GtkButtonsType buttons, const gchar* message);
    115 void remmina_main_show_warning_dialog(const gchar *message);
    116 void remmina_main_on_action_application_about(GSimpleAction *action, GVariant *param, gpointer data);
    117 void remmina_main_on_action_application_default(GSimpleAction *action, GVariant *param, gpointer data);
    118 void remmina_main_on_action_application_mpchange(GSimpleAction *action, GVariant *param, gpointer data);
    119 void remmina_main_on_action_application_plugins(GSimpleAction *action, GVariant *param, gpointer data);
    120 void remmina_main_on_action_application_dark_theme(GSimpleAction *action, GVariant *param, gpointer data);
    121 void remmina_main_on_action_application_preferences(GSimpleAction *action, GVariant *param, gpointer data);
    122 void remmina_main_on_action_application_quit(GSimpleAction *action, GVariant *param, gpointer data);
    123 void remmina_main_on_action_connection_connect(GSimpleAction *action, GVariant *param, gpointer data);
    124 void remmina_main_on_action_connection_copy(GSimpleAction *action, GVariant *param, gpointer data);
    125 void remmina_main_on_action_connection_delete(GSimpleAction *action, GVariant *param, gpointer data);
    126 void remmina_main_on_action_connection_edit(GSimpleAction *action, GVariant *param, gpointer data);
    127 void remmina_main_on_action_connection_external_tools(GSimpleAction *action, GVariant *param, gpointer data);
    128 void remmina_main_on_action_connection_new(GSimpleAction *action, GVariant *param, gpointer data);
    129 void remmina_main_on_action_help_community(GSimpleAction *action, GVariant *param, gpointer data);
    130 void remmina_main_on_action_help_debug(GSimpleAction *action, GVariant *param, gpointer data);
    131 void remmina_main_on_action_help_donations(GSimpleAction *action, GVariant *param, gpointer data);
    132 void remmina_main_on_action_help_homepage(GSimpleAction *action, GVariant *param, gpointer data);
    133 void remmina_main_on_action_help_wiki(GSimpleAction *action, GVariant *param, gpointer data);
    134 void remmina_main_on_action_tools_export(GSimpleAction *action, GVariant *param, gpointer data);
    135 void remmina_main_on_action_tools_import(GSimpleAction *action, GVariant *param, gpointer data);
    136 void remmina_main_on_action_expand(GSimpleAction *action, GVariant *param, gpointer data);
    137 void remmina_main_on_action_collapse(GSimpleAction *action, GVariant *param, gpointer data);
    138 void remmina_main_on_action_search_toggle(GSimpleAction *action, GVariant *param, gpointer data);
    140 
    141 G_END_DECLS
    void remmina_main_on_action_application_plugins(GSimpleAction *action, GVariant *param, gpointer data)
    -
    GtkToggleButton * search_toggle
    Definition: remmina_main.h:62
    -
    GtkRadioMenuItem * menuitem_view_mode_list
    Definition: remmina_main.h:55
    -
    GtkWidget * network_icon
    Definition: remmina_main.h:81
    -
    void remmina_main_on_action_connection_external_tools(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:795
    -
    void remmina_main_save_before_destroy(void)
    Save the Remmina Main Window size and the expanded group before to close Remmina. ...
    Definition: remmina_main.c:179
    +Go to the documentation of this file.
    1 /*
    2  * Remmina - The GTK+ Remote Desktop Client
    3  * Copyright (C) 2009-2011 Vic Lee
    4  * Copyright (C) 2014-2015 Antenore Gatta, Fabio Castelli, Giovanni Panozzo
    5  * Copyright (C) 2016-2022 Antenore Gatta, Giovanni Panozzo
    6  * Copyright (C) 2022-2023 Antenore Gatta, Giovanni Panozzo, Hiroyuki Tanaka
    7  *
    8  * This program is free software; you can redistribute it and/or modify
    9  * it under the terms of the GNU General Public License as published by
    10  * the Free Software Foundation; either version 2 of the License, or
    11  * (at your option) any later version.
    12  *
    13  * This program is distributed in the hope that it will be useful,
    14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    16  * GNU General Public License for more details.
    17  *
    18  * You should have received a copy of the GNU General Public License
    19  * along with this program; if not, write to the Free Software
    20  * Foundation, Inc., 51 Franklin Street, Fifth Floor,
    21  * Boston, MA 02110-1301, USA.
    22  *
    23  * In addition, as a special exception, the copyright holders give
    24  * permission to link the code of portions of this program with the
    25  * OpenSSL library under certain conditions as described in each
    26  * individual source file, and distribute linked combinations
    27  * including the two.
    28  * You must obey the GNU General Public License in all respects
    29  * for all of the code used other than OpenSSL. * If you modify
    30  * file(s) with this exception, you may extend this exception to your
    31  * version of the file(s), but you are not obligated to do so. * If you
    32  * do not wish to do so, delete this exception statement from your
    33  * version. * If you delete this exception statement from all source
    34  * files in the program, then also delete it here.
    35  *
    36  */
    37 
    38 #pragma once
    39 
    40 #include "remmina_file.h"
    41 #include "remmina_monitor.h"
    42 #include <gtk/gtk.h>
    43 
    44 #include "remmina_string_array.h"
    45 
    47 
    48 typedef struct _RemminaMain {
    49  GtkBuilder * builder;
    50  GtkWindow * window;
    51  /* Menu widgets */
    52  GtkMenu * menu_popup;
    53  GtkMenuButton * menu_header_button;
    54  GtkMenu * menu_popup_full;
    56  GtkRadioMenuItem * menuitem_view_mode_list;
    57  GtkRadioMenuItem * menuitem_view_mode_tree;
    58  GtkMenuItem * menuitem_connection_quit;
    59  /* Button new */
    60  GtkButton * button_new;
    61  GtkButton * button_make_default;
    62  /* Search bar objects */
    63  GtkToggleButton * search_toggle;
    64  GtkSwitch * switch_dark_mode;
    65  GtkToggleButton * view_toggle_button;
    66  GtkToggleButton * ustats_toggle;
    67  GtkSearchBar * search_bar;
    68  /* Quick connect objects */
    70  GtkComboBoxText * combo_quick_connect_protocol;
    72  GtkButton * button_quick_connect;
    73  /* Other widgets */
    74  GtkTreeView * tree_files_list;
    75  GtkTreeViewColumn * column_files_list_name;
    76  GtkTreeViewColumn * column_files_list_group;
    77  GtkTreeViewColumn * column_files_list_server;
    78  GtkTreeViewColumn * column_files_list_plugin;
    79  GtkTreeViewColumn * column_files_list_date;
    80  GtkTreeViewColumn * column_files_list_notes;
    81  GtkStatusbar * statusbar_main;
    82  GtkWidget * network_icon;
    83  /* Non widget objects */
    84  GtkAccelGroup * accelgroup_shortcuts;
    87 } RemminaMain;
    88 
    90  GtkTreeModel * file_model;
    91  GtkTreeModel * file_model_filter;
    92  GtkTreeModel * file_model_sort;
    93 
    94  gboolean initialized;
    95 
    97  gchar * selected_name;
    100 };
    101 
    102 G_BEGIN_DECLS
    103 
    104 /* Create the remminamain struct and the remmina main Remmina window */
    105 GtkWidget *remmina_main_new(void);
    106 /* Get the current main GTK window or NULL if not initialized */
    107 GtkWindow *remmina_main_get_window(void);
    108 
    110 
    111 void remmina_main_destroy(void);
    114 
    115 void remmina_main_show_dialog(GtkMessageType msg, GtkButtonsType buttons, const gchar* message);
    116 void remmina_main_show_warning_dialog(const gchar *message);
    117 void remmina_main_on_action_application_about(GSimpleAction *action, GVariant *param, gpointer data);
    118 void remmina_main_on_action_application_default(GSimpleAction *action, GVariant *param, gpointer data);
    119 void remmina_main_on_action_application_mpchange(GSimpleAction *action, GVariant *param, gpointer data);
    120 void remmina_main_on_action_application_plugins(GSimpleAction *action, GVariant *param, gpointer data);
    121 void remmina_main_on_action_application_dark_theme(GSimpleAction *action, GVariant *param, gpointer data);
    122 void remmina_main_on_action_application_preferences(GSimpleAction *action, GVariant *param, gpointer data);
    123 void remmina_main_on_action_application_quit(GSimpleAction *action, GVariant *param, gpointer data);
    124 void remmina_main_on_action_connection_connect(GSimpleAction *action, GVariant *param, gpointer data);
    125 void remmina_main_on_action_connection_copy(GSimpleAction *action, GVariant *param, gpointer data);
    126 void remmina_main_on_action_connection_delete(GSimpleAction *action, GVariant *param, gpointer data);
    127 void remmina_main_on_action_connection_delete_multiple(GSimpleAction *action, GVariant *param, gpointer data);
    128 void remmina_main_on_action_connection_edit(GSimpleAction *action, GVariant *param, gpointer data);
    129 void remmina_main_on_action_connection_external_tools(GSimpleAction *action, GVariant *param, gpointer data);
    130 void remmina_main_on_action_connection_new(GSimpleAction *action, GVariant *param, gpointer data);
    131 void remmina_main_on_action_help_community(GSimpleAction *action, GVariant *param, gpointer data);
    132 void remmina_main_on_action_help_debug(GSimpleAction *action, GVariant *param, gpointer data);
    133 void remmina_main_on_action_help_donations(GSimpleAction *action, GVariant *param, gpointer data);
    134 void remmina_main_on_action_help_homepage(GSimpleAction *action, GVariant *param, gpointer data);
    135 void remmina_main_on_action_help_wiki(GSimpleAction *action, GVariant *param, gpointer data);
    136 void remmina_main_on_action_tools_export(GSimpleAction *action, GVariant *param, gpointer data);
    137 void remmina_main_on_action_tools_import(GSimpleAction *action, GVariant *param, gpointer data);
    138 void remmina_main_on_action_expand(GSimpleAction *action, GVariant *param, gpointer data);
    139 void remmina_main_on_action_collapse(GSimpleAction *action, GVariant *param, gpointer data);
    140 void remmina_main_on_action_search_toggle(GSimpleAction *action, GVariant *param, gpointer data);
    142 
    143 G_END_DECLS
    void remmina_main_on_action_application_plugins(GSimpleAction *action, GVariant *param, gpointer data)
    +
    GtkToggleButton * search_toggle
    Definition: remmina_main.h:63
    +
    GtkRadioMenuItem * menuitem_view_mode_list
    Definition: remmina_main.h:56
    +
    GtkWidget * network_icon
    Definition: remmina_main.h:82
    +
    void remmina_main_on_action_connection_external_tools(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:796
    +
    void remmina_main_save_before_destroy(void)
    Save the Remmina Main Window size and the expanded group before to close Remmina. ...
    Definition: remmina_main.c:180
    G_BEGIN_DECLS typedef GPtrArray RemminaStringArray
    -
    gchar * selected_filename
    Definition: remmina_main.h:95
    -
    GtkTreeModel * file_model
    Definition: remmina_main.h:89
    -
    void remmina_main_destroy(void)
    Definition: remmina_main.c:192
    -
    RemminaMainPriv * priv
    Definition: remmina_main.h:84
    -
    void remmina_main_on_action_help_homepage(GSimpleAction *action, GVariant *param, gpointer data)
    +
    gchar * selected_filename
    Definition: remmina_main.h:96
    +
    GtkTreeModel * file_model
    Definition: remmina_main.h:90
    +
    void remmina_main_destroy(void)
    Definition: remmina_main.c:193
    +
    RemminaMainPriv * priv
    Definition: remmina_main.h:85
    +
    void remmina_main_on_action_help_homepage(GSimpleAction *action, GVariant *param, gpointer data)
    typedefG_BEGIN_DECLS struct _RemminaFile RemminaFile
    Definition: types.h:44
    -
    GtkMenuItem * menuitem_connection_quit
    Definition: remmina_main.h:57
    -
    GtkRadioMenuItem * menuitem_view_mode_tree
    Definition: remmina_main.h:56
    -
    GtkTreeViewColumn * column_files_list_name
    Definition: remmina_main.h:74
    +
    GtkMenuItem * menuitem_connection_quit
    Definition: remmina_main.h:58
    +
    GtkRadioMenuItem * menuitem_view_mode_tree
    Definition: remmina_main.h:57
    +
    GtkTreeViewColumn * column_files_list_name
    Definition: remmina_main.h:75
    +
    GtkMenu * menu_popup_delete_rc
    Definition: remmina_main.h:55
    -
    void remmina_main_on_action_expand(GSimpleAction *action, GVariant *param, gpointer data)
    -
    void remmina_main_on_action_help_debug(GSimpleAction *action, GVariant *param, gpointer data)
    -
    void remmina_main_on_action_connection_copy(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:909
    -
    G_BEGIN_DECLS GtkWidget * remmina_main_new(void)
    -
    void remmina_main_on_action_tools_import(GSimpleAction *action, GVariant *param, gpointer data)
    -
    GtkSwitch * switch_dark_mode
    Definition: remmina_main.h:63
    -
    GtkAccelGroup * accelgroup_shortcuts
    Definition: remmina_main.h:83
    -
    void remmina_main_on_action_application_dark_theme(GSimpleAction *action, GVariant *param, gpointer data)
    -
    GtkTreeModel * file_model_filter
    Definition: remmina_main.h:90
    -
    gchar * selected_name
    Definition: remmina_main.h:96
    -
    RemminaMonitor * monitor
    Definition: remmina_main.h:85
    -
    void remmina_main_on_action_connection_delete(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:976
    -
    void remmina_main_on_action_application_about(GSimpleAction *action, GVariant *param, gpointer data)
    +
    void remmina_main_on_action_expand(GSimpleAction *action, GVariant *param, gpointer data)
    +
    void remmina_main_on_action_help_debug(GSimpleAction *action, GVariant *param, gpointer data)
    +
    void remmina_main_on_action_connection_copy(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:910
    +
    G_BEGIN_DECLS GtkWidget * remmina_main_new(void)
    +
    void remmina_main_on_action_tools_import(GSimpleAction *action, GVariant *param, gpointer data)
    +
    GtkSwitch * switch_dark_mode
    Definition: remmina_main.h:64
    +
    GtkAccelGroup * accelgroup_shortcuts
    Definition: remmina_main.h:84
    +
    void remmina_main_on_action_application_dark_theme(GSimpleAction *action, GVariant *param, gpointer data)
    +
    GtkTreeModel * file_model_filter
    Definition: remmina_main.h:91
    +
    gchar * selected_name
    Definition: remmina_main.h:97
    +
    RemminaMonitor * monitor
    Definition: remmina_main.h:86
    +
    void remmina_main_on_action_connection_delete(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:977
    +
    void remmina_main_on_action_application_about(GSimpleAction *action, GVariant *param, gpointer data)
    GtkMenuButton * menu_header_button
    Definition: remmina_main.h:53
    -
    void remmina_main_show_dialog(GtkMessageType msg, GtkButtonsType buttons, const gchar *message)
    -
    void remmina_main_on_action_search_toggle(GSimpleAction *action, GVariant *param, gpointer data)
    -
    void remmina_main_on_action_application_preferences(GSimpleAction *action, GVariant *param, gpointer data)
    +
    void remmina_main_show_dialog(GtkMessageType msg, GtkButtonsType buttons, const gchar *message)
    +
    void remmina_main_on_action_search_toggle(GSimpleAction *action, GVariant *param, gpointer data)
    +
    void remmina_main_on_action_application_preferences(GSimpleAction *action, GVariant *param, gpointer data)
    GtkMenu * menu_popup
    Definition: remmina_main.h:52
    -
    void remmina_main_reload_preferences()
    +
    void remmina_main_reload_preferences()
    -
    gboolean initialized
    Definition: remmina_main.h:93
    -
    GtkComboBoxText * combo_quick_connect_protocol
    Definition: remmina_main.h:69
    -
    GtkBox * box_quick_connect
    Definition: remmina_main.h:68
    -
    GtkTreeViewColumn * column_files_list_server
    Definition: remmina_main.h:76
    -
    void remmina_main_on_action_help_community(GSimpleAction *action, GVariant *param, gpointer data)
    -
    GtkButton * button_new
    Definition: remmina_main.h:59
    +
    gboolean initialized
    Definition: remmina_main.h:94
    +
    GtkComboBoxText * combo_quick_connect_protocol
    Definition: remmina_main.h:70
    +
    void remmina_main_on_action_connection_delete_multiple(GSimpleAction *action, GVariant *param, gpointer data)
    +
    GtkBox * box_quick_connect
    Definition: remmina_main.h:69
    +
    GtkTreeViewColumn * column_files_list_server
    Definition: remmina_main.h:77
    +
    void remmina_main_on_action_help_community(GSimpleAction *action, GVariant *param, gpointer data)
    +
    GtkButton * button_new
    Definition: remmina_main.h:60
    GtkMenu * menu_popup_full
    Definition: remmina_main.h:54
    -
    GtkStatusbar * statusbar_main
    Definition: remmina_main.h:80
    -
    void remmina_main_on_destroy_event(void)
    Called when the remminamain->window widget is destroyed (glade event handler)
    Definition: remmina_main.c:247
    -
    GtkTreeViewColumn * column_files_list_plugin
    Definition: remmina_main.h:77
    +
    GtkStatusbar * statusbar_main
    Definition: remmina_main.h:81
    +
    void remmina_main_on_destroy_event(void)
    Called when the remminamain->window widget is destroyed (glade event handler)
    Definition: remmina_main.c:248
    +
    GtkTreeViewColumn * column_files_list_plugin
    Definition: remmina_main.h:78
    GtkBuilder * builder
    Definition: remmina_main.h:49
    - -
    GtkButton * button_quick_connect
    Definition: remmina_main.h:71
    -
    void remmina_main_on_action_tools_export(GSimpleAction *action, GVariant *param, gpointer data)
    -
    GtkWindow * remmina_main_get_window(void)
    -
    void remmina_main_on_action_application_mpchange(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:813
    -
    GtkTreeView * tree_files_list
    Definition: remmina_main.h:73
    -
    GtkToggleButton * view_toggle_button
    Definition: remmina_main.h:64
    -
    GtkTreeViewColumn * column_files_list_group
    Definition: remmina_main.h:75
    -
    RemminaStringArray * expanded_group
    Definition: remmina_main.h:98
    -
    void remmina_main_on_action_connection_edit(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:945
    -
    void remmina_main_show_warning_dialog(const gchar *message)
    -
    void remmina_main_on_action_application_default(GSimpleAction *action, GVariant *param, gpointer data)
    -
    GtkTreeModel * file_model_sort
    Definition: remmina_main.h:91
    -
    void remmina_main_update_file_datetime(RemminaFile *file)
    -
    void remmina_main_on_action_connection_connect(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:767
    + +
    GtkButton * button_quick_connect
    Definition: remmina_main.h:72
    +
    void remmina_main_on_action_tools_export(GSimpleAction *action, GVariant *param, gpointer data)
    +
    GtkWindow * remmina_main_get_window(void)
    +
    void remmina_main_on_action_application_mpchange(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:814
    +
    GtkTreeView * tree_files_list
    Definition: remmina_main.h:74
    +
    GtkToggleButton * view_toggle_button
    Definition: remmina_main.h:65
    +
    GtkTreeViewColumn * column_files_list_group
    Definition: remmina_main.h:76
    +
    RemminaStringArray * expanded_group
    Definition: remmina_main.h:99
    +
    void remmina_main_on_action_connection_edit(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:946
    +
    void remmina_main_show_warning_dialog(const gchar *message)
    +
    void remmina_main_on_action_application_default(GSimpleAction *action, GVariant *param, gpointer data)
    +
    GtkTreeModel * file_model_sort
    Definition: remmina_main.h:92
    +
    void remmina_main_update_file_datetime(RemminaFile *file)
    +
    void remmina_main_on_action_connection_connect(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:768
    GtkWindow * window
    Definition: remmina_main.h:50
    -
    void remmina_main_on_action_application_quit(GSimpleAction *action, GVariant *param, gpointer data)
    -
    GtkToggleButton * ustats_toggle
    Definition: remmina_main.h:65
    -
    void remmina_main_on_action_connection_new(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:850
    -
    void remmina_main_on_action_collapse(GSimpleAction *action, GVariant *param, gpointer data)
    -
    GtkButton * button_make_default
    Definition: remmina_main.h:60
    -
    void remmina_main_on_action_help_donations(GSimpleAction *action, GVariant *param, gpointer data)
    -
    GtkTreeViewColumn * column_files_list_notes
    Definition: remmina_main.h:79
    -
    GtkSearchBar * search_bar
    Definition: remmina_main.h:66
    -
    GtkEntry * entry_quick_connect_server
    Definition: remmina_main.h:70
    -
    void remmina_main_on_action_help_wiki(GSimpleAction *action, GVariant *param, gpointer data)
    -
    gboolean override_view_file_mode_to_list
    Definition: remmina_main.h:97
    +
    void remmina_main_on_action_application_quit(GSimpleAction *action, GVariant *param, gpointer data)
    +
    GtkToggleButton * ustats_toggle
    Definition: remmina_main.h:66
    +
    void remmina_main_on_action_connection_new(GSimpleAction *action, GVariant *param, gpointer data)
    Definition: remmina_main.c:851
    +
    void remmina_main_on_action_collapse(GSimpleAction *action, GVariant *param, gpointer data)
    +
    GtkButton * button_make_default
    Definition: remmina_main.h:61
    +
    void remmina_main_on_action_help_donations(GSimpleAction *action, GVariant *param, gpointer data)
    +
    GtkTreeViewColumn * column_files_list_notes
    Definition: remmina_main.h:80
    +
    GtkSearchBar * search_bar
    Definition: remmina_main.h:67
    +
    GtkEntry * entry_quick_connect_server
    Definition: remmina_main.h:71
    +
    void remmina_main_on_action_help_wiki(GSimpleAction *action, GVariant *param, gpointer data)
    +
    gboolean override_view_file_mode_to_list
    Definition: remmina_main.h:98
    struct _RemminaMain RemminaMain
    -
    GtkTreeViewColumn * column_files_list_date
    Definition: remmina_main.h:78
    +
    GtkTreeViewColumn * column_files_list_date
    Definition: remmina_main.h:79
    diff --git a/public/remmina__mpchange_8c_source.html b/public/remmina__mpchange_8c_source.html index 42d1c68c3..64c4a75e1 100644 --- a/public/remmina__mpchange_8c_source.html +++ b/public/remmina__mpchange_8c_source.html @@ -93,7 +93,7 @@ $(document).ready(function(){initNavTree('remmina__mpchange_8c_source.html','');
    const gchar * remmina_file_get_string(RemminaFile *remminafile, const gchar *setting)
    Definition: remmina_file.c:516
    guint searchentrychange_timeout_source_id
    static void remmina_mpchange_stopsearch(GtkSearchEntry *entry, gpointer user_data)
    -
    GtkWindow * remmina_main_get_window()
    +
    GtkWindow * remmina_main_get_window()
    GtkEntry * eGatewayPassword2
    diff --git a/public/remmina__plugin__manager_8c_source.html b/public/remmina__plugin__manager_8c_source.html index ab300033e..04b64a5b0 100644 --- a/public/remmina__plugin__manager_8c_source.html +++ b/public/remmina__plugin__manager_8c_source.html @@ -101,7 +101,7 @@ $(document).ready(function(){initNavTree('remmina__plugin__manager_8c_source.htm
    static void htdestroy(gpointer ht)
    gchar * remmina_protocol_widget_start_direct_tunnel(RemminaProtocolWidget *gp, gint default_port, gboolean port_plus)
    Start an SSH tunnel if possible and return the host:port string.
    -
    GtkWindow * remmina_main_get_window()
    +
    GtkWindow * remmina_main_get_window()
    void remmina_protocol_widget_chat_receive(RemminaProtocolWidget *gp, const gchar *text)
    gint remmina_protocol_widget_get_width(RemminaProtocolWidget *gp)
    gboolean remmina_plugin_native_load(RemminaPluginService *service, const char *name)
    @@ -173,7 +173,7 @@ $(document).ready(function(){initNavTree('remmina__plugin__manager_8c_source.htm
    void remmina_protocol_widget_signal_connection_closed(RemminaProtocolWidget *gp)
    RemminaPluginService remmina_plugin_manager_service
    static const gchar * remmina_plugin_type_name[]
    -
    void remmina_main_show_dialog(GtkMessageType msg, GtkButtonsType buttons, const gchar *message)
    +
    void remmina_main_show_dialog(GtkMessageType msg, GtkButtonsType buttons, const gchar *message)
    void remmina_protocol_widget_desktop_resize(RemminaProtocolWidget *gp)
    RemminaProtocolFeatureType type
    Definition: types.h:73
    diff --git a/public/remmina__pref__dialog_8c_source.html b/public/remmina__pref__dialog_8c_source.html index 21bfdd625..8a88cf42c 100644 --- a/public/remmina__pref__dialog_8c_source.html +++ b/public/remmina__pref__dialog_8c_source.html @@ -113,7 +113,7 @@ $(document).ready(function(){initNavTree('remmina__pref__dialog_8c_source.html',
    gchar * keystrokes
    Definition: remmina_pref.h:146
    -
    void remmina_main_reload_preferences()
    +
    void remmina_main_reload_preferences()
    GtkButton * button_options_recent_items_clear
    GtkEntry * entry_options_screenshot_name
    guint shortcutkey_screenshot
    Definition: remmina_pref.h:184
    diff --git a/public/search/all_12.js b/public/search/all_12.js index e56561014..d6601f137 100644 --- a/public/search/all_12.js +++ b/public/search/all_12.js @@ -583,6 +583,7 @@ var searchData= ['remmina_5fmain_5fon_5faction_5fconnection_5fconnect',['remmina_main_on_action_connection_connect',['../remmina__main_8c.html#a6b30ed832369f3a7153aa63f98873c9d',1,'remmina_main_on_action_connection_connect(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c'],['../remmina__main_8h.html#a6b30ed832369f3a7153aa63f98873c9d',1,'remmina_main_on_action_connection_connect(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c']]], ['remmina_5fmain_5fon_5faction_5fconnection_5fcopy',['remmina_main_on_action_connection_copy',['../remmina__main_8c.html#a44eb44c6391f53a19c6f1fdf9a39a8c1',1,'remmina_main_on_action_connection_copy(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c'],['../remmina__main_8h.html#a44eb44c6391f53a19c6f1fdf9a39a8c1',1,'remmina_main_on_action_connection_copy(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c']]], ['remmina_5fmain_5fon_5faction_5fconnection_5fdelete',['remmina_main_on_action_connection_delete',['../remmina__main_8c.html#a10e574723222f5df9db456977e62a093',1,'remmina_main_on_action_connection_delete(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c'],['../remmina__main_8h.html#a10e574723222f5df9db456977e62a093',1,'remmina_main_on_action_connection_delete(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c']]], + ['remmina_5fmain_5fon_5faction_5fconnection_5fdelete_5fmultiple',['remmina_main_on_action_connection_delete_multiple',['../remmina__main_8c.html#af56bada711b2fc9c50af83b8b62dfe8b',1,'remmina_main_on_action_connection_delete_multiple(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c'],['../remmina__main_8h.html#af56bada711b2fc9c50af83b8b62dfe8b',1,'remmina_main_on_action_connection_delete_multiple(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c']]], ['remmina_5fmain_5fon_5faction_5fconnection_5fedit',['remmina_main_on_action_connection_edit',['../remmina__main_8c.html#adfbfc580d25b58d09770a7d33ffe03cc',1,'remmina_main_on_action_connection_edit(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c'],['../remmina__main_8h.html#adfbfc580d25b58d09770a7d33ffe03cc',1,'remmina_main_on_action_connection_edit(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c']]], ['remmina_5fmain_5fon_5faction_5fconnection_5fexternal_5ftools',['remmina_main_on_action_connection_external_tools',['../remmina__main_8c.html#abcf8bd8ca57b389264ff9739a61efdc1',1,'remmina_main_on_action_connection_external_tools(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c'],['../remmina__main_8h.html#abcf8bd8ca57b389264ff9739a61efdc1',1,'remmina_main_on_action_connection_external_tools(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c']]], ['remmina_5fmain_5fon_5faction_5fconnection_5fnew',['remmina_main_on_action_connection_new',['../remmina__main_8c.html#a52cc21537ff003b9d0fbdb9040c811af',1,'remmina_main_on_action_connection_new(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c'],['../remmina__main_8h.html#a52cc21537ff003b9d0fbdb9040c811af',1,'remmina_main_on_action_connection_new(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c']]], @@ -1296,7 +1297,7 @@ var searchData= ['remmina_5frdp_5fui_5fcursor',['REMMINA_RDP_UI_CURSOR',['../rdp__plugin_8h.html#a1e2313a63a9cfd208ab722cc1e0ee072ac32b00c17604d850f95b8117c419dcfe',1,'rdp_plugin.h']]], ['remmina_5frdp_5fui_5fevent',['REMMINA_RDP_UI_EVENT',['../rdp__plugin_8h.html#a1e2313a63a9cfd208ab722cc1e0ee072aa5f6f338ffaa4bed53b225cf54b50000',1,'rdp_plugin.h']]], ['remmina_5frdp_5fui_5fevent_5fdestroy_5fcairo_5fsurface',['REMMINA_RDP_UI_EVENT_DESTROY_CAIRO_SURFACE',['../rdp__plugin_8h.html#a70cc17b1d3603d036f962a0ae8496b35ad2dd5f6251de0ac7afe2f962c829aa48',1,'REMMINA_RDP_UI_EVENT_DESTROY_CAIRO_SURFACE(): rdp_plugin.h'],['../rdp__event_8c.html#acd5f1bd57553006fdbc60d62af433e31',1,'remmina_rdp_ui_event_destroy_cairo_surface(RemminaProtocolWidget *gp, RemminaPluginRdpUiObject *ui): rdp_event.c']]], - ['remmina_5frdp_5fui_5fevent_5fupdate_5fscale',['REMMINA_RDP_UI_EVENT_UPDATE_SCALE',['../rdp__plugin_8h.html#a70cc17b1d3603d036f962a0ae8496b35a5bec41fd19576fc5c3e397366461dfe4',1,'REMMINA_RDP_UI_EVENT_UPDATE_SCALE(): rdp_plugin.h'],['../rdp__event_8c.html#ae0e0d42524cb165cd6d26553c104dbde',1,'remmina_rdp_ui_event_update_scale(RemminaProtocolWidget *gp, RemminaPluginRdpUiObject *ui): rdp_event.c']]], + ['remmina_5frdp_5fui_5fevent_5fupdate_5fscale',['remmina_rdp_ui_event_update_scale',['../rdp__event_8c.html#ae0e0d42524cb165cd6d26553c104dbde',1,'remmina_rdp_ui_event_update_scale(RemminaProtocolWidget *gp, RemminaPluginRdpUiObject *ui): rdp_event.c'],['../rdp__plugin_8h.html#a70cc17b1d3603d036f962a0ae8496b35a5bec41fd19576fc5c3e397366461dfe4',1,'REMMINA_RDP_UI_EVENT_UPDATE_SCALE(): rdp_plugin.h']]], ['remmina_5frdp_5fui_5fnocodec',['REMMINA_RDP_UI_NOCODEC',['../rdp__plugin_8h.html#a1e2313a63a9cfd208ab722cc1e0ee072a96cf99f0ed1b7e1a798ebb358eff0d1b',1,'rdp_plugin.h']]], ['remmina_5frdp_5fui_5freconnect_5fprogress',['REMMINA_RDP_UI_RECONNECT_PROGRESS',['../rdp__plugin_8h.html#a1e2313a63a9cfd208ab722cc1e0ee072a5b2f8ce562cd1720b7a985f3a7c15ea7',1,'rdp_plugin.h']]], ['remmina_5frdp_5fui_5fupdate_5fregions',['REMMINA_RDP_UI_UPDATE_REGIONS',['../rdp__plugin_8h.html#a1e2313a63a9cfd208ab722cc1e0ee072acd86c5f1b34b0d7168c94892cfd2cb9e',1,'rdp_plugin.h']]], @@ -1424,7 +1425,7 @@ var searchData= ['remmina_5fssh_5ftunnel_5fcancel_5faccept',['remmina_ssh_tunnel_cancel_accept',['../remmina__ssh_8h.html#ae9f52b1a3a545acae8c93007e20ec909',1,'remmina_ssh.h']]], ['remmina_5fssh_5ftunnel_5ffree',['remmina_ssh_tunnel_free',['../remmina__ssh_8h.html#a223f8dd7a678bcec2ece40a2d8f7ea06',1,'remmina_ssh.h']]], ['remmina_5fssh_5ftunnel_5fnew_5ffrom_5ffile',['remmina_ssh_tunnel_new_from_file',['../remmina__ssh_8h.html#abf04fd329ab77bbd4f6aa1cb1eaa349d',1,'remmina_ssh.h']]], - ['remmina_5fssh_5ftunnel_5fopen',['REMMINA_SSH_TUNNEL_OPEN',['../remmina__ssh_8h.html#a77867ab4129f63159b37bca3b652a798a78cac65c66c1f72592488c7c5728ea14',1,'REMMINA_SSH_TUNNEL_OPEN(): remmina_ssh.h'],['../remmina__ssh_8h.html#a52b3f47eac79f2781ba81d61505f4f53',1,'remmina_ssh_tunnel_open(RemminaSSHTunnel *tunnel, const gchar *host, gint port, gint local_port): remmina_ssh.h']]], + ['remmina_5fssh_5ftunnel_5fopen',['remmina_ssh_tunnel_open',['../remmina__ssh_8h.html#a52b3f47eac79f2781ba81d61505f4f53',1,'remmina_ssh_tunnel_open(RemminaSSHTunnel *tunnel, const gchar *host, gint port, gint local_port): remmina_ssh.h'],['../remmina__ssh_8h.html#a77867ab4129f63159b37bca3b652a798a78cac65c66c1f72592488c7c5728ea14',1,'REMMINA_SSH_TUNNEL_OPEN(): remmina_ssh.h']]], ['remmina_5fssh_5ftunnel_5freverse',['remmina_ssh_tunnel_reverse',['../remmina__ssh_8h.html#ae47c8270267b02b9c0ff5b36074101c2',1,'remmina_ssh_tunnel_reverse(RemminaSSHTunnel *tunnel, gint port, gint local_port): remmina_ssh.h'],['../remmina__ssh_8h.html#a77867ab4129f63159b37bca3b652a798ae14c0d50235951946ca18866a1329459',1,'REMMINA_SSH_TUNNEL_REVERSE(): remmina_ssh.h']]], ['remmina_5fssh_5ftunnel_5fterminated',['remmina_ssh_tunnel_terminated',['../remmina__ssh_8h.html#aeb20d31243a4d30e469a34fe01684e38',1,'remmina_ssh.h']]], ['remmina_5fssh_5ftunnel_5fxport',['REMMINA_SSH_TUNNEL_XPORT',['../remmina__ssh_8h.html#a77867ab4129f63159b37bca3b652a798afbca41cd7b252c2594e1d53cd081b326',1,'REMMINA_SSH_TUNNEL_XPORT(): remmina_ssh.h'],['../remmina__ssh_8h.html#aba49db2ced40e21e8adfad69dcfda2c4',1,'remmina_ssh_tunnel_xport(RemminaSSHTunnel *tunnel, gboolean bindlocalhost): remmina_ssh.h']]], @@ -1599,7 +1600,7 @@ var searchData= ['remminalanguagewrapperplugin',['RemminaLanguageWrapperPlugin',['../plugin_8h.html#a4cc4789bb1ba76d339b61b364399c304',1,'plugin.h']]], ['remminalogwindow',['RemminaLogWindow',['../remmina__log_8c.html#ad5a920aad512279bb932bcb26a2c3c19',1,'remmina_log.c']]], ['remminalogwindowclass',['RemminaLogWindowClass',['../remmina__log_8c.html#a5682db89dd84e1c413326e17a4f79dbe',1,'remmina_log.c']]], - ['remminamain',['remminamain',['../remmina__main_8c.html#ab7c680e1f6ffeef21cb928a083d36d89',1,'remminamain(): remmina_main.c'],['../remmina__main_8h.html#ad17d9a48f2b3f84e17baa91104bc6cb1',1,'RemminaMain(): remmina_main.h']]], + ['remminamain',['RemminaMain',['../remmina__main_8h.html#ad17d9a48f2b3f84e17baa91104bc6cb1',1,'RemminaMain(): remmina_main.h'],['../remmina__main_8c.html#ab7c680e1f6ffeef21cb928a083d36d89',1,'remminamain(): remmina_main.c']]], ['remminamainpriv',['RemminaMainPriv',['../remmina__main_8h.html#a49e7c1b5d4dcfd155886e39d78b3d052',1,'remmina_main.h']]], ['remminamessagepanelcallback',['RemminaMessagePanelCallback',['../remmina__message__panel_8h.html#ae2923c94c1caf1ac4a7eb48361d2670a',1,'remmina_message_panel.h']]], ['remminamessagepanelflags',['RemminaMessagePanelFlags',['../types_8h.html#a341a0a8b6509633809d99348cc3ba486',1,'types.h']]], diff --git a/public/search/all_6.js b/public/search/all_6.js index cd97cab82..767bf4826 100644 --- a/public/search/all_6.js +++ b/public/search/all_6.js @@ -31,7 +31,7 @@ var searchData= ['filename_5fcolumn',['FILENAME_COLUMN',['../remmina__main_8c.html#a385c44f6fb256e5716a2302a5b940388a8c5d264253ed2fc8f96ffcee508db93d',1,'remmina_main.c']]], ['filetype',['filetype',['../struct_remmina_plugin_loader.html#a56f300db088d387cc4de9dbcd4b8e96f',1,'RemminaPluginLoader']]], ['find_5fprotocol_5fsetting',['find_protocol_setting',['../remmina__file_8c.html#a1399e5b83aa040b6613cf98be45b4c99',1,'remmina_file.c']]], - ['flags',['Flags',['../structremmina__plugin__rdp__event.html#ab1ee38a965bda260c81a55eedbd97114',1,'remmina_plugin_rdp_event::Flags()'],['../struct_py_g_object.html#a517264b1e7fdb622956923bd5e59288c',1,'PyGObject::flags()'],['../structremmina__plugin__rdp__event.html#a7cee906e36975da3aadf6874da5da49c',1,'remmina_plugin_rdp_event::flags()'],['../struct___dialog_data.html#a4110c1f36565f5926035c9ed1f060893',1,'_DialogData::flags()']]], + ['flags',['flags',['../struct_py_g_object.html#a517264b1e7fdb622956923bd5e59288c',1,'PyGObject::flags()'],['../structremmina__plugin__rdp__event.html#a7cee906e36975da3aadf6874da5da49c',1,'remmina_plugin_rdp_event::flags()'],['../struct___dialog_data.html#a4110c1f36565f5926035c9ed1f060893',1,'_DialogData::flags()'],['../structremmina__plugin__rdp__event.html#ab1ee38a965bda260c81a55eedbd97114',1,'remmina_plugin_rdp_event::Flags()']]], ['flags_5fadd',['flags_add',['../struct___py_g_object___functions.html#a16c1bbbcaa3751066da103df308a515d',1,'_PyGObject_Functions']]], ['flags_5fadd_5fconstants',['flags_add_constants',['../struct___py_g_object___functions.html#a8c63a8826b8c2c19a54ff0e059b5a6cd',1,'_PyGObject_Functions']]], ['flags_5ffrom_5fgtype',['flags_from_gtype',['../struct___py_g_object___functions.html#a154d872bd50af4f8cb30fbf035015c97',1,'_PyGObject_Functions']]], diff --git a/public/search/all_d.js b/public/search/all_d.js index 9d1178a0a..730e2f830 100644 --- a/public/search/all_d.js +++ b/public/search/all_d.js @@ -17,6 +17,7 @@ var searchData= ['menu_5fheader_5fbutton',['menu_header_button',['../struct___remmina_main.html#ab3be770af5f21758fa641b274ca967ec',1,'_RemminaMain']]], ['menu_5fitem',['menu_item',['../struct___remmina_applet_menu_item.html#a6d1f49b26c899b6ec61d5d28efe7b46c',1,'_RemminaAppletMenuItem']]], ['menu_5fpopup',['menu_popup',['../struct___remmina_main.html#a2d6960ab62869638a77d2fe5bd72c7f6',1,'_RemminaMain']]], + ['menu_5fpopup_5fdelete_5frc',['menu_popup_delete_rc',['../struct___remmina_main.html#a98a1ddd6aebc35c131f8de819a3d861f',1,'_RemminaMain']]], ['menu_5fpopup_5ffull',['menu_popup_full',['../struct___remmina_main.html#a1575015519fedca001bb26e129331b62',1,'_RemminaMain']]], ['menuanimation_5fcheck',['menuanimation_check',['../struct___remmina_plugin_rdpset_grid.html#a5ed6dc93d2f43db961c3c0a3a92f2d4d',1,'_RemminaPluginRdpsetGrid']]], ['menuitem_5fconnection_5fquit',['menuitem_connection_quit',['../struct___remmina_main.html#a37436a0fbd3d64082192826328fe063a',1,'_RemminaMain']]], diff --git a/public/search/functions_11.js b/public/search/functions_11.js index 440c99ebd..d81c6f61e 100644 --- a/public/search/functions_11.js +++ b/public/search/functions_11.js @@ -409,6 +409,7 @@ var searchData= ['remmina_5fmain_5fon_5faction_5fconnection_5fconnect',['remmina_main_on_action_connection_connect',['../remmina__main_8c.html#a6b30ed832369f3a7153aa63f98873c9d',1,'remmina_main_on_action_connection_connect(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c'],['../remmina__main_8h.html#a6b30ed832369f3a7153aa63f98873c9d',1,'remmina_main_on_action_connection_connect(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c']]], ['remmina_5fmain_5fon_5faction_5fconnection_5fcopy',['remmina_main_on_action_connection_copy',['../remmina__main_8c.html#a44eb44c6391f53a19c6f1fdf9a39a8c1',1,'remmina_main_on_action_connection_copy(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c'],['../remmina__main_8h.html#a44eb44c6391f53a19c6f1fdf9a39a8c1',1,'remmina_main_on_action_connection_copy(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c']]], ['remmina_5fmain_5fon_5faction_5fconnection_5fdelete',['remmina_main_on_action_connection_delete',['../remmina__main_8c.html#a10e574723222f5df9db456977e62a093',1,'remmina_main_on_action_connection_delete(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c'],['../remmina__main_8h.html#a10e574723222f5df9db456977e62a093',1,'remmina_main_on_action_connection_delete(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c']]], + ['remmina_5fmain_5fon_5faction_5fconnection_5fdelete_5fmultiple',['remmina_main_on_action_connection_delete_multiple',['../remmina__main_8c.html#af56bada711b2fc9c50af83b8b62dfe8b',1,'remmina_main_on_action_connection_delete_multiple(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c'],['../remmina__main_8h.html#af56bada711b2fc9c50af83b8b62dfe8b',1,'remmina_main_on_action_connection_delete_multiple(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c']]], ['remmina_5fmain_5fon_5faction_5fconnection_5fedit',['remmina_main_on_action_connection_edit',['../remmina__main_8c.html#adfbfc580d25b58d09770a7d33ffe03cc',1,'remmina_main_on_action_connection_edit(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c'],['../remmina__main_8h.html#adfbfc580d25b58d09770a7d33ffe03cc',1,'remmina_main_on_action_connection_edit(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c']]], ['remmina_5fmain_5fon_5faction_5fconnection_5fexternal_5ftools',['remmina_main_on_action_connection_external_tools',['../remmina__main_8c.html#abcf8bd8ca57b389264ff9739a61efdc1',1,'remmina_main_on_action_connection_external_tools(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c'],['../remmina__main_8h.html#abcf8bd8ca57b389264ff9739a61efdc1',1,'remmina_main_on_action_connection_external_tools(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c']]], ['remmina_5fmain_5fon_5faction_5fconnection_5fnew',['remmina_main_on_action_connection_new',['../remmina__main_8c.html#a52cc21537ff003b9d0fbdb9040c811af',1,'remmina_main_on_action_connection_new(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c'],['../remmina__main_8h.html#a52cc21537ff003b9d0fbdb9040c811af',1,'remmina_main_on_action_connection_new(GSimpleAction *action, GVariant *param, gpointer data): remmina_main.c']]], diff --git a/public/search/variables_6.js b/public/search/variables_6.js index 4a1c732e3..354ec16da 100644 --- a/public/search/variables_6.js +++ b/public/search/variables_6.js @@ -25,7 +25,7 @@ var searchData= ['filechooserbutton_5foptions_5fscreenshots_5fpath',['filechooserbutton_options_screenshots_path',['../struct___remmina_pref_dialog.html#ae766dd561f1bf23723306f7a70015f27',1,'_RemminaPrefDialog']]], ['filename',['filename',['../struct___remmina_applet_menu_item.html#aac9b89701606ff0f130f36ec0df55674',1,'_RemminaAppletMenuItem::filename()'],['../struct___remmina_file.html#a5edb4595f0c83cae611b557bfba02a07',1,'_RemminaFile::filename()'],['../structdistro__info.html#a1999084b11586bdb56bc2453fce7f633',1,'distro_info::filename()']]], ['filetype',['filetype',['../struct_remmina_plugin_loader.html#a56f300db088d387cc4de9dbcd4b8e96f',1,'RemminaPluginLoader']]], - ['flags',['Flags',['../structremmina__plugin__rdp__event.html#ab1ee38a965bda260c81a55eedbd97114',1,'remmina_plugin_rdp_event::Flags()'],['../struct_py_g_object.html#a517264b1e7fdb622956923bd5e59288c',1,'PyGObject::flags()'],['../structremmina__plugin__rdp__event.html#a7cee906e36975da3aadf6874da5da49c',1,'remmina_plugin_rdp_event::flags()'],['../struct___dialog_data.html#a4110c1f36565f5926035c9ed1f060893',1,'_DialogData::flags()']]], + ['flags',['flags',['../struct_py_g_object.html#a517264b1e7fdb622956923bd5e59288c',1,'PyGObject::flags()'],['../structremmina__plugin__rdp__event.html#a7cee906e36975da3aadf6874da5da49c',1,'remmina_plugin_rdp_event::flags()'],['../struct___dialog_data.html#a4110c1f36565f5926035c9ed1f060893',1,'_DialogData::flags()'],['../structremmina__plugin__rdp__event.html#ab1ee38a965bda260c81a55eedbd97114',1,'remmina_plugin_rdp_event::Flags()']]], ['flags_5fadd',['flags_add',['../struct___py_g_object___functions.html#a16c1bbbcaa3751066da103df308a515d',1,'_PyGObject_Functions']]], ['flags_5fadd_5fconstants',['flags_add_constants',['../struct___py_g_object___functions.html#a8c63a8826b8c2c19a54ff0e059b5a6cd',1,'_PyGObject_Functions']]], ['flags_5ffrom_5fgtype',['flags_from_gtype',['../struct___py_g_object___functions.html#a154d872bd50af4f8cb30fbf035015c97',1,'_PyGObject_Functions']]], diff --git a/public/search/variables_c.js b/public/search/variables_c.js index 8c008c804..978ce4047 100644 --- a/public/search/variables_c.js +++ b/public/search/variables_c.js @@ -15,6 +15,7 @@ var searchData= ['menu_5fheader_5fbutton',['menu_header_button',['../struct___remmina_main.html#ab3be770af5f21758fa641b274ca967ec',1,'_RemminaMain']]], ['menu_5fitem',['menu_item',['../struct___remmina_applet_menu_item.html#a6d1f49b26c899b6ec61d5d28efe7b46c',1,'_RemminaAppletMenuItem']]], ['menu_5fpopup',['menu_popup',['../struct___remmina_main.html#a2d6960ab62869638a77d2fe5bd72c7f6',1,'_RemminaMain']]], + ['menu_5fpopup_5fdelete_5frc',['menu_popup_delete_rc',['../struct___remmina_main.html#a98a1ddd6aebc35c131f8de819a3d861f',1,'_RemminaMain']]], ['menu_5fpopup_5ffull',['menu_popup_full',['../struct___remmina_main.html#a1575015519fedca001bb26e129331b62',1,'_RemminaMain']]], ['menuanimation_5fcheck',['menuanimation_check',['../struct___remmina_plugin_rdpset_grid.html#a5ed6dc93d2f43db961c3c0a3a92f2d4d',1,'_RemminaPluginRdpsetGrid']]], ['menuitem_5fconnection_5fquit',['menuitem_connection_quit',['../struct___remmina_main.html#a37436a0fbd3d64082192826328fe063a',1,'_RemminaMain']]], diff --git a/public/struct___remmina_main.html b/public/struct___remmina_main.html index 848ab3d58..68d07046f 100644 --- a/public/struct___remmina_main.html +++ b/public/struct___remmina_main.html @@ -103,6 +103,8 @@ Data Fields   GtkMenu * menu_popup_full   +GtkMenu * menu_popup_delete_rc +  GtkRadioMenuItem * menuitem_view_mode_list   GtkRadioMenuItem * menuitem_view_mode_tree @@ -172,7 +174,7 @@ Data Fields
    -

    Definition at line 83 of file remmina_main.h.

    +

    Definition at line 84 of file remmina_main.h.

    @@ -188,7 +190,7 @@ Data Fields
    -

    Definition at line 68 of file remmina_main.h.

    +

    Definition at line 69 of file remmina_main.h.

    @@ -220,7 +222,7 @@ Data Fields
    -

    Definition at line 60 of file remmina_main.h.

    +

    Definition at line 61 of file remmina_main.h.

    @@ -236,7 +238,7 @@ Data Fields
    -

    Definition at line 59 of file remmina_main.h.

    +

    Definition at line 60 of file remmina_main.h.

    @@ -252,7 +254,7 @@ Data Fields
    -

    Definition at line 71 of file remmina_main.h.

    +

    Definition at line 72 of file remmina_main.h.

    @@ -268,7 +270,7 @@ Data Fields
    -

    Definition at line 78 of file remmina_main.h.

    +

    Definition at line 79 of file remmina_main.h.

    @@ -284,7 +286,7 @@ Data Fields
    -

    Definition at line 75 of file remmina_main.h.

    +

    Definition at line 76 of file remmina_main.h.

    @@ -300,7 +302,7 @@ Data Fields
    -

    Definition at line 74 of file remmina_main.h.

    +

    Definition at line 75 of file remmina_main.h.

    @@ -316,7 +318,7 @@ Data Fields
    -

    Definition at line 79 of file remmina_main.h.

    +

    Definition at line 80 of file remmina_main.h.

    @@ -332,7 +334,7 @@ Data Fields
    -

    Definition at line 77 of file remmina_main.h.

    +

    Definition at line 78 of file remmina_main.h.

    @@ -348,7 +350,7 @@ Data Fields
    -

    Definition at line 76 of file remmina_main.h.

    +

    Definition at line 77 of file remmina_main.h.

    @@ -364,7 +366,7 @@ Data Fields
    -

    Definition at line 69 of file remmina_main.h.

    +

    Definition at line 70 of file remmina_main.h.

    @@ -380,7 +382,7 @@ Data Fields
    -

    Definition at line 70 of file remmina_main.h.

    +

    Definition at line 71 of file remmina_main.h.

    @@ -414,6 +416,22 @@ Data Fields

    Definition at line 52 of file remmina_main.h.

    + + + +

    ◆ menu_popup_delete_rc

    + +
    +
    + + + + +
    GtkMenu* _RemminaMain::menu_popup_delete_rc
    +
    + +

    Definition at line 55 of file remmina_main.h.

    +
    @@ -444,7 +462,7 @@ Data Fields
    -

    Definition at line 57 of file remmina_main.h.

    +

    Definition at line 58 of file remmina_main.h.

    @@ -460,7 +478,7 @@ Data Fields
    -

    Definition at line 55 of file remmina_main.h.

    +

    Definition at line 56 of file remmina_main.h.

    @@ -476,7 +494,7 @@ Data Fields
    -

    Definition at line 56 of file remmina_main.h.

    +

    Definition at line 57 of file remmina_main.h.

    @@ -492,7 +510,7 @@ Data Fields
    -

    Definition at line 85 of file remmina_main.h.

    +

    Definition at line 86 of file remmina_main.h.

    @@ -508,7 +526,7 @@ Data Fields
    -

    Definition at line 81 of file remmina_main.h.

    +

    Definition at line 82 of file remmina_main.h.

    @@ -524,7 +542,7 @@ Data Fields
    -

    Definition at line 84 of file remmina_main.h.

    +

    Definition at line 85 of file remmina_main.h.

    @@ -540,7 +558,7 @@ Data Fields
    -

    Definition at line 66 of file remmina_main.h.

    +

    Definition at line 67 of file remmina_main.h.

    @@ -556,7 +574,7 @@ Data Fields
    -

    Definition at line 62 of file remmina_main.h.

    +

    Definition at line 63 of file remmina_main.h.

    @@ -572,7 +590,7 @@ Data Fields
    -

    Definition at line 80 of file remmina_main.h.

    +

    Definition at line 81 of file remmina_main.h.

    @@ -588,7 +606,7 @@ Data Fields
    -

    Definition at line 63 of file remmina_main.h.

    +

    Definition at line 64 of file remmina_main.h.

    @@ -604,7 +622,7 @@ Data Fields
    -

    Definition at line 73 of file remmina_main.h.

    +

    Definition at line 74 of file remmina_main.h.

    @@ -620,7 +638,7 @@ Data Fields
    -

    Definition at line 65 of file remmina_main.h.

    +

    Definition at line 66 of file remmina_main.h.

    @@ -636,7 +654,7 @@ Data Fields
    -

    Definition at line 64 of file remmina_main.h.

    +

    Definition at line 65 of file remmina_main.h.

    diff --git a/public/struct___remmina_main.js b/public/struct___remmina_main.js index 16e2c34e8..c438131ee 100644 --- a/public/struct___remmina_main.js +++ b/public/struct___remmina_main.js @@ -16,6 +16,7 @@ var struct___remmina_main = [ "entry_quick_connect_server", "struct___remmina_main.html#ac2eff9c56cc7830bcf9ca4bfdf216095", null ], [ "menu_header_button", "struct___remmina_main.html#ab3be770af5f21758fa641b274ca967ec", null ], [ "menu_popup", "struct___remmina_main.html#a2d6960ab62869638a77d2fe5bd72c7f6", null ], + [ "menu_popup_delete_rc", "struct___remmina_main.html#a98a1ddd6aebc35c131f8de819a3d861f", null ], [ "menu_popup_full", "struct___remmina_main.html#a1575015519fedca001bb26e129331b62", null ], [ "menuitem_connection_quit", "struct___remmina_main.html#a37436a0fbd3d64082192826328fe063a", null ], [ "menuitem_view_mode_list", "struct___remmina_main.html#a6288ed69d372d1047ce94c74e77e0fd4", null ], diff --git a/public/struct___remmina_main_priv.html b/public/struct___remmina_main_priv.html index fd9c6246c..79ba95d69 100644 --- a/public/struct___remmina_main_priv.html +++ b/public/struct___remmina_main_priv.html @@ -112,7 +112,7 @@ Data Fields

    Detailed Description

    -

    Definition at line 88 of file remmina_main.h.

    +

    Definition at line 89 of file remmina_main.h.

    Field Documentation

    ◆ expanded_group

    @@ -126,7 +126,7 @@ Data Fields
    -

    Definition at line 98 of file remmina_main.h.

    +

    Definition at line 99 of file remmina_main.h.

    @@ -142,7 +142,7 @@ Data Fields
    -

    Definition at line 89 of file remmina_main.h.

    +

    Definition at line 90 of file remmina_main.h.

    @@ -158,7 +158,7 @@ Data Fields
    -

    Definition at line 90 of file remmina_main.h.

    +

    Definition at line 91 of file remmina_main.h.

    @@ -174,7 +174,7 @@ Data Fields
    -

    Definition at line 91 of file remmina_main.h.

    +

    Definition at line 92 of file remmina_main.h.

    @@ -190,7 +190,7 @@ Data Fields
    -

    Definition at line 93 of file remmina_main.h.

    +

    Definition at line 94 of file remmina_main.h.

    @@ -206,7 +206,7 @@ Data Fields
    -

    Definition at line 97 of file remmina_main.h.

    +

    Definition at line 98 of file remmina_main.h.

    @@ -222,7 +222,7 @@ Data Fields
    -

    Definition at line 95 of file remmina_main.h.

    +

    Definition at line 96 of file remmina_main.h.

    @@ -238,7 +238,7 @@ Data Fields
    -

    Definition at line 96 of file remmina_main.h.

    +

    Definition at line 97 of file remmina_main.h.

    -- cgit v1.2.3