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 @@
+[![Sponsor 
sakura!!](https://github.com/sponsors/dabisu/card)](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 {
  };
  
  

Reply via email to