summaryrefslogtreecommitdiff
path: root/src/terminal-actions.c
diff options
context:
space:
mode:
authormbkma <[email protected]>2026-02-01 12:41:12 +0100
committermbkma <[email protected]>2026-02-01 18:10:50 +0100
commitdd774bef74932019b4f5455e830c82ccaf949c16 (patch)
tree776287f7b9dbce603b669736c6c5d0dc0ed93da0 /src/terminal-actions.c
parent5a9b1e0e9a1236a1ab4bfd8bc64a0935e90ad9f6 (diff)
downloadmate-terminal-ui-manager.tar.bz2
mate-terminal-ui-manager.tar.xz
migrate from deprecated GtkUiManager to GtkBuilderui-manager
Diffstat (limited to 'src/terminal-actions.c')
-rw-r--r--src/terminal-actions.c294
1 files changed, 294 insertions, 0 deletions
diff --git a/src/terminal-actions.c b/src/terminal-actions.c
index 0afc1f4..1b86f06 100644
--- a/src/terminal-actions.c
+++ b/src/terminal-actions.c
@@ -23,11 +23,19 @@
#include "terminal-actions.h"
#include "terminal-app.h"
+#include "terminal-encoding.h"
#include "terminal-intl.h"
+#include "terminal-profile.h"
#include "terminal-screen.h"
#include "terminal-util.h"
#include "terminal-window.h"
+/* Forward declarations for functions defined in terminal-window.c */
+void terminal_window_paste_uris_received (GtkClipboard *clipboard,
+ gchar **uris,
+ gpointer user_data);
+void terminal_window_save_contents (TerminalWindow *window);
+
/*
* Application-level action callbacks
*/
@@ -546,14 +554,290 @@ action_about (GSimpleAction *action,
terminal_window_show_about_dialog (parent);
}
+static void
+action_new_window_win (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data)
+{
+ TerminalWindow *window = get_terminal_window (user_data);
+ if (!window)
+ return;
+
+ TerminalApp *app = terminal_app_get ();
+ TerminalProfile *profile = terminal_app_get_profile_for_new_term (app);
+
+ if (profile)
+ {
+ TerminalScreen *screen = terminal_window_get_active (window);
+ char *working_dir = NULL;
+ GdkScreen *gdk_screen;
+
+ if (screen)
+ working_dir = terminal_screen_get_current_dir_with_fallback (screen);
+
+ gdk_screen = gtk_widget_get_screen (GTK_WIDGET (window));
+ TerminalWindow *new_window = terminal_app_new_window (app, gdk_screen);
+ terminal_app_new_terminal (app, new_window, profile,
+ NULL, NULL,
+ working_dir,
+ screen ? terminal_screen_get_initial_environment (screen) : NULL,
+ 1.0);
+ gtk_window_present (GTK_WINDOW (new_window));
+ g_free (working_dir);
+ }
+}
+
+static void
+action_leave_fullscreen (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data)
+{
+ TerminalWindow *window = get_terminal_window (user_data);
+ if (!window)
+ return;
+
+ gtk_window_unfullscreen (GTK_WINDOW (window));
+}
+
+static void
+action_paste_uris (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data)
+{
+ TerminalWindow *window = get_terminal_window (user_data);
+ if (!window)
+ return;
+
+ TerminalScreen *screen = terminal_window_get_active (window);
+ if (screen)
+ {
+ GtkClipboard *clipboard;
+ clipboard = gtk_widget_get_clipboard (GTK_WIDGET (window), GDK_SELECTION_CLIPBOARD);
+ gtk_clipboard_request_uris (clipboard,
+ (GtkClipboardURIReceivedFunc) terminal_window_paste_uris_received,
+ screen);
+ }
+}
+
+static void
+action_select_profile (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data)
+{
+ TerminalWindow *window = get_terminal_window (user_data);
+ if (!window)
+ return;
+
+ const char *profile_name = g_variant_get_string (parameter, NULL);
+ if (!profile_name)
+ return;
+
+ TerminalApp *app = terminal_app_get ();
+ TerminalProfile *profile = terminal_app_get_profile_by_visible_name (app, profile_name);
+ if (profile)
+ {
+ TerminalScreen *screen = terminal_window_get_active (window);
+ if (screen)
+ terminal_screen_set_profile (screen, profile);
+ }
+}
+
+static void
+action_new_tab_profile (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data)
+{
+ TerminalWindow *window = get_terminal_window (user_data);
+ if (!window)
+ return;
+
+ const char *profile_name = g_variant_get_string (parameter, NULL);
+ if (!profile_name)
+ return;
+
+ TerminalApp *app = terminal_app_get ();
+ TerminalProfile *profile = terminal_app_get_profile_by_visible_name (app, profile_name);
+ if (profile)
+ {
+ TerminalScreen *screen = terminal_window_get_active (window);
+ char *working_dir = NULL;
+
+ if (screen)
+ working_dir = terminal_screen_get_current_dir_with_fallback (screen);
+
+ terminal_app_new_terminal (app, window, profile,
+ NULL, NULL,
+ working_dir,
+ screen ? terminal_screen_get_initial_environment (screen) : NULL,
+ 1.0);
+ g_free (working_dir);
+ }
+}
+
+static void
+action_new_window_profile (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data)
+{
+ TerminalWindow *window = get_terminal_window (user_data);
+ if (!window)
+ return;
+
+ const char *profile_name = g_variant_get_string (parameter, NULL);
+ if (!profile_name)
+ return;
+
+ TerminalApp *app = terminal_app_get ();
+ TerminalProfile *profile = terminal_app_get_profile_by_visible_name (app, profile_name);
+ if (profile)
+ {
+ TerminalScreen *screen = terminal_window_get_active (window);
+ char *working_dir = NULL;
+ GdkScreen *gdk_screen;
+
+ if (screen)
+ working_dir = terminal_screen_get_current_dir_with_fallback (screen);
+
+ gdk_screen = gtk_widget_get_screen (GTK_WIDGET (window));
+ TerminalWindow *new_window = terminal_app_new_window (app, gdk_screen);
+ terminal_app_new_terminal (app, new_window, profile,
+ NULL, NULL,
+ working_dir,
+ screen ? terminal_screen_get_initial_environment (screen) : NULL,
+ 1.0);
+ gtk_window_present (GTK_WINDOW (new_window));
+ g_free (working_dir);
+ }
+}
+
+static void
+action_profile_next (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data)
+{
+ TerminalWindow *window = get_terminal_window (user_data);
+ if (!window)
+ return;
+
+ TerminalScreen *screen = terminal_window_get_active (window);
+ if (!screen)
+ return;
+
+ TerminalApp *app = terminal_app_get ();
+ TerminalProfile *current = terminal_screen_get_profile (screen);
+ GList *profiles = terminal_app_get_profile_list (app);
+ GList *l;
+
+ for (l = profiles; l != NULL; l = l->next)
+ {
+ if (l->data == current)
+ {
+ TerminalProfile *next = l->next ? l->next->data : profiles->data;
+ terminal_screen_set_profile (screen, next);
+ break;
+ }
+ }
+ g_list_free (profiles);
+}
+
+static void
+action_profile_previous (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data)
+{
+ TerminalWindow *window = get_terminal_window (user_data);
+ if (!window)
+ return;
+
+ TerminalScreen *screen = terminal_window_get_active (window);
+ if (!screen)
+ return;
+
+ TerminalApp *app = terminal_app_get ();
+ TerminalProfile *current = terminal_screen_get_profile (screen);
+ GList *profiles = terminal_app_get_profile_list (app);
+ GList *l, *last = g_list_last (profiles);
+
+ for (l = profiles; l != NULL; l = l->next)
+ {
+ if (l->data == current)
+ {
+ TerminalProfile *prev = l->prev ? l->prev->data : last->data;
+ terminal_screen_set_profile (screen, prev);
+ break;
+ }
+ }
+ g_list_free (profiles);
+}
+
+static void
+action_select_encoding (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data)
+{
+ TerminalWindow *window = get_terminal_window (user_data);
+ if (!window)
+ return;
+
+ const char *encoding = g_variant_get_string (parameter, NULL);
+ if (!encoding)
+ return;
+
+ TerminalScreen *screen = terminal_window_get_active (window);
+ if (screen)
+ vte_terminal_set_encoding (VTE_TERMINAL (screen), encoding, NULL);
+}
+
+static void
+action_add_encoding (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data)
+{
+ TerminalWindow *window = get_terminal_window (user_data);
+ terminal_encoding_dialog_show (window ? GTK_WINDOW (window) : NULL);
+}
+
+static void
+action_save_contents (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data)
+{
+ TerminalWindow *window = get_terminal_window (user_data);
+ if (!window)
+ return;
+
+ terminal_window_save_contents (window);
+}
+
+static void
+action_switch_tab (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data)
+{
+ TerminalWindow *window = get_terminal_window (user_data);
+ if (!window)
+ return;
+
+ gint32 tab_num = g_variant_get_int32 (parameter);
+ GtkWidget *notebook = terminal_window_get_notebook (window);
+ if (notebook)
+ {
+ int n_pages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (notebook));
+ if (tab_num >= 0 && tab_num < n_pages)
+ gtk_notebook_set_current_page (GTK_NOTEBOOK (notebook), tab_num);
+ }
+}
+
/* Window action entries */
static const GActionEntry win_actions[] = {
{ TERMINAL_ACTION_NEW_TAB, action_new_tab, NULL, NULL, NULL },
+ { "new-window", action_new_window_win, NULL, NULL, NULL },
{ TERMINAL_ACTION_NEW_PROFILE, action_new_profile, NULL, NULL, NULL },
{ TERMINAL_ACTION_CLOSE_TAB, action_close_tab, NULL, NULL, NULL },
{ TERMINAL_ACTION_CLOSE_WINDOW, action_close_window, NULL, NULL, NULL },
{ TERMINAL_ACTION_COPY, action_copy, NULL, NULL, NULL },
{ TERMINAL_ACTION_PASTE, action_paste, NULL, NULL, NULL },
+ { "paste-uris", action_paste_uris, NULL, NULL, NULL },
{ TERMINAL_ACTION_SELECT_ALL, action_select_all, NULL, NULL, NULL },
{ TERMINAL_ACTION_KEYBINDINGS, action_keybindings, NULL, NULL, NULL },
{ TERMINAL_ACTION_CURRENT_PROFILE, action_current_profile, NULL, NULL, NULL },
@@ -561,6 +845,7 @@ static const GActionEntry win_actions[] = {
{ TERMINAL_ACTION_ZOOM_OUT, action_zoom_out, NULL, NULL, NULL },
{ TERMINAL_ACTION_ZOOM_NORMAL, action_zoom_normal, NULL, NULL, NULL },
{ TERMINAL_ACTION_FULLSCREEN, action_fullscreen, NULL, "false", NULL },
+ { "leave-fullscreen", action_leave_fullscreen, NULL, NULL, NULL },
{ TERMINAL_ACTION_MENUBAR, action_menubar, NULL, "true", NULL },
{ TERMINAL_ACTION_FIND, action_find, NULL, NULL, NULL },
{ TERMINAL_ACTION_FIND_NEXT, action_find_next, NULL, NULL, NULL },
@@ -574,6 +859,15 @@ static const GActionEntry win_actions[] = {
{ TERMINAL_ACTION_MOVE_TAB_RIGHT, action_move_tab_right, NULL, NULL, NULL },
{ TERMINAL_ACTION_DETACH_TAB, action_detach_tab, NULL, NULL, NULL },
{ "about", action_about, NULL, NULL, NULL },
+ { "select-profile", action_select_profile, "s", NULL, NULL },
+ { "new-tab-profile", action_new_tab_profile, "s", NULL, NULL },
+ { "new-window-profile", action_new_window_profile, "s", NULL, NULL },
+ { "profile-next", action_profile_next, NULL, NULL, NULL },
+ { "profile-previous", action_profile_previous, NULL, NULL, NULL },
+ { "select-encoding", action_select_encoding, "s", NULL, NULL },
+ { "add-encoding", action_add_encoding, NULL, NULL, NULL },
+ { "save-contents", action_save_contents, NULL, NULL, NULL },
+ { "switch-tab", action_switch_tab, "i", NULL, NULL },
};
/*