From 654e2cefa6effa10170977e6f5b1f065b75e9d3f Mon Sep 17 00:00:00 2001 From: Mark Guptill Date: Tue, 30 Jun 2020 04:34:32 -0400 Subject: [PATCH 1/8] kick tray clients before destroying the bar --- i3bar/src/xcb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/i3bar/src/xcb.c b/i3bar/src/xcb.c index ec069021f..a01e31ea3 100644 --- a/i3bar/src/xcb.c +++ b/i3bar/src/xcb.c @@ -1652,6 +1652,8 @@ void destroy_window(i3_output *output) { return; } + kick_tray_clients(output); + draw_util_surface_free(xcb_connection, &(output->bar)); draw_util_surface_free(xcb_connection, &(output->buffer)); draw_util_surface_free(xcb_connection, &(output->statusline_buffer)); @@ -1659,8 +1661,6 @@ void destroy_window(i3_output *output) { xcb_free_pixmap(xcb_connection, output->buffer.id); xcb_free_pixmap(xcb_connection, output->statusline_buffer.id); output->bar.id = XCB_NONE; - - kick_tray_clients(output); } /* Strut partial tells i3 where to reserve space for i3bar. This is determined From eaac9125a9dc9586752cccfc3cc551b0b9e3c2dd Mon Sep 17 00:00:00 2001 From: Orestis Floros Date: Mon, 19 Oct 2020 22:10:14 +0200 Subject: [PATCH 2/8] meson: Mark complete-run.pl as executable (#4224) Fixes problem described in https://github.com/i3/i3/issues/4086#issuecomment-711774506 --- meson.build | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/meson.build b/meson.build index f52949360..0c3f14c9c 100644 --- a/meson.build +++ b/meson.build @@ -598,18 +598,22 @@ install_headers( # because configure_file strips the backslash in e.g. \@display, # resulting in @display, breaking our Perl code: # https://github.com/mesonbuild/meson/issues/7165 -sed = find_program('sed') +bash = find_program('bash') replace_dirs = [ - sed, - '-e', - 's,@abs_top_builddir@,'+meson.current_build_dir()+',g;s,@abs_top_srcdir@,'+meson.current_source_dir()+',g', - '@INPUT@', + bash, '-c', # Use bash to capture output and mark as executable + 'sed -e \'s,@abs_top_builddir@,' + + meson.current_build_dir() + + ',g;s,@abs_top_srcdir@,' + + meson.current_source_dir()+',g\'' + # Only mark files ending in .pl as executables + + ' "$0" > "$1" && { [[ "${1##*.}" == pl ]] && chmod +x "$1" || true; }', + '@INPUT0@', # $0 + '@OUTPUT0@', # $1 ] complete_run = custom_target( 'complete-run', input: ['testcases/complete-run.pl.in'], output: ['complete-run.pl'], - capture: true, command: replace_dirs, # build this target when running e.g. ninja or ninja test. # This is required for older meson versions (< 0.46.0). @@ -619,7 +623,6 @@ i3test_pm = custom_target( 'i3test-pm', input: ['testcases/lib/i3test.pm.in'], output: ['i3test.pm'], - capture: true, command: replace_dirs, # build this target when running e.g. ninja or ninja test. # This is required for older meson versions (< 0.46.0). From b2ac041ffa6af806678baa434b57e24a8dde38f1 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Mon, 19 Oct 2020 23:16:56 +0200 Subject: [PATCH 3/8] release i3 4.18.3 --- I3_VERSION | 2 +- Makefile.am | 2 +- RELEASE-NOTES-4.18.2 => RELEASE-NOTES-4.18.3 | 13 +++++-------- configure.ac | 2 +- 4 files changed, 8 insertions(+), 11 deletions(-) rename RELEASE-NOTES-4.18.2 => RELEASE-NOTES-4.18.3 (68%) diff --git a/I3_VERSION b/I3_VERSION index 45c729928..21cf88054 100644 --- a/I3_VERSION +++ b/I3_VERSION @@ -1 +1 @@ -4.18.2-non-git +4.18.3 (2020-10-19) diff --git a/Makefile.am b/Makefile.am index b3125e340..ff1c2d320 100644 --- a/Makefile.am +++ b/Makefile.am @@ -118,7 +118,7 @@ EXTRA_DIST = \ I3_VERSION \ LICENSE \ PACKAGE-MAINTAINER \ - RELEASE-NOTES-4.18.2 \ + RELEASE-NOTES-4.18.3 \ generate-command-parser.pl \ parser-specs/commands.spec \ parser-specs/config.spec \ diff --git a/RELEASE-NOTES-4.18.2 b/RELEASE-NOTES-4.18.3 similarity index 68% rename from RELEASE-NOTES-4.18.2 rename to RELEASE-NOTES-4.18.3 index 66a5bee12..5c14a3983 100644 --- a/RELEASE-NOTES-4.18.2 +++ b/RELEASE-NOTES-4.18.3 @@ -1,9 +1,9 @@ ┌──────────────────────────────┐ - │ Release notes for i3 v4.18.2 │ + │ Release notes for i3 v4.18.3 │ └──────────────────────────────┘ -This is i3 v4.18.2. This version is considered stable. All users of i3 are +This is i3 v4.18.3. This version is considered stable. All users of i3 are strongly encouraged to upgrade. This is a bugfix release for v4.18. @@ -12,10 +12,7 @@ This is a bugfix release for v4.18. │ Bugfixes │ └────────────────────────────┘ - • floating_maybe_reassign_ws: only re-focus if previously focused - (fixes a focus issue with KDE notifications) - • get_output_by_name: guard output->primary with require_active - • i3bar: fix Xorg memory leak + • Bugfix: kick tray clients before destroying the bar ┌────────────────────────────┐ │ Thanks! │ @@ -23,6 +20,6 @@ This is a bugfix release for v4.18. Thanks for testing, bugfixes, discussions and everything I forgot go out to: - Orestis Floros + Mark Guptill, Orestis Floros --- Michael Stapelberg, 2020-07-26 +-- Michael Stapelberg, 2020-10-19 diff --git a/configure.ac b/configure.ac index a7e997a96..8149464a6 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ # Run autoreconf -fi to generate a configure script from this file. AC_PREREQ([2.69]) -AC_INIT([i3], [4.18.2], [https://github.com/i3/i3/issues]) +AC_INIT([i3], [4.18.3], [https://github.com/i3/i3/issues]) # For AX_EXTEND_SRCDIR AX_ENABLE_BUILDDIR AM_INIT_AUTOMAKE([foreign subdir-objects -Wall no-dist-gzip dist-bzip2]) From 4da7e318e55dc8c50734fd86684c36647b5185e9 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Mon, 19 Oct 2020 23:17:05 +0200 Subject: [PATCH 4/8] Set non-git version to 4.18.3-non-git. --- I3_VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/I3_VERSION b/I3_VERSION index 21cf88054..784debda5 100644 --- a/I3_VERSION +++ b/I3_VERSION @@ -1 +1 @@ -4.18.3 (2020-10-19) +4.18.3-non-git From ce01babc7c5df2309f14ff920ec35161d253e735 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Mon, 19 Oct 2020 23:17:05 +0200 Subject: [PATCH 5/8] Update debian/changelog --- debian/changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 152f06298..9a20f70f8 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,7 +2,7 @@ i3-wm (4.18.3-1) unstable; urgency=medium * New upstream release. - -- Michael Stapelberg Sun, 26 Jul 2020 10:24:46 +0200 + -- Michael Stapelberg Mon, 19 Oct 2020 22:48:30 +0200 i3-wm (4.18.2-1) unstable; urgency=medium From 83078a1e16cac3a9c7dc359d19e7191135b5140c Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Mon, 19 Oct 2020 23:41:16 +0200 Subject: [PATCH 6/8] debian: update changelog --- debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/debian/changelog b/debian/changelog index 9a20f70f8..3fddbe343 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +i3-wm (4.19-1) unstable; urgency=medium + + * New upstream release. + + -- Michael Stapelberg Mon, 19 Oct 2020 22:48:30 +0200 + i3-wm (4.18.3-1) unstable; urgency=medium * New upstream release. From e3a1c5b29422303106833f08c6c29c1f20091ab8 Mon Sep 17 00:00:00 2001 From: Albert Safin Date: Fri, 28 Feb 2020 03:09:02 +0000 Subject: [PATCH 7/8] clang-format: use TypenameMacros This commit removes line breaks and extra empty lines introduced in commit fff3f79da9a87a1f790c6328f6615422f2b69b47. --- .clang-format | 1 + i3bar/include/common.h | 6 +-- i3bar/include/configuration.h | 16 ++------ i3bar/include/outputs.h | 3 +- i3bar/include/trayclients.h | 3 +- i3bar/include/workspaces.h | 3 +- include/configuration.h | 21 ++++------ include/data.h | 77 +++++++++++------------------------ include/i3.h | 2 +- include/ipc.h | 3 +- libi3/get_colorpixel.c | 6 +-- src/commands.c | 4 +- src/con.c | 7 +--- src/ipc.c | 3 +- src/load_layout.c | 4 +- src/restore_layout.c | 3 +- src/sighandler.c | 4 +- src/x.c | 20 +++------ 18 files changed, 57 insertions(+), 129 deletions(-) diff --git a/.clang-format b/.clang-format index 6b542c189..4a15e88e3 100644 --- a/.clang-format +++ b/.clang-format @@ -10,3 +10,4 @@ ColumnLimit: 0 SpaceBeforeParens: ControlStatements SortIncludes: false ForEachMacros: [ TAILQ_FOREACH, TAILQ_FOREACH_REVERSE, SLIST_FOREACH, CIRCLEQ_FOREACH, CIRCLEQ_FOREACH_REVERSE, NODES_FOREACH, NODES_FOREACH_REVERSE, FOREACH_NONINTERNAL] +TypenameMacros: [ SLIST_HEAD, SLIST_ENTRY, LIST_HEAD, LIST_ENTRY, SIMPLEQ_HEAD, SIMPLEQ_ENTRY, TAILQ_HEAD, TAILQ_ENTRY, CIRCLEQ_HEAD, CIRCLEQ_ENTRY ] diff --git a/i3bar/include/common.h b/i3bar/include/common.h index 2d763133b..52f77b0e6 100644 --- a/i3bar/include/common.h +++ b/i3bar/include/common.h @@ -77,12 +77,10 @@ struct status_block { char *name; char *instance; - TAILQ_ENTRY(status_block) - blocks; + TAILQ_ENTRY(status_block) blocks; }; -extern TAILQ_HEAD(statusline_head, status_block) - statusline_head; +extern TAILQ_HEAD(statusline_head, status_block) statusline_head; #include "child.h" #include "ipc.h" diff --git a/i3bar/include/configuration.h b/i3bar/include/configuration.h index 70167247c..f39d24c9b 100644 --- a/i3bar/include/configuration.h +++ b/i3bar/include/configuration.h @@ -29,23 +29,18 @@ typedef struct binding_t { char *command; bool release; - TAILQ_ENTRY(binding_t) - bindings; + TAILQ_ENTRY(binding_t) bindings; } binding_t; typedef struct tray_output_t { char *output; - TAILQ_ENTRY(tray_output_t) - tray_outputs; + TAILQ_ENTRY(tray_output_t) tray_outputs; } tray_output_t; typedef struct config_t { uint32_t modifier; - - TAILQ_HEAD(bindings_head, binding_t) - bindings; - + TAILQ_HEAD(bindings_head, binding_t) bindings; position_t position; bool verbose; bool transparency; @@ -59,10 +54,7 @@ typedef struct config_t { char *command; char *fontname; i3String *separator_symbol; - - TAILQ_HEAD(tray_outputs_head, tray_output_t) - tray_outputs; - + TAILQ_HEAD(tray_outputs_head, tray_output_t) tray_outputs; int tray_padding; int num_outputs; char **outputs; diff --git a/i3bar/include/outputs.h b/i3bar/include/outputs.h index 5bb19c401..4685e51e9 100644 --- a/i3bar/include/outputs.h +++ b/i3bar/include/outputs.h @@ -73,6 +73,5 @@ struct i3_output { struct ws_head* workspaces; /* The workspaces on this output */ struct tc_head* trayclients; /* The tray clients on this output */ - SLIST_ENTRY(i3_output) - slist; /* Pointer for the SLIST-Macro */ + SLIST_ENTRY(i3_output) slist; /* Pointer for the SLIST-Macro */ }; diff --git a/i3bar/include/trayclients.h b/i3bar/include/trayclients.h index 3f215ce46..bcf559598 100644 --- a/i3bar/include/trayclients.h +++ b/i3bar/include/trayclients.h @@ -21,6 +21,5 @@ struct trayclient { char *class_class; char *class_instance; - TAILQ_ENTRY(trayclient) - tailq; /* Pointer for the TAILQ-Macro */ + TAILQ_ENTRY(trayclient) tailq; /* Pointer for the TAILQ-Macro */ }; diff --git a/i3bar/include/workspaces.h b/i3bar/include/workspaces.h index 0ef5c0a92..ff61450c8 100644 --- a/i3bar/include/workspaces.h +++ b/i3bar/include/workspaces.h @@ -41,6 +41,5 @@ struct i3_ws { rect rect; /* The rect of the ws (not used (yet)) */ struct i3_output *output; /* The current output of the ws */ - TAILQ_ENTRY(i3_ws) - tailq; /* Pointer for the TAILQ-Macro */ + TAILQ_ENTRY(i3_ws) tailq; /* Pointer for the TAILQ-Macro */ }; diff --git a/include/configuration.h b/include/configuration.h index 49e4403cc..11cdde0dd 100644 --- a/include/configuration.h +++ b/include/configuration.h @@ -66,8 +66,7 @@ struct Variable { char *value; char *next_match; - SLIST_ENTRY(Variable) - variables; + SLIST_ENTRY(Variable) variables; }; /** @@ -81,8 +80,7 @@ struct Mode { bool pango_markup; struct bindings_head *bindings; - SLIST_ENTRY(Mode) - modes; + SLIST_ENTRY(Mode) modes; }; /** @@ -272,8 +270,7 @@ struct Barconfig { /* List of outputs on which the tray is allowed to be shown, in order. * The special value "none" disables it (per default, it will be shown) and * the special value "primary" enabled it on the primary output. */ - TAILQ_HEAD(tray_outputs_head, tray_output_t) - tray_outputs; + TAILQ_HEAD(tray_outputs_head, tray_output_t) tray_outputs; /* Padding around the tray icons. */ int tray_padding; @@ -295,8 +292,7 @@ struct Barconfig { /** Bar modifier (to show bar when in hide mode). */ uint32_t modifier; - TAILQ_HEAD(bar_bindings_head, Barbinding) - bar_bindings; + TAILQ_HEAD(bar_bindings_head, Barbinding) bar_bindings; /** Bar position (bottom by default). */ enum { P_BOTTOM = 0, @@ -370,8 +366,7 @@ struct Barconfig { char *binding_mode_text; } colors; - TAILQ_ENTRY(Barconfig) - configs; + TAILQ_ENTRY(Barconfig) configs; }; /** @@ -389,15 +384,13 @@ struct Barbinding { /** If true, the command will be executed after the button is released. */ bool release; - TAILQ_ENTRY(Barbinding) - bindings; + TAILQ_ENTRY(Barbinding) bindings; }; struct tray_output_t { char *output; - TAILQ_ENTRY(tray_output_t) - tray_outputs; + TAILQ_ENTRY(tray_output_t) tray_outputs; }; typedef enum { diff --git a/include/data.h b/include/data.h index 494dbe0a6..d794909f1 100644 --- a/include/data.h +++ b/include/data.h @@ -206,8 +206,7 @@ struct Workspace_Assignment { char *name; char *output; - TAILQ_ENTRY(Workspace_Assignment) - ws_assignments; + TAILQ_ENTRY(Workspace_Assignment) ws_assignments; }; struct Ignore_Event { @@ -215,8 +214,7 @@ struct Ignore_Event { int response_type; time_t added; - SLIST_ENTRY(Ignore_Event) - ignore_events; + SLIST_ENTRY(Ignore_Event) ignore_events; }; /** @@ -235,8 +233,7 @@ struct Startup_Sequence { * completed) */ time_t delete_at; - TAILQ_ENTRY(Startup_Sequence) - sequences; + TAILQ_ENTRY(Startup_Sequence) sequences; }; /** @@ -262,9 +259,7 @@ struct regex { struct Binding_Keycode { xcb_keycode_t keycode; i3_event_state_mask_t modifiers; - - TAILQ_ENTRY(Binding_Keycode) - keycodes; + TAILQ_ENTRY(Binding_Keycode) keycodes; }; /****************************************************************************** @@ -325,14 +320,12 @@ struct Binding { /** Only in use if symbol != NULL. Contains keycodes which generate the * specified symbol. Useful for unbinding and checking which binding was * used when a key press event comes in. */ - TAILQ_HEAD(keycodes_head, Binding_Keycode) - keycodes_head; + TAILQ_HEAD(keycodes_head, Binding_Keycode) keycodes_head; /** Command, like in command mode */ char *command; - TAILQ_ENTRY(Binding) - bindings; + TAILQ_ENTRY(Binding) bindings; }; /** @@ -348,19 +341,13 @@ struct Autostart { /** no_startup_id flag for start_application(). Determines whether a * startup notification context/ID should be created. */ bool no_startup_id; - - TAILQ_ENTRY(Autostart) - autostarts; - - TAILQ_ENTRY(Autostart) - autostarts_always; + TAILQ_ENTRY(Autostart) autostarts; + TAILQ_ENTRY(Autostart) autostarts_always; }; struct output_name { char *name; - - SLIST_ENTRY(output_name) - names; + SLIST_ENTRY(output_name) names; }; /** @@ -387,8 +374,7 @@ struct xoutput { /** List of names for the output. * An output always has at least one name; the first name is * considered the primary one. */ - SLIST_HEAD(names_head, output_name) - names_head; + SLIST_HEAD(names_head, output_name) names_head; /** Pointer to the Con which represents this output */ Con *con; @@ -396,8 +382,7 @@ struct xoutput { /** x, y, width, height */ Rect rect; - TAILQ_ENTRY(xoutput) - outputs; + TAILQ_ENTRY(xoutput) outputs; }; /** @@ -548,8 +533,7 @@ struct Match { M_ASSIGN_WS, M_BELOW } insert_where; - TAILQ_ENTRY(Match) - matches; + TAILQ_ENTRY(Match) matches; /* Whether this match was generated when restarting i3 inplace. * Leads to not setting focus when managing a new window, because the old @@ -596,8 +580,7 @@ struct Assignment { char *output; } dest; - TAILQ_ENTRY(Assignment) - assignments; + TAILQ_ENTRY(Assignment) assignments; }; /** Fullscreen modes. Used by Con.fullscreen_mode. */ @@ -608,8 +591,7 @@ typedef enum { CF_NONE = 0, struct mark_t { char *name; - TAILQ_ENTRY(mark_t) - marks; + TAILQ_ENTRY(mark_t) marks; }; /** @@ -673,8 +655,7 @@ struct Con { char *sticky_group; /* user-definable marks to jump to this container later */ - TAILQ_HEAD(marks_head, mark_t) - marks_head; + TAILQ_HEAD(marks_head, mark_t) marks_head; /* cached to decide whether a redraw is needed */ bool mark_changed; @@ -693,17 +674,12 @@ struct Con { struct deco_render_params *deco_render_params; /* Only workspace-containers can have floating clients */ - TAILQ_HEAD(floating_head, Con) - floating_head; + TAILQ_HEAD(floating_head, Con) floating_head; - TAILQ_HEAD(nodes_head, Con) - nodes_head; + TAILQ_HEAD(nodes_head, Con) nodes_head; + TAILQ_HEAD(focus_head, Con) focus_head; - TAILQ_HEAD(focus_head, Con) - focus_head; - - TAILQ_HEAD(swallow_head, Match) - swallow_head; + TAILQ_HEAD(swallow_head, Match) swallow_head; fullscreen_mode_t fullscreen_mode; @@ -741,17 +717,10 @@ struct Con { FLOATING_USER_ON = 3 } floating; - TAILQ_ENTRY(Con) - nodes; - - TAILQ_ENTRY(Con) - focused; - - TAILQ_ENTRY(Con) - all_cons; - - TAILQ_ENTRY(Con) - floating_windows; + TAILQ_ENTRY(Con) nodes; + TAILQ_ENTRY(Con) focused; + TAILQ_ENTRY(Con) all_cons; + TAILQ_ENTRY(Con) floating_windows; /** callbacks */ void (*on_remove_child)(Con *); diff --git a/include/i3.h b/include/i3.h index 158c032d6..2c550fa9c 100644 --- a/include/i3.h +++ b/include/i3.h @@ -57,7 +57,7 @@ extern xcb_key_symbols_t *keysyms; extern char **start_argv; extern Display *xlibdpy, *xkbdpy; extern int xkb_current_group; -extern TAILQ_HEAD(bindings_head, Binding) * bindings; +extern TAILQ_HEAD(bindings_head, Binding) *bindings; extern const char *current_binding_mode; extern TAILQ_HEAD(autostarts_head, Autostart) autostarts; extern TAILQ_HEAD(autostarts_always_head, Autostart) autostarts_always; diff --git a/include/ipc.h b/include/ipc.h index bc5929ecf..0d19daf4d 100644 --- a/include/ipc.h +++ b/include/ipc.h @@ -40,8 +40,7 @@ typedef struct ipc_client { uint8_t *buffer; size_t buffer_size; - TAILQ_ENTRY(ipc_client) - clients; + TAILQ_ENTRY(ipc_client) clients; } ipc_client; /* diff --git a/libi3/get_colorpixel.c b/libi3/get_colorpixel.c index b60ffbac3..32ef34cde 100644 --- a/libi3/get_colorpixel.c +++ b/libi3/get_colorpixel.c @@ -15,12 +15,10 @@ struct Colorpixel { char hex[8]; uint32_t pixel; - SLIST_ENTRY(Colorpixel) - colorpixels; + SLIST_ENTRY(Colorpixel) colorpixels; }; -SLIST_HEAD(colorpixel_head, Colorpixel) -colorpixels; +SLIST_HEAD(colorpixel_head, Colorpixel) colorpixels; /* * Returns the colorpixel to use for the given hex color (think of HTML). diff --git a/src/commands.c b/src/commands.c index 5bf4cef63..4687c16db 100644 --- a/src/commands.c +++ b/src/commands.c @@ -129,9 +129,7 @@ static Con *maybe_auto_back_and_forth_workspace(Con *workspace) { */ typedef struct owindow { Con *con; - - TAILQ_ENTRY(owindow) - owindows; + TAILQ_ENTRY(owindow) owindows; } owindow; typedef TAILQ_HEAD(owindows_head, owindow) owindows_head; diff --git a/src/con.c b/src/con.c index 196850735..1f0dbed3f 100644 --- a/src/con.c +++ b/src/con.c @@ -514,8 +514,7 @@ Con *con_parent_with_orientation(Con *con, orientation_t orientation) { struct bfs_entry { Con *con; - TAILQ_ENTRY(bfs_entry) - entries; + TAILQ_ENTRY(bfs_entry) entries; }; /* @@ -527,9 +526,7 @@ Con *con_get_fullscreen_con(Con *con, fullscreen_mode_t fullscreen_mode) { /* TODO: is breadth-first-search really appropriate? (check as soon as * fullscreen levels and fullscreen for containers is implemented) */ - TAILQ_HEAD(bfs_head, bfs_entry) - bfs_head = TAILQ_HEAD_INITIALIZER(bfs_head); - + TAILQ_HEAD(bfs_head, bfs_entry) bfs_head = TAILQ_HEAD_INITIALIZER(bfs_head); struct bfs_entry *entry = smalloc(sizeof(struct bfs_entry)); entry->con = con; TAILQ_INSERT_TAIL(&bfs_head, entry, entries); diff --git a/src/ipc.c b/src/ipc.c index 70b4f248b..1711c5260 100644 --- a/src/ipc.c +++ b/src/ipc.c @@ -25,8 +25,7 @@ char *current_socketpath = NULL; -TAILQ_HEAD(ipc_client_head, ipc_client) -all_clients = TAILQ_HEAD_INITIALIZER(all_clients); +TAILQ_HEAD(ipc_client_head, ipc_client) all_clients = TAILQ_HEAD_INITIALIZER(all_clients); /* * Puts the given socket file descriptor into non-blocking mode or dies if diff --git a/src/load_layout.c b/src/load_layout.c index c0be3f26a..bb91ffa4d 100644 --- a/src/load_layout.c +++ b/src/load_layout.c @@ -44,9 +44,7 @@ struct pending_marks { * array. */ struct focus_mapping { int old_id; - - TAILQ_ENTRY(focus_mapping) - focus_mappings; + TAILQ_ENTRY(focus_mapping) focus_mappings; }; static TAILQ_HEAD(focus_mappings_head, focus_mapping) focus_mappings = diff --git a/src/restore_layout.c b/src/restore_layout.c index 25f631b7a..c51bfcbe3 100644 --- a/src/restore_layout.c +++ b/src/restore_layout.c @@ -29,8 +29,7 @@ typedef struct placeholder_state { /** The drawable surface */ surface_t surface; - TAILQ_ENTRY(placeholder_state) - state; + TAILQ_ENTRY(placeholder_state) state; } placeholder_state; static TAILQ_HEAD(state_head, placeholder_state) state_head = diff --git a/src/sighandler.c b/src/sighandler.c index c1e6094f2..2be69c312 100644 --- a/src/sighandler.c +++ b/src/sighandler.c @@ -16,9 +16,7 @@ typedef struct dialog_t { xcb_colormap_t colormap; Rect dims; surface_t surface; - - TAILQ_ENTRY(dialog_t) - dialogs; + TAILQ_ENTRY(dialog_t) dialogs; } dialog_t; static TAILQ_HEAD(dialogs_head, dialog_t) dialogs = TAILQ_HEAD_INITIALIZER(dialogs); diff --git a/src/x.c b/src/x.c index def79ef23..48af5f374 100644 --- a/src/x.c +++ b/src/x.c @@ -63,26 +63,18 @@ typedef struct con_state { char *name; - CIRCLEQ_ENTRY(con_state) - state; - - CIRCLEQ_ENTRY(con_state) - old_state; - - TAILQ_ENTRY(con_state) - initial_mapping_order; + CIRCLEQ_ENTRY(con_state) state; + CIRCLEQ_ENTRY(con_state) old_state; + TAILQ_ENTRY(con_state) initial_mapping_order; } con_state; -CIRCLEQ_HEAD(state_head, con_state) -state_head = +CIRCLEQ_HEAD(state_head, con_state) state_head = CIRCLEQ_HEAD_INITIALIZER(state_head); -CIRCLEQ_HEAD(old_state_head, con_state) -old_state_head = +CIRCLEQ_HEAD(old_state_head, con_state) old_state_head = CIRCLEQ_HEAD_INITIALIZER(old_state_head); -TAILQ_HEAD(initial_mapping_head, con_state) -initial_mapping_head = +TAILQ_HEAD(initial_mapping_head, con_state) initial_mapping_head = TAILQ_HEAD_INITIALIZER(initial_mapping_head); /* From 9e059ccc55cd30ceb0da9ef963cbe18581c81fc1 Mon Sep 17 00:00:00 2001 From: Alessandro Vinciguerra <30745465+Arc676@users.noreply.github.com> Date: Tue, 20 Oct 2020 09:38:35 +0200 Subject: [PATCH 8/8] Add situational exit codes (#4107) Add situational exit codes Distinguish user canceled and other errors Closes #3705 --- RELEASE-NOTES-next | 1 + i3-input/main.c | 24 ++++++++++++++++-------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/RELEASE-NOTES-next b/RELEASE-NOTES-next index 2da813728..39b8d836a 100644 --- a/RELEASE-NOTES-next +++ b/RELEASE-NOTES-next @@ -26,6 +26,7 @@ working. Please reach out to us in that case! to their definition order in the config file • update i3bar config when necessary (reduces redraws on bar mode changes) • mention rofi in default config file + • i3-input: add different exit codes for when i3-input fails ┌────────────────────────────┐ │ Bugfixes │ diff --git a/i3-input/main.c b/i3-input/main.c index 18dbcc1e3..ef9e0701f 100644 --- a/i3-input/main.c +++ b/i3-input/main.c @@ -32,6 +32,14 @@ xcb_visualtype_t *visual_type = NULL; #define BORDER logical_px(2) #define PADDING logical_px(2) +/* Exit codes for i3-input: + * 0 if i3-input exited successfully and the command was run + * 1 if the user canceled input + * 2 if i3-input fails for any other reason */ +const int EXIT_OK = 0; +const int EXIT_CANCEL = 1; +const int EXIT_ERROR = 2; + /* IPC format string. %s will be replaced with what the user entered, then * the command will be sent to i3 */ static char *format; @@ -186,11 +194,11 @@ static void finish_input(void) { /* prefix the command if a prefix was specified on commandline */ printf("command = %s\n", full); - ipc_send_message(sockfd, strlen(full), 0, (uint8_t *)full); + int ret = ipc_send_message(sockfd, strlen(full), 0, (uint8_t *)full); free(full); - exit(0); + exit(ret == 0 ? EXIT_OK : EXIT_ERROR); } /* @@ -239,7 +247,7 @@ static int handle_key_press(void *ignored, xcb_connection_t *conn, xcb_key_press return 1; } if (sym == XK_Escape) { - exit(0); + exit(EXIT_CANCEL); } /* TODO: handle all of these? */ @@ -297,7 +305,7 @@ static xcb_rectangle_t get_window_position(void) { xcb_intern_atom_reply_t *nswc_reply = xcb_intern_atom_reply(conn, nswc_cookie, NULL); if (nswc_reply == NULL) { ELOG("Could not intern atom _NET_SUPPORTING_WM_CHECK\n"); - exit(-1); + exit(EXIT_ERROR); } A__NET_SUPPORTING_WM_CHECK = nswc_reply->atom; free(nswc_reply); @@ -392,7 +400,7 @@ int main(int argc, char *argv[]) { break; case 'v': printf("i3-input " I3_VERSION); - return 0; + return EXIT_OK; case 'p': /* This option is deprecated, but will still work in i3 v4.1, 4.2 and 4.3 */ fprintf(stderr, "i3-input: WARNING: the -p option is DEPRECATED in favor of the -F (format) option\n"); @@ -420,7 +428,7 @@ int main(int argc, char *argv[]) { printf("\n"); printf("Example:\n"); printf(" i3-input -F 'workspace \"%%s\"' -P 'Switch to workspace: '\n"); - return 0; + return EXIT_OK; } } if (!format) { @@ -491,7 +499,7 @@ int main(int argc, char *argv[]) { if (reply->status != XCB_GRAB_STATUS_SUCCESS) { fprintf(stderr, "Could not grab keyboard, status = %d\n", reply->status); - exit(-1); + exit(EXIT_ERROR); } xcb_flush(conn); @@ -527,5 +535,5 @@ int main(int argc, char *argv[]) { } draw_util_surface_free(conn, &surface); - return 0; + return EXIT_OK; }