diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 0042e1fe67..ceea78b6a4 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -141,70 +141,6 @@ namespace Terminal { close_request.connect (on_delete_event); } - public Menu construct_context_menu_model () requires (current_terminal != null) { - var show_in_browser_uri = get_current_selection_link_or_pwd (); - var appinfo = Utils.get_default_app_for_uri (show_in_browser_uri); - - var open_in_browser_menuitem = new MenuItem ( - _("Show in %s").printf (appinfo != null ? appinfo.get_display_name () : _("Default application")), - TerminalWidget.ACTION_OPEN_IN_BROWSER - ); - open_in_browser_menuitem.set_attribute_value ("accel", new Variant ("s", TerminalWidget.ACCELS_OPEN_IN_BROWSER[0])); - - var copy_menuitem = new MenuItem ( - _("Copy"), - TerminalWidget.ACTION_COPY - ); - copy_menuitem.set_attribute_value ("accel", new Variant ("s", TerminalWidget.ACCELS_COPY[0])); - - var copy_last_output_menuitem = new MenuItem ( - _("Copy Last Output"), - TerminalWidget.ACTION_COPY_OUTPUT - ); - copy_last_output_menuitem.set_attribute_value ("accel", new Variant ("s", TerminalWidget.ACCELS_COPY_OUTPUT[0])); - - var clear_screen_menuitem = new MenuItem ( - _("Clear Screen"), - TerminalWidget.ACTION_CLEAR_SCREEN - ); - clear_screen_menuitem.set_attribute_value ("accel", new Variant ("s", TerminalWidget.ACCELS_CLEAR_SCREEN[0])); - - var reset_menuitem = new MenuItem ( - _("Reset"), - TerminalWidget.ACTION_RESET - ); - reset_menuitem.set_attribute_value ("accel", new Variant ("s", TerminalWidget.ACCELS_RESET[0])); - - var paste_menuitem = new MenuItem ( - _("Paste"), - TerminalWidget.ACTION_PASTE - ); - paste_menuitem.set_attribute_value ("accel", new Variant ("s", TerminalWidget.ACCELS_PASTE[0])); - - var select_all_menuitem = new MenuItem ( - _("Select All"), - TerminalWidget.ACTION_SELECT_ALL - ); - select_all_menuitem.set_attribute_value ("accel", new Variant ("s", TerminalWidget.ACCELS_SELECT_ALL[0])); - - var terminal_action_section = new Menu (); - terminal_action_section.append_item (copy_menuitem); - terminal_action_section.append_item (copy_last_output_menuitem); - terminal_action_section.append_item (paste_menuitem); - terminal_action_section.append_item (select_all_menuitem); - - var terminal_clear_reset_section = new Menu (); - terminal_clear_reset_section.append_item (clear_screen_menuitem); - terminal_clear_reset_section.append_item (reset_menuitem); - - var context_menu_model = new Menu (); - context_menu_model.append_item (open_in_browser_menuitem); - context_menu_model.append_section (null, terminal_action_section); - context_menu_model.append_section (null, terminal_clear_reset_section); - - return context_menu_model; - } - public void add_tab_with_working_directory ( string directory = "", string command = "", @@ -605,35 +541,6 @@ namespace Terminal { } } - private string? get_current_selection_link_or_pwd () requires (current_terminal != null) { - var link_uri = current_terminal.link_uri; - if (link_uri == null) { - if (current_terminal.get_has_selection ()) { - current_terminal.copy_primary (); - try { - var cp = Gdk.Display.get_default ().get_primary_clipboard ().get_content (); - if (cp != null) { - var val = Value (typeof (string)); - cp.get_value (ref val); - return val.dup_string (); - } - } catch (Error e) { - critical ("Unable to get clipboard contents"); - } - - return null; - } else { - return current_terminal.get_shell_location (); - } - } else { - if (!link_uri.contains ("://")) { - link_uri = "http://" + link_uri; - } - - return link_uri; - } - } - private void action_close_tab () { notebook.close_tab (); } diff --git a/src/Widgets/TerminalWidget.vala b/src/Widgets/TerminalWidget.vala index 71484a193f..81807a5de2 100644 --- a/src/Widgets/TerminalWidget.vala +++ b/src/Widgets/TerminalWidget.vala @@ -32,7 +32,6 @@ namespace Terminal { // There may be no associated tab while made restorable or when closing public unowned Adw.TabPage? tab; - public string? link_uri; public const string ACTION_OPEN_IN_BROWSER = "term.open-in-browser"; public const string ACTION_COPY = "term.copy"; @@ -117,6 +116,7 @@ namespace Terminal { private long remembered_command_end_row = 0; /* Only need to remember row at the moment */ public bool last_key_was_return = true; private bool child_has_exited = false; + private string? link_uri = null; private Gtk.EventControllerScroll scroll_controller; private double scroll_delta = 0.0; @@ -235,7 +235,7 @@ namespace Terminal { ulong once = 0; once = realize.connect (() => { clipboard = Gdk.Display.get_default ().get_clipboard (); - clipboard.changed.connect (setup_menu); + clipboard.changed.connect (update_actions_state); disconnect (once); }); @@ -488,7 +488,7 @@ namespace Terminal { return false; } - private void setup_menu () { + private void update_actions_state () { // Update the "Open in" menu option var appinfo = Utils.get_default_app_for_uri (get_current_selection_link_or_pwd ()); open_in_browser_action.set_enabled (appinfo != null); @@ -502,12 +502,76 @@ namespace Terminal { copy_output_action.set_enabled (has_output); } - private void popup_context_menu (double x, double y) { - setup_menu (); + private Menu construct_context_menu_model () { + update_actions_state (); + + var show_in_browser_uri = get_current_selection_link_or_pwd (); + var appinfo = Utils.get_default_app_for_uri (show_in_browser_uri); + + var open_in_browser_menuitem = new MenuItem ( + _("Show in %s").printf (appinfo != null ? appinfo.get_display_name () : _("Default application")), + ACTION_OPEN_IN_BROWSER + ); + open_in_browser_menuitem.set_attribute_value ("accel", new Variant ("s", TerminalWidget.ACCELS_OPEN_IN_BROWSER[0])); + + var copy_menuitem = new MenuItem ( + _("Copy"), + ACTION_COPY + ); + copy_menuitem.set_attribute_value ("accel", new Variant ("s", TerminalWidget.ACCELS_COPY[0])); - var context_menu_model = main_window.construct_context_menu_model (); + var copy_last_output_menuitem = new MenuItem ( + _("Copy Last Output"), + ACTION_COPY_OUTPUT + ); + copy_last_output_menuitem.set_attribute_value ("accel", new Variant ("s", TerminalWidget.ACCELS_COPY_OUTPUT[0])); + + var clear_screen_menuitem = new MenuItem ( + _("Clear Screen"), + ACTION_CLEAR_SCREEN + ); + clear_screen_menuitem.set_attribute_value ("accel", new Variant ("s", TerminalWidget.ACCELS_CLEAR_SCREEN[0])); + + var reset_menuitem = new MenuItem ( + _("Reset"), + ACTION_RESET + ); + reset_menuitem.set_attribute_value ("accel", new Variant ("s", TerminalWidget.ACCELS_RESET[0])); + + var paste_menuitem = new MenuItem ( + _("Paste"), + ACTION_PASTE + ); + paste_menuitem.set_attribute_value ("accel", new Variant ("s", TerminalWidget.ACCELS_PASTE[0])); + + var select_all_menuitem = new MenuItem ( + _("Select All"), + ACTION_SELECT_ALL + ); + select_all_menuitem.set_attribute_value ("accel", new Variant ("s", TerminalWidget.ACCELS_SELECT_ALL[0])); + + var terminal_action_section = new Menu (); + terminal_action_section.append_item (copy_menuitem); + terminal_action_section.append_item (copy_last_output_menuitem); + terminal_action_section.append_item (paste_menuitem); + terminal_action_section.append_item (select_all_menuitem); + + var terminal_clear_reset_section = new Menu (); + terminal_clear_reset_section.append_item (clear_screen_menuitem); + terminal_clear_reset_section.append_item (reset_menuitem); + + var context_menu_model = new Menu (); + context_menu_model.append_item (open_in_browser_menuitem); + context_menu_model.append_section (null, terminal_action_section); + context_menu_model.append_section (null, terminal_clear_reset_section); + + return context_menu_model; + } + + private void popup_context_menu (double x, double y) { + var context_menu_model = construct_context_menu_model (); - //NOTE For some reason using the built in context_menu and context_menu_model of vte-2.91-gtk4 + // NOTE For some reason using the built in context_menu and context_menu_model of vte-2.91-gtk4 // does not work at the moment so create our own. var new_context_menu = new Gtk.PopoverMenu.from_model (context_menu_model) { has_arrow = false,