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;
