Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package sakura for openSUSE:Factory checked in at 2025-09-24 15:25:05 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/sakura (Old) and /work/SRC/openSUSE:Factory/.sakura.new.27445 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "sakura" Wed Sep 24 15:25:05 2025 rev:11 rq:1306864 version:3.8.9 Changes: -------- --- /work/SRC/openSUSE:Factory/sakura/sakura.changes 2024-10-14 13:07:14.960810153 +0200 +++ /work/SRC/openSUSE:Factory/.sakura.new.27445/sakura.changes 2025-09-24 15:27:24.068230921 +0200 @@ -1,0 +2,12 @@ +Sun Sep 14 16:39:28 UTC 2025 - Andrea Manzini <[email protected]> + +- update to 3.8.9: + * Move orig_argc and orig_argv to sakura global struct + * Add keyword field to desktop file + * Don't give Gdk-CRITICAL error for non-set keyboard shortcuts + * feature: allow adjusting VTE line height from configuration + * sakura_key_press_cb(): do not return early if switch_tab_accelerator is + detected + * Add keybinding to open a new window (by spawning a new instance of Sakura) + +------------------------------------------------------------------- Old: ---- sakura-3.8.8.tar.bz2 New: ---- sakura-3.8.9.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ sakura.spec ++++++ --- /var/tmp/diff_new_pack.U25v67/_old 2025-09-24 15:27:24.504249278 +0200 +++ /var/tmp/diff_new_pack.U25v67/_new 2025-09-24 15:27:24.504249278 +0200 @@ -1,7 +1,7 @@ # # spec file for package sakura # -# Copyright (c) 2024 SUSE LLC +# Copyright (c) 2025 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,7 +17,7 @@ Name: sakura -Version: 3.8.8 +Version: 3.8.9 Release: 0 Summary: Terminal Emulator based on the VTE Library License: GPL-2.0-or-later @@ -34,9 +34,9 @@ BuildRequires: libstdc++-devel BuildRequires: pcre2-devel BuildRequires: pkgconfig -BuildRequires: pkgconfig(glib-2.0) >= 2.20 +BuildRequires: pkgconfig(glib-2.0) >= 2.40 BuildRequires: pkgconfig(gtk+-3.0) -BuildRequires: pkgconfig(vte-2.91) >= 0.38 +BuildRequires: pkgconfig(vte-2.91) >= 0.50 %description sakura is a vte-based terminal emulator. It aims to provide a terminal ++++++ sakura-3.8.8.tar.bz2 -> sakura-3.8.9.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sakura-3.8.8/AUTHORS new/sakura-3.8.9/AUTHORS --- old/sakura-3.8.8/AUTHORS 2024-08-11 00:01:49.000000000 +0200 +++ new/sakura-3.8.9/AUTHORS 2025-04-04 09:06:35.000000000 +0200 @@ -33,6 +33,7 @@ David Jensen <[email protected]> Adam Juraszek <[email protected]> Lado Kumsiashvili <[email protected]> + Daniel Kondor <[email protected]> Lukáš Lommer <[email protected]> Torbjörn Lönnemark <[email protected]> Yannick LM <[email protected]> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sakura-3.8.8/CMakeLists.txt new/sakura-3.8.9/CMakeLists.txt --- old/sakura-3.8.8/CMakeLists.txt 2024-08-11 00:01:49.000000000 +0200 +++ new/sakura-3.8.9/CMakeLists.txt 2025-04-04 09:06:35.000000000 +0200 @@ -2,7 +2,7 @@ CMAKE_POLICY(SET CMP0005 NEW) PROJECT (sakura) SET (AUTHOR "David Gómez Espinosa" INTERNAL "Author") -SET (VERSION "3.8.8") +SET (VERSION "3.8.9") INCLUDE (FindPkgConfig) @@ -15,6 +15,11 @@ IF (NOT GLIB_FOUND) MESSAGE(FATAL_ERROR "You don't seem to have glib >= 2.40 development libraries installed...") ENDIF (NOT GLIB_FOUND) + +pkg_check_modules (GLIB REQUIRED gio-unix-2.0) +IF (NOT GLIB_FOUND) + MESSAGE(FATAL_ERROR "You don't seem to have glib >= 2.40 development libraries installed...") +ENDIF (NOT GLIB_FOUND) pkg_check_modules (GTK REQUIRED gtk+-3.0>=3.20) IF (NOT GTK_FOUND) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sakura-3.8.8/README.md new/sakura-3.8.9/README.md --- old/sakura-3.8.8/README.md 2024-08-11 00:01:49.000000000 +0200 +++ new/sakura-3.8.9/README.md 2025-04-04 09:06:35.000000000 +0200 @@ -1,3 +1,5 @@ +[](https://github.com/sponsors/dabisu) + # sakura **sakura** is a simple [gtk](http://www.gtk.org) and [vte](https://gitlab.gnome.org/GNOME/vte) based terminal emulator. It uses tabs to provide several terminals in one window and allows to change configuration options via a contextual menu. No more no less. @@ -22,6 +24,11 @@ Use CMAKE_BUILD_TYPE=Debug if you need debug symbols. Default type is "Release". +Make sure your distribution sources the vte script for OSC 7 support in no login shells. If not, please add the following line to you .bashrc: + +```bash +. /etc/profile.d/vte-2.91.sh +``` ## Usage @@ -48,6 +55,7 @@ ### Default keybindings Ctrl + Shift + T -> New tab + Ctrl + Shift + O -> New window Ctrl + Shift + W -> Close current tab Ctrl + Shift + C -> Copy selected text Ctrl + Shift + V -> Paste selected text diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sakura-3.8.8/sakura.desktop new/sakura-3.8.9/sakura.desktop --- old/sakura-3.8.8/sakura.desktop 2024-08-11 00:01:49.000000000 +0200 +++ new/sakura-3.8.9/sakura.desktop 2025-04-04 09:06:35.000000000 +0200 @@ -95,5 +95,6 @@ Icon=terminal-tango Type=Application Categories=GTK;Utility;TerminalEmulator;System; +Keywords=terminal; StartupNotify=true X-Ubuntu-Gettext-Domain=sakura diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sakura-3.8.8/src/sakura.c new/sakura-3.8.9/src/sakura.c --- old/sakura-3.8.8/src/sakura.c 2024-08-11 00:01:49.000000000 +0200 +++ new/sakura-3.8.9/src/sakura.c 2025-04-04 09:06:35.000000000 +0200 @@ -36,6 +36,7 @@ #include <libintl.h> #include <glib.h> #include <glib/gstdio.h> +#include <gio/gdesktopappinfo.h> #include <gdk/gdk.h> #include <gdk/gdkx.h> #include <gtk/gtk.h> @@ -265,6 +266,7 @@ GtkWidget *menu; GtkWidget *fade_window; /* Window used for fading effect */ PangoFontDescription *font; + gdouble line_height; /* Font line height */ GdkRGBA forecolors[NUM_COLORSETS]; GdkRGBA backcolors[NUM_COLORSETS]; GdkRGBA curscolors[NUM_COLORSETS]; @@ -321,6 +323,7 @@ gint set_tab_name_accelerator; gint search_accelerator; gint set_colorset_accelerator; + gint new_window_accelerator; gint add_tab_key; gint del_tab_key; gint prev_tab_key; @@ -336,6 +339,9 @@ gint set_colorset_keys[NUM_COLORSETS]; gint paste_button; gint menu_button; + gint new_window_key; + int orig_argc; /* Used for new windows */ + char** orig_argv; /* Used for new windows */ VteRegex *http_vteregexp, *mail_vteregexp; char *word_chars; /* Exceptions for word selection */ char *argv[3]; @@ -366,6 +372,7 @@ #define DEFAULT_MIN_WIDTH_CHARS 20 #define DEFAULT_MIN_HEIGHT_CHARS 1 #define DEFAULT_FONT "Ubuntu Mono,monospace 13" +#define DEFAULT_LINE_HEIGHT 1.0 #define FONT_MINIMAL_SIZE (PANGO_SCALE*6) #define DEFAULT_WORD_CHARS "-,./?%&#_~:" #define TAB_MAX_SIZE 40 @@ -383,6 +390,7 @@ #define DEFAULT_SET_TAB_NAME_ACCELERATOR (GDK_CONTROL_MASK|GDK_SHIFT_MASK) #define DEFAULT_SEARCH_ACCELERATOR (GDK_CONTROL_MASK|GDK_SHIFT_MASK) #define DEFAULT_SELECT_COLORSET_ACCELERATOR (GDK_CONTROL_MASK|GDK_SHIFT_MASK) +#define DEFAULT_NEW_WINDOW_ACCELERATOR (GDK_CONTROL_MASK|GDK_SHIFT_MASK) #define DEFAULT_ADD_TAB_KEY GDK_KEY_T #define DEFAULT_DEL_TAB_KEY GDK_KEY_W #define DEFAULT_PREV_TAB_KEY GDK_KEY_Left @@ -395,6 +403,7 @@ #define DEFAULT_FULLSCREEN_KEY GDK_KEY_F11 #define DEFAULT_INCREASE_FONT_SIZE_KEY GDK_KEY_plus #define DEFAULT_DECREASE_FONT_SIZE_KEY GDK_KEY_minus +#define DEFAULT_NEW_WINDOW_KEY GDK_KEY_O #define DEFAULT_SCROLLABLE_TABS TRUE #define DEFAULT_PASTE_BUTTON 2 #define DEFAULT_MENU_BUTTON 3 @@ -434,6 +443,11 @@ sakura.config_modified=TRUE;\ } while(0); +#define sakura_set_config_double(key, value) do {\ + g_key_file_set_double(sakura.cfg, cfg_group, key, value);\ + sakura.config_modified=TRUE;\ + } while(0); + /* Spawn callback */ void sakura_spawm_callback (VteTerminal *, GPid, GError, gpointer); @@ -493,6 +507,7 @@ static void sakura_error (const char *, ...); static void sakura_build_command (int *, char ***); static char * sakura_get_term_cwd (struct sakura_tab *); +static char * sakura_get_term_cwd_osc7 (struct sakura_tab *); static guint sakura_tokeycode (guint key); static void sakura_set_keybind (const gchar *, guint); static guint sakura_get_keybind (const gchar *); @@ -519,6 +534,7 @@ static void sakura_paste (void); static void sakura_paste_primary (void); static void sakura_show_scrollbar (void); +static void sakura_new_window (void); /* Globals for command line parameters */ @@ -593,45 +609,52 @@ return TRUE; } + /* New window keybinding pressed */ + if ( (event->state & sakura.new_window_accelerator) == sakura.new_window_accelerator && + keycode == sakura_tokeycode(sakura.new_window_key)) { + sakura_new_window(); + return TRUE; + } + /* Switch tab keybinding pressed (numbers or next/prev) */ //if ((event->state & accel_mask) == sakura.switch_tab_accelerator) { /* If we use accel_mask, GDK_MOD4_MASK (windows key) it's not detected... */ if ((event->state & sakura.switch_tab_accelerator) == sakura.switch_tab_accelerator) { /* Just propagate the event if there is only one tab */ - if (npages < 2) return FALSE; + if (npages >= 2) { + if ((keycode >= sakura_tokeycode(GDK_KEY_1)) && (keycode <= sakura_tokeycode( GDK_KEY_9))) { - if ((keycode >= sakura_tokeycode(GDK_KEY_1)) && (keycode <= sakura_tokeycode( GDK_KEY_9))) { + /* User has explicitly disabled this branch, make sure to propagate the event */ + if (sakura.disable_numbered_tabswitch) return FALSE; - /* User has explicitly disabled this branch, make sure to propagate the event */ - if (sakura.disable_numbered_tabswitch) return FALSE; - - if (sakura_tokeycode(GDK_KEY_1) == keycode) topage = 0; - else if (sakura_tokeycode(GDK_KEY_2) == keycode) topage = 1; - else if (sakura_tokeycode(GDK_KEY_3) == keycode) topage = 2; - else if (sakura_tokeycode(GDK_KEY_4) == keycode) topage = 3; - else if (sakura_tokeycode(GDK_KEY_5) == keycode) topage = 4; - else if (sakura_tokeycode(GDK_KEY_6) == keycode) topage = 5; - else if (sakura_tokeycode(GDK_KEY_7) == keycode) topage = 6; - else if (sakura_tokeycode(GDK_KEY_8) == keycode) topage = 7; - else if (sakura_tokeycode(GDK_KEY_9) == keycode) topage = 8; - if (topage <= npages) - gtk_notebook_set_current_page(GTK_NOTEBOOK(sakura.notebook), topage); - return TRUE; - } else if (keycode == sakura_tokeycode(sakura.prev_tab_key)) { - if (gtk_notebook_get_current_page(GTK_NOTEBOOK(sakura.notebook))==0) { - gtk_notebook_set_current_page(GTK_NOTEBOOK(sakura.notebook), npages-1); - } else { - gtk_notebook_prev_page(GTK_NOTEBOOK(sakura.notebook)); - } - return TRUE; - } else if (keycode == sakura_tokeycode(sakura.next_tab_key)) { - if (gtk_notebook_get_current_page(GTK_NOTEBOOK(sakura.notebook)) == (npages-1)) { - gtk_notebook_set_current_page(GTK_NOTEBOOK(sakura.notebook), 0); - } else { - gtk_notebook_next_page(GTK_NOTEBOOK(sakura.notebook)); + if (sakura_tokeycode(GDK_KEY_1) == keycode) topage = 0; + else if (sakura_tokeycode(GDK_KEY_2) == keycode) topage = 1; + else if (sakura_tokeycode(GDK_KEY_3) == keycode) topage = 2; + else if (sakura_tokeycode(GDK_KEY_4) == keycode) topage = 3; + else if (sakura_tokeycode(GDK_KEY_5) == keycode) topage = 4; + else if (sakura_tokeycode(GDK_KEY_6) == keycode) topage = 5; + else if (sakura_tokeycode(GDK_KEY_7) == keycode) topage = 6; + else if (sakura_tokeycode(GDK_KEY_8) == keycode) topage = 7; + else if (sakura_tokeycode(GDK_KEY_9) == keycode) topage = 8; + if (topage <= npages) + gtk_notebook_set_current_page(GTK_NOTEBOOK(sakura.notebook), topage); + return TRUE; + } else if (keycode == sakura_tokeycode(sakura.prev_tab_key)) { + if (gtk_notebook_get_current_page(GTK_NOTEBOOK(sakura.notebook))==0) { + gtk_notebook_set_current_page(GTK_NOTEBOOK(sakura.notebook), npages-1); + } else { + gtk_notebook_prev_page(GTK_NOTEBOOK(sakura.notebook)); + } + return TRUE; + } else if (keycode == sakura_tokeycode(sakura.next_tab_key)) { + if (gtk_notebook_get_current_page(GTK_NOTEBOOK(sakura.notebook)) == (npages-1)) { + gtk_notebook_set_current_page(GTK_NOTEBOOK(sakura.notebook), 0); + } else { + gtk_notebook_next_page(GTK_NOTEBOOK(sakura.notebook)); + } + return TRUE; } - return TRUE; } } @@ -1988,19 +2011,24 @@ } sakura.scroll_lines = g_key_file_get_integer(sakura.cfg, cfg_group, "scroll_lines", NULL); + if (!g_key_file_has_key(sakura.cfg, cfg_group, "line_height", NULL)) { + sakura_set_config_double("line_height", DEFAULT_LINE_HEIGHT); + } + sakura.line_height = g_key_file_get_double(sakura.cfg, cfg_group, "line_height", NULL); + if (!g_key_file_has_key(sakura.cfg, cfg_group, "font", NULL)) { sakura_set_config_string("font", DEFAULT_FONT); } cfgtmp = g_key_file_get_value(sakura.cfg, cfg_group, "font", NULL); sakura.font = pango_font_description_from_string(cfgtmp); - free(cfgtmp); + g_free(cfgtmp); if (!g_key_file_has_key(sakura.cfg, cfg_group, "show_tab_bar", NULL)) { /* legacy option "show_always_first_tab" now sets "show_tab_bar = always | multiple" */ if (g_key_file_has_key(sakura.cfg, cfg_group, "show_always_first_tab", NULL)) { cfgtmp = g_key_file_get_value(sakura.cfg, cfg_group, "show_always_first_tab", NULL); sakura_set_config_string("show_tab_bar", (strcmp(cfgtmp, "Yes")==0) ? "always" : "multiple"); - free(cfgtmp); + g_free(cfgtmp); } else { sakura_set_config_string("show_tab_bar", "multiple"); } @@ -2016,7 +2044,7 @@ fprintf(stderr, "Invalid configuration value: show_tab_bar=%s (valid values: always|multiple|never)\n", cfgtmp); sakura.show_tab_bar = SHOW_TAB_BAR_MULTIPLE; } - free(cfgtmp); + g_free(cfgtmp); if (!g_key_file_has_key(sakura.cfg, cfg_group, "scrollbar", NULL)) { sakura_set_config_boolean("scrollbar", FALSE); @@ -2159,6 +2187,11 @@ } sakura.search_accelerator = g_key_file_get_integer(sakura.cfg, cfg_group, "search_accelerator", NULL); + if (!g_key_file_has_key(sakura.cfg, cfg_group, "new_window_accelerator", NULL)) { + sakura_set_config_integer("new_window_accelerator", DEFAULT_NEW_WINDOW_ACCELERATOR); + } + sakura.new_window_accelerator = g_key_file_get_integer(sakura.cfg, cfg_group, "new_window_accelerator", NULL); + if (!g_key_file_has_key(sakura.cfg, cfg_group, "add_tab_key", NULL)) { sakura_set_keybind("add_tab_key", DEFAULT_ADD_TAB_KEY); } @@ -2219,6 +2252,11 @@ } sakura.fullscreen_key = sakura_get_keybind("fullscreen_key"); + if (!g_key_file_has_key(sakura.cfg, cfg_group, "new_window_key", NULL)) { + sakura_set_keybind("new_window_key", DEFAULT_NEW_WINDOW_KEY); + } + sakura.new_window_key = sakura_get_keybind("new_window_key"); + if (!g_key_file_has_key(sakura.cfg, cfg_group, "set_colorset_accelerator", NULL)) { sakura_set_config_integer("set_colorset_accelerator", DEFAULT_SELECT_COLORSET_ACCELERATOR); } @@ -2798,6 +2836,7 @@ //SAY("padding x %d y %d", pad_x, pad_y); char_width = vte_terminal_get_char_width(VTE_TERMINAL(sk_tab->vte)); char_height = vte_terminal_get_char_height(VTE_TERMINAL(sk_tab->vte)); + char_height = (int) (sakura.line_height * char_height); sakura.width = pad_x + (char_width * sakura.columns); sakura.height = pad_y + (char_height * sakura.rows); @@ -2853,6 +2892,7 @@ for (i = (n_pages - 1); i >= 0; i--) { sk_tab = sakura_get_sktab(sakura, i); vte_terminal_set_font(VTE_TERMINAL(sk_tab->vte), sakura.font); + vte_terminal_set_cell_height_scale(VTE_TERMINAL(sk_tab->vte), sakura.line_height); } } @@ -3055,7 +3095,11 @@ if (page >= 0) { struct sakura_tab *prev_term; prev_term = sakura_get_sktab(sakura, page); - cwd = sakura_get_term_cwd(prev_term); /* FIXME: Use current_uri from vte */ + /* If OSC7 method doesn't work, use the old one as fallback */ + if ((cwd = sakura_get_term_cwd_osc7(prev_term)) == NULL) { + SAY("osc7 is null"); + sakura_get_term_cwd(prev_term); + } sk_tab->colorset = prev_term->colorset; } @@ -3348,6 +3392,80 @@ } +/* New window -- launch a new instance */ +static void +sakura_new_window() +{ + GPid pid; + GError* error = NULL; + char** spawn_argv = malloc(sizeof(char*) * ((sakura.orig_argc ? sakura.orig_argc : 1) + 1)); + if(!spawn_argv) { + fprintf(stderr, "Error allocating memory for starting new instance!\n"); + return; + } + +#ifdef __linux__ + /* We try to get the full path of the currently running instance of sakura and use + * that for spawning a new process. This is to take care of the case when running + * an instance of sakura no in PATH. Unfortunately, procfs is not universally + * supported, we restrict it to Linux (and we assume that if we build on Linux, + * we will run on Linux as well) */ + char cmdline[PATH_MAX + 1]; + ssize_t tmp = readlink("/proc/self/exe", cmdline, PATH_MAX); + cmdline[tmp] = 0; + spawn_argv[0] = cmdline; +#else + /* Otherwise, we rely on sakura being in PATH */ + spawn_argv[0] = "sakura"; +#endif + + /* remove command arguments so that the new window will be in interactive mode */ + char** dst; + char** src; + if(sakura.orig_argc) for(dst = spawn_argv + 1, src = sakura.orig_argv + 1; *src; ++dst, ++src) { + if(!strcmp(*src, "-e") || !strcmp(*src, "--xterm-execute")) { + break; + } + if(!strcmp(*src, "-x") || !strcmp(*src, "--xterm")) { + ++src; + if(!(*src)) { + break; + } + } else { + *dst = *src; + } + } + *dst = NULL; + + /* Get a startup notification ID / xdg-activation token and add it to the environment */ + char **envp = NULL; + /* TODO: keep this instead of recreating every time */ + GAppInfo *info = G_APP_INFO(g_desktop_app_info_new("sakura.desktop")); + if (!info) info = g_app_info_create_from_commandline("sakura", "sakura", G_APP_INFO_CREATE_SUPPORTS_STARTUP_NOTIFICATION, NULL); + if (info) { + GdkAppLaunchContext *ctx = gdk_display_get_app_launch_context(gdk_display_get_default()); + char *startup_id = g_app_launch_context_get_startup_notify_id(G_APP_LAUNCH_CONTEXT(ctx), info, NULL); + if (startup_id) { + envp = g_get_environ(); + envp = g_environ_setenv(envp, "DESKTOP_STARTUP_ID", startup_id, TRUE); + envp = g_environ_setenv(envp, "XDG_ACTIVATION_TOKEN", startup_id, TRUE); + } + g_object_unref(ctx); + } + + if (!g_spawn_async(NULL, spawn_argv, envp, + G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL, + NULL, NULL, &pid, &error)) { + fprintf(stderr, "Error starting new instance:\n%s\n", error->message); + g_error_free(error); + } + g_spawn_close_pid(pid); + free(spawn_argv); + if (envp) g_strfreev(envp); + if (info) g_object_unref(info); +} + + /* Save configuration */ static void sakura_config_done() @@ -3362,6 +3480,7 @@ gchar *cfgdata = g_key_file_to_data(sakura.cfg, &len, &gerror); if (!cfgdata) { fprintf(stderr, "%s\n", gerror->message); + g_error_free(gerror); exit(EXIT_FAILURE); } @@ -3420,7 +3539,7 @@ char* buff; va_start(args, format); - buff = malloc(sizeof(char)*ERROR_BUFFER_LENGTH); + buff = g_malloc(sizeof(char)*ERROR_BUFFER_LENGTH); vsnprintf(buff, sizeof(char)*ERROR_BUFFER_LENGTH, format, args); va_end(args); @@ -3429,7 +3548,7 @@ gtk_window_set_title(GTK_WINDOW(dialog), _("Error message")); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); - free(buff); + g_free(buff); } @@ -3465,7 +3584,7 @@ do { size++; } while (option_xterm_args[size]); /* Get option_xterm_args size */ /* Quote all arguments to be able to use parameters with spaces like filenames */ - quoted_args = malloc(sizeof(char *) * (size+1)); + quoted_args = g_malloc(sizeof(char *) * (size+1)); while (option_xterm_args[i]) { quoted_args[i] = g_shell_quote(option_xterm_args[i]); i++; } @@ -3531,9 +3650,9 @@ } -/* Retrieve the cwd of the specified sk_tab page. - * Original function was from terminal-screen.c of gnome-terminal, copyright (C) 2001 Havoc Pennington - * Adapted by Hong Jen Yee, non-linux shit removed by David Gómez */ +/* Legacy function to use as fallback if our shell doesn't emit OSC7. + * Retrieves the CWD of the specified sk_tab page.Original borrowed + * from gnome-terminal. Adapted by Hong Jen Yee and David Gómez */ static char * sakura_get_term_cwd(struct sakura_tab* sk_tab) { @@ -3551,7 +3670,7 @@ return cwd; } - buf = malloc(sb.st_size + 1); + buf = g_malloc(sb.st_size + 1); if (buf == NULL) { g_free(file); @@ -3573,6 +3692,25 @@ } +static char * +sakura_get_term_cwd_osc7(struct sakura_tab* sk_tab) +{ + gchar *cwd = NULL; gchar *osc7_hostname = NULL; + const char *osc7_uri = NULL; const char *hostname = NULL; + + osc7_uri = vte_terminal_get_current_directory_uri(VTE_TERMINAL(sk_tab->vte)); + + if (osc7_uri) { + cwd = g_filename_from_uri(osc7_uri, &osc7_hostname, NULL); + /* Check if the hostname matchs. If not, return NULL */ + hostname = g_get_host_name(); + if ((strcmp(osc7_hostname, hostname) != 0) || (strcmp(osc7_hostname, "localhost") == 0)) cwd = NULL; + } + + return cwd; +} + + static guint sakura_tokeycode (guint key) { @@ -3583,6 +3721,9 @@ keymap = gdk_keymap_get_for_display(gdk_display_get_default()); + /* Empty shortcut */ + if (key == 0) return 0; + if (gdk_keymap_get_entries_for_keyval(keymap, key, &keys, &n_keys)) { if (n_keys > 0) { res = keys[0].keycode; @@ -3639,6 +3780,9 @@ nargv = (char**)calloc((argc+1), sizeof(char*)); n = 0; nargc = argc; have_e = FALSE; + /* Save original arguments to start a new instance if needed */ + sakura.orig_argc = argc; + sakura.orig_argv = argv; for (i=0; i<argc; i++) { if (!have_e && g_strcmp0(argv[i],"-e") == 0) ++++++ sakura-fix_pod2man.patch ++++++ --- /var/tmp/diff_new_pack.U25v67/_old 2025-09-24 15:27:24.732258877 +0200 +++ /var/tmp/diff_new_pack.U25v67/_new 2025-09-24 15:27:24.736259046 +0200 @@ -1,8 +1,8 @@ -Index: sakura-3.8.8/CMakeLists.txt +Index: sakura-3.8.9/CMakeLists.txt =================================================================== ---- sakura-3.8.8.orig/CMakeLists.txt -+++ sakura-3.8.8/CMakeLists.txt -@@ -72,5 +72,5 @@ ADD_CUSTOM_TARGET (distclean +--- sakura-3.8.9.orig/CMakeLists.txt ++++ sakura-3.8.9/CMakeLists.txt +@@ -77,5 +77,5 @@ ADD_CUSTOM_TARGET (distclean IF (POD2MAN) ADD_CUSTOM_TARGET(man ALL ++++++ sakura-icon.patch ++++++ --- /var/tmp/diff_new_pack.U25v67/_old 2025-09-24 15:27:24.752259719 +0200 +++ /var/tmp/diff_new_pack.U25v67/_new 2025-09-24 15:27:24.756259888 +0200 @@ -1,8 +1,8 @@ -Index: sakura-3.8.8/CMakeLists.txt +Index: sakura-3.8.9/CMakeLists.txt =================================================================== ---- sakura-3.8.8.orig/CMakeLists.txt -+++ sakura-3.8.8/CMakeLists.txt -@@ -53,7 +53,7 @@ ADD_SUBDIRECTORY (po) +--- sakura-3.8.9.orig/CMakeLists.txt ++++ sakura-3.8.9/CMakeLists.txt +@@ -58,7 +58,7 @@ ADD_SUBDIRECTORY (po) INSTALL (TARGETS sakura RUNTIME DESTINATION bin) INSTALL (FILES sakura.desktop DESTINATION share/applications) @@ -11,10 +11,10 @@ IF (POD2MAN) INSTALL (FILES ${sakura_BINARY_DIR}/sakura.1 DESTINATION share/man/man1) ENDIF (POD2MAN) -Index: sakura-3.8.8/sakura.desktop +Index: sakura-3.8.9/sakura.desktop =================================================================== ---- sakura-3.8.8.orig/sakura.desktop -+++ sakura-3.8.8/sakura.desktop +--- sakura-3.8.9.orig/sakura.desktop ++++ sakura-3.8.9/sakura.desktop @@ -92,7 +92,7 @@ Comment[zh_CN]=使用命令行 Comment[zh_TW]=使用指令列 TryExec=sakura @@ -23,12 +23,12 @@ +Icon=sakura.png Type=Application Categories=GTK;Utility;TerminalEmulator;System; - StartupNotify=true -Index: sakura-3.8.8/src/sakura.c + Keywords=terminal; +Index: sakura-3.8.9/src/sakura.c =================================================================== ---- sakura-3.8.8.orig/src/sakura.c -+++ sakura-3.8.8/src/sakura.c -@@ -355,7 +355,7 @@ struct sakura_tab { +--- sakura-3.8.9.orig/src/sakura.c ++++ sakura-3.8.9/src/sakura.c +@@ -361,7 +361,7 @@ struct sakura_tab { };
