Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package i3 for openSUSE:Factory checked in 
at 2026-02-07 15:33:36
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/i3 (Old)
 and      /work/SRC/openSUSE:Factory/.i3.new.1670 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "i3"

Sat Feb  7 15:33:36 2026 rev:51 rq:1331746 version:4.25.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/i3/i3.changes    2026-01-26 11:03:30.088952990 
+0100
+++ /work/SRC/openSUSE:Factory/.i3.new.1670/i3.changes  2026-02-07 
15:34:01.162851006 +0100
@@ -1,0 +2,9 @@
+Fri Feb  6 15:06:40 UTC 2026 - Michael Pujos <[email protected]>
+
+- Update to 4.25.1:
+  * cmd_floating: Fix crash when running empty workspace
+  * Fix i3bar workspace buttons for primary screen
+  * Fix ctype(3) function arguments.
+  * use setlocale(3) (NetBSD lacks uselocale(3))
+
+-------------------------------------------------------------------

Old:
----
  i3-4.25.tar.xz
  i3-4.25.tar.xz.asc

New:
----
  i3-4.25.1.tar.xz
  i3-4.25.1.tar.xz.asc

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ i3.spec ++++++
--- /var/tmp/diff_new_pack.NzgNjI/_old  2026-02-07 15:34:01.726874439 +0100
+++ /var/tmp/diff_new_pack.NzgNjI/_new  2026-02-07 15:34:01.730874605 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           i3
-Version:        4.25
+Version:        4.25.1
 Release:        0
 Summary:        Tiling window manager
 License:        BSD-3-Clause

++++++ i3-4.25.tar.xz -> i3-4.25.1.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3-4.25/RELEASE-NOTES-4.25 
new/i3-4.25.1/RELEASE-NOTES-4.25
--- old/i3-4.25/RELEASE-NOTES-4.25      2025-12-19 08:19:53.000000000 +0100
+++ new/i3-4.25.1/RELEASE-NOTES-4.25    1970-01-01 01:00:00.000000000 +0100
@@ -1,49 +0,0 @@
-
- ┌──────────────────────────────┐
- │ Release notes for i3 v4.25   │
- └──────────────────────────────┘
-
-This is i3 v4.25. This version is considered stable. All users of i3 are
-strongly encouraged to upgrade.
-
-Most changes in this release cycle have been “behind the scenes”,
-without an observable effect for users. For example, we switched
-to clang-format-20, fixed a number of (benign) memory issues,
-fixed a few flaky tests and maintained our GitHub Actions setup,
-e.g. for the shutdown of baltocdn (our old host for nightly builds).
-
-We also investigated shipping an i3.service systemd user unit,
-but could not make that work without breaking existing setups.
-If distribution maintainers (or anyone) has advice, please share
-(after reading up!) over in https://github.com/i3/i3/issues/5186
-
- ┌────────────────────────────┐
- │ Changes in i3 v4.25        │
- └────────────────────────────┘
-
-  • Set _NET_FRAME_EXTENTS according to the actual decoration size.
-    This improves compatibility with picom and other software.
-  • The command parser is now reentrant, which fixes a few
-    advanced for_window usages (e.g. multiple criteria).
-
- ┌────────────────────────────┐
- │ Bugfixes                   │
- └────────────────────────────┘
-
-  • fix paragraph separators cutting off window titles
-  • fix crash when a container parent is focused
-    and a tiling drag causes it to be killed
-  • fix crash when using for_window [...] reload
-  • fix append_layout when containers use a mark
-  • randr: fix memleak and use-after-free
-
- ┌────────────────────────────┐
- │ Thanks!                    │
- └────────────────────────────┘
-
-Thanks for testing, bugfixes, discussions and everything I forgot go out to:
-
-  Dmitry, Emeric Planet, FedGuy699, Garrett Marcinak, Michele Piazzai,
-  Orestis Floros, Sergey Vlasov, Vladimir Panteleev, algonell
-
--- Michael Stapelberg, 2025-12-19
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3-4.25/RELEASE-NOTES-4.25.1 
new/i3-4.25.1/RELEASE-NOTES-4.25.1
--- old/i3-4.25/RELEASE-NOTES-4.25.1    1970-01-01 01:00:00.000000000 +0100
+++ new/i3-4.25.1/RELEASE-NOTES-4.25.1  2026-02-06 08:30:55.000000000 +0100
@@ -0,0 +1,26 @@
+
+ ┌──────────────────────────────┐
+ │ Release notes for i3 v4.25.1 │
+ └──────────────────────────────┘
+
+This is i3 v4.25.1. This version is considered stable. All users of i3 are
+strongly encouraged to upgrade.
+
+ ┌────────────────────────────┐
+ │ Bugfixes                   │
+ └────────────────────────────┘
+
+  • cmd_floating: Fix crash when running empty workspace
+  • Fix i3bar workspace buttons for primary screen
+  • Fix ctype(3) function arguments.
+  • use setlocale(3) (NetBSD lacks uselocale(3))
+
+ ┌────────────────────────────┐
+ │ Thanks!                    │
+ └────────────────────────────┘
+
+Thanks for testing, bugfixes, discussions and everything I forgot go out to:
+
+  Orestis Floros, Thomas Klausner
+
+-- Michael Stapelberg, 2026-02-06
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3-4.25/i3-config-wizard/main.c 
new/i3-4.25.1/i3-config-wizard/main.c
--- old/i3-4.25/i3-config-wizard/main.c 2025-12-19 08:19:53.000000000 +0100
+++ new/i3-4.25.1/i3-config-wizard/main.c       2026-02-06 08:30:55.000000000 
+0100
@@ -732,7 +732,7 @@
 
         /* Skip leading whitespace */
         char *walk = line;
-        while (isspace(*walk) && walk < (line + len)) {
+        while (isspace((unsigned char)*walk) && walk < (line + len)) {
             /* Pre-output the skipped whitespaces to keep proper indentation */
             fputc(*walk, ks_config);
             walk++;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3-4.25/i3bar/src/child.c 
new/i3-4.25.1/i3bar/src/child.c
--- old/i3-4.25/i3bar/src/child.c       2025-12-19 08:19:53.000000000 +0100
+++ new/i3-4.25.1/i3bar/src/child.c     2026-02-06 08:30:55.000000000 +0100
@@ -525,7 +525,7 @@
 
 static bool isempty(char *s) {
     while (*s != '\0') {
-        if (!isspace(*s)) {
+        if (!isspace((unsigned char)*s)) {
             return false;
         }
         s++;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3-4.25/i3bar/src/workspaces.c 
new/i3-4.25.1/i3bar/src/workspaces.c
--- old/i3-4.25/i3bar/src/workspaces.c  2025-12-19 08:19:53.000000000 +0100
+++ new/i3-4.25.1/i3bar/src/workspaces.c        2026-02-06 08:30:55.000000000 
+0100
@@ -19,6 +19,7 @@
     struct ws_head *workspaces;
     i3_ws *workspaces_walk;
     char *cur_key;
+    bool need_output;
     bool parsing_rect;
 };
 
@@ -160,6 +161,7 @@
             TAILQ_INSERT_TAIL(ws->output->workspaces, ws, tailq);
         }
 
+        params->need_output = false;
         FREE(output_name);
         FREE(params->cur_key);
 
@@ -181,6 +183,7 @@
         new_workspace->num = -1;
 
         params->workspaces_walk = new_workspace;
+        params->need_output = true;
         params->parsing_rect = false;
     } else {
         params->parsing_rect = true;
@@ -202,6 +205,15 @@
         return 1; /* workspace already assigned to output */
     }
 
+    /* If we processed the output field but didn't find the output, the
+     * workspace belongs to an output this bar instance doesn't manage. */
+    if (!params->need_output) {
+        I3STRING_FREE(ws->name);
+        FREE(ws->canonical_name);
+        FREE(params->workspaces_walk);
+        return 1;
+    }
+
     if (!ws->name || SLIST_EMPTY(outputs)) { /* Invalid state */
         I3STRING_FREE(ws->name);
         FREE(ws->canonical_name);
@@ -209,7 +221,7 @@
         return 1;
     }
 
-    /* Handle no output case */
+    /* Handle no output case - fallback to primary */
     ws->output = get_output_by_name("primary");
     if (ws->output == NULL) {
         ws->output = SLIST_FIRST(outputs);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3-4.25/include/main.h new/i3-4.25.1/include/main.h
--- old/i3-4.25/include/main.h  2025-12-19 08:19:53.000000000 +0100
+++ new/i3-4.25.1/include/main.h        2026-02-06 08:30:55.000000000 +0100
@@ -10,9 +10,6 @@
 #pragma once
 
 #include <config.h>
-#include <locale.h>
-
-extern locale_t numericC;
 
 /**
  * Enable or disable the main X11 event handling function.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3-4.25/man/i3-config-wizard.1 
new/i3-4.25.1/man/i3-config-wizard.1
--- old/i3-4.25/man/i3-config-wizard.1  2025-12-19 08:19:56.463336000 +0100
+++ new/i3-4.25.1/man/i3-config-wizard.1        2026-02-06 08:30:57.939900000 
+0100
@@ -4,10 +4,10 @@
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
 .\"      Date: 01/01/1980
 .\"    Manual: i3 Manual
-.\"    Source: i3 4.25
+.\"    Source: i3 4.25.1
 .\"  Language: English
 .\"
-.TH "I3\-CONFIG\-WIZARD" "1" "01/01/1980" "i3 4\&.25" "i3 Manual"
+.TH "I3\-CONFIG\-WIZARD" "1" "01/01/1980" "i3 4\&.25\&.1" "i3 Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3-4.25/man/i3-dump-log.1 
new/i3-4.25.1/man/i3-dump-log.1
--- old/i3-4.25/man/i3-dump-log.1       2025-12-19 08:19:56.463336000 +0100
+++ new/i3-4.25.1/man/i3-dump-log.1     2026-02-06 08:30:57.939900000 +0100
@@ -4,10 +4,10 @@
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
 .\"      Date: 01/01/1980
 .\"    Manual: i3 Manual
-.\"    Source: i3 4.25
+.\"    Source: i3 4.25.1
 .\"  Language: English
 .\"
-.TH "I3\-DUMP\-LOG" "1" "01/01/1980" "i3 4\&.25" "i3 Manual"
+.TH "I3\-DUMP\-LOG" "1" "01/01/1980" "i3 4\&.25\&.1" "i3 Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3-4.25/man/i3-input.1 new/i3-4.25.1/man/i3-input.1
--- old/i3-4.25/man/i3-input.1  2025-12-19 08:19:56.463336000 +0100
+++ new/i3-4.25.1/man/i3-input.1        2026-02-06 08:30:57.939900000 +0100
@@ -4,10 +4,10 @@
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
 .\"      Date: 01/01/1980
 .\"    Manual: i3 Manual
-.\"    Source: i3 4.25
+.\"    Source: i3 4.25.1
 .\"  Language: English
 .\"
-.TH "I3\-INPUT" "1" "01/01/1980" "i3 4\&.25" "i3 Manual"
+.TH "I3\-INPUT" "1" "01/01/1980" "i3 4\&.25\&.1" "i3 Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3-4.25/man/i3-migrate-config-to-v4.1 
new/i3-4.25.1/man/i3-migrate-config-to-v4.1
--- old/i3-4.25/man/i3-migrate-config-to-v4.1   2025-12-19 08:19:56.463336000 
+0100
+++ new/i3-4.25.1/man/i3-migrate-config-to-v4.1 2026-02-06 08:30:57.939900000 
+0100
@@ -4,10 +4,10 @@
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
 .\"      Date: 01/01/1980
 .\"    Manual: i3 Manual
-.\"    Source: i3 4.25
+.\"    Source: i3 4.25.1
 .\"  Language: English
 .\"
-.TH "I3\-MIGRATE\-CONFIG\-TO\-V4" "1" "01/01/1980" "i3 4\&.25" "i3 Manual"
+.TH "I3\-MIGRATE\-CONFIG\-TO\-V4" "1" "01/01/1980" "i3 4\&.25\&.1" "i3 Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3-4.25/man/i3-msg.1 new/i3-4.25.1/man/i3-msg.1
--- old/i3-4.25/man/i3-msg.1    2025-12-19 08:19:56.463336000 +0100
+++ new/i3-4.25.1/man/i3-msg.1  2026-02-06 08:30:57.939900000 +0100
@@ -4,10 +4,10 @@
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
 .\"      Date: 01/01/1980
 .\"    Manual: i3 Manual
-.\"    Source: i3 4.25
+.\"    Source: i3 4.25.1
 .\"  Language: English
 .\"
-.TH "I3\-MSG" "1" "01/01/1980" "i3 4\&.25" "i3 Manual"
+.TH "I3\-MSG" "1" "01/01/1980" "i3 4\&.25\&.1" "i3 Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3-4.25/man/i3-nagbar.1 new/i3-4.25.1/man/i3-nagbar.1
--- old/i3-4.25/man/i3-nagbar.1 2025-12-19 08:19:56.463336000 +0100
+++ new/i3-4.25.1/man/i3-nagbar.1       2026-02-06 08:30:57.939900000 +0100
@@ -4,10 +4,10 @@
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
 .\"      Date: 01/01/1980
 .\"    Manual: i3 Manual
-.\"    Source: i3 4.25
+.\"    Source: i3 4.25.1
 .\"  Language: English
 .\"
-.TH "I3\-NAGBAR" "1" "01/01/1980" "i3 4\&.25" "i3 Manual"
+.TH "I3\-NAGBAR" "1" "01/01/1980" "i3 4\&.25\&.1" "i3 Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3-4.25/man/i3-sensible-editor.1 
new/i3-4.25.1/man/i3-sensible-editor.1
--- old/i3-4.25/man/i3-sensible-editor.1        2025-12-19 08:19:56.463336000 
+0100
+++ new/i3-4.25.1/man/i3-sensible-editor.1      2026-02-06 08:30:57.939900000 
+0100
@@ -4,10 +4,10 @@
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
 .\"      Date: 01/01/1980
 .\"    Manual: i3 Manual
-.\"    Source: i3 4.25
+.\"    Source: i3 4.25.1
 .\"  Language: English
 .\"
-.TH "I3\-SENSIBLE\-EDITOR" "1" "01/01/1980" "i3 4\&.25" "i3 Manual"
+.TH "I3\-SENSIBLE\-EDITOR" "1" "01/01/1980" "i3 4\&.25\&.1" "i3 Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3-4.25/man/i3-sensible-pager.1 
new/i3-4.25.1/man/i3-sensible-pager.1
--- old/i3-4.25/man/i3-sensible-pager.1 2025-12-19 08:19:56.463336000 +0100
+++ new/i3-4.25.1/man/i3-sensible-pager.1       2026-02-06 08:30:57.939900000 
+0100
@@ -4,10 +4,10 @@
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
 .\"      Date: 01/01/1980
 .\"    Manual: i3 Manual
-.\"    Source: i3 4.25
+.\"    Source: i3 4.25.1
 .\"  Language: English
 .\"
-.TH "I3\-SENSIBLE\-PAGER" "1" "01/01/1980" "i3 4\&.25" "i3 Manual"
+.TH "I3\-SENSIBLE\-PAGER" "1" "01/01/1980" "i3 4\&.25\&.1" "i3 Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3-4.25/man/i3-sensible-terminal.1 
new/i3-4.25.1/man/i3-sensible-terminal.1
--- old/i3-4.25/man/i3-sensible-terminal.1      2025-12-19 08:19:56.463336000 
+0100
+++ new/i3-4.25.1/man/i3-sensible-terminal.1    2026-02-06 08:30:57.939900000 
+0100
@@ -4,10 +4,10 @@
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
 .\"      Date: 01/01/1980
 .\"    Manual: i3 Manual
-.\"    Source: i3 4.25
+.\"    Source: i3 4.25.1
 .\"  Language: English
 .\"
-.TH "I3\-SENSIBLE\-TERMINAL" "1" "01/01/1980" "i3 4\&.25" "i3 Manual"
+.TH "I3\-SENSIBLE\-TERMINAL" "1" "01/01/1980" "i3 4\&.25\&.1" "i3 Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3-4.25/man/i3.1 new/i3-4.25.1/man/i3.1
--- old/i3-4.25/man/i3.1        2025-12-19 08:19:56.463336000 +0100
+++ new/i3-4.25.1/man/i3.1      2026-02-06 08:30:57.939900000 +0100
@@ -4,10 +4,10 @@
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
 .\"      Date: 01/01/1980
 .\"    Manual: i3 Manual
-.\"    Source: i3 4.25
+.\"    Source: i3 4.25.1
 .\"  Language: English
 .\"
-.TH "I3" "1" "01/01/1980" "i3 4\&.25" "i3 Manual"
+.TH "I3" "1" "01/01/1980" "i3 4\&.25\&.1" "i3 Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3-4.25/man/i3bar.1 new/i3-4.25.1/man/i3bar.1
--- old/i3-4.25/man/i3bar.1     2025-12-19 08:19:56.463336000 +0100
+++ new/i3-4.25.1/man/i3bar.1   2026-02-06 08:30:57.939900000 +0100
@@ -4,10 +4,10 @@
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
 .\"      Date: 01/01/1980
 .\"    Manual: i3 Manual
-.\"    Source: i3 4.25
+.\"    Source: i3 4.25.1
 .\"  Language: English
 .\"
-.TH "I3BAR" "1" "01/01/1980" "i3 4\&.25" "i3 Manual"
+.TH "I3BAR" "1" "01/01/1980" "i3 4\&.25\&.1" "i3 Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3-4.25/meson.build new/i3-4.25.1/meson.build
--- old/i3-4.25/meson.build     2025-12-19 08:19:53.000000000 +0100
+++ new/i3-4.25.1/meson.build   2026-02-06 08:30:55.000000000 +0100
@@ -6,7 +6,7 @@
 project(
   'i3',
   'c',
-  version: '4.25',
+  version: '4.25.1',
   default_options: [
     'c_std=c11',
     'warning_level=1',  # enable all warnings (-Wall)
@@ -63,7 +63,7 @@
   sources: vcs_tag(
     input: config_h_in,
     output: 'config.h',
-    fallback: meson.project_version() + ' (2025-12-19)',
+    fallback: meson.project_version() + ' (2026-02-06)',
   )
 )
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3-4.25/src/assignments.c 
new/i3-4.25.1/src/assignments.c
--- old/i3-4.25/src/assignments.c       2025-12-19 08:19:53.000000000 +0100
+++ new/i3-4.25.1/src/assignments.c     2026-02-06 08:30:55.000000000 +0100
@@ -15,6 +15,10 @@
  *
  */
 void run_assignments(i3Window *window) {
+    if (!window) {
+        return;
+    }
+
     DLOG("Checking if any assignments match this window\n");
 
     bool needs_tree_render = false;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3-4.25/src/ipc.c new/i3-4.25.1/src/ipc.c
--- old/i3-4.25/src/ipc.c       2025-12-19 08:19:53.000000000 +0100
+++ new/i3-4.25.1/src/ipc.c     2026-02-06 08:30:55.000000000 +0100
@@ -909,10 +909,12 @@
 }
 
 IPC_HANDLER(tree) {
-    locale_t prev_locale = uselocale(numericC);
+    char *prev_locale = sstrdup(setlocale(LC_NUMERIC, NULL));
+    setlocale(LC_NUMERIC, "C");
     yajl_gen gen = ygenalloc();
     dump_node(gen, croot, false);
-    uselocale(prev_locale);
+    setlocale(LC_NUMERIC, prev_locale);
+    free(prev_locale);
 
     const unsigned char *payload;
     ylength length;
@@ -1585,7 +1587,8 @@
  * generator. Free with yajl_gen_free().
  */
 yajl_gen ipc_marshal_workspace_event(const char *change, Con *current, Con 
*old) {
-    locale_t prev_locale = uselocale(numericC);
+    char *prev_locale = sstrdup(setlocale(LC_NUMERIC, NULL));
+    setlocale(LC_NUMERIC, "C");
     yajl_gen gen = ygenalloc();
 
     y(map_open);
@@ -1609,7 +1612,8 @@
 
     y(map_close);
 
-    uselocale(prev_locale);
+    setlocale(LC_NUMERIC, prev_locale);
+    free(prev_locale);
 
     return gen;
 }
@@ -1639,7 +1643,8 @@
     DLOG("Issue IPC window %s event (con = %p, window = 0x%08x)\n",
          property, con, (con->window ? con->window->id : XCB_WINDOW_NONE));
 
-    locale_t prev_locale = uselocale(numericC);
+    char *prev_locale = sstrdup(setlocale(LC_NUMERIC, NULL));
+    setlocale(LC_NUMERIC, "C");
     yajl_gen gen = ygenalloc();
 
     y(map_open);
@@ -1658,7 +1663,8 @@
 
     ipc_send_event("window", I3_IPC_EVENT_WINDOW, (const char *)payload);
     y(free);
-    uselocale(prev_locale);
+    setlocale(LC_NUMERIC, prev_locale);
+    free(prev_locale);
 }
 
 /*
@@ -1666,7 +1672,8 @@
  */
 void ipc_send_barconfig_update_event(Barconfig *barconfig) {
     DLOG("Issue barconfig_update event for id = %s\n", barconfig->id);
-    locale_t prev_locale = uselocale(numericC);
+    char *prev_locale = sstrdup(setlocale(LC_NUMERIC, NULL));
+    setlocale(LC_NUMERIC, "C");
     yajl_gen gen = ygenalloc();
 
     dump_bar_config(gen, barconfig);
@@ -1677,7 +1684,8 @@
 
     ipc_send_event("barconfig_update", I3_IPC_EVENT_BARCONFIG_UPDATE, (const 
char *)payload);
     y(free);
-    uselocale(prev_locale);
+    setlocale(LC_NUMERIC, prev_locale);
+    free(prev_locale);
 }
 
 /*
@@ -1686,7 +1694,8 @@
 void ipc_send_binding_event(const char *event_type, Binding *bind, const char 
*modename) {
     DLOG("Issue IPC binding %s event (sym = %s, code = %d)\n", event_type, 
bind->symbol, bind->keycode);
 
-    locale_t prev_locale = uselocale(numericC);
+    char *prev_locale = sstrdup(setlocale(LC_NUMERIC, NULL));
+    setlocale(LC_NUMERIC, "C");
 
     yajl_gen gen = ygenalloc();
 
@@ -1714,7 +1723,8 @@
     ipc_send_event("binding", I3_IPC_EVENT_BINDING, (const char *)payload);
 
     y(free);
-    uselocale(prev_locale);
+    setlocale(LC_NUMERIC, prev_locale);
+    free(prev_locale);
 }
 
 /*
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3-4.25/src/load_layout.c 
new/i3-4.25.1/src/load_layout.c
--- old/i3-4.25/src/load_layout.c       2025-12-19 08:19:53.000000000 +0100
+++ new/i3-4.25.1/src/load_layout.c     2026-02-06 08:30:55.000000000 +0100
@@ -634,14 +634,16 @@
     /* Allow multiple values, i.e. multiple nodes to attach */
     yajl_config(hand, yajl_allow_multiple_values, true);
 
-    locale_t prev_locale = uselocale(numericC);
+    char *prev_locale = sstrdup(setlocale(LC_NUMERIC, NULL));
+    setlocale(LC_NUMERIC, "C");
     if (yajl_parse(hand, (const unsigned char *)buf, len) != yajl_status_ok) {
         unsigned char *str = yajl_get_error(hand, 1, (const unsigned char 
*)buf, len);
         ELOG("JSON parsing error: %s\n", str);
         yajl_free_error(hand, str);
         valid = false;
     }
-    uselocale(prev_locale);
+    setlocale(LC_NUMERIC, prev_locale);
+    free(prev_locale);
 
     yajl_complete_parse(hand);
     yajl_free(hand);
@@ -671,7 +673,8 @@
     yajl_config(hand, yajl_allow_comments, true);
     /* Allow multiple values, i.e. multiple nodes to attach */
     yajl_config(hand, yajl_allow_multiple_values, true);
-    locale_t prev_locale = uselocale(numericC);
+    char *prev_locale = sstrdup(setlocale(LC_NUMERIC, NULL));
+    setlocale(LC_NUMERIC, "C");
     const yajl_status stat = yajl_parse(hand, (const unsigned char *)buf, len);
     if (stat != yajl_status_ok && stat != yajl_status_client_canceled) {
         unsigned char *str = yajl_get_error(hand, 1, (const unsigned char 
*)buf, len);
@@ -679,7 +682,8 @@
         yajl_free_error(hand, str);
     }
 
-    uselocale(prev_locale);
+    setlocale(LC_NUMERIC, prev_locale);
+    free(prev_locale);
     yajl_complete_parse(hand);
     yajl_free(hand);
 
@@ -725,7 +729,8 @@
     parsing_geometry = false;
     parsing_focus = false;
     parsing_marks = false;
-    locale_t prev_locale = uselocale(numericC);
+    char *prev_locale = sstrdup(setlocale(LC_NUMERIC, NULL));
+    setlocale(LC_NUMERIC, "C");
     const yajl_status stat = yajl_parse(hand, (const unsigned char *)buf, len);
     if (stat != yajl_status_ok) {
         unsigned char *str = yajl_get_error(hand, 1, (const unsigned char 
*)buf, len);
@@ -750,7 +755,8 @@
      * next time. */
     con_fix_percent(con);
 
-    uselocale(prev_locale);
+    setlocale(LC_NUMERIC, prev_locale);
+    free(prev_locale);
     yajl_complete_parse(hand);
     yajl_free(hand);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3-4.25/src/main.c new/i3-4.25.1/src/main.c
--- old/i3-4.25/src/main.c      2025-12-19 08:19:53.000000000 +0100
+++ new/i3-4.25.1/src/main.c    2026-02-06 08:30:55.000000000 +0100
@@ -36,8 +36,6 @@
 #include "i3-atoms_NET_SUPPORTED.xmacro.h"
 #include "i3-atoms_rest.xmacro.h"
 
-locale_t numericC;
-
 /* The original value of RLIMIT_CORE when i3 was started. We need to restore
  * this before starting any other process, since we set RLIMIT_CORE to
  * RLIM_INFINITY for i3 debugging versions. */
@@ -316,7 +314,6 @@
     int option_index = 0, opt;
 
     setlocale(LC_ALL, "");
-    numericC = newlocale(LC_NUMERIC_MASK, "C", 0);
 
     /* Get the RLIMIT_CORE limit at startup time to restore this before
      * starting processes. */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3-4.25/src/util.c new/i3-4.25.1/src/util.c
--- old/i3-4.25/src/util.c      2025-12-19 08:19:53.000000000 +0100
+++ new/i3-4.25.1/src/util.c    2026-02-06 08:30:55.000000000 +0100
@@ -67,7 +67,7 @@
 __attribute__((pure)) bool name_is_digits(const char *name) {
     /* positive integers and zero are interpreted as numbers */
     for (size_t i = 0; i < strlen(name); i++) {
-        if (!isdigit(name[i])) {
+        if (!isdigit((unsigned char)name[i])) {
             return false;
         }
     }
@@ -221,12 +221,14 @@
 #define ystr(str) yajl_gen_string(gen, (unsigned char *)str, strlen(str))
 
 static char *store_restart_layout(void) {
-    locale_t prev_locale = uselocale(numericC);
+    char *prev_locale = sstrdup(setlocale(LC_NUMERIC, NULL));
+    setlocale(LC_NUMERIC, "C");
     yajl_gen gen = yajl_gen_alloc(NULL);
 
     dump_node(gen, croot, true);
 
-    uselocale(prev_locale);
+    setlocale(LC_NUMERIC, prev_locale);
+    free(prev_locale);
 
     const unsigned char *payload;
     size_t length;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3-4.25/testcases/t/554-crash-floating-enable.t 
new/i3-4.25.1/testcases/t/554-crash-floating-enable.t
--- old/i3-4.25/testcases/t/554-crash-floating-enable.t 1970-01-01 
01:00:00.000000000 +0100
+++ new/i3-4.25.1/testcases/t/554-crash-floating-enable.t       2026-02-06 
08:30:55.000000000 +0100
@@ -0,0 +1,28 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Please read the following documents before working on tests:
+# • https://build.i3wm.org/docs/testsuite.html
+#   (or docs/testsuite)
+#
+# • https://build.i3wm.org/docs/lib-i3test.html
+#   (alternatively: perldoc ./testcases/lib/i3test.pm)
+#
+# • https://build.i3wm.org/docs/ipc.html
+#   (or docs/ipc)
+#
+# • https://i3wm.org/downloads/modern_perl_a4.pdf
+#   (unless you are already familiar with Perl)
+#
+# Verify that i3 does not crash when a floating command is run and for_window
+# rule exists.
+# Ticket: #6561
+# Bug still in: 4.25-6-g0e2e8290
+use i3test i3_config => <<EOT;
+for_window [class=xxx] nop
+EOT
+
+cmd 'floating toggle';
+does_i3_live;
+
+done_testing;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/i3-4.25/testcases/t/555-i3bar-workspace-output-assignment.t 
new/i3-4.25.1/testcases/t/555-i3bar-workspace-output-assignment.t
--- old/i3-4.25/testcases/t/555-i3bar-workspace-output-assignment.t     
1970-01-01 01:00:00.000000000 +0100
+++ new/i3-4.25.1/testcases/t/555-i3bar-workspace-output-assignment.t   
2026-02-06 08:30:55.000000000 +0100
@@ -0,0 +1,147 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Please read the following documents before working on tests:
+# • https://build.i3wm.org/docs/testsuite.html
+#   (or docs/testsuite)
+#
+# • https://build.i3wm.org/docs/lib-i3test.html
+#   (alternatively: perldoc ./testcases/lib/i3test.pm)
+#
+# • https://build.i3wm.org/docs/ipc.html
+#   (or docs/ipc)
+#
+# • https://i3wm.org/downloads/modern_perl_a4.pdf
+#   (unless you are already familiar with Perl)
+#
+# Verify that i3bar only shows correct workspace buttons in each output.
+# Ticket: #6560
+# Bug still in: 4.25-6-g0e2e8290
+use File::Temp qw(tempdir);
+use i3test i3_autostart => 0;
+use i3test::Util qw(slurp);
+use i3test::XTEST;
+use POSIX qw(mkfifo);
+
+################################################################################
+# Test that a bar configured for primary output only shows workspaces from that
+# output, not from other outputs.
+################################################################################
+
+# Create temp files for i3bar PID and exit signaling
+my $tmpdir = tempdir(CLEANUP => 1);
+my $pidfile = "$tmpdir/i3bar.pid";
+my $exitfifo = "$tmpdir/fifo";
+my $logfile = "$tmpdir/i3bar.log";
+mkfifo("$exitfifo", 0600) or BAIL_OUT "Could not create FIFO: $!";
+
+# Create a wrapper script that tracks i3bar's PID and signals when it exits
+my $scriptfile = "$tmpdir/i3bar-wrapper.sh";
+open(my $scriptfh, '>', $scriptfile) or BAIL_OUT "Cannot create wrapper: $!";
+print $scriptfh <<"EOF";
+#!/bin/sh
+echo "---- DEBUG: i3bar wrapper ----"
+cat "$scriptfile"
+echo '---- DEBUG: i3bar wrapper ----'
+# Use tee so that the logs also end up in the testsuite log file.
+(i3bar -V "\$@" 2>&1 | tee "$logfile") &
+echo \$! > "$pidfile"
+wait
+echo done > "$exitfifo"
+EOF
+close($scriptfh);
+chmod 0755, $scriptfile;
+
+my $config = <<"EOT";
+font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+
+fake-outputs 1024x768+0+0P,1024x768+1024+0
+workspace 1 output fake-1 # primary
+workspace 2 output fake-0 # nonprimary
+
+bar {
+    i3bar_command $scriptfile
+    output primary
+}
+EOT
+
+my $pid = launch_with_config($config);
+
+my $i3 = i3(get_socket_path());
+$i3->connect()->recv;
+my $cv = AnyEvent->condvar;
+my $timer = AnyEvent->timer(after => 1, interval => 0, cb => sub { 
$cv->send(0) });
+$i3->subscribe({
+        window => sub {
+            my ($event) = @_;
+            if ($event->{change} eq 'new') {
+                if (defined($event->{container}->{window_properties}->{class}) 
&&
+                    $event->{container}->{window_properties}->{class} eq 
'i3bar') {
+                    $cv->send($event->{container});
+                }
+            }
+        },
+    })->recv;
+
+sub i3bar_present {
+    my ($nodes) = @_;
+
+    for my $node (@{$nodes}) {
+       my $props = $node->{window_properties};
+       if (defined($props) && $props->{class} eq 'i3bar') {
+           return $node->{window};
+       }
+    }
+
+    return 0 if !@{$nodes};
+
+    my @children = (map { @{$_->{nodes}} } @{$nodes},
+                    map { @{$_->{'floating_nodes'}} } @{$nodes});
+
+    return i3bar_present(\@children);
+}
+
+my $i3bar_window = i3bar_present($i3->get_tree->recv->{nodes});
+if ($i3bar_window) {
+    ok(1, 'i3bar present');
+} else {
+    my $con = $cv->recv;
+    ok($con, 'i3bar appeared');
+    $i3bar_window = $con->{window};
+}
+
+diag('i3bar window = ' . $i3bar_window);
+xtest_sync_with_i3;
+xtest_sync_with($i3bar_window);
+
+# The actual test
+cmd 'workspace 1';
+my $win1 = open_window;
+cmd 'workspace 2';
+my $win2 = open_window;
+
+# Kill i3bar gracefully BEFORE exiting i3 to ensure buffers are flushed
+# (if i3 exits first, i3bar gets SIGPIPE and buffers are lost)
+open(my $pidfh, '<', $pidfile) or BAIL_OUT "Cannot read i3bar PID: $!";
+my $bar_pid = <$pidfh>;
+close($pidfh);
+chomp($bar_pid);
+kill('TERM', $bar_pid);
+
+# Wait for i3bar to exit by reading from the FIFO (blocks until wrapper writes)
+open(my $fifofh, '<', $exitfifo) or BAIL_OUT "Cannot open FIFO: $!";
+my $result = <$fifofh>;
+close($fifofh);
+ok(defined($result), 'i3bar ended');
+
+exit_gracefully($pid);
+
+my $log = slurp($logfile);
+
+my @ws2_draws = ($log =~ /Drawing button for WS 2 at/g);
+ok(scalar(@ws2_draws) > 0, "Workspace 2 (on primary) is drawn in the bar");
+
+my @ws1_draws = ($log =~ /Drawing button for WS 1 at/g);
+is(scalar(@ws1_draws), 0, "Workspace 1 (on non-primary) should NOT be drawn on 
primary bar");
+
+done_testing;

Reply via email to