Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 0 additions & 93 deletions src/MainWindow.vala
Original file line number Diff line number Diff line change
Expand Up @@ -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 = "",
Expand Down Expand Up @@ -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 ();
}
Expand Down
78 changes: 71 additions & 7 deletions src/Widgets/TerminalWidget.vala
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
});

Expand Down Expand Up @@ -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);
Expand All @@ -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,
Expand Down