diff --git a/Makefile.am b/Makefile.am index 1b9c092e4..d85167b01 100644 --- a/Makefile.am +++ b/Makefile.am @@ -379,7 +379,6 @@ i3_nagbar_i3_nagbar_LDADD = \ i3_nagbar_i3_nagbar_SOURCES = \ i3-nagbar/atoms.xmacro \ - i3-nagbar/i3-nagbar.h \ i3-nagbar/main.c i3bar_i3bar_CPPFLAGS = \ diff --git a/generate-command-parser.pl b/generate-command-parser.pl index a017edab2..77502db7e 100755 --- a/generate-command-parser.pl +++ b/generate-command-parser.pl @@ -117,6 +117,7 @@ sub slurp { open(my $enumfh, '>', "GENERATED_${prefix}_enums.h"); my %statenum; +say $enumfh '#pragma once'; say $enumfh 'typedef enum {'; my $cnt = 0; for my $state (@keys, '__CALL') { @@ -131,6 +132,7 @@ sub slurp { # Third step: Generate the call function. open(my $callfh, '>', "GENERATED_${prefix}_call.h"); my $resultname = uc(substr($prefix, 0, 1)) . substr($prefix, 1) . 'ResultIR'; +say $callfh '#pragma once'; say $callfh "static void GENERATED_call(const int call_identifier, struct $resultname *result) {"; say $callfh ' switch (call_identifier) {'; my $call_id = 0; @@ -206,6 +208,7 @@ sub slurp { # Fourth step: Generate the token datastructures. open(my $tokfh, '>', "GENERATED_${prefix}_tokens.h"); +say $tokfh '#pragma once'; for my $state (@keys) { my $tokens = $states{$state}; diff --git a/i3-config-wizard/main.c b/i3-config-wizard/main.c index f999de308..9e07d1f7d 100644 --- a/i3-config-wizard/main.c +++ b/i3-config-wizard/main.c @@ -10,6 +10,8 @@ */ #include +#include "libi3.h" + #if defined(__FreeBSD__) #include #endif @@ -23,37 +25,31 @@ #define _WITH_GETLINE #endif -#include -#include -#include -#include -#include -#include #include -#include #include -#include +#include +#include #include #include +#include +#include #include -#include -#include -#include +#include +#include #include #include #include #include - -#include #include +#include #define SN_API_NOT_YET_FROZEN 1 #include +#include #include #include -#include /* We need SYSCONFDIR for the path to the keycode config template, so raise an * error if it’s not defined for whatever reason */ @@ -69,7 +65,6 @@ #include "xcb.h" xcb_visualtype_t *visual_type = NULL; -#include "libi3.h" #define TEXT_PADDING logical_px(4) #define WIN_POS_X logical_px(490) diff --git a/i3-dump-log/main.c b/i3-dump-log/main.c index ba60d396e..e58b0c379 100644 --- a/i3-dump-log/main.c +++ b/i3-dump-log/main.c @@ -9,27 +9,22 @@ */ #include -#include +#include "libi3.h" +#include "shmlog.h" + +#include +#include +#include +#include +#include #include -#include -#include -#include +#include +#include #include -#include #include -#include -#include -#include -#include -#include -#include #include #include -#include - -#include "libi3.h" -#include "shmlog.h" -#include +#include #if !defined(__OpenBSD__) static uint32_t offset_next_write; diff --git a/i3-input/keysym2ucs.c b/i3-input/keysym2ucs.c index 52bdc0444..80375099c 100644 --- a/i3-input/keysym2ucs.c +++ b/i3-input/keysym2ucs.c @@ -31,9 +31,10 @@ * This software is in the public domain. Share and enjoy! */ -#include #include "keysym2ucs.h" +#include + struct codepair { unsigned short keysym; unsigned short ucs; diff --git a/i3-input/main.c b/i3-input/main.c index e495fe10a..dc38b8a6a 100644 --- a/i3-input/main.c +++ b/i3-input/main.c @@ -8,32 +8,26 @@ * to i3. * */ +#include +#include +#include #include -#include #include -#include -#include #include -#include -#include -#include -#include -#include +#include +#include #include #include -#include #include xcb_visualtype_t *visual_type = NULL; +#include "i3-input.h" +#include "keysym2ucs.h" #include "libi3.h" #include -#include "keysym2ucs.h" - -#include "i3-input.h" - #define MAX_WIDTH logical_px(500) #define BORDER logical_px(2) #define PADDING logical_px(2) diff --git a/i3-msg/main.c b/i3-msg/main.c index 3a8974161..0b0ef4e39 100644 --- a/i3-msg/main.c +++ b/i3-msg/main.c @@ -16,27 +16,17 @@ */ #include "libi3.h" -#include +#include +#include +#include #include -#include -#include -#include +#include +#include #include -#include #include -#include -#include -#include -#include -#include +#include #include -#include - -#include -#include - -#include /* * Having verboselog() and errorlog() is necessary when using libi3. diff --git a/i3-nagbar/i3-nagbar.h b/i3-nagbar/i3-nagbar.h deleted file mode 100644 index cb672bead..000000000 --- a/i3-nagbar/i3-nagbar.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once - -#include - -#include - -#define die(...) errx(EXIT_FAILURE, __VA_ARGS__); -#define FREE(pointer) \ - do { \ - free(pointer); \ - pointer = NULL; \ - } while (0) - -#define xmacro(atom) xcb_atom_t A_##atom; -#include "atoms.xmacro" -#undef xmacro - -extern xcb_window_t root; diff --git a/i3-nagbar/main.c b/i3-nagbar/main.c index e59f5a6a3..51e5475c9 100644 --- a/i3-nagbar/main.c +++ b/i3-nagbar/main.c @@ -8,36 +8,33 @@ * when the user has an error in their configuration file. * */ -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include + +#include "libi3.h" + #include -#include +#include #include #include -#include #include +#include +#include +#include +#include +#include +#include +#include +#include #include #include -#include -#include #include xcb_visualtype_t *visual_type = NULL; -#include "libi3.h" #define SN_API_NOT_YET_FROZEN 1 #include -#include "i3-nagbar.h" - #define MSG_PADDING logical_px(8) #define BTN_PADDING logical_px(3) #define BTN_BORDER logical_px(3) @@ -45,6 +42,12 @@ xcb_visualtype_t *visual_type = NULL; #define CLOSE_BTN_GAP logical_px(15) #define BAR_BORDER logical_px(2) +#define xmacro(atom) xcb_atom_t A_##atom; +#include "atoms.xmacro" +#undef xmacro + +#define die(...) errx(EXIT_FAILURE, __VA_ARGS__); + static char *argv0 = NULL; typedef struct { @@ -314,8 +317,8 @@ static xcb_rectangle_t get_window_position(void) { goto free_resources; free_resources: - FREE(res); - FREE(primary); + free(res); + free(primary); return result; } @@ -598,7 +601,7 @@ int main(int argc, char *argv[]) { free(event); } - FREE(pattern); + free(pattern); draw_util_surface_free(conn, &bar); return 0; diff --git a/i3bar/include/common.h b/i3bar/include/common.h index 222f42dd9..2d763133b 100644 --- a/i3bar/include/common.h +++ b/i3bar/include/common.h @@ -9,7 +9,6 @@ #include -#include #include #include #include "libi3.h" @@ -94,5 +93,4 @@ extern TAILQ_HEAD(statusline_head, status_block) #include "trayclients.h" #include "xcb.h" #include "configuration.h" -#include "libi3.h" #include "parse_json_header.h" diff --git a/i3bar/src/child.c b/i3bar/src/child.c index e56145fac..871c23052 100644 --- a/i3bar/src/child.c +++ b/i3bar/src/child.c @@ -10,25 +10,21 @@ #include "common.h" #include "yajl_utils.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include +#include #include -#include -#include -#include -#include +#include #include +#include +#include +#include +#include +#include +#include +#include -#include +#include +#include /* Global variables for child_*() */ i3bar_child child; diff --git a/i3bar/src/config.c b/i3bar/src/config.c index 11d8e0a2d..c96277902 100644 --- a/i3bar/src/config.c +++ b/i3bar/src/config.c @@ -9,15 +9,12 @@ */ #include "common.h" -#include -#include #include -#include -#include -#include -#include +#include +#include #include +#include config_t config; static char *cur_key; diff --git a/i3bar/src/ipc.c b/i3bar/src/ipc.c index 37bdbac2b..f2c105ac3 100644 --- a/i3bar/src/ipc.c +++ b/i3bar/src/ipc.c @@ -9,16 +9,13 @@ */ #include "common.h" -#include -#include -#include -#include -#include #include -#include -#include -#include #include +#include +#include +#include +#include +#include #ifdef I3_ASAN_ENABLED #include #endif diff --git a/i3bar/src/main.c b/i3bar/src/main.c index 65cb00ff5..4e729341b 100644 --- a/i3bar/src/main.c +++ b/i3bar/src/main.c @@ -7,15 +7,13 @@ */ #include "common.h" -#include -#include -#include -#include -#include -#include #include #include #include +#include +#include +#include +#include struct ev_loop *main_loop; diff --git a/i3bar/src/mode.c b/i3bar/src/mode.c index 97087ce09..13d02110a 100644 --- a/i3bar/src/mode.c +++ b/i3bar/src/mode.c @@ -9,12 +9,10 @@ */ #include "common.h" -#include #include -#include -#include +#include + #include -#include /* A datatype to pass through the callbacks to save the state */ struct mode_json_params { diff --git a/i3bar/src/outputs.c b/i3bar/src/outputs.c index 6ebb7cc6b..46b9c9548 100644 --- a/i3bar/src/outputs.c +++ b/i3bar/src/outputs.c @@ -9,13 +9,12 @@ */ #include "common.h" -#include -#include -#include #include -#include +#include +#include +#include + #include -#include /* A datatype to pass through the callbacks to save the state */ struct outputs_json_params { diff --git a/i3bar/src/parse_json_header.c b/i3bar/src/parse_json_header.c index 3d4c2a67f..c74a62fee 100644 --- a/i3bar/src/parse_json_header.c +++ b/i3bar/src/parse_json_header.c @@ -10,22 +10,10 @@ */ #include "common.h" -#include -#include -#include -#include #include -#include -#include #include -#include -#include -#include -#include -#include -#include + #include -#include static enum { KEY_VERSION, diff --git a/i3bar/src/workspaces.c b/i3bar/src/workspaces.c index 68686611a..bd56f5d09 100644 --- a/i3bar/src/workspaces.c +++ b/i3bar/src/workspaces.c @@ -9,12 +9,10 @@ */ #include "common.h" -#include #include -#include -#include +#include + #include -#include /* A datatype to pass through the callbacks to save the state */ struct workspaces_json_params { diff --git a/i3bar/src/xcb.c b/i3bar/src/xcb.c index 15c6f82fa..9a599e36a 100644 --- a/i3bar/src/xcb.c +++ b/i3bar/src/xcb.c @@ -9,26 +9,15 @@ */ #include "common.h" -#include -#include -#include -#include -#include - -#include +#include +#include +#include #include -#include -#include #include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include #ifdef I3_ASAN_ENABLED #include diff --git a/include/all.h b/include/all.h index aa2b5b250..551119441 100644 --- a/include/all.h +++ b/include/all.h @@ -15,31 +15,24 @@ #include #include +#include +#include +#include +#include #include -#include +#include #include +#include #include -#include -#include -#include #include #include -#include -#include -#include -#include -#include -#include -#include #include #include -#include #include +#include -#include -#include - +#include "libi3.h" #include "data.h" #include "util.h" #include "ipc.h" @@ -72,7 +65,6 @@ #include "ewmh.h" #include "assignments.h" #include "regex.h" -#include "libi3.h" #include "startup.h" #include "scratchpad.h" #include "commands.h" diff --git a/include/configuration.h b/include/configuration.h index cd5daa8e1..53973462d 100644 --- a/include/configuration.h +++ b/include/configuration.h @@ -12,9 +12,6 @@ */ #pragma once -#include "libi3.h" - -#include #include "queue.h" #include "i3.h" diff --git a/include/data.h b/include/data.h index 2dfb86cd4..18490f4b7 100644 --- a/include/data.h +++ b/include/data.h @@ -9,13 +9,10 @@ */ #pragma once -#include "libi3.h" - #define SN_API_NOT_YET_FROZEN 1 #include #include -#include #include #include diff --git a/include/floating.h b/include/floating.h index 8e60f78c7..612874fcf 100644 --- a/include/floating.h +++ b/include/floating.h @@ -25,7 +25,7 @@ typedef enum { BORDER_LEFT = (1 << 0), * floating_windows list of the workspace. * */ -void floating_enable(Con *con, bool automatic); +bool floating_enable(Con *con, bool automatic); /** * Disables floating mode for the given container by re-attaching the container diff --git a/include/ipc.h b/include/ipc.h index 8ea9fd2e4..bc5929ecf 100644 --- a/include/ipc.h +++ b/include/ipc.h @@ -12,7 +12,6 @@ #include #include -#include #include #include diff --git a/include/log.h b/include/log.h index 5c530231d..d3c3e3f3e 100644 --- a/include/log.h +++ b/include/log.h @@ -11,9 +11,6 @@ #include -#include -#include - /* We will include libi3.h which define its own version of LOG, ELOG. * We want *our* version, so we undef the libi3 one. */ #if defined(LOG) diff --git a/include/shmlog.h b/include/shmlog.h index dc8081f13..7b7e133a6 100644 --- a/include/shmlog.h +++ b/include/shmlog.h @@ -12,7 +12,6 @@ #include -#include #if !defined(__OpenBSD__) #include #endif diff --git a/include/xinerama.h b/include/xinerama.h index f01ee568c..52a5db335 100644 --- a/include/xinerama.h +++ b/include/xinerama.h @@ -13,8 +13,6 @@ #include -#include "data.h" - /** * We have just established a connection to the X server and need the initial * Xinerama information to setup workspaces for each screen. diff --git a/libi3/dpi.c b/libi3/dpi.c index d15e35be7..dec38bc86 100644 --- a/libi3/dpi.c +++ b/libi3/dpi.c @@ -9,6 +9,7 @@ #include #include + #include static long dpi; diff --git a/libi3/draw_util.c b/libi3/draw_util.c index 092ac967b..313dc29ac 100644 --- a/libi3/draw_util.c +++ b/libi3/draw_util.c @@ -9,11 +9,10 @@ #include "libi3.h" #include -#include #include + #include #include -#include /* The default visual_type to use if none is specified when creating the surface. Must be defined globally. */ extern xcb_visualtype_t *visual_type; diff --git a/libi3/fake_configure_notify.c b/libi3/fake_configure_notify.c index 145f45122..5d87c3dac 100644 --- a/libi3/fake_configure_notify.c +++ b/libi3/fake_configure_notify.c @@ -8,7 +8,6 @@ #include "libi3.h" #include -#include #include #include diff --git a/libi3/font.c b/libi3/font.c index e01edb533..477509d03 100644 --- a/libi3/font.c +++ b/libi3/font.c @@ -8,14 +8,12 @@ #include "libi3.h" #include +#include +#include +#include #include #include #include -#include -#include - -#include -#include static const i3Font *savedFont = NULL; diff --git a/libi3/format_placeholders.c b/libi3/format_placeholders.c index 770e383d7..71870a7b1 100644 --- a/libi3/format_placeholders.c +++ b/libi3/format_placeholders.c @@ -8,7 +8,6 @@ #include "libi3.h" #include -#include #include #ifndef CS_STARTS_WITH diff --git a/libi3/g_utf8_make_valid.c b/libi3/g_utf8_make_valid.c index b15873b37..71beafd30 100644 --- a/libi3/g_utf8_make_valid.c +++ b/libi3/g_utf8_make_valid.c @@ -19,8 +19,8 @@ #include "libi3.h" -#include #include +#include /* Copied from: * https://gitlab.gnome.org/GNOME/glib/blob/f928dfdf57bf92c883b53b16d7a9d49add504f52/glib/gutf8.c#L1752-1815 */ diff --git a/libi3/get_colorpixel.c b/libi3/get_colorpixel.c index 09ce70b98..efc86fac1 100644 --- a/libi3/get_colorpixel.c +++ b/libi3/get_colorpixel.c @@ -6,12 +6,11 @@ * */ #include "libi3.h" +#include "queue.h" -#include #include +#include #include - -#include "queue.h" struct Colorpixel { char hex[8]; uint32_t pixel; diff --git a/libi3/get_exe_path.c b/libi3/get_exe_path.c index 430fb2e07..3b46ef82f 100644 --- a/libi3/get_exe_path.c +++ b/libi3/get_exe_path.c @@ -7,12 +7,10 @@ */ #include "libi3.h" -#include -#include -#include -#include -#include #include +#include +#include +#include /* * This function returns the absolute path to the executable it is running in. diff --git a/libi3/get_mod_mask.c b/libi3/get_mod_mask.c index 98031d4ce..92af456df 100644 --- a/libi3/get_mod_mask.c +++ b/libi3/get_mod_mask.c @@ -9,6 +9,7 @@ #include #include + #include #include diff --git a/libi3/get_process_filename.c b/libi3/get_process_filename.c index 7e2ecbd24..21429ec36 100644 --- a/libi3/get_process_filename.c +++ b/libi3/get_process_filename.c @@ -7,17 +7,11 @@ */ #include "libi3.h" -#include -#include -#include -#include -#include #include -#include -#include #include +#include +#include #include -#include /* * Returns the name of a temporary file with the specified prefix. diff --git a/libi3/ipc_connect.c b/libi3/ipc_connect.c index f659a1a47..871fe083b 100644 --- a/libi3/ipc_connect.c +++ b/libi3/ipc_connect.c @@ -7,14 +7,12 @@ */ #include "libi3.h" -#include -#include -#include -#include #include -#include -#include #include +#include +#include +#include +#include /* * Connects to the i3 IPC socket and returns the file descriptor for the diff --git a/libi3/ipc_recv_message.c b/libi3/ipc_recv_message.c index 84da5aa36..516405b00 100644 --- a/libi3/ipc_recv_message.c +++ b/libi3/ipc_recv_message.c @@ -7,15 +7,12 @@ */ #include "libi3.h" -#include -#include -#include -#include -#include #include -#include - #include +#include +#include +#include +#include /* * Reads a message from the given socket file descriptor and stores its length diff --git a/libi3/ipc_send_message.c b/libi3/ipc_send_message.c index c2cc0127d..4faeea7fd 100644 --- a/libi3/ipc_send_message.c +++ b/libi3/ipc_send_message.c @@ -7,14 +7,8 @@ */ #include "libi3.h" -#include -#include -#include -#include -#include -#include - #include +#include /* * Formats a message (payload) of the given size and type and sends it to i3 via diff --git a/libi3/is_debug_build.c b/libi3/is_debug_build.c index 52187bdae..cb53407ec 100644 --- a/libi3/is_debug_build.c +++ b/libi3/is_debug_build.c @@ -8,7 +8,6 @@ #include "libi3.h" #include -#include /* * Returns true if this version of i3 is a debug build (anything which is not a diff --git a/libi3/root_atom_contents.c b/libi3/root_atom_contents.c index d6394d4bf..6feb31bc8 100644 --- a/libi3/root_atom_contents.c +++ b/libi3/root_atom_contents.c @@ -7,12 +7,9 @@ */ #include "libi3.h" -#include -#include -#include -#include -#include #include +#include +#include #include #include diff --git a/libi3/safewrappers.c b/libi3/safewrappers.c index fdea636ee..767a0f05e 100644 --- a/libi3/safewrappers.c +++ b/libi3/safewrappers.c @@ -7,13 +7,11 @@ */ #include "libi3.h" -#include -#include -#include -#include -#include #include #include +#include +#include +#include /* * The s* functions (safe) are wrappers around malloc, strdup, …, which exits if one of diff --git a/libi3/string.c b/libi3/string.c index 9efa36903..da18c550b 100644 --- a/libi3/string.c +++ b/libi3/string.c @@ -11,11 +11,10 @@ */ #include "libi3.h" +#include #include #include -#include - struct _i3String { char *utf8; xcb_char2b_t *ucs2; diff --git a/libi3/strndup.c b/libi3/strndup.c index e215a76fd..a0e87cf6e 100644 --- a/libi3/strndup.c +++ b/libi3/strndup.c @@ -7,7 +7,6 @@ */ #include "libi3.h" -#include #include #ifndef HAVE_strndup diff --git a/libi3/ucs2_conversion.c b/libi3/ucs2_conversion.c index c651cdb32..c74672395 100644 --- a/libi3/ucs2_conversion.c +++ b/libi3/ucs2_conversion.c @@ -8,7 +8,6 @@ #include "libi3.h" #include -#include #include #include #include diff --git a/release.sh b/release.sh index 095bc50b5..3335aa4a0 100755 --- a/release.sh +++ b/release.sh @@ -1,8 +1,8 @@ #!/bin/zsh # This script is used to prepare a new release of i3. -export RELEASE_VERSION="4.17" -export PREVIOUS_VERSION="4.16" +export RELEASE_VERSION="4.19" +export PREVIOUS_VERSION="4.18" export RELEASE_BRANCH="next" if [ ! -e "../i3.github.io" ] @@ -69,11 +69,9 @@ cp build/i3-${RELEASE_VERSION}.tar.bz2 . echo "Differences in the release tarball file lists:" -diff -u \ +diff --color -u \ <(tar tf ../i3-${PREVIOUS_VERSION}.tar.bz2 | sed "s,i3-${PREVIOUS_VERSION}/,,g" | sort) \ - <(tar tf i3-${RELEASE_VERSION}.tar.bz2 | sed "s,i3-${RELEASE_VERSION}/,,g" | sort) \ - | colordiff - + <(tar tf i3-${RELEASE_VERSION}.tar.bz2 | sed "s,i3-${RELEASE_VERSION}/,,g" | sort) gpg --armor -b i3-${RELEASE_VERSION}.tar.bz2 @@ -130,7 +128,7 @@ RUN dpkg-buildpackage -S -sa -j8 EOT CONTAINER_NAME=$(echo "i3-${TMPDIR}" | sed 's,/,,g') -docker build -t i3 . +docker build --no-cache -t i3 . for file in $(docker run --name "${CONTAINER_NAME}" i3 /bin/sh -c "ls /usr/src/i3*_${RELEASE_VERSION}*") do docker cp "${CONTAINER_NAME}:${file}" ${TMPDIR}/debian/ diff --git a/src/bindings.c b/src/bindings.c index 03dc23065..e29f2c2dc 100644 --- a/src/bindings.c +++ b/src/bindings.c @@ -8,8 +8,10 @@ */ #include "all.h" -#include +#include + #include +#include static struct xkb_context *xkb_context; static struct xkb_keymap *xkb_keymap; diff --git a/src/click.c b/src/click.c index 12e391b53..64d78315d 100644 --- a/src/click.c +++ b/src/click.c @@ -10,11 +10,6 @@ #include "all.h" #include -#include - -#include - -#include typedef enum { CLICK_BORDER = 0, CLICK_DECORATION = 1, diff --git a/src/commands.c b/src/commands.c index 69bb426d5..d5f526621 100644 --- a/src/commands.c +++ b/src/commands.c @@ -8,14 +8,11 @@ * */ #include "all.h" +#include "shmlog.h" +#include #include -#include -#include #include -#include - -#include "shmlog.h" // Macros to make the YAJL API a bit easier to use. #define y(x, ...) (cmd_output->json_gen != NULL ? yajl_gen_##x(cmd_output->json_gen, ##__VA_ARGS__) : 0) diff --git a/src/commands_parser.c b/src/commands_parser.c index 2fd763095..6c7914151 100644 --- a/src/commands_parser.c +++ b/src/commands_parser.c @@ -25,13 +25,6 @@ */ #include "all.h" -#include -#include -#include -#include -#include -#include - // Macros to make the YAJL API a bit easier to use. #define y(x, ...) (command_output.json_gen != NULL ? yajl_gen_##x(command_output.json_gen, ##__VA_ARGS__) : 0) #define ystr(str) (command_output.json_gen != NULL ? yajl_gen_string(command_output.json_gen, (unsigned char *)str, strlen(str)) : 0) diff --git a/src/con.c b/src/con.c index d9aaa5e5d..52f5afd88 100644 --- a/src/con.c +++ b/src/con.c @@ -10,7 +10,6 @@ * */ #include "all.h" - #include "yajl_utils.h" static void con_on_remove_child(Con *con); @@ -92,8 +91,8 @@ void con_free(Con *con) { FREE(mark->name); FREE(mark); } - free(con); DLOG("con %p freed\n", con); + free(con); } static void _con_attach(Con *con, Con *parent, Con *previous, bool ignore_focus) { diff --git a/src/config_directives.c b/src/config_directives.c index cf81cc160..52362547a 100644 --- a/src/config_directives.c +++ b/src/config_directives.c @@ -9,9 +9,6 @@ */ #include "all.h" -#include -#include - /******************************************************************************* * Criteria functions. ******************************************************************************/ diff --git a/src/config_parser.c b/src/config_parser.c index f120cfa36..f78e75f83 100644 --- a/src/config_parser.c +++ b/src/config_parser.c @@ -25,16 +25,17 @@ */ #include "all.h" +#include +#include +#include #include #include #include -#include -#include -#include +#include #include #include -#include -#include +#include + #include // Macros to make the YAJL API a bit easier to use. diff --git a/src/display_version.c b/src/display_version.c index e44540e08..32250c155 100644 --- a/src/display_version.c +++ b/src/display_version.c @@ -10,13 +10,9 @@ */ #include "all.h" -#include -#include -#include -#include -#include #include #include +#include static bool human_readable_key, loaded_config_file_name_key; static char *human_readable_version, *loaded_config_file_name; diff --git a/src/floating.c b/src/floating.c index fd313a521..02e6ac3b3 100644 --- a/src/floating.c +++ b/src/floating.c @@ -9,6 +9,8 @@ */ #include "all.h" +#include + #ifndef MAX #define MAX(x, y) ((x) > (y) ? (x) : (y)) #endif @@ -221,22 +223,22 @@ void floating_check_size(Con *floating_con, bool prefer_height) { } } -void floating_enable(Con *con, bool automatic) { +bool floating_enable(Con *con, bool automatic) { bool set_focus = (con == focused); if (con_is_docked(con)) { LOG("Container is a dock window, not enabling floating mode.\n"); - return; + return false; } if (con_is_floating(con)) { LOG("Container is already in floating mode, not doing anything.\n"); - return; + return false; } if (con->type == CT_WORKSPACE) { LOG("Container is a workspace, not enabling floating mode.\n"); - return; + return false; } Con *focus_head_placeholder = NULL; @@ -419,6 +421,7 @@ void floating_enable(Con *con, bool automatic) { floating_set_hint_atom(nc, true); ipc_send_window_event("floating", con); + return true; } void floating_disable(Con *con) { diff --git a/src/handlers.c b/src/handlers.c index d6d6e20bc..b74e589dc 100644 --- a/src/handlers.c +++ b/src/handlers.c @@ -10,9 +10,9 @@ */ #include "all.h" -#include -#include #include +#include + #include #define SN_API_NOT_YET_FROZEN 1 #include @@ -841,12 +841,13 @@ static void handle_client_message(xcb_client_message_event_t *event) { * let's float it and make it sticky. */ DLOG("The window was requested to be visible on all workspaces, making it sticky and floating.\n"); - floating_enable(con, false); - con->floating = FLOATING_AUTO_ON; + if (floating_enable(con, false)) { + con->floating = FLOATING_AUTO_ON; - con->sticky = true; - ewmh_update_sticky(con->window->id, true); - output_push_sticky_windows(focused); + con->sticky = true; + ewmh_update_sticky(con->window->id, true); + output_push_sticky_windows(focused); + } } else { Con *ws = ewmh_get_workspace_by_index(index); if (ws == NULL) { diff --git a/src/ipc.c b/src/ipc.c index e2b972559..faa2fbc09 100644 --- a/src/ipc.c +++ b/src/ipc.c @@ -7,16 +7,19 @@ * ipc.c: UNIX domain socket IPC (initialization, client handling, protocol). * */ -#include "all.h" +#include "all.h" #include "yajl_utils.h" +#include +#include +#include +#include #include #include #include -#include -#include -#include +#include + #include #include diff --git a/src/load_layout.c b/src/load_layout.c index acc83fb5c..a9c9678f9 100644 --- a/src/load_layout.c +++ b/src/load_layout.c @@ -10,10 +10,9 @@ */ #include "all.h" -#include -#include +#include + #include -#include /* TODO: refactor the whole parsing thing */ diff --git a/src/log.c b/src/log.c index 31db8b33c..326f82b8c 100644 --- a/src/log.c +++ b/src/log.c @@ -9,27 +9,24 @@ */ #include +#include "all.h" +#include "shmlog.h" + +#include +#include #include -#include -#include #include +#include #include -#include -#include -#include +#include #include #include -#include +#include +#include #if !defined(__OpenBSD__) #include #endif -#include "util.h" -#include "log.h" -#include "i3.h" -#include "libi3.h" -#include "shmlog.h" - #if defined(__APPLE__) #include #endif diff --git a/src/main.c b/src/main.c index 369f2f66d..4f4c3fd6d 100644 --- a/src/main.c +++ b/src/main.c @@ -8,18 +8,22 @@ * */ #include "all.h" +#include "shmlog.h" #include #include -#include -#include -#include -#include -#include +#include +#include +#include +#include #include +#include +#include #include -#include -#include "shmlog.h" +#include +#include +#include +#include #ifdef I3_ASAN_ENABLED #include diff --git a/src/manage.c b/src/manage.c index 4e2803a5f..dc60294f7 100644 --- a/src/manage.c +++ b/src/manage.c @@ -9,10 +9,6 @@ */ #include "all.h" -#include "yajl_utils.h" - -#include - /* * Match frame and window depth. This is needed because X will refuse to reparent a * window whose background is ParentRelative under a window with a different depth. @@ -537,8 +533,9 @@ void manage_window(xcb_window_t window, xcb_get_window_attributes_cookie_t cooki * was not specified */ bool automatic_border = (motif_border_style == BS_NORMAL); - floating_enable(nc, automatic_border); - nc->floating = FLOATING_AUTO_ON; + if (floating_enable(nc, automatic_border)) { + nc->floating = FLOATING_AUTO_ON; + } } /* explicitly set the border width to the default */ diff --git a/src/randr.c b/src/randr.c index b163eca7d..56b0707fc 100644 --- a/src/randr.c +++ b/src/randr.c @@ -12,6 +12,7 @@ #include "all.h" #include + #include /* Pointer to the result of the query for primary output */ diff --git a/src/render.c b/src/render.c index 79bf7eb49..a9803d16e 100644 --- a/src/render.c +++ b/src/render.c @@ -10,6 +10,8 @@ */ #include "all.h" +#include + /* Forward declarations */ static int *precalculate_sizes(Con *con, render_params *p); static void render_root(Con *con, Con *fullscreen); diff --git a/src/sd-daemon.c b/src/sd-daemon.c index 28a88bfd7..84761025b 100644 --- a/src/sd-daemon.c +++ b/src/sd-daemon.c @@ -28,21 +28,21 @@ #define _GNU_SOURCE #endif -#include -#include -#include -#include -#include -#include -#include +#include "sd-daemon.h" + #include -#include -#include +#include #include -#include #include - -#include "sd-daemon.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include int sd_listen_fds(int unset_environment) { int r, fd; diff --git a/src/sighandler.c b/src/sighandler.c index 86921b400..c1e6094f2 100644 --- a/src/sighandler.c +++ b/src/sighandler.c @@ -7,14 +7,9 @@ */ #include "all.h" -#include -#include #include #include - -#include - -#include +#include typedef struct dialog_t { xcb_window_t id; diff --git a/src/startup.c b/src/startup.c index e994e0a8d..9b0576e8a 100644 --- a/src/startup.c +++ b/src/startup.c @@ -11,12 +11,12 @@ * */ #include "all.h" - #include "sd-daemon.h" +#include #include #include -#include +#include #define SN_API_NOT_YET_FROZEN 1 #include diff --git a/src/util.c b/src/util.c index 3544297c9..6d8d2ee75 100644 --- a/src/util.c +++ b/src/util.c @@ -10,19 +10,16 @@ */ #include "all.h" +#include +#include +#include +#include +#include #include -#include +#include #if defined(__OpenBSD__) #include #endif -#include -#include -#include -#include -#include - -#define SN_API_NOT_YET_FROZEN 1 -#include int min(int a, int b) { return (a < b ? a : b); diff --git a/src/window.c b/src/window.c index d84f8869a..bee3fa668 100644 --- a/src/window.c +++ b/src/window.c @@ -9,6 +9,8 @@ */ #include "all.h" +#include + /* * Frees an i3Window and all its members. * diff --git a/src/x.c b/src/x.c index 712cf89c2..e89f52132 100644 --- a/src/x.c +++ b/src/x.c @@ -10,6 +10,8 @@ */ #include "all.h" +#include + #ifndef MAX #define MAX(x, y) ((x) > (y) ? (x) : (y)) #endif diff --git a/src/xcursor.c b/src/xcursor.c index cffb094b1..cb98399fa 100644 --- a/src/xcursor.c +++ b/src/xcursor.c @@ -9,13 +9,12 @@ */ #include +#include "all.h" + #include #include -#include -#include "i3.h" -#include "xcb.h" -#include "xcursor.h" +#include static xcb_cursor_context_t *ctx; static xcb_cursor_t cursors[XCURSOR_CURSOR_MAX]; diff --git a/testcases/inject_randr1.5.c b/testcases/inject_randr1.5.c index 819c029ba..9c0b73d41 100644 --- a/testcases/inject_randr1.5.c +++ b/testcases/inject_randr1.5.c @@ -16,15 +16,17 @@ #include #include -#include -#include -#include -#include -#include +#include +#include #include +#include +#include #include +#include +#include +#include #include -#include +#include static void uds_connection_cb(EV_P_ ev_io *w, int revents); static void read_client_setup_request_cb(EV_P_ ev_io *w, int revents); diff --git a/testcases/t/310-client-message-sticky.t b/testcases/t/310-client-message-sticky.t new file mode 100644 index 000000000..0e7d8b7c3 --- /dev/null +++ b/testcases/t/310-client-message-sticky.t @@ -0,0 +1,70 @@ +#!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) +# +# • http://onyxneon.com/books/modern_perl/modern_perl_a4.pdf +# (unless you are already familiar with Perl) +# +# Verify that _NET_WM_DESKTOP sticky requests do not conflict with dock +# clients, resulting in a crash +# Ticket: #4039 +# Bug still in: 4.18-238-g4d55bba7f +use i3test; + +sub send_sticky_request { + my ($win) = @_; + + my $msg = pack "CCSLLLLLL", + X11::XCB::CLIENT_MESSAGE, # response_type + 32, # format + 0, # sequence + $win->id, # window + $x->atom(name => '_NET_WM_DESKTOP')->id, # message type + hex '0xFFFFFFFF', # data32[0] = NET_WM_DESKTOP_ALL + 0, # data32[1] + 0, # data32[2] + 0, # data32[3] + 0; # data32[4] + + $x->send_event(0, $x->get_root_window(), X11::XCB::EVENT_MASK_SUBSTRUCTURE_REDIRECT, $msg); +} + +# Test the normal functionality first +my $ws = fresh_workspace; +my $win = open_window; + +is(@{get_ws($ws)->{floating_nodes}}, 0, 'No floating windows yet'); +send_sticky_request($win); +sync_with_i3; + +is(@{get_ws($ws)->{floating_nodes}}, 1, 'One floating (sticky) window'); +$ws = fresh_workspace; +is(@{get_ws($ws)->{floating_nodes}}, 1, 'Sticky window in new workspace'); + +# See #4039 +kill_all_windows; +$win = open_window({ + window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_DOCK') +}); + +send_sticky_request($win); +sync_with_i3; +is(@{get_ws($ws)->{floating_nodes}}, 0, 'Dock client did not get sticky/floating'); + +# Cause a ConfigureRequest by setting the window’s position/size. +my ($a, $t) = $win->rect; +$win->rect(X11::XCB::Rect->new(x => 0, y => 0, width => $a->width, height => $a->height)); + +does_i3_live; +is(@{get_ws($ws)->{floating_nodes}}, 0, 'Dock client still not sticky/floating'); + +done_testing;