-4.13-non-git
+4.14-non-git
I3_VERSION \
LICENSE \
PACKAGE-MAINTAINER \
- RELEASE-NOTES-4.13 \
+ RELEASE-NOTES-4.14 \
generate-command-parser.pl \
parser-specs/commands.spec \
parser-specs/config.spec \
+++ /dev/null
-
- ┌────────────────────────────┐
- │ Release notes for i3 v4.13 │
- └────────────────────────────┘
-
-This is i3 v4.13. This version is considered stable. All users of i3 are
-strongly encouraged to upgrade.
-
-For users, there are two changes to be aware of:
-
-1. The X server DPI is read from the Xft.dpi X resource (if available).
- Previously, i3 used to directly look at the X server’s DPI (based on screen
- resolution and physical size). Looking at Xft.dpi is more consistent with
- other software, more likely to be correct (because it’s user-specified and
- not read from possibly broken hardware information) and allows users to
- override the value.
-
-2. It is now possible to set config file variables from X resources using the
- “set_from_resource” directive. This allows users to have a single source of
- truth for e.g. theming X11 applications (specify “*color0: #121212” and have
- it apply to URxvt and your i3 config).
-
-For packagers, there are three changes that likely require action:
-
-1. cairo/pango are now required dependencies, as announced in the i3 v4.12
- release notes.
-
-2. The aforementioned “set_from_resource” feature requires the new dependency
- libxcb-util-xrm.
-
-3. i3 now uses the GNU build system (autotools). Please see
- https://github.com/i3/i3/commit/4a52a7e9fb6fb2e1f0256b2e086cfa313f411cd8 for
- a lot more details about the rationale and what this means for your package.
- Bottomline, things should get simpler for you, though :).
-
- ┌────────────────────────────┐
- │ Changes in i3 v4.13 │
- └────────────────────────────┘
-
- • build: wire up version handling for non-release tarballs (as opposed to git
- checkouts)
- • build: switch to the GNU build system
- • i3bar: disable pango markup for plain-text input
- • man/i3-msg: point out default ipc message type
- • config: introduce support for specifying variables from X resources
- • config: ensure variables match on longest-length, eliminating problems
- where one variable was a prefix of another
- • config: do not count '\' in comment lines as line continuation
- • ipc: introduce a new GET_BINDING_MODES command
- • ipc: implement new window::mark event
- • ipc: add “output” to IPC events referencing a container
- • make fullscreen windows open on the output which is indicated by their
- geometry (fixes LibreOffice Impress multi-monitor presentations)
- • focus newly managed windows only if they don’t use the globally active
- input mode (fixes issues with RubyMine)
- • remove title indentation in nested containers (rationale was unclear,
- nobody spoke up when we asked about the feature on i3-discuss)
- • use the last known timestamp when calling xcb_set_input_focus (might fix
- rare race conditions in focus handling)
- • introduce the “smart” option for hide_edge_borders, which will hide borders
- when there is precisely one window on the workspace
- • handle _MOTIF_WM_HINTS changes (_MOTIF_WM_HINTS were previously only
- considered when managing a new window)
- • don’t change border style if BS_NORMAL is requested in _MOTIF_WM_HINTS
- • only add numlock fallback for keybindings where necessary (allows users to
- correctly bind keys on the numpad)
- • do not match docks in config and command criteria
- • get DPI from the Xft.dpi resource instead of directly looking at the screen
- resolution/size
- • handle _NET_ACTIVE_WINDOW for scratchpad windows (for pagers)
- • set _NET_WM_DESKTOP to sticky for scratchpad windows
- • add new criteria “tiling” and “floating”
- • implement special output name “current” for commands
- • handle ResizeRequests for tray clients (fixes VLC tray icon)
-
- ┌────────────────────────────┐
- │ Bugfixes │
- └────────────────────────────┘
-
- • i3bar: fix crash when the I3SOCK environment variable is present
- • i3-dmenu-desktop: do not die on failed open
- • i3-input: properly position in non-standard cases (fixes an issue where
- i3-input would launch off-screen)
- • i3-save-tree: rename “mark” to “marks” to reflect our recent change to
- allow multiple marks
- • mouse bindings: only grab the mouse buttons that need to be grabbed
- • no_focus: correctly count the number of windows (makes no_focus work with
- tabbed/stacked workspace layouts).
- • properly close disabled outputs restored during a restart (this fixes state
- handling when RandR changes happen during i3 restarts)
- • don’t trigger bindings on window border clicks unless --border was
- specified for the binding
- • traverse numbered workspaces in correct order
- • fix transition from named to numbered workspaces in “workspace next|prev”
- • avoid setting urgency hint on content containers and above (fixes crashes)
- • don’t trigger unrelated key bindings for --release bindings
- • fix colormap handling for containers (fixes taking screenshots using xwd)
- • check output crossing on ENTER_NOTIFY to dockarea (fixes pointer jumping)
- • fix a use-after-free bug (fixes “floating enable” on single split windows)
-
- ┌────────────────────────────┐
- │ Thanks! │
- └────────────────────────────┘
-
-Thanks for testing, bugfixes, discussions and everything I forgot go out to:
-
- Benedikt Heine, Cedric Buissart, Chih-Chyuan Hwang, Denton Liu, eplanet, Eric
- Engeström, EvilPudding, Ferdinand Bachmann, Hong, Ingo Bürk, Jakob Schnell,
- Jakub Wilk, johannes karoff, Johannes Lange, joshrosso, Julien Lequertier,
- Kacper Kowalik, Kenneth Lyons, Kyle Kneitinger, madroach, Michael Vetter,
- Nathan Schulte, Øsse, Peder Stray, Tony Crisci, Trevor Merrifield, wentasah,
- yshui, Zamarin Arthur
-
--- Michael Stapelberg, 2016-11-08
--- /dev/null
+
+ ┌────────────────────────────┐
+ │ Release notes for i3 v4.14 │
+ └────────────────────────────┘
+
+This is i3 v4.14. This version is considered stable. All users of i3 are
+strongly encouraged to upgrade.
+
+Aside from many bug and documentation fixes, the “swap” command is a notable
+addition of this release. As is almost tradition at this point, keybinding
+handling has seen some fixes as well. A noticeable change for users with such
+monitors is i3’s support for RandR 1.5, which transparently supports the TILE
+property of first-gen 4K monitors and current 5K or 8K monitors.
+
+ ┌────────────────────────────┐
+ │ Changes in i3 v4.14 │
+ └────────────────────────────┘
+
+ • build: link libiconv explicitly for systems which need it
+ • build: move AnyEvent-I3 into the i3 repository
+ • docs/hacking-howto: add compilation instructions
+ • docs/ipc: add missing cases to the workspace event
+ • docs/ipc: document the “primary” field of the OUTPUTS reply
+ • docs/ipc: replace Go IPC library with a maintained one
+ • docs/ipc: add link to the ocaml-i3ipc library
+ • docs/ipc: fix invalid trailing commas in JSON examples
+ • docs/layout-saving: add section about troubleshooting window titles
+ • docs/testsuite: update for the move to autotools
+ • docs/userguide: clarify the move command syntax
+ • docs/userguide: correct “Esc” to “Escape”
+ • docs/userguide: clarify focus_follows_mouse behavior
+ • docs/userguide: expand on combining “workspace number” with a name
+ • docs/userguide: mention the magic v4 config marker
+ • man/i3.man: correct configuration lookup order
+ • i3bar, i3-config-wizard, i3-nagbar: use the Xft.dpi setting (see 4.13 notes)
+ • i3bar: restart bar status command on reload if it changed
+ • i3bar: treat left/right scrolling like up/down scrolling
+ • i3bar: accept “primary” in the “output” configuration directive
+ • i3-input: do not set input focus, grabbing the keyboard suffices
+ • i3-msg: return an exit code when missing the -t argument
+ • i3-sensible-editor: correct “mc-edit” to “mcedit”
+ • i3-sensible-terminal: add lilyterm, tilix, terminix, konsole
+ • respect SYSCONFDIR when looking for the default xdg directory
+ • use RandR 1.5 to query screens, supporting the TILE property commonly used
+ by multi-stream transport (MST) monitors, such as first-gen 4K monitors, or
+ current 5K and 8K monitors
+ • respect minimum size hints for floating windows
+ • support the _NET_MOVERESIZE_WINDOW client message (for e.g. wmctrl)
+ • validate binding modes are not defined more than once
+ • only react to the last ExposeEvent in a series of events
+ • add the shutdown IPC event (upon “restart” or “exit”)
+ • treat left/right scrolling like up/down scrolling (on window titles)
+ • make the “layout toggle” command optionally take a sequence of layouts
+ • introduce --exclude-titlebar flag for mouse bindings
+ • introduce the “swap” command
+ • support the primary output in the “focus” and “move” commands
+ • compare keybinding modifiers for equality, not subset
+ • introduce the GET_CONFIG ipc request (i3-msg -t get_config)
+ • start i3-nagbar when encountering invalid set statements
+ • focus windows upon ConfigureWindow requests with stack-mode=Above
+
+ ┌────────────────────────────┐
+ │ Bugfixes │
+ └────────────────────────────┘
+
+ • i3bar: correct the color codes used for statusline errors
+ • i3bar: avoid freeze after VisibilityNotify
+ • i3-dmenu-desktop: fix quoted command names
+ • i3-dmenu-desktop: avoid adding items multiple times
+ • fix various X11 resource leaks, memory leaks and memory errors
+ • fix IPC success reply for the workspace command
+ • report errors during logfile creation
+ • fix the signal handler being blank
+ • display marks and the title even if the title is empty (for title_format)
+ • fix changing workspace layout from stacked/tabbed for empty workspaces
+ • add numlock fallback to “bindcode” where necessary
+ • fix a crash on restart when using marks
+ • fix renaming workspaces when the new name starts with “to”
+ • respect dont_warp flag when moving containers
+
+ ┌────────────────────────────┐
+ │ Thanks! │
+ └────────────────────────────┘
+
+Thanks for testing, bugfixes, discussions and everything I forgot go out to:
+
+ akash akya, Armaël Guéneau, Baptiste Daroussin, Chih-Chyuan Hwang, cresh,
+ David Jimenez Sequero, Franz König, fred777, Ingo Bürk, Jakub Wilk,
+ Jens-Wolfhard Schicke-Uffmann, Johannes Lange, lasers, lebenlechzer,
+ loungecube, Maarten Dirkse, Manuel Mendez, Max Fisher, Mihai Coman, Nathan
+ Schulte, s3rb31, Sebastian Larsson, Stefan Hagen, Tobias Hänel, Tony Crisci,
+ Trevor Merrifield, Zbyněk Moravec
+
+-- Michael Stapelberg, 2017-09-04
# Run autoreconf -fi to generate a configure script from this file.
AC_PREREQ([2.69])
-AC_INIT([i3], [4.13], [https://github.com/i3/i3/issues])
+AC_INIT([i3], [4.14], [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])
-i3-wm (4.13.1-1) unstable; urgency=medium
+i3-wm (4.14.1-1) unstable; urgency=medium
* UNRELEASED
- -- Michael Stapelberg <stapelberg@debian.org> Tue, 08 Nov 2016 21:31:13 +0100
+ -- Michael Stapelberg <stapelberg@debian.org> Mon, 04 Sep 2017 08:17:05 +0200
+
+i3-wm (4.14-1) unstable; urgency=medium
+
+ * New upstream release.
+
+ -- Michael Stapelberg <stapelberg@debian.org> Mon, 04 Sep 2017 07:53:16 +0200
i3-wm (4.13-1) unstable; urgency=medium
$ cd ~/i3/testcases
$ sudo apt-get install cpanminus
$ sudo cpanm .
+$ cd ~/i3/AnyEvent-I3
+$ sudo cpanm .
--------------------------------------------------------------------------------
If you don’t want to use cpanminus for some reason, the same works with cpan:
--------------------------------------------------------------------------------
$ cd ~/i3/testcases
$ sudo cpan .
+$ cd ~/i3/AnyEvent-I3
+$ sudo cpan .
--------------------------------------------------------------------------------
In case you don’t have root permissions, you can also install into your home
./complete-run+. This will also speed up the tests significantly especially on
machines without a powerful video card.
-.Example invocation of complete-run.pl+
+.Example invocation of +complete-run.pl+
---------------------------------------
$ cd ~/i3
This will show the output of Xephyr, which is the X server implementation we
use for testing.
-===== make command: make check
+===== make command: +make check+
Make check runs the i3 testsuite.
You can still use ./testcases/complete-run.pl to get the interactive progress output.
-.Example invocation of make check+
+.Example invocation of +make check+
---------------------------------------
$ cd ~/i3
typedef struct {
i3String *label;
char *action;
- bool exec_in_terminal;
int16_t x;
uint16_t width;
} button_t;
wait(0);
}
-static void execute_in_terminal(const char *command) {
+static button_t *get_button_at(int16_t x, int16_t y) {
+ for (int c = 0; c < buttoncnt; c++)
+ if (x >= (buttons[c].x) && x <= (buttons[c].x + buttons[c].width))
+ return &buttons[c];
+
+ return NULL;
+}
+
+static void handle_button_press(xcb_connection_t *conn, xcb_button_press_event_t *event) {
+ printf("button pressed on x = %d, y = %d\n",
+ event->event_x, event->event_y);
+ /* TODO: set a flag for the button, re-render */
+}
+
+/*
+ * Called when the user releases the mouse button. Checks whether the
+ * coordinates are over a button and executes the appropriate action.
+ *
+ */
+static void handle_button_release(xcb_connection_t *conn, xcb_button_release_event_t *event) {
+ printf("button released on x = %d, y = %d\n",
+ event->event_x, event->event_y);
+ /* If the user hits the close button, we exit(0) */
+ if (event->event_x >= btn_close.x && event->event_x < btn_close.x + btn_close.width)
+ exit(0);
+ button_t *button = get_button_at(event->event_x, event->event_y);
+ if (!button)
+ return;
+
/* We need to create a custom script containing our actual command
* since not every terminal emulator which is contained in
* i3-sensible-terminal supports -e with multiple arguments (and not
warn("Could not fdopen() temporary script to store the nagbar command");
return;
}
- fprintf(script, "#!/bin/sh\nrm %s\n%s", script_path, command);
+ fprintf(script, "#!/bin/sh\nrm %s\n%s", script_path, button->action);
/* Also closes fd */
fclose(script);
free(terminal_cmd);
free(script_path);
free(exe_path);
-}
-
-static button_t *get_button_at(int16_t x, int16_t y) {
- for (int c = 0; c < buttoncnt; c++)
- if (x >= (buttons[c].x) && x <= (buttons[c].x + buttons[c].width))
- return &buttons[c];
-
- return NULL;
-}
-
-static void handle_button_press(xcb_connection_t *conn, xcb_button_press_event_t *event) {
- printf("button pressed on x = %d, y = %d\n",
- event->event_x, event->event_y);
- /* TODO: set a flag for the button, re-render */
-}
-
-/*
- * Called when the user releases the mouse button. Checks whether the
- * coordinates are over a button and executes the appropriate action.
- *
- */
-static void handle_button_release(xcb_connection_t *conn, xcb_button_release_event_t *event) {
- printf("button released on x = %d, y = %d\n",
- event->event_x, event->event_y);
- /* If the user hits the close button, we exit(0) */
- if (event->event_x >= btn_close.x && event->event_x < btn_close.x + btn_close.width)
- exit(0);
- button_t *button = get_button_at(event->event_x, event->event_y);
- if (!button) {
- return;
- }
-
- if (button->exec_in_terminal) {
- execute_in_terminal(button->action);
- } else {
- start_application(button->action);
- }
/* TODO: unset flag, re-render */
}
{"version", no_argument, 0, 'v'},
{"font", required_argument, 0, 'f'},
{"button", required_argument, 0, 'b'},
- {"button-sh", required_argument, 0, 'B'},
{"help", no_argument, 0, 'h'},
{"message", required_argument, 0, 'm'},
{"type", required_argument, 0, 't'},
{0, 0, 0, 0}};
- char *options_string = "B:b:f:m:t:vh";
+ char *options_string = "b:f:m:t:vh";
prompt = i3string_from_utf8("Please do not run this program.");
break;
case 'h':
printf("i3-nagbar " I3_VERSION "\n");
- printf("i3-nagbar [-m <message>] [-b <button> <terminal-action>] "
- "[-B <button> <shell-action> [-t warning|error] [-f <font>] [-v]\n");
+ printf("i3-nagbar [-m <message>] [-b <button> <action>] [-t warning|error] [-f <font>] [-v]\n");
return 0;
- /* falls through */
- case 'B':
case 'b':
buttons = srealloc(buttons, sizeof(button_t) * (buttoncnt + 1));
buttons[buttoncnt].label = i3string_from_utf8(optarg);
buttons[buttoncnt].action = argv[optind];
- if (o == 'b') {
- buttons[buttoncnt].exec_in_terminal = true;
- printf("button with label *%s* and terminal action *%s*\n",
- i3string_as_utf8(buttons[buttoncnt].label),
- buttons[buttoncnt].action);
- } else {
- buttons[buttoncnt].exec_in_terminal = false;
- printf("button with label *%s* and shell action *%s*\n",
- i3string_as_utf8(buttons[buttoncnt].label),
- buttons[buttoncnt].action);
- }
+ printf("button with label *%s* and action *%s*\n",
+ i3string_as_utf8(buttons[buttoncnt].label),
+ buttons[buttoncnt].action);
buttoncnt++;
printf("now %d buttons\n", buttoncnt);
if (optind < argc)
== SYNOPSIS
-i3-nagbar [-m <message>] [-b <button> <terminal-action>] [-B <button> <shell-action>] [-t warning|error] [-f <font>] [-v]
+i3-nagbar [-m <message>] [-b <button> <action>] [-t warning|error] [-f <font>] [-v]
== OPTIONS
*-f, --font* 'font'::
Select font that is being used.
-*-b, --button* 'button' 'terminal-action'::
-Adds a button labelled 'button' to the bar. When pressed, the command given
-in 'terminal-action' is executed inside a terminal emulator, via i3-sensible-terminal(1).
-Multiple buttons can be defined.
-
-*-B, --button-sh* 'button' 'shell-action'::
-Same as *--button*, except that the command given in 'shell-action' is executed directly by the shell.
+*-b, --button* 'button' 'action'::
+Create a button with text 'button'. The 'action' are the shell commands that
+will be executed by this button. Multiple buttons can be defined.
== DESCRIPTION
== SEE ALSO
-i3(1), i3-sensible-terminal(1)
+i3(1)
== AUTHOR
if (event->value_mask & XCB_CONFIG_WINDOW_STACK_MODE) {
DLOG("window 0x%08x wants to be stacked %d\n", event->window, event->stack_mode);
- if (event->stack_mode == XCB_STACK_MODE_ABOVE) {
- /* Emacs and IntelliJ Idea “request focus” by stacking their window
+
+ /* Emacs and IntelliJ Idea “request focus” by stacking their window
* above all others. */
- if (!fullscreen && con_is_leaf(con)) {
- if (strcmp(con_get_workspace(con)->name, "__i3_scratch") == 0) {
- DLOG("This is a scratchpad container, ignoring ConfigureRequest\n");
- return;
- }
+ if (event->stack_mode != XCB_STACK_MODE_ABOVE) {
+ DLOG("stack_mode != XCB_STACK_MODE_ABOVE, ignoring ConfigureRequest\n");
+ goto out;
+ }
- con_focus(con);
- tree_render();
- }
+ if (fullscreen || !con_is_leaf(con)) {
+ DLOG("fullscreen or not a leaf, ignoring ConfigureRequest\n");
+ goto out;
+ }
+
+ Con *ws = con_get_workspace(con);
+ if (ws == NULL) {
+ DLOG("Window is not being managed, ignoring ConfigureRequest\n");
+ goto out;
+ }
+
+ if (strcmp(ws->name, "__i3_scratch") == 0) {
+ DLOG("This is a scratchpad container, ignoring ConfigureRequest\n");
+ goto out;
+ }
+
+ if (config.focus_on_window_activation == FOWA_FOCUS || (config.focus_on_window_activation == FOWA_SMART && workspace_is_visible(ws))) {
+ DLOG("Focusing con = %p\n", con);
+ workspace_show(ws);
+ con_focus(con);
+ tree_render();
+ } else if (config.focus_on_window_activation == FOWA_URGENT || (config.focus_on_window_activation == FOWA_SMART && !workspace_is_visible(ws))) {
+ DLOG("Marking con = %p urgent\n", con);
+ con_set_urgency(con, true);
+ tree_render();
+ } else {
+ DLOG("Ignoring request for con = %p.\n", con);
}
}
+out:
fake_absolute_configure_notify(con);
}
#include <libgen.h>
#include "shmlog.h"
+#ifdef I3_ASAN_ENABLED
+#include <sanitizer/lsan_interface.h>
+#endif
+
#include "sd-daemon.h"
/* The original value of RLIMIT_CORE when i3 was started. We need to restore
xcb_generic_error_t *error = xcb_request_check(conn, cookie);
if (error != NULL) {
ELOG("Another window manager seems to be running (X error %d)\n", error->error_code);
+#ifdef I3_ASAN_ENABLED
+ __lsan_do_leak_check();
+#endif
return 1;
}
}
ELOG("PCRE regular expression compilation failed at %d: %s\n",
offset, error);
+ regex_free(re);
return NULL;
}
re->extra = pcre_study(re->regex, 0, &error);
is($x->input_focus, $left_window->id, 'left window has focus');
isnt(get_focused($ws), $old_focus, 'right window is no longer focused');
+################################################################################
+# Verify the ConfigureWindow request is only applied when on the active
+# workspace.
+################################################################################
+
+$ws = fresh_workspace;
+my $new_window = open_window;
+
+is($x->input_focus, $new_window->id, 'new window has focus');
+$x->configure_window($left_window->id, CONFIG_WINDOW_STACK_MODE, (STACK_MODE_ABOVE));
+$x->flush;
+
+sync_with_i3;
+
+is($x->input_focus, $new_window->id, 'new window still has focus');
+
done_testing;