2017-11-20 09:04:28 +11:00
|
|
|
#define _POSIX_C_SOURCE 200809L
|
2018-04-03 12:37:21 +10:00
|
|
|
#include <assert.h>
|
2021-02-24 03:41:15 +11:00
|
|
|
#include <drm_fourcc.h>
|
2017-11-20 09:04:28 +11:00
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
2017-12-06 22:36:06 +11:00
|
|
|
#include <strings.h>
|
2021-06-08 02:58:20 +10:00
|
|
|
#include <sys/stat.h>
|
2019-07-28 06:02:56 +10:00
|
|
|
#include <wayland-server-core.h>
|
2021-06-08 02:58:20 +10:00
|
|
|
#include <wlr/types/wlr_linux_dmabuf_v1.h>
|
2017-12-06 03:02:31 +11:00
|
|
|
#include <wlr/types/wlr_output_layout.h>
|
rebase: Sway 1.8 (#78)
* build: bump wlroots dependency to 0.16.0
* swaymsg: replace if with switch in pretty_print
* swaymsg: add GET_TREE pretty-printing
* swaybar: fix errno handling in status_handle_readable
If getline fails once, it was not reset before the next getline
call. errno is only overwritten by getline on error.
* Add cairo_image_surface_create error handling
cairo_image_surface_create can fail, e.g. when running out of
memory or when the size is too big. Avoid crashing in this case.
Closes: https://github.com/swaywm/sway/issues/6531
* build: bump version to 1.8-dev
Historically we've been sticking with the last release number in
the master branch. However that's a bit confusing, people can't
easily figure out whether they're using a release or a work-in-progress
snapshot. Only the commit hash appended to the version number may
help, but that's not very explicit and disappears when using a
tarball.
We could bump the version in master to the next release number.
However during the RC cycle there would be a downgrade from 1.8 to
1.8-rc1. Also it would be hard to tell the difference between a
stable release and an old snapshot.
This patch introduces a new pre-release identifier, "dev". It's
alphabetically before "rc" so it should be correctly sorted by
semver comparisons. "dev" is upgraded to "rc" (and then to stable)
when doing a release. The master branch always uses a "dev"
version, only release branches use "rc" or stable versions.
* [IPC] Add repeat delay/rate info to keyboard
Closes #6735
wlroots already has the info in the struct so let's access it and print it out.
* input/seat: unset has_focus when focus_stack becomes empty
We currently track the focus of a seat in two ways: we use a list called
focus_stack to track the order in which nodes have been focused, with
the first node representing what's currently focused, and we use a
variable called has_focus to indicate whether anything has focus--i.e.
whether we should actually treat that first node as focused at any given
time.
In a number of places, we treat has_focus as implying that a focused
node exists. If it's true, we attempt to dereference the return value of
seat_get_focus(), our helper function for getting the first node in
focus_list, with no further checks. But this isn't quite correct with
the current implementation of seat_get_focus(): not only does it return
NULL when has_focus is false, it also returns NULL when focus_stack
contains no items.
In most cases, focus_stack never becomes empty and so this doesn't
matter at all. Since focus_stack stores a history of focused nodes, we
rarely remove nodes from it. The exception to this is when a node itself
goes away. In that case, we call seat_node_destroy() to remove it from
focus_stack and free it. But we don't unset has_focus if we've removed
the final node! This lets us get into a state where has_focus is true
but seat_get_focus() returns NULL, leading to a segfault when we try to
dereference it.
Fix the issue both by updating has_focus in seat_node_destroy() and by
adding an assertion in seat_get_focus() that ensures focus_stack and
has_focus are in sync, which will make it easier to track down similar
issues in the future.
Fixes #6395.
[1] There's some discussion in #1585 from when this was implemented
about whether has_focus is actually necessary; it's possible we could
remove it entirely, but for the moment this is the architecture we have.
* swaybar: fix tray_padding vs min-height re: scale
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
* swaybar: fix tray item icon scaling, positioning
* container: Fix crash when view unmaps + maps quickly
Followup on 4e4898e90f.
If a view quickly maps and unmaps repeatedly, there will be multiple
destroyed containers with same view in a single transaction. Each of
these containers will then try to destroy this view, resulting in use
after free.
The container should only destroy the view if the view still belongs
to the container.
Simple reproducer: couple XMapWindow + XUnmapWindow in a loop followed
by XDestroyWindow.
See #6605
* commands/move: Fix crash when pos_y is omitted
Fixes #6737
* Destroy sub-surfaces with parent layer-shell surface
Closes: https://github.com/swaywm/sway/issues/6337
* Add safety assert in parse_movement_unit
Let's add this just in case a caller passes argc == 0.
References: https://github.com/swaywm/sway/issues/6737#issuecomment-1008082540
* meson: check: false on run_command
Future meson releases will change the default and warns when the
implicit default is used, breaking builds.
Explicitly set check: false to maintain behavior and silence warnings.
* Print deprecation notice when running SUID
SUID privilege drop is needed for the "builtin"-backend of libseat,
which copied our old "direct" backend behavior for the sake of
compatibility and ease of transition.
libseat now has a better alternative in the form of seatd-launch. It
uses the normal seatd daemon and libseat backend and takes care of SUID
for us.
Add a soft deprecation warning to highlight our future intent of
removing this code. The deprecation cycle is needed to avoid surprises
when sway no longer drops privileges.
* xdg-shell: use toplevel geometry to adjust the popup box
`popup_unconstrain` uses view coordinates to init the output box for
popups. However wlroots expects the box to be set in a toplevel surface
coordinate system, which is not always equal to view. The difference
between those is a window geometry set via xdg-shell.
GTK4 reserves some space for client-side decoration and thus has a
window with top left corner not matching to (0, 0) of a surface. The box
calculated without taking that into account was slightly shifted
compared to the actual output and allowed to position part of the popup
off screen.
* build: fix building with basu
02b412a introduced the use of list for sdbus deps, however
it was assuming that all packages which were in a list has a version
higher than 239. That is true for libsystemd and libelogind, since they
use the same versions, however basu is using version numbers which are
way lower than what libsystemd/libelogind are using, so basu only build
is failing.
* Upgrade for wlroots surface refactoring
See [1] for details.
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3412
* commands/focus: drop trailing whitespace
* input/cursor: count pointer gestures as idle activity
Fixes https://github.com/swaywm/sway/issues/6765.
* input/cursor: treat swipe begin as idle activity too
Accidentally overlooked in fd53f80.
* treat fullscreen windows as 'tiled' for commands/focus
* transaction: destroying nodes aren't hidden
Commit 37d7bc69986f ("transaction: Only wait for ack from visible
views") introduced a check which uses view_is_visible() to check if a view
is still visible on the screen. However view_is_visible() will early
return in case the node is in the destroying state. This is incorrect
for transactions, since a destroying view which is visible will trigger
configure events for other clients. This bug was visible when repeatedly
opening and closing two views side by side, since we ignore the
destroying node we get a frame where the still open view is shown with
the old configure values and the rest is the desktop background. The
next frame is than correct again.
Fix this by considering destroying views as visible, we correctly wait
for them and send the configure events to other views in time, fixing
the background flicker.
Fixes #6473
* build: execute wlroots subproject before finding deps
wlroots often requires dependencies more recent than Sway's.
Executing the wlroots subproject first will give Meson a chance to
find these newer dependencies, possibly via subprojects.
The subproject will override the "wlroots" dependency when executed,
so we don't need to use get_variable anymore.
References: https://github.com/swaywm/sway/pull/6498#issuecomment-1001746017
* tray: do not render passive items
https://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/StatusNotifierItem/#org.freedesktop.statusnotifieritem.status
* cmd/swap: error on swapping a container with itself
* input/cursor: pass through pointer hold gestures
This just follows swaywm/wlroots#3047, so `wl_pointer_gestures_v1`
clients can be notified of these events.
* swaynag: remove buffer destruction condition
An address of a variable can never be NULL, so checking it doesn't make
sense; and `destroy_buffer()` can operate on already destroyed buffers
anyway.
Fixes #6780
* Use bools for CLI flags
* xwayland: listen to `request_activate` event
When REAPER submenu is closed `XCB_CLIENT_MESSAGE` with type
`NET_ACTIVE_WINDOW` is sent to set focus to parent menu.
Closes: https://github.com/swaywm/sway/issues/6324
* chore: chase wlr_output_layout_get_box() update
https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3439
* Chase wlroots xdg-shell refactor
* Minor update to focus_on_window_activation
Removed xwayland limitation since wayland clients are supported via xdg-activation.
* Translated README into Italian
* readme: add link to Italian translation
* readme: sort language list alphabetically
* readme: use relative links for translations
* xdg-shell: use wlr_xdg_toplevel in sway_view
Improved type safety.
Closes: https://github.com/swaywm/sway/issues/6813
* xdg-shell: use wlr_xdg_popup in sway_xdg_popup
Improved type safety.
* Fix snprintf compiler warning
* Remove all sprintf calls
Replace them with snprintf, which ensures buffer overflows won't
happen.
* sway/commands: add missing wlr_keyboard interface include in xkb_switch_layout
* sway/input: use wlr_input_device from input device base
* Remove some erroneous apostrophes in comments
* Don't enter seatop_move_floating when fullscreen
Currently, a floating window that's been fullscreened can send us
xdg_toplevel::move, and we'll enter seatop_move_floating, which lets us
drag the surface around while it's fullscreen. We don't want
this--fullscreen surfaces should always be aligned to the screen--so add
the same check that seatop_default already does when entering this mode.
Tested with Weston's weston-fullscreen demo, which sends a move request
if you click anywhere on its surface.
* swaynag: die on all allocation failures
* sway/input: don't pass possibly invalid modifiers pointer
active_keyboard may be NULL, in which case an invalid pointer could be
passed to wlr_input_method_keyboard_grab_v2_send_modifiers. This
procedure call is unnecessary since wlroots commit 372a52ec "input
method: send modifiers in set_keyboard", so the call can simply be
removed.
Fixes #6836.
* sway/input: destroy sway_switch properly
Fix: #6861
Added seat_device_destroy function to seat_device_destroy function.
* commands/focus: fix segfault when no container is already focused.
Fixes #6690.
* Remove WLR_SWITCH_STATE_TOGGLE usage
Ref [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/commit/4792446ee8f50104bd207d9ccd8558a7e4eb4514
* Replace pcre with pcre2
Closes: https://github.com/swaywm/sway/issues/6838
* swaybar: remove swaybar_output.input_region
No need to keep the region around, we can immediately destroy it
after the wl_surface.set_input_region request.
* swaybar: set opaque region
When the background color is fully opaque, set the surface's opaque
region to the whole surface.
* Updating criteria checking with PCRE2
* swaynag: allocate button_details with details
They are used together, so it doesn't make sense to allocate them
separately.
* swaynag: statically allocate button_close, and move declaration
Every swaynag has a close button, so it doesn't make sense to
allocate it dynamically. The declaration is moved later to when
it is actually needed.
* swaynag: remove unnecessary zero of swaynag struct
Global variables are initialized to 0.
* swaynag: remove redundant status variables in main
Instead, we just use `status` for all failures.
* remove unnecessary strlen call
* sway/input/cursor: take device mm size from wlr_tablet
* sway/input/seat: take output name from specialized input device
* sway/input: follow up wlroots input device events renaming
* sway/input: fix bad position of wlr_drag
* sway/input: wlr_seat_keyboard() now takes wlr_keyboard
* bash-completion: localize variables
* sway/main: move constants off the stack
This makes stack traces from gdb slightly easier to read.
* Fix farsi label
* Avoid format-truncation warning
The existing code gives this error when compiled with GCC 12:
../sway/server.c: In function ‘server_init’:
../sway/server.c:217:75: error: ‘%d’ directive output may be truncated writing between 1 and 11 bytes into a region of size 8 [-Werror=format-truncation=]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~
../sway/server.c:217:66: note: directive argument in the range [-2147483647, 32]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~
../sway/server.c:217:17: note: ‘snprintf’ output between 10 and 20 bytes into a destination of size 16
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Because i is never negative, this is a false positive, but it is easy to
change i to unsigned to silence the error.
* Shuffle variables to satisfy -Werror=restrict
This also fixes an invalid strlen invocation on uninitialized memory.
* layer_shell: keep output non-NULL wherever possible
Our layer shell implementation assigns every layer surface to an output
on creation. It tracks this output using the output field on the
underlying wlr_layer_surface_v1 structure. As such, much of the existing
code assumes that output is always non-NULL and omits NULL checks
accordingly.
However, there are currently two cases where we destroy a
sway_layer_surface and output is NULL. The first is when we can't find
an output to assign the surface to and destroy it immediately after
creation. The second is when we destroy a surface in response to its
output getting destroyed, as we set output to NULL in
handle_output_destroy() before we call wlr_layer_surface_v1_destroy(),
which is what calls the appropriate unmap and destroy callbacks.
The former case doesn't cause any problems, since we haven't even
allocated a sway_layer_surface at that point or registered any
callbacks. The latter case, however, currently triggers a crash (#6120)
if a popup is visible, since our popup_handle_unmap() implementation
can't handle a NULL output.
To fix this issue, keep output set until right before we free the
sway_layer_surface. All we need to do is remove some of the cleanup
logic from handle_output_destroy(), since as of commit c9060bcc12d0
("layer-shell: replace close() with destroy()") that same logic is
guaranteed to be happen later when wlroots calls handle_destroy() as
part of wlr_layer_surface_v1_destroy().
This lets us remove some NULL checks from other unmap/destroy callbacks,
which is nice. We also don't need to check that the wlr_output points to
a valid sway_output anymore, since we unset that pointer after disabling
the output as of commit a0bbe67076b8 ("Address emersions comments on
output re-enabling") Just to be safe, I've added assertions that the
wlr_output is non-NULL wherever we use it.
Fixes #6120.
* Chase wlroots X11 hints update
* Add Swedish README
* Support cursor capture in grimshot
Refactor argument parser
Bring back `sh` compatibility
Default to NOTIFY=no
* Update grimshot.1.scd
Fixed typo. The object is **files**, which is plural. **image** modifies files; it's not countable.
* xkb_switch_layout: fix relative layout switches
Fixes #6011
* Implement ext-session-lock-v1
* Avoid inspecting a NULL view in seat_set_focus
Fixes #6968
* swaynag: do error checking and rename read_from_stdin
read_from_stdin not only read from stdin, but trimming trailing
newlines, so rename it to reflect this.
* swaynag: improve robustness when loading config
* swaynag: combine consecutive declaration/assignments
* config: Remove unused mouse binding structure
Mouse bindings are handled alongside normal bindings. Remove the unused
separate data structure definition to avoid confusion.
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
* Replace strncpy with memcpy
strncpy is useless here, is dangerous because it doesn't guarantee
that the string is NUL-terminated and causes the following warning:
../sway/criteria.c: In function ‘criteria_parse’:
../sway/criteria.c:712:25: error: ‘strncpy’ destination unchanged after copying no bytes [-Werror=stringop-truncation]
712 | strncpy(value, valuestart, head - valuestart);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Add descriptions for `stacking` and `tabbed` layouts
Resolves #5918
* man: Fix trailing spaces
* server: request xdg-shell v2
Wlroots does not yet support the newer xdg-shell versions and now
requires the compositor to set the supported xdg-shell version during
creation. Set this to v2 for sway as well.
Fixes https://github.com/swaywm/sway/issues/7001
* realtime: request SCHED_RR using CAP_SYS_NICE
Try to gain SCHED_RR (round-robin) realtime scheduling privileges before
starting the server. This requires CAP_SYS_NICE on Linux systems.
We additionally register a pthread_atfork callback which resets the
scheduling class back to SCHED_OTHER (the Linux system default).
Due to CAP_SYS_NICE, setting RLIMIT_RTPRIO has no effect on the process
as documented within man 7 sched (from Linux):
Privileged (CAP_SYS_NICE) threads ignore the RLIMIT_RTPRIO limit;
as with older kernels, they can make arbitrary changes to
scheduling policy and priority. See getrlimit(2) for further
information on RLIMIT_RTPRIO
Note that this requires the sway distribution packagers to set the
CAP_SYS_NICE capability on the sway binary.
Supersedes #6992
* ext-session-lock: disable direct scan-out when locked
* Polish the language in README.zh-CN.md & sync with English one
Co-Authored-By: Urey. Xue <urey.s.knowledge@gmail.com>
* De-duplicate IPC output descriptions
* Handle NULL output make/model/serial
* chore: chase wlroots xdg-shell update
* xdg-shell: schedule a configure on maximize request
This commit reverts 03879290dbee26127f6867ef60bc2a7f9a6c8c5f and
fc84bcb7fb0ffa29b1f9bed287762241a3473803.
* Add a Hindi (हिन्दी) translation to the README
Hindi is one of the most prominent languages of the Indian Subcontinent.
This commit adds the translation of the README into the Hindi language.
Some of the words are still written in English because there wasn't an
appropriate technical term of the word in the language.
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
* sway: add bindgesture command
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
* build: link with -pthread
Fixes the following FreeBSD error:
ld: error: undefined symbol: pthread_getschedparam
>>> referenced by realtime.c:25 (../sway/realtime.c:25)
>>> sway/sway.p/realtime.c.o:(set_rr_scheduling)
Fixes: a3a82efbf6b5 ("realtime: request SCHED_RR using CAP_SYS_NICE")
* ipc: remove chatty debug log messages
These aren't particularly useful, and clobber the debug logs.
* Refuse to start when SUID is detected
This ensures that those surprised by the deprecation of SUID operation
receive an error rather than accidentally having sway run as root.
This detection will be removed in a future release.
* swaynag: move close_button up to fix SIGSEGV
When swaynag_parse_options encounters '--dismiss-button' (or its
shorthand '-s'), it sets the text of the first button in the
swaynag.buttons list, which is expected to exist and to be the dismiss
button, to the one passed by the user.
Commit 4780afb68b4ee2cdf0e4925f40cf885819f8a74a ("swaynag: statically
allocate button_close, and move declaration") moved the list
initialization to after swaynag_parse_options is called which made that
code fail.
For example, the command 'swaynag --dismiss-button Dismiss' crashes and
'swaynag --message Message --button Yes "" --dismiss-button Dismiss'
shows the wrong buttons.
Move it back to before swaynag_parse_options is called.
* config/output: use wlr_output_commit_state
This makes the code more robust because we don't potentially leave
bad state in wlr_output.pending behind anymore. This also fixes a
bug.
Closes: https://github.com/swaywm/sway/issues/7043
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3610
* Allocate enough space for `cmd_results->error`
* Remove access to wlr_input_device union
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3626
Closes: https://github.com/swaywm/sway/issues/7077
* Rename dpms output command to power
The "dpms" command refers to VESA Display Power Management
Signaling, a deprecated standard. It's superseded by VESA DPM.
Instead of tying out command name to a particular standard, use the
neutral term "power".
* Strip quotes in bindsym --input-device=...
If the input device is quoted, which is common when using variables in the
config file, those quotes must be ignored here, or the input device will be
ignored.
Fixes #7029.
* Avoid unecessary string copy
* Reject font values that are invalid for pango
Use pango to parse font configuration early, and reject the command as
invalid if the value is invalid for pango. Since we're already parsing
the font into a `PangoFontDescription`, keep that instance around and
avoid re-parsing the font each time we render text.
Fixes: https://github.com/swaywm/sway/issues/6805
* Reuse parsed PangoFontDescription
Avoids parsing the configured font each time text is rendered.
* ipc: add "power" to output reply
* config.in: switch to `output power`
* Remove internal references to DPMS
While at it, use an int for the config field, just like we do for
all other fields.
* fix: remove redundant empty statement in main.c
This semi-colon looks like a typo. Luckily, it has no effect on the code as it's treated as an empty statement leading the switch case.
Really straightforward nitpick change, was just something I was confused by when reading over the code.
* input: chase delta_discrete semantics change
* swaymsg: fix floating_nodes being ignored
Fix floating_nodes being ignored in pretty_print_tree.
* ipc: make get_deco_rect check config->hide_lone_tab
Without this, the `IPC_GET_TREE` ipc call would return false information
about the container's `deco_rect` and `rect` properties if
`hide_edge_borders --i3` was in effect.
* grimshot: fix tilde expansion within quotes
* Enable single-pixel-buffer-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3428
* sway-output.5: improve display of parameter
Since "width" and "height" are separate parameters, show them as such.
* man: sway(5) move fixes
* ipc: drop WLR_OUTPUT_ADAPTIVE_SYNC_UNKNOWN case
This has been removed from wlroots.
* config/output: test adaptive sync
Required for [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3637
* Fix crash in xdg_activation_v1.c
wlr_xdg_surface_from_wlr_surface() can return a NULL pointer, so check for NULL before dereferencing it.
* sway: Add non-desktop-output type
Currently, when encountering a non-desktop display, sway offers the
output for leasing and returns without storing it in a sway specific
output type like `struct sway_output`. Additionally, running
`swaymsg -t get_outputs` doesn't show non-desktop outputs.
This commit stores the non-desktop outputs into a struct called
`sway_output_non_desktop`, and adds them to a list on `sway_root`
* sway: add non-desktop outputs to json when running `swaymsg -t get_outputs`
* swaymsg: show non-desktop property when pretty printing outputs
* man: Add XWayland information
* ipc: expose mode picture aspect ratio
* swaymsg: show mode picture aspect ratio
* build: simplify protocol paths
No need for arrays here.
* sway/commands/output: Add command for unplugging non-physical outputs
* Improve Japanese translation
* allow pointer_constraints on layer_shell surfaces
* check for NULL
* use seat directly
* Use keyboard_state.focused_surface directly
* input: focus floating container when clicked on border
Fixes #7209.
* input: focus container when scrolling on titlebar
Fixes #6503.
* Fix leaks in criteria_destroy()
* Avoid double free in criteria_destroy()
* Add support for ext-idle-notify-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3753
* input: tweak focus behavior to allow focusing parent containers
Sway focuses the inactive child when focusing split containers. However,
there is currently no way to focus the parent container itself by mouse.
A user must use the keyboard to do so.
This commit maintains the current behavior, but makes it such that a
second click on the split container titlebar (i.e., after its children
are visible) focuses the split container itself.
* Fix keymap being NULL and segfaulting on dev add
Moved `libinput_config` to the callers of
`sway_input_configure_libinput_device` so that we send the event after
the added event.
* Rework session lock keyboard focus handling
When removing outputs, it is possible to end up in a situation where
none of the session lock client's surfaces have keyboard focus,
resulting in it not receiving keyboard events. Track the focused
surface and update it as needed on surface destroy.
* Fix focus tracking when session lock is active
Remove the incorrect attempt to block focus changes when an input grab
is present and replace it with the same logic used for layer_shell-based
screen lockers: restore the focus after changing it.
This fixes a use-after-free of seat->workspace if outputs are destroyed
while a screen lock is enabled.
* container_floating_set_default_size: Store workspace size box on the stack
* Support libinput's 1.21 new dwtp option
Support the new dwtp (disable while trackpointing) option introduced in
libinput 1.21, allowing users to control whether the trackpoint (like
those in Thinkpads, but not only) should be disabled while using the
keyboard/touchpad.
See: https://gitlab.freedesktop.org/libinput/libinput/-/issues/731
* tree: support formatting null titles
Any windows that have never had a title set visually behave closer to
that of an empty title, but are unformattable, as the code bails out
early on a NULL title.
* criteria: allow matching on empty (NULL) titles
* criteria: allow matching for NULL string criteria
* ci: install hwdata
* Use wl_signal_emit_mutable()
This function fixes segfaults when emitting a signal potentially
removes arbitrary listeners.
* Use wlr_damage_ring
wlr_output_damage is to be replaced with wlr_damage_ring, so use that.
* lock: fix crash on output destroy
Closes: https://github.com/swaywm/sway/issues/7120
* container_get_siblings: handle NULL workspace
* ci: checkout wlroots 0.16.0
* workspace_create: Don't allow NULL name
(cherry picked from commit 34933bb84350fe805d82276ea02d5732546e9993)
* output: set damage ring bounds to pixel values
Fixes: https://github.com/swaywm/sway/issues/7254
(cherry picked from commit 85005b52fe5b832e4ea914fa28048b0c5c803769)
* Use shm_open instead of mkstemp
shm_open is more reliable because it does not require
a writeable filesystem folder, unlike mkstemp.
(cherry picked from commit e2bc8866f46701e9c825ad7fa5baac02b2e4898f)
* build: drop wayland-scanner fallback
(cherry picked from commit 366f6ef3d31688631dc453028e108f98a1d7ab57)
* build: unify server & client protocol generation
No need to make a difference here, let's just generate header
files for both.
(cherry picked from commit 5be5a038da8a3789a19945719f2a27233291445d)
* build: drop "server" from target name for protocol code
(cherry picked from commit e5475d9310941ce88ed016ce1515b36e3a440252)
* build: drop intermediate libraries for protocols
(cherry picked from commit af8a5a8918ef42336194fb1077b008a736de7af9)
* root: move the workspace matching code to its own file
This removes the pid_workspace bits from tree/root before it gets
too interesting.
No functional change.
(cherry picked from commit eb5021ef990fb29ff86544aea58d687ad62c757a)
* node: prettify node type names
(cherry picked from commit 1c4b94ae3ca94b972410c80a61404a347af1ee68)
* launcher: track workspaces by node
This removes the need to rename the pid_workspaces when a workspace
is renamed.
It also opens the possibility of tracking other node types. Tracking
containers would allow application to be placed correctly in the
container tree even if the user has moved their focus elsewhere since
it was launched.
(cherry picked from commit 3b49f2782e8faf68766269b9c7390b16e25ae824)
* launcher: use xdga tokens
This reuses wlroots token tracking for workspace matching. It doesn't
export any xdga tokens for clients yet.
(cherry picked from commit bd66f4943da1c96edc3ba49573e27b42b688c543)
* launcher: rename pid_workspace to launcher_ctx
Soon we will match views with more than just a pid.
(cherry picked from commit d75c9f9722389d441fd24bd490c5cf12c4bef39a)
* view: associate launch contexts with views
Views now maintain a reference to a launch context which, as a last
resort, is populated at map time with a context associated with its pid.
This opens the possibility of populating it before map via another
source, e.g. xdga-tokens or configuration.
(cherry picked from commit 864b3a9a18f236f92f1898bb44ab977ceaebfd68)
* launcher: initialize launcher_ctxs once on startup
(cherry picked from commit 66568508c06267445489d655c91c94a34d6d9ffe)
* launcher: fudge the interface a bit
We want to create a context before knowing the pid it will match with.
(cherry picked from commit bdeb9f95651f6c99cc2f4cfb59020ddee202cf36)
* launcher: export xdga tokens and use them for workspace matching
(cherry picked from commit 30ad4dc4a5a41ce7c7aa85096a6e18f374172983)
* launcher: export X startup ids and use them for workspace matching
(cherry picked from commit 28fda4c0d38907fab94dc7d82c9dcf0754748b4e)
* swaybar: Prioritize hotspot events to bar bindings
This is consistent with i3bar's behaviour, and for example, allows binding a
command to button1, while still being able to click on tray icons or other
zones on the bar's status line which may have their own bindings.
E.g., in Sway, without this commit, this config. makes tray icons unclickable:
bar {
# ...
bindsym button1 exec swaynag -m You_clicked_the_tray._Want_some_help?
}
But the same configuration in i3 (with i3-nagbar) keeps tray items clickable.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 53f9dbd424dc173a85c9f4cd30802259d38b1ef4)
* swaybar: Make hotspots block bar release bindings
The previous commit prioritized hotspots before bar bindings for press events,
which matches i3's behaviour. However, since hotspots don't need to do any
processing on release events, those were not handled, and simply fell through
to `bindsym --release` bar bindings (if any).
This is counter-intuitive, and doesn't match i3's behaviour. Instead in case
a hotspot handles the press event, it should also handle the release event,
doing nothing, but blocking the event from triggering a --release bar binding.
E.g., in Sway, without this commit, this config. shows a text on tray clicks:
bar {
# ...
bindsym --release button1 exec swaynag -m I_got_the_release_event.
}
But the same configuration in i3 (with i3-nagbar) doesn't show the text.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 94b69acf0d7b26ee5af2172300cb18473508da76)
* build: drop unused wayland-egl dependency
(cherry picked from commit 37e4a3d6370dc6ba2b0877d588845c06781e880e)
* build: bump version to 1.8-rc1
* Fix build on Debian Stable
(cherry picked from commit dca0bb5749bc16f91ab964fc1b06ebb9a453368f)
* build: fix have_xwayland when xcb-icccm is not found
xcb-icccm is required to build Xwayland support.
Backported from commit d41f11e6bd8cef80f02dda4c66d4a31611aed753.
* build: bump version to 1.8-rc2
* seat: Avoid sending redundant keymaps on reload
When we reload the config, we reset every input device and re-apply
configuration from the config file. This means that the keyboard keymap
is updated at least once during config reload, more if the config file
contains keyboard configuration.
When they keyboard keymap changes and is updated through wlr_seat, the
keymap ends up sent to every keyboard bound in every client, seemingly
multiple times. On an x230 of mine with a keyboard layout set in the
config file, I see 42 keymap events sent to foot on config reload.
Reduce events from keyboard configurations by skipping all but the
currently active keyboard for the seat, and by clearing the active
keyboard during input manager device reset. After this change, I only
see a single just-in-time keymap event.
Fixes: https://github.com/swaywm/sway/issues/6654
* criteria: be lenient on window_role and instance too
* build: bump version to 1.8-rc3
* commands/move: Warp cursor after moving workspace to another output
This makes sway's behavior consistent with i3 when `mouse_warping` is
set to any value besides `none`.
Fixes #7027.
(cherry picked from commit e3c63bf58d0744dfb436f0f38442ce3735e40f47)
* seat: Set keyboard if seat keyboard is NULL
sway sends wl_keyboard.enter on seat focus change and when a keyboard
active on a seat is configured. If all keyboards are removed and a
keyboard is added back without changing the focused client, no new
notify event would be sent despite having keyboard focus. This could
lead to key events without notify, which is a protocol violation.
As a quick fix, when configuring a keyboard on a seat where no keyboard
is currently active, activate the keyboard so that a focused surface
will receive a notify event.
Regressed by: e1b268af98edeb09e570e8855ef64f0719cbafe2
Closes: https://github.com/swaywm/sway/issues/7330
(cherry picked from commit 1ade0ce753dc5f588584f444ce80d27c3b1e4300)
* build: bump version to 1.8-rc4
* swaynag: fix NULL font description
The font description was only set if provided on the CLI. It was
left NULL for the defaults and when reading from the config file.
Closes: https://github.com/swaywm/sway/issues/7186
(cherry picked from commit fd0af78e43f4dd67a404f475c676b25ae38a4b82)
* build: bump version to 1.8
* Removed other README languages
* Fixed build issues
* Removed alpha from render_data struct
* Updated PKGBUILDs and COPR spec
* Update sway/desktop/render.c
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
* Fixed deco_data not being initialized properly
* Replaced wlr_egl_(make|unset)_current with eglMakeCurrent
* Added matrix_projection into fx_renderer
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: Sefa Eyeoglu <contact@scrumplex.net>
Co-authored-by: Simon Ser <contact@emersion.fr>
Co-authored-by: Seth Barberee <seth.barberee@gmail.com>
Co-authored-by: Thomas Hebb <tommyhebb@gmail.com>
Co-authored-by: Nathan Schulte <nmschulte@gmail.com>
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
Co-authored-by: David Rosca <nowrep@gmail.com>
Co-authored-by: David96 <david@hameipe.de>
Co-authored-by: Kenny Levinsen <kl@kl.wtf>
Co-authored-by: Aleksei Bavshin <alebastr89@gmail.com>
Co-authored-by: Kirill Chibisov <contact@kchibisov.com>
Co-authored-by: Tudor Brindus <me@tbrindus.ca>
Co-authored-by: Patrick Hilhorst <git@hilhorst.be>
Co-authored-by: Rouven Czerwinski <rouven@czerwinskis.de>
Co-authored-by: Tobias Bengfort <tobias.bengfort@posteo.de>
Co-authored-by: Ronan Pigott <rpigott@berkeley.edu>
Co-authored-by: Kirill Primak <vyivel@eclair.cafe>
Co-authored-by: Tuomas Yrjölä <mail@yrhki.fi>
Co-authored-by: Kirill Primak <vyivel@posteo.net>
Co-authored-by: Alexander Browne <elcste@users.noreply.github.com>
Co-authored-by: Marco Rubin <20150305+Rubo3@users.noreply.github.com>
Co-authored-by: Muhamed Hobi <woohoomoo2u@gmail.com>
Co-authored-by: Simon Zeni <simon@bl4ckb0ne.ca>
Co-authored-by: Nihal Jere <nihal@nihaljere.xyz>
Co-authored-by: Alexander Gramiak <agrambot@gmail.com>
Co-authored-by: Moon Sungjoon <sumoon@seoulsaram.org>
Co-authored-by: Nicolas Avrutin <nicolas@avrutin.net>
Co-authored-by: ndren <andreien@ctemplar.com>
Co-authored-by: Bill Li <billli11hkb@gmail.com>
Co-authored-by: Leonardo Hernández Hernández <leohdz172@protonmail.com>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Co-authored-by: Manuel Stoeckl <code@mstoeckl.com>
Co-authored-by: Yasin Silavi <59373143+sttatusx@users.noreply.github.com>
Co-authored-by: Daniel De Graaf <code@danieldg.net>
Co-authored-by: kraftwerk28 <kefirchik3@gmail.com>
Co-authored-by: Eskil <67291226+eschillus@users.noreply.github.com>
Co-authored-by: Alice Carroll <git@alice-carroll.pet>
Co-authored-by: Alan <51193876+Pound-Hash@users.noreply.github.com>
Co-authored-by: Victor Makarov <vitja.makarov@gmail.com>
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: -k <slowdive@me.com>
Co-authored-by: Hongyi <61831273+FrozenArcher@users.noreply.github.com>
Co-authored-by: Urey. Xue <urey.s.knowledge@gmail.com>
Co-authored-by: LordRishav <75823494+LordRishav@users.noreply.github.com>
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
Co-authored-by: Florian Franzen <Florian.Franzen@gmail.com>
Co-authored-by: Greg Depoire--Ferrer <greg@gregdf.com>
Co-authored-by: Thomas Jost <schnouki@schnouki.net>
Co-authored-by: Hugo Osvaldo Barrera <hugo@barrera.io>
Co-authored-by: zkldi <ktchidev@gmail.com>
Co-authored-by: llyyr <llyyr.public@gmail.com>
Co-authored-by: Baltazár Radics <baltazar.radics@gmail.com>
Co-authored-by: Martin Michlmayr <tbm@cyrius.com>
Co-authored-by: Filip Szczepański <jazz2rulez@gmail.com>
Co-authored-by: Alex Maese <memaese@hotmail.com>
Co-authored-by: マリウス <marius@xn--gckvb8fzb.com>
Co-authored-by: Andri Yngvason <andri@yngvason.is>
Co-authored-by: ohno418 <yutaro.ono.418@gmail.com>
Co-authored-by: Ferdinand Schober <ferdinand.schober@fau.de>
Co-authored-by: cparm <armelcadetpetit@gmail.com>
Co-authored-by: Yaroslav de la Peña Smirnov <yps@yaroslavps.com>
Co-authored-by: Alexander Orzechowski <orzechowski.alexander@gmail.com>
Co-authored-by: pudiva chip líquida <pudiva@skylittlesystem.org>
Co-authored-by: Puck Meerburg <puck@puckipedia.com>
Co-authored-by: Callum Andrew <calcium@mailbox.org>
Co-authored-by: Ronan Pigott <ronan@rjp.ie>
Co-authored-by: Joan Bruguera <joanbrugueram@gmail.com>
Co-authored-by: nerdopolis <bluescreen_avenger@verizon.net>
Co-authored-by: Ankit Pandey <anpandey@protonmail.com>
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
2023-01-05 09:32:43 +11:00
|
|
|
#include <wlr/types/wlr_subcompositor.h>
|
2021-06-08 02:58:20 +10:00
|
|
|
#include <wlr/render/drm_format_set.h>
|
|
|
|
#include "linux-dmabuf-unstable-v1-protocol.h"
|
2021-05-08 06:57:51 +10:00
|
|
|
#include "cairo_util.h"
|
2018-05-02 23:07:52 +10:00
|
|
|
#include "pango.h"
|
2017-12-06 22:36:06 +11:00
|
|
|
#include "sway/config.h"
|
2018-07-07 18:36:20 +10:00
|
|
|
#include "sway/desktop.h"
|
2022-08-13 16:14:23 +10:00
|
|
|
#include "sway/desktop/fx_renderer.h"
|
2018-07-07 18:36:20 +10:00
|
|
|
#include "sway/desktop/transaction.h"
|
2018-01-31 15:09:21 +11:00
|
|
|
#include "sway/input/input-manager.h"
|
|
|
|
#include "sway/input/seat.h"
|
2018-03-31 02:58:17 +11:00
|
|
|
#include "sway/ipc-server.h"
|
2017-11-20 09:04:28 +11:00
|
|
|
#include "sway/output.h"
|
2017-12-10 01:48:52 +11:00
|
|
|
#include "sway/server.h"
|
2018-07-07 18:36:20 +10:00
|
|
|
#include "sway/tree/arrange.h"
|
2018-03-30 14:41:33 +11:00
|
|
|
#include "sway/tree/view.h"
|
|
|
|
#include "sway/tree/workspace.h"
|
2021-08-11 03:01:37 +10:00
|
|
|
#include "sway/xdg_decoration.h"
|
2018-12-09 09:52:29 +11:00
|
|
|
#include "list.h"
|
2017-11-23 12:39:27 +11:00
|
|
|
#include "log.h"
|
2018-05-25 21:07:59 +10:00
|
|
|
#include "stringop.h"
|
2017-11-20 09:04:28 +11:00
|
|
|
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
struct sway_container *container_create(struct sway_view *view) {
|
2018-03-30 14:41:33 +11:00
|
|
|
struct sway_container *c = calloc(1, sizeof(struct sway_container));
|
2017-11-20 09:04:28 +11:00
|
|
|
if (!c) {
|
2019-01-21 05:51:12 +11:00
|
|
|
sway_log(SWAY_ERROR, "Unable to allocate sway_container");
|
2017-11-20 09:04:28 +11:00
|
|
|
return NULL;
|
|
|
|
}
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
node_init(&c->node, N_CONTAINER, c);
|
2021-02-13 09:22:51 +11:00
|
|
|
c->pending.layout = L_NONE;
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
c->view = view;
|
2018-04-03 14:47:45 +10:00
|
|
|
c->alpha = 1.0f;
|
2022-11-12 11:38:09 +11:00
|
|
|
c->saturation = 1.0f;
|
2023-02-15 12:19:02 +11:00
|
|
|
c->dim = config->default_dim_inactive;
|
2023-01-18 17:49:26 +11:00
|
|
|
c->shadow_enabled = config->shadow_enabled;
|
2022-10-21 15:44:03 +11:00
|
|
|
c->corner_radius = config->corner_radius;
|
2018-04-03 14:47:45 +10:00
|
|
|
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
if (!view) {
|
2021-02-13 09:22:51 +11:00
|
|
|
c->pending.children = create_list();
|
2018-06-23 16:24:11 +10:00
|
|
|
c->current.children = create_list();
|
2017-11-20 09:04:28 +11:00
|
|
|
}
|
2018-10-31 22:27:38 +11:00
|
|
|
c->marks = create_list();
|
2018-08-19 11:01:51 +10:00
|
|
|
c->outputs = create_list();
|
2017-12-11 03:11:47 +11:00
|
|
|
|
|
|
|
wl_signal_init(&c->events.destroy);
|
rebase: Sway 1.8 (#78)
* build: bump wlroots dependency to 0.16.0
* swaymsg: replace if with switch in pretty_print
* swaymsg: add GET_TREE pretty-printing
* swaybar: fix errno handling in status_handle_readable
If getline fails once, it was not reset before the next getline
call. errno is only overwritten by getline on error.
* Add cairo_image_surface_create error handling
cairo_image_surface_create can fail, e.g. when running out of
memory or when the size is too big. Avoid crashing in this case.
Closes: https://github.com/swaywm/sway/issues/6531
* build: bump version to 1.8-dev
Historically we've been sticking with the last release number in
the master branch. However that's a bit confusing, people can't
easily figure out whether they're using a release or a work-in-progress
snapshot. Only the commit hash appended to the version number may
help, but that's not very explicit and disappears when using a
tarball.
We could bump the version in master to the next release number.
However during the RC cycle there would be a downgrade from 1.8 to
1.8-rc1. Also it would be hard to tell the difference between a
stable release and an old snapshot.
This patch introduces a new pre-release identifier, "dev". It's
alphabetically before "rc" so it should be correctly sorted by
semver comparisons. "dev" is upgraded to "rc" (and then to stable)
when doing a release. The master branch always uses a "dev"
version, only release branches use "rc" or stable versions.
* [IPC] Add repeat delay/rate info to keyboard
Closes #6735
wlroots already has the info in the struct so let's access it and print it out.
* input/seat: unset has_focus when focus_stack becomes empty
We currently track the focus of a seat in two ways: we use a list called
focus_stack to track the order in which nodes have been focused, with
the first node representing what's currently focused, and we use a
variable called has_focus to indicate whether anything has focus--i.e.
whether we should actually treat that first node as focused at any given
time.
In a number of places, we treat has_focus as implying that a focused
node exists. If it's true, we attempt to dereference the return value of
seat_get_focus(), our helper function for getting the first node in
focus_list, with no further checks. But this isn't quite correct with
the current implementation of seat_get_focus(): not only does it return
NULL when has_focus is false, it also returns NULL when focus_stack
contains no items.
In most cases, focus_stack never becomes empty and so this doesn't
matter at all. Since focus_stack stores a history of focused nodes, we
rarely remove nodes from it. The exception to this is when a node itself
goes away. In that case, we call seat_node_destroy() to remove it from
focus_stack and free it. But we don't unset has_focus if we've removed
the final node! This lets us get into a state where has_focus is true
but seat_get_focus() returns NULL, leading to a segfault when we try to
dereference it.
Fix the issue both by updating has_focus in seat_node_destroy() and by
adding an assertion in seat_get_focus() that ensures focus_stack and
has_focus are in sync, which will make it easier to track down similar
issues in the future.
Fixes #6395.
[1] There's some discussion in #1585 from when this was implemented
about whether has_focus is actually necessary; it's possible we could
remove it entirely, but for the moment this is the architecture we have.
* swaybar: fix tray_padding vs min-height re: scale
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
* swaybar: fix tray item icon scaling, positioning
* container: Fix crash when view unmaps + maps quickly
Followup on 4e4898e90f.
If a view quickly maps and unmaps repeatedly, there will be multiple
destroyed containers with same view in a single transaction. Each of
these containers will then try to destroy this view, resulting in use
after free.
The container should only destroy the view if the view still belongs
to the container.
Simple reproducer: couple XMapWindow + XUnmapWindow in a loop followed
by XDestroyWindow.
See #6605
* commands/move: Fix crash when pos_y is omitted
Fixes #6737
* Destroy sub-surfaces with parent layer-shell surface
Closes: https://github.com/swaywm/sway/issues/6337
* Add safety assert in parse_movement_unit
Let's add this just in case a caller passes argc == 0.
References: https://github.com/swaywm/sway/issues/6737#issuecomment-1008082540
* meson: check: false on run_command
Future meson releases will change the default and warns when the
implicit default is used, breaking builds.
Explicitly set check: false to maintain behavior and silence warnings.
* Print deprecation notice when running SUID
SUID privilege drop is needed for the "builtin"-backend of libseat,
which copied our old "direct" backend behavior for the sake of
compatibility and ease of transition.
libseat now has a better alternative in the form of seatd-launch. It
uses the normal seatd daemon and libseat backend and takes care of SUID
for us.
Add a soft deprecation warning to highlight our future intent of
removing this code. The deprecation cycle is needed to avoid surprises
when sway no longer drops privileges.
* xdg-shell: use toplevel geometry to adjust the popup box
`popup_unconstrain` uses view coordinates to init the output box for
popups. However wlroots expects the box to be set in a toplevel surface
coordinate system, which is not always equal to view. The difference
between those is a window geometry set via xdg-shell.
GTK4 reserves some space for client-side decoration and thus has a
window with top left corner not matching to (0, 0) of a surface. The box
calculated without taking that into account was slightly shifted
compared to the actual output and allowed to position part of the popup
off screen.
* build: fix building with basu
02b412a introduced the use of list for sdbus deps, however
it was assuming that all packages which were in a list has a version
higher than 239. That is true for libsystemd and libelogind, since they
use the same versions, however basu is using version numbers which are
way lower than what libsystemd/libelogind are using, so basu only build
is failing.
* Upgrade for wlroots surface refactoring
See [1] for details.
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3412
* commands/focus: drop trailing whitespace
* input/cursor: count pointer gestures as idle activity
Fixes https://github.com/swaywm/sway/issues/6765.
* input/cursor: treat swipe begin as idle activity too
Accidentally overlooked in fd53f80.
* treat fullscreen windows as 'tiled' for commands/focus
* transaction: destroying nodes aren't hidden
Commit 37d7bc69986f ("transaction: Only wait for ack from visible
views") introduced a check which uses view_is_visible() to check if a view
is still visible on the screen. However view_is_visible() will early
return in case the node is in the destroying state. This is incorrect
for transactions, since a destroying view which is visible will trigger
configure events for other clients. This bug was visible when repeatedly
opening and closing two views side by side, since we ignore the
destroying node we get a frame where the still open view is shown with
the old configure values and the rest is the desktop background. The
next frame is than correct again.
Fix this by considering destroying views as visible, we correctly wait
for them and send the configure events to other views in time, fixing
the background flicker.
Fixes #6473
* build: execute wlroots subproject before finding deps
wlroots often requires dependencies more recent than Sway's.
Executing the wlroots subproject first will give Meson a chance to
find these newer dependencies, possibly via subprojects.
The subproject will override the "wlroots" dependency when executed,
so we don't need to use get_variable anymore.
References: https://github.com/swaywm/sway/pull/6498#issuecomment-1001746017
* tray: do not render passive items
https://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/StatusNotifierItem/#org.freedesktop.statusnotifieritem.status
* cmd/swap: error on swapping a container with itself
* input/cursor: pass through pointer hold gestures
This just follows swaywm/wlroots#3047, so `wl_pointer_gestures_v1`
clients can be notified of these events.
* swaynag: remove buffer destruction condition
An address of a variable can never be NULL, so checking it doesn't make
sense; and `destroy_buffer()` can operate on already destroyed buffers
anyway.
Fixes #6780
* Use bools for CLI flags
* xwayland: listen to `request_activate` event
When REAPER submenu is closed `XCB_CLIENT_MESSAGE` with type
`NET_ACTIVE_WINDOW` is sent to set focus to parent menu.
Closes: https://github.com/swaywm/sway/issues/6324
* chore: chase wlr_output_layout_get_box() update
https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3439
* Chase wlroots xdg-shell refactor
* Minor update to focus_on_window_activation
Removed xwayland limitation since wayland clients are supported via xdg-activation.
* Translated README into Italian
* readme: add link to Italian translation
* readme: sort language list alphabetically
* readme: use relative links for translations
* xdg-shell: use wlr_xdg_toplevel in sway_view
Improved type safety.
Closes: https://github.com/swaywm/sway/issues/6813
* xdg-shell: use wlr_xdg_popup in sway_xdg_popup
Improved type safety.
* Fix snprintf compiler warning
* Remove all sprintf calls
Replace them with snprintf, which ensures buffer overflows won't
happen.
* sway/commands: add missing wlr_keyboard interface include in xkb_switch_layout
* sway/input: use wlr_input_device from input device base
* Remove some erroneous apostrophes in comments
* Don't enter seatop_move_floating when fullscreen
Currently, a floating window that's been fullscreened can send us
xdg_toplevel::move, and we'll enter seatop_move_floating, which lets us
drag the surface around while it's fullscreen. We don't want
this--fullscreen surfaces should always be aligned to the screen--so add
the same check that seatop_default already does when entering this mode.
Tested with Weston's weston-fullscreen demo, which sends a move request
if you click anywhere on its surface.
* swaynag: die on all allocation failures
* sway/input: don't pass possibly invalid modifiers pointer
active_keyboard may be NULL, in which case an invalid pointer could be
passed to wlr_input_method_keyboard_grab_v2_send_modifiers. This
procedure call is unnecessary since wlroots commit 372a52ec "input
method: send modifiers in set_keyboard", so the call can simply be
removed.
Fixes #6836.
* sway/input: destroy sway_switch properly
Fix: #6861
Added seat_device_destroy function to seat_device_destroy function.
* commands/focus: fix segfault when no container is already focused.
Fixes #6690.
* Remove WLR_SWITCH_STATE_TOGGLE usage
Ref [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/commit/4792446ee8f50104bd207d9ccd8558a7e4eb4514
* Replace pcre with pcre2
Closes: https://github.com/swaywm/sway/issues/6838
* swaybar: remove swaybar_output.input_region
No need to keep the region around, we can immediately destroy it
after the wl_surface.set_input_region request.
* swaybar: set opaque region
When the background color is fully opaque, set the surface's opaque
region to the whole surface.
* Updating criteria checking with PCRE2
* swaynag: allocate button_details with details
They are used together, so it doesn't make sense to allocate them
separately.
* swaynag: statically allocate button_close, and move declaration
Every swaynag has a close button, so it doesn't make sense to
allocate it dynamically. The declaration is moved later to when
it is actually needed.
* swaynag: remove unnecessary zero of swaynag struct
Global variables are initialized to 0.
* swaynag: remove redundant status variables in main
Instead, we just use `status` for all failures.
* remove unnecessary strlen call
* sway/input/cursor: take device mm size from wlr_tablet
* sway/input/seat: take output name from specialized input device
* sway/input: follow up wlroots input device events renaming
* sway/input: fix bad position of wlr_drag
* sway/input: wlr_seat_keyboard() now takes wlr_keyboard
* bash-completion: localize variables
* sway/main: move constants off the stack
This makes stack traces from gdb slightly easier to read.
* Fix farsi label
* Avoid format-truncation warning
The existing code gives this error when compiled with GCC 12:
../sway/server.c: In function ‘server_init’:
../sway/server.c:217:75: error: ‘%d’ directive output may be truncated writing between 1 and 11 bytes into a region of size 8 [-Werror=format-truncation=]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~
../sway/server.c:217:66: note: directive argument in the range [-2147483647, 32]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~
../sway/server.c:217:17: note: ‘snprintf’ output between 10 and 20 bytes into a destination of size 16
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Because i is never negative, this is a false positive, but it is easy to
change i to unsigned to silence the error.
* Shuffle variables to satisfy -Werror=restrict
This also fixes an invalid strlen invocation on uninitialized memory.
* layer_shell: keep output non-NULL wherever possible
Our layer shell implementation assigns every layer surface to an output
on creation. It tracks this output using the output field on the
underlying wlr_layer_surface_v1 structure. As such, much of the existing
code assumes that output is always non-NULL and omits NULL checks
accordingly.
However, there are currently two cases where we destroy a
sway_layer_surface and output is NULL. The first is when we can't find
an output to assign the surface to and destroy it immediately after
creation. The second is when we destroy a surface in response to its
output getting destroyed, as we set output to NULL in
handle_output_destroy() before we call wlr_layer_surface_v1_destroy(),
which is what calls the appropriate unmap and destroy callbacks.
The former case doesn't cause any problems, since we haven't even
allocated a sway_layer_surface at that point or registered any
callbacks. The latter case, however, currently triggers a crash (#6120)
if a popup is visible, since our popup_handle_unmap() implementation
can't handle a NULL output.
To fix this issue, keep output set until right before we free the
sway_layer_surface. All we need to do is remove some of the cleanup
logic from handle_output_destroy(), since as of commit c9060bcc12d0
("layer-shell: replace close() with destroy()") that same logic is
guaranteed to be happen later when wlroots calls handle_destroy() as
part of wlr_layer_surface_v1_destroy().
This lets us remove some NULL checks from other unmap/destroy callbacks,
which is nice. We also don't need to check that the wlr_output points to
a valid sway_output anymore, since we unset that pointer after disabling
the output as of commit a0bbe67076b8 ("Address emersions comments on
output re-enabling") Just to be safe, I've added assertions that the
wlr_output is non-NULL wherever we use it.
Fixes #6120.
* Chase wlroots X11 hints update
* Add Swedish README
* Support cursor capture in grimshot
Refactor argument parser
Bring back `sh` compatibility
Default to NOTIFY=no
* Update grimshot.1.scd
Fixed typo. The object is **files**, which is plural. **image** modifies files; it's not countable.
* xkb_switch_layout: fix relative layout switches
Fixes #6011
* Implement ext-session-lock-v1
* Avoid inspecting a NULL view in seat_set_focus
Fixes #6968
* swaynag: do error checking and rename read_from_stdin
read_from_stdin not only read from stdin, but trimming trailing
newlines, so rename it to reflect this.
* swaynag: improve robustness when loading config
* swaynag: combine consecutive declaration/assignments
* config: Remove unused mouse binding structure
Mouse bindings are handled alongside normal bindings. Remove the unused
separate data structure definition to avoid confusion.
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
* Replace strncpy with memcpy
strncpy is useless here, is dangerous because it doesn't guarantee
that the string is NUL-terminated and causes the following warning:
../sway/criteria.c: In function ‘criteria_parse’:
../sway/criteria.c:712:25: error: ‘strncpy’ destination unchanged after copying no bytes [-Werror=stringop-truncation]
712 | strncpy(value, valuestart, head - valuestart);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Add descriptions for `stacking` and `tabbed` layouts
Resolves #5918
* man: Fix trailing spaces
* server: request xdg-shell v2
Wlroots does not yet support the newer xdg-shell versions and now
requires the compositor to set the supported xdg-shell version during
creation. Set this to v2 for sway as well.
Fixes https://github.com/swaywm/sway/issues/7001
* realtime: request SCHED_RR using CAP_SYS_NICE
Try to gain SCHED_RR (round-robin) realtime scheduling privileges before
starting the server. This requires CAP_SYS_NICE on Linux systems.
We additionally register a pthread_atfork callback which resets the
scheduling class back to SCHED_OTHER (the Linux system default).
Due to CAP_SYS_NICE, setting RLIMIT_RTPRIO has no effect on the process
as documented within man 7 sched (from Linux):
Privileged (CAP_SYS_NICE) threads ignore the RLIMIT_RTPRIO limit;
as with older kernels, they can make arbitrary changes to
scheduling policy and priority. See getrlimit(2) for further
information on RLIMIT_RTPRIO
Note that this requires the sway distribution packagers to set the
CAP_SYS_NICE capability on the sway binary.
Supersedes #6992
* ext-session-lock: disable direct scan-out when locked
* Polish the language in README.zh-CN.md & sync with English one
Co-Authored-By: Urey. Xue <urey.s.knowledge@gmail.com>
* De-duplicate IPC output descriptions
* Handle NULL output make/model/serial
* chore: chase wlroots xdg-shell update
* xdg-shell: schedule a configure on maximize request
This commit reverts 03879290dbee26127f6867ef60bc2a7f9a6c8c5f and
fc84bcb7fb0ffa29b1f9bed287762241a3473803.
* Add a Hindi (हिन्दी) translation to the README
Hindi is one of the most prominent languages of the Indian Subcontinent.
This commit adds the translation of the README into the Hindi language.
Some of the words are still written in English because there wasn't an
appropriate technical term of the word in the language.
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
* sway: add bindgesture command
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
* build: link with -pthread
Fixes the following FreeBSD error:
ld: error: undefined symbol: pthread_getschedparam
>>> referenced by realtime.c:25 (../sway/realtime.c:25)
>>> sway/sway.p/realtime.c.o:(set_rr_scheduling)
Fixes: a3a82efbf6b5 ("realtime: request SCHED_RR using CAP_SYS_NICE")
* ipc: remove chatty debug log messages
These aren't particularly useful, and clobber the debug logs.
* Refuse to start when SUID is detected
This ensures that those surprised by the deprecation of SUID operation
receive an error rather than accidentally having sway run as root.
This detection will be removed in a future release.
* swaynag: move close_button up to fix SIGSEGV
When swaynag_parse_options encounters '--dismiss-button' (or its
shorthand '-s'), it sets the text of the first button in the
swaynag.buttons list, which is expected to exist and to be the dismiss
button, to the one passed by the user.
Commit 4780afb68b4ee2cdf0e4925f40cf885819f8a74a ("swaynag: statically
allocate button_close, and move declaration") moved the list
initialization to after swaynag_parse_options is called which made that
code fail.
For example, the command 'swaynag --dismiss-button Dismiss' crashes and
'swaynag --message Message --button Yes "" --dismiss-button Dismiss'
shows the wrong buttons.
Move it back to before swaynag_parse_options is called.
* config/output: use wlr_output_commit_state
This makes the code more robust because we don't potentially leave
bad state in wlr_output.pending behind anymore. This also fixes a
bug.
Closes: https://github.com/swaywm/sway/issues/7043
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3610
* Allocate enough space for `cmd_results->error`
* Remove access to wlr_input_device union
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3626
Closes: https://github.com/swaywm/sway/issues/7077
* Rename dpms output command to power
The "dpms" command refers to VESA Display Power Management
Signaling, a deprecated standard. It's superseded by VESA DPM.
Instead of tying out command name to a particular standard, use the
neutral term "power".
* Strip quotes in bindsym --input-device=...
If the input device is quoted, which is common when using variables in the
config file, those quotes must be ignored here, or the input device will be
ignored.
Fixes #7029.
* Avoid unecessary string copy
* Reject font values that are invalid for pango
Use pango to parse font configuration early, and reject the command as
invalid if the value is invalid for pango. Since we're already parsing
the font into a `PangoFontDescription`, keep that instance around and
avoid re-parsing the font each time we render text.
Fixes: https://github.com/swaywm/sway/issues/6805
* Reuse parsed PangoFontDescription
Avoids parsing the configured font each time text is rendered.
* ipc: add "power" to output reply
* config.in: switch to `output power`
* Remove internal references to DPMS
While at it, use an int for the config field, just like we do for
all other fields.
* fix: remove redundant empty statement in main.c
This semi-colon looks like a typo. Luckily, it has no effect on the code as it's treated as an empty statement leading the switch case.
Really straightforward nitpick change, was just something I was confused by when reading over the code.
* input: chase delta_discrete semantics change
* swaymsg: fix floating_nodes being ignored
Fix floating_nodes being ignored in pretty_print_tree.
* ipc: make get_deco_rect check config->hide_lone_tab
Without this, the `IPC_GET_TREE` ipc call would return false information
about the container's `deco_rect` and `rect` properties if
`hide_edge_borders --i3` was in effect.
* grimshot: fix tilde expansion within quotes
* Enable single-pixel-buffer-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3428
* sway-output.5: improve display of parameter
Since "width" and "height" are separate parameters, show them as such.
* man: sway(5) move fixes
* ipc: drop WLR_OUTPUT_ADAPTIVE_SYNC_UNKNOWN case
This has been removed from wlroots.
* config/output: test adaptive sync
Required for [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3637
* Fix crash in xdg_activation_v1.c
wlr_xdg_surface_from_wlr_surface() can return a NULL pointer, so check for NULL before dereferencing it.
* sway: Add non-desktop-output type
Currently, when encountering a non-desktop display, sway offers the
output for leasing and returns without storing it in a sway specific
output type like `struct sway_output`. Additionally, running
`swaymsg -t get_outputs` doesn't show non-desktop outputs.
This commit stores the non-desktop outputs into a struct called
`sway_output_non_desktop`, and adds them to a list on `sway_root`
* sway: add non-desktop outputs to json when running `swaymsg -t get_outputs`
* swaymsg: show non-desktop property when pretty printing outputs
* man: Add XWayland information
* ipc: expose mode picture aspect ratio
* swaymsg: show mode picture aspect ratio
* build: simplify protocol paths
No need for arrays here.
* sway/commands/output: Add command for unplugging non-physical outputs
* Improve Japanese translation
* allow pointer_constraints on layer_shell surfaces
* check for NULL
* use seat directly
* Use keyboard_state.focused_surface directly
* input: focus floating container when clicked on border
Fixes #7209.
* input: focus container when scrolling on titlebar
Fixes #6503.
* Fix leaks in criteria_destroy()
* Avoid double free in criteria_destroy()
* Add support for ext-idle-notify-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3753
* input: tweak focus behavior to allow focusing parent containers
Sway focuses the inactive child when focusing split containers. However,
there is currently no way to focus the parent container itself by mouse.
A user must use the keyboard to do so.
This commit maintains the current behavior, but makes it such that a
second click on the split container titlebar (i.e., after its children
are visible) focuses the split container itself.
* Fix keymap being NULL and segfaulting on dev add
Moved `libinput_config` to the callers of
`sway_input_configure_libinput_device` so that we send the event after
the added event.
* Rework session lock keyboard focus handling
When removing outputs, it is possible to end up in a situation where
none of the session lock client's surfaces have keyboard focus,
resulting in it not receiving keyboard events. Track the focused
surface and update it as needed on surface destroy.
* Fix focus tracking when session lock is active
Remove the incorrect attempt to block focus changes when an input grab
is present and replace it with the same logic used for layer_shell-based
screen lockers: restore the focus after changing it.
This fixes a use-after-free of seat->workspace if outputs are destroyed
while a screen lock is enabled.
* container_floating_set_default_size: Store workspace size box on the stack
* Support libinput's 1.21 new dwtp option
Support the new dwtp (disable while trackpointing) option introduced in
libinput 1.21, allowing users to control whether the trackpoint (like
those in Thinkpads, but not only) should be disabled while using the
keyboard/touchpad.
See: https://gitlab.freedesktop.org/libinput/libinput/-/issues/731
* tree: support formatting null titles
Any windows that have never had a title set visually behave closer to
that of an empty title, but are unformattable, as the code bails out
early on a NULL title.
* criteria: allow matching on empty (NULL) titles
* criteria: allow matching for NULL string criteria
* ci: install hwdata
* Use wl_signal_emit_mutable()
This function fixes segfaults when emitting a signal potentially
removes arbitrary listeners.
* Use wlr_damage_ring
wlr_output_damage is to be replaced with wlr_damage_ring, so use that.
* lock: fix crash on output destroy
Closes: https://github.com/swaywm/sway/issues/7120
* container_get_siblings: handle NULL workspace
* ci: checkout wlroots 0.16.0
* workspace_create: Don't allow NULL name
(cherry picked from commit 34933bb84350fe805d82276ea02d5732546e9993)
* output: set damage ring bounds to pixel values
Fixes: https://github.com/swaywm/sway/issues/7254
(cherry picked from commit 85005b52fe5b832e4ea914fa28048b0c5c803769)
* Use shm_open instead of mkstemp
shm_open is more reliable because it does not require
a writeable filesystem folder, unlike mkstemp.
(cherry picked from commit e2bc8866f46701e9c825ad7fa5baac02b2e4898f)
* build: drop wayland-scanner fallback
(cherry picked from commit 366f6ef3d31688631dc453028e108f98a1d7ab57)
* build: unify server & client protocol generation
No need to make a difference here, let's just generate header
files for both.
(cherry picked from commit 5be5a038da8a3789a19945719f2a27233291445d)
* build: drop "server" from target name for protocol code
(cherry picked from commit e5475d9310941ce88ed016ce1515b36e3a440252)
* build: drop intermediate libraries for protocols
(cherry picked from commit af8a5a8918ef42336194fb1077b008a736de7af9)
* root: move the workspace matching code to its own file
This removes the pid_workspace bits from tree/root before it gets
too interesting.
No functional change.
(cherry picked from commit eb5021ef990fb29ff86544aea58d687ad62c757a)
* node: prettify node type names
(cherry picked from commit 1c4b94ae3ca94b972410c80a61404a347af1ee68)
* launcher: track workspaces by node
This removes the need to rename the pid_workspaces when a workspace
is renamed.
It also opens the possibility of tracking other node types. Tracking
containers would allow application to be placed correctly in the
container tree even if the user has moved their focus elsewhere since
it was launched.
(cherry picked from commit 3b49f2782e8faf68766269b9c7390b16e25ae824)
* launcher: use xdga tokens
This reuses wlroots token tracking for workspace matching. It doesn't
export any xdga tokens for clients yet.
(cherry picked from commit bd66f4943da1c96edc3ba49573e27b42b688c543)
* launcher: rename pid_workspace to launcher_ctx
Soon we will match views with more than just a pid.
(cherry picked from commit d75c9f9722389d441fd24bd490c5cf12c4bef39a)
* view: associate launch contexts with views
Views now maintain a reference to a launch context which, as a last
resort, is populated at map time with a context associated with its pid.
This opens the possibility of populating it before map via another
source, e.g. xdga-tokens or configuration.
(cherry picked from commit 864b3a9a18f236f92f1898bb44ab977ceaebfd68)
* launcher: initialize launcher_ctxs once on startup
(cherry picked from commit 66568508c06267445489d655c91c94a34d6d9ffe)
* launcher: fudge the interface a bit
We want to create a context before knowing the pid it will match with.
(cherry picked from commit bdeb9f95651f6c99cc2f4cfb59020ddee202cf36)
* launcher: export xdga tokens and use them for workspace matching
(cherry picked from commit 30ad4dc4a5a41ce7c7aa85096a6e18f374172983)
* launcher: export X startup ids and use them for workspace matching
(cherry picked from commit 28fda4c0d38907fab94dc7d82c9dcf0754748b4e)
* swaybar: Prioritize hotspot events to bar bindings
This is consistent with i3bar's behaviour, and for example, allows binding a
command to button1, while still being able to click on tray icons or other
zones on the bar's status line which may have their own bindings.
E.g., in Sway, without this commit, this config. makes tray icons unclickable:
bar {
# ...
bindsym button1 exec swaynag -m You_clicked_the_tray._Want_some_help?
}
But the same configuration in i3 (with i3-nagbar) keeps tray items clickable.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 53f9dbd424dc173a85c9f4cd30802259d38b1ef4)
* swaybar: Make hotspots block bar release bindings
The previous commit prioritized hotspots before bar bindings for press events,
which matches i3's behaviour. However, since hotspots don't need to do any
processing on release events, those were not handled, and simply fell through
to `bindsym --release` bar bindings (if any).
This is counter-intuitive, and doesn't match i3's behaviour. Instead in case
a hotspot handles the press event, it should also handle the release event,
doing nothing, but blocking the event from triggering a --release bar binding.
E.g., in Sway, without this commit, this config. shows a text on tray clicks:
bar {
# ...
bindsym --release button1 exec swaynag -m I_got_the_release_event.
}
But the same configuration in i3 (with i3-nagbar) doesn't show the text.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 94b69acf0d7b26ee5af2172300cb18473508da76)
* build: drop unused wayland-egl dependency
(cherry picked from commit 37e4a3d6370dc6ba2b0877d588845c06781e880e)
* build: bump version to 1.8-rc1
* Fix build on Debian Stable
(cherry picked from commit dca0bb5749bc16f91ab964fc1b06ebb9a453368f)
* build: fix have_xwayland when xcb-icccm is not found
xcb-icccm is required to build Xwayland support.
Backported from commit d41f11e6bd8cef80f02dda4c66d4a31611aed753.
* build: bump version to 1.8-rc2
* seat: Avoid sending redundant keymaps on reload
When we reload the config, we reset every input device and re-apply
configuration from the config file. This means that the keyboard keymap
is updated at least once during config reload, more if the config file
contains keyboard configuration.
When they keyboard keymap changes and is updated through wlr_seat, the
keymap ends up sent to every keyboard bound in every client, seemingly
multiple times. On an x230 of mine with a keyboard layout set in the
config file, I see 42 keymap events sent to foot on config reload.
Reduce events from keyboard configurations by skipping all but the
currently active keyboard for the seat, and by clearing the active
keyboard during input manager device reset. After this change, I only
see a single just-in-time keymap event.
Fixes: https://github.com/swaywm/sway/issues/6654
* criteria: be lenient on window_role and instance too
* build: bump version to 1.8-rc3
* commands/move: Warp cursor after moving workspace to another output
This makes sway's behavior consistent with i3 when `mouse_warping` is
set to any value besides `none`.
Fixes #7027.
(cherry picked from commit e3c63bf58d0744dfb436f0f38442ce3735e40f47)
* seat: Set keyboard if seat keyboard is NULL
sway sends wl_keyboard.enter on seat focus change and when a keyboard
active on a seat is configured. If all keyboards are removed and a
keyboard is added back without changing the focused client, no new
notify event would be sent despite having keyboard focus. This could
lead to key events without notify, which is a protocol violation.
As a quick fix, when configuring a keyboard on a seat where no keyboard
is currently active, activate the keyboard so that a focused surface
will receive a notify event.
Regressed by: e1b268af98edeb09e570e8855ef64f0719cbafe2
Closes: https://github.com/swaywm/sway/issues/7330
(cherry picked from commit 1ade0ce753dc5f588584f444ce80d27c3b1e4300)
* build: bump version to 1.8-rc4
* swaynag: fix NULL font description
The font description was only set if provided on the CLI. It was
left NULL for the defaults and when reading from the config file.
Closes: https://github.com/swaywm/sway/issues/7186
(cherry picked from commit fd0af78e43f4dd67a404f475c676b25ae38a4b82)
* build: bump version to 1.8
* Removed other README languages
* Fixed build issues
* Removed alpha from render_data struct
* Updated PKGBUILDs and COPR spec
* Update sway/desktop/render.c
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
* Fixed deco_data not being initialized properly
* Replaced wlr_egl_(make|unset)_current with eglMakeCurrent
* Added matrix_projection into fx_renderer
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: Sefa Eyeoglu <contact@scrumplex.net>
Co-authored-by: Simon Ser <contact@emersion.fr>
Co-authored-by: Seth Barberee <seth.barberee@gmail.com>
Co-authored-by: Thomas Hebb <tommyhebb@gmail.com>
Co-authored-by: Nathan Schulte <nmschulte@gmail.com>
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
Co-authored-by: David Rosca <nowrep@gmail.com>
Co-authored-by: David96 <david@hameipe.de>
Co-authored-by: Kenny Levinsen <kl@kl.wtf>
Co-authored-by: Aleksei Bavshin <alebastr89@gmail.com>
Co-authored-by: Kirill Chibisov <contact@kchibisov.com>
Co-authored-by: Tudor Brindus <me@tbrindus.ca>
Co-authored-by: Patrick Hilhorst <git@hilhorst.be>
Co-authored-by: Rouven Czerwinski <rouven@czerwinskis.de>
Co-authored-by: Tobias Bengfort <tobias.bengfort@posteo.de>
Co-authored-by: Ronan Pigott <rpigott@berkeley.edu>
Co-authored-by: Kirill Primak <vyivel@eclair.cafe>
Co-authored-by: Tuomas Yrjölä <mail@yrhki.fi>
Co-authored-by: Kirill Primak <vyivel@posteo.net>
Co-authored-by: Alexander Browne <elcste@users.noreply.github.com>
Co-authored-by: Marco Rubin <20150305+Rubo3@users.noreply.github.com>
Co-authored-by: Muhamed Hobi <woohoomoo2u@gmail.com>
Co-authored-by: Simon Zeni <simon@bl4ckb0ne.ca>
Co-authored-by: Nihal Jere <nihal@nihaljere.xyz>
Co-authored-by: Alexander Gramiak <agrambot@gmail.com>
Co-authored-by: Moon Sungjoon <sumoon@seoulsaram.org>
Co-authored-by: Nicolas Avrutin <nicolas@avrutin.net>
Co-authored-by: ndren <andreien@ctemplar.com>
Co-authored-by: Bill Li <billli11hkb@gmail.com>
Co-authored-by: Leonardo Hernández Hernández <leohdz172@protonmail.com>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Co-authored-by: Manuel Stoeckl <code@mstoeckl.com>
Co-authored-by: Yasin Silavi <59373143+sttatusx@users.noreply.github.com>
Co-authored-by: Daniel De Graaf <code@danieldg.net>
Co-authored-by: kraftwerk28 <kefirchik3@gmail.com>
Co-authored-by: Eskil <67291226+eschillus@users.noreply.github.com>
Co-authored-by: Alice Carroll <git@alice-carroll.pet>
Co-authored-by: Alan <51193876+Pound-Hash@users.noreply.github.com>
Co-authored-by: Victor Makarov <vitja.makarov@gmail.com>
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: -k <slowdive@me.com>
Co-authored-by: Hongyi <61831273+FrozenArcher@users.noreply.github.com>
Co-authored-by: Urey. Xue <urey.s.knowledge@gmail.com>
Co-authored-by: LordRishav <75823494+LordRishav@users.noreply.github.com>
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
Co-authored-by: Florian Franzen <Florian.Franzen@gmail.com>
Co-authored-by: Greg Depoire--Ferrer <greg@gregdf.com>
Co-authored-by: Thomas Jost <schnouki@schnouki.net>
Co-authored-by: Hugo Osvaldo Barrera <hugo@barrera.io>
Co-authored-by: zkldi <ktchidev@gmail.com>
Co-authored-by: llyyr <llyyr.public@gmail.com>
Co-authored-by: Baltazár Radics <baltazar.radics@gmail.com>
Co-authored-by: Martin Michlmayr <tbm@cyrius.com>
Co-authored-by: Filip Szczepański <jazz2rulez@gmail.com>
Co-authored-by: Alex Maese <memaese@hotmail.com>
Co-authored-by: マリウス <marius@xn--gckvb8fzb.com>
Co-authored-by: Andri Yngvason <andri@yngvason.is>
Co-authored-by: ohno418 <yutaro.ono.418@gmail.com>
Co-authored-by: Ferdinand Schober <ferdinand.schober@fau.de>
Co-authored-by: cparm <armelcadetpetit@gmail.com>
Co-authored-by: Yaroslav de la Peña Smirnov <yps@yaroslavps.com>
Co-authored-by: Alexander Orzechowski <orzechowski.alexander@gmail.com>
Co-authored-by: pudiva chip líquida <pudiva@skylittlesystem.org>
Co-authored-by: Puck Meerburg <puck@puckipedia.com>
Co-authored-by: Callum Andrew <calcium@mailbox.org>
Co-authored-by: Ronan Pigott <ronan@rjp.ie>
Co-authored-by: Joan Bruguera <joanbrugueram@gmail.com>
Co-authored-by: nerdopolis <bluescreen_avenger@verizon.net>
Co-authored-by: Ankit Pandey <anpandey@protonmail.com>
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
2023-01-05 09:32:43 +11:00
|
|
|
wl_signal_emit_mutable(&root->events.new_node, &c->node);
|
2018-06-09 23:34:56 +10:00
|
|
|
|
2017-11-20 09:04:28 +11:00
|
|
|
return c;
|
|
|
|
}
|
|
|
|
|
2018-08-20 15:54:30 +10:00
|
|
|
void container_destroy(struct sway_container *con) {
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
if (!sway_assert(con->node.destroying,
|
2018-06-23 16:24:11 +10:00
|
|
|
"Tried to free container which wasn't marked as destroying")) {
|
|
|
|
return;
|
2017-12-30 05:04:16 +11:00
|
|
|
}
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
if (!sway_assert(con->node.ntxnrefs == 0, "Tried to free container "
|
2018-08-15 10:03:55 +10:00
|
|
|
"which is still referenced by transactions")) {
|
2018-06-23 16:24:11 +10:00
|
|
|
return;
|
2017-12-30 05:04:16 +11:00
|
|
|
}
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
free(con->title);
|
2018-08-20 15:54:30 +10:00
|
|
|
free(con->formatted_title);
|
|
|
|
wlr_texture_destroy(con->title_focused);
|
|
|
|
wlr_texture_destroy(con->title_focused_inactive);
|
|
|
|
wlr_texture_destroy(con->title_unfocused);
|
|
|
|
wlr_texture_destroy(con->title_urgent);
|
2021-12-11 02:09:29 +11:00
|
|
|
wlr_texture_destroy(con->title_focused_tab_title);
|
2021-02-13 09:22:51 +11:00
|
|
|
list_free(con->pending.children);
|
2018-08-20 15:54:30 +10:00
|
|
|
list_free(con->current.children);
|
|
|
|
list_free(con->outputs);
|
2018-06-08 09:36:16 +10:00
|
|
|
|
2018-12-09 12:15:23 +11:00
|
|
|
list_free_items_and_destroy(con->marks);
|
2018-10-31 22:27:38 +11:00
|
|
|
wlr_texture_destroy(con->marks_focused);
|
|
|
|
wlr_texture_destroy(con->marks_focused_inactive);
|
|
|
|
wlr_texture_destroy(con->marks_unfocused);
|
|
|
|
wlr_texture_destroy(con->marks_urgent);
|
2021-12-11 02:09:29 +11:00
|
|
|
wlr_texture_destroy(con->marks_focused_tab_title);
|
2018-10-31 22:27:38 +11:00
|
|
|
|
2021-10-19 16:54:36 +11:00
|
|
|
if (con->view && con->view->container == con) {
|
|
|
|
con->view->container = NULL;
|
2018-09-26 21:28:16 +10:00
|
|
|
if (con->view->destroying) {
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
view_destroy(con->view);
|
2018-05-27 21:03:36 +10:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-08-20 15:54:30 +10:00
|
|
|
free(con);
|
2018-04-04 09:23:59 +10:00
|
|
|
}
|
2017-12-30 05:04:16 +11:00
|
|
|
|
2018-08-20 15:54:30 +10:00
|
|
|
void container_begin_destroy(struct sway_container *con) {
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
if (con->view) {
|
2018-07-14 02:15:52 +10:00
|
|
|
ipc_event_window(con, "close");
|
2018-06-24 15:50:53 +10:00
|
|
|
}
|
2018-09-06 22:34:09 +10:00
|
|
|
// The workspace must have the fullscreen pointer cleared so that the
|
|
|
|
// seat code can find an appropriate new focus.
|
2021-02-13 09:22:51 +11:00
|
|
|
if (con->pending.fullscreen_mode == FULLSCREEN_WORKSPACE && con->pending.workspace) {
|
|
|
|
con->pending.workspace->fullscreen = NULL;
|
2018-09-06 22:34:09 +10:00
|
|
|
}
|
2021-02-13 09:22:51 +11:00
|
|
|
if (con->scratchpad && con->pending.fullscreen_mode == FULLSCREEN_GLOBAL) {
|
2019-04-01 14:27:18 +11:00
|
|
|
container_fullscreen_disable(con);
|
|
|
|
}
|
|
|
|
|
rebase: Sway 1.8 (#78)
* build: bump wlroots dependency to 0.16.0
* swaymsg: replace if with switch in pretty_print
* swaymsg: add GET_TREE pretty-printing
* swaybar: fix errno handling in status_handle_readable
If getline fails once, it was not reset before the next getline
call. errno is only overwritten by getline on error.
* Add cairo_image_surface_create error handling
cairo_image_surface_create can fail, e.g. when running out of
memory or when the size is too big. Avoid crashing in this case.
Closes: https://github.com/swaywm/sway/issues/6531
* build: bump version to 1.8-dev
Historically we've been sticking with the last release number in
the master branch. However that's a bit confusing, people can't
easily figure out whether they're using a release or a work-in-progress
snapshot. Only the commit hash appended to the version number may
help, but that's not very explicit and disappears when using a
tarball.
We could bump the version in master to the next release number.
However during the RC cycle there would be a downgrade from 1.8 to
1.8-rc1. Also it would be hard to tell the difference between a
stable release and an old snapshot.
This patch introduces a new pre-release identifier, "dev". It's
alphabetically before "rc" so it should be correctly sorted by
semver comparisons. "dev" is upgraded to "rc" (and then to stable)
when doing a release. The master branch always uses a "dev"
version, only release branches use "rc" or stable versions.
* [IPC] Add repeat delay/rate info to keyboard
Closes #6735
wlroots already has the info in the struct so let's access it and print it out.
* input/seat: unset has_focus when focus_stack becomes empty
We currently track the focus of a seat in two ways: we use a list called
focus_stack to track the order in which nodes have been focused, with
the first node representing what's currently focused, and we use a
variable called has_focus to indicate whether anything has focus--i.e.
whether we should actually treat that first node as focused at any given
time.
In a number of places, we treat has_focus as implying that a focused
node exists. If it's true, we attempt to dereference the return value of
seat_get_focus(), our helper function for getting the first node in
focus_list, with no further checks. But this isn't quite correct with
the current implementation of seat_get_focus(): not only does it return
NULL when has_focus is false, it also returns NULL when focus_stack
contains no items.
In most cases, focus_stack never becomes empty and so this doesn't
matter at all. Since focus_stack stores a history of focused nodes, we
rarely remove nodes from it. The exception to this is when a node itself
goes away. In that case, we call seat_node_destroy() to remove it from
focus_stack and free it. But we don't unset has_focus if we've removed
the final node! This lets us get into a state where has_focus is true
but seat_get_focus() returns NULL, leading to a segfault when we try to
dereference it.
Fix the issue both by updating has_focus in seat_node_destroy() and by
adding an assertion in seat_get_focus() that ensures focus_stack and
has_focus are in sync, which will make it easier to track down similar
issues in the future.
Fixes #6395.
[1] There's some discussion in #1585 from when this was implemented
about whether has_focus is actually necessary; it's possible we could
remove it entirely, but for the moment this is the architecture we have.
* swaybar: fix tray_padding vs min-height re: scale
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
* swaybar: fix tray item icon scaling, positioning
* container: Fix crash when view unmaps + maps quickly
Followup on 4e4898e90f.
If a view quickly maps and unmaps repeatedly, there will be multiple
destroyed containers with same view in a single transaction. Each of
these containers will then try to destroy this view, resulting in use
after free.
The container should only destroy the view if the view still belongs
to the container.
Simple reproducer: couple XMapWindow + XUnmapWindow in a loop followed
by XDestroyWindow.
See #6605
* commands/move: Fix crash when pos_y is omitted
Fixes #6737
* Destroy sub-surfaces with parent layer-shell surface
Closes: https://github.com/swaywm/sway/issues/6337
* Add safety assert in parse_movement_unit
Let's add this just in case a caller passes argc == 0.
References: https://github.com/swaywm/sway/issues/6737#issuecomment-1008082540
* meson: check: false on run_command
Future meson releases will change the default and warns when the
implicit default is used, breaking builds.
Explicitly set check: false to maintain behavior and silence warnings.
* Print deprecation notice when running SUID
SUID privilege drop is needed for the "builtin"-backend of libseat,
which copied our old "direct" backend behavior for the sake of
compatibility and ease of transition.
libseat now has a better alternative in the form of seatd-launch. It
uses the normal seatd daemon and libseat backend and takes care of SUID
for us.
Add a soft deprecation warning to highlight our future intent of
removing this code. The deprecation cycle is needed to avoid surprises
when sway no longer drops privileges.
* xdg-shell: use toplevel geometry to adjust the popup box
`popup_unconstrain` uses view coordinates to init the output box for
popups. However wlroots expects the box to be set in a toplevel surface
coordinate system, which is not always equal to view. The difference
between those is a window geometry set via xdg-shell.
GTK4 reserves some space for client-side decoration and thus has a
window with top left corner not matching to (0, 0) of a surface. The box
calculated without taking that into account was slightly shifted
compared to the actual output and allowed to position part of the popup
off screen.
* build: fix building with basu
02b412a introduced the use of list for sdbus deps, however
it was assuming that all packages which were in a list has a version
higher than 239. That is true for libsystemd and libelogind, since they
use the same versions, however basu is using version numbers which are
way lower than what libsystemd/libelogind are using, so basu only build
is failing.
* Upgrade for wlroots surface refactoring
See [1] for details.
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3412
* commands/focus: drop trailing whitespace
* input/cursor: count pointer gestures as idle activity
Fixes https://github.com/swaywm/sway/issues/6765.
* input/cursor: treat swipe begin as idle activity too
Accidentally overlooked in fd53f80.
* treat fullscreen windows as 'tiled' for commands/focus
* transaction: destroying nodes aren't hidden
Commit 37d7bc69986f ("transaction: Only wait for ack from visible
views") introduced a check which uses view_is_visible() to check if a view
is still visible on the screen. However view_is_visible() will early
return in case the node is in the destroying state. This is incorrect
for transactions, since a destroying view which is visible will trigger
configure events for other clients. This bug was visible when repeatedly
opening and closing two views side by side, since we ignore the
destroying node we get a frame where the still open view is shown with
the old configure values and the rest is the desktop background. The
next frame is than correct again.
Fix this by considering destroying views as visible, we correctly wait
for them and send the configure events to other views in time, fixing
the background flicker.
Fixes #6473
* build: execute wlroots subproject before finding deps
wlroots often requires dependencies more recent than Sway's.
Executing the wlroots subproject first will give Meson a chance to
find these newer dependencies, possibly via subprojects.
The subproject will override the "wlroots" dependency when executed,
so we don't need to use get_variable anymore.
References: https://github.com/swaywm/sway/pull/6498#issuecomment-1001746017
* tray: do not render passive items
https://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/StatusNotifierItem/#org.freedesktop.statusnotifieritem.status
* cmd/swap: error on swapping a container with itself
* input/cursor: pass through pointer hold gestures
This just follows swaywm/wlroots#3047, so `wl_pointer_gestures_v1`
clients can be notified of these events.
* swaynag: remove buffer destruction condition
An address of a variable can never be NULL, so checking it doesn't make
sense; and `destroy_buffer()` can operate on already destroyed buffers
anyway.
Fixes #6780
* Use bools for CLI flags
* xwayland: listen to `request_activate` event
When REAPER submenu is closed `XCB_CLIENT_MESSAGE` with type
`NET_ACTIVE_WINDOW` is sent to set focus to parent menu.
Closes: https://github.com/swaywm/sway/issues/6324
* chore: chase wlr_output_layout_get_box() update
https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3439
* Chase wlroots xdg-shell refactor
* Minor update to focus_on_window_activation
Removed xwayland limitation since wayland clients are supported via xdg-activation.
* Translated README into Italian
* readme: add link to Italian translation
* readme: sort language list alphabetically
* readme: use relative links for translations
* xdg-shell: use wlr_xdg_toplevel in sway_view
Improved type safety.
Closes: https://github.com/swaywm/sway/issues/6813
* xdg-shell: use wlr_xdg_popup in sway_xdg_popup
Improved type safety.
* Fix snprintf compiler warning
* Remove all sprintf calls
Replace them with snprintf, which ensures buffer overflows won't
happen.
* sway/commands: add missing wlr_keyboard interface include in xkb_switch_layout
* sway/input: use wlr_input_device from input device base
* Remove some erroneous apostrophes in comments
* Don't enter seatop_move_floating when fullscreen
Currently, a floating window that's been fullscreened can send us
xdg_toplevel::move, and we'll enter seatop_move_floating, which lets us
drag the surface around while it's fullscreen. We don't want
this--fullscreen surfaces should always be aligned to the screen--so add
the same check that seatop_default already does when entering this mode.
Tested with Weston's weston-fullscreen demo, which sends a move request
if you click anywhere on its surface.
* swaynag: die on all allocation failures
* sway/input: don't pass possibly invalid modifiers pointer
active_keyboard may be NULL, in which case an invalid pointer could be
passed to wlr_input_method_keyboard_grab_v2_send_modifiers. This
procedure call is unnecessary since wlroots commit 372a52ec "input
method: send modifiers in set_keyboard", so the call can simply be
removed.
Fixes #6836.
* sway/input: destroy sway_switch properly
Fix: #6861
Added seat_device_destroy function to seat_device_destroy function.
* commands/focus: fix segfault when no container is already focused.
Fixes #6690.
* Remove WLR_SWITCH_STATE_TOGGLE usage
Ref [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/commit/4792446ee8f50104bd207d9ccd8558a7e4eb4514
* Replace pcre with pcre2
Closes: https://github.com/swaywm/sway/issues/6838
* swaybar: remove swaybar_output.input_region
No need to keep the region around, we can immediately destroy it
after the wl_surface.set_input_region request.
* swaybar: set opaque region
When the background color is fully opaque, set the surface's opaque
region to the whole surface.
* Updating criteria checking with PCRE2
* swaynag: allocate button_details with details
They are used together, so it doesn't make sense to allocate them
separately.
* swaynag: statically allocate button_close, and move declaration
Every swaynag has a close button, so it doesn't make sense to
allocate it dynamically. The declaration is moved later to when
it is actually needed.
* swaynag: remove unnecessary zero of swaynag struct
Global variables are initialized to 0.
* swaynag: remove redundant status variables in main
Instead, we just use `status` for all failures.
* remove unnecessary strlen call
* sway/input/cursor: take device mm size from wlr_tablet
* sway/input/seat: take output name from specialized input device
* sway/input: follow up wlroots input device events renaming
* sway/input: fix bad position of wlr_drag
* sway/input: wlr_seat_keyboard() now takes wlr_keyboard
* bash-completion: localize variables
* sway/main: move constants off the stack
This makes stack traces from gdb slightly easier to read.
* Fix farsi label
* Avoid format-truncation warning
The existing code gives this error when compiled with GCC 12:
../sway/server.c: In function ‘server_init’:
../sway/server.c:217:75: error: ‘%d’ directive output may be truncated writing between 1 and 11 bytes into a region of size 8 [-Werror=format-truncation=]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~
../sway/server.c:217:66: note: directive argument in the range [-2147483647, 32]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~
../sway/server.c:217:17: note: ‘snprintf’ output between 10 and 20 bytes into a destination of size 16
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Because i is never negative, this is a false positive, but it is easy to
change i to unsigned to silence the error.
* Shuffle variables to satisfy -Werror=restrict
This also fixes an invalid strlen invocation on uninitialized memory.
* layer_shell: keep output non-NULL wherever possible
Our layer shell implementation assigns every layer surface to an output
on creation. It tracks this output using the output field on the
underlying wlr_layer_surface_v1 structure. As such, much of the existing
code assumes that output is always non-NULL and omits NULL checks
accordingly.
However, there are currently two cases where we destroy a
sway_layer_surface and output is NULL. The first is when we can't find
an output to assign the surface to and destroy it immediately after
creation. The second is when we destroy a surface in response to its
output getting destroyed, as we set output to NULL in
handle_output_destroy() before we call wlr_layer_surface_v1_destroy(),
which is what calls the appropriate unmap and destroy callbacks.
The former case doesn't cause any problems, since we haven't even
allocated a sway_layer_surface at that point or registered any
callbacks. The latter case, however, currently triggers a crash (#6120)
if a popup is visible, since our popup_handle_unmap() implementation
can't handle a NULL output.
To fix this issue, keep output set until right before we free the
sway_layer_surface. All we need to do is remove some of the cleanup
logic from handle_output_destroy(), since as of commit c9060bcc12d0
("layer-shell: replace close() with destroy()") that same logic is
guaranteed to be happen later when wlroots calls handle_destroy() as
part of wlr_layer_surface_v1_destroy().
This lets us remove some NULL checks from other unmap/destroy callbacks,
which is nice. We also don't need to check that the wlr_output points to
a valid sway_output anymore, since we unset that pointer after disabling
the output as of commit a0bbe67076b8 ("Address emersions comments on
output re-enabling") Just to be safe, I've added assertions that the
wlr_output is non-NULL wherever we use it.
Fixes #6120.
* Chase wlroots X11 hints update
* Add Swedish README
* Support cursor capture in grimshot
Refactor argument parser
Bring back `sh` compatibility
Default to NOTIFY=no
* Update grimshot.1.scd
Fixed typo. The object is **files**, which is plural. **image** modifies files; it's not countable.
* xkb_switch_layout: fix relative layout switches
Fixes #6011
* Implement ext-session-lock-v1
* Avoid inspecting a NULL view in seat_set_focus
Fixes #6968
* swaynag: do error checking and rename read_from_stdin
read_from_stdin not only read from stdin, but trimming trailing
newlines, so rename it to reflect this.
* swaynag: improve robustness when loading config
* swaynag: combine consecutive declaration/assignments
* config: Remove unused mouse binding structure
Mouse bindings are handled alongside normal bindings. Remove the unused
separate data structure definition to avoid confusion.
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
* Replace strncpy with memcpy
strncpy is useless here, is dangerous because it doesn't guarantee
that the string is NUL-terminated and causes the following warning:
../sway/criteria.c: In function ‘criteria_parse’:
../sway/criteria.c:712:25: error: ‘strncpy’ destination unchanged after copying no bytes [-Werror=stringop-truncation]
712 | strncpy(value, valuestart, head - valuestart);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Add descriptions for `stacking` and `tabbed` layouts
Resolves #5918
* man: Fix trailing spaces
* server: request xdg-shell v2
Wlroots does not yet support the newer xdg-shell versions and now
requires the compositor to set the supported xdg-shell version during
creation. Set this to v2 for sway as well.
Fixes https://github.com/swaywm/sway/issues/7001
* realtime: request SCHED_RR using CAP_SYS_NICE
Try to gain SCHED_RR (round-robin) realtime scheduling privileges before
starting the server. This requires CAP_SYS_NICE on Linux systems.
We additionally register a pthread_atfork callback which resets the
scheduling class back to SCHED_OTHER (the Linux system default).
Due to CAP_SYS_NICE, setting RLIMIT_RTPRIO has no effect on the process
as documented within man 7 sched (from Linux):
Privileged (CAP_SYS_NICE) threads ignore the RLIMIT_RTPRIO limit;
as with older kernels, they can make arbitrary changes to
scheduling policy and priority. See getrlimit(2) for further
information on RLIMIT_RTPRIO
Note that this requires the sway distribution packagers to set the
CAP_SYS_NICE capability on the sway binary.
Supersedes #6992
* ext-session-lock: disable direct scan-out when locked
* Polish the language in README.zh-CN.md & sync with English one
Co-Authored-By: Urey. Xue <urey.s.knowledge@gmail.com>
* De-duplicate IPC output descriptions
* Handle NULL output make/model/serial
* chore: chase wlroots xdg-shell update
* xdg-shell: schedule a configure on maximize request
This commit reverts 03879290dbee26127f6867ef60bc2a7f9a6c8c5f and
fc84bcb7fb0ffa29b1f9bed287762241a3473803.
* Add a Hindi (हिन्दी) translation to the README
Hindi is one of the most prominent languages of the Indian Subcontinent.
This commit adds the translation of the README into the Hindi language.
Some of the words are still written in English because there wasn't an
appropriate technical term of the word in the language.
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
* sway: add bindgesture command
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
* build: link with -pthread
Fixes the following FreeBSD error:
ld: error: undefined symbol: pthread_getschedparam
>>> referenced by realtime.c:25 (../sway/realtime.c:25)
>>> sway/sway.p/realtime.c.o:(set_rr_scheduling)
Fixes: a3a82efbf6b5 ("realtime: request SCHED_RR using CAP_SYS_NICE")
* ipc: remove chatty debug log messages
These aren't particularly useful, and clobber the debug logs.
* Refuse to start when SUID is detected
This ensures that those surprised by the deprecation of SUID operation
receive an error rather than accidentally having sway run as root.
This detection will be removed in a future release.
* swaynag: move close_button up to fix SIGSEGV
When swaynag_parse_options encounters '--dismiss-button' (or its
shorthand '-s'), it sets the text of the first button in the
swaynag.buttons list, which is expected to exist and to be the dismiss
button, to the one passed by the user.
Commit 4780afb68b4ee2cdf0e4925f40cf885819f8a74a ("swaynag: statically
allocate button_close, and move declaration") moved the list
initialization to after swaynag_parse_options is called which made that
code fail.
For example, the command 'swaynag --dismiss-button Dismiss' crashes and
'swaynag --message Message --button Yes "" --dismiss-button Dismiss'
shows the wrong buttons.
Move it back to before swaynag_parse_options is called.
* config/output: use wlr_output_commit_state
This makes the code more robust because we don't potentially leave
bad state in wlr_output.pending behind anymore. This also fixes a
bug.
Closes: https://github.com/swaywm/sway/issues/7043
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3610
* Allocate enough space for `cmd_results->error`
* Remove access to wlr_input_device union
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3626
Closes: https://github.com/swaywm/sway/issues/7077
* Rename dpms output command to power
The "dpms" command refers to VESA Display Power Management
Signaling, a deprecated standard. It's superseded by VESA DPM.
Instead of tying out command name to a particular standard, use the
neutral term "power".
* Strip quotes in bindsym --input-device=...
If the input device is quoted, which is common when using variables in the
config file, those quotes must be ignored here, or the input device will be
ignored.
Fixes #7029.
* Avoid unecessary string copy
* Reject font values that are invalid for pango
Use pango to parse font configuration early, and reject the command as
invalid if the value is invalid for pango. Since we're already parsing
the font into a `PangoFontDescription`, keep that instance around and
avoid re-parsing the font each time we render text.
Fixes: https://github.com/swaywm/sway/issues/6805
* Reuse parsed PangoFontDescription
Avoids parsing the configured font each time text is rendered.
* ipc: add "power" to output reply
* config.in: switch to `output power`
* Remove internal references to DPMS
While at it, use an int for the config field, just like we do for
all other fields.
* fix: remove redundant empty statement in main.c
This semi-colon looks like a typo. Luckily, it has no effect on the code as it's treated as an empty statement leading the switch case.
Really straightforward nitpick change, was just something I was confused by when reading over the code.
* input: chase delta_discrete semantics change
* swaymsg: fix floating_nodes being ignored
Fix floating_nodes being ignored in pretty_print_tree.
* ipc: make get_deco_rect check config->hide_lone_tab
Without this, the `IPC_GET_TREE` ipc call would return false information
about the container's `deco_rect` and `rect` properties if
`hide_edge_borders --i3` was in effect.
* grimshot: fix tilde expansion within quotes
* Enable single-pixel-buffer-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3428
* sway-output.5: improve display of parameter
Since "width" and "height" are separate parameters, show them as such.
* man: sway(5) move fixes
* ipc: drop WLR_OUTPUT_ADAPTIVE_SYNC_UNKNOWN case
This has been removed from wlroots.
* config/output: test adaptive sync
Required for [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3637
* Fix crash in xdg_activation_v1.c
wlr_xdg_surface_from_wlr_surface() can return a NULL pointer, so check for NULL before dereferencing it.
* sway: Add non-desktop-output type
Currently, when encountering a non-desktop display, sway offers the
output for leasing and returns without storing it in a sway specific
output type like `struct sway_output`. Additionally, running
`swaymsg -t get_outputs` doesn't show non-desktop outputs.
This commit stores the non-desktop outputs into a struct called
`sway_output_non_desktop`, and adds them to a list on `sway_root`
* sway: add non-desktop outputs to json when running `swaymsg -t get_outputs`
* swaymsg: show non-desktop property when pretty printing outputs
* man: Add XWayland information
* ipc: expose mode picture aspect ratio
* swaymsg: show mode picture aspect ratio
* build: simplify protocol paths
No need for arrays here.
* sway/commands/output: Add command for unplugging non-physical outputs
* Improve Japanese translation
* allow pointer_constraints on layer_shell surfaces
* check for NULL
* use seat directly
* Use keyboard_state.focused_surface directly
* input: focus floating container when clicked on border
Fixes #7209.
* input: focus container when scrolling on titlebar
Fixes #6503.
* Fix leaks in criteria_destroy()
* Avoid double free in criteria_destroy()
* Add support for ext-idle-notify-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3753
* input: tweak focus behavior to allow focusing parent containers
Sway focuses the inactive child when focusing split containers. However,
there is currently no way to focus the parent container itself by mouse.
A user must use the keyboard to do so.
This commit maintains the current behavior, but makes it such that a
second click on the split container titlebar (i.e., after its children
are visible) focuses the split container itself.
* Fix keymap being NULL and segfaulting on dev add
Moved `libinput_config` to the callers of
`sway_input_configure_libinput_device` so that we send the event after
the added event.
* Rework session lock keyboard focus handling
When removing outputs, it is possible to end up in a situation where
none of the session lock client's surfaces have keyboard focus,
resulting in it not receiving keyboard events. Track the focused
surface and update it as needed on surface destroy.
* Fix focus tracking when session lock is active
Remove the incorrect attempt to block focus changes when an input grab
is present and replace it with the same logic used for layer_shell-based
screen lockers: restore the focus after changing it.
This fixes a use-after-free of seat->workspace if outputs are destroyed
while a screen lock is enabled.
* container_floating_set_default_size: Store workspace size box on the stack
* Support libinput's 1.21 new dwtp option
Support the new dwtp (disable while trackpointing) option introduced in
libinput 1.21, allowing users to control whether the trackpoint (like
those in Thinkpads, but not only) should be disabled while using the
keyboard/touchpad.
See: https://gitlab.freedesktop.org/libinput/libinput/-/issues/731
* tree: support formatting null titles
Any windows that have never had a title set visually behave closer to
that of an empty title, but are unformattable, as the code bails out
early on a NULL title.
* criteria: allow matching on empty (NULL) titles
* criteria: allow matching for NULL string criteria
* ci: install hwdata
* Use wl_signal_emit_mutable()
This function fixes segfaults when emitting a signal potentially
removes arbitrary listeners.
* Use wlr_damage_ring
wlr_output_damage is to be replaced with wlr_damage_ring, so use that.
* lock: fix crash on output destroy
Closes: https://github.com/swaywm/sway/issues/7120
* container_get_siblings: handle NULL workspace
* ci: checkout wlroots 0.16.0
* workspace_create: Don't allow NULL name
(cherry picked from commit 34933bb84350fe805d82276ea02d5732546e9993)
* output: set damage ring bounds to pixel values
Fixes: https://github.com/swaywm/sway/issues/7254
(cherry picked from commit 85005b52fe5b832e4ea914fa28048b0c5c803769)
* Use shm_open instead of mkstemp
shm_open is more reliable because it does not require
a writeable filesystem folder, unlike mkstemp.
(cherry picked from commit e2bc8866f46701e9c825ad7fa5baac02b2e4898f)
* build: drop wayland-scanner fallback
(cherry picked from commit 366f6ef3d31688631dc453028e108f98a1d7ab57)
* build: unify server & client protocol generation
No need to make a difference here, let's just generate header
files for both.
(cherry picked from commit 5be5a038da8a3789a19945719f2a27233291445d)
* build: drop "server" from target name for protocol code
(cherry picked from commit e5475d9310941ce88ed016ce1515b36e3a440252)
* build: drop intermediate libraries for protocols
(cherry picked from commit af8a5a8918ef42336194fb1077b008a736de7af9)
* root: move the workspace matching code to its own file
This removes the pid_workspace bits from tree/root before it gets
too interesting.
No functional change.
(cherry picked from commit eb5021ef990fb29ff86544aea58d687ad62c757a)
* node: prettify node type names
(cherry picked from commit 1c4b94ae3ca94b972410c80a61404a347af1ee68)
* launcher: track workspaces by node
This removes the need to rename the pid_workspaces when a workspace
is renamed.
It also opens the possibility of tracking other node types. Tracking
containers would allow application to be placed correctly in the
container tree even if the user has moved their focus elsewhere since
it was launched.
(cherry picked from commit 3b49f2782e8faf68766269b9c7390b16e25ae824)
* launcher: use xdga tokens
This reuses wlroots token tracking for workspace matching. It doesn't
export any xdga tokens for clients yet.
(cherry picked from commit bd66f4943da1c96edc3ba49573e27b42b688c543)
* launcher: rename pid_workspace to launcher_ctx
Soon we will match views with more than just a pid.
(cherry picked from commit d75c9f9722389d441fd24bd490c5cf12c4bef39a)
* view: associate launch contexts with views
Views now maintain a reference to a launch context which, as a last
resort, is populated at map time with a context associated with its pid.
This opens the possibility of populating it before map via another
source, e.g. xdga-tokens or configuration.
(cherry picked from commit 864b3a9a18f236f92f1898bb44ab977ceaebfd68)
* launcher: initialize launcher_ctxs once on startup
(cherry picked from commit 66568508c06267445489d655c91c94a34d6d9ffe)
* launcher: fudge the interface a bit
We want to create a context before knowing the pid it will match with.
(cherry picked from commit bdeb9f95651f6c99cc2f4cfb59020ddee202cf36)
* launcher: export xdga tokens and use them for workspace matching
(cherry picked from commit 30ad4dc4a5a41ce7c7aa85096a6e18f374172983)
* launcher: export X startup ids and use them for workspace matching
(cherry picked from commit 28fda4c0d38907fab94dc7d82c9dcf0754748b4e)
* swaybar: Prioritize hotspot events to bar bindings
This is consistent with i3bar's behaviour, and for example, allows binding a
command to button1, while still being able to click on tray icons or other
zones on the bar's status line which may have their own bindings.
E.g., in Sway, without this commit, this config. makes tray icons unclickable:
bar {
# ...
bindsym button1 exec swaynag -m You_clicked_the_tray._Want_some_help?
}
But the same configuration in i3 (with i3-nagbar) keeps tray items clickable.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 53f9dbd424dc173a85c9f4cd30802259d38b1ef4)
* swaybar: Make hotspots block bar release bindings
The previous commit prioritized hotspots before bar bindings for press events,
which matches i3's behaviour. However, since hotspots don't need to do any
processing on release events, those were not handled, and simply fell through
to `bindsym --release` bar bindings (if any).
This is counter-intuitive, and doesn't match i3's behaviour. Instead in case
a hotspot handles the press event, it should also handle the release event,
doing nothing, but blocking the event from triggering a --release bar binding.
E.g., in Sway, without this commit, this config. shows a text on tray clicks:
bar {
# ...
bindsym --release button1 exec swaynag -m I_got_the_release_event.
}
But the same configuration in i3 (with i3-nagbar) doesn't show the text.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 94b69acf0d7b26ee5af2172300cb18473508da76)
* build: drop unused wayland-egl dependency
(cherry picked from commit 37e4a3d6370dc6ba2b0877d588845c06781e880e)
* build: bump version to 1.8-rc1
* Fix build on Debian Stable
(cherry picked from commit dca0bb5749bc16f91ab964fc1b06ebb9a453368f)
* build: fix have_xwayland when xcb-icccm is not found
xcb-icccm is required to build Xwayland support.
Backported from commit d41f11e6bd8cef80f02dda4c66d4a31611aed753.
* build: bump version to 1.8-rc2
* seat: Avoid sending redundant keymaps on reload
When we reload the config, we reset every input device and re-apply
configuration from the config file. This means that the keyboard keymap
is updated at least once during config reload, more if the config file
contains keyboard configuration.
When they keyboard keymap changes and is updated through wlr_seat, the
keymap ends up sent to every keyboard bound in every client, seemingly
multiple times. On an x230 of mine with a keyboard layout set in the
config file, I see 42 keymap events sent to foot on config reload.
Reduce events from keyboard configurations by skipping all but the
currently active keyboard for the seat, and by clearing the active
keyboard during input manager device reset. After this change, I only
see a single just-in-time keymap event.
Fixes: https://github.com/swaywm/sway/issues/6654
* criteria: be lenient on window_role and instance too
* build: bump version to 1.8-rc3
* commands/move: Warp cursor after moving workspace to another output
This makes sway's behavior consistent with i3 when `mouse_warping` is
set to any value besides `none`.
Fixes #7027.
(cherry picked from commit e3c63bf58d0744dfb436f0f38442ce3735e40f47)
* seat: Set keyboard if seat keyboard is NULL
sway sends wl_keyboard.enter on seat focus change and when a keyboard
active on a seat is configured. If all keyboards are removed and a
keyboard is added back without changing the focused client, no new
notify event would be sent despite having keyboard focus. This could
lead to key events without notify, which is a protocol violation.
As a quick fix, when configuring a keyboard on a seat where no keyboard
is currently active, activate the keyboard so that a focused surface
will receive a notify event.
Regressed by: e1b268af98edeb09e570e8855ef64f0719cbafe2
Closes: https://github.com/swaywm/sway/issues/7330
(cherry picked from commit 1ade0ce753dc5f588584f444ce80d27c3b1e4300)
* build: bump version to 1.8-rc4
* swaynag: fix NULL font description
The font description was only set if provided on the CLI. It was
left NULL for the defaults and when reading from the config file.
Closes: https://github.com/swaywm/sway/issues/7186
(cherry picked from commit fd0af78e43f4dd67a404f475c676b25ae38a4b82)
* build: bump version to 1.8
* Removed other README languages
* Fixed build issues
* Removed alpha from render_data struct
* Updated PKGBUILDs and COPR spec
* Update sway/desktop/render.c
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
* Fixed deco_data not being initialized properly
* Replaced wlr_egl_(make|unset)_current with eglMakeCurrent
* Added matrix_projection into fx_renderer
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: Sefa Eyeoglu <contact@scrumplex.net>
Co-authored-by: Simon Ser <contact@emersion.fr>
Co-authored-by: Seth Barberee <seth.barberee@gmail.com>
Co-authored-by: Thomas Hebb <tommyhebb@gmail.com>
Co-authored-by: Nathan Schulte <nmschulte@gmail.com>
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
Co-authored-by: David Rosca <nowrep@gmail.com>
Co-authored-by: David96 <david@hameipe.de>
Co-authored-by: Kenny Levinsen <kl@kl.wtf>
Co-authored-by: Aleksei Bavshin <alebastr89@gmail.com>
Co-authored-by: Kirill Chibisov <contact@kchibisov.com>
Co-authored-by: Tudor Brindus <me@tbrindus.ca>
Co-authored-by: Patrick Hilhorst <git@hilhorst.be>
Co-authored-by: Rouven Czerwinski <rouven@czerwinskis.de>
Co-authored-by: Tobias Bengfort <tobias.bengfort@posteo.de>
Co-authored-by: Ronan Pigott <rpigott@berkeley.edu>
Co-authored-by: Kirill Primak <vyivel@eclair.cafe>
Co-authored-by: Tuomas Yrjölä <mail@yrhki.fi>
Co-authored-by: Kirill Primak <vyivel@posteo.net>
Co-authored-by: Alexander Browne <elcste@users.noreply.github.com>
Co-authored-by: Marco Rubin <20150305+Rubo3@users.noreply.github.com>
Co-authored-by: Muhamed Hobi <woohoomoo2u@gmail.com>
Co-authored-by: Simon Zeni <simon@bl4ckb0ne.ca>
Co-authored-by: Nihal Jere <nihal@nihaljere.xyz>
Co-authored-by: Alexander Gramiak <agrambot@gmail.com>
Co-authored-by: Moon Sungjoon <sumoon@seoulsaram.org>
Co-authored-by: Nicolas Avrutin <nicolas@avrutin.net>
Co-authored-by: ndren <andreien@ctemplar.com>
Co-authored-by: Bill Li <billli11hkb@gmail.com>
Co-authored-by: Leonardo Hernández Hernández <leohdz172@protonmail.com>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Co-authored-by: Manuel Stoeckl <code@mstoeckl.com>
Co-authored-by: Yasin Silavi <59373143+sttatusx@users.noreply.github.com>
Co-authored-by: Daniel De Graaf <code@danieldg.net>
Co-authored-by: kraftwerk28 <kefirchik3@gmail.com>
Co-authored-by: Eskil <67291226+eschillus@users.noreply.github.com>
Co-authored-by: Alice Carroll <git@alice-carroll.pet>
Co-authored-by: Alan <51193876+Pound-Hash@users.noreply.github.com>
Co-authored-by: Victor Makarov <vitja.makarov@gmail.com>
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: -k <slowdive@me.com>
Co-authored-by: Hongyi <61831273+FrozenArcher@users.noreply.github.com>
Co-authored-by: Urey. Xue <urey.s.knowledge@gmail.com>
Co-authored-by: LordRishav <75823494+LordRishav@users.noreply.github.com>
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
Co-authored-by: Florian Franzen <Florian.Franzen@gmail.com>
Co-authored-by: Greg Depoire--Ferrer <greg@gregdf.com>
Co-authored-by: Thomas Jost <schnouki@schnouki.net>
Co-authored-by: Hugo Osvaldo Barrera <hugo@barrera.io>
Co-authored-by: zkldi <ktchidev@gmail.com>
Co-authored-by: llyyr <llyyr.public@gmail.com>
Co-authored-by: Baltazár Radics <baltazar.radics@gmail.com>
Co-authored-by: Martin Michlmayr <tbm@cyrius.com>
Co-authored-by: Filip Szczepański <jazz2rulez@gmail.com>
Co-authored-by: Alex Maese <memaese@hotmail.com>
Co-authored-by: マリウス <marius@xn--gckvb8fzb.com>
Co-authored-by: Andri Yngvason <andri@yngvason.is>
Co-authored-by: ohno418 <yutaro.ono.418@gmail.com>
Co-authored-by: Ferdinand Schober <ferdinand.schober@fau.de>
Co-authored-by: cparm <armelcadetpetit@gmail.com>
Co-authored-by: Yaroslav de la Peña Smirnov <yps@yaroslavps.com>
Co-authored-by: Alexander Orzechowski <orzechowski.alexander@gmail.com>
Co-authored-by: pudiva chip líquida <pudiva@skylittlesystem.org>
Co-authored-by: Puck Meerburg <puck@puckipedia.com>
Co-authored-by: Callum Andrew <calcium@mailbox.org>
Co-authored-by: Ronan Pigott <ronan@rjp.ie>
Co-authored-by: Joan Bruguera <joanbrugueram@gmail.com>
Co-authored-by: nerdopolis <bluescreen_avenger@verizon.net>
Co-authored-by: Ankit Pandey <anpandey@protonmail.com>
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
2023-01-05 09:32:43 +11:00
|
|
|
wl_signal_emit_mutable(&con->node.events.destroy, &con->node);
|
2018-06-24 15:50:53 +10:00
|
|
|
|
2018-07-18 16:13:28 +10:00
|
|
|
container_end_mouse_operation(con);
|
|
|
|
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
con->node.destroying = true;
|
|
|
|
node_set_dirty(&con->node);
|
2018-06-24 15:50:53 +10:00
|
|
|
|
2018-07-22 14:10:40 +10:00
|
|
|
if (con->scratchpad) {
|
2018-08-03 23:06:01 +10:00
|
|
|
root_scratchpad_remove_container(con);
|
2018-07-22 14:10:40 +10:00
|
|
|
}
|
|
|
|
|
2021-02-13 09:22:51 +11:00
|
|
|
if (con->pending.fullscreen_mode == FULLSCREEN_GLOBAL) {
|
2019-01-25 09:29:21 +11:00
|
|
|
container_fullscreen_disable(con);
|
|
|
|
}
|
|
|
|
|
2021-02-13 09:22:51 +11:00
|
|
|
if (con->pending.parent || con->pending.workspace) {
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
container_detach(con);
|
2018-06-24 23:07:52 +10:00
|
|
|
}
|
2018-06-24 15:50:53 +10:00
|
|
|
}
|
|
|
|
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
void container_reap_empty(struct sway_container *con) {
|
|
|
|
if (con->view) {
|
|
|
|
return;
|
2018-04-03 03:49:37 +10:00
|
|
|
}
|
2021-02-13 09:22:51 +11:00
|
|
|
struct sway_workspace *ws = con->pending.workspace;
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
while (con) {
|
2021-02-13 09:22:51 +11:00
|
|
|
if (con->pending.children->length) {
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
return;
|
2018-08-29 10:49:44 +10:00
|
|
|
}
|
2021-02-13 09:22:51 +11:00
|
|
|
struct sway_container *parent = con->pending.parent;
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
container_begin_destroy(con);
|
|
|
|
con = parent;
|
2018-08-20 15:54:30 +10:00
|
|
|
}
|
2019-04-01 14:27:18 +11:00
|
|
|
if (ws) {
|
|
|
|
workspace_consider_destroy(ws);
|
|
|
|
}
|
2018-04-03 03:49:37 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
struct sway_container *container_flatten(struct sway_container *container) {
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
if (container->view) {
|
|
|
|
return NULL;
|
|
|
|
}
|
2021-02-13 09:22:51 +11:00
|
|
|
while (container && container->pending.children->length == 1) {
|
|
|
|
struct sway_container *child = container->pending.children->items[0];
|
|
|
|
struct sway_container *parent = container->pending.parent;
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
container_replace(container, child);
|
2018-08-20 15:54:30 +10:00
|
|
|
container_begin_destroy(container);
|
2018-04-03 03:49:37 +10:00
|
|
|
container = parent;
|
|
|
|
}
|
|
|
|
return container;
|
|
|
|
}
|
|
|
|
|
2018-08-17 19:48:34 +10:00
|
|
|
struct sway_container *container_find_child(struct sway_container *container,
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
bool (*test)(struct sway_container *con, void *data), void *data) {
|
2021-02-13 09:22:51 +11:00
|
|
|
if (!container->pending.children) {
|
2018-03-30 14:41:33 +11:00
|
|
|
return NULL;
|
|
|
|
}
|
2021-02-13 09:22:51 +11:00
|
|
|
for (int i = 0; i < container->pending.children->length; ++i) {
|
|
|
|
struct sway_container *child = container->pending.children->items[i];
|
2018-03-30 14:41:33 +11:00
|
|
|
if (test(child, data)) {
|
|
|
|
return child;
|
|
|
|
}
|
2018-08-17 19:48:34 +10:00
|
|
|
struct sway_container *res = container_find_child(child, test, data);
|
|
|
|
if (res) {
|
|
|
|
return res;
|
|
|
|
}
|
2018-05-24 22:30:44 +10:00
|
|
|
}
|
2018-03-30 14:41:33 +11:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2018-10-03 19:05:30 +10:00
|
|
|
static struct sway_container *surface_at_view(struct sway_container *con, double lx, double ly,
|
2017-12-11 00:48:44 +11:00
|
|
|
struct wlr_surface **surface, double *sx, double *sy) {
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
if (!sway_assert(con->view, "Expected a view")) {
|
2018-10-03 19:05:30 +10:00
|
|
|
return NULL;
|
2018-05-20 08:34:43 +10:00
|
|
|
}
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
struct sway_view *view = con->view;
|
2019-01-28 17:00:34 +11:00
|
|
|
double view_sx = lx - con->surface_x + view->geometry.x;
|
|
|
|
double view_sy = ly - con->surface_y + view->geometry.y;
|
2018-05-19 22:54:50 +10:00
|
|
|
|
|
|
|
double _sx, _sy;
|
|
|
|
struct wlr_surface *_surface = NULL;
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
switch (view->type) {
|
2018-11-18 10:33:06 +11:00
|
|
|
#if HAVE_XWAYLAND
|
2018-05-19 22:54:50 +10:00
|
|
|
case SWAY_VIEW_XWAYLAND:
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
_surface = wlr_surface_surface_at(view->surface,
|
2018-05-19 22:54:50 +10:00
|
|
|
view_sx, view_sy, &_sx, &_sy);
|
|
|
|
break;
|
2018-07-25 07:37:41 +10:00
|
|
|
#endif
|
2018-05-19 22:54:50 +10:00
|
|
|
case SWAY_VIEW_XDG_SHELL:
|
|
|
|
_surface = wlr_xdg_surface_surface_at(
|
rebase: Sway 1.8 (#78)
* build: bump wlroots dependency to 0.16.0
* swaymsg: replace if with switch in pretty_print
* swaymsg: add GET_TREE pretty-printing
* swaybar: fix errno handling in status_handle_readable
If getline fails once, it was not reset before the next getline
call. errno is only overwritten by getline on error.
* Add cairo_image_surface_create error handling
cairo_image_surface_create can fail, e.g. when running out of
memory or when the size is too big. Avoid crashing in this case.
Closes: https://github.com/swaywm/sway/issues/6531
* build: bump version to 1.8-dev
Historically we've been sticking with the last release number in
the master branch. However that's a bit confusing, people can't
easily figure out whether they're using a release or a work-in-progress
snapshot. Only the commit hash appended to the version number may
help, but that's not very explicit and disappears when using a
tarball.
We could bump the version in master to the next release number.
However during the RC cycle there would be a downgrade from 1.8 to
1.8-rc1. Also it would be hard to tell the difference between a
stable release and an old snapshot.
This patch introduces a new pre-release identifier, "dev". It's
alphabetically before "rc" so it should be correctly sorted by
semver comparisons. "dev" is upgraded to "rc" (and then to stable)
when doing a release. The master branch always uses a "dev"
version, only release branches use "rc" or stable versions.
* [IPC] Add repeat delay/rate info to keyboard
Closes #6735
wlroots already has the info in the struct so let's access it and print it out.
* input/seat: unset has_focus when focus_stack becomes empty
We currently track the focus of a seat in two ways: we use a list called
focus_stack to track the order in which nodes have been focused, with
the first node representing what's currently focused, and we use a
variable called has_focus to indicate whether anything has focus--i.e.
whether we should actually treat that first node as focused at any given
time.
In a number of places, we treat has_focus as implying that a focused
node exists. If it's true, we attempt to dereference the return value of
seat_get_focus(), our helper function for getting the first node in
focus_list, with no further checks. But this isn't quite correct with
the current implementation of seat_get_focus(): not only does it return
NULL when has_focus is false, it also returns NULL when focus_stack
contains no items.
In most cases, focus_stack never becomes empty and so this doesn't
matter at all. Since focus_stack stores a history of focused nodes, we
rarely remove nodes from it. The exception to this is when a node itself
goes away. In that case, we call seat_node_destroy() to remove it from
focus_stack and free it. But we don't unset has_focus if we've removed
the final node! This lets us get into a state where has_focus is true
but seat_get_focus() returns NULL, leading to a segfault when we try to
dereference it.
Fix the issue both by updating has_focus in seat_node_destroy() and by
adding an assertion in seat_get_focus() that ensures focus_stack and
has_focus are in sync, which will make it easier to track down similar
issues in the future.
Fixes #6395.
[1] There's some discussion in #1585 from when this was implemented
about whether has_focus is actually necessary; it's possible we could
remove it entirely, but for the moment this is the architecture we have.
* swaybar: fix tray_padding vs min-height re: scale
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
* swaybar: fix tray item icon scaling, positioning
* container: Fix crash when view unmaps + maps quickly
Followup on 4e4898e90f.
If a view quickly maps and unmaps repeatedly, there will be multiple
destroyed containers with same view in a single transaction. Each of
these containers will then try to destroy this view, resulting in use
after free.
The container should only destroy the view if the view still belongs
to the container.
Simple reproducer: couple XMapWindow + XUnmapWindow in a loop followed
by XDestroyWindow.
See #6605
* commands/move: Fix crash when pos_y is omitted
Fixes #6737
* Destroy sub-surfaces with parent layer-shell surface
Closes: https://github.com/swaywm/sway/issues/6337
* Add safety assert in parse_movement_unit
Let's add this just in case a caller passes argc == 0.
References: https://github.com/swaywm/sway/issues/6737#issuecomment-1008082540
* meson: check: false on run_command
Future meson releases will change the default and warns when the
implicit default is used, breaking builds.
Explicitly set check: false to maintain behavior and silence warnings.
* Print deprecation notice when running SUID
SUID privilege drop is needed for the "builtin"-backend of libseat,
which copied our old "direct" backend behavior for the sake of
compatibility and ease of transition.
libseat now has a better alternative in the form of seatd-launch. It
uses the normal seatd daemon and libseat backend and takes care of SUID
for us.
Add a soft deprecation warning to highlight our future intent of
removing this code. The deprecation cycle is needed to avoid surprises
when sway no longer drops privileges.
* xdg-shell: use toplevel geometry to adjust the popup box
`popup_unconstrain` uses view coordinates to init the output box for
popups. However wlroots expects the box to be set in a toplevel surface
coordinate system, which is not always equal to view. The difference
between those is a window geometry set via xdg-shell.
GTK4 reserves some space for client-side decoration and thus has a
window with top left corner not matching to (0, 0) of a surface. The box
calculated without taking that into account was slightly shifted
compared to the actual output and allowed to position part of the popup
off screen.
* build: fix building with basu
02b412a introduced the use of list for sdbus deps, however
it was assuming that all packages which were in a list has a version
higher than 239. That is true for libsystemd and libelogind, since they
use the same versions, however basu is using version numbers which are
way lower than what libsystemd/libelogind are using, so basu only build
is failing.
* Upgrade for wlroots surface refactoring
See [1] for details.
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3412
* commands/focus: drop trailing whitespace
* input/cursor: count pointer gestures as idle activity
Fixes https://github.com/swaywm/sway/issues/6765.
* input/cursor: treat swipe begin as idle activity too
Accidentally overlooked in fd53f80.
* treat fullscreen windows as 'tiled' for commands/focus
* transaction: destroying nodes aren't hidden
Commit 37d7bc69986f ("transaction: Only wait for ack from visible
views") introduced a check which uses view_is_visible() to check if a view
is still visible on the screen. However view_is_visible() will early
return in case the node is in the destroying state. This is incorrect
for transactions, since a destroying view which is visible will trigger
configure events for other clients. This bug was visible when repeatedly
opening and closing two views side by side, since we ignore the
destroying node we get a frame where the still open view is shown with
the old configure values and the rest is the desktop background. The
next frame is than correct again.
Fix this by considering destroying views as visible, we correctly wait
for them and send the configure events to other views in time, fixing
the background flicker.
Fixes #6473
* build: execute wlroots subproject before finding deps
wlroots often requires dependencies more recent than Sway's.
Executing the wlroots subproject first will give Meson a chance to
find these newer dependencies, possibly via subprojects.
The subproject will override the "wlroots" dependency when executed,
so we don't need to use get_variable anymore.
References: https://github.com/swaywm/sway/pull/6498#issuecomment-1001746017
* tray: do not render passive items
https://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/StatusNotifierItem/#org.freedesktop.statusnotifieritem.status
* cmd/swap: error on swapping a container with itself
* input/cursor: pass through pointer hold gestures
This just follows swaywm/wlroots#3047, so `wl_pointer_gestures_v1`
clients can be notified of these events.
* swaynag: remove buffer destruction condition
An address of a variable can never be NULL, so checking it doesn't make
sense; and `destroy_buffer()` can operate on already destroyed buffers
anyway.
Fixes #6780
* Use bools for CLI flags
* xwayland: listen to `request_activate` event
When REAPER submenu is closed `XCB_CLIENT_MESSAGE` with type
`NET_ACTIVE_WINDOW` is sent to set focus to parent menu.
Closes: https://github.com/swaywm/sway/issues/6324
* chore: chase wlr_output_layout_get_box() update
https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3439
* Chase wlroots xdg-shell refactor
* Minor update to focus_on_window_activation
Removed xwayland limitation since wayland clients are supported via xdg-activation.
* Translated README into Italian
* readme: add link to Italian translation
* readme: sort language list alphabetically
* readme: use relative links for translations
* xdg-shell: use wlr_xdg_toplevel in sway_view
Improved type safety.
Closes: https://github.com/swaywm/sway/issues/6813
* xdg-shell: use wlr_xdg_popup in sway_xdg_popup
Improved type safety.
* Fix snprintf compiler warning
* Remove all sprintf calls
Replace them with snprintf, which ensures buffer overflows won't
happen.
* sway/commands: add missing wlr_keyboard interface include in xkb_switch_layout
* sway/input: use wlr_input_device from input device base
* Remove some erroneous apostrophes in comments
* Don't enter seatop_move_floating when fullscreen
Currently, a floating window that's been fullscreened can send us
xdg_toplevel::move, and we'll enter seatop_move_floating, which lets us
drag the surface around while it's fullscreen. We don't want
this--fullscreen surfaces should always be aligned to the screen--so add
the same check that seatop_default already does when entering this mode.
Tested with Weston's weston-fullscreen demo, which sends a move request
if you click anywhere on its surface.
* swaynag: die on all allocation failures
* sway/input: don't pass possibly invalid modifiers pointer
active_keyboard may be NULL, in which case an invalid pointer could be
passed to wlr_input_method_keyboard_grab_v2_send_modifiers. This
procedure call is unnecessary since wlroots commit 372a52ec "input
method: send modifiers in set_keyboard", so the call can simply be
removed.
Fixes #6836.
* sway/input: destroy sway_switch properly
Fix: #6861
Added seat_device_destroy function to seat_device_destroy function.
* commands/focus: fix segfault when no container is already focused.
Fixes #6690.
* Remove WLR_SWITCH_STATE_TOGGLE usage
Ref [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/commit/4792446ee8f50104bd207d9ccd8558a7e4eb4514
* Replace pcre with pcre2
Closes: https://github.com/swaywm/sway/issues/6838
* swaybar: remove swaybar_output.input_region
No need to keep the region around, we can immediately destroy it
after the wl_surface.set_input_region request.
* swaybar: set opaque region
When the background color is fully opaque, set the surface's opaque
region to the whole surface.
* Updating criteria checking with PCRE2
* swaynag: allocate button_details with details
They are used together, so it doesn't make sense to allocate them
separately.
* swaynag: statically allocate button_close, and move declaration
Every swaynag has a close button, so it doesn't make sense to
allocate it dynamically. The declaration is moved later to when
it is actually needed.
* swaynag: remove unnecessary zero of swaynag struct
Global variables are initialized to 0.
* swaynag: remove redundant status variables in main
Instead, we just use `status` for all failures.
* remove unnecessary strlen call
* sway/input/cursor: take device mm size from wlr_tablet
* sway/input/seat: take output name from specialized input device
* sway/input: follow up wlroots input device events renaming
* sway/input: fix bad position of wlr_drag
* sway/input: wlr_seat_keyboard() now takes wlr_keyboard
* bash-completion: localize variables
* sway/main: move constants off the stack
This makes stack traces from gdb slightly easier to read.
* Fix farsi label
* Avoid format-truncation warning
The existing code gives this error when compiled with GCC 12:
../sway/server.c: In function ‘server_init’:
../sway/server.c:217:75: error: ‘%d’ directive output may be truncated writing between 1 and 11 bytes into a region of size 8 [-Werror=format-truncation=]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~
../sway/server.c:217:66: note: directive argument in the range [-2147483647, 32]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~
../sway/server.c:217:17: note: ‘snprintf’ output between 10 and 20 bytes into a destination of size 16
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Because i is never negative, this is a false positive, but it is easy to
change i to unsigned to silence the error.
* Shuffle variables to satisfy -Werror=restrict
This also fixes an invalid strlen invocation on uninitialized memory.
* layer_shell: keep output non-NULL wherever possible
Our layer shell implementation assigns every layer surface to an output
on creation. It tracks this output using the output field on the
underlying wlr_layer_surface_v1 structure. As such, much of the existing
code assumes that output is always non-NULL and omits NULL checks
accordingly.
However, there are currently two cases where we destroy a
sway_layer_surface and output is NULL. The first is when we can't find
an output to assign the surface to and destroy it immediately after
creation. The second is when we destroy a surface in response to its
output getting destroyed, as we set output to NULL in
handle_output_destroy() before we call wlr_layer_surface_v1_destroy(),
which is what calls the appropriate unmap and destroy callbacks.
The former case doesn't cause any problems, since we haven't even
allocated a sway_layer_surface at that point or registered any
callbacks. The latter case, however, currently triggers a crash (#6120)
if a popup is visible, since our popup_handle_unmap() implementation
can't handle a NULL output.
To fix this issue, keep output set until right before we free the
sway_layer_surface. All we need to do is remove some of the cleanup
logic from handle_output_destroy(), since as of commit c9060bcc12d0
("layer-shell: replace close() with destroy()") that same logic is
guaranteed to be happen later when wlroots calls handle_destroy() as
part of wlr_layer_surface_v1_destroy().
This lets us remove some NULL checks from other unmap/destroy callbacks,
which is nice. We also don't need to check that the wlr_output points to
a valid sway_output anymore, since we unset that pointer after disabling
the output as of commit a0bbe67076b8 ("Address emersions comments on
output re-enabling") Just to be safe, I've added assertions that the
wlr_output is non-NULL wherever we use it.
Fixes #6120.
* Chase wlroots X11 hints update
* Add Swedish README
* Support cursor capture in grimshot
Refactor argument parser
Bring back `sh` compatibility
Default to NOTIFY=no
* Update grimshot.1.scd
Fixed typo. The object is **files**, which is plural. **image** modifies files; it's not countable.
* xkb_switch_layout: fix relative layout switches
Fixes #6011
* Implement ext-session-lock-v1
* Avoid inspecting a NULL view in seat_set_focus
Fixes #6968
* swaynag: do error checking and rename read_from_stdin
read_from_stdin not only read from stdin, but trimming trailing
newlines, so rename it to reflect this.
* swaynag: improve robustness when loading config
* swaynag: combine consecutive declaration/assignments
* config: Remove unused mouse binding structure
Mouse bindings are handled alongside normal bindings. Remove the unused
separate data structure definition to avoid confusion.
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
* Replace strncpy with memcpy
strncpy is useless here, is dangerous because it doesn't guarantee
that the string is NUL-terminated and causes the following warning:
../sway/criteria.c: In function ‘criteria_parse’:
../sway/criteria.c:712:25: error: ‘strncpy’ destination unchanged after copying no bytes [-Werror=stringop-truncation]
712 | strncpy(value, valuestart, head - valuestart);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Add descriptions for `stacking` and `tabbed` layouts
Resolves #5918
* man: Fix trailing spaces
* server: request xdg-shell v2
Wlroots does not yet support the newer xdg-shell versions and now
requires the compositor to set the supported xdg-shell version during
creation. Set this to v2 for sway as well.
Fixes https://github.com/swaywm/sway/issues/7001
* realtime: request SCHED_RR using CAP_SYS_NICE
Try to gain SCHED_RR (round-robin) realtime scheduling privileges before
starting the server. This requires CAP_SYS_NICE on Linux systems.
We additionally register a pthread_atfork callback which resets the
scheduling class back to SCHED_OTHER (the Linux system default).
Due to CAP_SYS_NICE, setting RLIMIT_RTPRIO has no effect on the process
as documented within man 7 sched (from Linux):
Privileged (CAP_SYS_NICE) threads ignore the RLIMIT_RTPRIO limit;
as with older kernels, they can make arbitrary changes to
scheduling policy and priority. See getrlimit(2) for further
information on RLIMIT_RTPRIO
Note that this requires the sway distribution packagers to set the
CAP_SYS_NICE capability on the sway binary.
Supersedes #6992
* ext-session-lock: disable direct scan-out when locked
* Polish the language in README.zh-CN.md & sync with English one
Co-Authored-By: Urey. Xue <urey.s.knowledge@gmail.com>
* De-duplicate IPC output descriptions
* Handle NULL output make/model/serial
* chore: chase wlroots xdg-shell update
* xdg-shell: schedule a configure on maximize request
This commit reverts 03879290dbee26127f6867ef60bc2a7f9a6c8c5f and
fc84bcb7fb0ffa29b1f9bed287762241a3473803.
* Add a Hindi (हिन्दी) translation to the README
Hindi is one of the most prominent languages of the Indian Subcontinent.
This commit adds the translation of the README into the Hindi language.
Some of the words are still written in English because there wasn't an
appropriate technical term of the word in the language.
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
* sway: add bindgesture command
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
* build: link with -pthread
Fixes the following FreeBSD error:
ld: error: undefined symbol: pthread_getschedparam
>>> referenced by realtime.c:25 (../sway/realtime.c:25)
>>> sway/sway.p/realtime.c.o:(set_rr_scheduling)
Fixes: a3a82efbf6b5 ("realtime: request SCHED_RR using CAP_SYS_NICE")
* ipc: remove chatty debug log messages
These aren't particularly useful, and clobber the debug logs.
* Refuse to start when SUID is detected
This ensures that those surprised by the deprecation of SUID operation
receive an error rather than accidentally having sway run as root.
This detection will be removed in a future release.
* swaynag: move close_button up to fix SIGSEGV
When swaynag_parse_options encounters '--dismiss-button' (or its
shorthand '-s'), it sets the text of the first button in the
swaynag.buttons list, which is expected to exist and to be the dismiss
button, to the one passed by the user.
Commit 4780afb68b4ee2cdf0e4925f40cf885819f8a74a ("swaynag: statically
allocate button_close, and move declaration") moved the list
initialization to after swaynag_parse_options is called which made that
code fail.
For example, the command 'swaynag --dismiss-button Dismiss' crashes and
'swaynag --message Message --button Yes "" --dismiss-button Dismiss'
shows the wrong buttons.
Move it back to before swaynag_parse_options is called.
* config/output: use wlr_output_commit_state
This makes the code more robust because we don't potentially leave
bad state in wlr_output.pending behind anymore. This also fixes a
bug.
Closes: https://github.com/swaywm/sway/issues/7043
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3610
* Allocate enough space for `cmd_results->error`
* Remove access to wlr_input_device union
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3626
Closes: https://github.com/swaywm/sway/issues/7077
* Rename dpms output command to power
The "dpms" command refers to VESA Display Power Management
Signaling, a deprecated standard. It's superseded by VESA DPM.
Instead of tying out command name to a particular standard, use the
neutral term "power".
* Strip quotes in bindsym --input-device=...
If the input device is quoted, which is common when using variables in the
config file, those quotes must be ignored here, or the input device will be
ignored.
Fixes #7029.
* Avoid unecessary string copy
* Reject font values that are invalid for pango
Use pango to parse font configuration early, and reject the command as
invalid if the value is invalid for pango. Since we're already parsing
the font into a `PangoFontDescription`, keep that instance around and
avoid re-parsing the font each time we render text.
Fixes: https://github.com/swaywm/sway/issues/6805
* Reuse parsed PangoFontDescription
Avoids parsing the configured font each time text is rendered.
* ipc: add "power" to output reply
* config.in: switch to `output power`
* Remove internal references to DPMS
While at it, use an int for the config field, just like we do for
all other fields.
* fix: remove redundant empty statement in main.c
This semi-colon looks like a typo. Luckily, it has no effect on the code as it's treated as an empty statement leading the switch case.
Really straightforward nitpick change, was just something I was confused by when reading over the code.
* input: chase delta_discrete semantics change
* swaymsg: fix floating_nodes being ignored
Fix floating_nodes being ignored in pretty_print_tree.
* ipc: make get_deco_rect check config->hide_lone_tab
Without this, the `IPC_GET_TREE` ipc call would return false information
about the container's `deco_rect` and `rect` properties if
`hide_edge_borders --i3` was in effect.
* grimshot: fix tilde expansion within quotes
* Enable single-pixel-buffer-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3428
* sway-output.5: improve display of parameter
Since "width" and "height" are separate parameters, show them as such.
* man: sway(5) move fixes
* ipc: drop WLR_OUTPUT_ADAPTIVE_SYNC_UNKNOWN case
This has been removed from wlroots.
* config/output: test adaptive sync
Required for [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3637
* Fix crash in xdg_activation_v1.c
wlr_xdg_surface_from_wlr_surface() can return a NULL pointer, so check for NULL before dereferencing it.
* sway: Add non-desktop-output type
Currently, when encountering a non-desktop display, sway offers the
output for leasing and returns without storing it in a sway specific
output type like `struct sway_output`. Additionally, running
`swaymsg -t get_outputs` doesn't show non-desktop outputs.
This commit stores the non-desktop outputs into a struct called
`sway_output_non_desktop`, and adds them to a list on `sway_root`
* sway: add non-desktop outputs to json when running `swaymsg -t get_outputs`
* swaymsg: show non-desktop property when pretty printing outputs
* man: Add XWayland information
* ipc: expose mode picture aspect ratio
* swaymsg: show mode picture aspect ratio
* build: simplify protocol paths
No need for arrays here.
* sway/commands/output: Add command for unplugging non-physical outputs
* Improve Japanese translation
* allow pointer_constraints on layer_shell surfaces
* check for NULL
* use seat directly
* Use keyboard_state.focused_surface directly
* input: focus floating container when clicked on border
Fixes #7209.
* input: focus container when scrolling on titlebar
Fixes #6503.
* Fix leaks in criteria_destroy()
* Avoid double free in criteria_destroy()
* Add support for ext-idle-notify-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3753
* input: tweak focus behavior to allow focusing parent containers
Sway focuses the inactive child when focusing split containers. However,
there is currently no way to focus the parent container itself by mouse.
A user must use the keyboard to do so.
This commit maintains the current behavior, but makes it such that a
second click on the split container titlebar (i.e., after its children
are visible) focuses the split container itself.
* Fix keymap being NULL and segfaulting on dev add
Moved `libinput_config` to the callers of
`sway_input_configure_libinput_device` so that we send the event after
the added event.
* Rework session lock keyboard focus handling
When removing outputs, it is possible to end up in a situation where
none of the session lock client's surfaces have keyboard focus,
resulting in it not receiving keyboard events. Track the focused
surface and update it as needed on surface destroy.
* Fix focus tracking when session lock is active
Remove the incorrect attempt to block focus changes when an input grab
is present and replace it with the same logic used for layer_shell-based
screen lockers: restore the focus after changing it.
This fixes a use-after-free of seat->workspace if outputs are destroyed
while a screen lock is enabled.
* container_floating_set_default_size: Store workspace size box on the stack
* Support libinput's 1.21 new dwtp option
Support the new dwtp (disable while trackpointing) option introduced in
libinput 1.21, allowing users to control whether the trackpoint (like
those in Thinkpads, but not only) should be disabled while using the
keyboard/touchpad.
See: https://gitlab.freedesktop.org/libinput/libinput/-/issues/731
* tree: support formatting null titles
Any windows that have never had a title set visually behave closer to
that of an empty title, but are unformattable, as the code bails out
early on a NULL title.
* criteria: allow matching on empty (NULL) titles
* criteria: allow matching for NULL string criteria
* ci: install hwdata
* Use wl_signal_emit_mutable()
This function fixes segfaults when emitting a signal potentially
removes arbitrary listeners.
* Use wlr_damage_ring
wlr_output_damage is to be replaced with wlr_damage_ring, so use that.
* lock: fix crash on output destroy
Closes: https://github.com/swaywm/sway/issues/7120
* container_get_siblings: handle NULL workspace
* ci: checkout wlroots 0.16.0
* workspace_create: Don't allow NULL name
(cherry picked from commit 34933bb84350fe805d82276ea02d5732546e9993)
* output: set damage ring bounds to pixel values
Fixes: https://github.com/swaywm/sway/issues/7254
(cherry picked from commit 85005b52fe5b832e4ea914fa28048b0c5c803769)
* Use shm_open instead of mkstemp
shm_open is more reliable because it does not require
a writeable filesystem folder, unlike mkstemp.
(cherry picked from commit e2bc8866f46701e9c825ad7fa5baac02b2e4898f)
* build: drop wayland-scanner fallback
(cherry picked from commit 366f6ef3d31688631dc453028e108f98a1d7ab57)
* build: unify server & client protocol generation
No need to make a difference here, let's just generate header
files for both.
(cherry picked from commit 5be5a038da8a3789a19945719f2a27233291445d)
* build: drop "server" from target name for protocol code
(cherry picked from commit e5475d9310941ce88ed016ce1515b36e3a440252)
* build: drop intermediate libraries for protocols
(cherry picked from commit af8a5a8918ef42336194fb1077b008a736de7af9)
* root: move the workspace matching code to its own file
This removes the pid_workspace bits from tree/root before it gets
too interesting.
No functional change.
(cherry picked from commit eb5021ef990fb29ff86544aea58d687ad62c757a)
* node: prettify node type names
(cherry picked from commit 1c4b94ae3ca94b972410c80a61404a347af1ee68)
* launcher: track workspaces by node
This removes the need to rename the pid_workspaces when a workspace
is renamed.
It also opens the possibility of tracking other node types. Tracking
containers would allow application to be placed correctly in the
container tree even if the user has moved their focus elsewhere since
it was launched.
(cherry picked from commit 3b49f2782e8faf68766269b9c7390b16e25ae824)
* launcher: use xdga tokens
This reuses wlroots token tracking for workspace matching. It doesn't
export any xdga tokens for clients yet.
(cherry picked from commit bd66f4943da1c96edc3ba49573e27b42b688c543)
* launcher: rename pid_workspace to launcher_ctx
Soon we will match views with more than just a pid.
(cherry picked from commit d75c9f9722389d441fd24bd490c5cf12c4bef39a)
* view: associate launch contexts with views
Views now maintain a reference to a launch context which, as a last
resort, is populated at map time with a context associated with its pid.
This opens the possibility of populating it before map via another
source, e.g. xdga-tokens or configuration.
(cherry picked from commit 864b3a9a18f236f92f1898bb44ab977ceaebfd68)
* launcher: initialize launcher_ctxs once on startup
(cherry picked from commit 66568508c06267445489d655c91c94a34d6d9ffe)
* launcher: fudge the interface a bit
We want to create a context before knowing the pid it will match with.
(cherry picked from commit bdeb9f95651f6c99cc2f4cfb59020ddee202cf36)
* launcher: export xdga tokens and use them for workspace matching
(cherry picked from commit 30ad4dc4a5a41ce7c7aa85096a6e18f374172983)
* launcher: export X startup ids and use them for workspace matching
(cherry picked from commit 28fda4c0d38907fab94dc7d82c9dcf0754748b4e)
* swaybar: Prioritize hotspot events to bar bindings
This is consistent with i3bar's behaviour, and for example, allows binding a
command to button1, while still being able to click on tray icons or other
zones on the bar's status line which may have their own bindings.
E.g., in Sway, without this commit, this config. makes tray icons unclickable:
bar {
# ...
bindsym button1 exec swaynag -m You_clicked_the_tray._Want_some_help?
}
But the same configuration in i3 (with i3-nagbar) keeps tray items clickable.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 53f9dbd424dc173a85c9f4cd30802259d38b1ef4)
* swaybar: Make hotspots block bar release bindings
The previous commit prioritized hotspots before bar bindings for press events,
which matches i3's behaviour. However, since hotspots don't need to do any
processing on release events, those were not handled, and simply fell through
to `bindsym --release` bar bindings (if any).
This is counter-intuitive, and doesn't match i3's behaviour. Instead in case
a hotspot handles the press event, it should also handle the release event,
doing nothing, but blocking the event from triggering a --release bar binding.
E.g., in Sway, without this commit, this config. shows a text on tray clicks:
bar {
# ...
bindsym --release button1 exec swaynag -m I_got_the_release_event.
}
But the same configuration in i3 (with i3-nagbar) doesn't show the text.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 94b69acf0d7b26ee5af2172300cb18473508da76)
* build: drop unused wayland-egl dependency
(cherry picked from commit 37e4a3d6370dc6ba2b0877d588845c06781e880e)
* build: bump version to 1.8-rc1
* Fix build on Debian Stable
(cherry picked from commit dca0bb5749bc16f91ab964fc1b06ebb9a453368f)
* build: fix have_xwayland when xcb-icccm is not found
xcb-icccm is required to build Xwayland support.
Backported from commit d41f11e6bd8cef80f02dda4c66d4a31611aed753.
* build: bump version to 1.8-rc2
* seat: Avoid sending redundant keymaps on reload
When we reload the config, we reset every input device and re-apply
configuration from the config file. This means that the keyboard keymap
is updated at least once during config reload, more if the config file
contains keyboard configuration.
When they keyboard keymap changes and is updated through wlr_seat, the
keymap ends up sent to every keyboard bound in every client, seemingly
multiple times. On an x230 of mine with a keyboard layout set in the
config file, I see 42 keymap events sent to foot on config reload.
Reduce events from keyboard configurations by skipping all but the
currently active keyboard for the seat, and by clearing the active
keyboard during input manager device reset. After this change, I only
see a single just-in-time keymap event.
Fixes: https://github.com/swaywm/sway/issues/6654
* criteria: be lenient on window_role and instance too
* build: bump version to 1.8-rc3
* commands/move: Warp cursor after moving workspace to another output
This makes sway's behavior consistent with i3 when `mouse_warping` is
set to any value besides `none`.
Fixes #7027.
(cherry picked from commit e3c63bf58d0744dfb436f0f38442ce3735e40f47)
* seat: Set keyboard if seat keyboard is NULL
sway sends wl_keyboard.enter on seat focus change and when a keyboard
active on a seat is configured. If all keyboards are removed and a
keyboard is added back without changing the focused client, no new
notify event would be sent despite having keyboard focus. This could
lead to key events without notify, which is a protocol violation.
As a quick fix, when configuring a keyboard on a seat where no keyboard
is currently active, activate the keyboard so that a focused surface
will receive a notify event.
Regressed by: e1b268af98edeb09e570e8855ef64f0719cbafe2
Closes: https://github.com/swaywm/sway/issues/7330
(cherry picked from commit 1ade0ce753dc5f588584f444ce80d27c3b1e4300)
* build: bump version to 1.8-rc4
* swaynag: fix NULL font description
The font description was only set if provided on the CLI. It was
left NULL for the defaults and when reading from the config file.
Closes: https://github.com/swaywm/sway/issues/7186
(cherry picked from commit fd0af78e43f4dd67a404f475c676b25ae38a4b82)
* build: bump version to 1.8
* Removed other README languages
* Fixed build issues
* Removed alpha from render_data struct
* Updated PKGBUILDs and COPR spec
* Update sway/desktop/render.c
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
* Fixed deco_data not being initialized properly
* Replaced wlr_egl_(make|unset)_current with eglMakeCurrent
* Added matrix_projection into fx_renderer
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: Sefa Eyeoglu <contact@scrumplex.net>
Co-authored-by: Simon Ser <contact@emersion.fr>
Co-authored-by: Seth Barberee <seth.barberee@gmail.com>
Co-authored-by: Thomas Hebb <tommyhebb@gmail.com>
Co-authored-by: Nathan Schulte <nmschulte@gmail.com>
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
Co-authored-by: David Rosca <nowrep@gmail.com>
Co-authored-by: David96 <david@hameipe.de>
Co-authored-by: Kenny Levinsen <kl@kl.wtf>
Co-authored-by: Aleksei Bavshin <alebastr89@gmail.com>
Co-authored-by: Kirill Chibisov <contact@kchibisov.com>
Co-authored-by: Tudor Brindus <me@tbrindus.ca>
Co-authored-by: Patrick Hilhorst <git@hilhorst.be>
Co-authored-by: Rouven Czerwinski <rouven@czerwinskis.de>
Co-authored-by: Tobias Bengfort <tobias.bengfort@posteo.de>
Co-authored-by: Ronan Pigott <rpigott@berkeley.edu>
Co-authored-by: Kirill Primak <vyivel@eclair.cafe>
Co-authored-by: Tuomas Yrjölä <mail@yrhki.fi>
Co-authored-by: Kirill Primak <vyivel@posteo.net>
Co-authored-by: Alexander Browne <elcste@users.noreply.github.com>
Co-authored-by: Marco Rubin <20150305+Rubo3@users.noreply.github.com>
Co-authored-by: Muhamed Hobi <woohoomoo2u@gmail.com>
Co-authored-by: Simon Zeni <simon@bl4ckb0ne.ca>
Co-authored-by: Nihal Jere <nihal@nihaljere.xyz>
Co-authored-by: Alexander Gramiak <agrambot@gmail.com>
Co-authored-by: Moon Sungjoon <sumoon@seoulsaram.org>
Co-authored-by: Nicolas Avrutin <nicolas@avrutin.net>
Co-authored-by: ndren <andreien@ctemplar.com>
Co-authored-by: Bill Li <billli11hkb@gmail.com>
Co-authored-by: Leonardo Hernández Hernández <leohdz172@protonmail.com>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Co-authored-by: Manuel Stoeckl <code@mstoeckl.com>
Co-authored-by: Yasin Silavi <59373143+sttatusx@users.noreply.github.com>
Co-authored-by: Daniel De Graaf <code@danieldg.net>
Co-authored-by: kraftwerk28 <kefirchik3@gmail.com>
Co-authored-by: Eskil <67291226+eschillus@users.noreply.github.com>
Co-authored-by: Alice Carroll <git@alice-carroll.pet>
Co-authored-by: Alan <51193876+Pound-Hash@users.noreply.github.com>
Co-authored-by: Victor Makarov <vitja.makarov@gmail.com>
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: -k <slowdive@me.com>
Co-authored-by: Hongyi <61831273+FrozenArcher@users.noreply.github.com>
Co-authored-by: Urey. Xue <urey.s.knowledge@gmail.com>
Co-authored-by: LordRishav <75823494+LordRishav@users.noreply.github.com>
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
Co-authored-by: Florian Franzen <Florian.Franzen@gmail.com>
Co-authored-by: Greg Depoire--Ferrer <greg@gregdf.com>
Co-authored-by: Thomas Jost <schnouki@schnouki.net>
Co-authored-by: Hugo Osvaldo Barrera <hugo@barrera.io>
Co-authored-by: zkldi <ktchidev@gmail.com>
Co-authored-by: llyyr <llyyr.public@gmail.com>
Co-authored-by: Baltazár Radics <baltazar.radics@gmail.com>
Co-authored-by: Martin Michlmayr <tbm@cyrius.com>
Co-authored-by: Filip Szczepański <jazz2rulez@gmail.com>
Co-authored-by: Alex Maese <memaese@hotmail.com>
Co-authored-by: マリウス <marius@xn--gckvb8fzb.com>
Co-authored-by: Andri Yngvason <andri@yngvason.is>
Co-authored-by: ohno418 <yutaro.ono.418@gmail.com>
Co-authored-by: Ferdinand Schober <ferdinand.schober@fau.de>
Co-authored-by: cparm <armelcadetpetit@gmail.com>
Co-authored-by: Yaroslav de la Peña Smirnov <yps@yaroslavps.com>
Co-authored-by: Alexander Orzechowski <orzechowski.alexander@gmail.com>
Co-authored-by: pudiva chip líquida <pudiva@skylittlesystem.org>
Co-authored-by: Puck Meerburg <puck@puckipedia.com>
Co-authored-by: Callum Andrew <calcium@mailbox.org>
Co-authored-by: Ronan Pigott <ronan@rjp.ie>
Co-authored-by: Joan Bruguera <joanbrugueram@gmail.com>
Co-authored-by: nerdopolis <bluescreen_avenger@verizon.net>
Co-authored-by: Ankit Pandey <anpandey@protonmail.com>
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
2023-01-05 09:32:43 +11:00
|
|
|
view->wlr_xdg_toplevel->base,
|
2018-05-19 22:54:50 +10:00
|
|
|
view_sx, view_sy, &_sx, &_sy);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (_surface) {
|
|
|
|
*sx = _sx;
|
|
|
|
*sy = _sy;
|
|
|
|
*surface = _surface;
|
2018-10-03 19:05:30 +10:00
|
|
|
return con;
|
2018-05-19 22:54:50 +10:00
|
|
|
}
|
2018-10-03 19:05:30 +10:00
|
|
|
return NULL;
|
2018-05-19 22:54:50 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* container_at for a container with layout L_TABBED.
|
|
|
|
*/
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
static struct sway_container *container_at_tabbed(struct sway_node *parent,
|
2018-05-26 16:26:10 +10:00
|
|
|
double lx, double ly,
|
2018-05-19 22:54:50 +10:00
|
|
|
struct wlr_surface **surface, double *sx, double *sy) {
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
struct wlr_box box;
|
|
|
|
node_get_box(parent, &box);
|
2020-02-11 12:52:34 +11:00
|
|
|
if (lx < box.x || lx > box.x + box.width ||
|
|
|
|
ly < box.y || ly > box.y + box.height) {
|
2018-02-25 06:30:47 +11:00
|
|
|
return NULL;
|
|
|
|
}
|
2018-10-18 22:20:00 +11:00
|
|
|
struct sway_seat *seat = input_manager_current_seat();
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
list_t *children = node_get_children(parent);
|
2018-09-16 14:18:13 +10:00
|
|
|
if (!children->length) {
|
|
|
|
return NULL;
|
|
|
|
}
|
2018-02-25 06:30:47 +11:00
|
|
|
|
2018-05-19 22:54:50 +10:00
|
|
|
// Tab titles
|
2018-05-22 08:27:42 +10:00
|
|
|
int title_height = container_titlebar_height();
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
if (ly < box.y + title_height) {
|
|
|
|
int tab_width = box.width / children->length;
|
|
|
|
int child_index = (lx - box.x) / tab_width;
|
|
|
|
if (child_index >= children->length) {
|
|
|
|
child_index = children->length - 1;
|
2018-05-19 22:54:50 +10:00
|
|
|
}
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
struct sway_container *child = children->items[child_index];
|
2018-09-22 10:42:59 +10:00
|
|
|
return child;
|
2018-05-19 22:54:50 +10:00
|
|
|
}
|
2017-12-11 00:48:44 +11:00
|
|
|
|
2018-05-19 22:54:50 +10:00
|
|
|
// Surfaces
|
2018-09-16 22:01:54 +10:00
|
|
|
struct sway_node *current = seat_get_active_tiling_child(seat, parent);
|
2018-09-10 15:47:58 +10:00
|
|
|
return current ? tiling_container_at(current, lx, ly, surface, sx, sy) : NULL;
|
2018-05-19 22:54:50 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* container_at for a container with layout L_STACKED.
|
|
|
|
*/
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
static struct sway_container *container_at_stacked(struct sway_node *parent,
|
|
|
|
double lx, double ly,
|
2018-05-19 22:54:50 +10:00
|
|
|
struct wlr_surface **surface, double *sx, double *sy) {
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
struct wlr_box box;
|
|
|
|
node_get_box(parent, &box);
|
2020-02-11 12:52:34 +11:00
|
|
|
if (lx < box.x || lx > box.x + box.width ||
|
|
|
|
ly < box.y || ly > box.y + box.height) {
|
2018-05-22 08:43:00 +10:00
|
|
|
return NULL;
|
|
|
|
}
|
2018-10-18 22:20:00 +11:00
|
|
|
struct sway_seat *seat = input_manager_current_seat();
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
list_t *children = node_get_children(parent);
|
2018-05-22 08:43:00 +10:00
|
|
|
|
|
|
|
// Title bars
|
|
|
|
int title_height = container_titlebar_height();
|
2019-02-09 14:29:35 +11:00
|
|
|
if (title_height > 0) {
|
|
|
|
int child_index = (ly - box.y) / title_height;
|
|
|
|
if (child_index < children->length) {
|
|
|
|
struct sway_container *child = children->items[child_index];
|
|
|
|
return child;
|
|
|
|
}
|
2018-05-22 08:43:00 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
// Surfaces
|
2018-09-16 22:01:54 +10:00
|
|
|
struct sway_node *current = seat_get_active_tiling_child(seat, parent);
|
2018-09-11 03:03:53 +10:00
|
|
|
return current ? tiling_container_at(current, lx, ly, surface, sx, sy) : NULL;
|
2018-05-19 22:54:50 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* container_at for a container with layout L_HORIZ or L_VERT.
|
|
|
|
*/
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
static struct sway_container *container_at_linear(struct sway_node *parent,
|
2018-05-26 16:26:10 +10:00
|
|
|
double lx, double ly,
|
2018-05-19 22:54:50 +10:00
|
|
|
struct wlr_surface **surface, double *sx, double *sy) {
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
list_t *children = node_get_children(parent);
|
|
|
|
for (int i = 0; i < children->length; ++i) {
|
|
|
|
struct sway_container *child = children->items[i];
|
2020-05-30 13:33:03 +10:00
|
|
|
struct sway_container *container =
|
|
|
|
tiling_container_at(&child->node, lx, ly, surface, sx, sy);
|
|
|
|
if (container) {
|
|
|
|
return container;
|
2017-12-11 00:48:44 +11:00
|
|
|
}
|
|
|
|
}
|
2018-05-19 22:54:50 +10:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2018-08-02 23:30:26 +10:00
|
|
|
static struct sway_container *floating_container_at(double lx, double ly,
|
2018-05-24 22:30:44 +10:00
|
|
|
struct wlr_surface **surface, double *sx, double *sy) {
|
2020-03-27 20:56:47 +11:00
|
|
|
// For outputs with floating containers that overhang the output bounds,
|
|
|
|
// those at the end of the output list appear on top of floating
|
|
|
|
// containers from other outputs, so iterate the list in reverse.
|
|
|
|
for (int i = root->outputs->length - 1; i >= 0; --i) {
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
struct sway_output *output = root->outputs->items[i];
|
|
|
|
for (int j = 0; j < output->workspaces->length; ++j) {
|
|
|
|
struct sway_workspace *ws = output->workspaces->items[j];
|
|
|
|
if (!workspace_is_visible(ws)) {
|
2018-05-25 15:39:14 +10:00
|
|
|
continue;
|
|
|
|
}
|
2018-07-20 09:41:36 +10:00
|
|
|
// Items at the end of the list are on top, so iterate the list in
|
|
|
|
// reverse.
|
2018-08-19 15:07:07 +10:00
|
|
|
for (int k = ws->floating->length - 1; k >= 0; --k) {
|
|
|
|
struct sway_container *floater = ws->floating->items[k];
|
2020-05-30 13:33:03 +10:00
|
|
|
struct sway_container *container =
|
|
|
|
tiling_container_at(&floater->node, lx, ly, surface, sx, sy);
|
|
|
|
if (container) {
|
|
|
|
return container;
|
2018-05-24 22:30:44 +10:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2021-03-04 02:17:45 +11:00
|
|
|
static struct sway_container *view_container_content_at(struct sway_node *parent,
|
|
|
|
double lx, double ly,
|
|
|
|
struct wlr_surface **surface, double *sx, double *sy) {
|
|
|
|
if (!sway_assert(node_is_view(parent), "Expected a view")) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct sway_container *container = parent->sway_container;
|
|
|
|
struct wlr_box box = {
|
2021-07-05 18:09:39 +10:00
|
|
|
.x = container->pending.content_x,
|
|
|
|
.y = container->pending.content_y,
|
|
|
|
.width = container->pending.content_width,
|
|
|
|
.height = container->pending.content_height,
|
2021-03-04 02:17:45 +11:00
|
|
|
};
|
|
|
|
|
|
|
|
if (wlr_box_contains_point(&box, lx, ly)) {
|
|
|
|
surface_at_view(parent->sway_container, lx, ly, surface, sx, sy);
|
|
|
|
return container;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static struct sway_container *view_container_at(struct sway_node *parent,
|
2020-05-30 13:33:03 +10:00
|
|
|
double lx, double ly,
|
|
|
|
struct wlr_surface **surface, double *sx, double *sy) {
|
|
|
|
if (!sway_assert(node_is_view(parent), "Expected a view")) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct sway_container *container = parent->sway_container;
|
|
|
|
struct wlr_box box = {
|
2021-07-05 18:09:39 +10:00
|
|
|
.x = container->pending.x,
|
|
|
|
.y = container->pending.y,
|
|
|
|
.width = container->pending.width,
|
|
|
|
.height = container->pending.height,
|
2020-05-30 13:33:03 +10:00
|
|
|
};
|
|
|
|
|
|
|
|
if (wlr_box_contains_point(&box, lx, ly)) {
|
|
|
|
surface_at_view(parent->sway_container, lx, ly, surface, sx, sy);
|
|
|
|
return container;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
struct sway_container *tiling_container_at(struct sway_node *parent,
|
|
|
|
double lx, double ly,
|
2018-08-02 23:30:26 +10:00
|
|
|
struct wlr_surface **surface, double *sx, double *sy) {
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
if (node_is_view(parent)) {
|
2020-05-30 13:33:03 +10:00
|
|
|
return view_container_at(parent, lx, ly, surface, sx, sy);
|
2018-08-02 23:30:26 +10:00
|
|
|
}
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
if (!node_get_children(parent)) {
|
2018-08-02 23:30:26 +10:00
|
|
|
return NULL;
|
|
|
|
}
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
switch (node_get_layout(parent)) {
|
2018-08-02 23:30:26 +10:00
|
|
|
case L_HORIZ:
|
|
|
|
case L_VERT:
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
return container_at_linear(parent, lx, ly, surface, sx, sy);
|
2018-08-02 23:30:26 +10:00
|
|
|
case L_TABBED:
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
return container_at_tabbed(parent, lx, ly, surface, sx, sy);
|
2018-08-02 23:30:26 +10:00
|
|
|
case L_STACKED:
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
return container_at_stacked(parent, lx, ly, surface, sx, sy);
|
2018-08-02 23:30:26 +10:00
|
|
|
case L_NONE:
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static bool surface_is_popup(struct wlr_surface *surface) {
|
2021-11-13 17:08:14 +11:00
|
|
|
while (!wlr_surface_is_xdg_surface(surface)) {
|
|
|
|
if (!wlr_surface_is_subsurface(surface)) {
|
|
|
|
return false;
|
2018-08-02 23:30:26 +10:00
|
|
|
}
|
2021-11-13 17:08:14 +11:00
|
|
|
struct wlr_subsurface *subsurface =
|
|
|
|
wlr_subsurface_from_wlr_surface(surface);
|
|
|
|
surface = subsurface->parent;
|
2018-08-02 23:30:26 +10:00
|
|
|
}
|
2021-11-13 17:08:14 +11:00
|
|
|
struct wlr_xdg_surface *xdg_surface =
|
|
|
|
wlr_xdg_surface_from_wlr_surface(surface);
|
|
|
|
return xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP;
|
2018-08-02 23:30:26 +10:00
|
|
|
}
|
|
|
|
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
struct sway_container *container_at(struct sway_workspace *workspace,
|
2018-08-02 23:30:26 +10:00
|
|
|
double lx, double ly,
|
|
|
|
struct wlr_surface **surface, double *sx, double *sy) {
|
2018-10-03 19:26:46 +10:00
|
|
|
struct sway_container *c;
|
2018-09-28 02:32:55 +10:00
|
|
|
|
2018-10-18 22:20:00 +11:00
|
|
|
struct sway_seat *seat = input_manager_current_seat();
|
2018-10-03 19:26:46 +10:00
|
|
|
struct sway_container *focus = seat_get_focused_container(seat);
|
|
|
|
bool is_floating = focus && container_is_floating_or_child(focus);
|
|
|
|
// Focused view's popups
|
|
|
|
if (focus && focus->view) {
|
|
|
|
c = surface_at_view(focus, lx, ly, surface, sx, sy);
|
|
|
|
if (c && surface_is_popup(*surface)) {
|
|
|
|
return c;
|
|
|
|
}
|
|
|
|
*surface = NULL;
|
|
|
|
}
|
2018-10-10 17:58:32 +11:00
|
|
|
// Floating
|
|
|
|
if ((c = floating_container_at(lx, ly, surface ,sx ,sy))) {
|
|
|
|
return c;
|
2018-08-19 21:50:33 +10:00
|
|
|
}
|
2018-10-10 17:58:32 +11:00
|
|
|
// Tiling (focused)
|
2018-10-03 19:26:46 +10:00
|
|
|
if (focus && focus->view && !is_floating) {
|
2021-03-04 02:17:45 +11:00
|
|
|
if ((c = view_container_content_at(&focus->node, lx, ly, surface, sx, sy))) {
|
2018-10-03 19:26:46 +10:00
|
|
|
return c;
|
|
|
|
}
|
|
|
|
}
|
2018-08-19 21:50:33 +10:00
|
|
|
// Tiling (non-focused)
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
if ((c = tiling_container_at(&workspace->node, lx, ly, surface, sx, sy))) {
|
2018-08-02 23:30:26 +10:00
|
|
|
return c;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2018-08-17 19:48:34 +10:00
|
|
|
void container_for_each_child(struct sway_container *container,
|
2018-03-30 14:53:38 +11:00
|
|
|
void (*f)(struct sway_container *container, void *data),
|
|
|
|
void *data) {
|
2021-02-13 09:22:51 +11:00
|
|
|
if (container->pending.children) {
|
|
|
|
for (int i = 0; i < container->pending.children->length; ++i) {
|
|
|
|
struct sway_container *child = container->pending.children->items[i];
|
2018-08-19 03:10:41 +10:00
|
|
|
f(child, data);
|
2018-08-17 19:48:34 +10:00
|
|
|
container_for_each_child(child, f, data);
|
2018-07-16 12:45:20 +10:00
|
|
|
}
|
|
|
|
}
|
2018-01-21 08:21:45 +11:00
|
|
|
}
|
2018-02-05 05:39:10 +11:00
|
|
|
|
2021-01-21 08:20:00 +11:00
|
|
|
struct sway_container *container_obstructing_fullscreen_container(struct sway_container *container)
|
|
|
|
{
|
|
|
|
struct sway_workspace *workspace = container->pending.workspace;
|
|
|
|
|
|
|
|
if (workspace && workspace->fullscreen && !container_is_fullscreen_or_child(container)) {
|
|
|
|
if (container_is_transient_for(container, workspace->fullscreen)) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
return workspace->fullscreen;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct sway_container *fullscreen_global = root->fullscreen_global;
|
|
|
|
if (fullscreen_global && container != fullscreen_global && !container_has_ancestor(container, fullscreen_global)) {
|
|
|
|
if (container_is_transient_for(container, fullscreen_global)) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
return fullscreen_global;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2018-05-28 12:45:42 +10:00
|
|
|
bool container_has_ancestor(struct sway_container *descendant,
|
|
|
|
struct sway_container *ancestor) {
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
while (descendant) {
|
2021-02-13 09:22:51 +11:00
|
|
|
descendant = descendant->pending.parent;
|
2018-05-28 12:45:42 +10:00
|
|
|
if (descendant == ancestor) {
|
2018-03-31 01:31:21 +11:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
2018-04-01 05:22:10 +10:00
|
|
|
|
2018-05-06 04:43:12 +10:00
|
|
|
void container_damage_whole(struct sway_container *container) {
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
for (int i = 0; i < root->outputs->length; ++i) {
|
|
|
|
struct sway_output *output = root->outputs->items[i];
|
|
|
|
output_damage_whole_container(output, container);
|
2018-04-06 08:31:19 +10:00
|
|
|
}
|
|
|
|
}
|
2018-05-02 23:07:52 +10:00
|
|
|
|
2018-08-19 11:01:51 +10:00
|
|
|
/**
|
|
|
|
* Return the output which will be used for scale purposes.
|
|
|
|
* This is the most recently entered output.
|
|
|
|
*/
|
2018-08-20 10:37:52 +10:00
|
|
|
struct sway_output *container_get_effective_output(struct sway_container *con) {
|
2018-08-19 11:01:51 +10:00
|
|
|
if (con->outputs->length == 0) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
return con->outputs->items[con->outputs->length - 1];
|
|
|
|
}
|
|
|
|
|
2021-08-23 06:01:10 +10:00
|
|
|
static void render_titlebar_text_texture(struct sway_output *output,
|
|
|
|
struct sway_container *con, struct wlr_texture **texture,
|
|
|
|
struct border_colors *class, bool pango_markup, char *text) {
|
2018-08-19 11:01:51 +10:00
|
|
|
double scale = output->wlr_output->scale;
|
2018-05-03 22:51:14 +10:00
|
|
|
int width = 0;
|
2021-08-19 07:27:01 +10:00
|
|
|
int height = config->font_height * scale;
|
|
|
|
int baseline;
|
2018-05-03 22:51:14 +10:00
|
|
|
|
2018-12-31 00:29:37 +11:00
|
|
|
// We must use a non-nil cairo_t for cairo_set_font_options to work.
|
|
|
|
// Therefore, we cannot use cairo_create(NULL).
|
|
|
|
cairo_surface_t *dummy_surface = cairo_image_surface_create(
|
|
|
|
CAIRO_FORMAT_ARGB32, 0, 0);
|
|
|
|
cairo_t *c = cairo_create(dummy_surface);
|
|
|
|
cairo_set_antialias(c, CAIRO_ANTIALIAS_BEST);
|
|
|
|
cairo_font_options_t *fo = cairo_font_options_create();
|
|
|
|
cairo_font_options_set_hint_style(fo, CAIRO_HINT_STYLE_FULL);
|
2020-04-20 10:56:11 +10:00
|
|
|
if (output->wlr_output->subpixel == WL_OUTPUT_SUBPIXEL_NONE) {
|
|
|
|
cairo_font_options_set_antialias(fo, CAIRO_ANTIALIAS_GRAY);
|
|
|
|
} else {
|
|
|
|
cairo_font_options_set_antialias(fo, CAIRO_ANTIALIAS_SUBPIXEL);
|
|
|
|
cairo_font_options_set_subpixel_order(fo,
|
|
|
|
to_cairo_subpixel_order(output->wlr_output->subpixel));
|
|
|
|
}
|
2018-12-31 00:29:37 +11:00
|
|
|
cairo_set_font_options(c, fo);
|
rebase: Sway 1.8 (#78)
* build: bump wlroots dependency to 0.16.0
* swaymsg: replace if with switch in pretty_print
* swaymsg: add GET_TREE pretty-printing
* swaybar: fix errno handling in status_handle_readable
If getline fails once, it was not reset before the next getline
call. errno is only overwritten by getline on error.
* Add cairo_image_surface_create error handling
cairo_image_surface_create can fail, e.g. when running out of
memory or when the size is too big. Avoid crashing in this case.
Closes: https://github.com/swaywm/sway/issues/6531
* build: bump version to 1.8-dev
Historically we've been sticking with the last release number in
the master branch. However that's a bit confusing, people can't
easily figure out whether they're using a release or a work-in-progress
snapshot. Only the commit hash appended to the version number may
help, but that's not very explicit and disappears when using a
tarball.
We could bump the version in master to the next release number.
However during the RC cycle there would be a downgrade from 1.8 to
1.8-rc1. Also it would be hard to tell the difference between a
stable release and an old snapshot.
This patch introduces a new pre-release identifier, "dev". It's
alphabetically before "rc" so it should be correctly sorted by
semver comparisons. "dev" is upgraded to "rc" (and then to stable)
when doing a release. The master branch always uses a "dev"
version, only release branches use "rc" or stable versions.
* [IPC] Add repeat delay/rate info to keyboard
Closes #6735
wlroots already has the info in the struct so let's access it and print it out.
* input/seat: unset has_focus when focus_stack becomes empty
We currently track the focus of a seat in two ways: we use a list called
focus_stack to track the order in which nodes have been focused, with
the first node representing what's currently focused, and we use a
variable called has_focus to indicate whether anything has focus--i.e.
whether we should actually treat that first node as focused at any given
time.
In a number of places, we treat has_focus as implying that a focused
node exists. If it's true, we attempt to dereference the return value of
seat_get_focus(), our helper function for getting the first node in
focus_list, with no further checks. But this isn't quite correct with
the current implementation of seat_get_focus(): not only does it return
NULL when has_focus is false, it also returns NULL when focus_stack
contains no items.
In most cases, focus_stack never becomes empty and so this doesn't
matter at all. Since focus_stack stores a history of focused nodes, we
rarely remove nodes from it. The exception to this is when a node itself
goes away. In that case, we call seat_node_destroy() to remove it from
focus_stack and free it. But we don't unset has_focus if we've removed
the final node! This lets us get into a state where has_focus is true
but seat_get_focus() returns NULL, leading to a segfault when we try to
dereference it.
Fix the issue both by updating has_focus in seat_node_destroy() and by
adding an assertion in seat_get_focus() that ensures focus_stack and
has_focus are in sync, which will make it easier to track down similar
issues in the future.
Fixes #6395.
[1] There's some discussion in #1585 from when this was implemented
about whether has_focus is actually necessary; it's possible we could
remove it entirely, but for the moment this is the architecture we have.
* swaybar: fix tray_padding vs min-height re: scale
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
* swaybar: fix tray item icon scaling, positioning
* container: Fix crash when view unmaps + maps quickly
Followup on 4e4898e90f.
If a view quickly maps and unmaps repeatedly, there will be multiple
destroyed containers with same view in a single transaction. Each of
these containers will then try to destroy this view, resulting in use
after free.
The container should only destroy the view if the view still belongs
to the container.
Simple reproducer: couple XMapWindow + XUnmapWindow in a loop followed
by XDestroyWindow.
See #6605
* commands/move: Fix crash when pos_y is omitted
Fixes #6737
* Destroy sub-surfaces with parent layer-shell surface
Closes: https://github.com/swaywm/sway/issues/6337
* Add safety assert in parse_movement_unit
Let's add this just in case a caller passes argc == 0.
References: https://github.com/swaywm/sway/issues/6737#issuecomment-1008082540
* meson: check: false on run_command
Future meson releases will change the default and warns when the
implicit default is used, breaking builds.
Explicitly set check: false to maintain behavior and silence warnings.
* Print deprecation notice when running SUID
SUID privilege drop is needed for the "builtin"-backend of libseat,
which copied our old "direct" backend behavior for the sake of
compatibility and ease of transition.
libseat now has a better alternative in the form of seatd-launch. It
uses the normal seatd daemon and libseat backend and takes care of SUID
for us.
Add a soft deprecation warning to highlight our future intent of
removing this code. The deprecation cycle is needed to avoid surprises
when sway no longer drops privileges.
* xdg-shell: use toplevel geometry to adjust the popup box
`popup_unconstrain` uses view coordinates to init the output box for
popups. However wlroots expects the box to be set in a toplevel surface
coordinate system, which is not always equal to view. The difference
between those is a window geometry set via xdg-shell.
GTK4 reserves some space for client-side decoration and thus has a
window with top left corner not matching to (0, 0) of a surface. The box
calculated without taking that into account was slightly shifted
compared to the actual output and allowed to position part of the popup
off screen.
* build: fix building with basu
02b412a introduced the use of list for sdbus deps, however
it was assuming that all packages which were in a list has a version
higher than 239. That is true for libsystemd and libelogind, since they
use the same versions, however basu is using version numbers which are
way lower than what libsystemd/libelogind are using, so basu only build
is failing.
* Upgrade for wlroots surface refactoring
See [1] for details.
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3412
* commands/focus: drop trailing whitespace
* input/cursor: count pointer gestures as idle activity
Fixes https://github.com/swaywm/sway/issues/6765.
* input/cursor: treat swipe begin as idle activity too
Accidentally overlooked in fd53f80.
* treat fullscreen windows as 'tiled' for commands/focus
* transaction: destroying nodes aren't hidden
Commit 37d7bc69986f ("transaction: Only wait for ack from visible
views") introduced a check which uses view_is_visible() to check if a view
is still visible on the screen. However view_is_visible() will early
return in case the node is in the destroying state. This is incorrect
for transactions, since a destroying view which is visible will trigger
configure events for other clients. This bug was visible when repeatedly
opening and closing two views side by side, since we ignore the
destroying node we get a frame where the still open view is shown with
the old configure values and the rest is the desktop background. The
next frame is than correct again.
Fix this by considering destroying views as visible, we correctly wait
for them and send the configure events to other views in time, fixing
the background flicker.
Fixes #6473
* build: execute wlroots subproject before finding deps
wlroots often requires dependencies more recent than Sway's.
Executing the wlroots subproject first will give Meson a chance to
find these newer dependencies, possibly via subprojects.
The subproject will override the "wlroots" dependency when executed,
so we don't need to use get_variable anymore.
References: https://github.com/swaywm/sway/pull/6498#issuecomment-1001746017
* tray: do not render passive items
https://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/StatusNotifierItem/#org.freedesktop.statusnotifieritem.status
* cmd/swap: error on swapping a container with itself
* input/cursor: pass through pointer hold gestures
This just follows swaywm/wlroots#3047, so `wl_pointer_gestures_v1`
clients can be notified of these events.
* swaynag: remove buffer destruction condition
An address of a variable can never be NULL, so checking it doesn't make
sense; and `destroy_buffer()` can operate on already destroyed buffers
anyway.
Fixes #6780
* Use bools for CLI flags
* xwayland: listen to `request_activate` event
When REAPER submenu is closed `XCB_CLIENT_MESSAGE` with type
`NET_ACTIVE_WINDOW` is sent to set focus to parent menu.
Closes: https://github.com/swaywm/sway/issues/6324
* chore: chase wlr_output_layout_get_box() update
https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3439
* Chase wlroots xdg-shell refactor
* Minor update to focus_on_window_activation
Removed xwayland limitation since wayland clients are supported via xdg-activation.
* Translated README into Italian
* readme: add link to Italian translation
* readme: sort language list alphabetically
* readme: use relative links for translations
* xdg-shell: use wlr_xdg_toplevel in sway_view
Improved type safety.
Closes: https://github.com/swaywm/sway/issues/6813
* xdg-shell: use wlr_xdg_popup in sway_xdg_popup
Improved type safety.
* Fix snprintf compiler warning
* Remove all sprintf calls
Replace them with snprintf, which ensures buffer overflows won't
happen.
* sway/commands: add missing wlr_keyboard interface include in xkb_switch_layout
* sway/input: use wlr_input_device from input device base
* Remove some erroneous apostrophes in comments
* Don't enter seatop_move_floating when fullscreen
Currently, a floating window that's been fullscreened can send us
xdg_toplevel::move, and we'll enter seatop_move_floating, which lets us
drag the surface around while it's fullscreen. We don't want
this--fullscreen surfaces should always be aligned to the screen--so add
the same check that seatop_default already does when entering this mode.
Tested with Weston's weston-fullscreen demo, which sends a move request
if you click anywhere on its surface.
* swaynag: die on all allocation failures
* sway/input: don't pass possibly invalid modifiers pointer
active_keyboard may be NULL, in which case an invalid pointer could be
passed to wlr_input_method_keyboard_grab_v2_send_modifiers. This
procedure call is unnecessary since wlroots commit 372a52ec "input
method: send modifiers in set_keyboard", so the call can simply be
removed.
Fixes #6836.
* sway/input: destroy sway_switch properly
Fix: #6861
Added seat_device_destroy function to seat_device_destroy function.
* commands/focus: fix segfault when no container is already focused.
Fixes #6690.
* Remove WLR_SWITCH_STATE_TOGGLE usage
Ref [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/commit/4792446ee8f50104bd207d9ccd8558a7e4eb4514
* Replace pcre with pcre2
Closes: https://github.com/swaywm/sway/issues/6838
* swaybar: remove swaybar_output.input_region
No need to keep the region around, we can immediately destroy it
after the wl_surface.set_input_region request.
* swaybar: set opaque region
When the background color is fully opaque, set the surface's opaque
region to the whole surface.
* Updating criteria checking with PCRE2
* swaynag: allocate button_details with details
They are used together, so it doesn't make sense to allocate them
separately.
* swaynag: statically allocate button_close, and move declaration
Every swaynag has a close button, so it doesn't make sense to
allocate it dynamically. The declaration is moved later to when
it is actually needed.
* swaynag: remove unnecessary zero of swaynag struct
Global variables are initialized to 0.
* swaynag: remove redundant status variables in main
Instead, we just use `status` for all failures.
* remove unnecessary strlen call
* sway/input/cursor: take device mm size from wlr_tablet
* sway/input/seat: take output name from specialized input device
* sway/input: follow up wlroots input device events renaming
* sway/input: fix bad position of wlr_drag
* sway/input: wlr_seat_keyboard() now takes wlr_keyboard
* bash-completion: localize variables
* sway/main: move constants off the stack
This makes stack traces from gdb slightly easier to read.
* Fix farsi label
* Avoid format-truncation warning
The existing code gives this error when compiled with GCC 12:
../sway/server.c: In function ‘server_init’:
../sway/server.c:217:75: error: ‘%d’ directive output may be truncated writing between 1 and 11 bytes into a region of size 8 [-Werror=format-truncation=]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~
../sway/server.c:217:66: note: directive argument in the range [-2147483647, 32]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~
../sway/server.c:217:17: note: ‘snprintf’ output between 10 and 20 bytes into a destination of size 16
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Because i is never negative, this is a false positive, but it is easy to
change i to unsigned to silence the error.
* Shuffle variables to satisfy -Werror=restrict
This also fixes an invalid strlen invocation on uninitialized memory.
* layer_shell: keep output non-NULL wherever possible
Our layer shell implementation assigns every layer surface to an output
on creation. It tracks this output using the output field on the
underlying wlr_layer_surface_v1 structure. As such, much of the existing
code assumes that output is always non-NULL and omits NULL checks
accordingly.
However, there are currently two cases where we destroy a
sway_layer_surface and output is NULL. The first is when we can't find
an output to assign the surface to and destroy it immediately after
creation. The second is when we destroy a surface in response to its
output getting destroyed, as we set output to NULL in
handle_output_destroy() before we call wlr_layer_surface_v1_destroy(),
which is what calls the appropriate unmap and destroy callbacks.
The former case doesn't cause any problems, since we haven't even
allocated a sway_layer_surface at that point or registered any
callbacks. The latter case, however, currently triggers a crash (#6120)
if a popup is visible, since our popup_handle_unmap() implementation
can't handle a NULL output.
To fix this issue, keep output set until right before we free the
sway_layer_surface. All we need to do is remove some of the cleanup
logic from handle_output_destroy(), since as of commit c9060bcc12d0
("layer-shell: replace close() with destroy()") that same logic is
guaranteed to be happen later when wlroots calls handle_destroy() as
part of wlr_layer_surface_v1_destroy().
This lets us remove some NULL checks from other unmap/destroy callbacks,
which is nice. We also don't need to check that the wlr_output points to
a valid sway_output anymore, since we unset that pointer after disabling
the output as of commit a0bbe67076b8 ("Address emersions comments on
output re-enabling") Just to be safe, I've added assertions that the
wlr_output is non-NULL wherever we use it.
Fixes #6120.
* Chase wlroots X11 hints update
* Add Swedish README
* Support cursor capture in grimshot
Refactor argument parser
Bring back `sh` compatibility
Default to NOTIFY=no
* Update grimshot.1.scd
Fixed typo. The object is **files**, which is plural. **image** modifies files; it's not countable.
* xkb_switch_layout: fix relative layout switches
Fixes #6011
* Implement ext-session-lock-v1
* Avoid inspecting a NULL view in seat_set_focus
Fixes #6968
* swaynag: do error checking and rename read_from_stdin
read_from_stdin not only read from stdin, but trimming trailing
newlines, so rename it to reflect this.
* swaynag: improve robustness when loading config
* swaynag: combine consecutive declaration/assignments
* config: Remove unused mouse binding structure
Mouse bindings are handled alongside normal bindings. Remove the unused
separate data structure definition to avoid confusion.
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
* Replace strncpy with memcpy
strncpy is useless here, is dangerous because it doesn't guarantee
that the string is NUL-terminated and causes the following warning:
../sway/criteria.c: In function ‘criteria_parse’:
../sway/criteria.c:712:25: error: ‘strncpy’ destination unchanged after copying no bytes [-Werror=stringop-truncation]
712 | strncpy(value, valuestart, head - valuestart);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Add descriptions for `stacking` and `tabbed` layouts
Resolves #5918
* man: Fix trailing spaces
* server: request xdg-shell v2
Wlroots does not yet support the newer xdg-shell versions and now
requires the compositor to set the supported xdg-shell version during
creation. Set this to v2 for sway as well.
Fixes https://github.com/swaywm/sway/issues/7001
* realtime: request SCHED_RR using CAP_SYS_NICE
Try to gain SCHED_RR (round-robin) realtime scheduling privileges before
starting the server. This requires CAP_SYS_NICE on Linux systems.
We additionally register a pthread_atfork callback which resets the
scheduling class back to SCHED_OTHER (the Linux system default).
Due to CAP_SYS_NICE, setting RLIMIT_RTPRIO has no effect on the process
as documented within man 7 sched (from Linux):
Privileged (CAP_SYS_NICE) threads ignore the RLIMIT_RTPRIO limit;
as with older kernels, they can make arbitrary changes to
scheduling policy and priority. See getrlimit(2) for further
information on RLIMIT_RTPRIO
Note that this requires the sway distribution packagers to set the
CAP_SYS_NICE capability on the sway binary.
Supersedes #6992
* ext-session-lock: disable direct scan-out when locked
* Polish the language in README.zh-CN.md & sync with English one
Co-Authored-By: Urey. Xue <urey.s.knowledge@gmail.com>
* De-duplicate IPC output descriptions
* Handle NULL output make/model/serial
* chore: chase wlroots xdg-shell update
* xdg-shell: schedule a configure on maximize request
This commit reverts 03879290dbee26127f6867ef60bc2a7f9a6c8c5f and
fc84bcb7fb0ffa29b1f9bed287762241a3473803.
* Add a Hindi (हिन्दी) translation to the README
Hindi is one of the most prominent languages of the Indian Subcontinent.
This commit adds the translation of the README into the Hindi language.
Some of the words are still written in English because there wasn't an
appropriate technical term of the word in the language.
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
* sway: add bindgesture command
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
* build: link with -pthread
Fixes the following FreeBSD error:
ld: error: undefined symbol: pthread_getschedparam
>>> referenced by realtime.c:25 (../sway/realtime.c:25)
>>> sway/sway.p/realtime.c.o:(set_rr_scheduling)
Fixes: a3a82efbf6b5 ("realtime: request SCHED_RR using CAP_SYS_NICE")
* ipc: remove chatty debug log messages
These aren't particularly useful, and clobber the debug logs.
* Refuse to start when SUID is detected
This ensures that those surprised by the deprecation of SUID operation
receive an error rather than accidentally having sway run as root.
This detection will be removed in a future release.
* swaynag: move close_button up to fix SIGSEGV
When swaynag_parse_options encounters '--dismiss-button' (or its
shorthand '-s'), it sets the text of the first button in the
swaynag.buttons list, which is expected to exist and to be the dismiss
button, to the one passed by the user.
Commit 4780afb68b4ee2cdf0e4925f40cf885819f8a74a ("swaynag: statically
allocate button_close, and move declaration") moved the list
initialization to after swaynag_parse_options is called which made that
code fail.
For example, the command 'swaynag --dismiss-button Dismiss' crashes and
'swaynag --message Message --button Yes "" --dismiss-button Dismiss'
shows the wrong buttons.
Move it back to before swaynag_parse_options is called.
* config/output: use wlr_output_commit_state
This makes the code more robust because we don't potentially leave
bad state in wlr_output.pending behind anymore. This also fixes a
bug.
Closes: https://github.com/swaywm/sway/issues/7043
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3610
* Allocate enough space for `cmd_results->error`
* Remove access to wlr_input_device union
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3626
Closes: https://github.com/swaywm/sway/issues/7077
* Rename dpms output command to power
The "dpms" command refers to VESA Display Power Management
Signaling, a deprecated standard. It's superseded by VESA DPM.
Instead of tying out command name to a particular standard, use the
neutral term "power".
* Strip quotes in bindsym --input-device=...
If the input device is quoted, which is common when using variables in the
config file, those quotes must be ignored here, or the input device will be
ignored.
Fixes #7029.
* Avoid unecessary string copy
* Reject font values that are invalid for pango
Use pango to parse font configuration early, and reject the command as
invalid if the value is invalid for pango. Since we're already parsing
the font into a `PangoFontDescription`, keep that instance around and
avoid re-parsing the font each time we render text.
Fixes: https://github.com/swaywm/sway/issues/6805
* Reuse parsed PangoFontDescription
Avoids parsing the configured font each time text is rendered.
* ipc: add "power" to output reply
* config.in: switch to `output power`
* Remove internal references to DPMS
While at it, use an int for the config field, just like we do for
all other fields.
* fix: remove redundant empty statement in main.c
This semi-colon looks like a typo. Luckily, it has no effect on the code as it's treated as an empty statement leading the switch case.
Really straightforward nitpick change, was just something I was confused by when reading over the code.
* input: chase delta_discrete semantics change
* swaymsg: fix floating_nodes being ignored
Fix floating_nodes being ignored in pretty_print_tree.
* ipc: make get_deco_rect check config->hide_lone_tab
Without this, the `IPC_GET_TREE` ipc call would return false information
about the container's `deco_rect` and `rect` properties if
`hide_edge_borders --i3` was in effect.
* grimshot: fix tilde expansion within quotes
* Enable single-pixel-buffer-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3428
* sway-output.5: improve display of parameter
Since "width" and "height" are separate parameters, show them as such.
* man: sway(5) move fixes
* ipc: drop WLR_OUTPUT_ADAPTIVE_SYNC_UNKNOWN case
This has been removed from wlroots.
* config/output: test adaptive sync
Required for [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3637
* Fix crash in xdg_activation_v1.c
wlr_xdg_surface_from_wlr_surface() can return a NULL pointer, so check for NULL before dereferencing it.
* sway: Add non-desktop-output type
Currently, when encountering a non-desktop display, sway offers the
output for leasing and returns without storing it in a sway specific
output type like `struct sway_output`. Additionally, running
`swaymsg -t get_outputs` doesn't show non-desktop outputs.
This commit stores the non-desktop outputs into a struct called
`sway_output_non_desktop`, and adds them to a list on `sway_root`
* sway: add non-desktop outputs to json when running `swaymsg -t get_outputs`
* swaymsg: show non-desktop property when pretty printing outputs
* man: Add XWayland information
* ipc: expose mode picture aspect ratio
* swaymsg: show mode picture aspect ratio
* build: simplify protocol paths
No need for arrays here.
* sway/commands/output: Add command for unplugging non-physical outputs
* Improve Japanese translation
* allow pointer_constraints on layer_shell surfaces
* check for NULL
* use seat directly
* Use keyboard_state.focused_surface directly
* input: focus floating container when clicked on border
Fixes #7209.
* input: focus container when scrolling on titlebar
Fixes #6503.
* Fix leaks in criteria_destroy()
* Avoid double free in criteria_destroy()
* Add support for ext-idle-notify-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3753
* input: tweak focus behavior to allow focusing parent containers
Sway focuses the inactive child when focusing split containers. However,
there is currently no way to focus the parent container itself by mouse.
A user must use the keyboard to do so.
This commit maintains the current behavior, but makes it such that a
second click on the split container titlebar (i.e., after its children
are visible) focuses the split container itself.
* Fix keymap being NULL and segfaulting on dev add
Moved `libinput_config` to the callers of
`sway_input_configure_libinput_device` so that we send the event after
the added event.
* Rework session lock keyboard focus handling
When removing outputs, it is possible to end up in a situation where
none of the session lock client's surfaces have keyboard focus,
resulting in it not receiving keyboard events. Track the focused
surface and update it as needed on surface destroy.
* Fix focus tracking when session lock is active
Remove the incorrect attempt to block focus changes when an input grab
is present and replace it with the same logic used for layer_shell-based
screen lockers: restore the focus after changing it.
This fixes a use-after-free of seat->workspace if outputs are destroyed
while a screen lock is enabled.
* container_floating_set_default_size: Store workspace size box on the stack
* Support libinput's 1.21 new dwtp option
Support the new dwtp (disable while trackpointing) option introduced in
libinput 1.21, allowing users to control whether the trackpoint (like
those in Thinkpads, but not only) should be disabled while using the
keyboard/touchpad.
See: https://gitlab.freedesktop.org/libinput/libinput/-/issues/731
* tree: support formatting null titles
Any windows that have never had a title set visually behave closer to
that of an empty title, but are unformattable, as the code bails out
early on a NULL title.
* criteria: allow matching on empty (NULL) titles
* criteria: allow matching for NULL string criteria
* ci: install hwdata
* Use wl_signal_emit_mutable()
This function fixes segfaults when emitting a signal potentially
removes arbitrary listeners.
* Use wlr_damage_ring
wlr_output_damage is to be replaced with wlr_damage_ring, so use that.
* lock: fix crash on output destroy
Closes: https://github.com/swaywm/sway/issues/7120
* container_get_siblings: handle NULL workspace
* ci: checkout wlroots 0.16.0
* workspace_create: Don't allow NULL name
(cherry picked from commit 34933bb84350fe805d82276ea02d5732546e9993)
* output: set damage ring bounds to pixel values
Fixes: https://github.com/swaywm/sway/issues/7254
(cherry picked from commit 85005b52fe5b832e4ea914fa28048b0c5c803769)
* Use shm_open instead of mkstemp
shm_open is more reliable because it does not require
a writeable filesystem folder, unlike mkstemp.
(cherry picked from commit e2bc8866f46701e9c825ad7fa5baac02b2e4898f)
* build: drop wayland-scanner fallback
(cherry picked from commit 366f6ef3d31688631dc453028e108f98a1d7ab57)
* build: unify server & client protocol generation
No need to make a difference here, let's just generate header
files for both.
(cherry picked from commit 5be5a038da8a3789a19945719f2a27233291445d)
* build: drop "server" from target name for protocol code
(cherry picked from commit e5475d9310941ce88ed016ce1515b36e3a440252)
* build: drop intermediate libraries for protocols
(cherry picked from commit af8a5a8918ef42336194fb1077b008a736de7af9)
* root: move the workspace matching code to its own file
This removes the pid_workspace bits from tree/root before it gets
too interesting.
No functional change.
(cherry picked from commit eb5021ef990fb29ff86544aea58d687ad62c757a)
* node: prettify node type names
(cherry picked from commit 1c4b94ae3ca94b972410c80a61404a347af1ee68)
* launcher: track workspaces by node
This removes the need to rename the pid_workspaces when a workspace
is renamed.
It also opens the possibility of tracking other node types. Tracking
containers would allow application to be placed correctly in the
container tree even if the user has moved their focus elsewhere since
it was launched.
(cherry picked from commit 3b49f2782e8faf68766269b9c7390b16e25ae824)
* launcher: use xdga tokens
This reuses wlroots token tracking for workspace matching. It doesn't
export any xdga tokens for clients yet.
(cherry picked from commit bd66f4943da1c96edc3ba49573e27b42b688c543)
* launcher: rename pid_workspace to launcher_ctx
Soon we will match views with more than just a pid.
(cherry picked from commit d75c9f9722389d441fd24bd490c5cf12c4bef39a)
* view: associate launch contexts with views
Views now maintain a reference to a launch context which, as a last
resort, is populated at map time with a context associated with its pid.
This opens the possibility of populating it before map via another
source, e.g. xdga-tokens or configuration.
(cherry picked from commit 864b3a9a18f236f92f1898bb44ab977ceaebfd68)
* launcher: initialize launcher_ctxs once on startup
(cherry picked from commit 66568508c06267445489d655c91c94a34d6d9ffe)
* launcher: fudge the interface a bit
We want to create a context before knowing the pid it will match with.
(cherry picked from commit bdeb9f95651f6c99cc2f4cfb59020ddee202cf36)
* launcher: export xdga tokens and use them for workspace matching
(cherry picked from commit 30ad4dc4a5a41ce7c7aa85096a6e18f374172983)
* launcher: export X startup ids and use them for workspace matching
(cherry picked from commit 28fda4c0d38907fab94dc7d82c9dcf0754748b4e)
* swaybar: Prioritize hotspot events to bar bindings
This is consistent with i3bar's behaviour, and for example, allows binding a
command to button1, while still being able to click on tray icons or other
zones on the bar's status line which may have their own bindings.
E.g., in Sway, without this commit, this config. makes tray icons unclickable:
bar {
# ...
bindsym button1 exec swaynag -m You_clicked_the_tray._Want_some_help?
}
But the same configuration in i3 (with i3-nagbar) keeps tray items clickable.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 53f9dbd424dc173a85c9f4cd30802259d38b1ef4)
* swaybar: Make hotspots block bar release bindings
The previous commit prioritized hotspots before bar bindings for press events,
which matches i3's behaviour. However, since hotspots don't need to do any
processing on release events, those were not handled, and simply fell through
to `bindsym --release` bar bindings (if any).
This is counter-intuitive, and doesn't match i3's behaviour. Instead in case
a hotspot handles the press event, it should also handle the release event,
doing nothing, but blocking the event from triggering a --release bar binding.
E.g., in Sway, without this commit, this config. shows a text on tray clicks:
bar {
# ...
bindsym --release button1 exec swaynag -m I_got_the_release_event.
}
But the same configuration in i3 (with i3-nagbar) doesn't show the text.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 94b69acf0d7b26ee5af2172300cb18473508da76)
* build: drop unused wayland-egl dependency
(cherry picked from commit 37e4a3d6370dc6ba2b0877d588845c06781e880e)
* build: bump version to 1.8-rc1
* Fix build on Debian Stable
(cherry picked from commit dca0bb5749bc16f91ab964fc1b06ebb9a453368f)
* build: fix have_xwayland when xcb-icccm is not found
xcb-icccm is required to build Xwayland support.
Backported from commit d41f11e6bd8cef80f02dda4c66d4a31611aed753.
* build: bump version to 1.8-rc2
* seat: Avoid sending redundant keymaps on reload
When we reload the config, we reset every input device and re-apply
configuration from the config file. This means that the keyboard keymap
is updated at least once during config reload, more if the config file
contains keyboard configuration.
When they keyboard keymap changes and is updated through wlr_seat, the
keymap ends up sent to every keyboard bound in every client, seemingly
multiple times. On an x230 of mine with a keyboard layout set in the
config file, I see 42 keymap events sent to foot on config reload.
Reduce events from keyboard configurations by skipping all but the
currently active keyboard for the seat, and by clearing the active
keyboard during input manager device reset. After this change, I only
see a single just-in-time keymap event.
Fixes: https://github.com/swaywm/sway/issues/6654
* criteria: be lenient on window_role and instance too
* build: bump version to 1.8-rc3
* commands/move: Warp cursor after moving workspace to another output
This makes sway's behavior consistent with i3 when `mouse_warping` is
set to any value besides `none`.
Fixes #7027.
(cherry picked from commit e3c63bf58d0744dfb436f0f38442ce3735e40f47)
* seat: Set keyboard if seat keyboard is NULL
sway sends wl_keyboard.enter on seat focus change and when a keyboard
active on a seat is configured. If all keyboards are removed and a
keyboard is added back without changing the focused client, no new
notify event would be sent despite having keyboard focus. This could
lead to key events without notify, which is a protocol violation.
As a quick fix, when configuring a keyboard on a seat where no keyboard
is currently active, activate the keyboard so that a focused surface
will receive a notify event.
Regressed by: e1b268af98edeb09e570e8855ef64f0719cbafe2
Closes: https://github.com/swaywm/sway/issues/7330
(cherry picked from commit 1ade0ce753dc5f588584f444ce80d27c3b1e4300)
* build: bump version to 1.8-rc4
* swaynag: fix NULL font description
The font description was only set if provided on the CLI. It was
left NULL for the defaults and when reading from the config file.
Closes: https://github.com/swaywm/sway/issues/7186
(cherry picked from commit fd0af78e43f4dd67a404f475c676b25ae38a4b82)
* build: bump version to 1.8
* Removed other README languages
* Fixed build issues
* Removed alpha from render_data struct
* Updated PKGBUILDs and COPR spec
* Update sway/desktop/render.c
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
* Fixed deco_data not being initialized properly
* Replaced wlr_egl_(make|unset)_current with eglMakeCurrent
* Added matrix_projection into fx_renderer
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: Sefa Eyeoglu <contact@scrumplex.net>
Co-authored-by: Simon Ser <contact@emersion.fr>
Co-authored-by: Seth Barberee <seth.barberee@gmail.com>
Co-authored-by: Thomas Hebb <tommyhebb@gmail.com>
Co-authored-by: Nathan Schulte <nmschulte@gmail.com>
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
Co-authored-by: David Rosca <nowrep@gmail.com>
Co-authored-by: David96 <david@hameipe.de>
Co-authored-by: Kenny Levinsen <kl@kl.wtf>
Co-authored-by: Aleksei Bavshin <alebastr89@gmail.com>
Co-authored-by: Kirill Chibisov <contact@kchibisov.com>
Co-authored-by: Tudor Brindus <me@tbrindus.ca>
Co-authored-by: Patrick Hilhorst <git@hilhorst.be>
Co-authored-by: Rouven Czerwinski <rouven@czerwinskis.de>
Co-authored-by: Tobias Bengfort <tobias.bengfort@posteo.de>
Co-authored-by: Ronan Pigott <rpigott@berkeley.edu>
Co-authored-by: Kirill Primak <vyivel@eclair.cafe>
Co-authored-by: Tuomas Yrjölä <mail@yrhki.fi>
Co-authored-by: Kirill Primak <vyivel@posteo.net>
Co-authored-by: Alexander Browne <elcste@users.noreply.github.com>
Co-authored-by: Marco Rubin <20150305+Rubo3@users.noreply.github.com>
Co-authored-by: Muhamed Hobi <woohoomoo2u@gmail.com>
Co-authored-by: Simon Zeni <simon@bl4ckb0ne.ca>
Co-authored-by: Nihal Jere <nihal@nihaljere.xyz>
Co-authored-by: Alexander Gramiak <agrambot@gmail.com>
Co-authored-by: Moon Sungjoon <sumoon@seoulsaram.org>
Co-authored-by: Nicolas Avrutin <nicolas@avrutin.net>
Co-authored-by: ndren <andreien@ctemplar.com>
Co-authored-by: Bill Li <billli11hkb@gmail.com>
Co-authored-by: Leonardo Hernández Hernández <leohdz172@protonmail.com>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Co-authored-by: Manuel Stoeckl <code@mstoeckl.com>
Co-authored-by: Yasin Silavi <59373143+sttatusx@users.noreply.github.com>
Co-authored-by: Daniel De Graaf <code@danieldg.net>
Co-authored-by: kraftwerk28 <kefirchik3@gmail.com>
Co-authored-by: Eskil <67291226+eschillus@users.noreply.github.com>
Co-authored-by: Alice Carroll <git@alice-carroll.pet>
Co-authored-by: Alan <51193876+Pound-Hash@users.noreply.github.com>
Co-authored-by: Victor Makarov <vitja.makarov@gmail.com>
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: -k <slowdive@me.com>
Co-authored-by: Hongyi <61831273+FrozenArcher@users.noreply.github.com>
Co-authored-by: Urey. Xue <urey.s.knowledge@gmail.com>
Co-authored-by: LordRishav <75823494+LordRishav@users.noreply.github.com>
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
Co-authored-by: Florian Franzen <Florian.Franzen@gmail.com>
Co-authored-by: Greg Depoire--Ferrer <greg@gregdf.com>
Co-authored-by: Thomas Jost <schnouki@schnouki.net>
Co-authored-by: Hugo Osvaldo Barrera <hugo@barrera.io>
Co-authored-by: zkldi <ktchidev@gmail.com>
Co-authored-by: llyyr <llyyr.public@gmail.com>
Co-authored-by: Baltazár Radics <baltazar.radics@gmail.com>
Co-authored-by: Martin Michlmayr <tbm@cyrius.com>
Co-authored-by: Filip Szczepański <jazz2rulez@gmail.com>
Co-authored-by: Alex Maese <memaese@hotmail.com>
Co-authored-by: マリウス <marius@xn--gckvb8fzb.com>
Co-authored-by: Andri Yngvason <andri@yngvason.is>
Co-authored-by: ohno418 <yutaro.ono.418@gmail.com>
Co-authored-by: Ferdinand Schober <ferdinand.schober@fau.de>
Co-authored-by: cparm <armelcadetpetit@gmail.com>
Co-authored-by: Yaroslav de la Peña Smirnov <yps@yaroslavps.com>
Co-authored-by: Alexander Orzechowski <orzechowski.alexander@gmail.com>
Co-authored-by: pudiva chip líquida <pudiva@skylittlesystem.org>
Co-authored-by: Puck Meerburg <puck@puckipedia.com>
Co-authored-by: Callum Andrew <calcium@mailbox.org>
Co-authored-by: Ronan Pigott <ronan@rjp.ie>
Co-authored-by: Joan Bruguera <joanbrugueram@gmail.com>
Co-authored-by: nerdopolis <bluescreen_avenger@verizon.net>
Co-authored-by: Ankit Pandey <anpandey@protonmail.com>
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
2023-01-05 09:32:43 +11:00
|
|
|
get_text_size(c, config->font_description, &width, NULL, &baseline, scale,
|
2021-09-05 01:16:55 +10:00
|
|
|
config->pango_markup, "%s", text);
|
2018-12-31 00:29:37 +11:00
|
|
|
cairo_surface_destroy(dummy_surface);
|
2018-05-03 22:51:14 +10:00
|
|
|
cairo_destroy(c);
|
|
|
|
|
2021-04-21 01:21:05 +10:00
|
|
|
if (width == 0 || height == 0) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-08-19 07:27:01 +10:00
|
|
|
if (height > config->font_height * scale) {
|
|
|
|
height = config->font_height * scale;
|
|
|
|
}
|
|
|
|
|
2018-05-02 23:07:52 +10:00
|
|
|
cairo_surface_t *surface = cairo_image_surface_create(
|
|
|
|
CAIRO_FORMAT_ARGB32, width, height);
|
2021-12-21 22:05:05 +11:00
|
|
|
cairo_status_t status = cairo_surface_status(surface);
|
|
|
|
if (status != CAIRO_STATUS_SUCCESS) {
|
|
|
|
sway_log(SWAY_ERROR, "cairo_image_surface_create failed: %s",
|
|
|
|
cairo_status_to_string(status));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-05-02 23:07:52 +10:00
|
|
|
cairo_t *cairo = cairo_create(surface);
|
2018-09-21 13:37:08 +10:00
|
|
|
cairo_set_antialias(cairo, CAIRO_ANTIALIAS_BEST);
|
|
|
|
cairo_set_font_options(cairo, fo);
|
|
|
|
cairo_font_options_destroy(fo);
|
2018-05-03 22:12:26 +10:00
|
|
|
cairo_set_source_rgba(cairo, class->background[0], class->background[1],
|
|
|
|
class->background[2], class->background[3]);
|
|
|
|
cairo_paint(cairo);
|
2018-05-02 23:07:52 +10:00
|
|
|
PangoContext *pango = pango_cairo_create_context(cairo);
|
2018-05-03 22:14:17 +10:00
|
|
|
cairo_set_source_rgba(cairo, class->text[0], class->text[1],
|
|
|
|
class->text[2], class->text[3]);
|
2021-08-19 07:27:01 +10:00
|
|
|
cairo_move_to(cairo, 0, config->font_baseline * scale - baseline);
|
2018-05-02 23:07:52 +10:00
|
|
|
|
rebase: Sway 1.8 (#78)
* build: bump wlroots dependency to 0.16.0
* swaymsg: replace if with switch in pretty_print
* swaymsg: add GET_TREE pretty-printing
* swaybar: fix errno handling in status_handle_readable
If getline fails once, it was not reset before the next getline
call. errno is only overwritten by getline on error.
* Add cairo_image_surface_create error handling
cairo_image_surface_create can fail, e.g. when running out of
memory or when the size is too big. Avoid crashing in this case.
Closes: https://github.com/swaywm/sway/issues/6531
* build: bump version to 1.8-dev
Historically we've been sticking with the last release number in
the master branch. However that's a bit confusing, people can't
easily figure out whether they're using a release or a work-in-progress
snapshot. Only the commit hash appended to the version number may
help, but that's not very explicit and disappears when using a
tarball.
We could bump the version in master to the next release number.
However during the RC cycle there would be a downgrade from 1.8 to
1.8-rc1. Also it would be hard to tell the difference between a
stable release and an old snapshot.
This patch introduces a new pre-release identifier, "dev". It's
alphabetically before "rc" so it should be correctly sorted by
semver comparisons. "dev" is upgraded to "rc" (and then to stable)
when doing a release. The master branch always uses a "dev"
version, only release branches use "rc" or stable versions.
* [IPC] Add repeat delay/rate info to keyboard
Closes #6735
wlroots already has the info in the struct so let's access it and print it out.
* input/seat: unset has_focus when focus_stack becomes empty
We currently track the focus of a seat in two ways: we use a list called
focus_stack to track the order in which nodes have been focused, with
the first node representing what's currently focused, and we use a
variable called has_focus to indicate whether anything has focus--i.e.
whether we should actually treat that first node as focused at any given
time.
In a number of places, we treat has_focus as implying that a focused
node exists. If it's true, we attempt to dereference the return value of
seat_get_focus(), our helper function for getting the first node in
focus_list, with no further checks. But this isn't quite correct with
the current implementation of seat_get_focus(): not only does it return
NULL when has_focus is false, it also returns NULL when focus_stack
contains no items.
In most cases, focus_stack never becomes empty and so this doesn't
matter at all. Since focus_stack stores a history of focused nodes, we
rarely remove nodes from it. The exception to this is when a node itself
goes away. In that case, we call seat_node_destroy() to remove it from
focus_stack and free it. But we don't unset has_focus if we've removed
the final node! This lets us get into a state where has_focus is true
but seat_get_focus() returns NULL, leading to a segfault when we try to
dereference it.
Fix the issue both by updating has_focus in seat_node_destroy() and by
adding an assertion in seat_get_focus() that ensures focus_stack and
has_focus are in sync, which will make it easier to track down similar
issues in the future.
Fixes #6395.
[1] There's some discussion in #1585 from when this was implemented
about whether has_focus is actually necessary; it's possible we could
remove it entirely, but for the moment this is the architecture we have.
* swaybar: fix tray_padding vs min-height re: scale
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
* swaybar: fix tray item icon scaling, positioning
* container: Fix crash when view unmaps + maps quickly
Followup on 4e4898e90f.
If a view quickly maps and unmaps repeatedly, there will be multiple
destroyed containers with same view in a single transaction. Each of
these containers will then try to destroy this view, resulting in use
after free.
The container should only destroy the view if the view still belongs
to the container.
Simple reproducer: couple XMapWindow + XUnmapWindow in a loop followed
by XDestroyWindow.
See #6605
* commands/move: Fix crash when pos_y is omitted
Fixes #6737
* Destroy sub-surfaces with parent layer-shell surface
Closes: https://github.com/swaywm/sway/issues/6337
* Add safety assert in parse_movement_unit
Let's add this just in case a caller passes argc == 0.
References: https://github.com/swaywm/sway/issues/6737#issuecomment-1008082540
* meson: check: false on run_command
Future meson releases will change the default and warns when the
implicit default is used, breaking builds.
Explicitly set check: false to maintain behavior and silence warnings.
* Print deprecation notice when running SUID
SUID privilege drop is needed for the "builtin"-backend of libseat,
which copied our old "direct" backend behavior for the sake of
compatibility and ease of transition.
libseat now has a better alternative in the form of seatd-launch. It
uses the normal seatd daemon and libseat backend and takes care of SUID
for us.
Add a soft deprecation warning to highlight our future intent of
removing this code. The deprecation cycle is needed to avoid surprises
when sway no longer drops privileges.
* xdg-shell: use toplevel geometry to adjust the popup box
`popup_unconstrain` uses view coordinates to init the output box for
popups. However wlroots expects the box to be set in a toplevel surface
coordinate system, which is not always equal to view. The difference
between those is a window geometry set via xdg-shell.
GTK4 reserves some space for client-side decoration and thus has a
window with top left corner not matching to (0, 0) of a surface. The box
calculated without taking that into account was slightly shifted
compared to the actual output and allowed to position part of the popup
off screen.
* build: fix building with basu
02b412a introduced the use of list for sdbus deps, however
it was assuming that all packages which were in a list has a version
higher than 239. That is true for libsystemd and libelogind, since they
use the same versions, however basu is using version numbers which are
way lower than what libsystemd/libelogind are using, so basu only build
is failing.
* Upgrade for wlroots surface refactoring
See [1] for details.
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3412
* commands/focus: drop trailing whitespace
* input/cursor: count pointer gestures as idle activity
Fixes https://github.com/swaywm/sway/issues/6765.
* input/cursor: treat swipe begin as idle activity too
Accidentally overlooked in fd53f80.
* treat fullscreen windows as 'tiled' for commands/focus
* transaction: destroying nodes aren't hidden
Commit 37d7bc69986f ("transaction: Only wait for ack from visible
views") introduced a check which uses view_is_visible() to check if a view
is still visible on the screen. However view_is_visible() will early
return in case the node is in the destroying state. This is incorrect
for transactions, since a destroying view which is visible will trigger
configure events for other clients. This bug was visible when repeatedly
opening and closing two views side by side, since we ignore the
destroying node we get a frame where the still open view is shown with
the old configure values and the rest is the desktop background. The
next frame is than correct again.
Fix this by considering destroying views as visible, we correctly wait
for them and send the configure events to other views in time, fixing
the background flicker.
Fixes #6473
* build: execute wlroots subproject before finding deps
wlroots often requires dependencies more recent than Sway's.
Executing the wlroots subproject first will give Meson a chance to
find these newer dependencies, possibly via subprojects.
The subproject will override the "wlroots" dependency when executed,
so we don't need to use get_variable anymore.
References: https://github.com/swaywm/sway/pull/6498#issuecomment-1001746017
* tray: do not render passive items
https://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/StatusNotifierItem/#org.freedesktop.statusnotifieritem.status
* cmd/swap: error on swapping a container with itself
* input/cursor: pass through pointer hold gestures
This just follows swaywm/wlroots#3047, so `wl_pointer_gestures_v1`
clients can be notified of these events.
* swaynag: remove buffer destruction condition
An address of a variable can never be NULL, so checking it doesn't make
sense; and `destroy_buffer()` can operate on already destroyed buffers
anyway.
Fixes #6780
* Use bools for CLI flags
* xwayland: listen to `request_activate` event
When REAPER submenu is closed `XCB_CLIENT_MESSAGE` with type
`NET_ACTIVE_WINDOW` is sent to set focus to parent menu.
Closes: https://github.com/swaywm/sway/issues/6324
* chore: chase wlr_output_layout_get_box() update
https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3439
* Chase wlroots xdg-shell refactor
* Minor update to focus_on_window_activation
Removed xwayland limitation since wayland clients are supported via xdg-activation.
* Translated README into Italian
* readme: add link to Italian translation
* readme: sort language list alphabetically
* readme: use relative links for translations
* xdg-shell: use wlr_xdg_toplevel in sway_view
Improved type safety.
Closes: https://github.com/swaywm/sway/issues/6813
* xdg-shell: use wlr_xdg_popup in sway_xdg_popup
Improved type safety.
* Fix snprintf compiler warning
* Remove all sprintf calls
Replace them with snprintf, which ensures buffer overflows won't
happen.
* sway/commands: add missing wlr_keyboard interface include in xkb_switch_layout
* sway/input: use wlr_input_device from input device base
* Remove some erroneous apostrophes in comments
* Don't enter seatop_move_floating when fullscreen
Currently, a floating window that's been fullscreened can send us
xdg_toplevel::move, and we'll enter seatop_move_floating, which lets us
drag the surface around while it's fullscreen. We don't want
this--fullscreen surfaces should always be aligned to the screen--so add
the same check that seatop_default already does when entering this mode.
Tested with Weston's weston-fullscreen demo, which sends a move request
if you click anywhere on its surface.
* swaynag: die on all allocation failures
* sway/input: don't pass possibly invalid modifiers pointer
active_keyboard may be NULL, in which case an invalid pointer could be
passed to wlr_input_method_keyboard_grab_v2_send_modifiers. This
procedure call is unnecessary since wlroots commit 372a52ec "input
method: send modifiers in set_keyboard", so the call can simply be
removed.
Fixes #6836.
* sway/input: destroy sway_switch properly
Fix: #6861
Added seat_device_destroy function to seat_device_destroy function.
* commands/focus: fix segfault when no container is already focused.
Fixes #6690.
* Remove WLR_SWITCH_STATE_TOGGLE usage
Ref [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/commit/4792446ee8f50104bd207d9ccd8558a7e4eb4514
* Replace pcre with pcre2
Closes: https://github.com/swaywm/sway/issues/6838
* swaybar: remove swaybar_output.input_region
No need to keep the region around, we can immediately destroy it
after the wl_surface.set_input_region request.
* swaybar: set opaque region
When the background color is fully opaque, set the surface's opaque
region to the whole surface.
* Updating criteria checking with PCRE2
* swaynag: allocate button_details with details
They are used together, so it doesn't make sense to allocate them
separately.
* swaynag: statically allocate button_close, and move declaration
Every swaynag has a close button, so it doesn't make sense to
allocate it dynamically. The declaration is moved later to when
it is actually needed.
* swaynag: remove unnecessary zero of swaynag struct
Global variables are initialized to 0.
* swaynag: remove redundant status variables in main
Instead, we just use `status` for all failures.
* remove unnecessary strlen call
* sway/input/cursor: take device mm size from wlr_tablet
* sway/input/seat: take output name from specialized input device
* sway/input: follow up wlroots input device events renaming
* sway/input: fix bad position of wlr_drag
* sway/input: wlr_seat_keyboard() now takes wlr_keyboard
* bash-completion: localize variables
* sway/main: move constants off the stack
This makes stack traces from gdb slightly easier to read.
* Fix farsi label
* Avoid format-truncation warning
The existing code gives this error when compiled with GCC 12:
../sway/server.c: In function ‘server_init’:
../sway/server.c:217:75: error: ‘%d’ directive output may be truncated writing between 1 and 11 bytes into a region of size 8 [-Werror=format-truncation=]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~
../sway/server.c:217:66: note: directive argument in the range [-2147483647, 32]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~
../sway/server.c:217:17: note: ‘snprintf’ output between 10 and 20 bytes into a destination of size 16
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Because i is never negative, this is a false positive, but it is easy to
change i to unsigned to silence the error.
* Shuffle variables to satisfy -Werror=restrict
This also fixes an invalid strlen invocation on uninitialized memory.
* layer_shell: keep output non-NULL wherever possible
Our layer shell implementation assigns every layer surface to an output
on creation. It tracks this output using the output field on the
underlying wlr_layer_surface_v1 structure. As such, much of the existing
code assumes that output is always non-NULL and omits NULL checks
accordingly.
However, there are currently two cases where we destroy a
sway_layer_surface and output is NULL. The first is when we can't find
an output to assign the surface to and destroy it immediately after
creation. The second is when we destroy a surface in response to its
output getting destroyed, as we set output to NULL in
handle_output_destroy() before we call wlr_layer_surface_v1_destroy(),
which is what calls the appropriate unmap and destroy callbacks.
The former case doesn't cause any problems, since we haven't even
allocated a sway_layer_surface at that point or registered any
callbacks. The latter case, however, currently triggers a crash (#6120)
if a popup is visible, since our popup_handle_unmap() implementation
can't handle a NULL output.
To fix this issue, keep output set until right before we free the
sway_layer_surface. All we need to do is remove some of the cleanup
logic from handle_output_destroy(), since as of commit c9060bcc12d0
("layer-shell: replace close() with destroy()") that same logic is
guaranteed to be happen later when wlroots calls handle_destroy() as
part of wlr_layer_surface_v1_destroy().
This lets us remove some NULL checks from other unmap/destroy callbacks,
which is nice. We also don't need to check that the wlr_output points to
a valid sway_output anymore, since we unset that pointer after disabling
the output as of commit a0bbe67076b8 ("Address emersions comments on
output re-enabling") Just to be safe, I've added assertions that the
wlr_output is non-NULL wherever we use it.
Fixes #6120.
* Chase wlroots X11 hints update
* Add Swedish README
* Support cursor capture in grimshot
Refactor argument parser
Bring back `sh` compatibility
Default to NOTIFY=no
* Update grimshot.1.scd
Fixed typo. The object is **files**, which is plural. **image** modifies files; it's not countable.
* xkb_switch_layout: fix relative layout switches
Fixes #6011
* Implement ext-session-lock-v1
* Avoid inspecting a NULL view in seat_set_focus
Fixes #6968
* swaynag: do error checking and rename read_from_stdin
read_from_stdin not only read from stdin, but trimming trailing
newlines, so rename it to reflect this.
* swaynag: improve robustness when loading config
* swaynag: combine consecutive declaration/assignments
* config: Remove unused mouse binding structure
Mouse bindings are handled alongside normal bindings. Remove the unused
separate data structure definition to avoid confusion.
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
* Replace strncpy with memcpy
strncpy is useless here, is dangerous because it doesn't guarantee
that the string is NUL-terminated and causes the following warning:
../sway/criteria.c: In function ‘criteria_parse’:
../sway/criteria.c:712:25: error: ‘strncpy’ destination unchanged after copying no bytes [-Werror=stringop-truncation]
712 | strncpy(value, valuestart, head - valuestart);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Add descriptions for `stacking` and `tabbed` layouts
Resolves #5918
* man: Fix trailing spaces
* server: request xdg-shell v2
Wlroots does not yet support the newer xdg-shell versions and now
requires the compositor to set the supported xdg-shell version during
creation. Set this to v2 for sway as well.
Fixes https://github.com/swaywm/sway/issues/7001
* realtime: request SCHED_RR using CAP_SYS_NICE
Try to gain SCHED_RR (round-robin) realtime scheduling privileges before
starting the server. This requires CAP_SYS_NICE on Linux systems.
We additionally register a pthread_atfork callback which resets the
scheduling class back to SCHED_OTHER (the Linux system default).
Due to CAP_SYS_NICE, setting RLIMIT_RTPRIO has no effect on the process
as documented within man 7 sched (from Linux):
Privileged (CAP_SYS_NICE) threads ignore the RLIMIT_RTPRIO limit;
as with older kernels, they can make arbitrary changes to
scheduling policy and priority. See getrlimit(2) for further
information on RLIMIT_RTPRIO
Note that this requires the sway distribution packagers to set the
CAP_SYS_NICE capability on the sway binary.
Supersedes #6992
* ext-session-lock: disable direct scan-out when locked
* Polish the language in README.zh-CN.md & sync with English one
Co-Authored-By: Urey. Xue <urey.s.knowledge@gmail.com>
* De-duplicate IPC output descriptions
* Handle NULL output make/model/serial
* chore: chase wlroots xdg-shell update
* xdg-shell: schedule a configure on maximize request
This commit reverts 03879290dbee26127f6867ef60bc2a7f9a6c8c5f and
fc84bcb7fb0ffa29b1f9bed287762241a3473803.
* Add a Hindi (हिन्दी) translation to the README
Hindi is one of the most prominent languages of the Indian Subcontinent.
This commit adds the translation of the README into the Hindi language.
Some of the words are still written in English because there wasn't an
appropriate technical term of the word in the language.
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
* sway: add bindgesture command
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
* build: link with -pthread
Fixes the following FreeBSD error:
ld: error: undefined symbol: pthread_getschedparam
>>> referenced by realtime.c:25 (../sway/realtime.c:25)
>>> sway/sway.p/realtime.c.o:(set_rr_scheduling)
Fixes: a3a82efbf6b5 ("realtime: request SCHED_RR using CAP_SYS_NICE")
* ipc: remove chatty debug log messages
These aren't particularly useful, and clobber the debug logs.
* Refuse to start when SUID is detected
This ensures that those surprised by the deprecation of SUID operation
receive an error rather than accidentally having sway run as root.
This detection will be removed in a future release.
* swaynag: move close_button up to fix SIGSEGV
When swaynag_parse_options encounters '--dismiss-button' (or its
shorthand '-s'), it sets the text of the first button in the
swaynag.buttons list, which is expected to exist and to be the dismiss
button, to the one passed by the user.
Commit 4780afb68b4ee2cdf0e4925f40cf885819f8a74a ("swaynag: statically
allocate button_close, and move declaration") moved the list
initialization to after swaynag_parse_options is called which made that
code fail.
For example, the command 'swaynag --dismiss-button Dismiss' crashes and
'swaynag --message Message --button Yes "" --dismiss-button Dismiss'
shows the wrong buttons.
Move it back to before swaynag_parse_options is called.
* config/output: use wlr_output_commit_state
This makes the code more robust because we don't potentially leave
bad state in wlr_output.pending behind anymore. This also fixes a
bug.
Closes: https://github.com/swaywm/sway/issues/7043
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3610
* Allocate enough space for `cmd_results->error`
* Remove access to wlr_input_device union
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3626
Closes: https://github.com/swaywm/sway/issues/7077
* Rename dpms output command to power
The "dpms" command refers to VESA Display Power Management
Signaling, a deprecated standard. It's superseded by VESA DPM.
Instead of tying out command name to a particular standard, use the
neutral term "power".
* Strip quotes in bindsym --input-device=...
If the input device is quoted, which is common when using variables in the
config file, those quotes must be ignored here, or the input device will be
ignored.
Fixes #7029.
* Avoid unecessary string copy
* Reject font values that are invalid for pango
Use pango to parse font configuration early, and reject the command as
invalid if the value is invalid for pango. Since we're already parsing
the font into a `PangoFontDescription`, keep that instance around and
avoid re-parsing the font each time we render text.
Fixes: https://github.com/swaywm/sway/issues/6805
* Reuse parsed PangoFontDescription
Avoids parsing the configured font each time text is rendered.
* ipc: add "power" to output reply
* config.in: switch to `output power`
* Remove internal references to DPMS
While at it, use an int for the config field, just like we do for
all other fields.
* fix: remove redundant empty statement in main.c
This semi-colon looks like a typo. Luckily, it has no effect on the code as it's treated as an empty statement leading the switch case.
Really straightforward nitpick change, was just something I was confused by when reading over the code.
* input: chase delta_discrete semantics change
* swaymsg: fix floating_nodes being ignored
Fix floating_nodes being ignored in pretty_print_tree.
* ipc: make get_deco_rect check config->hide_lone_tab
Without this, the `IPC_GET_TREE` ipc call would return false information
about the container's `deco_rect` and `rect` properties if
`hide_edge_borders --i3` was in effect.
* grimshot: fix tilde expansion within quotes
* Enable single-pixel-buffer-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3428
* sway-output.5: improve display of parameter
Since "width" and "height" are separate parameters, show them as such.
* man: sway(5) move fixes
* ipc: drop WLR_OUTPUT_ADAPTIVE_SYNC_UNKNOWN case
This has been removed from wlroots.
* config/output: test adaptive sync
Required for [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3637
* Fix crash in xdg_activation_v1.c
wlr_xdg_surface_from_wlr_surface() can return a NULL pointer, so check for NULL before dereferencing it.
* sway: Add non-desktop-output type
Currently, when encountering a non-desktop display, sway offers the
output for leasing and returns without storing it in a sway specific
output type like `struct sway_output`. Additionally, running
`swaymsg -t get_outputs` doesn't show non-desktop outputs.
This commit stores the non-desktop outputs into a struct called
`sway_output_non_desktop`, and adds them to a list on `sway_root`
* sway: add non-desktop outputs to json when running `swaymsg -t get_outputs`
* swaymsg: show non-desktop property when pretty printing outputs
* man: Add XWayland information
* ipc: expose mode picture aspect ratio
* swaymsg: show mode picture aspect ratio
* build: simplify protocol paths
No need for arrays here.
* sway/commands/output: Add command for unplugging non-physical outputs
* Improve Japanese translation
* allow pointer_constraints on layer_shell surfaces
* check for NULL
* use seat directly
* Use keyboard_state.focused_surface directly
* input: focus floating container when clicked on border
Fixes #7209.
* input: focus container when scrolling on titlebar
Fixes #6503.
* Fix leaks in criteria_destroy()
* Avoid double free in criteria_destroy()
* Add support for ext-idle-notify-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3753
* input: tweak focus behavior to allow focusing parent containers
Sway focuses the inactive child when focusing split containers. However,
there is currently no way to focus the parent container itself by mouse.
A user must use the keyboard to do so.
This commit maintains the current behavior, but makes it such that a
second click on the split container titlebar (i.e., after its children
are visible) focuses the split container itself.
* Fix keymap being NULL and segfaulting on dev add
Moved `libinput_config` to the callers of
`sway_input_configure_libinput_device` so that we send the event after
the added event.
* Rework session lock keyboard focus handling
When removing outputs, it is possible to end up in a situation where
none of the session lock client's surfaces have keyboard focus,
resulting in it not receiving keyboard events. Track the focused
surface and update it as needed on surface destroy.
* Fix focus tracking when session lock is active
Remove the incorrect attempt to block focus changes when an input grab
is present and replace it with the same logic used for layer_shell-based
screen lockers: restore the focus after changing it.
This fixes a use-after-free of seat->workspace if outputs are destroyed
while a screen lock is enabled.
* container_floating_set_default_size: Store workspace size box on the stack
* Support libinput's 1.21 new dwtp option
Support the new dwtp (disable while trackpointing) option introduced in
libinput 1.21, allowing users to control whether the trackpoint (like
those in Thinkpads, but not only) should be disabled while using the
keyboard/touchpad.
See: https://gitlab.freedesktop.org/libinput/libinput/-/issues/731
* tree: support formatting null titles
Any windows that have never had a title set visually behave closer to
that of an empty title, but are unformattable, as the code bails out
early on a NULL title.
* criteria: allow matching on empty (NULL) titles
* criteria: allow matching for NULL string criteria
* ci: install hwdata
* Use wl_signal_emit_mutable()
This function fixes segfaults when emitting a signal potentially
removes arbitrary listeners.
* Use wlr_damage_ring
wlr_output_damage is to be replaced with wlr_damage_ring, so use that.
* lock: fix crash on output destroy
Closes: https://github.com/swaywm/sway/issues/7120
* container_get_siblings: handle NULL workspace
* ci: checkout wlroots 0.16.0
* workspace_create: Don't allow NULL name
(cherry picked from commit 34933bb84350fe805d82276ea02d5732546e9993)
* output: set damage ring bounds to pixel values
Fixes: https://github.com/swaywm/sway/issues/7254
(cherry picked from commit 85005b52fe5b832e4ea914fa28048b0c5c803769)
* Use shm_open instead of mkstemp
shm_open is more reliable because it does not require
a writeable filesystem folder, unlike mkstemp.
(cherry picked from commit e2bc8866f46701e9c825ad7fa5baac02b2e4898f)
* build: drop wayland-scanner fallback
(cherry picked from commit 366f6ef3d31688631dc453028e108f98a1d7ab57)
* build: unify server & client protocol generation
No need to make a difference here, let's just generate header
files for both.
(cherry picked from commit 5be5a038da8a3789a19945719f2a27233291445d)
* build: drop "server" from target name for protocol code
(cherry picked from commit e5475d9310941ce88ed016ce1515b36e3a440252)
* build: drop intermediate libraries for protocols
(cherry picked from commit af8a5a8918ef42336194fb1077b008a736de7af9)
* root: move the workspace matching code to its own file
This removes the pid_workspace bits from tree/root before it gets
too interesting.
No functional change.
(cherry picked from commit eb5021ef990fb29ff86544aea58d687ad62c757a)
* node: prettify node type names
(cherry picked from commit 1c4b94ae3ca94b972410c80a61404a347af1ee68)
* launcher: track workspaces by node
This removes the need to rename the pid_workspaces when a workspace
is renamed.
It also opens the possibility of tracking other node types. Tracking
containers would allow application to be placed correctly in the
container tree even if the user has moved their focus elsewhere since
it was launched.
(cherry picked from commit 3b49f2782e8faf68766269b9c7390b16e25ae824)
* launcher: use xdga tokens
This reuses wlroots token tracking for workspace matching. It doesn't
export any xdga tokens for clients yet.
(cherry picked from commit bd66f4943da1c96edc3ba49573e27b42b688c543)
* launcher: rename pid_workspace to launcher_ctx
Soon we will match views with more than just a pid.
(cherry picked from commit d75c9f9722389d441fd24bd490c5cf12c4bef39a)
* view: associate launch contexts with views
Views now maintain a reference to a launch context which, as a last
resort, is populated at map time with a context associated with its pid.
This opens the possibility of populating it before map via another
source, e.g. xdga-tokens or configuration.
(cherry picked from commit 864b3a9a18f236f92f1898bb44ab977ceaebfd68)
* launcher: initialize launcher_ctxs once on startup
(cherry picked from commit 66568508c06267445489d655c91c94a34d6d9ffe)
* launcher: fudge the interface a bit
We want to create a context before knowing the pid it will match with.
(cherry picked from commit bdeb9f95651f6c99cc2f4cfb59020ddee202cf36)
* launcher: export xdga tokens and use them for workspace matching
(cherry picked from commit 30ad4dc4a5a41ce7c7aa85096a6e18f374172983)
* launcher: export X startup ids and use them for workspace matching
(cherry picked from commit 28fda4c0d38907fab94dc7d82c9dcf0754748b4e)
* swaybar: Prioritize hotspot events to bar bindings
This is consistent with i3bar's behaviour, and for example, allows binding a
command to button1, while still being able to click on tray icons or other
zones on the bar's status line which may have their own bindings.
E.g., in Sway, without this commit, this config. makes tray icons unclickable:
bar {
# ...
bindsym button1 exec swaynag -m You_clicked_the_tray._Want_some_help?
}
But the same configuration in i3 (with i3-nagbar) keeps tray items clickable.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 53f9dbd424dc173a85c9f4cd30802259d38b1ef4)
* swaybar: Make hotspots block bar release bindings
The previous commit prioritized hotspots before bar bindings for press events,
which matches i3's behaviour. However, since hotspots don't need to do any
processing on release events, those were not handled, and simply fell through
to `bindsym --release` bar bindings (if any).
This is counter-intuitive, and doesn't match i3's behaviour. Instead in case
a hotspot handles the press event, it should also handle the release event,
doing nothing, but blocking the event from triggering a --release bar binding.
E.g., in Sway, without this commit, this config. shows a text on tray clicks:
bar {
# ...
bindsym --release button1 exec swaynag -m I_got_the_release_event.
}
But the same configuration in i3 (with i3-nagbar) doesn't show the text.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 94b69acf0d7b26ee5af2172300cb18473508da76)
* build: drop unused wayland-egl dependency
(cherry picked from commit 37e4a3d6370dc6ba2b0877d588845c06781e880e)
* build: bump version to 1.8-rc1
* Fix build on Debian Stable
(cherry picked from commit dca0bb5749bc16f91ab964fc1b06ebb9a453368f)
* build: fix have_xwayland when xcb-icccm is not found
xcb-icccm is required to build Xwayland support.
Backported from commit d41f11e6bd8cef80f02dda4c66d4a31611aed753.
* build: bump version to 1.8-rc2
* seat: Avoid sending redundant keymaps on reload
When we reload the config, we reset every input device and re-apply
configuration from the config file. This means that the keyboard keymap
is updated at least once during config reload, more if the config file
contains keyboard configuration.
When they keyboard keymap changes and is updated through wlr_seat, the
keymap ends up sent to every keyboard bound in every client, seemingly
multiple times. On an x230 of mine with a keyboard layout set in the
config file, I see 42 keymap events sent to foot on config reload.
Reduce events from keyboard configurations by skipping all but the
currently active keyboard for the seat, and by clearing the active
keyboard during input manager device reset. After this change, I only
see a single just-in-time keymap event.
Fixes: https://github.com/swaywm/sway/issues/6654
* criteria: be lenient on window_role and instance too
* build: bump version to 1.8-rc3
* commands/move: Warp cursor after moving workspace to another output
This makes sway's behavior consistent with i3 when `mouse_warping` is
set to any value besides `none`.
Fixes #7027.
(cherry picked from commit e3c63bf58d0744dfb436f0f38442ce3735e40f47)
* seat: Set keyboard if seat keyboard is NULL
sway sends wl_keyboard.enter on seat focus change and when a keyboard
active on a seat is configured. If all keyboards are removed and a
keyboard is added back without changing the focused client, no new
notify event would be sent despite having keyboard focus. This could
lead to key events without notify, which is a protocol violation.
As a quick fix, when configuring a keyboard on a seat where no keyboard
is currently active, activate the keyboard so that a focused surface
will receive a notify event.
Regressed by: e1b268af98edeb09e570e8855ef64f0719cbafe2
Closes: https://github.com/swaywm/sway/issues/7330
(cherry picked from commit 1ade0ce753dc5f588584f444ce80d27c3b1e4300)
* build: bump version to 1.8-rc4
* swaynag: fix NULL font description
The font description was only set if provided on the CLI. It was
left NULL for the defaults and when reading from the config file.
Closes: https://github.com/swaywm/sway/issues/7186
(cherry picked from commit fd0af78e43f4dd67a404f475c676b25ae38a4b82)
* build: bump version to 1.8
* Removed other README languages
* Fixed build issues
* Removed alpha from render_data struct
* Updated PKGBUILDs and COPR spec
* Update sway/desktop/render.c
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
* Fixed deco_data not being initialized properly
* Replaced wlr_egl_(make|unset)_current with eglMakeCurrent
* Added matrix_projection into fx_renderer
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: Sefa Eyeoglu <contact@scrumplex.net>
Co-authored-by: Simon Ser <contact@emersion.fr>
Co-authored-by: Seth Barberee <seth.barberee@gmail.com>
Co-authored-by: Thomas Hebb <tommyhebb@gmail.com>
Co-authored-by: Nathan Schulte <nmschulte@gmail.com>
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
Co-authored-by: David Rosca <nowrep@gmail.com>
Co-authored-by: David96 <david@hameipe.de>
Co-authored-by: Kenny Levinsen <kl@kl.wtf>
Co-authored-by: Aleksei Bavshin <alebastr89@gmail.com>
Co-authored-by: Kirill Chibisov <contact@kchibisov.com>
Co-authored-by: Tudor Brindus <me@tbrindus.ca>
Co-authored-by: Patrick Hilhorst <git@hilhorst.be>
Co-authored-by: Rouven Czerwinski <rouven@czerwinskis.de>
Co-authored-by: Tobias Bengfort <tobias.bengfort@posteo.de>
Co-authored-by: Ronan Pigott <rpigott@berkeley.edu>
Co-authored-by: Kirill Primak <vyivel@eclair.cafe>
Co-authored-by: Tuomas Yrjölä <mail@yrhki.fi>
Co-authored-by: Kirill Primak <vyivel@posteo.net>
Co-authored-by: Alexander Browne <elcste@users.noreply.github.com>
Co-authored-by: Marco Rubin <20150305+Rubo3@users.noreply.github.com>
Co-authored-by: Muhamed Hobi <woohoomoo2u@gmail.com>
Co-authored-by: Simon Zeni <simon@bl4ckb0ne.ca>
Co-authored-by: Nihal Jere <nihal@nihaljere.xyz>
Co-authored-by: Alexander Gramiak <agrambot@gmail.com>
Co-authored-by: Moon Sungjoon <sumoon@seoulsaram.org>
Co-authored-by: Nicolas Avrutin <nicolas@avrutin.net>
Co-authored-by: ndren <andreien@ctemplar.com>
Co-authored-by: Bill Li <billli11hkb@gmail.com>
Co-authored-by: Leonardo Hernández Hernández <leohdz172@protonmail.com>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Co-authored-by: Manuel Stoeckl <code@mstoeckl.com>
Co-authored-by: Yasin Silavi <59373143+sttatusx@users.noreply.github.com>
Co-authored-by: Daniel De Graaf <code@danieldg.net>
Co-authored-by: kraftwerk28 <kefirchik3@gmail.com>
Co-authored-by: Eskil <67291226+eschillus@users.noreply.github.com>
Co-authored-by: Alice Carroll <git@alice-carroll.pet>
Co-authored-by: Alan <51193876+Pound-Hash@users.noreply.github.com>
Co-authored-by: Victor Makarov <vitja.makarov@gmail.com>
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: -k <slowdive@me.com>
Co-authored-by: Hongyi <61831273+FrozenArcher@users.noreply.github.com>
Co-authored-by: Urey. Xue <urey.s.knowledge@gmail.com>
Co-authored-by: LordRishav <75823494+LordRishav@users.noreply.github.com>
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
Co-authored-by: Florian Franzen <Florian.Franzen@gmail.com>
Co-authored-by: Greg Depoire--Ferrer <greg@gregdf.com>
Co-authored-by: Thomas Jost <schnouki@schnouki.net>
Co-authored-by: Hugo Osvaldo Barrera <hugo@barrera.io>
Co-authored-by: zkldi <ktchidev@gmail.com>
Co-authored-by: llyyr <llyyr.public@gmail.com>
Co-authored-by: Baltazár Radics <baltazar.radics@gmail.com>
Co-authored-by: Martin Michlmayr <tbm@cyrius.com>
Co-authored-by: Filip Szczepański <jazz2rulez@gmail.com>
Co-authored-by: Alex Maese <memaese@hotmail.com>
Co-authored-by: マリウス <marius@xn--gckvb8fzb.com>
Co-authored-by: Andri Yngvason <andri@yngvason.is>
Co-authored-by: ohno418 <yutaro.ono.418@gmail.com>
Co-authored-by: Ferdinand Schober <ferdinand.schober@fau.de>
Co-authored-by: cparm <armelcadetpetit@gmail.com>
Co-authored-by: Yaroslav de la Peña Smirnov <yps@yaroslavps.com>
Co-authored-by: Alexander Orzechowski <orzechowski.alexander@gmail.com>
Co-authored-by: pudiva chip líquida <pudiva@skylittlesystem.org>
Co-authored-by: Puck Meerburg <puck@puckipedia.com>
Co-authored-by: Callum Andrew <calcium@mailbox.org>
Co-authored-by: Ronan Pigott <ronan@rjp.ie>
Co-authored-by: Joan Bruguera <joanbrugueram@gmail.com>
Co-authored-by: nerdopolis <bluescreen_avenger@verizon.net>
Co-authored-by: Ankit Pandey <anpandey@protonmail.com>
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
2023-01-05 09:32:43 +11:00
|
|
|
render_text(cairo, config->font_description, scale, pango_markup, "%s", text);
|
2018-05-02 23:07:52 +10:00
|
|
|
|
|
|
|
cairo_surface_flush(surface);
|
|
|
|
unsigned char *data = cairo_image_surface_get_data(surface);
|
2021-04-21 01:26:39 +10:00
|
|
|
int stride = cairo_image_surface_get_stride(surface);
|
2021-11-16 05:32:52 +11:00
|
|
|
struct wlr_renderer *renderer = output->wlr_output->renderer;
|
2018-05-02 23:07:52 +10:00
|
|
|
*texture = wlr_texture_from_pixels(
|
2021-02-24 03:41:15 +11:00
|
|
|
renderer, DRM_FORMAT_ARGB8888, stride, width, height, data);
|
2018-05-02 23:07:52 +10:00
|
|
|
cairo_surface_destroy(surface);
|
|
|
|
g_object_unref(pango);
|
|
|
|
cairo_destroy(cairo);
|
|
|
|
}
|
|
|
|
|
2021-08-23 06:01:10 +10:00
|
|
|
static void update_title_texture(struct sway_container *con,
|
|
|
|
struct wlr_texture **texture, struct border_colors *class) {
|
|
|
|
struct sway_output *output = container_get_effective_output(con);
|
|
|
|
if (!output) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (*texture) {
|
|
|
|
wlr_texture_destroy(*texture);
|
|
|
|
*texture = NULL;
|
|
|
|
}
|
|
|
|
if (!con->formatted_title) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
render_titlebar_text_texture(output, con, texture, class,
|
|
|
|
config->pango_markup, con->formatted_title);
|
|
|
|
}
|
|
|
|
|
2018-05-02 23:07:52 +10:00
|
|
|
void container_update_title_textures(struct sway_container *container) {
|
|
|
|
update_title_texture(container, &container->title_focused,
|
|
|
|
&config->border_colors.focused);
|
|
|
|
update_title_texture(container, &container->title_focused_inactive,
|
|
|
|
&config->border_colors.focused_inactive);
|
|
|
|
update_title_texture(container, &container->title_unfocused,
|
|
|
|
&config->border_colors.unfocused);
|
|
|
|
update_title_texture(container, &container->title_urgent,
|
|
|
|
&config->border_colors.urgent);
|
2021-12-11 02:09:29 +11:00
|
|
|
update_title_texture(container, &container->title_focused_tab_title,
|
|
|
|
&config->border_colors.focused_tab_title);
|
2018-05-06 05:18:01 +10:00
|
|
|
container_damage_whole(container);
|
2018-05-02 23:07:52 +10:00
|
|
|
}
|
2018-05-03 15:02:16 +10:00
|
|
|
|
2018-05-19 22:54:50 +10:00
|
|
|
/**
|
2018-05-25 21:07:59 +10:00
|
|
|
* Calculate and return the length of the tree representation.
|
|
|
|
* An example tree representation is: V[Terminal, Firefox]
|
|
|
|
* If buffer is not NULL, also populate the buffer with the representation.
|
2018-05-19 22:54:50 +10:00
|
|
|
*/
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
size_t container_build_representation(enum sway_container_layout layout,
|
|
|
|
list_t *children, char *buffer) {
|
2018-05-25 21:07:59 +10:00
|
|
|
size_t len = 2;
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
switch (layout) {
|
2018-05-25 21:07:59 +10:00
|
|
|
case L_VERT:
|
|
|
|
lenient_strcat(buffer, "V[");
|
|
|
|
break;
|
|
|
|
case L_HORIZ:
|
|
|
|
lenient_strcat(buffer, "H[");
|
|
|
|
break;
|
|
|
|
case L_TABBED:
|
|
|
|
lenient_strcat(buffer, "T[");
|
|
|
|
break;
|
|
|
|
case L_STACKED:
|
|
|
|
lenient_strcat(buffer, "S[");
|
|
|
|
break;
|
|
|
|
case L_NONE:
|
|
|
|
lenient_strcat(buffer, "D[");
|
|
|
|
break;
|
2018-05-19 22:54:50 +10:00
|
|
|
}
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
for (int i = 0; i < children->length; ++i) {
|
2018-05-19 22:54:50 +10:00
|
|
|
if (i != 0) {
|
2018-05-25 21:07:59 +10:00
|
|
|
++len;
|
|
|
|
lenient_strcat(buffer, " ");
|
2018-05-19 22:54:50 +10:00
|
|
|
}
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
struct sway_container *child = children->items[i];
|
2018-05-20 09:26:46 +10:00
|
|
|
const char *identifier = NULL;
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
if (child->view) {
|
|
|
|
identifier = view_get_class(child->view);
|
2018-05-20 09:26:46 +10:00
|
|
|
if (!identifier) {
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
identifier = view_get_app_id(child->view);
|
2018-05-20 09:26:46 +10:00
|
|
|
}
|
|
|
|
} else {
|
2018-05-25 21:07:59 +10:00
|
|
|
identifier = child->formatted_title;
|
2018-05-20 09:26:46 +10:00
|
|
|
}
|
|
|
|
if (identifier) {
|
|
|
|
len += strlen(identifier);
|
2018-05-25 21:07:59 +10:00
|
|
|
lenient_strcat(buffer, identifier);
|
2018-05-19 22:54:50 +10:00
|
|
|
} else {
|
|
|
|
len += 6;
|
2018-05-25 21:07:59 +10:00
|
|
|
lenient_strcat(buffer, "(null)");
|
2018-05-19 22:54:50 +10:00
|
|
|
}
|
|
|
|
}
|
2018-05-25 21:07:59 +10:00
|
|
|
++len;
|
|
|
|
lenient_strcat(buffer, "]");
|
2018-05-19 22:54:50 +10:00
|
|
|
return len;
|
|
|
|
}
|
|
|
|
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
void container_update_representation(struct sway_container *con) {
|
|
|
|
if (!con->view) {
|
2021-02-13 09:22:51 +11:00
|
|
|
size_t len = container_build_representation(con->pending.layout,
|
|
|
|
con->pending.children, NULL);
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
free(con->formatted_title);
|
|
|
|
con->formatted_title = calloc(len + 1, sizeof(char));
|
|
|
|
if (!sway_assert(con->formatted_title,
|
|
|
|
"Unable to allocate title string")) {
|
|
|
|
return;
|
|
|
|
}
|
2021-02-13 09:22:51 +11:00
|
|
|
container_build_representation(con->pending.layout, con->pending.children,
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
con->formatted_title);
|
|
|
|
container_update_title_textures(con);
|
2018-05-19 22:54:50 +10:00
|
|
|
}
|
2021-02-13 09:22:51 +11:00
|
|
|
if (con->pending.parent) {
|
|
|
|
container_update_representation(con->pending.parent);
|
|
|
|
} else if (con->pending.workspace) {
|
|
|
|
workspace_update_representation(con->pending.workspace);
|
2018-05-29 17:42:11 +10:00
|
|
|
}
|
2018-05-03 15:02:16 +10:00
|
|
|
}
|
2018-05-22 08:27:42 +10:00
|
|
|
|
2018-09-30 20:58:49 +10:00
|
|
|
size_t container_titlebar_height(void) {
|
2022-12-01 12:22:39 +11:00
|
|
|
return config->font_height + config->titlebar_v_padding * 2;
|
2018-05-22 08:27:42 +10:00
|
|
|
}
|
2018-05-24 22:30:44 +10:00
|
|
|
|
2019-03-02 18:29:28 +11:00
|
|
|
void floating_calculate_constraints(int *min_width, int *max_width,
|
|
|
|
int *min_height, int *max_height) {
|
2018-07-26 18:36:46 +10:00
|
|
|
if (config->floating_minimum_width == -1) { // no minimum
|
2019-03-02 18:29:28 +11:00
|
|
|
*min_width = 0;
|
2018-07-26 18:36:46 +10:00
|
|
|
} else if (config->floating_minimum_width == 0) { // automatic
|
2019-03-02 18:29:28 +11:00
|
|
|
*min_width = 75;
|
2018-07-26 18:36:46 +10:00
|
|
|
} else {
|
2019-03-02 18:29:28 +11:00
|
|
|
*min_width = config->floating_minimum_width;
|
2018-07-26 18:36:46 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
if (config->floating_minimum_height == -1) { // no minimum
|
2019-03-02 18:29:28 +11:00
|
|
|
*min_height = 0;
|
2018-07-26 18:36:46 +10:00
|
|
|
} else if (config->floating_minimum_height == 0) { // automatic
|
2019-03-02 18:29:28 +11:00
|
|
|
*min_height = 50;
|
2018-07-26 18:36:46 +10:00
|
|
|
} else {
|
2019-03-02 18:29:28 +11:00
|
|
|
*min_height = config->floating_minimum_height;
|
2018-07-26 18:36:46 +10:00
|
|
|
}
|
|
|
|
|
rebase: Sway 1.8 (#78)
* build: bump wlroots dependency to 0.16.0
* swaymsg: replace if with switch in pretty_print
* swaymsg: add GET_TREE pretty-printing
* swaybar: fix errno handling in status_handle_readable
If getline fails once, it was not reset before the next getline
call. errno is only overwritten by getline on error.
* Add cairo_image_surface_create error handling
cairo_image_surface_create can fail, e.g. when running out of
memory or when the size is too big. Avoid crashing in this case.
Closes: https://github.com/swaywm/sway/issues/6531
* build: bump version to 1.8-dev
Historically we've been sticking with the last release number in
the master branch. However that's a bit confusing, people can't
easily figure out whether they're using a release or a work-in-progress
snapshot. Only the commit hash appended to the version number may
help, but that's not very explicit and disappears when using a
tarball.
We could bump the version in master to the next release number.
However during the RC cycle there would be a downgrade from 1.8 to
1.8-rc1. Also it would be hard to tell the difference between a
stable release and an old snapshot.
This patch introduces a new pre-release identifier, "dev". It's
alphabetically before "rc" so it should be correctly sorted by
semver comparisons. "dev" is upgraded to "rc" (and then to stable)
when doing a release. The master branch always uses a "dev"
version, only release branches use "rc" or stable versions.
* [IPC] Add repeat delay/rate info to keyboard
Closes #6735
wlroots already has the info in the struct so let's access it and print it out.
* input/seat: unset has_focus when focus_stack becomes empty
We currently track the focus of a seat in two ways: we use a list called
focus_stack to track the order in which nodes have been focused, with
the first node representing what's currently focused, and we use a
variable called has_focus to indicate whether anything has focus--i.e.
whether we should actually treat that first node as focused at any given
time.
In a number of places, we treat has_focus as implying that a focused
node exists. If it's true, we attempt to dereference the return value of
seat_get_focus(), our helper function for getting the first node in
focus_list, with no further checks. But this isn't quite correct with
the current implementation of seat_get_focus(): not only does it return
NULL when has_focus is false, it also returns NULL when focus_stack
contains no items.
In most cases, focus_stack never becomes empty and so this doesn't
matter at all. Since focus_stack stores a history of focused nodes, we
rarely remove nodes from it. The exception to this is when a node itself
goes away. In that case, we call seat_node_destroy() to remove it from
focus_stack and free it. But we don't unset has_focus if we've removed
the final node! This lets us get into a state where has_focus is true
but seat_get_focus() returns NULL, leading to a segfault when we try to
dereference it.
Fix the issue both by updating has_focus in seat_node_destroy() and by
adding an assertion in seat_get_focus() that ensures focus_stack and
has_focus are in sync, which will make it easier to track down similar
issues in the future.
Fixes #6395.
[1] There's some discussion in #1585 from when this was implemented
about whether has_focus is actually necessary; it's possible we could
remove it entirely, but for the moment this is the architecture we have.
* swaybar: fix tray_padding vs min-height re: scale
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
* swaybar: fix tray item icon scaling, positioning
* container: Fix crash when view unmaps + maps quickly
Followup on 4e4898e90f.
If a view quickly maps and unmaps repeatedly, there will be multiple
destroyed containers with same view in a single transaction. Each of
these containers will then try to destroy this view, resulting in use
after free.
The container should only destroy the view if the view still belongs
to the container.
Simple reproducer: couple XMapWindow + XUnmapWindow in a loop followed
by XDestroyWindow.
See #6605
* commands/move: Fix crash when pos_y is omitted
Fixes #6737
* Destroy sub-surfaces with parent layer-shell surface
Closes: https://github.com/swaywm/sway/issues/6337
* Add safety assert in parse_movement_unit
Let's add this just in case a caller passes argc == 0.
References: https://github.com/swaywm/sway/issues/6737#issuecomment-1008082540
* meson: check: false on run_command
Future meson releases will change the default and warns when the
implicit default is used, breaking builds.
Explicitly set check: false to maintain behavior and silence warnings.
* Print deprecation notice when running SUID
SUID privilege drop is needed for the "builtin"-backend of libseat,
which copied our old "direct" backend behavior for the sake of
compatibility and ease of transition.
libseat now has a better alternative in the form of seatd-launch. It
uses the normal seatd daemon and libseat backend and takes care of SUID
for us.
Add a soft deprecation warning to highlight our future intent of
removing this code. The deprecation cycle is needed to avoid surprises
when sway no longer drops privileges.
* xdg-shell: use toplevel geometry to adjust the popup box
`popup_unconstrain` uses view coordinates to init the output box for
popups. However wlroots expects the box to be set in a toplevel surface
coordinate system, which is not always equal to view. The difference
between those is a window geometry set via xdg-shell.
GTK4 reserves some space for client-side decoration and thus has a
window with top left corner not matching to (0, 0) of a surface. The box
calculated without taking that into account was slightly shifted
compared to the actual output and allowed to position part of the popup
off screen.
* build: fix building with basu
02b412a introduced the use of list for sdbus deps, however
it was assuming that all packages which were in a list has a version
higher than 239. That is true for libsystemd and libelogind, since they
use the same versions, however basu is using version numbers which are
way lower than what libsystemd/libelogind are using, so basu only build
is failing.
* Upgrade for wlroots surface refactoring
See [1] for details.
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3412
* commands/focus: drop trailing whitespace
* input/cursor: count pointer gestures as idle activity
Fixes https://github.com/swaywm/sway/issues/6765.
* input/cursor: treat swipe begin as idle activity too
Accidentally overlooked in fd53f80.
* treat fullscreen windows as 'tiled' for commands/focus
* transaction: destroying nodes aren't hidden
Commit 37d7bc69986f ("transaction: Only wait for ack from visible
views") introduced a check which uses view_is_visible() to check if a view
is still visible on the screen. However view_is_visible() will early
return in case the node is in the destroying state. This is incorrect
for transactions, since a destroying view which is visible will trigger
configure events for other clients. This bug was visible when repeatedly
opening and closing two views side by side, since we ignore the
destroying node we get a frame where the still open view is shown with
the old configure values and the rest is the desktop background. The
next frame is than correct again.
Fix this by considering destroying views as visible, we correctly wait
for them and send the configure events to other views in time, fixing
the background flicker.
Fixes #6473
* build: execute wlroots subproject before finding deps
wlroots often requires dependencies more recent than Sway's.
Executing the wlroots subproject first will give Meson a chance to
find these newer dependencies, possibly via subprojects.
The subproject will override the "wlroots" dependency when executed,
so we don't need to use get_variable anymore.
References: https://github.com/swaywm/sway/pull/6498#issuecomment-1001746017
* tray: do not render passive items
https://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/StatusNotifierItem/#org.freedesktop.statusnotifieritem.status
* cmd/swap: error on swapping a container with itself
* input/cursor: pass through pointer hold gestures
This just follows swaywm/wlroots#3047, so `wl_pointer_gestures_v1`
clients can be notified of these events.
* swaynag: remove buffer destruction condition
An address of a variable can never be NULL, so checking it doesn't make
sense; and `destroy_buffer()` can operate on already destroyed buffers
anyway.
Fixes #6780
* Use bools for CLI flags
* xwayland: listen to `request_activate` event
When REAPER submenu is closed `XCB_CLIENT_MESSAGE` with type
`NET_ACTIVE_WINDOW` is sent to set focus to parent menu.
Closes: https://github.com/swaywm/sway/issues/6324
* chore: chase wlr_output_layout_get_box() update
https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3439
* Chase wlroots xdg-shell refactor
* Minor update to focus_on_window_activation
Removed xwayland limitation since wayland clients are supported via xdg-activation.
* Translated README into Italian
* readme: add link to Italian translation
* readme: sort language list alphabetically
* readme: use relative links for translations
* xdg-shell: use wlr_xdg_toplevel in sway_view
Improved type safety.
Closes: https://github.com/swaywm/sway/issues/6813
* xdg-shell: use wlr_xdg_popup in sway_xdg_popup
Improved type safety.
* Fix snprintf compiler warning
* Remove all sprintf calls
Replace them with snprintf, which ensures buffer overflows won't
happen.
* sway/commands: add missing wlr_keyboard interface include in xkb_switch_layout
* sway/input: use wlr_input_device from input device base
* Remove some erroneous apostrophes in comments
* Don't enter seatop_move_floating when fullscreen
Currently, a floating window that's been fullscreened can send us
xdg_toplevel::move, and we'll enter seatop_move_floating, which lets us
drag the surface around while it's fullscreen. We don't want
this--fullscreen surfaces should always be aligned to the screen--so add
the same check that seatop_default already does when entering this mode.
Tested with Weston's weston-fullscreen demo, which sends a move request
if you click anywhere on its surface.
* swaynag: die on all allocation failures
* sway/input: don't pass possibly invalid modifiers pointer
active_keyboard may be NULL, in which case an invalid pointer could be
passed to wlr_input_method_keyboard_grab_v2_send_modifiers. This
procedure call is unnecessary since wlroots commit 372a52ec "input
method: send modifiers in set_keyboard", so the call can simply be
removed.
Fixes #6836.
* sway/input: destroy sway_switch properly
Fix: #6861
Added seat_device_destroy function to seat_device_destroy function.
* commands/focus: fix segfault when no container is already focused.
Fixes #6690.
* Remove WLR_SWITCH_STATE_TOGGLE usage
Ref [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/commit/4792446ee8f50104bd207d9ccd8558a7e4eb4514
* Replace pcre with pcre2
Closes: https://github.com/swaywm/sway/issues/6838
* swaybar: remove swaybar_output.input_region
No need to keep the region around, we can immediately destroy it
after the wl_surface.set_input_region request.
* swaybar: set opaque region
When the background color is fully opaque, set the surface's opaque
region to the whole surface.
* Updating criteria checking with PCRE2
* swaynag: allocate button_details with details
They are used together, so it doesn't make sense to allocate them
separately.
* swaynag: statically allocate button_close, and move declaration
Every swaynag has a close button, so it doesn't make sense to
allocate it dynamically. The declaration is moved later to when
it is actually needed.
* swaynag: remove unnecessary zero of swaynag struct
Global variables are initialized to 0.
* swaynag: remove redundant status variables in main
Instead, we just use `status` for all failures.
* remove unnecessary strlen call
* sway/input/cursor: take device mm size from wlr_tablet
* sway/input/seat: take output name from specialized input device
* sway/input: follow up wlroots input device events renaming
* sway/input: fix bad position of wlr_drag
* sway/input: wlr_seat_keyboard() now takes wlr_keyboard
* bash-completion: localize variables
* sway/main: move constants off the stack
This makes stack traces from gdb slightly easier to read.
* Fix farsi label
* Avoid format-truncation warning
The existing code gives this error when compiled with GCC 12:
../sway/server.c: In function ‘server_init’:
../sway/server.c:217:75: error: ‘%d’ directive output may be truncated writing between 1 and 11 bytes into a region of size 8 [-Werror=format-truncation=]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~
../sway/server.c:217:66: note: directive argument in the range [-2147483647, 32]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~
../sway/server.c:217:17: note: ‘snprintf’ output between 10 and 20 bytes into a destination of size 16
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Because i is never negative, this is a false positive, but it is easy to
change i to unsigned to silence the error.
* Shuffle variables to satisfy -Werror=restrict
This also fixes an invalid strlen invocation on uninitialized memory.
* layer_shell: keep output non-NULL wherever possible
Our layer shell implementation assigns every layer surface to an output
on creation. It tracks this output using the output field on the
underlying wlr_layer_surface_v1 structure. As such, much of the existing
code assumes that output is always non-NULL and omits NULL checks
accordingly.
However, there are currently two cases where we destroy a
sway_layer_surface and output is NULL. The first is when we can't find
an output to assign the surface to and destroy it immediately after
creation. The second is when we destroy a surface in response to its
output getting destroyed, as we set output to NULL in
handle_output_destroy() before we call wlr_layer_surface_v1_destroy(),
which is what calls the appropriate unmap and destroy callbacks.
The former case doesn't cause any problems, since we haven't even
allocated a sway_layer_surface at that point or registered any
callbacks. The latter case, however, currently triggers a crash (#6120)
if a popup is visible, since our popup_handle_unmap() implementation
can't handle a NULL output.
To fix this issue, keep output set until right before we free the
sway_layer_surface. All we need to do is remove some of the cleanup
logic from handle_output_destroy(), since as of commit c9060bcc12d0
("layer-shell: replace close() with destroy()") that same logic is
guaranteed to be happen later when wlroots calls handle_destroy() as
part of wlr_layer_surface_v1_destroy().
This lets us remove some NULL checks from other unmap/destroy callbacks,
which is nice. We also don't need to check that the wlr_output points to
a valid sway_output anymore, since we unset that pointer after disabling
the output as of commit a0bbe67076b8 ("Address emersions comments on
output re-enabling") Just to be safe, I've added assertions that the
wlr_output is non-NULL wherever we use it.
Fixes #6120.
* Chase wlroots X11 hints update
* Add Swedish README
* Support cursor capture in grimshot
Refactor argument parser
Bring back `sh` compatibility
Default to NOTIFY=no
* Update grimshot.1.scd
Fixed typo. The object is **files**, which is plural. **image** modifies files; it's not countable.
* xkb_switch_layout: fix relative layout switches
Fixes #6011
* Implement ext-session-lock-v1
* Avoid inspecting a NULL view in seat_set_focus
Fixes #6968
* swaynag: do error checking and rename read_from_stdin
read_from_stdin not only read from stdin, but trimming trailing
newlines, so rename it to reflect this.
* swaynag: improve robustness when loading config
* swaynag: combine consecutive declaration/assignments
* config: Remove unused mouse binding structure
Mouse bindings are handled alongside normal bindings. Remove the unused
separate data structure definition to avoid confusion.
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
* Replace strncpy with memcpy
strncpy is useless here, is dangerous because it doesn't guarantee
that the string is NUL-terminated and causes the following warning:
../sway/criteria.c: In function ‘criteria_parse’:
../sway/criteria.c:712:25: error: ‘strncpy’ destination unchanged after copying no bytes [-Werror=stringop-truncation]
712 | strncpy(value, valuestart, head - valuestart);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Add descriptions for `stacking` and `tabbed` layouts
Resolves #5918
* man: Fix trailing spaces
* server: request xdg-shell v2
Wlroots does not yet support the newer xdg-shell versions and now
requires the compositor to set the supported xdg-shell version during
creation. Set this to v2 for sway as well.
Fixes https://github.com/swaywm/sway/issues/7001
* realtime: request SCHED_RR using CAP_SYS_NICE
Try to gain SCHED_RR (round-robin) realtime scheduling privileges before
starting the server. This requires CAP_SYS_NICE on Linux systems.
We additionally register a pthread_atfork callback which resets the
scheduling class back to SCHED_OTHER (the Linux system default).
Due to CAP_SYS_NICE, setting RLIMIT_RTPRIO has no effect on the process
as documented within man 7 sched (from Linux):
Privileged (CAP_SYS_NICE) threads ignore the RLIMIT_RTPRIO limit;
as with older kernels, they can make arbitrary changes to
scheduling policy and priority. See getrlimit(2) for further
information on RLIMIT_RTPRIO
Note that this requires the sway distribution packagers to set the
CAP_SYS_NICE capability on the sway binary.
Supersedes #6992
* ext-session-lock: disable direct scan-out when locked
* Polish the language in README.zh-CN.md & sync with English one
Co-Authored-By: Urey. Xue <urey.s.knowledge@gmail.com>
* De-duplicate IPC output descriptions
* Handle NULL output make/model/serial
* chore: chase wlroots xdg-shell update
* xdg-shell: schedule a configure on maximize request
This commit reverts 03879290dbee26127f6867ef60bc2a7f9a6c8c5f and
fc84bcb7fb0ffa29b1f9bed287762241a3473803.
* Add a Hindi (हिन्दी) translation to the README
Hindi is one of the most prominent languages of the Indian Subcontinent.
This commit adds the translation of the README into the Hindi language.
Some of the words are still written in English because there wasn't an
appropriate technical term of the word in the language.
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
* sway: add bindgesture command
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
* build: link with -pthread
Fixes the following FreeBSD error:
ld: error: undefined symbol: pthread_getschedparam
>>> referenced by realtime.c:25 (../sway/realtime.c:25)
>>> sway/sway.p/realtime.c.o:(set_rr_scheduling)
Fixes: a3a82efbf6b5 ("realtime: request SCHED_RR using CAP_SYS_NICE")
* ipc: remove chatty debug log messages
These aren't particularly useful, and clobber the debug logs.
* Refuse to start when SUID is detected
This ensures that those surprised by the deprecation of SUID operation
receive an error rather than accidentally having sway run as root.
This detection will be removed in a future release.
* swaynag: move close_button up to fix SIGSEGV
When swaynag_parse_options encounters '--dismiss-button' (or its
shorthand '-s'), it sets the text of the first button in the
swaynag.buttons list, which is expected to exist and to be the dismiss
button, to the one passed by the user.
Commit 4780afb68b4ee2cdf0e4925f40cf885819f8a74a ("swaynag: statically
allocate button_close, and move declaration") moved the list
initialization to after swaynag_parse_options is called which made that
code fail.
For example, the command 'swaynag --dismiss-button Dismiss' crashes and
'swaynag --message Message --button Yes "" --dismiss-button Dismiss'
shows the wrong buttons.
Move it back to before swaynag_parse_options is called.
* config/output: use wlr_output_commit_state
This makes the code more robust because we don't potentially leave
bad state in wlr_output.pending behind anymore. This also fixes a
bug.
Closes: https://github.com/swaywm/sway/issues/7043
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3610
* Allocate enough space for `cmd_results->error`
* Remove access to wlr_input_device union
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3626
Closes: https://github.com/swaywm/sway/issues/7077
* Rename dpms output command to power
The "dpms" command refers to VESA Display Power Management
Signaling, a deprecated standard. It's superseded by VESA DPM.
Instead of tying out command name to a particular standard, use the
neutral term "power".
* Strip quotes in bindsym --input-device=...
If the input device is quoted, which is common when using variables in the
config file, those quotes must be ignored here, or the input device will be
ignored.
Fixes #7029.
* Avoid unecessary string copy
* Reject font values that are invalid for pango
Use pango to parse font configuration early, and reject the command as
invalid if the value is invalid for pango. Since we're already parsing
the font into a `PangoFontDescription`, keep that instance around and
avoid re-parsing the font each time we render text.
Fixes: https://github.com/swaywm/sway/issues/6805
* Reuse parsed PangoFontDescription
Avoids parsing the configured font each time text is rendered.
* ipc: add "power" to output reply
* config.in: switch to `output power`
* Remove internal references to DPMS
While at it, use an int for the config field, just like we do for
all other fields.
* fix: remove redundant empty statement in main.c
This semi-colon looks like a typo. Luckily, it has no effect on the code as it's treated as an empty statement leading the switch case.
Really straightforward nitpick change, was just something I was confused by when reading over the code.
* input: chase delta_discrete semantics change
* swaymsg: fix floating_nodes being ignored
Fix floating_nodes being ignored in pretty_print_tree.
* ipc: make get_deco_rect check config->hide_lone_tab
Without this, the `IPC_GET_TREE` ipc call would return false information
about the container's `deco_rect` and `rect` properties if
`hide_edge_borders --i3` was in effect.
* grimshot: fix tilde expansion within quotes
* Enable single-pixel-buffer-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3428
* sway-output.5: improve display of parameter
Since "width" and "height" are separate parameters, show them as such.
* man: sway(5) move fixes
* ipc: drop WLR_OUTPUT_ADAPTIVE_SYNC_UNKNOWN case
This has been removed from wlroots.
* config/output: test adaptive sync
Required for [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3637
* Fix crash in xdg_activation_v1.c
wlr_xdg_surface_from_wlr_surface() can return a NULL pointer, so check for NULL before dereferencing it.
* sway: Add non-desktop-output type
Currently, when encountering a non-desktop display, sway offers the
output for leasing and returns without storing it in a sway specific
output type like `struct sway_output`. Additionally, running
`swaymsg -t get_outputs` doesn't show non-desktop outputs.
This commit stores the non-desktop outputs into a struct called
`sway_output_non_desktop`, and adds them to a list on `sway_root`
* sway: add non-desktop outputs to json when running `swaymsg -t get_outputs`
* swaymsg: show non-desktop property when pretty printing outputs
* man: Add XWayland information
* ipc: expose mode picture aspect ratio
* swaymsg: show mode picture aspect ratio
* build: simplify protocol paths
No need for arrays here.
* sway/commands/output: Add command for unplugging non-physical outputs
* Improve Japanese translation
* allow pointer_constraints on layer_shell surfaces
* check for NULL
* use seat directly
* Use keyboard_state.focused_surface directly
* input: focus floating container when clicked on border
Fixes #7209.
* input: focus container when scrolling on titlebar
Fixes #6503.
* Fix leaks in criteria_destroy()
* Avoid double free in criteria_destroy()
* Add support for ext-idle-notify-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3753
* input: tweak focus behavior to allow focusing parent containers
Sway focuses the inactive child when focusing split containers. However,
there is currently no way to focus the parent container itself by mouse.
A user must use the keyboard to do so.
This commit maintains the current behavior, but makes it such that a
second click on the split container titlebar (i.e., after its children
are visible) focuses the split container itself.
* Fix keymap being NULL and segfaulting on dev add
Moved `libinput_config` to the callers of
`sway_input_configure_libinput_device` so that we send the event after
the added event.
* Rework session lock keyboard focus handling
When removing outputs, it is possible to end up in a situation where
none of the session lock client's surfaces have keyboard focus,
resulting in it not receiving keyboard events. Track the focused
surface and update it as needed on surface destroy.
* Fix focus tracking when session lock is active
Remove the incorrect attempt to block focus changes when an input grab
is present and replace it with the same logic used for layer_shell-based
screen lockers: restore the focus after changing it.
This fixes a use-after-free of seat->workspace if outputs are destroyed
while a screen lock is enabled.
* container_floating_set_default_size: Store workspace size box on the stack
* Support libinput's 1.21 new dwtp option
Support the new dwtp (disable while trackpointing) option introduced in
libinput 1.21, allowing users to control whether the trackpoint (like
those in Thinkpads, but not only) should be disabled while using the
keyboard/touchpad.
See: https://gitlab.freedesktop.org/libinput/libinput/-/issues/731
* tree: support formatting null titles
Any windows that have never had a title set visually behave closer to
that of an empty title, but are unformattable, as the code bails out
early on a NULL title.
* criteria: allow matching on empty (NULL) titles
* criteria: allow matching for NULL string criteria
* ci: install hwdata
* Use wl_signal_emit_mutable()
This function fixes segfaults when emitting a signal potentially
removes arbitrary listeners.
* Use wlr_damage_ring
wlr_output_damage is to be replaced with wlr_damage_ring, so use that.
* lock: fix crash on output destroy
Closes: https://github.com/swaywm/sway/issues/7120
* container_get_siblings: handle NULL workspace
* ci: checkout wlroots 0.16.0
* workspace_create: Don't allow NULL name
(cherry picked from commit 34933bb84350fe805d82276ea02d5732546e9993)
* output: set damage ring bounds to pixel values
Fixes: https://github.com/swaywm/sway/issues/7254
(cherry picked from commit 85005b52fe5b832e4ea914fa28048b0c5c803769)
* Use shm_open instead of mkstemp
shm_open is more reliable because it does not require
a writeable filesystem folder, unlike mkstemp.
(cherry picked from commit e2bc8866f46701e9c825ad7fa5baac02b2e4898f)
* build: drop wayland-scanner fallback
(cherry picked from commit 366f6ef3d31688631dc453028e108f98a1d7ab57)
* build: unify server & client protocol generation
No need to make a difference here, let's just generate header
files for both.
(cherry picked from commit 5be5a038da8a3789a19945719f2a27233291445d)
* build: drop "server" from target name for protocol code
(cherry picked from commit e5475d9310941ce88ed016ce1515b36e3a440252)
* build: drop intermediate libraries for protocols
(cherry picked from commit af8a5a8918ef42336194fb1077b008a736de7af9)
* root: move the workspace matching code to its own file
This removes the pid_workspace bits from tree/root before it gets
too interesting.
No functional change.
(cherry picked from commit eb5021ef990fb29ff86544aea58d687ad62c757a)
* node: prettify node type names
(cherry picked from commit 1c4b94ae3ca94b972410c80a61404a347af1ee68)
* launcher: track workspaces by node
This removes the need to rename the pid_workspaces when a workspace
is renamed.
It also opens the possibility of tracking other node types. Tracking
containers would allow application to be placed correctly in the
container tree even if the user has moved their focus elsewhere since
it was launched.
(cherry picked from commit 3b49f2782e8faf68766269b9c7390b16e25ae824)
* launcher: use xdga tokens
This reuses wlroots token tracking for workspace matching. It doesn't
export any xdga tokens for clients yet.
(cherry picked from commit bd66f4943da1c96edc3ba49573e27b42b688c543)
* launcher: rename pid_workspace to launcher_ctx
Soon we will match views with more than just a pid.
(cherry picked from commit d75c9f9722389d441fd24bd490c5cf12c4bef39a)
* view: associate launch contexts with views
Views now maintain a reference to a launch context which, as a last
resort, is populated at map time with a context associated with its pid.
This opens the possibility of populating it before map via another
source, e.g. xdga-tokens or configuration.
(cherry picked from commit 864b3a9a18f236f92f1898bb44ab977ceaebfd68)
* launcher: initialize launcher_ctxs once on startup
(cherry picked from commit 66568508c06267445489d655c91c94a34d6d9ffe)
* launcher: fudge the interface a bit
We want to create a context before knowing the pid it will match with.
(cherry picked from commit bdeb9f95651f6c99cc2f4cfb59020ddee202cf36)
* launcher: export xdga tokens and use them for workspace matching
(cherry picked from commit 30ad4dc4a5a41ce7c7aa85096a6e18f374172983)
* launcher: export X startup ids and use them for workspace matching
(cherry picked from commit 28fda4c0d38907fab94dc7d82c9dcf0754748b4e)
* swaybar: Prioritize hotspot events to bar bindings
This is consistent with i3bar's behaviour, and for example, allows binding a
command to button1, while still being able to click on tray icons or other
zones on the bar's status line which may have their own bindings.
E.g., in Sway, without this commit, this config. makes tray icons unclickable:
bar {
# ...
bindsym button1 exec swaynag -m You_clicked_the_tray._Want_some_help?
}
But the same configuration in i3 (with i3-nagbar) keeps tray items clickable.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 53f9dbd424dc173a85c9f4cd30802259d38b1ef4)
* swaybar: Make hotspots block bar release bindings
The previous commit prioritized hotspots before bar bindings for press events,
which matches i3's behaviour. However, since hotspots don't need to do any
processing on release events, those were not handled, and simply fell through
to `bindsym --release` bar bindings (if any).
This is counter-intuitive, and doesn't match i3's behaviour. Instead in case
a hotspot handles the press event, it should also handle the release event,
doing nothing, but blocking the event from triggering a --release bar binding.
E.g., in Sway, without this commit, this config. shows a text on tray clicks:
bar {
# ...
bindsym --release button1 exec swaynag -m I_got_the_release_event.
}
But the same configuration in i3 (with i3-nagbar) doesn't show the text.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 94b69acf0d7b26ee5af2172300cb18473508da76)
* build: drop unused wayland-egl dependency
(cherry picked from commit 37e4a3d6370dc6ba2b0877d588845c06781e880e)
* build: bump version to 1.8-rc1
* Fix build on Debian Stable
(cherry picked from commit dca0bb5749bc16f91ab964fc1b06ebb9a453368f)
* build: fix have_xwayland when xcb-icccm is not found
xcb-icccm is required to build Xwayland support.
Backported from commit d41f11e6bd8cef80f02dda4c66d4a31611aed753.
* build: bump version to 1.8-rc2
* seat: Avoid sending redundant keymaps on reload
When we reload the config, we reset every input device and re-apply
configuration from the config file. This means that the keyboard keymap
is updated at least once during config reload, more if the config file
contains keyboard configuration.
When they keyboard keymap changes and is updated through wlr_seat, the
keymap ends up sent to every keyboard bound in every client, seemingly
multiple times. On an x230 of mine with a keyboard layout set in the
config file, I see 42 keymap events sent to foot on config reload.
Reduce events from keyboard configurations by skipping all but the
currently active keyboard for the seat, and by clearing the active
keyboard during input manager device reset. After this change, I only
see a single just-in-time keymap event.
Fixes: https://github.com/swaywm/sway/issues/6654
* criteria: be lenient on window_role and instance too
* build: bump version to 1.8-rc3
* commands/move: Warp cursor after moving workspace to another output
This makes sway's behavior consistent with i3 when `mouse_warping` is
set to any value besides `none`.
Fixes #7027.
(cherry picked from commit e3c63bf58d0744dfb436f0f38442ce3735e40f47)
* seat: Set keyboard if seat keyboard is NULL
sway sends wl_keyboard.enter on seat focus change and when a keyboard
active on a seat is configured. If all keyboards are removed and a
keyboard is added back without changing the focused client, no new
notify event would be sent despite having keyboard focus. This could
lead to key events without notify, which is a protocol violation.
As a quick fix, when configuring a keyboard on a seat where no keyboard
is currently active, activate the keyboard so that a focused surface
will receive a notify event.
Regressed by: e1b268af98edeb09e570e8855ef64f0719cbafe2
Closes: https://github.com/swaywm/sway/issues/7330
(cherry picked from commit 1ade0ce753dc5f588584f444ce80d27c3b1e4300)
* build: bump version to 1.8-rc4
* swaynag: fix NULL font description
The font description was only set if provided on the CLI. It was
left NULL for the defaults and when reading from the config file.
Closes: https://github.com/swaywm/sway/issues/7186
(cherry picked from commit fd0af78e43f4dd67a404f475c676b25ae38a4b82)
* build: bump version to 1.8
* Removed other README languages
* Fixed build issues
* Removed alpha from render_data struct
* Updated PKGBUILDs and COPR spec
* Update sway/desktop/render.c
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
* Fixed deco_data not being initialized properly
* Replaced wlr_egl_(make|unset)_current with eglMakeCurrent
* Added matrix_projection into fx_renderer
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: Sefa Eyeoglu <contact@scrumplex.net>
Co-authored-by: Simon Ser <contact@emersion.fr>
Co-authored-by: Seth Barberee <seth.barberee@gmail.com>
Co-authored-by: Thomas Hebb <tommyhebb@gmail.com>
Co-authored-by: Nathan Schulte <nmschulte@gmail.com>
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
Co-authored-by: David Rosca <nowrep@gmail.com>
Co-authored-by: David96 <david@hameipe.de>
Co-authored-by: Kenny Levinsen <kl@kl.wtf>
Co-authored-by: Aleksei Bavshin <alebastr89@gmail.com>
Co-authored-by: Kirill Chibisov <contact@kchibisov.com>
Co-authored-by: Tudor Brindus <me@tbrindus.ca>
Co-authored-by: Patrick Hilhorst <git@hilhorst.be>
Co-authored-by: Rouven Czerwinski <rouven@czerwinskis.de>
Co-authored-by: Tobias Bengfort <tobias.bengfort@posteo.de>
Co-authored-by: Ronan Pigott <rpigott@berkeley.edu>
Co-authored-by: Kirill Primak <vyivel@eclair.cafe>
Co-authored-by: Tuomas Yrjölä <mail@yrhki.fi>
Co-authored-by: Kirill Primak <vyivel@posteo.net>
Co-authored-by: Alexander Browne <elcste@users.noreply.github.com>
Co-authored-by: Marco Rubin <20150305+Rubo3@users.noreply.github.com>
Co-authored-by: Muhamed Hobi <woohoomoo2u@gmail.com>
Co-authored-by: Simon Zeni <simon@bl4ckb0ne.ca>
Co-authored-by: Nihal Jere <nihal@nihaljere.xyz>
Co-authored-by: Alexander Gramiak <agrambot@gmail.com>
Co-authored-by: Moon Sungjoon <sumoon@seoulsaram.org>
Co-authored-by: Nicolas Avrutin <nicolas@avrutin.net>
Co-authored-by: ndren <andreien@ctemplar.com>
Co-authored-by: Bill Li <billli11hkb@gmail.com>
Co-authored-by: Leonardo Hernández Hernández <leohdz172@protonmail.com>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Co-authored-by: Manuel Stoeckl <code@mstoeckl.com>
Co-authored-by: Yasin Silavi <59373143+sttatusx@users.noreply.github.com>
Co-authored-by: Daniel De Graaf <code@danieldg.net>
Co-authored-by: kraftwerk28 <kefirchik3@gmail.com>
Co-authored-by: Eskil <67291226+eschillus@users.noreply.github.com>
Co-authored-by: Alice Carroll <git@alice-carroll.pet>
Co-authored-by: Alan <51193876+Pound-Hash@users.noreply.github.com>
Co-authored-by: Victor Makarov <vitja.makarov@gmail.com>
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: -k <slowdive@me.com>
Co-authored-by: Hongyi <61831273+FrozenArcher@users.noreply.github.com>
Co-authored-by: Urey. Xue <urey.s.knowledge@gmail.com>
Co-authored-by: LordRishav <75823494+LordRishav@users.noreply.github.com>
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
Co-authored-by: Florian Franzen <Florian.Franzen@gmail.com>
Co-authored-by: Greg Depoire--Ferrer <greg@gregdf.com>
Co-authored-by: Thomas Jost <schnouki@schnouki.net>
Co-authored-by: Hugo Osvaldo Barrera <hugo@barrera.io>
Co-authored-by: zkldi <ktchidev@gmail.com>
Co-authored-by: llyyr <llyyr.public@gmail.com>
Co-authored-by: Baltazár Radics <baltazar.radics@gmail.com>
Co-authored-by: Martin Michlmayr <tbm@cyrius.com>
Co-authored-by: Filip Szczepański <jazz2rulez@gmail.com>
Co-authored-by: Alex Maese <memaese@hotmail.com>
Co-authored-by: マリウス <marius@xn--gckvb8fzb.com>
Co-authored-by: Andri Yngvason <andri@yngvason.is>
Co-authored-by: ohno418 <yutaro.ono.418@gmail.com>
Co-authored-by: Ferdinand Schober <ferdinand.schober@fau.de>
Co-authored-by: cparm <armelcadetpetit@gmail.com>
Co-authored-by: Yaroslav de la Peña Smirnov <yps@yaroslavps.com>
Co-authored-by: Alexander Orzechowski <orzechowski.alexander@gmail.com>
Co-authored-by: pudiva chip líquida <pudiva@skylittlesystem.org>
Co-authored-by: Puck Meerburg <puck@puckipedia.com>
Co-authored-by: Callum Andrew <calcium@mailbox.org>
Co-authored-by: Ronan Pigott <ronan@rjp.ie>
Co-authored-by: Joan Bruguera <joanbrugueram@gmail.com>
Co-authored-by: nerdopolis <bluescreen_avenger@verizon.net>
Co-authored-by: Ankit Pandey <anpandey@protonmail.com>
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
2023-01-05 09:32:43 +11:00
|
|
|
struct wlr_box box;
|
|
|
|
wlr_output_layout_get_box(root->output_layout, NULL, &box);
|
2019-03-02 18:29:28 +11:00
|
|
|
|
2018-07-26 18:36:46 +10:00
|
|
|
if (config->floating_maximum_width == -1) { // no maximum
|
2019-03-02 18:29:28 +11:00
|
|
|
*max_width = INT_MAX;
|
2018-07-26 18:36:46 +10:00
|
|
|
} else if (config->floating_maximum_width == 0) { // automatic
|
rebase: Sway 1.8 (#78)
* build: bump wlroots dependency to 0.16.0
* swaymsg: replace if with switch in pretty_print
* swaymsg: add GET_TREE pretty-printing
* swaybar: fix errno handling in status_handle_readable
If getline fails once, it was not reset before the next getline
call. errno is only overwritten by getline on error.
* Add cairo_image_surface_create error handling
cairo_image_surface_create can fail, e.g. when running out of
memory or when the size is too big. Avoid crashing in this case.
Closes: https://github.com/swaywm/sway/issues/6531
* build: bump version to 1.8-dev
Historically we've been sticking with the last release number in
the master branch. However that's a bit confusing, people can't
easily figure out whether they're using a release or a work-in-progress
snapshot. Only the commit hash appended to the version number may
help, but that's not very explicit and disappears when using a
tarball.
We could bump the version in master to the next release number.
However during the RC cycle there would be a downgrade from 1.8 to
1.8-rc1. Also it would be hard to tell the difference between a
stable release and an old snapshot.
This patch introduces a new pre-release identifier, "dev". It's
alphabetically before "rc" so it should be correctly sorted by
semver comparisons. "dev" is upgraded to "rc" (and then to stable)
when doing a release. The master branch always uses a "dev"
version, only release branches use "rc" or stable versions.
* [IPC] Add repeat delay/rate info to keyboard
Closes #6735
wlroots already has the info in the struct so let's access it and print it out.
* input/seat: unset has_focus when focus_stack becomes empty
We currently track the focus of a seat in two ways: we use a list called
focus_stack to track the order in which nodes have been focused, with
the first node representing what's currently focused, and we use a
variable called has_focus to indicate whether anything has focus--i.e.
whether we should actually treat that first node as focused at any given
time.
In a number of places, we treat has_focus as implying that a focused
node exists. If it's true, we attempt to dereference the return value of
seat_get_focus(), our helper function for getting the first node in
focus_list, with no further checks. But this isn't quite correct with
the current implementation of seat_get_focus(): not only does it return
NULL when has_focus is false, it also returns NULL when focus_stack
contains no items.
In most cases, focus_stack never becomes empty and so this doesn't
matter at all. Since focus_stack stores a history of focused nodes, we
rarely remove nodes from it. The exception to this is when a node itself
goes away. In that case, we call seat_node_destroy() to remove it from
focus_stack and free it. But we don't unset has_focus if we've removed
the final node! This lets us get into a state where has_focus is true
but seat_get_focus() returns NULL, leading to a segfault when we try to
dereference it.
Fix the issue both by updating has_focus in seat_node_destroy() and by
adding an assertion in seat_get_focus() that ensures focus_stack and
has_focus are in sync, which will make it easier to track down similar
issues in the future.
Fixes #6395.
[1] There's some discussion in #1585 from when this was implemented
about whether has_focus is actually necessary; it's possible we could
remove it entirely, but for the moment this is the architecture we have.
* swaybar: fix tray_padding vs min-height re: scale
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
* swaybar: fix tray item icon scaling, positioning
* container: Fix crash when view unmaps + maps quickly
Followup on 4e4898e90f.
If a view quickly maps and unmaps repeatedly, there will be multiple
destroyed containers with same view in a single transaction. Each of
these containers will then try to destroy this view, resulting in use
after free.
The container should only destroy the view if the view still belongs
to the container.
Simple reproducer: couple XMapWindow + XUnmapWindow in a loop followed
by XDestroyWindow.
See #6605
* commands/move: Fix crash when pos_y is omitted
Fixes #6737
* Destroy sub-surfaces with parent layer-shell surface
Closes: https://github.com/swaywm/sway/issues/6337
* Add safety assert in parse_movement_unit
Let's add this just in case a caller passes argc == 0.
References: https://github.com/swaywm/sway/issues/6737#issuecomment-1008082540
* meson: check: false on run_command
Future meson releases will change the default and warns when the
implicit default is used, breaking builds.
Explicitly set check: false to maintain behavior and silence warnings.
* Print deprecation notice when running SUID
SUID privilege drop is needed for the "builtin"-backend of libseat,
which copied our old "direct" backend behavior for the sake of
compatibility and ease of transition.
libseat now has a better alternative in the form of seatd-launch. It
uses the normal seatd daemon and libseat backend and takes care of SUID
for us.
Add a soft deprecation warning to highlight our future intent of
removing this code. The deprecation cycle is needed to avoid surprises
when sway no longer drops privileges.
* xdg-shell: use toplevel geometry to adjust the popup box
`popup_unconstrain` uses view coordinates to init the output box for
popups. However wlroots expects the box to be set in a toplevel surface
coordinate system, which is not always equal to view. The difference
between those is a window geometry set via xdg-shell.
GTK4 reserves some space for client-side decoration and thus has a
window with top left corner not matching to (0, 0) of a surface. The box
calculated without taking that into account was slightly shifted
compared to the actual output and allowed to position part of the popup
off screen.
* build: fix building with basu
02b412a introduced the use of list for sdbus deps, however
it was assuming that all packages which were in a list has a version
higher than 239. That is true for libsystemd and libelogind, since they
use the same versions, however basu is using version numbers which are
way lower than what libsystemd/libelogind are using, so basu only build
is failing.
* Upgrade for wlroots surface refactoring
See [1] for details.
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3412
* commands/focus: drop trailing whitespace
* input/cursor: count pointer gestures as idle activity
Fixes https://github.com/swaywm/sway/issues/6765.
* input/cursor: treat swipe begin as idle activity too
Accidentally overlooked in fd53f80.
* treat fullscreen windows as 'tiled' for commands/focus
* transaction: destroying nodes aren't hidden
Commit 37d7bc69986f ("transaction: Only wait for ack from visible
views") introduced a check which uses view_is_visible() to check if a view
is still visible on the screen. However view_is_visible() will early
return in case the node is in the destroying state. This is incorrect
for transactions, since a destroying view which is visible will trigger
configure events for other clients. This bug was visible when repeatedly
opening and closing two views side by side, since we ignore the
destroying node we get a frame where the still open view is shown with
the old configure values and the rest is the desktop background. The
next frame is than correct again.
Fix this by considering destroying views as visible, we correctly wait
for them and send the configure events to other views in time, fixing
the background flicker.
Fixes #6473
* build: execute wlroots subproject before finding deps
wlroots often requires dependencies more recent than Sway's.
Executing the wlroots subproject first will give Meson a chance to
find these newer dependencies, possibly via subprojects.
The subproject will override the "wlroots" dependency when executed,
so we don't need to use get_variable anymore.
References: https://github.com/swaywm/sway/pull/6498#issuecomment-1001746017
* tray: do not render passive items
https://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/StatusNotifierItem/#org.freedesktop.statusnotifieritem.status
* cmd/swap: error on swapping a container with itself
* input/cursor: pass through pointer hold gestures
This just follows swaywm/wlroots#3047, so `wl_pointer_gestures_v1`
clients can be notified of these events.
* swaynag: remove buffer destruction condition
An address of a variable can never be NULL, so checking it doesn't make
sense; and `destroy_buffer()` can operate on already destroyed buffers
anyway.
Fixes #6780
* Use bools for CLI flags
* xwayland: listen to `request_activate` event
When REAPER submenu is closed `XCB_CLIENT_MESSAGE` with type
`NET_ACTIVE_WINDOW` is sent to set focus to parent menu.
Closes: https://github.com/swaywm/sway/issues/6324
* chore: chase wlr_output_layout_get_box() update
https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3439
* Chase wlroots xdg-shell refactor
* Minor update to focus_on_window_activation
Removed xwayland limitation since wayland clients are supported via xdg-activation.
* Translated README into Italian
* readme: add link to Italian translation
* readme: sort language list alphabetically
* readme: use relative links for translations
* xdg-shell: use wlr_xdg_toplevel in sway_view
Improved type safety.
Closes: https://github.com/swaywm/sway/issues/6813
* xdg-shell: use wlr_xdg_popup in sway_xdg_popup
Improved type safety.
* Fix snprintf compiler warning
* Remove all sprintf calls
Replace them with snprintf, which ensures buffer overflows won't
happen.
* sway/commands: add missing wlr_keyboard interface include in xkb_switch_layout
* sway/input: use wlr_input_device from input device base
* Remove some erroneous apostrophes in comments
* Don't enter seatop_move_floating when fullscreen
Currently, a floating window that's been fullscreened can send us
xdg_toplevel::move, and we'll enter seatop_move_floating, which lets us
drag the surface around while it's fullscreen. We don't want
this--fullscreen surfaces should always be aligned to the screen--so add
the same check that seatop_default already does when entering this mode.
Tested with Weston's weston-fullscreen demo, which sends a move request
if you click anywhere on its surface.
* swaynag: die on all allocation failures
* sway/input: don't pass possibly invalid modifiers pointer
active_keyboard may be NULL, in which case an invalid pointer could be
passed to wlr_input_method_keyboard_grab_v2_send_modifiers. This
procedure call is unnecessary since wlroots commit 372a52ec "input
method: send modifiers in set_keyboard", so the call can simply be
removed.
Fixes #6836.
* sway/input: destroy sway_switch properly
Fix: #6861
Added seat_device_destroy function to seat_device_destroy function.
* commands/focus: fix segfault when no container is already focused.
Fixes #6690.
* Remove WLR_SWITCH_STATE_TOGGLE usage
Ref [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/commit/4792446ee8f50104bd207d9ccd8558a7e4eb4514
* Replace pcre with pcre2
Closes: https://github.com/swaywm/sway/issues/6838
* swaybar: remove swaybar_output.input_region
No need to keep the region around, we can immediately destroy it
after the wl_surface.set_input_region request.
* swaybar: set opaque region
When the background color is fully opaque, set the surface's opaque
region to the whole surface.
* Updating criteria checking with PCRE2
* swaynag: allocate button_details with details
They are used together, so it doesn't make sense to allocate them
separately.
* swaynag: statically allocate button_close, and move declaration
Every swaynag has a close button, so it doesn't make sense to
allocate it dynamically. The declaration is moved later to when
it is actually needed.
* swaynag: remove unnecessary zero of swaynag struct
Global variables are initialized to 0.
* swaynag: remove redundant status variables in main
Instead, we just use `status` for all failures.
* remove unnecessary strlen call
* sway/input/cursor: take device mm size from wlr_tablet
* sway/input/seat: take output name from specialized input device
* sway/input: follow up wlroots input device events renaming
* sway/input: fix bad position of wlr_drag
* sway/input: wlr_seat_keyboard() now takes wlr_keyboard
* bash-completion: localize variables
* sway/main: move constants off the stack
This makes stack traces from gdb slightly easier to read.
* Fix farsi label
* Avoid format-truncation warning
The existing code gives this error when compiled with GCC 12:
../sway/server.c: In function ‘server_init’:
../sway/server.c:217:75: error: ‘%d’ directive output may be truncated writing between 1 and 11 bytes into a region of size 8 [-Werror=format-truncation=]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~
../sway/server.c:217:66: note: directive argument in the range [-2147483647, 32]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~
../sway/server.c:217:17: note: ‘snprintf’ output between 10 and 20 bytes into a destination of size 16
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Because i is never negative, this is a false positive, but it is easy to
change i to unsigned to silence the error.
* Shuffle variables to satisfy -Werror=restrict
This also fixes an invalid strlen invocation on uninitialized memory.
* layer_shell: keep output non-NULL wherever possible
Our layer shell implementation assigns every layer surface to an output
on creation. It tracks this output using the output field on the
underlying wlr_layer_surface_v1 structure. As such, much of the existing
code assumes that output is always non-NULL and omits NULL checks
accordingly.
However, there are currently two cases where we destroy a
sway_layer_surface and output is NULL. The first is when we can't find
an output to assign the surface to and destroy it immediately after
creation. The second is when we destroy a surface in response to its
output getting destroyed, as we set output to NULL in
handle_output_destroy() before we call wlr_layer_surface_v1_destroy(),
which is what calls the appropriate unmap and destroy callbacks.
The former case doesn't cause any problems, since we haven't even
allocated a sway_layer_surface at that point or registered any
callbacks. The latter case, however, currently triggers a crash (#6120)
if a popup is visible, since our popup_handle_unmap() implementation
can't handle a NULL output.
To fix this issue, keep output set until right before we free the
sway_layer_surface. All we need to do is remove some of the cleanup
logic from handle_output_destroy(), since as of commit c9060bcc12d0
("layer-shell: replace close() with destroy()") that same logic is
guaranteed to be happen later when wlroots calls handle_destroy() as
part of wlr_layer_surface_v1_destroy().
This lets us remove some NULL checks from other unmap/destroy callbacks,
which is nice. We also don't need to check that the wlr_output points to
a valid sway_output anymore, since we unset that pointer after disabling
the output as of commit a0bbe67076b8 ("Address emersions comments on
output re-enabling") Just to be safe, I've added assertions that the
wlr_output is non-NULL wherever we use it.
Fixes #6120.
* Chase wlroots X11 hints update
* Add Swedish README
* Support cursor capture in grimshot
Refactor argument parser
Bring back `sh` compatibility
Default to NOTIFY=no
* Update grimshot.1.scd
Fixed typo. The object is **files**, which is plural. **image** modifies files; it's not countable.
* xkb_switch_layout: fix relative layout switches
Fixes #6011
* Implement ext-session-lock-v1
* Avoid inspecting a NULL view in seat_set_focus
Fixes #6968
* swaynag: do error checking and rename read_from_stdin
read_from_stdin not only read from stdin, but trimming trailing
newlines, so rename it to reflect this.
* swaynag: improve robustness when loading config
* swaynag: combine consecutive declaration/assignments
* config: Remove unused mouse binding structure
Mouse bindings are handled alongside normal bindings. Remove the unused
separate data structure definition to avoid confusion.
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
* Replace strncpy with memcpy
strncpy is useless here, is dangerous because it doesn't guarantee
that the string is NUL-terminated and causes the following warning:
../sway/criteria.c: In function ‘criteria_parse’:
../sway/criteria.c:712:25: error: ‘strncpy’ destination unchanged after copying no bytes [-Werror=stringop-truncation]
712 | strncpy(value, valuestart, head - valuestart);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Add descriptions for `stacking` and `tabbed` layouts
Resolves #5918
* man: Fix trailing spaces
* server: request xdg-shell v2
Wlroots does not yet support the newer xdg-shell versions and now
requires the compositor to set the supported xdg-shell version during
creation. Set this to v2 for sway as well.
Fixes https://github.com/swaywm/sway/issues/7001
* realtime: request SCHED_RR using CAP_SYS_NICE
Try to gain SCHED_RR (round-robin) realtime scheduling privileges before
starting the server. This requires CAP_SYS_NICE on Linux systems.
We additionally register a pthread_atfork callback which resets the
scheduling class back to SCHED_OTHER (the Linux system default).
Due to CAP_SYS_NICE, setting RLIMIT_RTPRIO has no effect on the process
as documented within man 7 sched (from Linux):
Privileged (CAP_SYS_NICE) threads ignore the RLIMIT_RTPRIO limit;
as with older kernels, they can make arbitrary changes to
scheduling policy and priority. See getrlimit(2) for further
information on RLIMIT_RTPRIO
Note that this requires the sway distribution packagers to set the
CAP_SYS_NICE capability on the sway binary.
Supersedes #6992
* ext-session-lock: disable direct scan-out when locked
* Polish the language in README.zh-CN.md & sync with English one
Co-Authored-By: Urey. Xue <urey.s.knowledge@gmail.com>
* De-duplicate IPC output descriptions
* Handle NULL output make/model/serial
* chore: chase wlroots xdg-shell update
* xdg-shell: schedule a configure on maximize request
This commit reverts 03879290dbee26127f6867ef60bc2a7f9a6c8c5f and
fc84bcb7fb0ffa29b1f9bed287762241a3473803.
* Add a Hindi (हिन्दी) translation to the README
Hindi is one of the most prominent languages of the Indian Subcontinent.
This commit adds the translation of the README into the Hindi language.
Some of the words are still written in English because there wasn't an
appropriate technical term of the word in the language.
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
* sway: add bindgesture command
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
* build: link with -pthread
Fixes the following FreeBSD error:
ld: error: undefined symbol: pthread_getschedparam
>>> referenced by realtime.c:25 (../sway/realtime.c:25)
>>> sway/sway.p/realtime.c.o:(set_rr_scheduling)
Fixes: a3a82efbf6b5 ("realtime: request SCHED_RR using CAP_SYS_NICE")
* ipc: remove chatty debug log messages
These aren't particularly useful, and clobber the debug logs.
* Refuse to start when SUID is detected
This ensures that those surprised by the deprecation of SUID operation
receive an error rather than accidentally having sway run as root.
This detection will be removed in a future release.
* swaynag: move close_button up to fix SIGSEGV
When swaynag_parse_options encounters '--dismiss-button' (or its
shorthand '-s'), it sets the text of the first button in the
swaynag.buttons list, which is expected to exist and to be the dismiss
button, to the one passed by the user.
Commit 4780afb68b4ee2cdf0e4925f40cf885819f8a74a ("swaynag: statically
allocate button_close, and move declaration") moved the list
initialization to after swaynag_parse_options is called which made that
code fail.
For example, the command 'swaynag --dismiss-button Dismiss' crashes and
'swaynag --message Message --button Yes "" --dismiss-button Dismiss'
shows the wrong buttons.
Move it back to before swaynag_parse_options is called.
* config/output: use wlr_output_commit_state
This makes the code more robust because we don't potentially leave
bad state in wlr_output.pending behind anymore. This also fixes a
bug.
Closes: https://github.com/swaywm/sway/issues/7043
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3610
* Allocate enough space for `cmd_results->error`
* Remove access to wlr_input_device union
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3626
Closes: https://github.com/swaywm/sway/issues/7077
* Rename dpms output command to power
The "dpms" command refers to VESA Display Power Management
Signaling, a deprecated standard. It's superseded by VESA DPM.
Instead of tying out command name to a particular standard, use the
neutral term "power".
* Strip quotes in bindsym --input-device=...
If the input device is quoted, which is common when using variables in the
config file, those quotes must be ignored here, or the input device will be
ignored.
Fixes #7029.
* Avoid unecessary string copy
* Reject font values that are invalid for pango
Use pango to parse font configuration early, and reject the command as
invalid if the value is invalid for pango. Since we're already parsing
the font into a `PangoFontDescription`, keep that instance around and
avoid re-parsing the font each time we render text.
Fixes: https://github.com/swaywm/sway/issues/6805
* Reuse parsed PangoFontDescription
Avoids parsing the configured font each time text is rendered.
* ipc: add "power" to output reply
* config.in: switch to `output power`
* Remove internal references to DPMS
While at it, use an int for the config field, just like we do for
all other fields.
* fix: remove redundant empty statement in main.c
This semi-colon looks like a typo. Luckily, it has no effect on the code as it's treated as an empty statement leading the switch case.
Really straightforward nitpick change, was just something I was confused by when reading over the code.
* input: chase delta_discrete semantics change
* swaymsg: fix floating_nodes being ignored
Fix floating_nodes being ignored in pretty_print_tree.
* ipc: make get_deco_rect check config->hide_lone_tab
Without this, the `IPC_GET_TREE` ipc call would return false information
about the container's `deco_rect` and `rect` properties if
`hide_edge_borders --i3` was in effect.
* grimshot: fix tilde expansion within quotes
* Enable single-pixel-buffer-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3428
* sway-output.5: improve display of parameter
Since "width" and "height" are separate parameters, show them as such.
* man: sway(5) move fixes
* ipc: drop WLR_OUTPUT_ADAPTIVE_SYNC_UNKNOWN case
This has been removed from wlroots.
* config/output: test adaptive sync
Required for [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3637
* Fix crash in xdg_activation_v1.c
wlr_xdg_surface_from_wlr_surface() can return a NULL pointer, so check for NULL before dereferencing it.
* sway: Add non-desktop-output type
Currently, when encountering a non-desktop display, sway offers the
output for leasing and returns without storing it in a sway specific
output type like `struct sway_output`. Additionally, running
`swaymsg -t get_outputs` doesn't show non-desktop outputs.
This commit stores the non-desktop outputs into a struct called
`sway_output_non_desktop`, and adds them to a list on `sway_root`
* sway: add non-desktop outputs to json when running `swaymsg -t get_outputs`
* swaymsg: show non-desktop property when pretty printing outputs
* man: Add XWayland information
* ipc: expose mode picture aspect ratio
* swaymsg: show mode picture aspect ratio
* build: simplify protocol paths
No need for arrays here.
* sway/commands/output: Add command for unplugging non-physical outputs
* Improve Japanese translation
* allow pointer_constraints on layer_shell surfaces
* check for NULL
* use seat directly
* Use keyboard_state.focused_surface directly
* input: focus floating container when clicked on border
Fixes #7209.
* input: focus container when scrolling on titlebar
Fixes #6503.
* Fix leaks in criteria_destroy()
* Avoid double free in criteria_destroy()
* Add support for ext-idle-notify-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3753
* input: tweak focus behavior to allow focusing parent containers
Sway focuses the inactive child when focusing split containers. However,
there is currently no way to focus the parent container itself by mouse.
A user must use the keyboard to do so.
This commit maintains the current behavior, but makes it such that a
second click on the split container titlebar (i.e., after its children
are visible) focuses the split container itself.
* Fix keymap being NULL and segfaulting on dev add
Moved `libinput_config` to the callers of
`sway_input_configure_libinput_device` so that we send the event after
the added event.
* Rework session lock keyboard focus handling
When removing outputs, it is possible to end up in a situation where
none of the session lock client's surfaces have keyboard focus,
resulting in it not receiving keyboard events. Track the focused
surface and update it as needed on surface destroy.
* Fix focus tracking when session lock is active
Remove the incorrect attempt to block focus changes when an input grab
is present and replace it with the same logic used for layer_shell-based
screen lockers: restore the focus after changing it.
This fixes a use-after-free of seat->workspace if outputs are destroyed
while a screen lock is enabled.
* container_floating_set_default_size: Store workspace size box on the stack
* Support libinput's 1.21 new dwtp option
Support the new dwtp (disable while trackpointing) option introduced in
libinput 1.21, allowing users to control whether the trackpoint (like
those in Thinkpads, but not only) should be disabled while using the
keyboard/touchpad.
See: https://gitlab.freedesktop.org/libinput/libinput/-/issues/731
* tree: support formatting null titles
Any windows that have never had a title set visually behave closer to
that of an empty title, but are unformattable, as the code bails out
early on a NULL title.
* criteria: allow matching on empty (NULL) titles
* criteria: allow matching for NULL string criteria
* ci: install hwdata
* Use wl_signal_emit_mutable()
This function fixes segfaults when emitting a signal potentially
removes arbitrary listeners.
* Use wlr_damage_ring
wlr_output_damage is to be replaced with wlr_damage_ring, so use that.
* lock: fix crash on output destroy
Closes: https://github.com/swaywm/sway/issues/7120
* container_get_siblings: handle NULL workspace
* ci: checkout wlroots 0.16.0
* workspace_create: Don't allow NULL name
(cherry picked from commit 34933bb84350fe805d82276ea02d5732546e9993)
* output: set damage ring bounds to pixel values
Fixes: https://github.com/swaywm/sway/issues/7254
(cherry picked from commit 85005b52fe5b832e4ea914fa28048b0c5c803769)
* Use shm_open instead of mkstemp
shm_open is more reliable because it does not require
a writeable filesystem folder, unlike mkstemp.
(cherry picked from commit e2bc8866f46701e9c825ad7fa5baac02b2e4898f)
* build: drop wayland-scanner fallback
(cherry picked from commit 366f6ef3d31688631dc453028e108f98a1d7ab57)
* build: unify server & client protocol generation
No need to make a difference here, let's just generate header
files for both.
(cherry picked from commit 5be5a038da8a3789a19945719f2a27233291445d)
* build: drop "server" from target name for protocol code
(cherry picked from commit e5475d9310941ce88ed016ce1515b36e3a440252)
* build: drop intermediate libraries for protocols
(cherry picked from commit af8a5a8918ef42336194fb1077b008a736de7af9)
* root: move the workspace matching code to its own file
This removes the pid_workspace bits from tree/root before it gets
too interesting.
No functional change.
(cherry picked from commit eb5021ef990fb29ff86544aea58d687ad62c757a)
* node: prettify node type names
(cherry picked from commit 1c4b94ae3ca94b972410c80a61404a347af1ee68)
* launcher: track workspaces by node
This removes the need to rename the pid_workspaces when a workspace
is renamed.
It also opens the possibility of tracking other node types. Tracking
containers would allow application to be placed correctly in the
container tree even if the user has moved their focus elsewhere since
it was launched.
(cherry picked from commit 3b49f2782e8faf68766269b9c7390b16e25ae824)
* launcher: use xdga tokens
This reuses wlroots token tracking for workspace matching. It doesn't
export any xdga tokens for clients yet.
(cherry picked from commit bd66f4943da1c96edc3ba49573e27b42b688c543)
* launcher: rename pid_workspace to launcher_ctx
Soon we will match views with more than just a pid.
(cherry picked from commit d75c9f9722389d441fd24bd490c5cf12c4bef39a)
* view: associate launch contexts with views
Views now maintain a reference to a launch context which, as a last
resort, is populated at map time with a context associated with its pid.
This opens the possibility of populating it before map via another
source, e.g. xdga-tokens or configuration.
(cherry picked from commit 864b3a9a18f236f92f1898bb44ab977ceaebfd68)
* launcher: initialize launcher_ctxs once on startup
(cherry picked from commit 66568508c06267445489d655c91c94a34d6d9ffe)
* launcher: fudge the interface a bit
We want to create a context before knowing the pid it will match with.
(cherry picked from commit bdeb9f95651f6c99cc2f4cfb59020ddee202cf36)
* launcher: export xdga tokens and use them for workspace matching
(cherry picked from commit 30ad4dc4a5a41ce7c7aa85096a6e18f374172983)
* launcher: export X startup ids and use them for workspace matching
(cherry picked from commit 28fda4c0d38907fab94dc7d82c9dcf0754748b4e)
* swaybar: Prioritize hotspot events to bar bindings
This is consistent with i3bar's behaviour, and for example, allows binding a
command to button1, while still being able to click on tray icons or other
zones on the bar's status line which may have their own bindings.
E.g., in Sway, without this commit, this config. makes tray icons unclickable:
bar {
# ...
bindsym button1 exec swaynag -m You_clicked_the_tray._Want_some_help?
}
But the same configuration in i3 (with i3-nagbar) keeps tray items clickable.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 53f9dbd424dc173a85c9f4cd30802259d38b1ef4)
* swaybar: Make hotspots block bar release bindings
The previous commit prioritized hotspots before bar bindings for press events,
which matches i3's behaviour. However, since hotspots don't need to do any
processing on release events, those were not handled, and simply fell through
to `bindsym --release` bar bindings (if any).
This is counter-intuitive, and doesn't match i3's behaviour. Instead in case
a hotspot handles the press event, it should also handle the release event,
doing nothing, but blocking the event from triggering a --release bar binding.
E.g., in Sway, without this commit, this config. shows a text on tray clicks:
bar {
# ...
bindsym --release button1 exec swaynag -m I_got_the_release_event.
}
But the same configuration in i3 (with i3-nagbar) doesn't show the text.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 94b69acf0d7b26ee5af2172300cb18473508da76)
* build: drop unused wayland-egl dependency
(cherry picked from commit 37e4a3d6370dc6ba2b0877d588845c06781e880e)
* build: bump version to 1.8-rc1
* Fix build on Debian Stable
(cherry picked from commit dca0bb5749bc16f91ab964fc1b06ebb9a453368f)
* build: fix have_xwayland when xcb-icccm is not found
xcb-icccm is required to build Xwayland support.
Backported from commit d41f11e6bd8cef80f02dda4c66d4a31611aed753.
* build: bump version to 1.8-rc2
* seat: Avoid sending redundant keymaps on reload
When we reload the config, we reset every input device and re-apply
configuration from the config file. This means that the keyboard keymap
is updated at least once during config reload, more if the config file
contains keyboard configuration.
When they keyboard keymap changes and is updated through wlr_seat, the
keymap ends up sent to every keyboard bound in every client, seemingly
multiple times. On an x230 of mine with a keyboard layout set in the
config file, I see 42 keymap events sent to foot on config reload.
Reduce events from keyboard configurations by skipping all but the
currently active keyboard for the seat, and by clearing the active
keyboard during input manager device reset. After this change, I only
see a single just-in-time keymap event.
Fixes: https://github.com/swaywm/sway/issues/6654
* criteria: be lenient on window_role and instance too
* build: bump version to 1.8-rc3
* commands/move: Warp cursor after moving workspace to another output
This makes sway's behavior consistent with i3 when `mouse_warping` is
set to any value besides `none`.
Fixes #7027.
(cherry picked from commit e3c63bf58d0744dfb436f0f38442ce3735e40f47)
* seat: Set keyboard if seat keyboard is NULL
sway sends wl_keyboard.enter on seat focus change and when a keyboard
active on a seat is configured. If all keyboards are removed and a
keyboard is added back without changing the focused client, no new
notify event would be sent despite having keyboard focus. This could
lead to key events without notify, which is a protocol violation.
As a quick fix, when configuring a keyboard on a seat where no keyboard
is currently active, activate the keyboard so that a focused surface
will receive a notify event.
Regressed by: e1b268af98edeb09e570e8855ef64f0719cbafe2
Closes: https://github.com/swaywm/sway/issues/7330
(cherry picked from commit 1ade0ce753dc5f588584f444ce80d27c3b1e4300)
* build: bump version to 1.8-rc4
* swaynag: fix NULL font description
The font description was only set if provided on the CLI. It was
left NULL for the defaults and when reading from the config file.
Closes: https://github.com/swaywm/sway/issues/7186
(cherry picked from commit fd0af78e43f4dd67a404f475c676b25ae38a4b82)
* build: bump version to 1.8
* Removed other README languages
* Fixed build issues
* Removed alpha from render_data struct
* Updated PKGBUILDs and COPR spec
* Update sway/desktop/render.c
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
* Fixed deco_data not being initialized properly
* Replaced wlr_egl_(make|unset)_current with eglMakeCurrent
* Added matrix_projection into fx_renderer
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: Sefa Eyeoglu <contact@scrumplex.net>
Co-authored-by: Simon Ser <contact@emersion.fr>
Co-authored-by: Seth Barberee <seth.barberee@gmail.com>
Co-authored-by: Thomas Hebb <tommyhebb@gmail.com>
Co-authored-by: Nathan Schulte <nmschulte@gmail.com>
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
Co-authored-by: David Rosca <nowrep@gmail.com>
Co-authored-by: David96 <david@hameipe.de>
Co-authored-by: Kenny Levinsen <kl@kl.wtf>
Co-authored-by: Aleksei Bavshin <alebastr89@gmail.com>
Co-authored-by: Kirill Chibisov <contact@kchibisov.com>
Co-authored-by: Tudor Brindus <me@tbrindus.ca>
Co-authored-by: Patrick Hilhorst <git@hilhorst.be>
Co-authored-by: Rouven Czerwinski <rouven@czerwinskis.de>
Co-authored-by: Tobias Bengfort <tobias.bengfort@posteo.de>
Co-authored-by: Ronan Pigott <rpigott@berkeley.edu>
Co-authored-by: Kirill Primak <vyivel@eclair.cafe>
Co-authored-by: Tuomas Yrjölä <mail@yrhki.fi>
Co-authored-by: Kirill Primak <vyivel@posteo.net>
Co-authored-by: Alexander Browne <elcste@users.noreply.github.com>
Co-authored-by: Marco Rubin <20150305+Rubo3@users.noreply.github.com>
Co-authored-by: Muhamed Hobi <woohoomoo2u@gmail.com>
Co-authored-by: Simon Zeni <simon@bl4ckb0ne.ca>
Co-authored-by: Nihal Jere <nihal@nihaljere.xyz>
Co-authored-by: Alexander Gramiak <agrambot@gmail.com>
Co-authored-by: Moon Sungjoon <sumoon@seoulsaram.org>
Co-authored-by: Nicolas Avrutin <nicolas@avrutin.net>
Co-authored-by: ndren <andreien@ctemplar.com>
Co-authored-by: Bill Li <billli11hkb@gmail.com>
Co-authored-by: Leonardo Hernández Hernández <leohdz172@protonmail.com>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Co-authored-by: Manuel Stoeckl <code@mstoeckl.com>
Co-authored-by: Yasin Silavi <59373143+sttatusx@users.noreply.github.com>
Co-authored-by: Daniel De Graaf <code@danieldg.net>
Co-authored-by: kraftwerk28 <kefirchik3@gmail.com>
Co-authored-by: Eskil <67291226+eschillus@users.noreply.github.com>
Co-authored-by: Alice Carroll <git@alice-carroll.pet>
Co-authored-by: Alan <51193876+Pound-Hash@users.noreply.github.com>
Co-authored-by: Victor Makarov <vitja.makarov@gmail.com>
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: -k <slowdive@me.com>
Co-authored-by: Hongyi <61831273+FrozenArcher@users.noreply.github.com>
Co-authored-by: Urey. Xue <urey.s.knowledge@gmail.com>
Co-authored-by: LordRishav <75823494+LordRishav@users.noreply.github.com>
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
Co-authored-by: Florian Franzen <Florian.Franzen@gmail.com>
Co-authored-by: Greg Depoire--Ferrer <greg@gregdf.com>
Co-authored-by: Thomas Jost <schnouki@schnouki.net>
Co-authored-by: Hugo Osvaldo Barrera <hugo@barrera.io>
Co-authored-by: zkldi <ktchidev@gmail.com>
Co-authored-by: llyyr <llyyr.public@gmail.com>
Co-authored-by: Baltazár Radics <baltazar.radics@gmail.com>
Co-authored-by: Martin Michlmayr <tbm@cyrius.com>
Co-authored-by: Filip Szczepański <jazz2rulez@gmail.com>
Co-authored-by: Alex Maese <memaese@hotmail.com>
Co-authored-by: マリウス <marius@xn--gckvb8fzb.com>
Co-authored-by: Andri Yngvason <andri@yngvason.is>
Co-authored-by: ohno418 <yutaro.ono.418@gmail.com>
Co-authored-by: Ferdinand Schober <ferdinand.schober@fau.de>
Co-authored-by: cparm <armelcadetpetit@gmail.com>
Co-authored-by: Yaroslav de la Peña Smirnov <yps@yaroslavps.com>
Co-authored-by: Alexander Orzechowski <orzechowski.alexander@gmail.com>
Co-authored-by: pudiva chip líquida <pudiva@skylittlesystem.org>
Co-authored-by: Puck Meerburg <puck@puckipedia.com>
Co-authored-by: Callum Andrew <calcium@mailbox.org>
Co-authored-by: Ronan Pigott <ronan@rjp.ie>
Co-authored-by: Joan Bruguera <joanbrugueram@gmail.com>
Co-authored-by: nerdopolis <bluescreen_avenger@verizon.net>
Co-authored-by: Ankit Pandey <anpandey@protonmail.com>
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
2023-01-05 09:32:43 +11:00
|
|
|
*max_width = box.width;
|
2018-07-26 18:36:46 +10:00
|
|
|
} else {
|
2019-03-02 18:29:28 +11:00
|
|
|
*max_width = config->floating_maximum_width;
|
2018-07-26 18:36:46 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
if (config->floating_maximum_height == -1) { // no maximum
|
2019-03-02 18:29:28 +11:00
|
|
|
*max_height = INT_MAX;
|
2018-07-26 18:36:46 +10:00
|
|
|
} else if (config->floating_maximum_height == 0) { // automatic
|
rebase: Sway 1.8 (#78)
* build: bump wlroots dependency to 0.16.0
* swaymsg: replace if with switch in pretty_print
* swaymsg: add GET_TREE pretty-printing
* swaybar: fix errno handling in status_handle_readable
If getline fails once, it was not reset before the next getline
call. errno is only overwritten by getline on error.
* Add cairo_image_surface_create error handling
cairo_image_surface_create can fail, e.g. when running out of
memory or when the size is too big. Avoid crashing in this case.
Closes: https://github.com/swaywm/sway/issues/6531
* build: bump version to 1.8-dev
Historically we've been sticking with the last release number in
the master branch. However that's a bit confusing, people can't
easily figure out whether they're using a release or a work-in-progress
snapshot. Only the commit hash appended to the version number may
help, but that's not very explicit and disappears when using a
tarball.
We could bump the version in master to the next release number.
However during the RC cycle there would be a downgrade from 1.8 to
1.8-rc1. Also it would be hard to tell the difference between a
stable release and an old snapshot.
This patch introduces a new pre-release identifier, "dev". It's
alphabetically before "rc" so it should be correctly sorted by
semver comparisons. "dev" is upgraded to "rc" (and then to stable)
when doing a release. The master branch always uses a "dev"
version, only release branches use "rc" or stable versions.
* [IPC] Add repeat delay/rate info to keyboard
Closes #6735
wlroots already has the info in the struct so let's access it and print it out.
* input/seat: unset has_focus when focus_stack becomes empty
We currently track the focus of a seat in two ways: we use a list called
focus_stack to track the order in which nodes have been focused, with
the first node representing what's currently focused, and we use a
variable called has_focus to indicate whether anything has focus--i.e.
whether we should actually treat that first node as focused at any given
time.
In a number of places, we treat has_focus as implying that a focused
node exists. If it's true, we attempt to dereference the return value of
seat_get_focus(), our helper function for getting the first node in
focus_list, with no further checks. But this isn't quite correct with
the current implementation of seat_get_focus(): not only does it return
NULL when has_focus is false, it also returns NULL when focus_stack
contains no items.
In most cases, focus_stack never becomes empty and so this doesn't
matter at all. Since focus_stack stores a history of focused nodes, we
rarely remove nodes from it. The exception to this is when a node itself
goes away. In that case, we call seat_node_destroy() to remove it from
focus_stack and free it. But we don't unset has_focus if we've removed
the final node! This lets us get into a state where has_focus is true
but seat_get_focus() returns NULL, leading to a segfault when we try to
dereference it.
Fix the issue both by updating has_focus in seat_node_destroy() and by
adding an assertion in seat_get_focus() that ensures focus_stack and
has_focus are in sync, which will make it easier to track down similar
issues in the future.
Fixes #6395.
[1] There's some discussion in #1585 from when this was implemented
about whether has_focus is actually necessary; it's possible we could
remove it entirely, but for the moment this is the architecture we have.
* swaybar: fix tray_padding vs min-height re: scale
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
* swaybar: fix tray item icon scaling, positioning
* container: Fix crash when view unmaps + maps quickly
Followup on 4e4898e90f.
If a view quickly maps and unmaps repeatedly, there will be multiple
destroyed containers with same view in a single transaction. Each of
these containers will then try to destroy this view, resulting in use
after free.
The container should only destroy the view if the view still belongs
to the container.
Simple reproducer: couple XMapWindow + XUnmapWindow in a loop followed
by XDestroyWindow.
See #6605
* commands/move: Fix crash when pos_y is omitted
Fixes #6737
* Destroy sub-surfaces with parent layer-shell surface
Closes: https://github.com/swaywm/sway/issues/6337
* Add safety assert in parse_movement_unit
Let's add this just in case a caller passes argc == 0.
References: https://github.com/swaywm/sway/issues/6737#issuecomment-1008082540
* meson: check: false on run_command
Future meson releases will change the default and warns when the
implicit default is used, breaking builds.
Explicitly set check: false to maintain behavior and silence warnings.
* Print deprecation notice when running SUID
SUID privilege drop is needed for the "builtin"-backend of libseat,
which copied our old "direct" backend behavior for the sake of
compatibility and ease of transition.
libseat now has a better alternative in the form of seatd-launch. It
uses the normal seatd daemon and libseat backend and takes care of SUID
for us.
Add a soft deprecation warning to highlight our future intent of
removing this code. The deprecation cycle is needed to avoid surprises
when sway no longer drops privileges.
* xdg-shell: use toplevel geometry to adjust the popup box
`popup_unconstrain` uses view coordinates to init the output box for
popups. However wlroots expects the box to be set in a toplevel surface
coordinate system, which is not always equal to view. The difference
between those is a window geometry set via xdg-shell.
GTK4 reserves some space for client-side decoration and thus has a
window with top left corner not matching to (0, 0) of a surface. The box
calculated without taking that into account was slightly shifted
compared to the actual output and allowed to position part of the popup
off screen.
* build: fix building with basu
02b412a introduced the use of list for sdbus deps, however
it was assuming that all packages which were in a list has a version
higher than 239. That is true for libsystemd and libelogind, since they
use the same versions, however basu is using version numbers which are
way lower than what libsystemd/libelogind are using, so basu only build
is failing.
* Upgrade for wlroots surface refactoring
See [1] for details.
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3412
* commands/focus: drop trailing whitespace
* input/cursor: count pointer gestures as idle activity
Fixes https://github.com/swaywm/sway/issues/6765.
* input/cursor: treat swipe begin as idle activity too
Accidentally overlooked in fd53f80.
* treat fullscreen windows as 'tiled' for commands/focus
* transaction: destroying nodes aren't hidden
Commit 37d7bc69986f ("transaction: Only wait for ack from visible
views") introduced a check which uses view_is_visible() to check if a view
is still visible on the screen. However view_is_visible() will early
return in case the node is in the destroying state. This is incorrect
for transactions, since a destroying view which is visible will trigger
configure events for other clients. This bug was visible when repeatedly
opening and closing two views side by side, since we ignore the
destroying node we get a frame where the still open view is shown with
the old configure values and the rest is the desktop background. The
next frame is than correct again.
Fix this by considering destroying views as visible, we correctly wait
for them and send the configure events to other views in time, fixing
the background flicker.
Fixes #6473
* build: execute wlroots subproject before finding deps
wlroots often requires dependencies more recent than Sway's.
Executing the wlroots subproject first will give Meson a chance to
find these newer dependencies, possibly via subprojects.
The subproject will override the "wlroots" dependency when executed,
so we don't need to use get_variable anymore.
References: https://github.com/swaywm/sway/pull/6498#issuecomment-1001746017
* tray: do not render passive items
https://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/StatusNotifierItem/#org.freedesktop.statusnotifieritem.status
* cmd/swap: error on swapping a container with itself
* input/cursor: pass through pointer hold gestures
This just follows swaywm/wlroots#3047, so `wl_pointer_gestures_v1`
clients can be notified of these events.
* swaynag: remove buffer destruction condition
An address of a variable can never be NULL, so checking it doesn't make
sense; and `destroy_buffer()` can operate on already destroyed buffers
anyway.
Fixes #6780
* Use bools for CLI flags
* xwayland: listen to `request_activate` event
When REAPER submenu is closed `XCB_CLIENT_MESSAGE` with type
`NET_ACTIVE_WINDOW` is sent to set focus to parent menu.
Closes: https://github.com/swaywm/sway/issues/6324
* chore: chase wlr_output_layout_get_box() update
https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3439
* Chase wlroots xdg-shell refactor
* Minor update to focus_on_window_activation
Removed xwayland limitation since wayland clients are supported via xdg-activation.
* Translated README into Italian
* readme: add link to Italian translation
* readme: sort language list alphabetically
* readme: use relative links for translations
* xdg-shell: use wlr_xdg_toplevel in sway_view
Improved type safety.
Closes: https://github.com/swaywm/sway/issues/6813
* xdg-shell: use wlr_xdg_popup in sway_xdg_popup
Improved type safety.
* Fix snprintf compiler warning
* Remove all sprintf calls
Replace them with snprintf, which ensures buffer overflows won't
happen.
* sway/commands: add missing wlr_keyboard interface include in xkb_switch_layout
* sway/input: use wlr_input_device from input device base
* Remove some erroneous apostrophes in comments
* Don't enter seatop_move_floating when fullscreen
Currently, a floating window that's been fullscreened can send us
xdg_toplevel::move, and we'll enter seatop_move_floating, which lets us
drag the surface around while it's fullscreen. We don't want
this--fullscreen surfaces should always be aligned to the screen--so add
the same check that seatop_default already does when entering this mode.
Tested with Weston's weston-fullscreen demo, which sends a move request
if you click anywhere on its surface.
* swaynag: die on all allocation failures
* sway/input: don't pass possibly invalid modifiers pointer
active_keyboard may be NULL, in which case an invalid pointer could be
passed to wlr_input_method_keyboard_grab_v2_send_modifiers. This
procedure call is unnecessary since wlroots commit 372a52ec "input
method: send modifiers in set_keyboard", so the call can simply be
removed.
Fixes #6836.
* sway/input: destroy sway_switch properly
Fix: #6861
Added seat_device_destroy function to seat_device_destroy function.
* commands/focus: fix segfault when no container is already focused.
Fixes #6690.
* Remove WLR_SWITCH_STATE_TOGGLE usage
Ref [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/commit/4792446ee8f50104bd207d9ccd8558a7e4eb4514
* Replace pcre with pcre2
Closes: https://github.com/swaywm/sway/issues/6838
* swaybar: remove swaybar_output.input_region
No need to keep the region around, we can immediately destroy it
after the wl_surface.set_input_region request.
* swaybar: set opaque region
When the background color is fully opaque, set the surface's opaque
region to the whole surface.
* Updating criteria checking with PCRE2
* swaynag: allocate button_details with details
They are used together, so it doesn't make sense to allocate them
separately.
* swaynag: statically allocate button_close, and move declaration
Every swaynag has a close button, so it doesn't make sense to
allocate it dynamically. The declaration is moved later to when
it is actually needed.
* swaynag: remove unnecessary zero of swaynag struct
Global variables are initialized to 0.
* swaynag: remove redundant status variables in main
Instead, we just use `status` for all failures.
* remove unnecessary strlen call
* sway/input/cursor: take device mm size from wlr_tablet
* sway/input/seat: take output name from specialized input device
* sway/input: follow up wlroots input device events renaming
* sway/input: fix bad position of wlr_drag
* sway/input: wlr_seat_keyboard() now takes wlr_keyboard
* bash-completion: localize variables
* sway/main: move constants off the stack
This makes stack traces from gdb slightly easier to read.
* Fix farsi label
* Avoid format-truncation warning
The existing code gives this error when compiled with GCC 12:
../sway/server.c: In function ‘server_init’:
../sway/server.c:217:75: error: ‘%d’ directive output may be truncated writing between 1 and 11 bytes into a region of size 8 [-Werror=format-truncation=]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~
../sway/server.c:217:66: note: directive argument in the range [-2147483647, 32]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~
../sway/server.c:217:17: note: ‘snprintf’ output between 10 and 20 bytes into a destination of size 16
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Because i is never negative, this is a false positive, but it is easy to
change i to unsigned to silence the error.
* Shuffle variables to satisfy -Werror=restrict
This also fixes an invalid strlen invocation on uninitialized memory.
* layer_shell: keep output non-NULL wherever possible
Our layer shell implementation assigns every layer surface to an output
on creation. It tracks this output using the output field on the
underlying wlr_layer_surface_v1 structure. As such, much of the existing
code assumes that output is always non-NULL and omits NULL checks
accordingly.
However, there are currently two cases where we destroy a
sway_layer_surface and output is NULL. The first is when we can't find
an output to assign the surface to and destroy it immediately after
creation. The second is when we destroy a surface in response to its
output getting destroyed, as we set output to NULL in
handle_output_destroy() before we call wlr_layer_surface_v1_destroy(),
which is what calls the appropriate unmap and destroy callbacks.
The former case doesn't cause any problems, since we haven't even
allocated a sway_layer_surface at that point or registered any
callbacks. The latter case, however, currently triggers a crash (#6120)
if a popup is visible, since our popup_handle_unmap() implementation
can't handle a NULL output.
To fix this issue, keep output set until right before we free the
sway_layer_surface. All we need to do is remove some of the cleanup
logic from handle_output_destroy(), since as of commit c9060bcc12d0
("layer-shell: replace close() with destroy()") that same logic is
guaranteed to be happen later when wlroots calls handle_destroy() as
part of wlr_layer_surface_v1_destroy().
This lets us remove some NULL checks from other unmap/destroy callbacks,
which is nice. We also don't need to check that the wlr_output points to
a valid sway_output anymore, since we unset that pointer after disabling
the output as of commit a0bbe67076b8 ("Address emersions comments on
output re-enabling") Just to be safe, I've added assertions that the
wlr_output is non-NULL wherever we use it.
Fixes #6120.
* Chase wlroots X11 hints update
* Add Swedish README
* Support cursor capture in grimshot
Refactor argument parser
Bring back `sh` compatibility
Default to NOTIFY=no
* Update grimshot.1.scd
Fixed typo. The object is **files**, which is plural. **image** modifies files; it's not countable.
* xkb_switch_layout: fix relative layout switches
Fixes #6011
* Implement ext-session-lock-v1
* Avoid inspecting a NULL view in seat_set_focus
Fixes #6968
* swaynag: do error checking and rename read_from_stdin
read_from_stdin not only read from stdin, but trimming trailing
newlines, so rename it to reflect this.
* swaynag: improve robustness when loading config
* swaynag: combine consecutive declaration/assignments
* config: Remove unused mouse binding structure
Mouse bindings are handled alongside normal bindings. Remove the unused
separate data structure definition to avoid confusion.
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
* Replace strncpy with memcpy
strncpy is useless here, is dangerous because it doesn't guarantee
that the string is NUL-terminated and causes the following warning:
../sway/criteria.c: In function ‘criteria_parse’:
../sway/criteria.c:712:25: error: ‘strncpy’ destination unchanged after copying no bytes [-Werror=stringop-truncation]
712 | strncpy(value, valuestart, head - valuestart);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Add descriptions for `stacking` and `tabbed` layouts
Resolves #5918
* man: Fix trailing spaces
* server: request xdg-shell v2
Wlroots does not yet support the newer xdg-shell versions and now
requires the compositor to set the supported xdg-shell version during
creation. Set this to v2 for sway as well.
Fixes https://github.com/swaywm/sway/issues/7001
* realtime: request SCHED_RR using CAP_SYS_NICE
Try to gain SCHED_RR (round-robin) realtime scheduling privileges before
starting the server. This requires CAP_SYS_NICE on Linux systems.
We additionally register a pthread_atfork callback which resets the
scheduling class back to SCHED_OTHER (the Linux system default).
Due to CAP_SYS_NICE, setting RLIMIT_RTPRIO has no effect on the process
as documented within man 7 sched (from Linux):
Privileged (CAP_SYS_NICE) threads ignore the RLIMIT_RTPRIO limit;
as with older kernels, they can make arbitrary changes to
scheduling policy and priority. See getrlimit(2) for further
information on RLIMIT_RTPRIO
Note that this requires the sway distribution packagers to set the
CAP_SYS_NICE capability on the sway binary.
Supersedes #6992
* ext-session-lock: disable direct scan-out when locked
* Polish the language in README.zh-CN.md & sync with English one
Co-Authored-By: Urey. Xue <urey.s.knowledge@gmail.com>
* De-duplicate IPC output descriptions
* Handle NULL output make/model/serial
* chore: chase wlroots xdg-shell update
* xdg-shell: schedule a configure on maximize request
This commit reverts 03879290dbee26127f6867ef60bc2a7f9a6c8c5f and
fc84bcb7fb0ffa29b1f9bed287762241a3473803.
* Add a Hindi (हिन्दी) translation to the README
Hindi is one of the most prominent languages of the Indian Subcontinent.
This commit adds the translation of the README into the Hindi language.
Some of the words are still written in English because there wasn't an
appropriate technical term of the word in the language.
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
* sway: add bindgesture command
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
* build: link with -pthread
Fixes the following FreeBSD error:
ld: error: undefined symbol: pthread_getschedparam
>>> referenced by realtime.c:25 (../sway/realtime.c:25)
>>> sway/sway.p/realtime.c.o:(set_rr_scheduling)
Fixes: a3a82efbf6b5 ("realtime: request SCHED_RR using CAP_SYS_NICE")
* ipc: remove chatty debug log messages
These aren't particularly useful, and clobber the debug logs.
* Refuse to start when SUID is detected
This ensures that those surprised by the deprecation of SUID operation
receive an error rather than accidentally having sway run as root.
This detection will be removed in a future release.
* swaynag: move close_button up to fix SIGSEGV
When swaynag_parse_options encounters '--dismiss-button' (or its
shorthand '-s'), it sets the text of the first button in the
swaynag.buttons list, which is expected to exist and to be the dismiss
button, to the one passed by the user.
Commit 4780afb68b4ee2cdf0e4925f40cf885819f8a74a ("swaynag: statically
allocate button_close, and move declaration") moved the list
initialization to after swaynag_parse_options is called which made that
code fail.
For example, the command 'swaynag --dismiss-button Dismiss' crashes and
'swaynag --message Message --button Yes "" --dismiss-button Dismiss'
shows the wrong buttons.
Move it back to before swaynag_parse_options is called.
* config/output: use wlr_output_commit_state
This makes the code more robust because we don't potentially leave
bad state in wlr_output.pending behind anymore. This also fixes a
bug.
Closes: https://github.com/swaywm/sway/issues/7043
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3610
* Allocate enough space for `cmd_results->error`
* Remove access to wlr_input_device union
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3626
Closes: https://github.com/swaywm/sway/issues/7077
* Rename dpms output command to power
The "dpms" command refers to VESA Display Power Management
Signaling, a deprecated standard. It's superseded by VESA DPM.
Instead of tying out command name to a particular standard, use the
neutral term "power".
* Strip quotes in bindsym --input-device=...
If the input device is quoted, which is common when using variables in the
config file, those quotes must be ignored here, or the input device will be
ignored.
Fixes #7029.
* Avoid unecessary string copy
* Reject font values that are invalid for pango
Use pango to parse font configuration early, and reject the command as
invalid if the value is invalid for pango. Since we're already parsing
the font into a `PangoFontDescription`, keep that instance around and
avoid re-parsing the font each time we render text.
Fixes: https://github.com/swaywm/sway/issues/6805
* Reuse parsed PangoFontDescription
Avoids parsing the configured font each time text is rendered.
* ipc: add "power" to output reply
* config.in: switch to `output power`
* Remove internal references to DPMS
While at it, use an int for the config field, just like we do for
all other fields.
* fix: remove redundant empty statement in main.c
This semi-colon looks like a typo. Luckily, it has no effect on the code as it's treated as an empty statement leading the switch case.
Really straightforward nitpick change, was just something I was confused by when reading over the code.
* input: chase delta_discrete semantics change
* swaymsg: fix floating_nodes being ignored
Fix floating_nodes being ignored in pretty_print_tree.
* ipc: make get_deco_rect check config->hide_lone_tab
Without this, the `IPC_GET_TREE` ipc call would return false information
about the container's `deco_rect` and `rect` properties if
`hide_edge_borders --i3` was in effect.
* grimshot: fix tilde expansion within quotes
* Enable single-pixel-buffer-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3428
* sway-output.5: improve display of parameter
Since "width" and "height" are separate parameters, show them as such.
* man: sway(5) move fixes
* ipc: drop WLR_OUTPUT_ADAPTIVE_SYNC_UNKNOWN case
This has been removed from wlroots.
* config/output: test adaptive sync
Required for [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3637
* Fix crash in xdg_activation_v1.c
wlr_xdg_surface_from_wlr_surface() can return a NULL pointer, so check for NULL before dereferencing it.
* sway: Add non-desktop-output type
Currently, when encountering a non-desktop display, sway offers the
output for leasing and returns without storing it in a sway specific
output type like `struct sway_output`. Additionally, running
`swaymsg -t get_outputs` doesn't show non-desktop outputs.
This commit stores the non-desktop outputs into a struct called
`sway_output_non_desktop`, and adds them to a list on `sway_root`
* sway: add non-desktop outputs to json when running `swaymsg -t get_outputs`
* swaymsg: show non-desktop property when pretty printing outputs
* man: Add XWayland information
* ipc: expose mode picture aspect ratio
* swaymsg: show mode picture aspect ratio
* build: simplify protocol paths
No need for arrays here.
* sway/commands/output: Add command for unplugging non-physical outputs
* Improve Japanese translation
* allow pointer_constraints on layer_shell surfaces
* check for NULL
* use seat directly
* Use keyboard_state.focused_surface directly
* input: focus floating container when clicked on border
Fixes #7209.
* input: focus container when scrolling on titlebar
Fixes #6503.
* Fix leaks in criteria_destroy()
* Avoid double free in criteria_destroy()
* Add support for ext-idle-notify-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3753
* input: tweak focus behavior to allow focusing parent containers
Sway focuses the inactive child when focusing split containers. However,
there is currently no way to focus the parent container itself by mouse.
A user must use the keyboard to do so.
This commit maintains the current behavior, but makes it such that a
second click on the split container titlebar (i.e., after its children
are visible) focuses the split container itself.
* Fix keymap being NULL and segfaulting on dev add
Moved `libinput_config` to the callers of
`sway_input_configure_libinput_device` so that we send the event after
the added event.
* Rework session lock keyboard focus handling
When removing outputs, it is possible to end up in a situation where
none of the session lock client's surfaces have keyboard focus,
resulting in it not receiving keyboard events. Track the focused
surface and update it as needed on surface destroy.
* Fix focus tracking when session lock is active
Remove the incorrect attempt to block focus changes when an input grab
is present and replace it with the same logic used for layer_shell-based
screen lockers: restore the focus after changing it.
This fixes a use-after-free of seat->workspace if outputs are destroyed
while a screen lock is enabled.
* container_floating_set_default_size: Store workspace size box on the stack
* Support libinput's 1.21 new dwtp option
Support the new dwtp (disable while trackpointing) option introduced in
libinput 1.21, allowing users to control whether the trackpoint (like
those in Thinkpads, but not only) should be disabled while using the
keyboard/touchpad.
See: https://gitlab.freedesktop.org/libinput/libinput/-/issues/731
* tree: support formatting null titles
Any windows that have never had a title set visually behave closer to
that of an empty title, but are unformattable, as the code bails out
early on a NULL title.
* criteria: allow matching on empty (NULL) titles
* criteria: allow matching for NULL string criteria
* ci: install hwdata
* Use wl_signal_emit_mutable()
This function fixes segfaults when emitting a signal potentially
removes arbitrary listeners.
* Use wlr_damage_ring
wlr_output_damage is to be replaced with wlr_damage_ring, so use that.
* lock: fix crash on output destroy
Closes: https://github.com/swaywm/sway/issues/7120
* container_get_siblings: handle NULL workspace
* ci: checkout wlroots 0.16.0
* workspace_create: Don't allow NULL name
(cherry picked from commit 34933bb84350fe805d82276ea02d5732546e9993)
* output: set damage ring bounds to pixel values
Fixes: https://github.com/swaywm/sway/issues/7254
(cherry picked from commit 85005b52fe5b832e4ea914fa28048b0c5c803769)
* Use shm_open instead of mkstemp
shm_open is more reliable because it does not require
a writeable filesystem folder, unlike mkstemp.
(cherry picked from commit e2bc8866f46701e9c825ad7fa5baac02b2e4898f)
* build: drop wayland-scanner fallback
(cherry picked from commit 366f6ef3d31688631dc453028e108f98a1d7ab57)
* build: unify server & client protocol generation
No need to make a difference here, let's just generate header
files for both.
(cherry picked from commit 5be5a038da8a3789a19945719f2a27233291445d)
* build: drop "server" from target name for protocol code
(cherry picked from commit e5475d9310941ce88ed016ce1515b36e3a440252)
* build: drop intermediate libraries for protocols
(cherry picked from commit af8a5a8918ef42336194fb1077b008a736de7af9)
* root: move the workspace matching code to its own file
This removes the pid_workspace bits from tree/root before it gets
too interesting.
No functional change.
(cherry picked from commit eb5021ef990fb29ff86544aea58d687ad62c757a)
* node: prettify node type names
(cherry picked from commit 1c4b94ae3ca94b972410c80a61404a347af1ee68)
* launcher: track workspaces by node
This removes the need to rename the pid_workspaces when a workspace
is renamed.
It also opens the possibility of tracking other node types. Tracking
containers would allow application to be placed correctly in the
container tree even if the user has moved their focus elsewhere since
it was launched.
(cherry picked from commit 3b49f2782e8faf68766269b9c7390b16e25ae824)
* launcher: use xdga tokens
This reuses wlroots token tracking for workspace matching. It doesn't
export any xdga tokens for clients yet.
(cherry picked from commit bd66f4943da1c96edc3ba49573e27b42b688c543)
* launcher: rename pid_workspace to launcher_ctx
Soon we will match views with more than just a pid.
(cherry picked from commit d75c9f9722389d441fd24bd490c5cf12c4bef39a)
* view: associate launch contexts with views
Views now maintain a reference to a launch context which, as a last
resort, is populated at map time with a context associated with its pid.
This opens the possibility of populating it before map via another
source, e.g. xdga-tokens or configuration.
(cherry picked from commit 864b3a9a18f236f92f1898bb44ab977ceaebfd68)
* launcher: initialize launcher_ctxs once on startup
(cherry picked from commit 66568508c06267445489d655c91c94a34d6d9ffe)
* launcher: fudge the interface a bit
We want to create a context before knowing the pid it will match with.
(cherry picked from commit bdeb9f95651f6c99cc2f4cfb59020ddee202cf36)
* launcher: export xdga tokens and use them for workspace matching
(cherry picked from commit 30ad4dc4a5a41ce7c7aa85096a6e18f374172983)
* launcher: export X startup ids and use them for workspace matching
(cherry picked from commit 28fda4c0d38907fab94dc7d82c9dcf0754748b4e)
* swaybar: Prioritize hotspot events to bar bindings
This is consistent with i3bar's behaviour, and for example, allows binding a
command to button1, while still being able to click on tray icons or other
zones on the bar's status line which may have their own bindings.
E.g., in Sway, without this commit, this config. makes tray icons unclickable:
bar {
# ...
bindsym button1 exec swaynag -m You_clicked_the_tray._Want_some_help?
}
But the same configuration in i3 (with i3-nagbar) keeps tray items clickable.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 53f9dbd424dc173a85c9f4cd30802259d38b1ef4)
* swaybar: Make hotspots block bar release bindings
The previous commit prioritized hotspots before bar bindings for press events,
which matches i3's behaviour. However, since hotspots don't need to do any
processing on release events, those were not handled, and simply fell through
to `bindsym --release` bar bindings (if any).
This is counter-intuitive, and doesn't match i3's behaviour. Instead in case
a hotspot handles the press event, it should also handle the release event,
doing nothing, but blocking the event from triggering a --release bar binding.
E.g., in Sway, without this commit, this config. shows a text on tray clicks:
bar {
# ...
bindsym --release button1 exec swaynag -m I_got_the_release_event.
}
But the same configuration in i3 (with i3-nagbar) doesn't show the text.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 94b69acf0d7b26ee5af2172300cb18473508da76)
* build: drop unused wayland-egl dependency
(cherry picked from commit 37e4a3d6370dc6ba2b0877d588845c06781e880e)
* build: bump version to 1.8-rc1
* Fix build on Debian Stable
(cherry picked from commit dca0bb5749bc16f91ab964fc1b06ebb9a453368f)
* build: fix have_xwayland when xcb-icccm is not found
xcb-icccm is required to build Xwayland support.
Backported from commit d41f11e6bd8cef80f02dda4c66d4a31611aed753.
* build: bump version to 1.8-rc2
* seat: Avoid sending redundant keymaps on reload
When we reload the config, we reset every input device and re-apply
configuration from the config file. This means that the keyboard keymap
is updated at least once during config reload, more if the config file
contains keyboard configuration.
When they keyboard keymap changes and is updated through wlr_seat, the
keymap ends up sent to every keyboard bound in every client, seemingly
multiple times. On an x230 of mine with a keyboard layout set in the
config file, I see 42 keymap events sent to foot on config reload.
Reduce events from keyboard configurations by skipping all but the
currently active keyboard for the seat, and by clearing the active
keyboard during input manager device reset. After this change, I only
see a single just-in-time keymap event.
Fixes: https://github.com/swaywm/sway/issues/6654
* criteria: be lenient on window_role and instance too
* build: bump version to 1.8-rc3
* commands/move: Warp cursor after moving workspace to another output
This makes sway's behavior consistent with i3 when `mouse_warping` is
set to any value besides `none`.
Fixes #7027.
(cherry picked from commit e3c63bf58d0744dfb436f0f38442ce3735e40f47)
* seat: Set keyboard if seat keyboard is NULL
sway sends wl_keyboard.enter on seat focus change and when a keyboard
active on a seat is configured. If all keyboards are removed and a
keyboard is added back without changing the focused client, no new
notify event would be sent despite having keyboard focus. This could
lead to key events without notify, which is a protocol violation.
As a quick fix, when configuring a keyboard on a seat where no keyboard
is currently active, activate the keyboard so that a focused surface
will receive a notify event.
Regressed by: e1b268af98edeb09e570e8855ef64f0719cbafe2
Closes: https://github.com/swaywm/sway/issues/7330
(cherry picked from commit 1ade0ce753dc5f588584f444ce80d27c3b1e4300)
* build: bump version to 1.8-rc4
* swaynag: fix NULL font description
The font description was only set if provided on the CLI. It was
left NULL for the defaults and when reading from the config file.
Closes: https://github.com/swaywm/sway/issues/7186
(cherry picked from commit fd0af78e43f4dd67a404f475c676b25ae38a4b82)
* build: bump version to 1.8
* Removed other README languages
* Fixed build issues
* Removed alpha from render_data struct
* Updated PKGBUILDs and COPR spec
* Update sway/desktop/render.c
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
* Fixed deco_data not being initialized properly
* Replaced wlr_egl_(make|unset)_current with eglMakeCurrent
* Added matrix_projection into fx_renderer
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: Sefa Eyeoglu <contact@scrumplex.net>
Co-authored-by: Simon Ser <contact@emersion.fr>
Co-authored-by: Seth Barberee <seth.barberee@gmail.com>
Co-authored-by: Thomas Hebb <tommyhebb@gmail.com>
Co-authored-by: Nathan Schulte <nmschulte@gmail.com>
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
Co-authored-by: David Rosca <nowrep@gmail.com>
Co-authored-by: David96 <david@hameipe.de>
Co-authored-by: Kenny Levinsen <kl@kl.wtf>
Co-authored-by: Aleksei Bavshin <alebastr89@gmail.com>
Co-authored-by: Kirill Chibisov <contact@kchibisov.com>
Co-authored-by: Tudor Brindus <me@tbrindus.ca>
Co-authored-by: Patrick Hilhorst <git@hilhorst.be>
Co-authored-by: Rouven Czerwinski <rouven@czerwinskis.de>
Co-authored-by: Tobias Bengfort <tobias.bengfort@posteo.de>
Co-authored-by: Ronan Pigott <rpigott@berkeley.edu>
Co-authored-by: Kirill Primak <vyivel@eclair.cafe>
Co-authored-by: Tuomas Yrjölä <mail@yrhki.fi>
Co-authored-by: Kirill Primak <vyivel@posteo.net>
Co-authored-by: Alexander Browne <elcste@users.noreply.github.com>
Co-authored-by: Marco Rubin <20150305+Rubo3@users.noreply.github.com>
Co-authored-by: Muhamed Hobi <woohoomoo2u@gmail.com>
Co-authored-by: Simon Zeni <simon@bl4ckb0ne.ca>
Co-authored-by: Nihal Jere <nihal@nihaljere.xyz>
Co-authored-by: Alexander Gramiak <agrambot@gmail.com>
Co-authored-by: Moon Sungjoon <sumoon@seoulsaram.org>
Co-authored-by: Nicolas Avrutin <nicolas@avrutin.net>
Co-authored-by: ndren <andreien@ctemplar.com>
Co-authored-by: Bill Li <billli11hkb@gmail.com>
Co-authored-by: Leonardo Hernández Hernández <leohdz172@protonmail.com>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Co-authored-by: Manuel Stoeckl <code@mstoeckl.com>
Co-authored-by: Yasin Silavi <59373143+sttatusx@users.noreply.github.com>
Co-authored-by: Daniel De Graaf <code@danieldg.net>
Co-authored-by: kraftwerk28 <kefirchik3@gmail.com>
Co-authored-by: Eskil <67291226+eschillus@users.noreply.github.com>
Co-authored-by: Alice Carroll <git@alice-carroll.pet>
Co-authored-by: Alan <51193876+Pound-Hash@users.noreply.github.com>
Co-authored-by: Victor Makarov <vitja.makarov@gmail.com>
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: -k <slowdive@me.com>
Co-authored-by: Hongyi <61831273+FrozenArcher@users.noreply.github.com>
Co-authored-by: Urey. Xue <urey.s.knowledge@gmail.com>
Co-authored-by: LordRishav <75823494+LordRishav@users.noreply.github.com>
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
Co-authored-by: Florian Franzen <Florian.Franzen@gmail.com>
Co-authored-by: Greg Depoire--Ferrer <greg@gregdf.com>
Co-authored-by: Thomas Jost <schnouki@schnouki.net>
Co-authored-by: Hugo Osvaldo Barrera <hugo@barrera.io>
Co-authored-by: zkldi <ktchidev@gmail.com>
Co-authored-by: llyyr <llyyr.public@gmail.com>
Co-authored-by: Baltazár Radics <baltazar.radics@gmail.com>
Co-authored-by: Martin Michlmayr <tbm@cyrius.com>
Co-authored-by: Filip Szczepański <jazz2rulez@gmail.com>
Co-authored-by: Alex Maese <memaese@hotmail.com>
Co-authored-by: マリウス <marius@xn--gckvb8fzb.com>
Co-authored-by: Andri Yngvason <andri@yngvason.is>
Co-authored-by: ohno418 <yutaro.ono.418@gmail.com>
Co-authored-by: Ferdinand Schober <ferdinand.schober@fau.de>
Co-authored-by: cparm <armelcadetpetit@gmail.com>
Co-authored-by: Yaroslav de la Peña Smirnov <yps@yaroslavps.com>
Co-authored-by: Alexander Orzechowski <orzechowski.alexander@gmail.com>
Co-authored-by: pudiva chip líquida <pudiva@skylittlesystem.org>
Co-authored-by: Puck Meerburg <puck@puckipedia.com>
Co-authored-by: Callum Andrew <calcium@mailbox.org>
Co-authored-by: Ronan Pigott <ronan@rjp.ie>
Co-authored-by: Joan Bruguera <joanbrugueram@gmail.com>
Co-authored-by: nerdopolis <bluescreen_avenger@verizon.net>
Co-authored-by: Ankit Pandey <anpandey@protonmail.com>
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
2023-01-05 09:32:43 +11:00
|
|
|
*max_height = box.height;
|
2018-07-26 18:36:46 +10:00
|
|
|
} else {
|
2019-03-02 18:29:28 +11:00
|
|
|
*max_height = config->floating_maximum_height;
|
2018-07-26 18:36:46 +10:00
|
|
|
}
|
|
|
|
|
2019-03-02 18:29:28 +11:00
|
|
|
}
|
|
|
|
|
2019-03-28 05:00:19 +11:00
|
|
|
static void floating_natural_resize(struct sway_container *con) {
|
|
|
|
int min_width, max_width, min_height, max_height;
|
|
|
|
floating_calculate_constraints(&min_width, &max_width,
|
|
|
|
&min_height, &max_height);
|
|
|
|
if (!con->view) {
|
2021-02-13 09:22:51 +11:00
|
|
|
con->pending.width = fmax(min_width, fmin(con->pending.width, max_width));
|
|
|
|
con->pending.height = fmax(min_height, fmin(con->pending.height, max_height));
|
2019-03-28 05:00:19 +11:00
|
|
|
} else {
|
|
|
|
struct sway_view *view = con->view;
|
2021-02-13 09:22:51 +11:00
|
|
|
con->pending.content_width =
|
2019-03-28 05:00:19 +11:00
|
|
|
fmax(min_width, fmin(view->natural_width, max_width));
|
2021-02-13 09:22:51 +11:00
|
|
|
con->pending.content_height =
|
2019-03-28 05:00:19 +11:00
|
|
|
fmax(min_height, fmin(view->natural_height, max_height));
|
|
|
|
container_set_geometry_from_content(con);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void container_floating_resize_and_center(struct sway_container *con) {
|
2021-02-13 09:22:51 +11:00
|
|
|
struct sway_workspace *ws = con->pending.workspace;
|
2019-03-28 05:00:19 +11:00
|
|
|
if (!ws) {
|
|
|
|
// On scratchpad, just resize
|
|
|
|
floating_natural_resize(con);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
rebase: Sway 1.8 (#78)
* build: bump wlroots dependency to 0.16.0
* swaymsg: replace if with switch in pretty_print
* swaymsg: add GET_TREE pretty-printing
* swaybar: fix errno handling in status_handle_readable
If getline fails once, it was not reset before the next getline
call. errno is only overwritten by getline on error.
* Add cairo_image_surface_create error handling
cairo_image_surface_create can fail, e.g. when running out of
memory or when the size is too big. Avoid crashing in this case.
Closes: https://github.com/swaywm/sway/issues/6531
* build: bump version to 1.8-dev
Historically we've been sticking with the last release number in
the master branch. However that's a bit confusing, people can't
easily figure out whether they're using a release or a work-in-progress
snapshot. Only the commit hash appended to the version number may
help, but that's not very explicit and disappears when using a
tarball.
We could bump the version in master to the next release number.
However during the RC cycle there would be a downgrade from 1.8 to
1.8-rc1. Also it would be hard to tell the difference between a
stable release and an old snapshot.
This patch introduces a new pre-release identifier, "dev". It's
alphabetically before "rc" so it should be correctly sorted by
semver comparisons. "dev" is upgraded to "rc" (and then to stable)
when doing a release. The master branch always uses a "dev"
version, only release branches use "rc" or stable versions.
* [IPC] Add repeat delay/rate info to keyboard
Closes #6735
wlroots already has the info in the struct so let's access it and print it out.
* input/seat: unset has_focus when focus_stack becomes empty
We currently track the focus of a seat in two ways: we use a list called
focus_stack to track the order in which nodes have been focused, with
the first node representing what's currently focused, and we use a
variable called has_focus to indicate whether anything has focus--i.e.
whether we should actually treat that first node as focused at any given
time.
In a number of places, we treat has_focus as implying that a focused
node exists. If it's true, we attempt to dereference the return value of
seat_get_focus(), our helper function for getting the first node in
focus_list, with no further checks. But this isn't quite correct with
the current implementation of seat_get_focus(): not only does it return
NULL when has_focus is false, it also returns NULL when focus_stack
contains no items.
In most cases, focus_stack never becomes empty and so this doesn't
matter at all. Since focus_stack stores a history of focused nodes, we
rarely remove nodes from it. The exception to this is when a node itself
goes away. In that case, we call seat_node_destroy() to remove it from
focus_stack and free it. But we don't unset has_focus if we've removed
the final node! This lets us get into a state where has_focus is true
but seat_get_focus() returns NULL, leading to a segfault when we try to
dereference it.
Fix the issue both by updating has_focus in seat_node_destroy() and by
adding an assertion in seat_get_focus() that ensures focus_stack and
has_focus are in sync, which will make it easier to track down similar
issues in the future.
Fixes #6395.
[1] There's some discussion in #1585 from when this was implemented
about whether has_focus is actually necessary; it's possible we could
remove it entirely, but for the moment this is the architecture we have.
* swaybar: fix tray_padding vs min-height re: scale
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
* swaybar: fix tray item icon scaling, positioning
* container: Fix crash when view unmaps + maps quickly
Followup on 4e4898e90f.
If a view quickly maps and unmaps repeatedly, there will be multiple
destroyed containers with same view in a single transaction. Each of
these containers will then try to destroy this view, resulting in use
after free.
The container should only destroy the view if the view still belongs
to the container.
Simple reproducer: couple XMapWindow + XUnmapWindow in a loop followed
by XDestroyWindow.
See #6605
* commands/move: Fix crash when pos_y is omitted
Fixes #6737
* Destroy sub-surfaces with parent layer-shell surface
Closes: https://github.com/swaywm/sway/issues/6337
* Add safety assert in parse_movement_unit
Let's add this just in case a caller passes argc == 0.
References: https://github.com/swaywm/sway/issues/6737#issuecomment-1008082540
* meson: check: false on run_command
Future meson releases will change the default and warns when the
implicit default is used, breaking builds.
Explicitly set check: false to maintain behavior and silence warnings.
* Print deprecation notice when running SUID
SUID privilege drop is needed for the "builtin"-backend of libseat,
which copied our old "direct" backend behavior for the sake of
compatibility and ease of transition.
libseat now has a better alternative in the form of seatd-launch. It
uses the normal seatd daemon and libseat backend and takes care of SUID
for us.
Add a soft deprecation warning to highlight our future intent of
removing this code. The deprecation cycle is needed to avoid surprises
when sway no longer drops privileges.
* xdg-shell: use toplevel geometry to adjust the popup box
`popup_unconstrain` uses view coordinates to init the output box for
popups. However wlroots expects the box to be set in a toplevel surface
coordinate system, which is not always equal to view. The difference
between those is a window geometry set via xdg-shell.
GTK4 reserves some space for client-side decoration and thus has a
window with top left corner not matching to (0, 0) of a surface. The box
calculated without taking that into account was slightly shifted
compared to the actual output and allowed to position part of the popup
off screen.
* build: fix building with basu
02b412a introduced the use of list for sdbus deps, however
it was assuming that all packages which were in a list has a version
higher than 239. That is true for libsystemd and libelogind, since they
use the same versions, however basu is using version numbers which are
way lower than what libsystemd/libelogind are using, so basu only build
is failing.
* Upgrade for wlroots surface refactoring
See [1] for details.
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3412
* commands/focus: drop trailing whitespace
* input/cursor: count pointer gestures as idle activity
Fixes https://github.com/swaywm/sway/issues/6765.
* input/cursor: treat swipe begin as idle activity too
Accidentally overlooked in fd53f80.
* treat fullscreen windows as 'tiled' for commands/focus
* transaction: destroying nodes aren't hidden
Commit 37d7bc69986f ("transaction: Only wait for ack from visible
views") introduced a check which uses view_is_visible() to check if a view
is still visible on the screen. However view_is_visible() will early
return in case the node is in the destroying state. This is incorrect
for transactions, since a destroying view which is visible will trigger
configure events for other clients. This bug was visible when repeatedly
opening and closing two views side by side, since we ignore the
destroying node we get a frame where the still open view is shown with
the old configure values and the rest is the desktop background. The
next frame is than correct again.
Fix this by considering destroying views as visible, we correctly wait
for them and send the configure events to other views in time, fixing
the background flicker.
Fixes #6473
* build: execute wlroots subproject before finding deps
wlroots often requires dependencies more recent than Sway's.
Executing the wlroots subproject first will give Meson a chance to
find these newer dependencies, possibly via subprojects.
The subproject will override the "wlroots" dependency when executed,
so we don't need to use get_variable anymore.
References: https://github.com/swaywm/sway/pull/6498#issuecomment-1001746017
* tray: do not render passive items
https://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/StatusNotifierItem/#org.freedesktop.statusnotifieritem.status
* cmd/swap: error on swapping a container with itself
* input/cursor: pass through pointer hold gestures
This just follows swaywm/wlroots#3047, so `wl_pointer_gestures_v1`
clients can be notified of these events.
* swaynag: remove buffer destruction condition
An address of a variable can never be NULL, so checking it doesn't make
sense; and `destroy_buffer()` can operate on already destroyed buffers
anyway.
Fixes #6780
* Use bools for CLI flags
* xwayland: listen to `request_activate` event
When REAPER submenu is closed `XCB_CLIENT_MESSAGE` with type
`NET_ACTIVE_WINDOW` is sent to set focus to parent menu.
Closes: https://github.com/swaywm/sway/issues/6324
* chore: chase wlr_output_layout_get_box() update
https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3439
* Chase wlroots xdg-shell refactor
* Minor update to focus_on_window_activation
Removed xwayland limitation since wayland clients are supported via xdg-activation.
* Translated README into Italian
* readme: add link to Italian translation
* readme: sort language list alphabetically
* readme: use relative links for translations
* xdg-shell: use wlr_xdg_toplevel in sway_view
Improved type safety.
Closes: https://github.com/swaywm/sway/issues/6813
* xdg-shell: use wlr_xdg_popup in sway_xdg_popup
Improved type safety.
* Fix snprintf compiler warning
* Remove all sprintf calls
Replace them with snprintf, which ensures buffer overflows won't
happen.
* sway/commands: add missing wlr_keyboard interface include in xkb_switch_layout
* sway/input: use wlr_input_device from input device base
* Remove some erroneous apostrophes in comments
* Don't enter seatop_move_floating when fullscreen
Currently, a floating window that's been fullscreened can send us
xdg_toplevel::move, and we'll enter seatop_move_floating, which lets us
drag the surface around while it's fullscreen. We don't want
this--fullscreen surfaces should always be aligned to the screen--so add
the same check that seatop_default already does when entering this mode.
Tested with Weston's weston-fullscreen demo, which sends a move request
if you click anywhere on its surface.
* swaynag: die on all allocation failures
* sway/input: don't pass possibly invalid modifiers pointer
active_keyboard may be NULL, in which case an invalid pointer could be
passed to wlr_input_method_keyboard_grab_v2_send_modifiers. This
procedure call is unnecessary since wlroots commit 372a52ec "input
method: send modifiers in set_keyboard", so the call can simply be
removed.
Fixes #6836.
* sway/input: destroy sway_switch properly
Fix: #6861
Added seat_device_destroy function to seat_device_destroy function.
* commands/focus: fix segfault when no container is already focused.
Fixes #6690.
* Remove WLR_SWITCH_STATE_TOGGLE usage
Ref [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/commit/4792446ee8f50104bd207d9ccd8558a7e4eb4514
* Replace pcre with pcre2
Closes: https://github.com/swaywm/sway/issues/6838
* swaybar: remove swaybar_output.input_region
No need to keep the region around, we can immediately destroy it
after the wl_surface.set_input_region request.
* swaybar: set opaque region
When the background color is fully opaque, set the surface's opaque
region to the whole surface.
* Updating criteria checking with PCRE2
* swaynag: allocate button_details with details
They are used together, so it doesn't make sense to allocate them
separately.
* swaynag: statically allocate button_close, and move declaration
Every swaynag has a close button, so it doesn't make sense to
allocate it dynamically. The declaration is moved later to when
it is actually needed.
* swaynag: remove unnecessary zero of swaynag struct
Global variables are initialized to 0.
* swaynag: remove redundant status variables in main
Instead, we just use `status` for all failures.
* remove unnecessary strlen call
* sway/input/cursor: take device mm size from wlr_tablet
* sway/input/seat: take output name from specialized input device
* sway/input: follow up wlroots input device events renaming
* sway/input: fix bad position of wlr_drag
* sway/input: wlr_seat_keyboard() now takes wlr_keyboard
* bash-completion: localize variables
* sway/main: move constants off the stack
This makes stack traces from gdb slightly easier to read.
* Fix farsi label
* Avoid format-truncation warning
The existing code gives this error when compiled with GCC 12:
../sway/server.c: In function ‘server_init’:
../sway/server.c:217:75: error: ‘%d’ directive output may be truncated writing between 1 and 11 bytes into a region of size 8 [-Werror=format-truncation=]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~
../sway/server.c:217:66: note: directive argument in the range [-2147483647, 32]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~
../sway/server.c:217:17: note: ‘snprintf’ output between 10 and 20 bytes into a destination of size 16
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Because i is never negative, this is a false positive, but it is easy to
change i to unsigned to silence the error.
* Shuffle variables to satisfy -Werror=restrict
This also fixes an invalid strlen invocation on uninitialized memory.
* layer_shell: keep output non-NULL wherever possible
Our layer shell implementation assigns every layer surface to an output
on creation. It tracks this output using the output field on the
underlying wlr_layer_surface_v1 structure. As such, much of the existing
code assumes that output is always non-NULL and omits NULL checks
accordingly.
However, there are currently two cases where we destroy a
sway_layer_surface and output is NULL. The first is when we can't find
an output to assign the surface to and destroy it immediately after
creation. The second is when we destroy a surface in response to its
output getting destroyed, as we set output to NULL in
handle_output_destroy() before we call wlr_layer_surface_v1_destroy(),
which is what calls the appropriate unmap and destroy callbacks.
The former case doesn't cause any problems, since we haven't even
allocated a sway_layer_surface at that point or registered any
callbacks. The latter case, however, currently triggers a crash (#6120)
if a popup is visible, since our popup_handle_unmap() implementation
can't handle a NULL output.
To fix this issue, keep output set until right before we free the
sway_layer_surface. All we need to do is remove some of the cleanup
logic from handle_output_destroy(), since as of commit c9060bcc12d0
("layer-shell: replace close() with destroy()") that same logic is
guaranteed to be happen later when wlroots calls handle_destroy() as
part of wlr_layer_surface_v1_destroy().
This lets us remove some NULL checks from other unmap/destroy callbacks,
which is nice. We also don't need to check that the wlr_output points to
a valid sway_output anymore, since we unset that pointer after disabling
the output as of commit a0bbe67076b8 ("Address emersions comments on
output re-enabling") Just to be safe, I've added assertions that the
wlr_output is non-NULL wherever we use it.
Fixes #6120.
* Chase wlroots X11 hints update
* Add Swedish README
* Support cursor capture in grimshot
Refactor argument parser
Bring back `sh` compatibility
Default to NOTIFY=no
* Update grimshot.1.scd
Fixed typo. The object is **files**, which is plural. **image** modifies files; it's not countable.
* xkb_switch_layout: fix relative layout switches
Fixes #6011
* Implement ext-session-lock-v1
* Avoid inspecting a NULL view in seat_set_focus
Fixes #6968
* swaynag: do error checking and rename read_from_stdin
read_from_stdin not only read from stdin, but trimming trailing
newlines, so rename it to reflect this.
* swaynag: improve robustness when loading config
* swaynag: combine consecutive declaration/assignments
* config: Remove unused mouse binding structure
Mouse bindings are handled alongside normal bindings. Remove the unused
separate data structure definition to avoid confusion.
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
* Replace strncpy with memcpy
strncpy is useless here, is dangerous because it doesn't guarantee
that the string is NUL-terminated and causes the following warning:
../sway/criteria.c: In function ‘criteria_parse’:
../sway/criteria.c:712:25: error: ‘strncpy’ destination unchanged after copying no bytes [-Werror=stringop-truncation]
712 | strncpy(value, valuestart, head - valuestart);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Add descriptions for `stacking` and `tabbed` layouts
Resolves #5918
* man: Fix trailing spaces
* server: request xdg-shell v2
Wlroots does not yet support the newer xdg-shell versions and now
requires the compositor to set the supported xdg-shell version during
creation. Set this to v2 for sway as well.
Fixes https://github.com/swaywm/sway/issues/7001
* realtime: request SCHED_RR using CAP_SYS_NICE
Try to gain SCHED_RR (round-robin) realtime scheduling privileges before
starting the server. This requires CAP_SYS_NICE on Linux systems.
We additionally register a pthread_atfork callback which resets the
scheduling class back to SCHED_OTHER (the Linux system default).
Due to CAP_SYS_NICE, setting RLIMIT_RTPRIO has no effect on the process
as documented within man 7 sched (from Linux):
Privileged (CAP_SYS_NICE) threads ignore the RLIMIT_RTPRIO limit;
as with older kernels, they can make arbitrary changes to
scheduling policy and priority. See getrlimit(2) for further
information on RLIMIT_RTPRIO
Note that this requires the sway distribution packagers to set the
CAP_SYS_NICE capability on the sway binary.
Supersedes #6992
* ext-session-lock: disable direct scan-out when locked
* Polish the language in README.zh-CN.md & sync with English one
Co-Authored-By: Urey. Xue <urey.s.knowledge@gmail.com>
* De-duplicate IPC output descriptions
* Handle NULL output make/model/serial
* chore: chase wlroots xdg-shell update
* xdg-shell: schedule a configure on maximize request
This commit reverts 03879290dbee26127f6867ef60bc2a7f9a6c8c5f and
fc84bcb7fb0ffa29b1f9bed287762241a3473803.
* Add a Hindi (हिन्दी) translation to the README
Hindi is one of the most prominent languages of the Indian Subcontinent.
This commit adds the translation of the README into the Hindi language.
Some of the words are still written in English because there wasn't an
appropriate technical term of the word in the language.
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
* sway: add bindgesture command
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
* build: link with -pthread
Fixes the following FreeBSD error:
ld: error: undefined symbol: pthread_getschedparam
>>> referenced by realtime.c:25 (../sway/realtime.c:25)
>>> sway/sway.p/realtime.c.o:(set_rr_scheduling)
Fixes: a3a82efbf6b5 ("realtime: request SCHED_RR using CAP_SYS_NICE")
* ipc: remove chatty debug log messages
These aren't particularly useful, and clobber the debug logs.
* Refuse to start when SUID is detected
This ensures that those surprised by the deprecation of SUID operation
receive an error rather than accidentally having sway run as root.
This detection will be removed in a future release.
* swaynag: move close_button up to fix SIGSEGV
When swaynag_parse_options encounters '--dismiss-button' (or its
shorthand '-s'), it sets the text of the first button in the
swaynag.buttons list, which is expected to exist and to be the dismiss
button, to the one passed by the user.
Commit 4780afb68b4ee2cdf0e4925f40cf885819f8a74a ("swaynag: statically
allocate button_close, and move declaration") moved the list
initialization to after swaynag_parse_options is called which made that
code fail.
For example, the command 'swaynag --dismiss-button Dismiss' crashes and
'swaynag --message Message --button Yes "" --dismiss-button Dismiss'
shows the wrong buttons.
Move it back to before swaynag_parse_options is called.
* config/output: use wlr_output_commit_state
This makes the code more robust because we don't potentially leave
bad state in wlr_output.pending behind anymore. This also fixes a
bug.
Closes: https://github.com/swaywm/sway/issues/7043
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3610
* Allocate enough space for `cmd_results->error`
* Remove access to wlr_input_device union
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3626
Closes: https://github.com/swaywm/sway/issues/7077
* Rename dpms output command to power
The "dpms" command refers to VESA Display Power Management
Signaling, a deprecated standard. It's superseded by VESA DPM.
Instead of tying out command name to a particular standard, use the
neutral term "power".
* Strip quotes in bindsym --input-device=...
If the input device is quoted, which is common when using variables in the
config file, those quotes must be ignored here, or the input device will be
ignored.
Fixes #7029.
* Avoid unecessary string copy
* Reject font values that are invalid for pango
Use pango to parse font configuration early, and reject the command as
invalid if the value is invalid for pango. Since we're already parsing
the font into a `PangoFontDescription`, keep that instance around and
avoid re-parsing the font each time we render text.
Fixes: https://github.com/swaywm/sway/issues/6805
* Reuse parsed PangoFontDescription
Avoids parsing the configured font each time text is rendered.
* ipc: add "power" to output reply
* config.in: switch to `output power`
* Remove internal references to DPMS
While at it, use an int for the config field, just like we do for
all other fields.
* fix: remove redundant empty statement in main.c
This semi-colon looks like a typo. Luckily, it has no effect on the code as it's treated as an empty statement leading the switch case.
Really straightforward nitpick change, was just something I was confused by when reading over the code.
* input: chase delta_discrete semantics change
* swaymsg: fix floating_nodes being ignored
Fix floating_nodes being ignored in pretty_print_tree.
* ipc: make get_deco_rect check config->hide_lone_tab
Without this, the `IPC_GET_TREE` ipc call would return false information
about the container's `deco_rect` and `rect` properties if
`hide_edge_borders --i3` was in effect.
* grimshot: fix tilde expansion within quotes
* Enable single-pixel-buffer-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3428
* sway-output.5: improve display of parameter
Since "width" and "height" are separate parameters, show them as such.
* man: sway(5) move fixes
* ipc: drop WLR_OUTPUT_ADAPTIVE_SYNC_UNKNOWN case
This has been removed from wlroots.
* config/output: test adaptive sync
Required for [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3637
* Fix crash in xdg_activation_v1.c
wlr_xdg_surface_from_wlr_surface() can return a NULL pointer, so check for NULL before dereferencing it.
* sway: Add non-desktop-output type
Currently, when encountering a non-desktop display, sway offers the
output for leasing and returns without storing it in a sway specific
output type like `struct sway_output`. Additionally, running
`swaymsg -t get_outputs` doesn't show non-desktop outputs.
This commit stores the non-desktop outputs into a struct called
`sway_output_non_desktop`, and adds them to a list on `sway_root`
* sway: add non-desktop outputs to json when running `swaymsg -t get_outputs`
* swaymsg: show non-desktop property when pretty printing outputs
* man: Add XWayland information
* ipc: expose mode picture aspect ratio
* swaymsg: show mode picture aspect ratio
* build: simplify protocol paths
No need for arrays here.
* sway/commands/output: Add command for unplugging non-physical outputs
* Improve Japanese translation
* allow pointer_constraints on layer_shell surfaces
* check for NULL
* use seat directly
* Use keyboard_state.focused_surface directly
* input: focus floating container when clicked on border
Fixes #7209.
* input: focus container when scrolling on titlebar
Fixes #6503.
* Fix leaks in criteria_destroy()
* Avoid double free in criteria_destroy()
* Add support for ext-idle-notify-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3753
* input: tweak focus behavior to allow focusing parent containers
Sway focuses the inactive child when focusing split containers. However,
there is currently no way to focus the parent container itself by mouse.
A user must use the keyboard to do so.
This commit maintains the current behavior, but makes it such that a
second click on the split container titlebar (i.e., after its children
are visible) focuses the split container itself.
* Fix keymap being NULL and segfaulting on dev add
Moved `libinput_config` to the callers of
`sway_input_configure_libinput_device` so that we send the event after
the added event.
* Rework session lock keyboard focus handling
When removing outputs, it is possible to end up in a situation where
none of the session lock client's surfaces have keyboard focus,
resulting in it not receiving keyboard events. Track the focused
surface and update it as needed on surface destroy.
* Fix focus tracking when session lock is active
Remove the incorrect attempt to block focus changes when an input grab
is present and replace it with the same logic used for layer_shell-based
screen lockers: restore the focus after changing it.
This fixes a use-after-free of seat->workspace if outputs are destroyed
while a screen lock is enabled.
* container_floating_set_default_size: Store workspace size box on the stack
* Support libinput's 1.21 new dwtp option
Support the new dwtp (disable while trackpointing) option introduced in
libinput 1.21, allowing users to control whether the trackpoint (like
those in Thinkpads, but not only) should be disabled while using the
keyboard/touchpad.
See: https://gitlab.freedesktop.org/libinput/libinput/-/issues/731
* tree: support formatting null titles
Any windows that have never had a title set visually behave closer to
that of an empty title, but are unformattable, as the code bails out
early on a NULL title.
* criteria: allow matching on empty (NULL) titles
* criteria: allow matching for NULL string criteria
* ci: install hwdata
* Use wl_signal_emit_mutable()
This function fixes segfaults when emitting a signal potentially
removes arbitrary listeners.
* Use wlr_damage_ring
wlr_output_damage is to be replaced with wlr_damage_ring, so use that.
* lock: fix crash on output destroy
Closes: https://github.com/swaywm/sway/issues/7120
* container_get_siblings: handle NULL workspace
* ci: checkout wlroots 0.16.0
* workspace_create: Don't allow NULL name
(cherry picked from commit 34933bb84350fe805d82276ea02d5732546e9993)
* output: set damage ring bounds to pixel values
Fixes: https://github.com/swaywm/sway/issues/7254
(cherry picked from commit 85005b52fe5b832e4ea914fa28048b0c5c803769)
* Use shm_open instead of mkstemp
shm_open is more reliable because it does not require
a writeable filesystem folder, unlike mkstemp.
(cherry picked from commit e2bc8866f46701e9c825ad7fa5baac02b2e4898f)
* build: drop wayland-scanner fallback
(cherry picked from commit 366f6ef3d31688631dc453028e108f98a1d7ab57)
* build: unify server & client protocol generation
No need to make a difference here, let's just generate header
files for both.
(cherry picked from commit 5be5a038da8a3789a19945719f2a27233291445d)
* build: drop "server" from target name for protocol code
(cherry picked from commit e5475d9310941ce88ed016ce1515b36e3a440252)
* build: drop intermediate libraries for protocols
(cherry picked from commit af8a5a8918ef42336194fb1077b008a736de7af9)
* root: move the workspace matching code to its own file
This removes the pid_workspace bits from tree/root before it gets
too interesting.
No functional change.
(cherry picked from commit eb5021ef990fb29ff86544aea58d687ad62c757a)
* node: prettify node type names
(cherry picked from commit 1c4b94ae3ca94b972410c80a61404a347af1ee68)
* launcher: track workspaces by node
This removes the need to rename the pid_workspaces when a workspace
is renamed.
It also opens the possibility of tracking other node types. Tracking
containers would allow application to be placed correctly in the
container tree even if the user has moved their focus elsewhere since
it was launched.
(cherry picked from commit 3b49f2782e8faf68766269b9c7390b16e25ae824)
* launcher: use xdga tokens
This reuses wlroots token tracking for workspace matching. It doesn't
export any xdga tokens for clients yet.
(cherry picked from commit bd66f4943da1c96edc3ba49573e27b42b688c543)
* launcher: rename pid_workspace to launcher_ctx
Soon we will match views with more than just a pid.
(cherry picked from commit d75c9f9722389d441fd24bd490c5cf12c4bef39a)
* view: associate launch contexts with views
Views now maintain a reference to a launch context which, as a last
resort, is populated at map time with a context associated with its pid.
This opens the possibility of populating it before map via another
source, e.g. xdga-tokens or configuration.
(cherry picked from commit 864b3a9a18f236f92f1898bb44ab977ceaebfd68)
* launcher: initialize launcher_ctxs once on startup
(cherry picked from commit 66568508c06267445489d655c91c94a34d6d9ffe)
* launcher: fudge the interface a bit
We want to create a context before knowing the pid it will match with.
(cherry picked from commit bdeb9f95651f6c99cc2f4cfb59020ddee202cf36)
* launcher: export xdga tokens and use them for workspace matching
(cherry picked from commit 30ad4dc4a5a41ce7c7aa85096a6e18f374172983)
* launcher: export X startup ids and use them for workspace matching
(cherry picked from commit 28fda4c0d38907fab94dc7d82c9dcf0754748b4e)
* swaybar: Prioritize hotspot events to bar bindings
This is consistent with i3bar's behaviour, and for example, allows binding a
command to button1, while still being able to click on tray icons or other
zones on the bar's status line which may have their own bindings.
E.g., in Sway, without this commit, this config. makes tray icons unclickable:
bar {
# ...
bindsym button1 exec swaynag -m You_clicked_the_tray._Want_some_help?
}
But the same configuration in i3 (with i3-nagbar) keeps tray items clickable.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 53f9dbd424dc173a85c9f4cd30802259d38b1ef4)
* swaybar: Make hotspots block bar release bindings
The previous commit prioritized hotspots before bar bindings for press events,
which matches i3's behaviour. However, since hotspots don't need to do any
processing on release events, those were not handled, and simply fell through
to `bindsym --release` bar bindings (if any).
This is counter-intuitive, and doesn't match i3's behaviour. Instead in case
a hotspot handles the press event, it should also handle the release event,
doing nothing, but blocking the event from triggering a --release bar binding.
E.g., in Sway, without this commit, this config. shows a text on tray clicks:
bar {
# ...
bindsym --release button1 exec swaynag -m I_got_the_release_event.
}
But the same configuration in i3 (with i3-nagbar) doesn't show the text.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 94b69acf0d7b26ee5af2172300cb18473508da76)
* build: drop unused wayland-egl dependency
(cherry picked from commit 37e4a3d6370dc6ba2b0877d588845c06781e880e)
* build: bump version to 1.8-rc1
* Fix build on Debian Stable
(cherry picked from commit dca0bb5749bc16f91ab964fc1b06ebb9a453368f)
* build: fix have_xwayland when xcb-icccm is not found
xcb-icccm is required to build Xwayland support.
Backported from commit d41f11e6bd8cef80f02dda4c66d4a31611aed753.
* build: bump version to 1.8-rc2
* seat: Avoid sending redundant keymaps on reload
When we reload the config, we reset every input device and re-apply
configuration from the config file. This means that the keyboard keymap
is updated at least once during config reload, more if the config file
contains keyboard configuration.
When they keyboard keymap changes and is updated through wlr_seat, the
keymap ends up sent to every keyboard bound in every client, seemingly
multiple times. On an x230 of mine with a keyboard layout set in the
config file, I see 42 keymap events sent to foot on config reload.
Reduce events from keyboard configurations by skipping all but the
currently active keyboard for the seat, and by clearing the active
keyboard during input manager device reset. After this change, I only
see a single just-in-time keymap event.
Fixes: https://github.com/swaywm/sway/issues/6654
* criteria: be lenient on window_role and instance too
* build: bump version to 1.8-rc3
* commands/move: Warp cursor after moving workspace to another output
This makes sway's behavior consistent with i3 when `mouse_warping` is
set to any value besides `none`.
Fixes #7027.
(cherry picked from commit e3c63bf58d0744dfb436f0f38442ce3735e40f47)
* seat: Set keyboard if seat keyboard is NULL
sway sends wl_keyboard.enter on seat focus change and when a keyboard
active on a seat is configured. If all keyboards are removed and a
keyboard is added back without changing the focused client, no new
notify event would be sent despite having keyboard focus. This could
lead to key events without notify, which is a protocol violation.
As a quick fix, when configuring a keyboard on a seat where no keyboard
is currently active, activate the keyboard so that a focused surface
will receive a notify event.
Regressed by: e1b268af98edeb09e570e8855ef64f0719cbafe2
Closes: https://github.com/swaywm/sway/issues/7330
(cherry picked from commit 1ade0ce753dc5f588584f444ce80d27c3b1e4300)
* build: bump version to 1.8-rc4
* swaynag: fix NULL font description
The font description was only set if provided on the CLI. It was
left NULL for the defaults and when reading from the config file.
Closes: https://github.com/swaywm/sway/issues/7186
(cherry picked from commit fd0af78e43f4dd67a404f475c676b25ae38a4b82)
* build: bump version to 1.8
* Removed other README languages
* Fixed build issues
* Removed alpha from render_data struct
* Updated PKGBUILDs and COPR spec
* Update sway/desktop/render.c
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
* Fixed deco_data not being initialized properly
* Replaced wlr_egl_(make|unset)_current with eglMakeCurrent
* Added matrix_projection into fx_renderer
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: Sefa Eyeoglu <contact@scrumplex.net>
Co-authored-by: Simon Ser <contact@emersion.fr>
Co-authored-by: Seth Barberee <seth.barberee@gmail.com>
Co-authored-by: Thomas Hebb <tommyhebb@gmail.com>
Co-authored-by: Nathan Schulte <nmschulte@gmail.com>
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
Co-authored-by: David Rosca <nowrep@gmail.com>
Co-authored-by: David96 <david@hameipe.de>
Co-authored-by: Kenny Levinsen <kl@kl.wtf>
Co-authored-by: Aleksei Bavshin <alebastr89@gmail.com>
Co-authored-by: Kirill Chibisov <contact@kchibisov.com>
Co-authored-by: Tudor Brindus <me@tbrindus.ca>
Co-authored-by: Patrick Hilhorst <git@hilhorst.be>
Co-authored-by: Rouven Czerwinski <rouven@czerwinskis.de>
Co-authored-by: Tobias Bengfort <tobias.bengfort@posteo.de>
Co-authored-by: Ronan Pigott <rpigott@berkeley.edu>
Co-authored-by: Kirill Primak <vyivel@eclair.cafe>
Co-authored-by: Tuomas Yrjölä <mail@yrhki.fi>
Co-authored-by: Kirill Primak <vyivel@posteo.net>
Co-authored-by: Alexander Browne <elcste@users.noreply.github.com>
Co-authored-by: Marco Rubin <20150305+Rubo3@users.noreply.github.com>
Co-authored-by: Muhamed Hobi <woohoomoo2u@gmail.com>
Co-authored-by: Simon Zeni <simon@bl4ckb0ne.ca>
Co-authored-by: Nihal Jere <nihal@nihaljere.xyz>
Co-authored-by: Alexander Gramiak <agrambot@gmail.com>
Co-authored-by: Moon Sungjoon <sumoon@seoulsaram.org>
Co-authored-by: Nicolas Avrutin <nicolas@avrutin.net>
Co-authored-by: ndren <andreien@ctemplar.com>
Co-authored-by: Bill Li <billli11hkb@gmail.com>
Co-authored-by: Leonardo Hernández Hernández <leohdz172@protonmail.com>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Co-authored-by: Manuel Stoeckl <code@mstoeckl.com>
Co-authored-by: Yasin Silavi <59373143+sttatusx@users.noreply.github.com>
Co-authored-by: Daniel De Graaf <code@danieldg.net>
Co-authored-by: kraftwerk28 <kefirchik3@gmail.com>
Co-authored-by: Eskil <67291226+eschillus@users.noreply.github.com>
Co-authored-by: Alice Carroll <git@alice-carroll.pet>
Co-authored-by: Alan <51193876+Pound-Hash@users.noreply.github.com>
Co-authored-by: Victor Makarov <vitja.makarov@gmail.com>
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: -k <slowdive@me.com>
Co-authored-by: Hongyi <61831273+FrozenArcher@users.noreply.github.com>
Co-authored-by: Urey. Xue <urey.s.knowledge@gmail.com>
Co-authored-by: LordRishav <75823494+LordRishav@users.noreply.github.com>
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
Co-authored-by: Florian Franzen <Florian.Franzen@gmail.com>
Co-authored-by: Greg Depoire--Ferrer <greg@gregdf.com>
Co-authored-by: Thomas Jost <schnouki@schnouki.net>
Co-authored-by: Hugo Osvaldo Barrera <hugo@barrera.io>
Co-authored-by: zkldi <ktchidev@gmail.com>
Co-authored-by: llyyr <llyyr.public@gmail.com>
Co-authored-by: Baltazár Radics <baltazar.radics@gmail.com>
Co-authored-by: Martin Michlmayr <tbm@cyrius.com>
Co-authored-by: Filip Szczepański <jazz2rulez@gmail.com>
Co-authored-by: Alex Maese <memaese@hotmail.com>
Co-authored-by: マリウス <marius@xn--gckvb8fzb.com>
Co-authored-by: Andri Yngvason <andri@yngvason.is>
Co-authored-by: ohno418 <yutaro.ono.418@gmail.com>
Co-authored-by: Ferdinand Schober <ferdinand.schober@fau.de>
Co-authored-by: cparm <armelcadetpetit@gmail.com>
Co-authored-by: Yaroslav de la Peña Smirnov <yps@yaroslavps.com>
Co-authored-by: Alexander Orzechowski <orzechowski.alexander@gmail.com>
Co-authored-by: pudiva chip líquida <pudiva@skylittlesystem.org>
Co-authored-by: Puck Meerburg <puck@puckipedia.com>
Co-authored-by: Callum Andrew <calcium@mailbox.org>
Co-authored-by: Ronan Pigott <ronan@rjp.ie>
Co-authored-by: Joan Bruguera <joanbrugueram@gmail.com>
Co-authored-by: nerdopolis <bluescreen_avenger@verizon.net>
Co-authored-by: Ankit Pandey <anpandey@protonmail.com>
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
2023-01-05 09:32:43 +11:00
|
|
|
struct wlr_box ob;
|
|
|
|
wlr_output_layout_get_box(root->output_layout, ws->output->wlr_output, &ob);
|
|
|
|
if (wlr_box_empty(&ob)) {
|
2019-03-24 08:24:53 +11:00
|
|
|
// On NOOP output. Will be called again when moved to an output
|
2021-02-13 09:22:51 +11:00
|
|
|
con->pending.x = 0;
|
|
|
|
con->pending.y = 0;
|
|
|
|
con->pending.width = 0;
|
|
|
|
con->pending.height = 0;
|
2019-03-24 08:24:53 +11:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-03-28 05:00:19 +11:00
|
|
|
floating_natural_resize(con);
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
if (!con->view) {
|
2021-02-13 09:22:51 +11:00
|
|
|
if (con->pending.width > ws->width || con->pending.height > ws->height) {
|
rebase: Sway 1.8 (#78)
* build: bump wlroots dependency to 0.16.0
* swaymsg: replace if with switch in pretty_print
* swaymsg: add GET_TREE pretty-printing
* swaybar: fix errno handling in status_handle_readable
If getline fails once, it was not reset before the next getline
call. errno is only overwritten by getline on error.
* Add cairo_image_surface_create error handling
cairo_image_surface_create can fail, e.g. when running out of
memory or when the size is too big. Avoid crashing in this case.
Closes: https://github.com/swaywm/sway/issues/6531
* build: bump version to 1.8-dev
Historically we've been sticking with the last release number in
the master branch. However that's a bit confusing, people can't
easily figure out whether they're using a release or a work-in-progress
snapshot. Only the commit hash appended to the version number may
help, but that's not very explicit and disappears when using a
tarball.
We could bump the version in master to the next release number.
However during the RC cycle there would be a downgrade from 1.8 to
1.8-rc1. Also it would be hard to tell the difference between a
stable release and an old snapshot.
This patch introduces a new pre-release identifier, "dev". It's
alphabetically before "rc" so it should be correctly sorted by
semver comparisons. "dev" is upgraded to "rc" (and then to stable)
when doing a release. The master branch always uses a "dev"
version, only release branches use "rc" or stable versions.
* [IPC] Add repeat delay/rate info to keyboard
Closes #6735
wlroots already has the info in the struct so let's access it and print it out.
* input/seat: unset has_focus when focus_stack becomes empty
We currently track the focus of a seat in two ways: we use a list called
focus_stack to track the order in which nodes have been focused, with
the first node representing what's currently focused, and we use a
variable called has_focus to indicate whether anything has focus--i.e.
whether we should actually treat that first node as focused at any given
time.
In a number of places, we treat has_focus as implying that a focused
node exists. If it's true, we attempt to dereference the return value of
seat_get_focus(), our helper function for getting the first node in
focus_list, with no further checks. But this isn't quite correct with
the current implementation of seat_get_focus(): not only does it return
NULL when has_focus is false, it also returns NULL when focus_stack
contains no items.
In most cases, focus_stack never becomes empty and so this doesn't
matter at all. Since focus_stack stores a history of focused nodes, we
rarely remove nodes from it. The exception to this is when a node itself
goes away. In that case, we call seat_node_destroy() to remove it from
focus_stack and free it. But we don't unset has_focus if we've removed
the final node! This lets us get into a state where has_focus is true
but seat_get_focus() returns NULL, leading to a segfault when we try to
dereference it.
Fix the issue both by updating has_focus in seat_node_destroy() and by
adding an assertion in seat_get_focus() that ensures focus_stack and
has_focus are in sync, which will make it easier to track down similar
issues in the future.
Fixes #6395.
[1] There's some discussion in #1585 from when this was implemented
about whether has_focus is actually necessary; it's possible we could
remove it entirely, but for the moment this is the architecture we have.
* swaybar: fix tray_padding vs min-height re: scale
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
* swaybar: fix tray item icon scaling, positioning
* container: Fix crash when view unmaps + maps quickly
Followup on 4e4898e90f.
If a view quickly maps and unmaps repeatedly, there will be multiple
destroyed containers with same view in a single transaction. Each of
these containers will then try to destroy this view, resulting in use
after free.
The container should only destroy the view if the view still belongs
to the container.
Simple reproducer: couple XMapWindow + XUnmapWindow in a loop followed
by XDestroyWindow.
See #6605
* commands/move: Fix crash when pos_y is omitted
Fixes #6737
* Destroy sub-surfaces with parent layer-shell surface
Closes: https://github.com/swaywm/sway/issues/6337
* Add safety assert in parse_movement_unit
Let's add this just in case a caller passes argc == 0.
References: https://github.com/swaywm/sway/issues/6737#issuecomment-1008082540
* meson: check: false on run_command
Future meson releases will change the default and warns when the
implicit default is used, breaking builds.
Explicitly set check: false to maintain behavior and silence warnings.
* Print deprecation notice when running SUID
SUID privilege drop is needed for the "builtin"-backend of libseat,
which copied our old "direct" backend behavior for the sake of
compatibility and ease of transition.
libseat now has a better alternative in the form of seatd-launch. It
uses the normal seatd daemon and libseat backend and takes care of SUID
for us.
Add a soft deprecation warning to highlight our future intent of
removing this code. The deprecation cycle is needed to avoid surprises
when sway no longer drops privileges.
* xdg-shell: use toplevel geometry to adjust the popup box
`popup_unconstrain` uses view coordinates to init the output box for
popups. However wlroots expects the box to be set in a toplevel surface
coordinate system, which is not always equal to view. The difference
between those is a window geometry set via xdg-shell.
GTK4 reserves some space for client-side decoration and thus has a
window with top left corner not matching to (0, 0) of a surface. The box
calculated without taking that into account was slightly shifted
compared to the actual output and allowed to position part of the popup
off screen.
* build: fix building with basu
02b412a introduced the use of list for sdbus deps, however
it was assuming that all packages which were in a list has a version
higher than 239. That is true for libsystemd and libelogind, since they
use the same versions, however basu is using version numbers which are
way lower than what libsystemd/libelogind are using, so basu only build
is failing.
* Upgrade for wlroots surface refactoring
See [1] for details.
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3412
* commands/focus: drop trailing whitespace
* input/cursor: count pointer gestures as idle activity
Fixes https://github.com/swaywm/sway/issues/6765.
* input/cursor: treat swipe begin as idle activity too
Accidentally overlooked in fd53f80.
* treat fullscreen windows as 'tiled' for commands/focus
* transaction: destroying nodes aren't hidden
Commit 37d7bc69986f ("transaction: Only wait for ack from visible
views") introduced a check which uses view_is_visible() to check if a view
is still visible on the screen. However view_is_visible() will early
return in case the node is in the destroying state. This is incorrect
for transactions, since a destroying view which is visible will trigger
configure events for other clients. This bug was visible when repeatedly
opening and closing two views side by side, since we ignore the
destroying node we get a frame where the still open view is shown with
the old configure values and the rest is the desktop background. The
next frame is than correct again.
Fix this by considering destroying views as visible, we correctly wait
for them and send the configure events to other views in time, fixing
the background flicker.
Fixes #6473
* build: execute wlroots subproject before finding deps
wlroots often requires dependencies more recent than Sway's.
Executing the wlroots subproject first will give Meson a chance to
find these newer dependencies, possibly via subprojects.
The subproject will override the "wlroots" dependency when executed,
so we don't need to use get_variable anymore.
References: https://github.com/swaywm/sway/pull/6498#issuecomment-1001746017
* tray: do not render passive items
https://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/StatusNotifierItem/#org.freedesktop.statusnotifieritem.status
* cmd/swap: error on swapping a container with itself
* input/cursor: pass through pointer hold gestures
This just follows swaywm/wlroots#3047, so `wl_pointer_gestures_v1`
clients can be notified of these events.
* swaynag: remove buffer destruction condition
An address of a variable can never be NULL, so checking it doesn't make
sense; and `destroy_buffer()` can operate on already destroyed buffers
anyway.
Fixes #6780
* Use bools for CLI flags
* xwayland: listen to `request_activate` event
When REAPER submenu is closed `XCB_CLIENT_MESSAGE` with type
`NET_ACTIVE_WINDOW` is sent to set focus to parent menu.
Closes: https://github.com/swaywm/sway/issues/6324
* chore: chase wlr_output_layout_get_box() update
https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3439
* Chase wlroots xdg-shell refactor
* Minor update to focus_on_window_activation
Removed xwayland limitation since wayland clients are supported via xdg-activation.
* Translated README into Italian
* readme: add link to Italian translation
* readme: sort language list alphabetically
* readme: use relative links for translations
* xdg-shell: use wlr_xdg_toplevel in sway_view
Improved type safety.
Closes: https://github.com/swaywm/sway/issues/6813
* xdg-shell: use wlr_xdg_popup in sway_xdg_popup
Improved type safety.
* Fix snprintf compiler warning
* Remove all sprintf calls
Replace them with snprintf, which ensures buffer overflows won't
happen.
* sway/commands: add missing wlr_keyboard interface include in xkb_switch_layout
* sway/input: use wlr_input_device from input device base
* Remove some erroneous apostrophes in comments
* Don't enter seatop_move_floating when fullscreen
Currently, a floating window that's been fullscreened can send us
xdg_toplevel::move, and we'll enter seatop_move_floating, which lets us
drag the surface around while it's fullscreen. We don't want
this--fullscreen surfaces should always be aligned to the screen--so add
the same check that seatop_default already does when entering this mode.
Tested with Weston's weston-fullscreen demo, which sends a move request
if you click anywhere on its surface.
* swaynag: die on all allocation failures
* sway/input: don't pass possibly invalid modifiers pointer
active_keyboard may be NULL, in which case an invalid pointer could be
passed to wlr_input_method_keyboard_grab_v2_send_modifiers. This
procedure call is unnecessary since wlroots commit 372a52ec "input
method: send modifiers in set_keyboard", so the call can simply be
removed.
Fixes #6836.
* sway/input: destroy sway_switch properly
Fix: #6861
Added seat_device_destroy function to seat_device_destroy function.
* commands/focus: fix segfault when no container is already focused.
Fixes #6690.
* Remove WLR_SWITCH_STATE_TOGGLE usage
Ref [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/commit/4792446ee8f50104bd207d9ccd8558a7e4eb4514
* Replace pcre with pcre2
Closes: https://github.com/swaywm/sway/issues/6838
* swaybar: remove swaybar_output.input_region
No need to keep the region around, we can immediately destroy it
after the wl_surface.set_input_region request.
* swaybar: set opaque region
When the background color is fully opaque, set the surface's opaque
region to the whole surface.
* Updating criteria checking with PCRE2
* swaynag: allocate button_details with details
They are used together, so it doesn't make sense to allocate them
separately.
* swaynag: statically allocate button_close, and move declaration
Every swaynag has a close button, so it doesn't make sense to
allocate it dynamically. The declaration is moved later to when
it is actually needed.
* swaynag: remove unnecessary zero of swaynag struct
Global variables are initialized to 0.
* swaynag: remove redundant status variables in main
Instead, we just use `status` for all failures.
* remove unnecessary strlen call
* sway/input/cursor: take device mm size from wlr_tablet
* sway/input/seat: take output name from specialized input device
* sway/input: follow up wlroots input device events renaming
* sway/input: fix bad position of wlr_drag
* sway/input: wlr_seat_keyboard() now takes wlr_keyboard
* bash-completion: localize variables
* sway/main: move constants off the stack
This makes stack traces from gdb slightly easier to read.
* Fix farsi label
* Avoid format-truncation warning
The existing code gives this error when compiled with GCC 12:
../sway/server.c: In function ‘server_init’:
../sway/server.c:217:75: error: ‘%d’ directive output may be truncated writing between 1 and 11 bytes into a region of size 8 [-Werror=format-truncation=]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~
../sway/server.c:217:66: note: directive argument in the range [-2147483647, 32]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~
../sway/server.c:217:17: note: ‘snprintf’ output between 10 and 20 bytes into a destination of size 16
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Because i is never negative, this is a false positive, but it is easy to
change i to unsigned to silence the error.
* Shuffle variables to satisfy -Werror=restrict
This also fixes an invalid strlen invocation on uninitialized memory.
* layer_shell: keep output non-NULL wherever possible
Our layer shell implementation assigns every layer surface to an output
on creation. It tracks this output using the output field on the
underlying wlr_layer_surface_v1 structure. As such, much of the existing
code assumes that output is always non-NULL and omits NULL checks
accordingly.
However, there are currently two cases where we destroy a
sway_layer_surface and output is NULL. The first is when we can't find
an output to assign the surface to and destroy it immediately after
creation. The second is when we destroy a surface in response to its
output getting destroyed, as we set output to NULL in
handle_output_destroy() before we call wlr_layer_surface_v1_destroy(),
which is what calls the appropriate unmap and destroy callbacks.
The former case doesn't cause any problems, since we haven't even
allocated a sway_layer_surface at that point or registered any
callbacks. The latter case, however, currently triggers a crash (#6120)
if a popup is visible, since our popup_handle_unmap() implementation
can't handle a NULL output.
To fix this issue, keep output set until right before we free the
sway_layer_surface. All we need to do is remove some of the cleanup
logic from handle_output_destroy(), since as of commit c9060bcc12d0
("layer-shell: replace close() with destroy()") that same logic is
guaranteed to be happen later when wlroots calls handle_destroy() as
part of wlr_layer_surface_v1_destroy().
This lets us remove some NULL checks from other unmap/destroy callbacks,
which is nice. We also don't need to check that the wlr_output points to
a valid sway_output anymore, since we unset that pointer after disabling
the output as of commit a0bbe67076b8 ("Address emersions comments on
output re-enabling") Just to be safe, I've added assertions that the
wlr_output is non-NULL wherever we use it.
Fixes #6120.
* Chase wlroots X11 hints update
* Add Swedish README
* Support cursor capture in grimshot
Refactor argument parser
Bring back `sh` compatibility
Default to NOTIFY=no
* Update grimshot.1.scd
Fixed typo. The object is **files**, which is plural. **image** modifies files; it's not countable.
* xkb_switch_layout: fix relative layout switches
Fixes #6011
* Implement ext-session-lock-v1
* Avoid inspecting a NULL view in seat_set_focus
Fixes #6968
* swaynag: do error checking and rename read_from_stdin
read_from_stdin not only read from stdin, but trimming trailing
newlines, so rename it to reflect this.
* swaynag: improve robustness when loading config
* swaynag: combine consecutive declaration/assignments
* config: Remove unused mouse binding structure
Mouse bindings are handled alongside normal bindings. Remove the unused
separate data structure definition to avoid confusion.
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
* Replace strncpy with memcpy
strncpy is useless here, is dangerous because it doesn't guarantee
that the string is NUL-terminated and causes the following warning:
../sway/criteria.c: In function ‘criteria_parse’:
../sway/criteria.c:712:25: error: ‘strncpy’ destination unchanged after copying no bytes [-Werror=stringop-truncation]
712 | strncpy(value, valuestart, head - valuestart);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Add descriptions for `stacking` and `tabbed` layouts
Resolves #5918
* man: Fix trailing spaces
* server: request xdg-shell v2
Wlroots does not yet support the newer xdg-shell versions and now
requires the compositor to set the supported xdg-shell version during
creation. Set this to v2 for sway as well.
Fixes https://github.com/swaywm/sway/issues/7001
* realtime: request SCHED_RR using CAP_SYS_NICE
Try to gain SCHED_RR (round-robin) realtime scheduling privileges before
starting the server. This requires CAP_SYS_NICE on Linux systems.
We additionally register a pthread_atfork callback which resets the
scheduling class back to SCHED_OTHER (the Linux system default).
Due to CAP_SYS_NICE, setting RLIMIT_RTPRIO has no effect on the process
as documented within man 7 sched (from Linux):
Privileged (CAP_SYS_NICE) threads ignore the RLIMIT_RTPRIO limit;
as with older kernels, they can make arbitrary changes to
scheduling policy and priority. See getrlimit(2) for further
information on RLIMIT_RTPRIO
Note that this requires the sway distribution packagers to set the
CAP_SYS_NICE capability on the sway binary.
Supersedes #6992
* ext-session-lock: disable direct scan-out when locked
* Polish the language in README.zh-CN.md & sync with English one
Co-Authored-By: Urey. Xue <urey.s.knowledge@gmail.com>
* De-duplicate IPC output descriptions
* Handle NULL output make/model/serial
* chore: chase wlroots xdg-shell update
* xdg-shell: schedule a configure on maximize request
This commit reverts 03879290dbee26127f6867ef60bc2a7f9a6c8c5f and
fc84bcb7fb0ffa29b1f9bed287762241a3473803.
* Add a Hindi (हिन्दी) translation to the README
Hindi is one of the most prominent languages of the Indian Subcontinent.
This commit adds the translation of the README into the Hindi language.
Some of the words are still written in English because there wasn't an
appropriate technical term of the word in the language.
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
* sway: add bindgesture command
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
* build: link with -pthread
Fixes the following FreeBSD error:
ld: error: undefined symbol: pthread_getschedparam
>>> referenced by realtime.c:25 (../sway/realtime.c:25)
>>> sway/sway.p/realtime.c.o:(set_rr_scheduling)
Fixes: a3a82efbf6b5 ("realtime: request SCHED_RR using CAP_SYS_NICE")
* ipc: remove chatty debug log messages
These aren't particularly useful, and clobber the debug logs.
* Refuse to start when SUID is detected
This ensures that those surprised by the deprecation of SUID operation
receive an error rather than accidentally having sway run as root.
This detection will be removed in a future release.
* swaynag: move close_button up to fix SIGSEGV
When swaynag_parse_options encounters '--dismiss-button' (or its
shorthand '-s'), it sets the text of the first button in the
swaynag.buttons list, which is expected to exist and to be the dismiss
button, to the one passed by the user.
Commit 4780afb68b4ee2cdf0e4925f40cf885819f8a74a ("swaynag: statically
allocate button_close, and move declaration") moved the list
initialization to after swaynag_parse_options is called which made that
code fail.
For example, the command 'swaynag --dismiss-button Dismiss' crashes and
'swaynag --message Message --button Yes "" --dismiss-button Dismiss'
shows the wrong buttons.
Move it back to before swaynag_parse_options is called.
* config/output: use wlr_output_commit_state
This makes the code more robust because we don't potentially leave
bad state in wlr_output.pending behind anymore. This also fixes a
bug.
Closes: https://github.com/swaywm/sway/issues/7043
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3610
* Allocate enough space for `cmd_results->error`
* Remove access to wlr_input_device union
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3626
Closes: https://github.com/swaywm/sway/issues/7077
* Rename dpms output command to power
The "dpms" command refers to VESA Display Power Management
Signaling, a deprecated standard. It's superseded by VESA DPM.
Instead of tying out command name to a particular standard, use the
neutral term "power".
* Strip quotes in bindsym --input-device=...
If the input device is quoted, which is common when using variables in the
config file, those quotes must be ignored here, or the input device will be
ignored.
Fixes #7029.
* Avoid unecessary string copy
* Reject font values that are invalid for pango
Use pango to parse font configuration early, and reject the command as
invalid if the value is invalid for pango. Since we're already parsing
the font into a `PangoFontDescription`, keep that instance around and
avoid re-parsing the font each time we render text.
Fixes: https://github.com/swaywm/sway/issues/6805
* Reuse parsed PangoFontDescription
Avoids parsing the configured font each time text is rendered.
* ipc: add "power" to output reply
* config.in: switch to `output power`
* Remove internal references to DPMS
While at it, use an int for the config field, just like we do for
all other fields.
* fix: remove redundant empty statement in main.c
This semi-colon looks like a typo. Luckily, it has no effect on the code as it's treated as an empty statement leading the switch case.
Really straightforward nitpick change, was just something I was confused by when reading over the code.
* input: chase delta_discrete semantics change
* swaymsg: fix floating_nodes being ignored
Fix floating_nodes being ignored in pretty_print_tree.
* ipc: make get_deco_rect check config->hide_lone_tab
Without this, the `IPC_GET_TREE` ipc call would return false information
about the container's `deco_rect` and `rect` properties if
`hide_edge_borders --i3` was in effect.
* grimshot: fix tilde expansion within quotes
* Enable single-pixel-buffer-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3428
* sway-output.5: improve display of parameter
Since "width" and "height" are separate parameters, show them as such.
* man: sway(5) move fixes
* ipc: drop WLR_OUTPUT_ADAPTIVE_SYNC_UNKNOWN case
This has been removed from wlroots.
* config/output: test adaptive sync
Required for [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3637
* Fix crash in xdg_activation_v1.c
wlr_xdg_surface_from_wlr_surface() can return a NULL pointer, so check for NULL before dereferencing it.
* sway: Add non-desktop-output type
Currently, when encountering a non-desktop display, sway offers the
output for leasing and returns without storing it in a sway specific
output type like `struct sway_output`. Additionally, running
`swaymsg -t get_outputs` doesn't show non-desktop outputs.
This commit stores the non-desktop outputs into a struct called
`sway_output_non_desktop`, and adds them to a list on `sway_root`
* sway: add non-desktop outputs to json when running `swaymsg -t get_outputs`
* swaymsg: show non-desktop property when pretty printing outputs
* man: Add XWayland information
* ipc: expose mode picture aspect ratio
* swaymsg: show mode picture aspect ratio
* build: simplify protocol paths
No need for arrays here.
* sway/commands/output: Add command for unplugging non-physical outputs
* Improve Japanese translation
* allow pointer_constraints on layer_shell surfaces
* check for NULL
* use seat directly
* Use keyboard_state.focused_surface directly
* input: focus floating container when clicked on border
Fixes #7209.
* input: focus container when scrolling on titlebar
Fixes #6503.
* Fix leaks in criteria_destroy()
* Avoid double free in criteria_destroy()
* Add support for ext-idle-notify-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3753
* input: tweak focus behavior to allow focusing parent containers
Sway focuses the inactive child when focusing split containers. However,
there is currently no way to focus the parent container itself by mouse.
A user must use the keyboard to do so.
This commit maintains the current behavior, but makes it such that a
second click on the split container titlebar (i.e., after its children
are visible) focuses the split container itself.
* Fix keymap being NULL and segfaulting on dev add
Moved `libinput_config` to the callers of
`sway_input_configure_libinput_device` so that we send the event after
the added event.
* Rework session lock keyboard focus handling
When removing outputs, it is possible to end up in a situation where
none of the session lock client's surfaces have keyboard focus,
resulting in it not receiving keyboard events. Track the focused
surface and update it as needed on surface destroy.
* Fix focus tracking when session lock is active
Remove the incorrect attempt to block focus changes when an input grab
is present and replace it with the same logic used for layer_shell-based
screen lockers: restore the focus after changing it.
This fixes a use-after-free of seat->workspace if outputs are destroyed
while a screen lock is enabled.
* container_floating_set_default_size: Store workspace size box on the stack
* Support libinput's 1.21 new dwtp option
Support the new dwtp (disable while trackpointing) option introduced in
libinput 1.21, allowing users to control whether the trackpoint (like
those in Thinkpads, but not only) should be disabled while using the
keyboard/touchpad.
See: https://gitlab.freedesktop.org/libinput/libinput/-/issues/731
* tree: support formatting null titles
Any windows that have never had a title set visually behave closer to
that of an empty title, but are unformattable, as the code bails out
early on a NULL title.
* criteria: allow matching on empty (NULL) titles
* criteria: allow matching for NULL string criteria
* ci: install hwdata
* Use wl_signal_emit_mutable()
This function fixes segfaults when emitting a signal potentially
removes arbitrary listeners.
* Use wlr_damage_ring
wlr_output_damage is to be replaced with wlr_damage_ring, so use that.
* lock: fix crash on output destroy
Closes: https://github.com/swaywm/sway/issues/7120
* container_get_siblings: handle NULL workspace
* ci: checkout wlroots 0.16.0
* workspace_create: Don't allow NULL name
(cherry picked from commit 34933bb84350fe805d82276ea02d5732546e9993)
* output: set damage ring bounds to pixel values
Fixes: https://github.com/swaywm/sway/issues/7254
(cherry picked from commit 85005b52fe5b832e4ea914fa28048b0c5c803769)
* Use shm_open instead of mkstemp
shm_open is more reliable because it does not require
a writeable filesystem folder, unlike mkstemp.
(cherry picked from commit e2bc8866f46701e9c825ad7fa5baac02b2e4898f)
* build: drop wayland-scanner fallback
(cherry picked from commit 366f6ef3d31688631dc453028e108f98a1d7ab57)
* build: unify server & client protocol generation
No need to make a difference here, let's just generate header
files for both.
(cherry picked from commit 5be5a038da8a3789a19945719f2a27233291445d)
* build: drop "server" from target name for protocol code
(cherry picked from commit e5475d9310941ce88ed016ce1515b36e3a440252)
* build: drop intermediate libraries for protocols
(cherry picked from commit af8a5a8918ef42336194fb1077b008a736de7af9)
* root: move the workspace matching code to its own file
This removes the pid_workspace bits from tree/root before it gets
too interesting.
No functional change.
(cherry picked from commit eb5021ef990fb29ff86544aea58d687ad62c757a)
* node: prettify node type names
(cherry picked from commit 1c4b94ae3ca94b972410c80a61404a347af1ee68)
* launcher: track workspaces by node
This removes the need to rename the pid_workspaces when a workspace
is renamed.
It also opens the possibility of tracking other node types. Tracking
containers would allow application to be placed correctly in the
container tree even if the user has moved their focus elsewhere since
it was launched.
(cherry picked from commit 3b49f2782e8faf68766269b9c7390b16e25ae824)
* launcher: use xdga tokens
This reuses wlroots token tracking for workspace matching. It doesn't
export any xdga tokens for clients yet.
(cherry picked from commit bd66f4943da1c96edc3ba49573e27b42b688c543)
* launcher: rename pid_workspace to launcher_ctx
Soon we will match views with more than just a pid.
(cherry picked from commit d75c9f9722389d441fd24bd490c5cf12c4bef39a)
* view: associate launch contexts with views
Views now maintain a reference to a launch context which, as a last
resort, is populated at map time with a context associated with its pid.
This opens the possibility of populating it before map via another
source, e.g. xdga-tokens or configuration.
(cherry picked from commit 864b3a9a18f236f92f1898bb44ab977ceaebfd68)
* launcher: initialize launcher_ctxs once on startup
(cherry picked from commit 66568508c06267445489d655c91c94a34d6d9ffe)
* launcher: fudge the interface a bit
We want to create a context before knowing the pid it will match with.
(cherry picked from commit bdeb9f95651f6c99cc2f4cfb59020ddee202cf36)
* launcher: export xdga tokens and use them for workspace matching
(cherry picked from commit 30ad4dc4a5a41ce7c7aa85096a6e18f374172983)
* launcher: export X startup ids and use them for workspace matching
(cherry picked from commit 28fda4c0d38907fab94dc7d82c9dcf0754748b4e)
* swaybar: Prioritize hotspot events to bar bindings
This is consistent with i3bar's behaviour, and for example, allows binding a
command to button1, while still being able to click on tray icons or other
zones on the bar's status line which may have their own bindings.
E.g., in Sway, without this commit, this config. makes tray icons unclickable:
bar {
# ...
bindsym button1 exec swaynag -m You_clicked_the_tray._Want_some_help?
}
But the same configuration in i3 (with i3-nagbar) keeps tray items clickable.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 53f9dbd424dc173a85c9f4cd30802259d38b1ef4)
* swaybar: Make hotspots block bar release bindings
The previous commit prioritized hotspots before bar bindings for press events,
which matches i3's behaviour. However, since hotspots don't need to do any
processing on release events, those were not handled, and simply fell through
to `bindsym --release` bar bindings (if any).
This is counter-intuitive, and doesn't match i3's behaviour. Instead in case
a hotspot handles the press event, it should also handle the release event,
doing nothing, but blocking the event from triggering a --release bar binding.
E.g., in Sway, without this commit, this config. shows a text on tray clicks:
bar {
# ...
bindsym --release button1 exec swaynag -m I_got_the_release_event.
}
But the same configuration in i3 (with i3-nagbar) doesn't show the text.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 94b69acf0d7b26ee5af2172300cb18473508da76)
* build: drop unused wayland-egl dependency
(cherry picked from commit 37e4a3d6370dc6ba2b0877d588845c06781e880e)
* build: bump version to 1.8-rc1
* Fix build on Debian Stable
(cherry picked from commit dca0bb5749bc16f91ab964fc1b06ebb9a453368f)
* build: fix have_xwayland when xcb-icccm is not found
xcb-icccm is required to build Xwayland support.
Backported from commit d41f11e6bd8cef80f02dda4c66d4a31611aed753.
* build: bump version to 1.8-rc2
* seat: Avoid sending redundant keymaps on reload
When we reload the config, we reset every input device and re-apply
configuration from the config file. This means that the keyboard keymap
is updated at least once during config reload, more if the config file
contains keyboard configuration.
When they keyboard keymap changes and is updated through wlr_seat, the
keymap ends up sent to every keyboard bound in every client, seemingly
multiple times. On an x230 of mine with a keyboard layout set in the
config file, I see 42 keymap events sent to foot on config reload.
Reduce events from keyboard configurations by skipping all but the
currently active keyboard for the seat, and by clearing the active
keyboard during input manager device reset. After this change, I only
see a single just-in-time keymap event.
Fixes: https://github.com/swaywm/sway/issues/6654
* criteria: be lenient on window_role and instance too
* build: bump version to 1.8-rc3
* commands/move: Warp cursor after moving workspace to another output
This makes sway's behavior consistent with i3 when `mouse_warping` is
set to any value besides `none`.
Fixes #7027.
(cherry picked from commit e3c63bf58d0744dfb436f0f38442ce3735e40f47)
* seat: Set keyboard if seat keyboard is NULL
sway sends wl_keyboard.enter on seat focus change and when a keyboard
active on a seat is configured. If all keyboards are removed and a
keyboard is added back without changing the focused client, no new
notify event would be sent despite having keyboard focus. This could
lead to key events without notify, which is a protocol violation.
As a quick fix, when configuring a keyboard on a seat where no keyboard
is currently active, activate the keyboard so that a focused surface
will receive a notify event.
Regressed by: e1b268af98edeb09e570e8855ef64f0719cbafe2
Closes: https://github.com/swaywm/sway/issues/7330
(cherry picked from commit 1ade0ce753dc5f588584f444ce80d27c3b1e4300)
* build: bump version to 1.8-rc4
* swaynag: fix NULL font description
The font description was only set if provided on the CLI. It was
left NULL for the defaults and when reading from the config file.
Closes: https://github.com/swaywm/sway/issues/7186
(cherry picked from commit fd0af78e43f4dd67a404f475c676b25ae38a4b82)
* build: bump version to 1.8
* Removed other README languages
* Fixed build issues
* Removed alpha from render_data struct
* Updated PKGBUILDs and COPR spec
* Update sway/desktop/render.c
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
* Fixed deco_data not being initialized properly
* Replaced wlr_egl_(make|unset)_current with eglMakeCurrent
* Added matrix_projection into fx_renderer
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: Sefa Eyeoglu <contact@scrumplex.net>
Co-authored-by: Simon Ser <contact@emersion.fr>
Co-authored-by: Seth Barberee <seth.barberee@gmail.com>
Co-authored-by: Thomas Hebb <tommyhebb@gmail.com>
Co-authored-by: Nathan Schulte <nmschulte@gmail.com>
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
Co-authored-by: David Rosca <nowrep@gmail.com>
Co-authored-by: David96 <david@hameipe.de>
Co-authored-by: Kenny Levinsen <kl@kl.wtf>
Co-authored-by: Aleksei Bavshin <alebastr89@gmail.com>
Co-authored-by: Kirill Chibisov <contact@kchibisov.com>
Co-authored-by: Tudor Brindus <me@tbrindus.ca>
Co-authored-by: Patrick Hilhorst <git@hilhorst.be>
Co-authored-by: Rouven Czerwinski <rouven@czerwinskis.de>
Co-authored-by: Tobias Bengfort <tobias.bengfort@posteo.de>
Co-authored-by: Ronan Pigott <rpigott@berkeley.edu>
Co-authored-by: Kirill Primak <vyivel@eclair.cafe>
Co-authored-by: Tuomas Yrjölä <mail@yrhki.fi>
Co-authored-by: Kirill Primak <vyivel@posteo.net>
Co-authored-by: Alexander Browne <elcste@users.noreply.github.com>
Co-authored-by: Marco Rubin <20150305+Rubo3@users.noreply.github.com>
Co-authored-by: Muhamed Hobi <woohoomoo2u@gmail.com>
Co-authored-by: Simon Zeni <simon@bl4ckb0ne.ca>
Co-authored-by: Nihal Jere <nihal@nihaljere.xyz>
Co-authored-by: Alexander Gramiak <agrambot@gmail.com>
Co-authored-by: Moon Sungjoon <sumoon@seoulsaram.org>
Co-authored-by: Nicolas Avrutin <nicolas@avrutin.net>
Co-authored-by: ndren <andreien@ctemplar.com>
Co-authored-by: Bill Li <billli11hkb@gmail.com>
Co-authored-by: Leonardo Hernández Hernández <leohdz172@protonmail.com>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Co-authored-by: Manuel Stoeckl <code@mstoeckl.com>
Co-authored-by: Yasin Silavi <59373143+sttatusx@users.noreply.github.com>
Co-authored-by: Daniel De Graaf <code@danieldg.net>
Co-authored-by: kraftwerk28 <kefirchik3@gmail.com>
Co-authored-by: Eskil <67291226+eschillus@users.noreply.github.com>
Co-authored-by: Alice Carroll <git@alice-carroll.pet>
Co-authored-by: Alan <51193876+Pound-Hash@users.noreply.github.com>
Co-authored-by: Victor Makarov <vitja.makarov@gmail.com>
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: -k <slowdive@me.com>
Co-authored-by: Hongyi <61831273+FrozenArcher@users.noreply.github.com>
Co-authored-by: Urey. Xue <urey.s.knowledge@gmail.com>
Co-authored-by: LordRishav <75823494+LordRishav@users.noreply.github.com>
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
Co-authored-by: Florian Franzen <Florian.Franzen@gmail.com>
Co-authored-by: Greg Depoire--Ferrer <greg@gregdf.com>
Co-authored-by: Thomas Jost <schnouki@schnouki.net>
Co-authored-by: Hugo Osvaldo Barrera <hugo@barrera.io>
Co-authored-by: zkldi <ktchidev@gmail.com>
Co-authored-by: llyyr <llyyr.public@gmail.com>
Co-authored-by: Baltazár Radics <baltazar.radics@gmail.com>
Co-authored-by: Martin Michlmayr <tbm@cyrius.com>
Co-authored-by: Filip Szczepański <jazz2rulez@gmail.com>
Co-authored-by: Alex Maese <memaese@hotmail.com>
Co-authored-by: マリウス <marius@xn--gckvb8fzb.com>
Co-authored-by: Andri Yngvason <andri@yngvason.is>
Co-authored-by: ohno418 <yutaro.ono.418@gmail.com>
Co-authored-by: Ferdinand Schober <ferdinand.schober@fau.de>
Co-authored-by: cparm <armelcadetpetit@gmail.com>
Co-authored-by: Yaroslav de la Peña Smirnov <yps@yaroslavps.com>
Co-authored-by: Alexander Orzechowski <orzechowski.alexander@gmail.com>
Co-authored-by: pudiva chip líquida <pudiva@skylittlesystem.org>
Co-authored-by: Puck Meerburg <puck@puckipedia.com>
Co-authored-by: Callum Andrew <calcium@mailbox.org>
Co-authored-by: Ronan Pigott <ronan@rjp.ie>
Co-authored-by: Joan Bruguera <joanbrugueram@gmail.com>
Co-authored-by: nerdopolis <bluescreen_avenger@verizon.net>
Co-authored-by: Ankit Pandey <anpandey@protonmail.com>
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
2023-01-05 09:32:43 +11:00
|
|
|
con->pending.x = ob.x + (ob.width - con->pending.width) / 2;
|
|
|
|
con->pending.y = ob.y + (ob.height - con->pending.height) / 2;
|
2019-03-02 18:29:28 +11:00
|
|
|
} else {
|
2021-02-13 09:22:51 +11:00
|
|
|
con->pending.x = ws->x + (ws->width - con->pending.width) / 2;
|
|
|
|
con->pending.y = ws->y + (ws->height - con->pending.height) / 2;
|
2019-03-02 18:29:28 +11:00
|
|
|
}
|
2018-07-26 18:36:46 +10:00
|
|
|
} else {
|
2021-02-13 09:22:51 +11:00
|
|
|
if (con->pending.content_width > ws->width
|
|
|
|
|| con->pending.content_height > ws->height) {
|
rebase: Sway 1.8 (#78)
* build: bump wlroots dependency to 0.16.0
* swaymsg: replace if with switch in pretty_print
* swaymsg: add GET_TREE pretty-printing
* swaybar: fix errno handling in status_handle_readable
If getline fails once, it was not reset before the next getline
call. errno is only overwritten by getline on error.
* Add cairo_image_surface_create error handling
cairo_image_surface_create can fail, e.g. when running out of
memory or when the size is too big. Avoid crashing in this case.
Closes: https://github.com/swaywm/sway/issues/6531
* build: bump version to 1.8-dev
Historically we've been sticking with the last release number in
the master branch. However that's a bit confusing, people can't
easily figure out whether they're using a release or a work-in-progress
snapshot. Only the commit hash appended to the version number may
help, but that's not very explicit and disappears when using a
tarball.
We could bump the version in master to the next release number.
However during the RC cycle there would be a downgrade from 1.8 to
1.8-rc1. Also it would be hard to tell the difference between a
stable release and an old snapshot.
This patch introduces a new pre-release identifier, "dev". It's
alphabetically before "rc" so it should be correctly sorted by
semver comparisons. "dev" is upgraded to "rc" (and then to stable)
when doing a release. The master branch always uses a "dev"
version, only release branches use "rc" or stable versions.
* [IPC] Add repeat delay/rate info to keyboard
Closes #6735
wlroots already has the info in the struct so let's access it and print it out.
* input/seat: unset has_focus when focus_stack becomes empty
We currently track the focus of a seat in two ways: we use a list called
focus_stack to track the order in which nodes have been focused, with
the first node representing what's currently focused, and we use a
variable called has_focus to indicate whether anything has focus--i.e.
whether we should actually treat that first node as focused at any given
time.
In a number of places, we treat has_focus as implying that a focused
node exists. If it's true, we attempt to dereference the return value of
seat_get_focus(), our helper function for getting the first node in
focus_list, with no further checks. But this isn't quite correct with
the current implementation of seat_get_focus(): not only does it return
NULL when has_focus is false, it also returns NULL when focus_stack
contains no items.
In most cases, focus_stack never becomes empty and so this doesn't
matter at all. Since focus_stack stores a history of focused nodes, we
rarely remove nodes from it. The exception to this is when a node itself
goes away. In that case, we call seat_node_destroy() to remove it from
focus_stack and free it. But we don't unset has_focus if we've removed
the final node! This lets us get into a state where has_focus is true
but seat_get_focus() returns NULL, leading to a segfault when we try to
dereference it.
Fix the issue both by updating has_focus in seat_node_destroy() and by
adding an assertion in seat_get_focus() that ensures focus_stack and
has_focus are in sync, which will make it easier to track down similar
issues in the future.
Fixes #6395.
[1] There's some discussion in #1585 from when this was implemented
about whether has_focus is actually necessary; it's possible we could
remove it entirely, but for the moment this is the architecture we have.
* swaybar: fix tray_padding vs min-height re: scale
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
* swaybar: fix tray item icon scaling, positioning
* container: Fix crash when view unmaps + maps quickly
Followup on 4e4898e90f.
If a view quickly maps and unmaps repeatedly, there will be multiple
destroyed containers with same view in a single transaction. Each of
these containers will then try to destroy this view, resulting in use
after free.
The container should only destroy the view if the view still belongs
to the container.
Simple reproducer: couple XMapWindow + XUnmapWindow in a loop followed
by XDestroyWindow.
See #6605
* commands/move: Fix crash when pos_y is omitted
Fixes #6737
* Destroy sub-surfaces with parent layer-shell surface
Closes: https://github.com/swaywm/sway/issues/6337
* Add safety assert in parse_movement_unit
Let's add this just in case a caller passes argc == 0.
References: https://github.com/swaywm/sway/issues/6737#issuecomment-1008082540
* meson: check: false on run_command
Future meson releases will change the default and warns when the
implicit default is used, breaking builds.
Explicitly set check: false to maintain behavior and silence warnings.
* Print deprecation notice when running SUID
SUID privilege drop is needed for the "builtin"-backend of libseat,
which copied our old "direct" backend behavior for the sake of
compatibility and ease of transition.
libseat now has a better alternative in the form of seatd-launch. It
uses the normal seatd daemon and libseat backend and takes care of SUID
for us.
Add a soft deprecation warning to highlight our future intent of
removing this code. The deprecation cycle is needed to avoid surprises
when sway no longer drops privileges.
* xdg-shell: use toplevel geometry to adjust the popup box
`popup_unconstrain` uses view coordinates to init the output box for
popups. However wlroots expects the box to be set in a toplevel surface
coordinate system, which is not always equal to view. The difference
between those is a window geometry set via xdg-shell.
GTK4 reserves some space for client-side decoration and thus has a
window with top left corner not matching to (0, 0) of a surface. The box
calculated without taking that into account was slightly shifted
compared to the actual output and allowed to position part of the popup
off screen.
* build: fix building with basu
02b412a introduced the use of list for sdbus deps, however
it was assuming that all packages which were in a list has a version
higher than 239. That is true for libsystemd and libelogind, since they
use the same versions, however basu is using version numbers which are
way lower than what libsystemd/libelogind are using, so basu only build
is failing.
* Upgrade for wlroots surface refactoring
See [1] for details.
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3412
* commands/focus: drop trailing whitespace
* input/cursor: count pointer gestures as idle activity
Fixes https://github.com/swaywm/sway/issues/6765.
* input/cursor: treat swipe begin as idle activity too
Accidentally overlooked in fd53f80.
* treat fullscreen windows as 'tiled' for commands/focus
* transaction: destroying nodes aren't hidden
Commit 37d7bc69986f ("transaction: Only wait for ack from visible
views") introduced a check which uses view_is_visible() to check if a view
is still visible on the screen. However view_is_visible() will early
return in case the node is in the destroying state. This is incorrect
for transactions, since a destroying view which is visible will trigger
configure events for other clients. This bug was visible when repeatedly
opening and closing two views side by side, since we ignore the
destroying node we get a frame where the still open view is shown with
the old configure values and the rest is the desktop background. The
next frame is than correct again.
Fix this by considering destroying views as visible, we correctly wait
for them and send the configure events to other views in time, fixing
the background flicker.
Fixes #6473
* build: execute wlroots subproject before finding deps
wlroots often requires dependencies more recent than Sway's.
Executing the wlroots subproject first will give Meson a chance to
find these newer dependencies, possibly via subprojects.
The subproject will override the "wlroots" dependency when executed,
so we don't need to use get_variable anymore.
References: https://github.com/swaywm/sway/pull/6498#issuecomment-1001746017
* tray: do not render passive items
https://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/StatusNotifierItem/#org.freedesktop.statusnotifieritem.status
* cmd/swap: error on swapping a container with itself
* input/cursor: pass through pointer hold gestures
This just follows swaywm/wlroots#3047, so `wl_pointer_gestures_v1`
clients can be notified of these events.
* swaynag: remove buffer destruction condition
An address of a variable can never be NULL, so checking it doesn't make
sense; and `destroy_buffer()` can operate on already destroyed buffers
anyway.
Fixes #6780
* Use bools for CLI flags
* xwayland: listen to `request_activate` event
When REAPER submenu is closed `XCB_CLIENT_MESSAGE` with type
`NET_ACTIVE_WINDOW` is sent to set focus to parent menu.
Closes: https://github.com/swaywm/sway/issues/6324
* chore: chase wlr_output_layout_get_box() update
https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3439
* Chase wlroots xdg-shell refactor
* Minor update to focus_on_window_activation
Removed xwayland limitation since wayland clients are supported via xdg-activation.
* Translated README into Italian
* readme: add link to Italian translation
* readme: sort language list alphabetically
* readme: use relative links for translations
* xdg-shell: use wlr_xdg_toplevel in sway_view
Improved type safety.
Closes: https://github.com/swaywm/sway/issues/6813
* xdg-shell: use wlr_xdg_popup in sway_xdg_popup
Improved type safety.
* Fix snprintf compiler warning
* Remove all sprintf calls
Replace them with snprintf, which ensures buffer overflows won't
happen.
* sway/commands: add missing wlr_keyboard interface include in xkb_switch_layout
* sway/input: use wlr_input_device from input device base
* Remove some erroneous apostrophes in comments
* Don't enter seatop_move_floating when fullscreen
Currently, a floating window that's been fullscreened can send us
xdg_toplevel::move, and we'll enter seatop_move_floating, which lets us
drag the surface around while it's fullscreen. We don't want
this--fullscreen surfaces should always be aligned to the screen--so add
the same check that seatop_default already does when entering this mode.
Tested with Weston's weston-fullscreen demo, which sends a move request
if you click anywhere on its surface.
* swaynag: die on all allocation failures
* sway/input: don't pass possibly invalid modifiers pointer
active_keyboard may be NULL, in which case an invalid pointer could be
passed to wlr_input_method_keyboard_grab_v2_send_modifiers. This
procedure call is unnecessary since wlroots commit 372a52ec "input
method: send modifiers in set_keyboard", so the call can simply be
removed.
Fixes #6836.
* sway/input: destroy sway_switch properly
Fix: #6861
Added seat_device_destroy function to seat_device_destroy function.
* commands/focus: fix segfault when no container is already focused.
Fixes #6690.
* Remove WLR_SWITCH_STATE_TOGGLE usage
Ref [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/commit/4792446ee8f50104bd207d9ccd8558a7e4eb4514
* Replace pcre with pcre2
Closes: https://github.com/swaywm/sway/issues/6838
* swaybar: remove swaybar_output.input_region
No need to keep the region around, we can immediately destroy it
after the wl_surface.set_input_region request.
* swaybar: set opaque region
When the background color is fully opaque, set the surface's opaque
region to the whole surface.
* Updating criteria checking with PCRE2
* swaynag: allocate button_details with details
They are used together, so it doesn't make sense to allocate them
separately.
* swaynag: statically allocate button_close, and move declaration
Every swaynag has a close button, so it doesn't make sense to
allocate it dynamically. The declaration is moved later to when
it is actually needed.
* swaynag: remove unnecessary zero of swaynag struct
Global variables are initialized to 0.
* swaynag: remove redundant status variables in main
Instead, we just use `status` for all failures.
* remove unnecessary strlen call
* sway/input/cursor: take device mm size from wlr_tablet
* sway/input/seat: take output name from specialized input device
* sway/input: follow up wlroots input device events renaming
* sway/input: fix bad position of wlr_drag
* sway/input: wlr_seat_keyboard() now takes wlr_keyboard
* bash-completion: localize variables
* sway/main: move constants off the stack
This makes stack traces from gdb slightly easier to read.
* Fix farsi label
* Avoid format-truncation warning
The existing code gives this error when compiled with GCC 12:
../sway/server.c: In function ‘server_init’:
../sway/server.c:217:75: error: ‘%d’ directive output may be truncated writing between 1 and 11 bytes into a region of size 8 [-Werror=format-truncation=]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~
../sway/server.c:217:66: note: directive argument in the range [-2147483647, 32]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~
../sway/server.c:217:17: note: ‘snprintf’ output between 10 and 20 bytes into a destination of size 16
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Because i is never negative, this is a false positive, but it is easy to
change i to unsigned to silence the error.
* Shuffle variables to satisfy -Werror=restrict
This also fixes an invalid strlen invocation on uninitialized memory.
* layer_shell: keep output non-NULL wherever possible
Our layer shell implementation assigns every layer surface to an output
on creation. It tracks this output using the output field on the
underlying wlr_layer_surface_v1 structure. As such, much of the existing
code assumes that output is always non-NULL and omits NULL checks
accordingly.
However, there are currently two cases where we destroy a
sway_layer_surface and output is NULL. The first is when we can't find
an output to assign the surface to and destroy it immediately after
creation. The second is when we destroy a surface in response to its
output getting destroyed, as we set output to NULL in
handle_output_destroy() before we call wlr_layer_surface_v1_destroy(),
which is what calls the appropriate unmap and destroy callbacks.
The former case doesn't cause any problems, since we haven't even
allocated a sway_layer_surface at that point or registered any
callbacks. The latter case, however, currently triggers a crash (#6120)
if a popup is visible, since our popup_handle_unmap() implementation
can't handle a NULL output.
To fix this issue, keep output set until right before we free the
sway_layer_surface. All we need to do is remove some of the cleanup
logic from handle_output_destroy(), since as of commit c9060bcc12d0
("layer-shell: replace close() with destroy()") that same logic is
guaranteed to be happen later when wlroots calls handle_destroy() as
part of wlr_layer_surface_v1_destroy().
This lets us remove some NULL checks from other unmap/destroy callbacks,
which is nice. We also don't need to check that the wlr_output points to
a valid sway_output anymore, since we unset that pointer after disabling
the output as of commit a0bbe67076b8 ("Address emersions comments on
output re-enabling") Just to be safe, I've added assertions that the
wlr_output is non-NULL wherever we use it.
Fixes #6120.
* Chase wlroots X11 hints update
* Add Swedish README
* Support cursor capture in grimshot
Refactor argument parser
Bring back `sh` compatibility
Default to NOTIFY=no
* Update grimshot.1.scd
Fixed typo. The object is **files**, which is plural. **image** modifies files; it's not countable.
* xkb_switch_layout: fix relative layout switches
Fixes #6011
* Implement ext-session-lock-v1
* Avoid inspecting a NULL view in seat_set_focus
Fixes #6968
* swaynag: do error checking and rename read_from_stdin
read_from_stdin not only read from stdin, but trimming trailing
newlines, so rename it to reflect this.
* swaynag: improve robustness when loading config
* swaynag: combine consecutive declaration/assignments
* config: Remove unused mouse binding structure
Mouse bindings are handled alongside normal bindings. Remove the unused
separate data structure definition to avoid confusion.
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
* Replace strncpy with memcpy
strncpy is useless here, is dangerous because it doesn't guarantee
that the string is NUL-terminated and causes the following warning:
../sway/criteria.c: In function ‘criteria_parse’:
../sway/criteria.c:712:25: error: ‘strncpy’ destination unchanged after copying no bytes [-Werror=stringop-truncation]
712 | strncpy(value, valuestart, head - valuestart);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Add descriptions for `stacking` and `tabbed` layouts
Resolves #5918
* man: Fix trailing spaces
* server: request xdg-shell v2
Wlroots does not yet support the newer xdg-shell versions and now
requires the compositor to set the supported xdg-shell version during
creation. Set this to v2 for sway as well.
Fixes https://github.com/swaywm/sway/issues/7001
* realtime: request SCHED_RR using CAP_SYS_NICE
Try to gain SCHED_RR (round-robin) realtime scheduling privileges before
starting the server. This requires CAP_SYS_NICE on Linux systems.
We additionally register a pthread_atfork callback which resets the
scheduling class back to SCHED_OTHER (the Linux system default).
Due to CAP_SYS_NICE, setting RLIMIT_RTPRIO has no effect on the process
as documented within man 7 sched (from Linux):
Privileged (CAP_SYS_NICE) threads ignore the RLIMIT_RTPRIO limit;
as with older kernels, they can make arbitrary changes to
scheduling policy and priority. See getrlimit(2) for further
information on RLIMIT_RTPRIO
Note that this requires the sway distribution packagers to set the
CAP_SYS_NICE capability on the sway binary.
Supersedes #6992
* ext-session-lock: disable direct scan-out when locked
* Polish the language in README.zh-CN.md & sync with English one
Co-Authored-By: Urey. Xue <urey.s.knowledge@gmail.com>
* De-duplicate IPC output descriptions
* Handle NULL output make/model/serial
* chore: chase wlroots xdg-shell update
* xdg-shell: schedule a configure on maximize request
This commit reverts 03879290dbee26127f6867ef60bc2a7f9a6c8c5f and
fc84bcb7fb0ffa29b1f9bed287762241a3473803.
* Add a Hindi (हिन्दी) translation to the README
Hindi is one of the most prominent languages of the Indian Subcontinent.
This commit adds the translation of the README into the Hindi language.
Some of the words are still written in English because there wasn't an
appropriate technical term of the word in the language.
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
* sway: add bindgesture command
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
* build: link with -pthread
Fixes the following FreeBSD error:
ld: error: undefined symbol: pthread_getschedparam
>>> referenced by realtime.c:25 (../sway/realtime.c:25)
>>> sway/sway.p/realtime.c.o:(set_rr_scheduling)
Fixes: a3a82efbf6b5 ("realtime: request SCHED_RR using CAP_SYS_NICE")
* ipc: remove chatty debug log messages
These aren't particularly useful, and clobber the debug logs.
* Refuse to start when SUID is detected
This ensures that those surprised by the deprecation of SUID operation
receive an error rather than accidentally having sway run as root.
This detection will be removed in a future release.
* swaynag: move close_button up to fix SIGSEGV
When swaynag_parse_options encounters '--dismiss-button' (or its
shorthand '-s'), it sets the text of the first button in the
swaynag.buttons list, which is expected to exist and to be the dismiss
button, to the one passed by the user.
Commit 4780afb68b4ee2cdf0e4925f40cf885819f8a74a ("swaynag: statically
allocate button_close, and move declaration") moved the list
initialization to after swaynag_parse_options is called which made that
code fail.
For example, the command 'swaynag --dismiss-button Dismiss' crashes and
'swaynag --message Message --button Yes "" --dismiss-button Dismiss'
shows the wrong buttons.
Move it back to before swaynag_parse_options is called.
* config/output: use wlr_output_commit_state
This makes the code more robust because we don't potentially leave
bad state in wlr_output.pending behind anymore. This also fixes a
bug.
Closes: https://github.com/swaywm/sway/issues/7043
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3610
* Allocate enough space for `cmd_results->error`
* Remove access to wlr_input_device union
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3626
Closes: https://github.com/swaywm/sway/issues/7077
* Rename dpms output command to power
The "dpms" command refers to VESA Display Power Management
Signaling, a deprecated standard. It's superseded by VESA DPM.
Instead of tying out command name to a particular standard, use the
neutral term "power".
* Strip quotes in bindsym --input-device=...
If the input device is quoted, which is common when using variables in the
config file, those quotes must be ignored here, or the input device will be
ignored.
Fixes #7029.
* Avoid unecessary string copy
* Reject font values that are invalid for pango
Use pango to parse font configuration early, and reject the command as
invalid if the value is invalid for pango. Since we're already parsing
the font into a `PangoFontDescription`, keep that instance around and
avoid re-parsing the font each time we render text.
Fixes: https://github.com/swaywm/sway/issues/6805
* Reuse parsed PangoFontDescription
Avoids parsing the configured font each time text is rendered.
* ipc: add "power" to output reply
* config.in: switch to `output power`
* Remove internal references to DPMS
While at it, use an int for the config field, just like we do for
all other fields.
* fix: remove redundant empty statement in main.c
This semi-colon looks like a typo. Luckily, it has no effect on the code as it's treated as an empty statement leading the switch case.
Really straightforward nitpick change, was just something I was confused by when reading over the code.
* input: chase delta_discrete semantics change
* swaymsg: fix floating_nodes being ignored
Fix floating_nodes being ignored in pretty_print_tree.
* ipc: make get_deco_rect check config->hide_lone_tab
Without this, the `IPC_GET_TREE` ipc call would return false information
about the container's `deco_rect` and `rect` properties if
`hide_edge_borders --i3` was in effect.
* grimshot: fix tilde expansion within quotes
* Enable single-pixel-buffer-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3428
* sway-output.5: improve display of parameter
Since "width" and "height" are separate parameters, show them as such.
* man: sway(5) move fixes
* ipc: drop WLR_OUTPUT_ADAPTIVE_SYNC_UNKNOWN case
This has been removed from wlroots.
* config/output: test adaptive sync
Required for [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3637
* Fix crash in xdg_activation_v1.c
wlr_xdg_surface_from_wlr_surface() can return a NULL pointer, so check for NULL before dereferencing it.
* sway: Add non-desktop-output type
Currently, when encountering a non-desktop display, sway offers the
output for leasing and returns without storing it in a sway specific
output type like `struct sway_output`. Additionally, running
`swaymsg -t get_outputs` doesn't show non-desktop outputs.
This commit stores the non-desktop outputs into a struct called
`sway_output_non_desktop`, and adds them to a list on `sway_root`
* sway: add non-desktop outputs to json when running `swaymsg -t get_outputs`
* swaymsg: show non-desktop property when pretty printing outputs
* man: Add XWayland information
* ipc: expose mode picture aspect ratio
* swaymsg: show mode picture aspect ratio
* build: simplify protocol paths
No need for arrays here.
* sway/commands/output: Add command for unplugging non-physical outputs
* Improve Japanese translation
* allow pointer_constraints on layer_shell surfaces
* check for NULL
* use seat directly
* Use keyboard_state.focused_surface directly
* input: focus floating container when clicked on border
Fixes #7209.
* input: focus container when scrolling on titlebar
Fixes #6503.
* Fix leaks in criteria_destroy()
* Avoid double free in criteria_destroy()
* Add support for ext-idle-notify-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3753
* input: tweak focus behavior to allow focusing parent containers
Sway focuses the inactive child when focusing split containers. However,
there is currently no way to focus the parent container itself by mouse.
A user must use the keyboard to do so.
This commit maintains the current behavior, but makes it such that a
second click on the split container titlebar (i.e., after its children
are visible) focuses the split container itself.
* Fix keymap being NULL and segfaulting on dev add
Moved `libinput_config` to the callers of
`sway_input_configure_libinput_device` so that we send the event after
the added event.
* Rework session lock keyboard focus handling
When removing outputs, it is possible to end up in a situation where
none of the session lock client's surfaces have keyboard focus,
resulting in it not receiving keyboard events. Track the focused
surface and update it as needed on surface destroy.
* Fix focus tracking when session lock is active
Remove the incorrect attempt to block focus changes when an input grab
is present and replace it with the same logic used for layer_shell-based
screen lockers: restore the focus after changing it.
This fixes a use-after-free of seat->workspace if outputs are destroyed
while a screen lock is enabled.
* container_floating_set_default_size: Store workspace size box on the stack
* Support libinput's 1.21 new dwtp option
Support the new dwtp (disable while trackpointing) option introduced in
libinput 1.21, allowing users to control whether the trackpoint (like
those in Thinkpads, but not only) should be disabled while using the
keyboard/touchpad.
See: https://gitlab.freedesktop.org/libinput/libinput/-/issues/731
* tree: support formatting null titles
Any windows that have never had a title set visually behave closer to
that of an empty title, but are unformattable, as the code bails out
early on a NULL title.
* criteria: allow matching on empty (NULL) titles
* criteria: allow matching for NULL string criteria
* ci: install hwdata
* Use wl_signal_emit_mutable()
This function fixes segfaults when emitting a signal potentially
removes arbitrary listeners.
* Use wlr_damage_ring
wlr_output_damage is to be replaced with wlr_damage_ring, so use that.
* lock: fix crash on output destroy
Closes: https://github.com/swaywm/sway/issues/7120
* container_get_siblings: handle NULL workspace
* ci: checkout wlroots 0.16.0
* workspace_create: Don't allow NULL name
(cherry picked from commit 34933bb84350fe805d82276ea02d5732546e9993)
* output: set damage ring bounds to pixel values
Fixes: https://github.com/swaywm/sway/issues/7254
(cherry picked from commit 85005b52fe5b832e4ea914fa28048b0c5c803769)
* Use shm_open instead of mkstemp
shm_open is more reliable because it does not require
a writeable filesystem folder, unlike mkstemp.
(cherry picked from commit e2bc8866f46701e9c825ad7fa5baac02b2e4898f)
* build: drop wayland-scanner fallback
(cherry picked from commit 366f6ef3d31688631dc453028e108f98a1d7ab57)
* build: unify server & client protocol generation
No need to make a difference here, let's just generate header
files for both.
(cherry picked from commit 5be5a038da8a3789a19945719f2a27233291445d)
* build: drop "server" from target name for protocol code
(cherry picked from commit e5475d9310941ce88ed016ce1515b36e3a440252)
* build: drop intermediate libraries for protocols
(cherry picked from commit af8a5a8918ef42336194fb1077b008a736de7af9)
* root: move the workspace matching code to its own file
This removes the pid_workspace bits from tree/root before it gets
too interesting.
No functional change.
(cherry picked from commit eb5021ef990fb29ff86544aea58d687ad62c757a)
* node: prettify node type names
(cherry picked from commit 1c4b94ae3ca94b972410c80a61404a347af1ee68)
* launcher: track workspaces by node
This removes the need to rename the pid_workspaces when a workspace
is renamed.
It also opens the possibility of tracking other node types. Tracking
containers would allow application to be placed correctly in the
container tree even if the user has moved their focus elsewhere since
it was launched.
(cherry picked from commit 3b49f2782e8faf68766269b9c7390b16e25ae824)
* launcher: use xdga tokens
This reuses wlroots token tracking for workspace matching. It doesn't
export any xdga tokens for clients yet.
(cherry picked from commit bd66f4943da1c96edc3ba49573e27b42b688c543)
* launcher: rename pid_workspace to launcher_ctx
Soon we will match views with more than just a pid.
(cherry picked from commit d75c9f9722389d441fd24bd490c5cf12c4bef39a)
* view: associate launch contexts with views
Views now maintain a reference to a launch context which, as a last
resort, is populated at map time with a context associated with its pid.
This opens the possibility of populating it before map via another
source, e.g. xdga-tokens or configuration.
(cherry picked from commit 864b3a9a18f236f92f1898bb44ab977ceaebfd68)
* launcher: initialize launcher_ctxs once on startup
(cherry picked from commit 66568508c06267445489d655c91c94a34d6d9ffe)
* launcher: fudge the interface a bit
We want to create a context before knowing the pid it will match with.
(cherry picked from commit bdeb9f95651f6c99cc2f4cfb59020ddee202cf36)
* launcher: export xdga tokens and use them for workspace matching
(cherry picked from commit 30ad4dc4a5a41ce7c7aa85096a6e18f374172983)
* launcher: export X startup ids and use them for workspace matching
(cherry picked from commit 28fda4c0d38907fab94dc7d82c9dcf0754748b4e)
* swaybar: Prioritize hotspot events to bar bindings
This is consistent with i3bar's behaviour, and for example, allows binding a
command to button1, while still being able to click on tray icons or other
zones on the bar's status line which may have their own bindings.
E.g., in Sway, without this commit, this config. makes tray icons unclickable:
bar {
# ...
bindsym button1 exec swaynag -m You_clicked_the_tray._Want_some_help?
}
But the same configuration in i3 (with i3-nagbar) keeps tray items clickable.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 53f9dbd424dc173a85c9f4cd30802259d38b1ef4)
* swaybar: Make hotspots block bar release bindings
The previous commit prioritized hotspots before bar bindings for press events,
which matches i3's behaviour. However, since hotspots don't need to do any
processing on release events, those were not handled, and simply fell through
to `bindsym --release` bar bindings (if any).
This is counter-intuitive, and doesn't match i3's behaviour. Instead in case
a hotspot handles the press event, it should also handle the release event,
doing nothing, but blocking the event from triggering a --release bar binding.
E.g., in Sway, without this commit, this config. shows a text on tray clicks:
bar {
# ...
bindsym --release button1 exec swaynag -m I_got_the_release_event.
}
But the same configuration in i3 (with i3-nagbar) doesn't show the text.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 94b69acf0d7b26ee5af2172300cb18473508da76)
* build: drop unused wayland-egl dependency
(cherry picked from commit 37e4a3d6370dc6ba2b0877d588845c06781e880e)
* build: bump version to 1.8-rc1
* Fix build on Debian Stable
(cherry picked from commit dca0bb5749bc16f91ab964fc1b06ebb9a453368f)
* build: fix have_xwayland when xcb-icccm is not found
xcb-icccm is required to build Xwayland support.
Backported from commit d41f11e6bd8cef80f02dda4c66d4a31611aed753.
* build: bump version to 1.8-rc2
* seat: Avoid sending redundant keymaps on reload
When we reload the config, we reset every input device and re-apply
configuration from the config file. This means that the keyboard keymap
is updated at least once during config reload, more if the config file
contains keyboard configuration.
When they keyboard keymap changes and is updated through wlr_seat, the
keymap ends up sent to every keyboard bound in every client, seemingly
multiple times. On an x230 of mine with a keyboard layout set in the
config file, I see 42 keymap events sent to foot on config reload.
Reduce events from keyboard configurations by skipping all but the
currently active keyboard for the seat, and by clearing the active
keyboard during input manager device reset. After this change, I only
see a single just-in-time keymap event.
Fixes: https://github.com/swaywm/sway/issues/6654
* criteria: be lenient on window_role and instance too
* build: bump version to 1.8-rc3
* commands/move: Warp cursor after moving workspace to another output
This makes sway's behavior consistent with i3 when `mouse_warping` is
set to any value besides `none`.
Fixes #7027.
(cherry picked from commit e3c63bf58d0744dfb436f0f38442ce3735e40f47)
* seat: Set keyboard if seat keyboard is NULL
sway sends wl_keyboard.enter on seat focus change and when a keyboard
active on a seat is configured. If all keyboards are removed and a
keyboard is added back without changing the focused client, no new
notify event would be sent despite having keyboard focus. This could
lead to key events without notify, which is a protocol violation.
As a quick fix, when configuring a keyboard on a seat where no keyboard
is currently active, activate the keyboard so that a focused surface
will receive a notify event.
Regressed by: e1b268af98edeb09e570e8855ef64f0719cbafe2
Closes: https://github.com/swaywm/sway/issues/7330
(cherry picked from commit 1ade0ce753dc5f588584f444ce80d27c3b1e4300)
* build: bump version to 1.8-rc4
* swaynag: fix NULL font description
The font description was only set if provided on the CLI. It was
left NULL for the defaults and when reading from the config file.
Closes: https://github.com/swaywm/sway/issues/7186
(cherry picked from commit fd0af78e43f4dd67a404f475c676b25ae38a4b82)
* build: bump version to 1.8
* Removed other README languages
* Fixed build issues
* Removed alpha from render_data struct
* Updated PKGBUILDs and COPR spec
* Update sway/desktop/render.c
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
* Fixed deco_data not being initialized properly
* Replaced wlr_egl_(make|unset)_current with eglMakeCurrent
* Added matrix_projection into fx_renderer
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: Sefa Eyeoglu <contact@scrumplex.net>
Co-authored-by: Simon Ser <contact@emersion.fr>
Co-authored-by: Seth Barberee <seth.barberee@gmail.com>
Co-authored-by: Thomas Hebb <tommyhebb@gmail.com>
Co-authored-by: Nathan Schulte <nmschulte@gmail.com>
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
Co-authored-by: David Rosca <nowrep@gmail.com>
Co-authored-by: David96 <david@hameipe.de>
Co-authored-by: Kenny Levinsen <kl@kl.wtf>
Co-authored-by: Aleksei Bavshin <alebastr89@gmail.com>
Co-authored-by: Kirill Chibisov <contact@kchibisov.com>
Co-authored-by: Tudor Brindus <me@tbrindus.ca>
Co-authored-by: Patrick Hilhorst <git@hilhorst.be>
Co-authored-by: Rouven Czerwinski <rouven@czerwinskis.de>
Co-authored-by: Tobias Bengfort <tobias.bengfort@posteo.de>
Co-authored-by: Ronan Pigott <rpigott@berkeley.edu>
Co-authored-by: Kirill Primak <vyivel@eclair.cafe>
Co-authored-by: Tuomas Yrjölä <mail@yrhki.fi>
Co-authored-by: Kirill Primak <vyivel@posteo.net>
Co-authored-by: Alexander Browne <elcste@users.noreply.github.com>
Co-authored-by: Marco Rubin <20150305+Rubo3@users.noreply.github.com>
Co-authored-by: Muhamed Hobi <woohoomoo2u@gmail.com>
Co-authored-by: Simon Zeni <simon@bl4ckb0ne.ca>
Co-authored-by: Nihal Jere <nihal@nihaljere.xyz>
Co-authored-by: Alexander Gramiak <agrambot@gmail.com>
Co-authored-by: Moon Sungjoon <sumoon@seoulsaram.org>
Co-authored-by: Nicolas Avrutin <nicolas@avrutin.net>
Co-authored-by: ndren <andreien@ctemplar.com>
Co-authored-by: Bill Li <billli11hkb@gmail.com>
Co-authored-by: Leonardo Hernández Hernández <leohdz172@protonmail.com>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Co-authored-by: Manuel Stoeckl <code@mstoeckl.com>
Co-authored-by: Yasin Silavi <59373143+sttatusx@users.noreply.github.com>
Co-authored-by: Daniel De Graaf <code@danieldg.net>
Co-authored-by: kraftwerk28 <kefirchik3@gmail.com>
Co-authored-by: Eskil <67291226+eschillus@users.noreply.github.com>
Co-authored-by: Alice Carroll <git@alice-carroll.pet>
Co-authored-by: Alan <51193876+Pound-Hash@users.noreply.github.com>
Co-authored-by: Victor Makarov <vitja.makarov@gmail.com>
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: -k <slowdive@me.com>
Co-authored-by: Hongyi <61831273+FrozenArcher@users.noreply.github.com>
Co-authored-by: Urey. Xue <urey.s.knowledge@gmail.com>
Co-authored-by: LordRishav <75823494+LordRishav@users.noreply.github.com>
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
Co-authored-by: Florian Franzen <Florian.Franzen@gmail.com>
Co-authored-by: Greg Depoire--Ferrer <greg@gregdf.com>
Co-authored-by: Thomas Jost <schnouki@schnouki.net>
Co-authored-by: Hugo Osvaldo Barrera <hugo@barrera.io>
Co-authored-by: zkldi <ktchidev@gmail.com>
Co-authored-by: llyyr <llyyr.public@gmail.com>
Co-authored-by: Baltazár Radics <baltazar.radics@gmail.com>
Co-authored-by: Martin Michlmayr <tbm@cyrius.com>
Co-authored-by: Filip Szczepański <jazz2rulez@gmail.com>
Co-authored-by: Alex Maese <memaese@hotmail.com>
Co-authored-by: マリウス <marius@xn--gckvb8fzb.com>
Co-authored-by: Andri Yngvason <andri@yngvason.is>
Co-authored-by: ohno418 <yutaro.ono.418@gmail.com>
Co-authored-by: Ferdinand Schober <ferdinand.schober@fau.de>
Co-authored-by: cparm <armelcadetpetit@gmail.com>
Co-authored-by: Yaroslav de la Peña Smirnov <yps@yaroslavps.com>
Co-authored-by: Alexander Orzechowski <orzechowski.alexander@gmail.com>
Co-authored-by: pudiva chip líquida <pudiva@skylittlesystem.org>
Co-authored-by: Puck Meerburg <puck@puckipedia.com>
Co-authored-by: Callum Andrew <calcium@mailbox.org>
Co-authored-by: Ronan Pigott <ronan@rjp.ie>
Co-authored-by: Joan Bruguera <joanbrugueram@gmail.com>
Co-authored-by: nerdopolis <bluescreen_avenger@verizon.net>
Co-authored-by: Ankit Pandey <anpandey@protonmail.com>
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
2023-01-05 09:32:43 +11:00
|
|
|
con->pending.content_x = ob.x + (ob.width - con->pending.content_width) / 2;
|
|
|
|
con->pending.content_y = ob.y + (ob.height - con->pending.content_height) / 2;
|
2019-03-02 18:29:28 +11:00
|
|
|
} else {
|
2021-02-13 09:22:51 +11:00
|
|
|
con->pending.content_x = ws->x + (ws->width - con->pending.content_width) / 2;
|
|
|
|
con->pending.content_y = ws->y + (ws->height - con->pending.content_height) / 2;
|
2019-03-02 18:29:28 +11:00
|
|
|
}
|
2018-07-26 18:36:46 +10:00
|
|
|
|
|
|
|
// If the view's border is B_NONE then these properties are ignored.
|
2021-02-13 09:22:51 +11:00
|
|
|
con->pending.border_top = con->pending.border_bottom = true;
|
|
|
|
con->pending.border_left = con->pending.border_right = true;
|
2018-07-26 18:36:46 +10:00
|
|
|
|
Move view {x,y,width,height} into container struct
This renames/moves the following properties:
* sway_view.{x,y,width,height} ->
sway_container.content_{x,y,width,height}
* This is required to support placeholder containers as they don't
have a view.
* sway_container_state.view_{x,y,width,height} ->
sway_container_state.content_{x,y,width,height}
* To remain consistent with the above.
* sway_container_state.con_{x,y,width,height} ->
sway_container_state.{x,y,width,height}
* The con prefix was there to give it contrast from the view
properties, and is no longer useful.
The function container_set_geometry_from_floating_view has also been
renamed to container_set_geometry_from_content.
2018-11-17 19:32:03 +11:00
|
|
|
container_set_geometry_from_content(con);
|
2018-07-26 18:36:46 +10:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-30 03:26:08 +11:00
|
|
|
void container_floating_set_default_size(struct sway_container *con) {
|
2021-02-13 09:22:51 +11:00
|
|
|
if (!sway_assert(con->pending.workspace, "Expected a container on a workspace")) {
|
2019-03-30 03:15:17 +11:00
|
|
|
return;
|
|
|
|
}
|
2019-03-30 03:26:08 +11:00
|
|
|
|
2019-03-30 03:15:17 +11:00
|
|
|
int min_width, max_width, min_height, max_height;
|
|
|
|
floating_calculate_constraints(&min_width, &max_width,
|
|
|
|
&min_height, &max_height);
|
rebase: Sway 1.8 (#78)
* build: bump wlroots dependency to 0.16.0
* swaymsg: replace if with switch in pretty_print
* swaymsg: add GET_TREE pretty-printing
* swaybar: fix errno handling in status_handle_readable
If getline fails once, it was not reset before the next getline
call. errno is only overwritten by getline on error.
* Add cairo_image_surface_create error handling
cairo_image_surface_create can fail, e.g. when running out of
memory or when the size is too big. Avoid crashing in this case.
Closes: https://github.com/swaywm/sway/issues/6531
* build: bump version to 1.8-dev
Historically we've been sticking with the last release number in
the master branch. However that's a bit confusing, people can't
easily figure out whether they're using a release or a work-in-progress
snapshot. Only the commit hash appended to the version number may
help, but that's not very explicit and disappears when using a
tarball.
We could bump the version in master to the next release number.
However during the RC cycle there would be a downgrade from 1.8 to
1.8-rc1. Also it would be hard to tell the difference between a
stable release and an old snapshot.
This patch introduces a new pre-release identifier, "dev". It's
alphabetically before "rc" so it should be correctly sorted by
semver comparisons. "dev" is upgraded to "rc" (and then to stable)
when doing a release. The master branch always uses a "dev"
version, only release branches use "rc" or stable versions.
* [IPC] Add repeat delay/rate info to keyboard
Closes #6735
wlroots already has the info in the struct so let's access it and print it out.
* input/seat: unset has_focus when focus_stack becomes empty
We currently track the focus of a seat in two ways: we use a list called
focus_stack to track the order in which nodes have been focused, with
the first node representing what's currently focused, and we use a
variable called has_focus to indicate whether anything has focus--i.e.
whether we should actually treat that first node as focused at any given
time.
In a number of places, we treat has_focus as implying that a focused
node exists. If it's true, we attempt to dereference the return value of
seat_get_focus(), our helper function for getting the first node in
focus_list, with no further checks. But this isn't quite correct with
the current implementation of seat_get_focus(): not only does it return
NULL when has_focus is false, it also returns NULL when focus_stack
contains no items.
In most cases, focus_stack never becomes empty and so this doesn't
matter at all. Since focus_stack stores a history of focused nodes, we
rarely remove nodes from it. The exception to this is when a node itself
goes away. In that case, we call seat_node_destroy() to remove it from
focus_stack and free it. But we don't unset has_focus if we've removed
the final node! This lets us get into a state where has_focus is true
but seat_get_focus() returns NULL, leading to a segfault when we try to
dereference it.
Fix the issue both by updating has_focus in seat_node_destroy() and by
adding an assertion in seat_get_focus() that ensures focus_stack and
has_focus are in sync, which will make it easier to track down similar
issues in the future.
Fixes #6395.
[1] There's some discussion in #1585 from when this was implemented
about whether has_focus is actually necessary; it's possible we could
remove it entirely, but for the moment this is the architecture we have.
* swaybar: fix tray_padding vs min-height re: scale
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
* swaybar: fix tray item icon scaling, positioning
* container: Fix crash when view unmaps + maps quickly
Followup on 4e4898e90f.
If a view quickly maps and unmaps repeatedly, there will be multiple
destroyed containers with same view in a single transaction. Each of
these containers will then try to destroy this view, resulting in use
after free.
The container should only destroy the view if the view still belongs
to the container.
Simple reproducer: couple XMapWindow + XUnmapWindow in a loop followed
by XDestroyWindow.
See #6605
* commands/move: Fix crash when pos_y is omitted
Fixes #6737
* Destroy sub-surfaces with parent layer-shell surface
Closes: https://github.com/swaywm/sway/issues/6337
* Add safety assert in parse_movement_unit
Let's add this just in case a caller passes argc == 0.
References: https://github.com/swaywm/sway/issues/6737#issuecomment-1008082540
* meson: check: false on run_command
Future meson releases will change the default and warns when the
implicit default is used, breaking builds.
Explicitly set check: false to maintain behavior and silence warnings.
* Print deprecation notice when running SUID
SUID privilege drop is needed for the "builtin"-backend of libseat,
which copied our old "direct" backend behavior for the sake of
compatibility and ease of transition.
libseat now has a better alternative in the form of seatd-launch. It
uses the normal seatd daemon and libseat backend and takes care of SUID
for us.
Add a soft deprecation warning to highlight our future intent of
removing this code. The deprecation cycle is needed to avoid surprises
when sway no longer drops privileges.
* xdg-shell: use toplevel geometry to adjust the popup box
`popup_unconstrain` uses view coordinates to init the output box for
popups. However wlroots expects the box to be set in a toplevel surface
coordinate system, which is not always equal to view. The difference
between those is a window geometry set via xdg-shell.
GTK4 reserves some space for client-side decoration and thus has a
window with top left corner not matching to (0, 0) of a surface. The box
calculated without taking that into account was slightly shifted
compared to the actual output and allowed to position part of the popup
off screen.
* build: fix building with basu
02b412a introduced the use of list for sdbus deps, however
it was assuming that all packages which were in a list has a version
higher than 239. That is true for libsystemd and libelogind, since they
use the same versions, however basu is using version numbers which are
way lower than what libsystemd/libelogind are using, so basu only build
is failing.
* Upgrade for wlroots surface refactoring
See [1] for details.
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3412
* commands/focus: drop trailing whitespace
* input/cursor: count pointer gestures as idle activity
Fixes https://github.com/swaywm/sway/issues/6765.
* input/cursor: treat swipe begin as idle activity too
Accidentally overlooked in fd53f80.
* treat fullscreen windows as 'tiled' for commands/focus
* transaction: destroying nodes aren't hidden
Commit 37d7bc69986f ("transaction: Only wait for ack from visible
views") introduced a check which uses view_is_visible() to check if a view
is still visible on the screen. However view_is_visible() will early
return in case the node is in the destroying state. This is incorrect
for transactions, since a destroying view which is visible will trigger
configure events for other clients. This bug was visible when repeatedly
opening and closing two views side by side, since we ignore the
destroying node we get a frame where the still open view is shown with
the old configure values and the rest is the desktop background. The
next frame is than correct again.
Fix this by considering destroying views as visible, we correctly wait
for them and send the configure events to other views in time, fixing
the background flicker.
Fixes #6473
* build: execute wlroots subproject before finding deps
wlroots often requires dependencies more recent than Sway's.
Executing the wlroots subproject first will give Meson a chance to
find these newer dependencies, possibly via subprojects.
The subproject will override the "wlroots" dependency when executed,
so we don't need to use get_variable anymore.
References: https://github.com/swaywm/sway/pull/6498#issuecomment-1001746017
* tray: do not render passive items
https://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/StatusNotifierItem/#org.freedesktop.statusnotifieritem.status
* cmd/swap: error on swapping a container with itself
* input/cursor: pass through pointer hold gestures
This just follows swaywm/wlroots#3047, so `wl_pointer_gestures_v1`
clients can be notified of these events.
* swaynag: remove buffer destruction condition
An address of a variable can never be NULL, so checking it doesn't make
sense; and `destroy_buffer()` can operate on already destroyed buffers
anyway.
Fixes #6780
* Use bools for CLI flags
* xwayland: listen to `request_activate` event
When REAPER submenu is closed `XCB_CLIENT_MESSAGE` with type
`NET_ACTIVE_WINDOW` is sent to set focus to parent menu.
Closes: https://github.com/swaywm/sway/issues/6324
* chore: chase wlr_output_layout_get_box() update
https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3439
* Chase wlroots xdg-shell refactor
* Minor update to focus_on_window_activation
Removed xwayland limitation since wayland clients are supported via xdg-activation.
* Translated README into Italian
* readme: add link to Italian translation
* readme: sort language list alphabetically
* readme: use relative links for translations
* xdg-shell: use wlr_xdg_toplevel in sway_view
Improved type safety.
Closes: https://github.com/swaywm/sway/issues/6813
* xdg-shell: use wlr_xdg_popup in sway_xdg_popup
Improved type safety.
* Fix snprintf compiler warning
* Remove all sprintf calls
Replace them with snprintf, which ensures buffer overflows won't
happen.
* sway/commands: add missing wlr_keyboard interface include in xkb_switch_layout
* sway/input: use wlr_input_device from input device base
* Remove some erroneous apostrophes in comments
* Don't enter seatop_move_floating when fullscreen
Currently, a floating window that's been fullscreened can send us
xdg_toplevel::move, and we'll enter seatop_move_floating, which lets us
drag the surface around while it's fullscreen. We don't want
this--fullscreen surfaces should always be aligned to the screen--so add
the same check that seatop_default already does when entering this mode.
Tested with Weston's weston-fullscreen demo, which sends a move request
if you click anywhere on its surface.
* swaynag: die on all allocation failures
* sway/input: don't pass possibly invalid modifiers pointer
active_keyboard may be NULL, in which case an invalid pointer could be
passed to wlr_input_method_keyboard_grab_v2_send_modifiers. This
procedure call is unnecessary since wlroots commit 372a52ec "input
method: send modifiers in set_keyboard", so the call can simply be
removed.
Fixes #6836.
* sway/input: destroy sway_switch properly
Fix: #6861
Added seat_device_destroy function to seat_device_destroy function.
* commands/focus: fix segfault when no container is already focused.
Fixes #6690.
* Remove WLR_SWITCH_STATE_TOGGLE usage
Ref [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/commit/4792446ee8f50104bd207d9ccd8558a7e4eb4514
* Replace pcre with pcre2
Closes: https://github.com/swaywm/sway/issues/6838
* swaybar: remove swaybar_output.input_region
No need to keep the region around, we can immediately destroy it
after the wl_surface.set_input_region request.
* swaybar: set opaque region
When the background color is fully opaque, set the surface's opaque
region to the whole surface.
* Updating criteria checking with PCRE2
* swaynag: allocate button_details with details
They are used together, so it doesn't make sense to allocate them
separately.
* swaynag: statically allocate button_close, and move declaration
Every swaynag has a close button, so it doesn't make sense to
allocate it dynamically. The declaration is moved later to when
it is actually needed.
* swaynag: remove unnecessary zero of swaynag struct
Global variables are initialized to 0.
* swaynag: remove redundant status variables in main
Instead, we just use `status` for all failures.
* remove unnecessary strlen call
* sway/input/cursor: take device mm size from wlr_tablet
* sway/input/seat: take output name from specialized input device
* sway/input: follow up wlroots input device events renaming
* sway/input: fix bad position of wlr_drag
* sway/input: wlr_seat_keyboard() now takes wlr_keyboard
* bash-completion: localize variables
* sway/main: move constants off the stack
This makes stack traces from gdb slightly easier to read.
* Fix farsi label
* Avoid format-truncation warning
The existing code gives this error when compiled with GCC 12:
../sway/server.c: In function ‘server_init’:
../sway/server.c:217:75: error: ‘%d’ directive output may be truncated writing between 1 and 11 bytes into a region of size 8 [-Werror=format-truncation=]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~
../sway/server.c:217:66: note: directive argument in the range [-2147483647, 32]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~
../sway/server.c:217:17: note: ‘snprintf’ output between 10 and 20 bytes into a destination of size 16
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Because i is never negative, this is a false positive, but it is easy to
change i to unsigned to silence the error.
* Shuffle variables to satisfy -Werror=restrict
This also fixes an invalid strlen invocation on uninitialized memory.
* layer_shell: keep output non-NULL wherever possible
Our layer shell implementation assigns every layer surface to an output
on creation. It tracks this output using the output field on the
underlying wlr_layer_surface_v1 structure. As such, much of the existing
code assumes that output is always non-NULL and omits NULL checks
accordingly.
However, there are currently two cases where we destroy a
sway_layer_surface and output is NULL. The first is when we can't find
an output to assign the surface to and destroy it immediately after
creation. The second is when we destroy a surface in response to its
output getting destroyed, as we set output to NULL in
handle_output_destroy() before we call wlr_layer_surface_v1_destroy(),
which is what calls the appropriate unmap and destroy callbacks.
The former case doesn't cause any problems, since we haven't even
allocated a sway_layer_surface at that point or registered any
callbacks. The latter case, however, currently triggers a crash (#6120)
if a popup is visible, since our popup_handle_unmap() implementation
can't handle a NULL output.
To fix this issue, keep output set until right before we free the
sway_layer_surface. All we need to do is remove some of the cleanup
logic from handle_output_destroy(), since as of commit c9060bcc12d0
("layer-shell: replace close() with destroy()") that same logic is
guaranteed to be happen later when wlroots calls handle_destroy() as
part of wlr_layer_surface_v1_destroy().
This lets us remove some NULL checks from other unmap/destroy callbacks,
which is nice. We also don't need to check that the wlr_output points to
a valid sway_output anymore, since we unset that pointer after disabling
the output as of commit a0bbe67076b8 ("Address emersions comments on
output re-enabling") Just to be safe, I've added assertions that the
wlr_output is non-NULL wherever we use it.
Fixes #6120.
* Chase wlroots X11 hints update
* Add Swedish README
* Support cursor capture in grimshot
Refactor argument parser
Bring back `sh` compatibility
Default to NOTIFY=no
* Update grimshot.1.scd
Fixed typo. The object is **files**, which is plural. **image** modifies files; it's not countable.
* xkb_switch_layout: fix relative layout switches
Fixes #6011
* Implement ext-session-lock-v1
* Avoid inspecting a NULL view in seat_set_focus
Fixes #6968
* swaynag: do error checking and rename read_from_stdin
read_from_stdin not only read from stdin, but trimming trailing
newlines, so rename it to reflect this.
* swaynag: improve robustness when loading config
* swaynag: combine consecutive declaration/assignments
* config: Remove unused mouse binding structure
Mouse bindings are handled alongside normal bindings. Remove the unused
separate data structure definition to avoid confusion.
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
* Replace strncpy with memcpy
strncpy is useless here, is dangerous because it doesn't guarantee
that the string is NUL-terminated and causes the following warning:
../sway/criteria.c: In function ‘criteria_parse’:
../sway/criteria.c:712:25: error: ‘strncpy’ destination unchanged after copying no bytes [-Werror=stringop-truncation]
712 | strncpy(value, valuestart, head - valuestart);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Add descriptions for `stacking` and `tabbed` layouts
Resolves #5918
* man: Fix trailing spaces
* server: request xdg-shell v2
Wlroots does not yet support the newer xdg-shell versions and now
requires the compositor to set the supported xdg-shell version during
creation. Set this to v2 for sway as well.
Fixes https://github.com/swaywm/sway/issues/7001
* realtime: request SCHED_RR using CAP_SYS_NICE
Try to gain SCHED_RR (round-robin) realtime scheduling privileges before
starting the server. This requires CAP_SYS_NICE on Linux systems.
We additionally register a pthread_atfork callback which resets the
scheduling class back to SCHED_OTHER (the Linux system default).
Due to CAP_SYS_NICE, setting RLIMIT_RTPRIO has no effect on the process
as documented within man 7 sched (from Linux):
Privileged (CAP_SYS_NICE) threads ignore the RLIMIT_RTPRIO limit;
as with older kernels, they can make arbitrary changes to
scheduling policy and priority. See getrlimit(2) for further
information on RLIMIT_RTPRIO
Note that this requires the sway distribution packagers to set the
CAP_SYS_NICE capability on the sway binary.
Supersedes #6992
* ext-session-lock: disable direct scan-out when locked
* Polish the language in README.zh-CN.md & sync with English one
Co-Authored-By: Urey. Xue <urey.s.knowledge@gmail.com>
* De-duplicate IPC output descriptions
* Handle NULL output make/model/serial
* chore: chase wlroots xdg-shell update
* xdg-shell: schedule a configure on maximize request
This commit reverts 03879290dbee26127f6867ef60bc2a7f9a6c8c5f and
fc84bcb7fb0ffa29b1f9bed287762241a3473803.
* Add a Hindi (हिन्दी) translation to the README
Hindi is one of the most prominent languages of the Indian Subcontinent.
This commit adds the translation of the README into the Hindi language.
Some of the words are still written in English because there wasn't an
appropriate technical term of the word in the language.
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
* sway: add bindgesture command
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
* build: link with -pthread
Fixes the following FreeBSD error:
ld: error: undefined symbol: pthread_getschedparam
>>> referenced by realtime.c:25 (../sway/realtime.c:25)
>>> sway/sway.p/realtime.c.o:(set_rr_scheduling)
Fixes: a3a82efbf6b5 ("realtime: request SCHED_RR using CAP_SYS_NICE")
* ipc: remove chatty debug log messages
These aren't particularly useful, and clobber the debug logs.
* Refuse to start when SUID is detected
This ensures that those surprised by the deprecation of SUID operation
receive an error rather than accidentally having sway run as root.
This detection will be removed in a future release.
* swaynag: move close_button up to fix SIGSEGV
When swaynag_parse_options encounters '--dismiss-button' (or its
shorthand '-s'), it sets the text of the first button in the
swaynag.buttons list, which is expected to exist and to be the dismiss
button, to the one passed by the user.
Commit 4780afb68b4ee2cdf0e4925f40cf885819f8a74a ("swaynag: statically
allocate button_close, and move declaration") moved the list
initialization to after swaynag_parse_options is called which made that
code fail.
For example, the command 'swaynag --dismiss-button Dismiss' crashes and
'swaynag --message Message --button Yes "" --dismiss-button Dismiss'
shows the wrong buttons.
Move it back to before swaynag_parse_options is called.
* config/output: use wlr_output_commit_state
This makes the code more robust because we don't potentially leave
bad state in wlr_output.pending behind anymore. This also fixes a
bug.
Closes: https://github.com/swaywm/sway/issues/7043
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3610
* Allocate enough space for `cmd_results->error`
* Remove access to wlr_input_device union
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3626
Closes: https://github.com/swaywm/sway/issues/7077
* Rename dpms output command to power
The "dpms" command refers to VESA Display Power Management
Signaling, a deprecated standard. It's superseded by VESA DPM.
Instead of tying out command name to a particular standard, use the
neutral term "power".
* Strip quotes in bindsym --input-device=...
If the input device is quoted, which is common when using variables in the
config file, those quotes must be ignored here, or the input device will be
ignored.
Fixes #7029.
* Avoid unecessary string copy
* Reject font values that are invalid for pango
Use pango to parse font configuration early, and reject the command as
invalid if the value is invalid for pango. Since we're already parsing
the font into a `PangoFontDescription`, keep that instance around and
avoid re-parsing the font each time we render text.
Fixes: https://github.com/swaywm/sway/issues/6805
* Reuse parsed PangoFontDescription
Avoids parsing the configured font each time text is rendered.
* ipc: add "power" to output reply
* config.in: switch to `output power`
* Remove internal references to DPMS
While at it, use an int for the config field, just like we do for
all other fields.
* fix: remove redundant empty statement in main.c
This semi-colon looks like a typo. Luckily, it has no effect on the code as it's treated as an empty statement leading the switch case.
Really straightforward nitpick change, was just something I was confused by when reading over the code.
* input: chase delta_discrete semantics change
* swaymsg: fix floating_nodes being ignored
Fix floating_nodes being ignored in pretty_print_tree.
* ipc: make get_deco_rect check config->hide_lone_tab
Without this, the `IPC_GET_TREE` ipc call would return false information
about the container's `deco_rect` and `rect` properties if
`hide_edge_borders --i3` was in effect.
* grimshot: fix tilde expansion within quotes
* Enable single-pixel-buffer-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3428
* sway-output.5: improve display of parameter
Since "width" and "height" are separate parameters, show them as such.
* man: sway(5) move fixes
* ipc: drop WLR_OUTPUT_ADAPTIVE_SYNC_UNKNOWN case
This has been removed from wlroots.
* config/output: test adaptive sync
Required for [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3637
* Fix crash in xdg_activation_v1.c
wlr_xdg_surface_from_wlr_surface() can return a NULL pointer, so check for NULL before dereferencing it.
* sway: Add non-desktop-output type
Currently, when encountering a non-desktop display, sway offers the
output for leasing and returns without storing it in a sway specific
output type like `struct sway_output`. Additionally, running
`swaymsg -t get_outputs` doesn't show non-desktop outputs.
This commit stores the non-desktop outputs into a struct called
`sway_output_non_desktop`, and adds them to a list on `sway_root`
* sway: add non-desktop outputs to json when running `swaymsg -t get_outputs`
* swaymsg: show non-desktop property when pretty printing outputs
* man: Add XWayland information
* ipc: expose mode picture aspect ratio
* swaymsg: show mode picture aspect ratio
* build: simplify protocol paths
No need for arrays here.
* sway/commands/output: Add command for unplugging non-physical outputs
* Improve Japanese translation
* allow pointer_constraints on layer_shell surfaces
* check for NULL
* use seat directly
* Use keyboard_state.focused_surface directly
* input: focus floating container when clicked on border
Fixes #7209.
* input: focus container when scrolling on titlebar
Fixes #6503.
* Fix leaks in criteria_destroy()
* Avoid double free in criteria_destroy()
* Add support for ext-idle-notify-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3753
* input: tweak focus behavior to allow focusing parent containers
Sway focuses the inactive child when focusing split containers. However,
there is currently no way to focus the parent container itself by mouse.
A user must use the keyboard to do so.
This commit maintains the current behavior, but makes it such that a
second click on the split container titlebar (i.e., after its children
are visible) focuses the split container itself.
* Fix keymap being NULL and segfaulting on dev add
Moved `libinput_config` to the callers of
`sway_input_configure_libinput_device` so that we send the event after
the added event.
* Rework session lock keyboard focus handling
When removing outputs, it is possible to end up in a situation where
none of the session lock client's surfaces have keyboard focus,
resulting in it not receiving keyboard events. Track the focused
surface and update it as needed on surface destroy.
* Fix focus tracking when session lock is active
Remove the incorrect attempt to block focus changes when an input grab
is present and replace it with the same logic used for layer_shell-based
screen lockers: restore the focus after changing it.
This fixes a use-after-free of seat->workspace if outputs are destroyed
while a screen lock is enabled.
* container_floating_set_default_size: Store workspace size box on the stack
* Support libinput's 1.21 new dwtp option
Support the new dwtp (disable while trackpointing) option introduced in
libinput 1.21, allowing users to control whether the trackpoint (like
those in Thinkpads, but not only) should be disabled while using the
keyboard/touchpad.
See: https://gitlab.freedesktop.org/libinput/libinput/-/issues/731
* tree: support formatting null titles
Any windows that have never had a title set visually behave closer to
that of an empty title, but are unformattable, as the code bails out
early on a NULL title.
* criteria: allow matching on empty (NULL) titles
* criteria: allow matching for NULL string criteria
* ci: install hwdata
* Use wl_signal_emit_mutable()
This function fixes segfaults when emitting a signal potentially
removes arbitrary listeners.
* Use wlr_damage_ring
wlr_output_damage is to be replaced with wlr_damage_ring, so use that.
* lock: fix crash on output destroy
Closes: https://github.com/swaywm/sway/issues/7120
* container_get_siblings: handle NULL workspace
* ci: checkout wlroots 0.16.0
* workspace_create: Don't allow NULL name
(cherry picked from commit 34933bb84350fe805d82276ea02d5732546e9993)
* output: set damage ring bounds to pixel values
Fixes: https://github.com/swaywm/sway/issues/7254
(cherry picked from commit 85005b52fe5b832e4ea914fa28048b0c5c803769)
* Use shm_open instead of mkstemp
shm_open is more reliable because it does not require
a writeable filesystem folder, unlike mkstemp.
(cherry picked from commit e2bc8866f46701e9c825ad7fa5baac02b2e4898f)
* build: drop wayland-scanner fallback
(cherry picked from commit 366f6ef3d31688631dc453028e108f98a1d7ab57)
* build: unify server & client protocol generation
No need to make a difference here, let's just generate header
files for both.
(cherry picked from commit 5be5a038da8a3789a19945719f2a27233291445d)
* build: drop "server" from target name for protocol code
(cherry picked from commit e5475d9310941ce88ed016ce1515b36e3a440252)
* build: drop intermediate libraries for protocols
(cherry picked from commit af8a5a8918ef42336194fb1077b008a736de7af9)
* root: move the workspace matching code to its own file
This removes the pid_workspace bits from tree/root before it gets
too interesting.
No functional change.
(cherry picked from commit eb5021ef990fb29ff86544aea58d687ad62c757a)
* node: prettify node type names
(cherry picked from commit 1c4b94ae3ca94b972410c80a61404a347af1ee68)
* launcher: track workspaces by node
This removes the need to rename the pid_workspaces when a workspace
is renamed.
It also opens the possibility of tracking other node types. Tracking
containers would allow application to be placed correctly in the
container tree even if the user has moved their focus elsewhere since
it was launched.
(cherry picked from commit 3b49f2782e8faf68766269b9c7390b16e25ae824)
* launcher: use xdga tokens
This reuses wlroots token tracking for workspace matching. It doesn't
export any xdga tokens for clients yet.
(cherry picked from commit bd66f4943da1c96edc3ba49573e27b42b688c543)
* launcher: rename pid_workspace to launcher_ctx
Soon we will match views with more than just a pid.
(cherry picked from commit d75c9f9722389d441fd24bd490c5cf12c4bef39a)
* view: associate launch contexts with views
Views now maintain a reference to a launch context which, as a last
resort, is populated at map time with a context associated with its pid.
This opens the possibility of populating it before map via another
source, e.g. xdga-tokens or configuration.
(cherry picked from commit 864b3a9a18f236f92f1898bb44ab977ceaebfd68)
* launcher: initialize launcher_ctxs once on startup
(cherry picked from commit 66568508c06267445489d655c91c94a34d6d9ffe)
* launcher: fudge the interface a bit
We want to create a context before knowing the pid it will match with.
(cherry picked from commit bdeb9f95651f6c99cc2f4cfb59020ddee202cf36)
* launcher: export xdga tokens and use them for workspace matching
(cherry picked from commit 30ad4dc4a5a41ce7c7aa85096a6e18f374172983)
* launcher: export X startup ids and use them for workspace matching
(cherry picked from commit 28fda4c0d38907fab94dc7d82c9dcf0754748b4e)
* swaybar: Prioritize hotspot events to bar bindings
This is consistent with i3bar's behaviour, and for example, allows binding a
command to button1, while still being able to click on tray icons or other
zones on the bar's status line which may have their own bindings.
E.g., in Sway, without this commit, this config. makes tray icons unclickable:
bar {
# ...
bindsym button1 exec swaynag -m You_clicked_the_tray._Want_some_help?
}
But the same configuration in i3 (with i3-nagbar) keeps tray items clickable.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 53f9dbd424dc173a85c9f4cd30802259d38b1ef4)
* swaybar: Make hotspots block bar release bindings
The previous commit prioritized hotspots before bar bindings for press events,
which matches i3's behaviour. However, since hotspots don't need to do any
processing on release events, those were not handled, and simply fell through
to `bindsym --release` bar bindings (if any).
This is counter-intuitive, and doesn't match i3's behaviour. Instead in case
a hotspot handles the press event, it should also handle the release event,
doing nothing, but blocking the event from triggering a --release bar binding.
E.g., in Sway, without this commit, this config. shows a text on tray clicks:
bar {
# ...
bindsym --release button1 exec swaynag -m I_got_the_release_event.
}
But the same configuration in i3 (with i3-nagbar) doesn't show the text.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 94b69acf0d7b26ee5af2172300cb18473508da76)
* build: drop unused wayland-egl dependency
(cherry picked from commit 37e4a3d6370dc6ba2b0877d588845c06781e880e)
* build: bump version to 1.8-rc1
* Fix build on Debian Stable
(cherry picked from commit dca0bb5749bc16f91ab964fc1b06ebb9a453368f)
* build: fix have_xwayland when xcb-icccm is not found
xcb-icccm is required to build Xwayland support.
Backported from commit d41f11e6bd8cef80f02dda4c66d4a31611aed753.
* build: bump version to 1.8-rc2
* seat: Avoid sending redundant keymaps on reload
When we reload the config, we reset every input device and re-apply
configuration from the config file. This means that the keyboard keymap
is updated at least once during config reload, more if the config file
contains keyboard configuration.
When they keyboard keymap changes and is updated through wlr_seat, the
keymap ends up sent to every keyboard bound in every client, seemingly
multiple times. On an x230 of mine with a keyboard layout set in the
config file, I see 42 keymap events sent to foot on config reload.
Reduce events from keyboard configurations by skipping all but the
currently active keyboard for the seat, and by clearing the active
keyboard during input manager device reset. After this change, I only
see a single just-in-time keymap event.
Fixes: https://github.com/swaywm/sway/issues/6654
* criteria: be lenient on window_role and instance too
* build: bump version to 1.8-rc3
* commands/move: Warp cursor after moving workspace to another output
This makes sway's behavior consistent with i3 when `mouse_warping` is
set to any value besides `none`.
Fixes #7027.
(cherry picked from commit e3c63bf58d0744dfb436f0f38442ce3735e40f47)
* seat: Set keyboard if seat keyboard is NULL
sway sends wl_keyboard.enter on seat focus change and when a keyboard
active on a seat is configured. If all keyboards are removed and a
keyboard is added back without changing the focused client, no new
notify event would be sent despite having keyboard focus. This could
lead to key events without notify, which is a protocol violation.
As a quick fix, when configuring a keyboard on a seat where no keyboard
is currently active, activate the keyboard so that a focused surface
will receive a notify event.
Regressed by: e1b268af98edeb09e570e8855ef64f0719cbafe2
Closes: https://github.com/swaywm/sway/issues/7330
(cherry picked from commit 1ade0ce753dc5f588584f444ce80d27c3b1e4300)
* build: bump version to 1.8-rc4
* swaynag: fix NULL font description
The font description was only set if provided on the CLI. It was
left NULL for the defaults and when reading from the config file.
Closes: https://github.com/swaywm/sway/issues/7186
(cherry picked from commit fd0af78e43f4dd67a404f475c676b25ae38a4b82)
* build: bump version to 1.8
* Removed other README languages
* Fixed build issues
* Removed alpha from render_data struct
* Updated PKGBUILDs and COPR spec
* Update sway/desktop/render.c
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
* Fixed deco_data not being initialized properly
* Replaced wlr_egl_(make|unset)_current with eglMakeCurrent
* Added matrix_projection into fx_renderer
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: Sefa Eyeoglu <contact@scrumplex.net>
Co-authored-by: Simon Ser <contact@emersion.fr>
Co-authored-by: Seth Barberee <seth.barberee@gmail.com>
Co-authored-by: Thomas Hebb <tommyhebb@gmail.com>
Co-authored-by: Nathan Schulte <nmschulte@gmail.com>
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
Co-authored-by: David Rosca <nowrep@gmail.com>
Co-authored-by: David96 <david@hameipe.de>
Co-authored-by: Kenny Levinsen <kl@kl.wtf>
Co-authored-by: Aleksei Bavshin <alebastr89@gmail.com>
Co-authored-by: Kirill Chibisov <contact@kchibisov.com>
Co-authored-by: Tudor Brindus <me@tbrindus.ca>
Co-authored-by: Patrick Hilhorst <git@hilhorst.be>
Co-authored-by: Rouven Czerwinski <rouven@czerwinskis.de>
Co-authored-by: Tobias Bengfort <tobias.bengfort@posteo.de>
Co-authored-by: Ronan Pigott <rpigott@berkeley.edu>
Co-authored-by: Kirill Primak <vyivel@eclair.cafe>
Co-authored-by: Tuomas Yrjölä <mail@yrhki.fi>
Co-authored-by: Kirill Primak <vyivel@posteo.net>
Co-authored-by: Alexander Browne <elcste@users.noreply.github.com>
Co-authored-by: Marco Rubin <20150305+Rubo3@users.noreply.github.com>
Co-authored-by: Muhamed Hobi <woohoomoo2u@gmail.com>
Co-authored-by: Simon Zeni <simon@bl4ckb0ne.ca>
Co-authored-by: Nihal Jere <nihal@nihaljere.xyz>
Co-authored-by: Alexander Gramiak <agrambot@gmail.com>
Co-authored-by: Moon Sungjoon <sumoon@seoulsaram.org>
Co-authored-by: Nicolas Avrutin <nicolas@avrutin.net>
Co-authored-by: ndren <andreien@ctemplar.com>
Co-authored-by: Bill Li <billli11hkb@gmail.com>
Co-authored-by: Leonardo Hernández Hernández <leohdz172@protonmail.com>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Co-authored-by: Manuel Stoeckl <code@mstoeckl.com>
Co-authored-by: Yasin Silavi <59373143+sttatusx@users.noreply.github.com>
Co-authored-by: Daniel De Graaf <code@danieldg.net>
Co-authored-by: kraftwerk28 <kefirchik3@gmail.com>
Co-authored-by: Eskil <67291226+eschillus@users.noreply.github.com>
Co-authored-by: Alice Carroll <git@alice-carroll.pet>
Co-authored-by: Alan <51193876+Pound-Hash@users.noreply.github.com>
Co-authored-by: Victor Makarov <vitja.makarov@gmail.com>
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: -k <slowdive@me.com>
Co-authored-by: Hongyi <61831273+FrozenArcher@users.noreply.github.com>
Co-authored-by: Urey. Xue <urey.s.knowledge@gmail.com>
Co-authored-by: LordRishav <75823494+LordRishav@users.noreply.github.com>
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
Co-authored-by: Florian Franzen <Florian.Franzen@gmail.com>
Co-authored-by: Greg Depoire--Ferrer <greg@gregdf.com>
Co-authored-by: Thomas Jost <schnouki@schnouki.net>
Co-authored-by: Hugo Osvaldo Barrera <hugo@barrera.io>
Co-authored-by: zkldi <ktchidev@gmail.com>
Co-authored-by: llyyr <llyyr.public@gmail.com>
Co-authored-by: Baltazár Radics <baltazar.radics@gmail.com>
Co-authored-by: Martin Michlmayr <tbm@cyrius.com>
Co-authored-by: Filip Szczepański <jazz2rulez@gmail.com>
Co-authored-by: Alex Maese <memaese@hotmail.com>
Co-authored-by: マリウス <marius@xn--gckvb8fzb.com>
Co-authored-by: Andri Yngvason <andri@yngvason.is>
Co-authored-by: ohno418 <yutaro.ono.418@gmail.com>
Co-authored-by: Ferdinand Schober <ferdinand.schober@fau.de>
Co-authored-by: cparm <armelcadetpetit@gmail.com>
Co-authored-by: Yaroslav de la Peña Smirnov <yps@yaroslavps.com>
Co-authored-by: Alexander Orzechowski <orzechowski.alexander@gmail.com>
Co-authored-by: pudiva chip líquida <pudiva@skylittlesystem.org>
Co-authored-by: Puck Meerburg <puck@puckipedia.com>
Co-authored-by: Callum Andrew <calcium@mailbox.org>
Co-authored-by: Ronan Pigott <ronan@rjp.ie>
Co-authored-by: Joan Bruguera <joanbrugueram@gmail.com>
Co-authored-by: nerdopolis <bluescreen_avenger@verizon.net>
Co-authored-by: Ankit Pandey <anpandey@protonmail.com>
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
2023-01-05 09:32:43 +11:00
|
|
|
struct wlr_box box;
|
|
|
|
workspace_get_box(con->pending.workspace, &box);
|
2019-03-30 03:26:08 +11:00
|
|
|
|
rebase: Sway 1.8 (#78)
* build: bump wlroots dependency to 0.16.0
* swaymsg: replace if with switch in pretty_print
* swaymsg: add GET_TREE pretty-printing
* swaybar: fix errno handling in status_handle_readable
If getline fails once, it was not reset before the next getline
call. errno is only overwritten by getline on error.
* Add cairo_image_surface_create error handling
cairo_image_surface_create can fail, e.g. when running out of
memory or when the size is too big. Avoid crashing in this case.
Closes: https://github.com/swaywm/sway/issues/6531
* build: bump version to 1.8-dev
Historically we've been sticking with the last release number in
the master branch. However that's a bit confusing, people can't
easily figure out whether they're using a release or a work-in-progress
snapshot. Only the commit hash appended to the version number may
help, but that's not very explicit and disappears when using a
tarball.
We could bump the version in master to the next release number.
However during the RC cycle there would be a downgrade from 1.8 to
1.8-rc1. Also it would be hard to tell the difference between a
stable release and an old snapshot.
This patch introduces a new pre-release identifier, "dev". It's
alphabetically before "rc" so it should be correctly sorted by
semver comparisons. "dev" is upgraded to "rc" (and then to stable)
when doing a release. The master branch always uses a "dev"
version, only release branches use "rc" or stable versions.
* [IPC] Add repeat delay/rate info to keyboard
Closes #6735
wlroots already has the info in the struct so let's access it and print it out.
* input/seat: unset has_focus when focus_stack becomes empty
We currently track the focus of a seat in two ways: we use a list called
focus_stack to track the order in which nodes have been focused, with
the first node representing what's currently focused, and we use a
variable called has_focus to indicate whether anything has focus--i.e.
whether we should actually treat that first node as focused at any given
time.
In a number of places, we treat has_focus as implying that a focused
node exists. If it's true, we attempt to dereference the return value of
seat_get_focus(), our helper function for getting the first node in
focus_list, with no further checks. But this isn't quite correct with
the current implementation of seat_get_focus(): not only does it return
NULL when has_focus is false, it also returns NULL when focus_stack
contains no items.
In most cases, focus_stack never becomes empty and so this doesn't
matter at all. Since focus_stack stores a history of focused nodes, we
rarely remove nodes from it. The exception to this is when a node itself
goes away. In that case, we call seat_node_destroy() to remove it from
focus_stack and free it. But we don't unset has_focus if we've removed
the final node! This lets us get into a state where has_focus is true
but seat_get_focus() returns NULL, leading to a segfault when we try to
dereference it.
Fix the issue both by updating has_focus in seat_node_destroy() and by
adding an assertion in seat_get_focus() that ensures focus_stack and
has_focus are in sync, which will make it easier to track down similar
issues in the future.
Fixes #6395.
[1] There's some discussion in #1585 from when this was implemented
about whether has_focus is actually necessary; it's possible we could
remove it entirely, but for the moment this is the architecture we have.
* swaybar: fix tray_padding vs min-height re: scale
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
* swaybar: fix tray item icon scaling, positioning
* container: Fix crash when view unmaps + maps quickly
Followup on 4e4898e90f.
If a view quickly maps and unmaps repeatedly, there will be multiple
destroyed containers with same view in a single transaction. Each of
these containers will then try to destroy this view, resulting in use
after free.
The container should only destroy the view if the view still belongs
to the container.
Simple reproducer: couple XMapWindow + XUnmapWindow in a loop followed
by XDestroyWindow.
See #6605
* commands/move: Fix crash when pos_y is omitted
Fixes #6737
* Destroy sub-surfaces with parent layer-shell surface
Closes: https://github.com/swaywm/sway/issues/6337
* Add safety assert in parse_movement_unit
Let's add this just in case a caller passes argc == 0.
References: https://github.com/swaywm/sway/issues/6737#issuecomment-1008082540
* meson: check: false on run_command
Future meson releases will change the default and warns when the
implicit default is used, breaking builds.
Explicitly set check: false to maintain behavior and silence warnings.
* Print deprecation notice when running SUID
SUID privilege drop is needed for the "builtin"-backend of libseat,
which copied our old "direct" backend behavior for the sake of
compatibility and ease of transition.
libseat now has a better alternative in the form of seatd-launch. It
uses the normal seatd daemon and libseat backend and takes care of SUID
for us.
Add a soft deprecation warning to highlight our future intent of
removing this code. The deprecation cycle is needed to avoid surprises
when sway no longer drops privileges.
* xdg-shell: use toplevel geometry to adjust the popup box
`popup_unconstrain` uses view coordinates to init the output box for
popups. However wlroots expects the box to be set in a toplevel surface
coordinate system, which is not always equal to view. The difference
between those is a window geometry set via xdg-shell.
GTK4 reserves some space for client-side decoration and thus has a
window with top left corner not matching to (0, 0) of a surface. The box
calculated without taking that into account was slightly shifted
compared to the actual output and allowed to position part of the popup
off screen.
* build: fix building with basu
02b412a introduced the use of list for sdbus deps, however
it was assuming that all packages which were in a list has a version
higher than 239. That is true for libsystemd and libelogind, since they
use the same versions, however basu is using version numbers which are
way lower than what libsystemd/libelogind are using, so basu only build
is failing.
* Upgrade for wlroots surface refactoring
See [1] for details.
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3412
* commands/focus: drop trailing whitespace
* input/cursor: count pointer gestures as idle activity
Fixes https://github.com/swaywm/sway/issues/6765.
* input/cursor: treat swipe begin as idle activity too
Accidentally overlooked in fd53f80.
* treat fullscreen windows as 'tiled' for commands/focus
* transaction: destroying nodes aren't hidden
Commit 37d7bc69986f ("transaction: Only wait for ack from visible
views") introduced a check which uses view_is_visible() to check if a view
is still visible on the screen. However view_is_visible() will early
return in case the node is in the destroying state. This is incorrect
for transactions, since a destroying view which is visible will trigger
configure events for other clients. This bug was visible when repeatedly
opening and closing two views side by side, since we ignore the
destroying node we get a frame where the still open view is shown with
the old configure values and the rest is the desktop background. The
next frame is than correct again.
Fix this by considering destroying views as visible, we correctly wait
for them and send the configure events to other views in time, fixing
the background flicker.
Fixes #6473
* build: execute wlroots subproject before finding deps
wlroots often requires dependencies more recent than Sway's.
Executing the wlroots subproject first will give Meson a chance to
find these newer dependencies, possibly via subprojects.
The subproject will override the "wlroots" dependency when executed,
so we don't need to use get_variable anymore.
References: https://github.com/swaywm/sway/pull/6498#issuecomment-1001746017
* tray: do not render passive items
https://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/StatusNotifierItem/#org.freedesktop.statusnotifieritem.status
* cmd/swap: error on swapping a container with itself
* input/cursor: pass through pointer hold gestures
This just follows swaywm/wlroots#3047, so `wl_pointer_gestures_v1`
clients can be notified of these events.
* swaynag: remove buffer destruction condition
An address of a variable can never be NULL, so checking it doesn't make
sense; and `destroy_buffer()` can operate on already destroyed buffers
anyway.
Fixes #6780
* Use bools for CLI flags
* xwayland: listen to `request_activate` event
When REAPER submenu is closed `XCB_CLIENT_MESSAGE` with type
`NET_ACTIVE_WINDOW` is sent to set focus to parent menu.
Closes: https://github.com/swaywm/sway/issues/6324
* chore: chase wlr_output_layout_get_box() update
https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3439
* Chase wlroots xdg-shell refactor
* Minor update to focus_on_window_activation
Removed xwayland limitation since wayland clients are supported via xdg-activation.
* Translated README into Italian
* readme: add link to Italian translation
* readme: sort language list alphabetically
* readme: use relative links for translations
* xdg-shell: use wlr_xdg_toplevel in sway_view
Improved type safety.
Closes: https://github.com/swaywm/sway/issues/6813
* xdg-shell: use wlr_xdg_popup in sway_xdg_popup
Improved type safety.
* Fix snprintf compiler warning
* Remove all sprintf calls
Replace them with snprintf, which ensures buffer overflows won't
happen.
* sway/commands: add missing wlr_keyboard interface include in xkb_switch_layout
* sway/input: use wlr_input_device from input device base
* Remove some erroneous apostrophes in comments
* Don't enter seatop_move_floating when fullscreen
Currently, a floating window that's been fullscreened can send us
xdg_toplevel::move, and we'll enter seatop_move_floating, which lets us
drag the surface around while it's fullscreen. We don't want
this--fullscreen surfaces should always be aligned to the screen--so add
the same check that seatop_default already does when entering this mode.
Tested with Weston's weston-fullscreen demo, which sends a move request
if you click anywhere on its surface.
* swaynag: die on all allocation failures
* sway/input: don't pass possibly invalid modifiers pointer
active_keyboard may be NULL, in which case an invalid pointer could be
passed to wlr_input_method_keyboard_grab_v2_send_modifiers. This
procedure call is unnecessary since wlroots commit 372a52ec "input
method: send modifiers in set_keyboard", so the call can simply be
removed.
Fixes #6836.
* sway/input: destroy sway_switch properly
Fix: #6861
Added seat_device_destroy function to seat_device_destroy function.
* commands/focus: fix segfault when no container is already focused.
Fixes #6690.
* Remove WLR_SWITCH_STATE_TOGGLE usage
Ref [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/commit/4792446ee8f50104bd207d9ccd8558a7e4eb4514
* Replace pcre with pcre2
Closes: https://github.com/swaywm/sway/issues/6838
* swaybar: remove swaybar_output.input_region
No need to keep the region around, we can immediately destroy it
after the wl_surface.set_input_region request.
* swaybar: set opaque region
When the background color is fully opaque, set the surface's opaque
region to the whole surface.
* Updating criteria checking with PCRE2
* swaynag: allocate button_details with details
They are used together, so it doesn't make sense to allocate them
separately.
* swaynag: statically allocate button_close, and move declaration
Every swaynag has a close button, so it doesn't make sense to
allocate it dynamically. The declaration is moved later to when
it is actually needed.
* swaynag: remove unnecessary zero of swaynag struct
Global variables are initialized to 0.
* swaynag: remove redundant status variables in main
Instead, we just use `status` for all failures.
* remove unnecessary strlen call
* sway/input/cursor: take device mm size from wlr_tablet
* sway/input/seat: take output name from specialized input device
* sway/input: follow up wlroots input device events renaming
* sway/input: fix bad position of wlr_drag
* sway/input: wlr_seat_keyboard() now takes wlr_keyboard
* bash-completion: localize variables
* sway/main: move constants off the stack
This makes stack traces from gdb slightly easier to read.
* Fix farsi label
* Avoid format-truncation warning
The existing code gives this error when compiled with GCC 12:
../sway/server.c: In function ‘server_init’:
../sway/server.c:217:75: error: ‘%d’ directive output may be truncated writing between 1 and 11 bytes into a region of size 8 [-Werror=format-truncation=]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~
../sway/server.c:217:66: note: directive argument in the range [-2147483647, 32]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~
../sway/server.c:217:17: note: ‘snprintf’ output between 10 and 20 bytes into a destination of size 16
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Because i is never negative, this is a false positive, but it is easy to
change i to unsigned to silence the error.
* Shuffle variables to satisfy -Werror=restrict
This also fixes an invalid strlen invocation on uninitialized memory.
* layer_shell: keep output non-NULL wherever possible
Our layer shell implementation assigns every layer surface to an output
on creation. It tracks this output using the output field on the
underlying wlr_layer_surface_v1 structure. As such, much of the existing
code assumes that output is always non-NULL and omits NULL checks
accordingly.
However, there are currently two cases where we destroy a
sway_layer_surface and output is NULL. The first is when we can't find
an output to assign the surface to and destroy it immediately after
creation. The second is when we destroy a surface in response to its
output getting destroyed, as we set output to NULL in
handle_output_destroy() before we call wlr_layer_surface_v1_destroy(),
which is what calls the appropriate unmap and destroy callbacks.
The former case doesn't cause any problems, since we haven't even
allocated a sway_layer_surface at that point or registered any
callbacks. The latter case, however, currently triggers a crash (#6120)
if a popup is visible, since our popup_handle_unmap() implementation
can't handle a NULL output.
To fix this issue, keep output set until right before we free the
sway_layer_surface. All we need to do is remove some of the cleanup
logic from handle_output_destroy(), since as of commit c9060bcc12d0
("layer-shell: replace close() with destroy()") that same logic is
guaranteed to be happen later when wlroots calls handle_destroy() as
part of wlr_layer_surface_v1_destroy().
This lets us remove some NULL checks from other unmap/destroy callbacks,
which is nice. We also don't need to check that the wlr_output points to
a valid sway_output anymore, since we unset that pointer after disabling
the output as of commit a0bbe67076b8 ("Address emersions comments on
output re-enabling") Just to be safe, I've added assertions that the
wlr_output is non-NULL wherever we use it.
Fixes #6120.
* Chase wlroots X11 hints update
* Add Swedish README
* Support cursor capture in grimshot
Refactor argument parser
Bring back `sh` compatibility
Default to NOTIFY=no
* Update grimshot.1.scd
Fixed typo. The object is **files**, which is plural. **image** modifies files; it's not countable.
* xkb_switch_layout: fix relative layout switches
Fixes #6011
* Implement ext-session-lock-v1
* Avoid inspecting a NULL view in seat_set_focus
Fixes #6968
* swaynag: do error checking and rename read_from_stdin
read_from_stdin not only read from stdin, but trimming trailing
newlines, so rename it to reflect this.
* swaynag: improve robustness when loading config
* swaynag: combine consecutive declaration/assignments
* config: Remove unused mouse binding structure
Mouse bindings are handled alongside normal bindings. Remove the unused
separate data structure definition to avoid confusion.
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
* Replace strncpy with memcpy
strncpy is useless here, is dangerous because it doesn't guarantee
that the string is NUL-terminated and causes the following warning:
../sway/criteria.c: In function ‘criteria_parse’:
../sway/criteria.c:712:25: error: ‘strncpy’ destination unchanged after copying no bytes [-Werror=stringop-truncation]
712 | strncpy(value, valuestart, head - valuestart);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Add descriptions for `stacking` and `tabbed` layouts
Resolves #5918
* man: Fix trailing spaces
* server: request xdg-shell v2
Wlroots does not yet support the newer xdg-shell versions and now
requires the compositor to set the supported xdg-shell version during
creation. Set this to v2 for sway as well.
Fixes https://github.com/swaywm/sway/issues/7001
* realtime: request SCHED_RR using CAP_SYS_NICE
Try to gain SCHED_RR (round-robin) realtime scheduling privileges before
starting the server. This requires CAP_SYS_NICE on Linux systems.
We additionally register a pthread_atfork callback which resets the
scheduling class back to SCHED_OTHER (the Linux system default).
Due to CAP_SYS_NICE, setting RLIMIT_RTPRIO has no effect on the process
as documented within man 7 sched (from Linux):
Privileged (CAP_SYS_NICE) threads ignore the RLIMIT_RTPRIO limit;
as with older kernels, they can make arbitrary changes to
scheduling policy and priority. See getrlimit(2) for further
information on RLIMIT_RTPRIO
Note that this requires the sway distribution packagers to set the
CAP_SYS_NICE capability on the sway binary.
Supersedes #6992
* ext-session-lock: disable direct scan-out when locked
* Polish the language in README.zh-CN.md & sync with English one
Co-Authored-By: Urey. Xue <urey.s.knowledge@gmail.com>
* De-duplicate IPC output descriptions
* Handle NULL output make/model/serial
* chore: chase wlroots xdg-shell update
* xdg-shell: schedule a configure on maximize request
This commit reverts 03879290dbee26127f6867ef60bc2a7f9a6c8c5f and
fc84bcb7fb0ffa29b1f9bed287762241a3473803.
* Add a Hindi (हिन्दी) translation to the README
Hindi is one of the most prominent languages of the Indian Subcontinent.
This commit adds the translation of the README into the Hindi language.
Some of the words are still written in English because there wasn't an
appropriate technical term of the word in the language.
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
* sway: add bindgesture command
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
* build: link with -pthread
Fixes the following FreeBSD error:
ld: error: undefined symbol: pthread_getschedparam
>>> referenced by realtime.c:25 (../sway/realtime.c:25)
>>> sway/sway.p/realtime.c.o:(set_rr_scheduling)
Fixes: a3a82efbf6b5 ("realtime: request SCHED_RR using CAP_SYS_NICE")
* ipc: remove chatty debug log messages
These aren't particularly useful, and clobber the debug logs.
* Refuse to start when SUID is detected
This ensures that those surprised by the deprecation of SUID operation
receive an error rather than accidentally having sway run as root.
This detection will be removed in a future release.
* swaynag: move close_button up to fix SIGSEGV
When swaynag_parse_options encounters '--dismiss-button' (or its
shorthand '-s'), it sets the text of the first button in the
swaynag.buttons list, which is expected to exist and to be the dismiss
button, to the one passed by the user.
Commit 4780afb68b4ee2cdf0e4925f40cf885819f8a74a ("swaynag: statically
allocate button_close, and move declaration") moved the list
initialization to after swaynag_parse_options is called which made that
code fail.
For example, the command 'swaynag --dismiss-button Dismiss' crashes and
'swaynag --message Message --button Yes "" --dismiss-button Dismiss'
shows the wrong buttons.
Move it back to before swaynag_parse_options is called.
* config/output: use wlr_output_commit_state
This makes the code more robust because we don't potentially leave
bad state in wlr_output.pending behind anymore. This also fixes a
bug.
Closes: https://github.com/swaywm/sway/issues/7043
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3610
* Allocate enough space for `cmd_results->error`
* Remove access to wlr_input_device union
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3626
Closes: https://github.com/swaywm/sway/issues/7077
* Rename dpms output command to power
The "dpms" command refers to VESA Display Power Management
Signaling, a deprecated standard. It's superseded by VESA DPM.
Instead of tying out command name to a particular standard, use the
neutral term "power".
* Strip quotes in bindsym --input-device=...
If the input device is quoted, which is common when using variables in the
config file, those quotes must be ignored here, or the input device will be
ignored.
Fixes #7029.
* Avoid unecessary string copy
* Reject font values that are invalid for pango
Use pango to parse font configuration early, and reject the command as
invalid if the value is invalid for pango. Since we're already parsing
the font into a `PangoFontDescription`, keep that instance around and
avoid re-parsing the font each time we render text.
Fixes: https://github.com/swaywm/sway/issues/6805
* Reuse parsed PangoFontDescription
Avoids parsing the configured font each time text is rendered.
* ipc: add "power" to output reply
* config.in: switch to `output power`
* Remove internal references to DPMS
While at it, use an int for the config field, just like we do for
all other fields.
* fix: remove redundant empty statement in main.c
This semi-colon looks like a typo. Luckily, it has no effect on the code as it's treated as an empty statement leading the switch case.
Really straightforward nitpick change, was just something I was confused by when reading over the code.
* input: chase delta_discrete semantics change
* swaymsg: fix floating_nodes being ignored
Fix floating_nodes being ignored in pretty_print_tree.
* ipc: make get_deco_rect check config->hide_lone_tab
Without this, the `IPC_GET_TREE` ipc call would return false information
about the container's `deco_rect` and `rect` properties if
`hide_edge_borders --i3` was in effect.
* grimshot: fix tilde expansion within quotes
* Enable single-pixel-buffer-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3428
* sway-output.5: improve display of parameter
Since "width" and "height" are separate parameters, show them as such.
* man: sway(5) move fixes
* ipc: drop WLR_OUTPUT_ADAPTIVE_SYNC_UNKNOWN case
This has been removed from wlroots.
* config/output: test adaptive sync
Required for [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3637
* Fix crash in xdg_activation_v1.c
wlr_xdg_surface_from_wlr_surface() can return a NULL pointer, so check for NULL before dereferencing it.
* sway: Add non-desktop-output type
Currently, when encountering a non-desktop display, sway offers the
output for leasing and returns without storing it in a sway specific
output type like `struct sway_output`. Additionally, running
`swaymsg -t get_outputs` doesn't show non-desktop outputs.
This commit stores the non-desktop outputs into a struct called
`sway_output_non_desktop`, and adds them to a list on `sway_root`
* sway: add non-desktop outputs to json when running `swaymsg -t get_outputs`
* swaymsg: show non-desktop property when pretty printing outputs
* man: Add XWayland information
* ipc: expose mode picture aspect ratio
* swaymsg: show mode picture aspect ratio
* build: simplify protocol paths
No need for arrays here.
* sway/commands/output: Add command for unplugging non-physical outputs
* Improve Japanese translation
* allow pointer_constraints on layer_shell surfaces
* check for NULL
* use seat directly
* Use keyboard_state.focused_surface directly
* input: focus floating container when clicked on border
Fixes #7209.
* input: focus container when scrolling on titlebar
Fixes #6503.
* Fix leaks in criteria_destroy()
* Avoid double free in criteria_destroy()
* Add support for ext-idle-notify-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3753
* input: tweak focus behavior to allow focusing parent containers
Sway focuses the inactive child when focusing split containers. However,
there is currently no way to focus the parent container itself by mouse.
A user must use the keyboard to do so.
This commit maintains the current behavior, but makes it such that a
second click on the split container titlebar (i.e., after its children
are visible) focuses the split container itself.
* Fix keymap being NULL and segfaulting on dev add
Moved `libinput_config` to the callers of
`sway_input_configure_libinput_device` so that we send the event after
the added event.
* Rework session lock keyboard focus handling
When removing outputs, it is possible to end up in a situation where
none of the session lock client's surfaces have keyboard focus,
resulting in it not receiving keyboard events. Track the focused
surface and update it as needed on surface destroy.
* Fix focus tracking when session lock is active
Remove the incorrect attempt to block focus changes when an input grab
is present and replace it with the same logic used for layer_shell-based
screen lockers: restore the focus after changing it.
This fixes a use-after-free of seat->workspace if outputs are destroyed
while a screen lock is enabled.
* container_floating_set_default_size: Store workspace size box on the stack
* Support libinput's 1.21 new dwtp option
Support the new dwtp (disable while trackpointing) option introduced in
libinput 1.21, allowing users to control whether the trackpoint (like
those in Thinkpads, but not only) should be disabled while using the
keyboard/touchpad.
See: https://gitlab.freedesktop.org/libinput/libinput/-/issues/731
* tree: support formatting null titles
Any windows that have never had a title set visually behave closer to
that of an empty title, but are unformattable, as the code bails out
early on a NULL title.
* criteria: allow matching on empty (NULL) titles
* criteria: allow matching for NULL string criteria
* ci: install hwdata
* Use wl_signal_emit_mutable()
This function fixes segfaults when emitting a signal potentially
removes arbitrary listeners.
* Use wlr_damage_ring
wlr_output_damage is to be replaced with wlr_damage_ring, so use that.
* lock: fix crash on output destroy
Closes: https://github.com/swaywm/sway/issues/7120
* container_get_siblings: handle NULL workspace
* ci: checkout wlroots 0.16.0
* workspace_create: Don't allow NULL name
(cherry picked from commit 34933bb84350fe805d82276ea02d5732546e9993)
* output: set damage ring bounds to pixel values
Fixes: https://github.com/swaywm/sway/issues/7254
(cherry picked from commit 85005b52fe5b832e4ea914fa28048b0c5c803769)
* Use shm_open instead of mkstemp
shm_open is more reliable because it does not require
a writeable filesystem folder, unlike mkstemp.
(cherry picked from commit e2bc8866f46701e9c825ad7fa5baac02b2e4898f)
* build: drop wayland-scanner fallback
(cherry picked from commit 366f6ef3d31688631dc453028e108f98a1d7ab57)
* build: unify server & client protocol generation
No need to make a difference here, let's just generate header
files for both.
(cherry picked from commit 5be5a038da8a3789a19945719f2a27233291445d)
* build: drop "server" from target name for protocol code
(cherry picked from commit e5475d9310941ce88ed016ce1515b36e3a440252)
* build: drop intermediate libraries for protocols
(cherry picked from commit af8a5a8918ef42336194fb1077b008a736de7af9)
* root: move the workspace matching code to its own file
This removes the pid_workspace bits from tree/root before it gets
too interesting.
No functional change.
(cherry picked from commit eb5021ef990fb29ff86544aea58d687ad62c757a)
* node: prettify node type names
(cherry picked from commit 1c4b94ae3ca94b972410c80a61404a347af1ee68)
* launcher: track workspaces by node
This removes the need to rename the pid_workspaces when a workspace
is renamed.
It also opens the possibility of tracking other node types. Tracking
containers would allow application to be placed correctly in the
container tree even if the user has moved their focus elsewhere since
it was launched.
(cherry picked from commit 3b49f2782e8faf68766269b9c7390b16e25ae824)
* launcher: use xdga tokens
This reuses wlroots token tracking for workspace matching. It doesn't
export any xdga tokens for clients yet.
(cherry picked from commit bd66f4943da1c96edc3ba49573e27b42b688c543)
* launcher: rename pid_workspace to launcher_ctx
Soon we will match views with more than just a pid.
(cherry picked from commit d75c9f9722389d441fd24bd490c5cf12c4bef39a)
* view: associate launch contexts with views
Views now maintain a reference to a launch context which, as a last
resort, is populated at map time with a context associated with its pid.
This opens the possibility of populating it before map via another
source, e.g. xdga-tokens or configuration.
(cherry picked from commit 864b3a9a18f236f92f1898bb44ab977ceaebfd68)
* launcher: initialize launcher_ctxs once on startup
(cherry picked from commit 66568508c06267445489d655c91c94a34d6d9ffe)
* launcher: fudge the interface a bit
We want to create a context before knowing the pid it will match with.
(cherry picked from commit bdeb9f95651f6c99cc2f4cfb59020ddee202cf36)
* launcher: export xdga tokens and use them for workspace matching
(cherry picked from commit 30ad4dc4a5a41ce7c7aa85096a6e18f374172983)
* launcher: export X startup ids and use them for workspace matching
(cherry picked from commit 28fda4c0d38907fab94dc7d82c9dcf0754748b4e)
* swaybar: Prioritize hotspot events to bar bindings
This is consistent with i3bar's behaviour, and for example, allows binding a
command to button1, while still being able to click on tray icons or other
zones on the bar's status line which may have their own bindings.
E.g., in Sway, without this commit, this config. makes tray icons unclickable:
bar {
# ...
bindsym button1 exec swaynag -m You_clicked_the_tray._Want_some_help?
}
But the same configuration in i3 (with i3-nagbar) keeps tray items clickable.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 53f9dbd424dc173a85c9f4cd30802259d38b1ef4)
* swaybar: Make hotspots block bar release bindings
The previous commit prioritized hotspots before bar bindings for press events,
which matches i3's behaviour. However, since hotspots don't need to do any
processing on release events, those were not handled, and simply fell through
to `bindsym --release` bar bindings (if any).
This is counter-intuitive, and doesn't match i3's behaviour. Instead in case
a hotspot handles the press event, it should also handle the release event,
doing nothing, but blocking the event from triggering a --release bar binding.
E.g., in Sway, without this commit, this config. shows a text on tray clicks:
bar {
# ...
bindsym --release button1 exec swaynag -m I_got_the_release_event.
}
But the same configuration in i3 (with i3-nagbar) doesn't show the text.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 94b69acf0d7b26ee5af2172300cb18473508da76)
* build: drop unused wayland-egl dependency
(cherry picked from commit 37e4a3d6370dc6ba2b0877d588845c06781e880e)
* build: bump version to 1.8-rc1
* Fix build on Debian Stable
(cherry picked from commit dca0bb5749bc16f91ab964fc1b06ebb9a453368f)
* build: fix have_xwayland when xcb-icccm is not found
xcb-icccm is required to build Xwayland support.
Backported from commit d41f11e6bd8cef80f02dda4c66d4a31611aed753.
* build: bump version to 1.8-rc2
* seat: Avoid sending redundant keymaps on reload
When we reload the config, we reset every input device and re-apply
configuration from the config file. This means that the keyboard keymap
is updated at least once during config reload, more if the config file
contains keyboard configuration.
When they keyboard keymap changes and is updated through wlr_seat, the
keymap ends up sent to every keyboard bound in every client, seemingly
multiple times. On an x230 of mine with a keyboard layout set in the
config file, I see 42 keymap events sent to foot on config reload.
Reduce events from keyboard configurations by skipping all but the
currently active keyboard for the seat, and by clearing the active
keyboard during input manager device reset. After this change, I only
see a single just-in-time keymap event.
Fixes: https://github.com/swaywm/sway/issues/6654
* criteria: be lenient on window_role and instance too
* build: bump version to 1.8-rc3
* commands/move: Warp cursor after moving workspace to another output
This makes sway's behavior consistent with i3 when `mouse_warping` is
set to any value besides `none`.
Fixes #7027.
(cherry picked from commit e3c63bf58d0744dfb436f0f38442ce3735e40f47)
* seat: Set keyboard if seat keyboard is NULL
sway sends wl_keyboard.enter on seat focus change and when a keyboard
active on a seat is configured. If all keyboards are removed and a
keyboard is added back without changing the focused client, no new
notify event would be sent despite having keyboard focus. This could
lead to key events without notify, which is a protocol violation.
As a quick fix, when configuring a keyboard on a seat where no keyboard
is currently active, activate the keyboard so that a focused surface
will receive a notify event.
Regressed by: e1b268af98edeb09e570e8855ef64f0719cbafe2
Closes: https://github.com/swaywm/sway/issues/7330
(cherry picked from commit 1ade0ce753dc5f588584f444ce80d27c3b1e4300)
* build: bump version to 1.8-rc4
* swaynag: fix NULL font description
The font description was only set if provided on the CLI. It was
left NULL for the defaults and when reading from the config file.
Closes: https://github.com/swaywm/sway/issues/7186
(cherry picked from commit fd0af78e43f4dd67a404f475c676b25ae38a4b82)
* build: bump version to 1.8
* Removed other README languages
* Fixed build issues
* Removed alpha from render_data struct
* Updated PKGBUILDs and COPR spec
* Update sway/desktop/render.c
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
* Fixed deco_data not being initialized properly
* Replaced wlr_egl_(make|unset)_current with eglMakeCurrent
* Added matrix_projection into fx_renderer
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: Sefa Eyeoglu <contact@scrumplex.net>
Co-authored-by: Simon Ser <contact@emersion.fr>
Co-authored-by: Seth Barberee <seth.barberee@gmail.com>
Co-authored-by: Thomas Hebb <tommyhebb@gmail.com>
Co-authored-by: Nathan Schulte <nmschulte@gmail.com>
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
Co-authored-by: David Rosca <nowrep@gmail.com>
Co-authored-by: David96 <david@hameipe.de>
Co-authored-by: Kenny Levinsen <kl@kl.wtf>
Co-authored-by: Aleksei Bavshin <alebastr89@gmail.com>
Co-authored-by: Kirill Chibisov <contact@kchibisov.com>
Co-authored-by: Tudor Brindus <me@tbrindus.ca>
Co-authored-by: Patrick Hilhorst <git@hilhorst.be>
Co-authored-by: Rouven Czerwinski <rouven@czerwinskis.de>
Co-authored-by: Tobias Bengfort <tobias.bengfort@posteo.de>
Co-authored-by: Ronan Pigott <rpigott@berkeley.edu>
Co-authored-by: Kirill Primak <vyivel@eclair.cafe>
Co-authored-by: Tuomas Yrjölä <mail@yrhki.fi>
Co-authored-by: Kirill Primak <vyivel@posteo.net>
Co-authored-by: Alexander Browne <elcste@users.noreply.github.com>
Co-authored-by: Marco Rubin <20150305+Rubo3@users.noreply.github.com>
Co-authored-by: Muhamed Hobi <woohoomoo2u@gmail.com>
Co-authored-by: Simon Zeni <simon@bl4ckb0ne.ca>
Co-authored-by: Nihal Jere <nihal@nihaljere.xyz>
Co-authored-by: Alexander Gramiak <agrambot@gmail.com>
Co-authored-by: Moon Sungjoon <sumoon@seoulsaram.org>
Co-authored-by: Nicolas Avrutin <nicolas@avrutin.net>
Co-authored-by: ndren <andreien@ctemplar.com>
Co-authored-by: Bill Li <billli11hkb@gmail.com>
Co-authored-by: Leonardo Hernández Hernández <leohdz172@protonmail.com>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Co-authored-by: Manuel Stoeckl <code@mstoeckl.com>
Co-authored-by: Yasin Silavi <59373143+sttatusx@users.noreply.github.com>
Co-authored-by: Daniel De Graaf <code@danieldg.net>
Co-authored-by: kraftwerk28 <kefirchik3@gmail.com>
Co-authored-by: Eskil <67291226+eschillus@users.noreply.github.com>
Co-authored-by: Alice Carroll <git@alice-carroll.pet>
Co-authored-by: Alan <51193876+Pound-Hash@users.noreply.github.com>
Co-authored-by: Victor Makarov <vitja.makarov@gmail.com>
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: -k <slowdive@me.com>
Co-authored-by: Hongyi <61831273+FrozenArcher@users.noreply.github.com>
Co-authored-by: Urey. Xue <urey.s.knowledge@gmail.com>
Co-authored-by: LordRishav <75823494+LordRishav@users.noreply.github.com>
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
Co-authored-by: Florian Franzen <Florian.Franzen@gmail.com>
Co-authored-by: Greg Depoire--Ferrer <greg@gregdf.com>
Co-authored-by: Thomas Jost <schnouki@schnouki.net>
Co-authored-by: Hugo Osvaldo Barrera <hugo@barrera.io>
Co-authored-by: zkldi <ktchidev@gmail.com>
Co-authored-by: llyyr <llyyr.public@gmail.com>
Co-authored-by: Baltazár Radics <baltazar.radics@gmail.com>
Co-authored-by: Martin Michlmayr <tbm@cyrius.com>
Co-authored-by: Filip Szczepański <jazz2rulez@gmail.com>
Co-authored-by: Alex Maese <memaese@hotmail.com>
Co-authored-by: マリウス <marius@xn--gckvb8fzb.com>
Co-authored-by: Andri Yngvason <andri@yngvason.is>
Co-authored-by: ohno418 <yutaro.ono.418@gmail.com>
Co-authored-by: Ferdinand Schober <ferdinand.schober@fau.de>
Co-authored-by: cparm <armelcadetpetit@gmail.com>
Co-authored-by: Yaroslav de la Peña Smirnov <yps@yaroslavps.com>
Co-authored-by: Alexander Orzechowski <orzechowski.alexander@gmail.com>
Co-authored-by: pudiva chip líquida <pudiva@skylittlesystem.org>
Co-authored-by: Puck Meerburg <puck@puckipedia.com>
Co-authored-by: Callum Andrew <calcium@mailbox.org>
Co-authored-by: Ronan Pigott <ronan@rjp.ie>
Co-authored-by: Joan Bruguera <joanbrugueram@gmail.com>
Co-authored-by: nerdopolis <bluescreen_avenger@verizon.net>
Co-authored-by: Ankit Pandey <anpandey@protonmail.com>
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
2023-01-05 09:32:43 +11:00
|
|
|
double width = fmax(min_width, fmin(box.width * 0.5, max_width));
|
|
|
|
double height = fmax(min_height, fmin(box.height * 0.75, max_height));
|
2019-03-30 03:15:17 +11:00
|
|
|
if (!con->view) {
|
2021-02-13 09:22:51 +11:00
|
|
|
con->pending.width = width;
|
|
|
|
con->pending.height = height;
|
2019-03-30 03:26:08 +11:00
|
|
|
} else {
|
2021-02-13 09:22:51 +11:00
|
|
|
con->pending.content_width = width;
|
|
|
|
con->pending.content_height = height;
|
2019-03-30 03:26:08 +11:00
|
|
|
container_set_geometry_from_content(con);
|
2019-03-30 03:15:17 +11:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-07 16:57:48 +10:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Indicate to clients in this container that they are participating in (or
|
|
|
|
* have just finished) an interactive resize
|
|
|
|
*/
|
|
|
|
void container_set_resizing(struct sway_container *con, bool resizing) {
|
|
|
|
if (!con) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (con->view) {
|
|
|
|
if (con->view->impl->set_resizing) {
|
|
|
|
con->view->impl->set_resizing(con->view, resizing);
|
|
|
|
}
|
|
|
|
} else {
|
2021-02-13 09:22:51 +11:00
|
|
|
for (int i = 0; i < con->pending.children->length; ++i ) {
|
|
|
|
struct sway_container *child = con->pending.children->items[i];
|
2020-07-07 16:57:48 +10:00
|
|
|
container_set_resizing(child, resizing);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-05-24 22:30:44 +10:00
|
|
|
void container_set_floating(struct sway_container *container, bool enable) {
|
2018-05-25 09:26:23 +10:00
|
|
|
if (container_is_floating(container) == enable) {
|
2018-05-24 22:30:44 +10:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-10-18 22:20:00 +11:00
|
|
|
struct sway_seat *seat = input_manager_current_seat();
|
2021-02-13 09:22:51 +11:00
|
|
|
struct sway_workspace *workspace = container->pending.workspace;
|
2021-04-12 10:02:55 +10:00
|
|
|
struct sway_container *focus = seat_get_focused_container(seat);
|
|
|
|
bool set_focus = focus == container;
|
2018-05-24 22:30:44 +10:00
|
|
|
|
|
|
|
if (enable) {
|
2021-02-13 09:22:51 +11:00
|
|
|
struct sway_container *old_parent = container->pending.parent;
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
container_detach(container);
|
2018-08-19 15:07:07 +10:00
|
|
|
workspace_add_floating(workspace, container);
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
if (container->view) {
|
|
|
|
view_set_tiled(container->view, false);
|
2018-09-27 22:44:57 +10:00
|
|
|
if (container->view->using_csd) {
|
2021-08-11 03:01:37 +10:00
|
|
|
container->saved_border = container->pending.border;
|
2021-02-13 09:22:51 +11:00
|
|
|
container->pending.border = B_CSD;
|
2021-08-11 03:01:37 +10:00
|
|
|
if (container->view->xdg_decoration) {
|
|
|
|
struct sway_xdg_decoration *deco = container->view->xdg_decoration;
|
|
|
|
wlr_xdg_toplevel_decoration_v1_set_mode(deco->wlr_xdg_decoration,
|
|
|
|
WLR_XDG_TOPLEVEL_DECORATION_V1_MODE_CLIENT_SIDE);
|
|
|
|
}
|
2018-09-27 22:44:57 +10:00
|
|
|
}
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
}
|
2019-06-27 17:57:58 +10:00
|
|
|
container_floating_set_default_size(container);
|
|
|
|
container_floating_resize_and_center(container);
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
if (old_parent) {
|
2021-04-12 10:02:55 +10:00
|
|
|
if (set_focus) {
|
|
|
|
seat_set_raw_focus(seat, &old_parent->node);
|
|
|
|
seat_set_raw_focus(seat, &container->node);
|
|
|
|
}
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
container_reap_empty(old_parent);
|
2018-05-24 22:30:44 +10:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// Returning to tiled
|
2018-07-22 14:10:40 +10:00
|
|
|
if (container->scratchpad) {
|
2018-08-03 23:06:01 +10:00
|
|
|
root_scratchpad_remove_container(container);
|
2018-07-22 14:10:40 +10:00
|
|
|
}
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
container_detach(container);
|
2018-07-27 13:46:01 +10:00
|
|
|
struct sway_container *reference =
|
|
|
|
seat_get_focus_inactive_tiling(seat, workspace);
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
if (reference) {
|
2021-04-12 10:02:55 +10:00
|
|
|
if (reference->view) {
|
|
|
|
container_add_sibling(reference, container, 1);
|
|
|
|
} else {
|
|
|
|
container_add_child(reference, container);
|
|
|
|
}
|
2021-02-13 09:22:51 +11:00
|
|
|
container->pending.width = reference->pending.width;
|
|
|
|
container->pending.height = reference->pending.height;
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
} else {
|
2020-10-26 08:20:11 +11:00
|
|
|
struct sway_container *other =
|
|
|
|
workspace_add_tiling(workspace, container);
|
2021-02-13 09:22:51 +11:00
|
|
|
other->pending.width = workspace->width;
|
|
|
|
other->pending.height = workspace->height;
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
}
|
|
|
|
if (container->view) {
|
|
|
|
view_set_tiled(container->view, true);
|
2018-09-27 22:44:57 +10:00
|
|
|
if (container->view->using_csd) {
|
2021-02-13 09:22:51 +11:00
|
|
|
container->pending.border = container->saved_border;
|
2021-08-11 03:01:37 +10:00
|
|
|
if (container->view->xdg_decoration) {
|
|
|
|
struct sway_xdg_decoration *deco = container->view->xdg_decoration;
|
|
|
|
wlr_xdg_toplevel_decoration_v1_set_mode(deco->wlr_xdg_decoration,
|
|
|
|
WLR_XDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE);
|
|
|
|
}
|
2018-09-27 22:44:57 +10:00
|
|
|
}
|
2018-06-28 02:53:13 +10:00
|
|
|
}
|
2019-06-29 07:21:20 +10:00
|
|
|
container->width_fraction = 0;
|
|
|
|
container->height_fraction = 0;
|
2018-05-24 22:30:44 +10:00
|
|
|
}
|
2018-06-06 22:57:34 +10:00
|
|
|
|
2018-07-18 16:13:28 +10:00
|
|
|
container_end_mouse_operation(container);
|
|
|
|
|
2018-06-06 22:57:34 +10:00
|
|
|
ipc_event_window(container, "floating");
|
2018-05-24 22:30:44 +10:00
|
|
|
}
|
|
|
|
|
Move view {x,y,width,height} into container struct
This renames/moves the following properties:
* sway_view.{x,y,width,height} ->
sway_container.content_{x,y,width,height}
* This is required to support placeholder containers as they don't
have a view.
* sway_container_state.view_{x,y,width,height} ->
sway_container_state.content_{x,y,width,height}
* To remain consistent with the above.
* sway_container_state.con_{x,y,width,height} ->
sway_container_state.{x,y,width,height}
* The con prefix was there to give it contrast from the view
properties, and is no longer useful.
The function container_set_geometry_from_floating_view has also been
renamed to container_set_geometry_from_content.
2018-11-17 19:32:03 +11:00
|
|
|
void container_set_geometry_from_content(struct sway_container *con) {
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
if (!sway_assert(con->view, "Expected a view")) {
|
2018-05-24 22:30:44 +10:00
|
|
|
return;
|
|
|
|
}
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
if (!sway_assert(container_is_floating(con), "Expected a floating view")) {
|
2018-05-24 22:30:44 +10:00
|
|
|
return;
|
|
|
|
}
|
2018-07-17 10:14:33 +10:00
|
|
|
size_t border_width = 0;
|
|
|
|
size_t top = 0;
|
|
|
|
|
2021-07-06 23:29:45 +10:00
|
|
|
if (con->pending.border != B_CSD && !con->pending.fullscreen_mode) {
|
2021-02-13 09:22:51 +11:00
|
|
|
border_width = con->pending.border_thickness * (con->pending.border != B_NONE);
|
|
|
|
top = con->pending.border == B_NORMAL ?
|
2018-07-17 10:14:33 +10:00
|
|
|
container_titlebar_height() : border_width;
|
|
|
|
}
|
2018-05-24 22:30:44 +10:00
|
|
|
|
2021-02-13 09:22:51 +11:00
|
|
|
con->pending.x = con->pending.content_x - border_width;
|
|
|
|
con->pending.y = con->pending.content_y - top;
|
|
|
|
con->pending.width = con->pending.content_width + border_width * 2;
|
|
|
|
con->pending.height = top + con->pending.content_height + border_width;
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
node_set_dirty(&con->node);
|
2018-05-24 22:30:44 +10:00
|
|
|
}
|
|
|
|
|
2018-05-25 09:26:23 +10:00
|
|
|
bool container_is_floating(struct sway_container *container) {
|
2021-02-13 09:22:51 +11:00
|
|
|
if (!container->pending.parent && container->pending.workspace &&
|
|
|
|
list_find(container->pending.workspace->floating, container) != -1) {
|
2018-10-23 01:02:08 +11:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
if (container->scratchpad) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
2018-05-24 22:30:44 +10:00
|
|
|
}
|
2018-06-03 16:35:06 +10:00
|
|
|
|
2021-02-23 05:33:08 +11:00
|
|
|
bool container_is_current_floating(struct sway_container *container) {
|
|
|
|
if (!container->current.parent && container->current.workspace &&
|
|
|
|
list_find(container->current.workspace->floating, container) != -1) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
if (container->scratchpad) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2018-06-27 17:47:41 +10:00
|
|
|
void container_get_box(struct sway_container *container, struct wlr_box *box) {
|
2021-02-13 09:22:51 +11:00
|
|
|
box->x = container->pending.x;
|
|
|
|
box->y = container->pending.y;
|
|
|
|
box->width = container->pending.width;
|
|
|
|
box->height = container->pending.height;
|
2018-06-03 16:35:06 +10:00
|
|
|
}
|
2018-07-07 18:36:20 +10:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Translate the container's position as well as all children.
|
|
|
|
*/
|
2018-07-18 16:13:28 +10:00
|
|
|
void container_floating_translate(struct sway_container *con,
|
2018-07-07 18:36:20 +10:00
|
|
|
double x_amount, double y_amount) {
|
2021-02-13 09:22:51 +11:00
|
|
|
con->pending.x += x_amount;
|
|
|
|
con->pending.y += y_amount;
|
|
|
|
con->pending.content_x += x_amount;
|
|
|
|
con->pending.content_y += y_amount;
|
|
|
|
|
|
|
|
if (con->pending.children) {
|
|
|
|
for (int i = 0; i < con->pending.children->length; ++i) {
|
|
|
|
struct sway_container *child = con->pending.children->items[i];
|
2018-07-07 18:36:20 +10:00
|
|
|
container_floating_translate(child, x_amount, y_amount);
|
|
|
|
}
|
|
|
|
}
|
Move view {x,y,width,height} into container struct
This renames/moves the following properties:
* sway_view.{x,y,width,height} ->
sway_container.content_{x,y,width,height}
* This is required to support placeholder containers as they don't
have a view.
* sway_container_state.view_{x,y,width,height} ->
sway_container_state.content_{x,y,width,height}
* To remain consistent with the above.
* sway_container_state.con_{x,y,width,height} ->
sway_container_state.{x,y,width,height}
* The con prefix was there to give it contrast from the view
properties, and is no longer useful.
The function container_set_geometry_from_floating_view has also been
renamed to container_set_geometry_from_content.
2018-11-17 19:32:03 +11:00
|
|
|
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
node_set_dirty(&con->node);
|
2018-07-07 18:36:20 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Choose an output for the floating container's new position.
|
|
|
|
*
|
|
|
|
* If the center of the container intersects an output then we'll choose that
|
|
|
|
* one, otherwise we'll choose whichever output is closest to the container's
|
|
|
|
* center.
|
|
|
|
*/
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
struct sway_output *container_floating_find_output(struct sway_container *con) {
|
2021-02-13 09:22:51 +11:00
|
|
|
double center_x = con->pending.x + con->pending.width / 2;
|
|
|
|
double center_y = con->pending.y + con->pending.height / 2;
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
struct sway_output *closest_output = NULL;
|
2018-07-07 18:36:20 +10:00
|
|
|
double closest_distance = DBL_MAX;
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
for (int i = 0; i < root->outputs->length; ++i) {
|
|
|
|
struct sway_output *output = root->outputs->items[i];
|
2018-07-07 18:36:20 +10:00
|
|
|
struct wlr_box output_box;
|
|
|
|
double closest_x, closest_y;
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
output_get_box(output, &output_box);
|
2018-07-07 18:36:20 +10:00
|
|
|
wlr_box_closest_point(&output_box, center_x, center_y,
|
|
|
|
&closest_x, &closest_y);
|
|
|
|
if (center_x == closest_x && center_y == closest_y) {
|
|
|
|
// The center of the floating container is on this output
|
|
|
|
return output;
|
|
|
|
}
|
|
|
|
double x_dist = closest_x - center_x;
|
|
|
|
double y_dist = closest_y - center_y;
|
|
|
|
double distance = x_dist * x_dist + y_dist * y_dist;
|
|
|
|
if (distance < closest_distance) {
|
|
|
|
closest_output = output;
|
|
|
|
closest_distance = distance;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return closest_output;
|
|
|
|
}
|
|
|
|
|
|
|
|
void container_floating_move_to(struct sway_container *con,
|
|
|
|
double lx, double ly) {
|
2018-07-09 23:41:00 +10:00
|
|
|
if (!sway_assert(container_is_floating(con),
|
|
|
|
"Expected a floating container")) {
|
|
|
|
return;
|
|
|
|
}
|
2021-02-13 09:22:51 +11:00
|
|
|
container_floating_translate(con, lx - con->pending.x, ly - con->pending.y);
|
2019-08-20 08:01:17 +10:00
|
|
|
if (container_is_scratchpad_hidden(con)) {
|
|
|
|
return;
|
|
|
|
}
|
2021-02-13 09:22:51 +11:00
|
|
|
struct sway_workspace *old_workspace = con->pending.workspace;
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
struct sway_output *new_output = container_floating_find_output(con);
|
2018-07-07 18:36:20 +10:00
|
|
|
if (!sway_assert(new_output, "Unable to find any output")) {
|
|
|
|
return;
|
|
|
|
}
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
struct sway_workspace *new_workspace =
|
|
|
|
output_get_active_workspace(new_output);
|
2019-02-22 05:24:13 +11:00
|
|
|
if (new_workspace && old_workspace != new_workspace) {
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
container_detach(con);
|
2018-08-19 15:07:07 +10:00
|
|
|
workspace_add_floating(new_workspace, con);
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
arrange_workspace(old_workspace);
|
|
|
|
arrange_workspace(new_workspace);
|
2018-07-16 13:15:35 +10:00
|
|
|
workspace_detect_urgent(old_workspace);
|
|
|
|
workspace_detect_urgent(new_workspace);
|
2018-07-14 23:14:55 +10:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-08-04 14:46:27 +10:00
|
|
|
void container_floating_move_to_center(struct sway_container *con) {
|
|
|
|
if (!sway_assert(container_is_floating(con),
|
|
|
|
"Expected a floating container")) {
|
|
|
|
return;
|
|
|
|
}
|
2021-02-13 09:22:51 +11:00
|
|
|
struct sway_workspace *ws = con->pending.workspace;
|
|
|
|
double new_lx = ws->x + (ws->width - con->pending.width) / 2;
|
|
|
|
double new_ly = ws->y + (ws->height - con->pending.height) / 2;
|
|
|
|
container_floating_translate(con, new_lx - con->pending.x, new_ly - con->pending.y);
|
2018-08-04 14:46:27 +10:00
|
|
|
}
|
|
|
|
|
2018-08-17 19:48:34 +10:00
|
|
|
static bool find_urgent_iterator(struct sway_container *con, void *data) {
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
return con->view && view_is_urgent(con->view);
|
2018-07-16 14:30:31 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
bool container_has_urgent_child(struct sway_container *container) {
|
2018-08-17 19:48:34 +10:00
|
|
|
return container_find_child(container, find_urgent_iterator, NULL);
|
2018-07-16 14:30:31 +10:00
|
|
|
}
|
2018-07-18 16:13:28 +10:00
|
|
|
|
|
|
|
void container_end_mouse_operation(struct sway_container *container) {
|
|
|
|
struct sway_seat *seat;
|
2018-10-18 22:20:00 +11:00
|
|
|
wl_list_for_each(seat, &server.input->seats, link) {
|
2019-01-10 23:04:42 +11:00
|
|
|
seatop_unref(seat, container);
|
2018-07-18 16:13:28 +10:00
|
|
|
}
|
|
|
|
}
|
2018-07-25 20:56:23 +10:00
|
|
|
|
2021-06-08 02:58:20 +10:00
|
|
|
static bool devid_from_fd(int fd, dev_t *devid) {
|
|
|
|
struct stat stat;
|
|
|
|
if (fstat(fd, &stat) != 0) {
|
|
|
|
sway_log_errno(SWAY_ERROR, "fstat failed");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
*devid = stat.st_rdev;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2021-04-03 14:14:01 +11:00
|
|
|
static void set_fullscreen(struct sway_container *con, bool enable) {
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
if (!con->view) {
|
2018-07-25 20:56:23 +10:00
|
|
|
return;
|
|
|
|
}
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
if (con->view->impl->set_fullscreen) {
|
2021-04-03 14:14:01 +11:00
|
|
|
con->view->impl->set_fullscreen(con->view, enable);
|
2020-07-31 08:52:45 +10:00
|
|
|
if (con->view->foreign_toplevel) {
|
|
|
|
wlr_foreign_toplevel_handle_v1_set_fullscreen(
|
2021-04-03 14:14:01 +11:00
|
|
|
con->view->foreign_toplevel, enable);
|
2020-07-31 08:52:45 +10:00
|
|
|
}
|
2018-07-25 20:56:23 +10:00
|
|
|
}
|
2021-06-08 02:58:20 +10:00
|
|
|
|
|
|
|
if (!server.linux_dmabuf_v1 || !con->view->surface) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (!enable) {
|
|
|
|
wlr_linux_dmabuf_v1_set_surface_feedback(server.linux_dmabuf_v1,
|
|
|
|
con->view->surface, NULL);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!con->pending.workspace || !con->pending.workspace->output) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct sway_output *output = con->pending.workspace->output;
|
|
|
|
struct wlr_output *wlr_output = output->wlr_output;
|
|
|
|
|
|
|
|
// TODO: add wlroots helpers for all of this stuff
|
|
|
|
|
|
|
|
const struct wlr_drm_format_set *renderer_formats =
|
2022-08-13 16:14:23 +10:00
|
|
|
wlr_renderer_get_dmabuf_texture_formats(server.wlr_renderer);
|
2021-06-08 02:58:20 +10:00
|
|
|
assert(renderer_formats);
|
|
|
|
|
2022-08-13 16:14:23 +10:00
|
|
|
int renderer_drm_fd = wlr_renderer_get_drm_fd(server.wlr_renderer);
|
2021-06-08 02:58:20 +10:00
|
|
|
int backend_drm_fd = wlr_backend_get_drm_fd(wlr_output->backend);
|
|
|
|
if (renderer_drm_fd < 0 || backend_drm_fd < 0) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
dev_t render_dev, scanout_dev;
|
|
|
|
if (!devid_from_fd(renderer_drm_fd, &render_dev) ||
|
|
|
|
!devid_from_fd(backend_drm_fd, &scanout_dev)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const struct wlr_drm_format_set *output_formats =
|
|
|
|
wlr_output_get_primary_formats(output->wlr_output,
|
|
|
|
WLR_BUFFER_CAP_DMABUF);
|
|
|
|
if (!output_formats) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct wlr_drm_format_set scanout_formats = {0};
|
|
|
|
if (!wlr_drm_format_set_intersect(&scanout_formats,
|
|
|
|
output_formats, renderer_formats)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct wlr_linux_dmabuf_feedback_v1_tranche tranches[] = {
|
|
|
|
{
|
|
|
|
.target_device = scanout_dev,
|
|
|
|
.flags = ZWP_LINUX_DMABUF_FEEDBACK_V1_TRANCHE_FLAGS_SCANOUT,
|
|
|
|
.formats = &scanout_formats,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.target_device = render_dev,
|
|
|
|
.formats = renderer_formats,
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
const struct wlr_linux_dmabuf_feedback_v1 feedback = {
|
|
|
|
.main_device = render_dev,
|
|
|
|
.tranches = tranches,
|
|
|
|
.tranches_len = sizeof(tranches) / sizeof(tranches[0]),
|
|
|
|
};
|
|
|
|
wlr_linux_dmabuf_v1_set_surface_feedback(server.linux_dmabuf_v1,
|
|
|
|
con->view->surface, &feedback);
|
|
|
|
|
|
|
|
wlr_drm_format_set_finish(&scanout_formats);
|
2018-07-25 20:56:23 +10:00
|
|
|
}
|
|
|
|
|
2019-01-25 09:29:21 +11:00
|
|
|
static void container_fullscreen_workspace(struct sway_container *con) {
|
2021-02-13 09:22:51 +11:00
|
|
|
if (!sway_assert(con->pending.fullscreen_mode == FULLSCREEN_NONE,
|
2019-01-25 09:29:21 +11:00
|
|
|
"Expected a non-fullscreen container")) {
|
2018-07-25 20:56:23 +10:00
|
|
|
return;
|
|
|
|
}
|
2021-04-03 14:14:01 +11:00
|
|
|
set_fullscreen(con, true);
|
2021-02-13 09:22:51 +11:00
|
|
|
con->pending.fullscreen_mode = FULLSCREEN_WORKSPACE;
|
2018-07-25 20:56:23 +10:00
|
|
|
|
2021-02-13 09:22:51 +11:00
|
|
|
con->saved_x = con->pending.x;
|
|
|
|
con->saved_y = con->pending.y;
|
|
|
|
con->saved_width = con->pending.width;
|
|
|
|
con->saved_height = con->pending.height;
|
2019-01-25 09:29:21 +11:00
|
|
|
|
2021-02-13 09:22:51 +11:00
|
|
|
if (con->pending.workspace) {
|
|
|
|
con->pending.workspace->fullscreen = con;
|
2019-04-01 14:27:18 +11:00
|
|
|
struct sway_seat *seat;
|
|
|
|
struct sway_workspace *focus_ws;
|
|
|
|
wl_list_for_each(seat, &server.input->seats, link) {
|
|
|
|
focus_ws = seat_get_focused_workspace(seat);
|
2021-02-13 09:22:51 +11:00
|
|
|
if (focus_ws == con->pending.workspace) {
|
2019-04-01 14:27:18 +11:00
|
|
|
seat_set_focus_container(seat, con);
|
2020-01-14 13:11:11 +11:00
|
|
|
} else {
|
|
|
|
struct sway_node *focus =
|
|
|
|
seat_get_focus_inactive(seat, &root->node);
|
|
|
|
seat_set_raw_focus(seat, &con->node);
|
|
|
|
seat_set_raw_focus(seat, focus);
|
2019-04-01 14:27:18 +11:00
|
|
|
}
|
2019-01-25 09:29:21 +11:00
|
|
|
}
|
2018-07-25 20:56:23 +10:00
|
|
|
}
|
|
|
|
|
2019-01-25 09:29:21 +11:00
|
|
|
container_end_mouse_operation(con);
|
|
|
|
ipc_event_window(con, "fullscreen_mode");
|
|
|
|
}
|
|
|
|
|
|
|
|
static void container_fullscreen_global(struct sway_container *con) {
|
2021-02-13 09:22:51 +11:00
|
|
|
if (!sway_assert(con->pending.fullscreen_mode == FULLSCREEN_NONE,
|
2019-01-25 09:29:21 +11:00
|
|
|
"Expected a non-fullscreen container")) {
|
|
|
|
return;
|
|
|
|
}
|
2021-04-03 14:14:01 +11:00
|
|
|
set_fullscreen(con, true);
|
2018-07-25 20:56:23 +10:00
|
|
|
|
2019-01-25 09:29:21 +11:00
|
|
|
root->fullscreen_global = con;
|
2021-02-13 09:22:51 +11:00
|
|
|
con->saved_x = con->pending.x;
|
|
|
|
con->saved_y = con->pending.y;
|
|
|
|
con->saved_width = con->pending.width;
|
|
|
|
con->saved_height = con->pending.height;
|
2018-07-25 20:56:23 +10:00
|
|
|
|
2019-01-25 09:29:21 +11:00
|
|
|
struct sway_seat *seat;
|
|
|
|
wl_list_for_each(seat, &server.input->seats, link) {
|
|
|
|
struct sway_container *focus = seat_get_focused_container(seat);
|
|
|
|
if (focus && focus != con) {
|
|
|
|
seat_set_focus_container(seat, con);
|
2018-07-25 20:56:23 +10:00
|
|
|
}
|
2019-01-25 09:29:21 +11:00
|
|
|
}
|
|
|
|
|
2021-02-13 09:22:51 +11:00
|
|
|
con->pending.fullscreen_mode = FULLSCREEN_GLOBAL;
|
2019-01-25 09:29:21 +11:00
|
|
|
container_end_mouse_operation(con);
|
|
|
|
ipc_event_window(con, "fullscreen_mode");
|
|
|
|
}
|
|
|
|
|
|
|
|
void container_fullscreen_disable(struct sway_container *con) {
|
2021-02-13 09:22:51 +11:00
|
|
|
if (!sway_assert(con->pending.fullscreen_mode != FULLSCREEN_NONE,
|
2019-01-25 09:29:21 +11:00
|
|
|
"Expected a fullscreen container")) {
|
|
|
|
return;
|
|
|
|
}
|
2021-04-03 14:14:01 +11:00
|
|
|
set_fullscreen(con, false);
|
2019-01-25 09:29:21 +11:00
|
|
|
|
|
|
|
if (container_is_floating(con)) {
|
2021-02-13 09:22:51 +11:00
|
|
|
con->pending.x = con->saved_x;
|
|
|
|
con->pending.y = con->saved_y;
|
|
|
|
con->pending.width = con->saved_width;
|
|
|
|
con->pending.height = con->saved_height;
|
2019-01-25 09:29:21 +11:00
|
|
|
}
|
|
|
|
|
2021-02-13 09:22:51 +11:00
|
|
|
if (con->pending.fullscreen_mode == FULLSCREEN_WORKSPACE) {
|
|
|
|
if (con->pending.workspace) {
|
|
|
|
con->pending.workspace->fullscreen = NULL;
|
2019-04-01 14:27:18 +11:00
|
|
|
if (container_is_floating(con)) {
|
|
|
|
struct sway_output *output =
|
|
|
|
container_floating_find_output(con);
|
2021-02-13 09:22:51 +11:00
|
|
|
if (con->pending.workspace->output != output) {
|
2019-04-01 14:27:18 +11:00
|
|
|
container_floating_move_to_center(con);
|
|
|
|
}
|
2018-08-07 09:30:27 +10:00
|
|
|
}
|
2018-07-25 20:56:23 +10:00
|
|
|
}
|
2019-01-25 09:29:21 +11:00
|
|
|
} else {
|
|
|
|
root->fullscreen_global = NULL;
|
2018-07-25 20:56:23 +10:00
|
|
|
}
|
|
|
|
|
2019-03-11 09:43:22 +11:00
|
|
|
// If the container was mapped as fullscreen and set as floating by
|
|
|
|
// criteria, it needs to be reinitialized as floating to get the proper
|
|
|
|
// size and location
|
2021-02-13 09:22:51 +11:00
|
|
|
if (container_is_floating(con) && (con->pending.width == 0 || con->pending.height == 0)) {
|
2019-03-28 05:00:19 +11:00
|
|
|
container_floating_resize_and_center(con);
|
2019-03-11 09:43:22 +11:00
|
|
|
}
|
|
|
|
|
2021-02-13 09:22:51 +11:00
|
|
|
con->pending.fullscreen_mode = FULLSCREEN_NONE;
|
2019-01-25 09:29:21 +11:00
|
|
|
container_end_mouse_operation(con);
|
|
|
|
ipc_event_window(con, "fullscreen_mode");
|
2019-04-01 14:27:18 +11:00
|
|
|
|
|
|
|
if (con->scratchpad) {
|
|
|
|
struct sway_seat *seat;
|
|
|
|
wl_list_for_each(seat, &server.input->seats, link) {
|
|
|
|
struct sway_container *focus = seat_get_focused_container(seat);
|
|
|
|
if (focus == con || container_has_ancestor(focus, con)) {
|
|
|
|
seat_set_focus(seat,
|
|
|
|
seat_get_focus_inactive(seat, &root->node));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2019-01-25 09:29:21 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
void container_set_fullscreen(struct sway_container *con,
|
|
|
|
enum sway_fullscreen_mode mode) {
|
2021-02-13 09:22:51 +11:00
|
|
|
if (con->pending.fullscreen_mode == mode) {
|
2019-01-25 09:29:21 +11:00
|
|
|
return;
|
|
|
|
}
|
2018-07-25 20:56:23 +10:00
|
|
|
|
2019-01-25 09:29:21 +11:00
|
|
|
switch (mode) {
|
|
|
|
case FULLSCREEN_NONE:
|
|
|
|
container_fullscreen_disable(con);
|
|
|
|
break;
|
|
|
|
case FULLSCREEN_WORKSPACE:
|
|
|
|
if (root->fullscreen_global) {
|
|
|
|
container_fullscreen_disable(root->fullscreen_global);
|
|
|
|
}
|
2021-02-13 09:22:51 +11:00
|
|
|
if (con->pending.workspace && con->pending.workspace->fullscreen) {
|
|
|
|
container_fullscreen_disable(con->pending.workspace->fullscreen);
|
2019-01-25 09:29:21 +11:00
|
|
|
}
|
|
|
|
container_fullscreen_workspace(con);
|
|
|
|
break;
|
|
|
|
case FULLSCREEN_GLOBAL:
|
|
|
|
if (root->fullscreen_global) {
|
|
|
|
container_fullscreen_disable(root->fullscreen_global);
|
|
|
|
}
|
2021-02-13 09:22:51 +11:00
|
|
|
if (con->pending.fullscreen_mode == FULLSCREEN_WORKSPACE) {
|
2019-01-25 09:29:21 +11:00
|
|
|
container_fullscreen_disable(con);
|
|
|
|
}
|
|
|
|
container_fullscreen_global(con);
|
|
|
|
break;
|
|
|
|
}
|
2018-07-25 20:56:23 +10:00
|
|
|
}
|
|
|
|
|
2020-06-05 04:28:43 +10:00
|
|
|
struct sway_container *container_toplevel_ancestor(
|
|
|
|
struct sway_container *container) {
|
2021-02-13 09:22:51 +11:00
|
|
|
while (container->pending.parent) {
|
|
|
|
container = container->pending.parent;
|
2018-08-19 15:07:07 +10:00
|
|
|
}
|
2020-06-05 04:28:43 +10:00
|
|
|
|
|
|
|
return container;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool container_is_floating_or_child(struct sway_container *container) {
|
|
|
|
return container_is_floating(container_toplevel_ancestor(container));
|
2018-07-26 18:36:46 +10:00
|
|
|
}
|
|
|
|
|
2018-07-25 20:56:23 +10:00
|
|
|
bool container_is_fullscreen_or_child(struct sway_container *container) {
|
|
|
|
do {
|
2021-02-13 09:22:51 +11:00
|
|
|
if (container->pending.fullscreen_mode) {
|
2018-07-25 20:56:23 +10:00
|
|
|
return true;
|
|
|
|
}
|
2021-02-13 09:22:51 +11:00
|
|
|
container = container->pending.parent;
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
} while (container);
|
2018-07-25 20:56:23 +10:00
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
2018-08-19 11:01:51 +10:00
|
|
|
|
|
|
|
static void surface_send_enter_iterator(struct wlr_surface *surface,
|
|
|
|
int x, int y, void *data) {
|
|
|
|
struct wlr_output *wlr_output = data;
|
|
|
|
wlr_surface_send_enter(surface, wlr_output);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void surface_send_leave_iterator(struct wlr_surface *surface,
|
|
|
|
int x, int y, void *data) {
|
|
|
|
struct wlr_output *wlr_output = data;
|
|
|
|
wlr_surface_send_leave(surface, wlr_output);
|
|
|
|
}
|
|
|
|
|
|
|
|
void container_discover_outputs(struct sway_container *con) {
|
|
|
|
struct wlr_box con_box = {
|
Move view {x,y,width,height} into container struct
This renames/moves the following properties:
* sway_view.{x,y,width,height} ->
sway_container.content_{x,y,width,height}
* This is required to support placeholder containers as they don't
have a view.
* sway_container_state.view_{x,y,width,height} ->
sway_container_state.content_{x,y,width,height}
* To remain consistent with the above.
* sway_container_state.con_{x,y,width,height} ->
sway_container_state.{x,y,width,height}
* The con prefix was there to give it contrast from the view
properties, and is no longer useful.
The function container_set_geometry_from_floating_view has also been
renamed to container_set_geometry_from_content.
2018-11-17 19:32:03 +11:00
|
|
|
.x = con->current.x,
|
|
|
|
.y = con->current.y,
|
|
|
|
.width = con->current.width,
|
|
|
|
.height = con->current.height,
|
2018-08-19 11:01:51 +10:00
|
|
|
};
|
|
|
|
struct sway_output *old_output = container_get_effective_output(con);
|
|
|
|
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
for (int i = 0; i < root->outputs->length; ++i) {
|
|
|
|
struct sway_output *output = root->outputs->items[i];
|
2018-08-19 11:01:51 +10:00
|
|
|
struct wlr_box output_box;
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
output_get_box(output, &output_box);
|
2018-08-19 11:01:51 +10:00
|
|
|
struct wlr_box intersection;
|
|
|
|
bool intersects =
|
2018-12-23 03:59:41 +11:00
|
|
|
wlr_box_intersection(&intersection, &con_box, &output_box);
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
int index = list_find(con->outputs, output);
|
2018-08-19 11:01:51 +10:00
|
|
|
|
|
|
|
if (intersects && index == -1) {
|
|
|
|
// Send enter
|
2019-01-21 05:51:12 +11:00
|
|
|
sway_log(SWAY_DEBUG, "Container %p entered output %p", con, output);
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
if (con->view) {
|
|
|
|
view_for_each_surface(con->view,
|
|
|
|
surface_send_enter_iterator, output->wlr_output);
|
2019-08-20 19:30:09 +10:00
|
|
|
if (con->view->foreign_toplevel) {
|
|
|
|
wlr_foreign_toplevel_handle_v1_output_enter(
|
|
|
|
con->view->foreign_toplevel, output->wlr_output);
|
|
|
|
}
|
2018-08-19 11:01:51 +10:00
|
|
|
}
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
list_add(con->outputs, output);
|
2018-08-19 11:01:51 +10:00
|
|
|
} else if (!intersects && index != -1) {
|
|
|
|
// Send leave
|
2019-01-21 05:51:12 +11:00
|
|
|
sway_log(SWAY_DEBUG, "Container %p left output %p", con, output);
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
if (con->view) {
|
|
|
|
view_for_each_surface(con->view,
|
|
|
|
surface_send_leave_iterator, output->wlr_output);
|
2019-08-20 19:30:09 +10:00
|
|
|
if (con->view->foreign_toplevel) {
|
|
|
|
wlr_foreign_toplevel_handle_v1_output_leave(
|
|
|
|
con->view->foreign_toplevel, output->wlr_output);
|
|
|
|
}
|
2018-08-19 11:01:51 +10:00
|
|
|
}
|
|
|
|
list_del(con->outputs, index);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
struct sway_output *new_output = container_get_effective_output(con);
|
2018-09-25 08:21:22 +10:00
|
|
|
double old_scale = old_output && old_output->enabled ?
|
|
|
|
old_output->wlr_output->scale : -1;
|
2018-08-19 11:01:51 +10:00
|
|
|
double new_scale = new_output ? new_output->wlr_output->scale : -1;
|
|
|
|
if (old_scale != new_scale) {
|
|
|
|
container_update_title_textures(con);
|
2018-10-31 22:27:38 +11:00
|
|
|
container_update_marks_textures(con);
|
2018-08-19 11:01:51 +10:00
|
|
|
}
|
|
|
|
}
|
2018-08-25 12:09:42 +10:00
|
|
|
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
enum sway_container_layout container_parent_layout(struct sway_container *con) {
|
2021-02-13 09:22:51 +11:00
|
|
|
if (con->pending.parent) {
|
|
|
|
return con->pending.parent->pending.layout;
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
}
|
2021-02-13 09:22:51 +11:00
|
|
|
if (con->pending.workspace) {
|
|
|
|
return con->pending.workspace->layout;
|
2019-03-06 20:47:50 +11:00
|
|
|
}
|
|
|
|
return L_NONE;
|
2018-08-25 12:09:42 +10:00
|
|
|
}
|
2018-08-26 12:05:16 +10:00
|
|
|
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
enum sway_container_layout container_current_parent_layout(
|
|
|
|
struct sway_container *con) {
|
|
|
|
if (con->current.parent) {
|
|
|
|
return con->current.parent->current.layout;
|
2018-08-26 12:05:16 +10:00
|
|
|
}
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
return con->current.workspace->current.layout;
|
|
|
|
}
|
|
|
|
|
2019-01-28 20:06:42 +11:00
|
|
|
list_t *container_get_siblings(struct sway_container *container) {
|
2021-02-13 09:22:51 +11:00
|
|
|
if (container->pending.parent) {
|
|
|
|
return container->pending.parent->pending.children;
|
2018-08-26 12:05:16 +10:00
|
|
|
}
|
2019-01-28 20:06:42 +11:00
|
|
|
if (container_is_scratchpad_hidden(container)) {
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
return NULL;
|
2018-08-26 12:05:16 +10:00
|
|
|
}
|
rebase: Sway 1.8 (#78)
* build: bump wlroots dependency to 0.16.0
* swaymsg: replace if with switch in pretty_print
* swaymsg: add GET_TREE pretty-printing
* swaybar: fix errno handling in status_handle_readable
If getline fails once, it was not reset before the next getline
call. errno is only overwritten by getline on error.
* Add cairo_image_surface_create error handling
cairo_image_surface_create can fail, e.g. when running out of
memory or when the size is too big. Avoid crashing in this case.
Closes: https://github.com/swaywm/sway/issues/6531
* build: bump version to 1.8-dev
Historically we've been sticking with the last release number in
the master branch. However that's a bit confusing, people can't
easily figure out whether they're using a release or a work-in-progress
snapshot. Only the commit hash appended to the version number may
help, but that's not very explicit and disappears when using a
tarball.
We could bump the version in master to the next release number.
However during the RC cycle there would be a downgrade from 1.8 to
1.8-rc1. Also it would be hard to tell the difference between a
stable release and an old snapshot.
This patch introduces a new pre-release identifier, "dev". It's
alphabetically before "rc" so it should be correctly sorted by
semver comparisons. "dev" is upgraded to "rc" (and then to stable)
when doing a release. The master branch always uses a "dev"
version, only release branches use "rc" or stable versions.
* [IPC] Add repeat delay/rate info to keyboard
Closes #6735
wlroots already has the info in the struct so let's access it and print it out.
* input/seat: unset has_focus when focus_stack becomes empty
We currently track the focus of a seat in two ways: we use a list called
focus_stack to track the order in which nodes have been focused, with
the first node representing what's currently focused, and we use a
variable called has_focus to indicate whether anything has focus--i.e.
whether we should actually treat that first node as focused at any given
time.
In a number of places, we treat has_focus as implying that a focused
node exists. If it's true, we attempt to dereference the return value of
seat_get_focus(), our helper function for getting the first node in
focus_list, with no further checks. But this isn't quite correct with
the current implementation of seat_get_focus(): not only does it return
NULL when has_focus is false, it also returns NULL when focus_stack
contains no items.
In most cases, focus_stack never becomes empty and so this doesn't
matter at all. Since focus_stack stores a history of focused nodes, we
rarely remove nodes from it. The exception to this is when a node itself
goes away. In that case, we call seat_node_destroy() to remove it from
focus_stack and free it. But we don't unset has_focus if we've removed
the final node! This lets us get into a state where has_focus is true
but seat_get_focus() returns NULL, leading to a segfault when we try to
dereference it.
Fix the issue both by updating has_focus in seat_node_destroy() and by
adding an assertion in seat_get_focus() that ensures focus_stack and
has_focus are in sync, which will make it easier to track down similar
issues in the future.
Fixes #6395.
[1] There's some discussion in #1585 from when this was implemented
about whether has_focus is actually necessary; it's possible we could
remove it entirely, but for the moment this is the architecture we have.
* swaybar: fix tray_padding vs min-height re: scale
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
* swaybar: fix tray item icon scaling, positioning
* container: Fix crash when view unmaps + maps quickly
Followup on 4e4898e90f.
If a view quickly maps and unmaps repeatedly, there will be multiple
destroyed containers with same view in a single transaction. Each of
these containers will then try to destroy this view, resulting in use
after free.
The container should only destroy the view if the view still belongs
to the container.
Simple reproducer: couple XMapWindow + XUnmapWindow in a loop followed
by XDestroyWindow.
See #6605
* commands/move: Fix crash when pos_y is omitted
Fixes #6737
* Destroy sub-surfaces with parent layer-shell surface
Closes: https://github.com/swaywm/sway/issues/6337
* Add safety assert in parse_movement_unit
Let's add this just in case a caller passes argc == 0.
References: https://github.com/swaywm/sway/issues/6737#issuecomment-1008082540
* meson: check: false on run_command
Future meson releases will change the default and warns when the
implicit default is used, breaking builds.
Explicitly set check: false to maintain behavior and silence warnings.
* Print deprecation notice when running SUID
SUID privilege drop is needed for the "builtin"-backend of libseat,
which copied our old "direct" backend behavior for the sake of
compatibility and ease of transition.
libseat now has a better alternative in the form of seatd-launch. It
uses the normal seatd daemon and libseat backend and takes care of SUID
for us.
Add a soft deprecation warning to highlight our future intent of
removing this code. The deprecation cycle is needed to avoid surprises
when sway no longer drops privileges.
* xdg-shell: use toplevel geometry to adjust the popup box
`popup_unconstrain` uses view coordinates to init the output box for
popups. However wlroots expects the box to be set in a toplevel surface
coordinate system, which is not always equal to view. The difference
between those is a window geometry set via xdg-shell.
GTK4 reserves some space for client-side decoration and thus has a
window with top left corner not matching to (0, 0) of a surface. The box
calculated without taking that into account was slightly shifted
compared to the actual output and allowed to position part of the popup
off screen.
* build: fix building with basu
02b412a introduced the use of list for sdbus deps, however
it was assuming that all packages which were in a list has a version
higher than 239. That is true for libsystemd and libelogind, since they
use the same versions, however basu is using version numbers which are
way lower than what libsystemd/libelogind are using, so basu only build
is failing.
* Upgrade for wlroots surface refactoring
See [1] for details.
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3412
* commands/focus: drop trailing whitespace
* input/cursor: count pointer gestures as idle activity
Fixes https://github.com/swaywm/sway/issues/6765.
* input/cursor: treat swipe begin as idle activity too
Accidentally overlooked in fd53f80.
* treat fullscreen windows as 'tiled' for commands/focus
* transaction: destroying nodes aren't hidden
Commit 37d7bc69986f ("transaction: Only wait for ack from visible
views") introduced a check which uses view_is_visible() to check if a view
is still visible on the screen. However view_is_visible() will early
return in case the node is in the destroying state. This is incorrect
for transactions, since a destroying view which is visible will trigger
configure events for other clients. This bug was visible when repeatedly
opening and closing two views side by side, since we ignore the
destroying node we get a frame where the still open view is shown with
the old configure values and the rest is the desktop background. The
next frame is than correct again.
Fix this by considering destroying views as visible, we correctly wait
for them and send the configure events to other views in time, fixing
the background flicker.
Fixes #6473
* build: execute wlroots subproject before finding deps
wlroots often requires dependencies more recent than Sway's.
Executing the wlroots subproject first will give Meson a chance to
find these newer dependencies, possibly via subprojects.
The subproject will override the "wlroots" dependency when executed,
so we don't need to use get_variable anymore.
References: https://github.com/swaywm/sway/pull/6498#issuecomment-1001746017
* tray: do not render passive items
https://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/StatusNotifierItem/#org.freedesktop.statusnotifieritem.status
* cmd/swap: error on swapping a container with itself
* input/cursor: pass through pointer hold gestures
This just follows swaywm/wlroots#3047, so `wl_pointer_gestures_v1`
clients can be notified of these events.
* swaynag: remove buffer destruction condition
An address of a variable can never be NULL, so checking it doesn't make
sense; and `destroy_buffer()` can operate on already destroyed buffers
anyway.
Fixes #6780
* Use bools for CLI flags
* xwayland: listen to `request_activate` event
When REAPER submenu is closed `XCB_CLIENT_MESSAGE` with type
`NET_ACTIVE_WINDOW` is sent to set focus to parent menu.
Closes: https://github.com/swaywm/sway/issues/6324
* chore: chase wlr_output_layout_get_box() update
https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3439
* Chase wlroots xdg-shell refactor
* Minor update to focus_on_window_activation
Removed xwayland limitation since wayland clients are supported via xdg-activation.
* Translated README into Italian
* readme: add link to Italian translation
* readme: sort language list alphabetically
* readme: use relative links for translations
* xdg-shell: use wlr_xdg_toplevel in sway_view
Improved type safety.
Closes: https://github.com/swaywm/sway/issues/6813
* xdg-shell: use wlr_xdg_popup in sway_xdg_popup
Improved type safety.
* Fix snprintf compiler warning
* Remove all sprintf calls
Replace them with snprintf, which ensures buffer overflows won't
happen.
* sway/commands: add missing wlr_keyboard interface include in xkb_switch_layout
* sway/input: use wlr_input_device from input device base
* Remove some erroneous apostrophes in comments
* Don't enter seatop_move_floating when fullscreen
Currently, a floating window that's been fullscreened can send us
xdg_toplevel::move, and we'll enter seatop_move_floating, which lets us
drag the surface around while it's fullscreen. We don't want
this--fullscreen surfaces should always be aligned to the screen--so add
the same check that seatop_default already does when entering this mode.
Tested with Weston's weston-fullscreen demo, which sends a move request
if you click anywhere on its surface.
* swaynag: die on all allocation failures
* sway/input: don't pass possibly invalid modifiers pointer
active_keyboard may be NULL, in which case an invalid pointer could be
passed to wlr_input_method_keyboard_grab_v2_send_modifiers. This
procedure call is unnecessary since wlroots commit 372a52ec "input
method: send modifiers in set_keyboard", so the call can simply be
removed.
Fixes #6836.
* sway/input: destroy sway_switch properly
Fix: #6861
Added seat_device_destroy function to seat_device_destroy function.
* commands/focus: fix segfault when no container is already focused.
Fixes #6690.
* Remove WLR_SWITCH_STATE_TOGGLE usage
Ref [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/commit/4792446ee8f50104bd207d9ccd8558a7e4eb4514
* Replace pcre with pcre2
Closes: https://github.com/swaywm/sway/issues/6838
* swaybar: remove swaybar_output.input_region
No need to keep the region around, we can immediately destroy it
after the wl_surface.set_input_region request.
* swaybar: set opaque region
When the background color is fully opaque, set the surface's opaque
region to the whole surface.
* Updating criteria checking with PCRE2
* swaynag: allocate button_details with details
They are used together, so it doesn't make sense to allocate them
separately.
* swaynag: statically allocate button_close, and move declaration
Every swaynag has a close button, so it doesn't make sense to
allocate it dynamically. The declaration is moved later to when
it is actually needed.
* swaynag: remove unnecessary zero of swaynag struct
Global variables are initialized to 0.
* swaynag: remove redundant status variables in main
Instead, we just use `status` for all failures.
* remove unnecessary strlen call
* sway/input/cursor: take device mm size from wlr_tablet
* sway/input/seat: take output name from specialized input device
* sway/input: follow up wlroots input device events renaming
* sway/input: fix bad position of wlr_drag
* sway/input: wlr_seat_keyboard() now takes wlr_keyboard
* bash-completion: localize variables
* sway/main: move constants off the stack
This makes stack traces from gdb slightly easier to read.
* Fix farsi label
* Avoid format-truncation warning
The existing code gives this error when compiled with GCC 12:
../sway/server.c: In function ‘server_init’:
../sway/server.c:217:75: error: ‘%d’ directive output may be truncated writing between 1 and 11 bytes into a region of size 8 [-Werror=format-truncation=]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~
../sway/server.c:217:66: note: directive argument in the range [-2147483647, 32]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~
../sway/server.c:217:17: note: ‘snprintf’ output between 10 and 20 bytes into a destination of size 16
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Because i is never negative, this is a false positive, but it is easy to
change i to unsigned to silence the error.
* Shuffle variables to satisfy -Werror=restrict
This also fixes an invalid strlen invocation on uninitialized memory.
* layer_shell: keep output non-NULL wherever possible
Our layer shell implementation assigns every layer surface to an output
on creation. It tracks this output using the output field on the
underlying wlr_layer_surface_v1 structure. As such, much of the existing
code assumes that output is always non-NULL and omits NULL checks
accordingly.
However, there are currently two cases where we destroy a
sway_layer_surface and output is NULL. The first is when we can't find
an output to assign the surface to and destroy it immediately after
creation. The second is when we destroy a surface in response to its
output getting destroyed, as we set output to NULL in
handle_output_destroy() before we call wlr_layer_surface_v1_destroy(),
which is what calls the appropriate unmap and destroy callbacks.
The former case doesn't cause any problems, since we haven't even
allocated a sway_layer_surface at that point or registered any
callbacks. The latter case, however, currently triggers a crash (#6120)
if a popup is visible, since our popup_handle_unmap() implementation
can't handle a NULL output.
To fix this issue, keep output set until right before we free the
sway_layer_surface. All we need to do is remove some of the cleanup
logic from handle_output_destroy(), since as of commit c9060bcc12d0
("layer-shell: replace close() with destroy()") that same logic is
guaranteed to be happen later when wlroots calls handle_destroy() as
part of wlr_layer_surface_v1_destroy().
This lets us remove some NULL checks from other unmap/destroy callbacks,
which is nice. We also don't need to check that the wlr_output points to
a valid sway_output anymore, since we unset that pointer after disabling
the output as of commit a0bbe67076b8 ("Address emersions comments on
output re-enabling") Just to be safe, I've added assertions that the
wlr_output is non-NULL wherever we use it.
Fixes #6120.
* Chase wlroots X11 hints update
* Add Swedish README
* Support cursor capture in grimshot
Refactor argument parser
Bring back `sh` compatibility
Default to NOTIFY=no
* Update grimshot.1.scd
Fixed typo. The object is **files**, which is plural. **image** modifies files; it's not countable.
* xkb_switch_layout: fix relative layout switches
Fixes #6011
* Implement ext-session-lock-v1
* Avoid inspecting a NULL view in seat_set_focus
Fixes #6968
* swaynag: do error checking and rename read_from_stdin
read_from_stdin not only read from stdin, but trimming trailing
newlines, so rename it to reflect this.
* swaynag: improve robustness when loading config
* swaynag: combine consecutive declaration/assignments
* config: Remove unused mouse binding structure
Mouse bindings are handled alongside normal bindings. Remove the unused
separate data structure definition to avoid confusion.
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
* Replace strncpy with memcpy
strncpy is useless here, is dangerous because it doesn't guarantee
that the string is NUL-terminated and causes the following warning:
../sway/criteria.c: In function ‘criteria_parse’:
../sway/criteria.c:712:25: error: ‘strncpy’ destination unchanged after copying no bytes [-Werror=stringop-truncation]
712 | strncpy(value, valuestart, head - valuestart);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Add descriptions for `stacking` and `tabbed` layouts
Resolves #5918
* man: Fix trailing spaces
* server: request xdg-shell v2
Wlroots does not yet support the newer xdg-shell versions and now
requires the compositor to set the supported xdg-shell version during
creation. Set this to v2 for sway as well.
Fixes https://github.com/swaywm/sway/issues/7001
* realtime: request SCHED_RR using CAP_SYS_NICE
Try to gain SCHED_RR (round-robin) realtime scheduling privileges before
starting the server. This requires CAP_SYS_NICE on Linux systems.
We additionally register a pthread_atfork callback which resets the
scheduling class back to SCHED_OTHER (the Linux system default).
Due to CAP_SYS_NICE, setting RLIMIT_RTPRIO has no effect on the process
as documented within man 7 sched (from Linux):
Privileged (CAP_SYS_NICE) threads ignore the RLIMIT_RTPRIO limit;
as with older kernels, they can make arbitrary changes to
scheduling policy and priority. See getrlimit(2) for further
information on RLIMIT_RTPRIO
Note that this requires the sway distribution packagers to set the
CAP_SYS_NICE capability on the sway binary.
Supersedes #6992
* ext-session-lock: disable direct scan-out when locked
* Polish the language in README.zh-CN.md & sync with English one
Co-Authored-By: Urey. Xue <urey.s.knowledge@gmail.com>
* De-duplicate IPC output descriptions
* Handle NULL output make/model/serial
* chore: chase wlroots xdg-shell update
* xdg-shell: schedule a configure on maximize request
This commit reverts 03879290dbee26127f6867ef60bc2a7f9a6c8c5f and
fc84bcb7fb0ffa29b1f9bed287762241a3473803.
* Add a Hindi (हिन्दी) translation to the README
Hindi is one of the most prominent languages of the Indian Subcontinent.
This commit adds the translation of the README into the Hindi language.
Some of the words are still written in English because there wasn't an
appropriate technical term of the word in the language.
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
* sway: add bindgesture command
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
* build: link with -pthread
Fixes the following FreeBSD error:
ld: error: undefined symbol: pthread_getschedparam
>>> referenced by realtime.c:25 (../sway/realtime.c:25)
>>> sway/sway.p/realtime.c.o:(set_rr_scheduling)
Fixes: a3a82efbf6b5 ("realtime: request SCHED_RR using CAP_SYS_NICE")
* ipc: remove chatty debug log messages
These aren't particularly useful, and clobber the debug logs.
* Refuse to start when SUID is detected
This ensures that those surprised by the deprecation of SUID operation
receive an error rather than accidentally having sway run as root.
This detection will be removed in a future release.
* swaynag: move close_button up to fix SIGSEGV
When swaynag_parse_options encounters '--dismiss-button' (or its
shorthand '-s'), it sets the text of the first button in the
swaynag.buttons list, which is expected to exist and to be the dismiss
button, to the one passed by the user.
Commit 4780afb68b4ee2cdf0e4925f40cf885819f8a74a ("swaynag: statically
allocate button_close, and move declaration") moved the list
initialization to after swaynag_parse_options is called which made that
code fail.
For example, the command 'swaynag --dismiss-button Dismiss' crashes and
'swaynag --message Message --button Yes "" --dismiss-button Dismiss'
shows the wrong buttons.
Move it back to before swaynag_parse_options is called.
* config/output: use wlr_output_commit_state
This makes the code more robust because we don't potentially leave
bad state in wlr_output.pending behind anymore. This also fixes a
bug.
Closes: https://github.com/swaywm/sway/issues/7043
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3610
* Allocate enough space for `cmd_results->error`
* Remove access to wlr_input_device union
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3626
Closes: https://github.com/swaywm/sway/issues/7077
* Rename dpms output command to power
The "dpms" command refers to VESA Display Power Management
Signaling, a deprecated standard. It's superseded by VESA DPM.
Instead of tying out command name to a particular standard, use the
neutral term "power".
* Strip quotes in bindsym --input-device=...
If the input device is quoted, which is common when using variables in the
config file, those quotes must be ignored here, or the input device will be
ignored.
Fixes #7029.
* Avoid unecessary string copy
* Reject font values that are invalid for pango
Use pango to parse font configuration early, and reject the command as
invalid if the value is invalid for pango. Since we're already parsing
the font into a `PangoFontDescription`, keep that instance around and
avoid re-parsing the font each time we render text.
Fixes: https://github.com/swaywm/sway/issues/6805
* Reuse parsed PangoFontDescription
Avoids parsing the configured font each time text is rendered.
* ipc: add "power" to output reply
* config.in: switch to `output power`
* Remove internal references to DPMS
While at it, use an int for the config field, just like we do for
all other fields.
* fix: remove redundant empty statement in main.c
This semi-colon looks like a typo. Luckily, it has no effect on the code as it's treated as an empty statement leading the switch case.
Really straightforward nitpick change, was just something I was confused by when reading over the code.
* input: chase delta_discrete semantics change
* swaymsg: fix floating_nodes being ignored
Fix floating_nodes being ignored in pretty_print_tree.
* ipc: make get_deco_rect check config->hide_lone_tab
Without this, the `IPC_GET_TREE` ipc call would return false information
about the container's `deco_rect` and `rect` properties if
`hide_edge_borders --i3` was in effect.
* grimshot: fix tilde expansion within quotes
* Enable single-pixel-buffer-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3428
* sway-output.5: improve display of parameter
Since "width" and "height" are separate parameters, show them as such.
* man: sway(5) move fixes
* ipc: drop WLR_OUTPUT_ADAPTIVE_SYNC_UNKNOWN case
This has been removed from wlroots.
* config/output: test adaptive sync
Required for [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3637
* Fix crash in xdg_activation_v1.c
wlr_xdg_surface_from_wlr_surface() can return a NULL pointer, so check for NULL before dereferencing it.
* sway: Add non-desktop-output type
Currently, when encountering a non-desktop display, sway offers the
output for leasing and returns without storing it in a sway specific
output type like `struct sway_output`. Additionally, running
`swaymsg -t get_outputs` doesn't show non-desktop outputs.
This commit stores the non-desktop outputs into a struct called
`sway_output_non_desktop`, and adds them to a list on `sway_root`
* sway: add non-desktop outputs to json when running `swaymsg -t get_outputs`
* swaymsg: show non-desktop property when pretty printing outputs
* man: Add XWayland information
* ipc: expose mode picture aspect ratio
* swaymsg: show mode picture aspect ratio
* build: simplify protocol paths
No need for arrays here.
* sway/commands/output: Add command for unplugging non-physical outputs
* Improve Japanese translation
* allow pointer_constraints on layer_shell surfaces
* check for NULL
* use seat directly
* Use keyboard_state.focused_surface directly
* input: focus floating container when clicked on border
Fixes #7209.
* input: focus container when scrolling on titlebar
Fixes #6503.
* Fix leaks in criteria_destroy()
* Avoid double free in criteria_destroy()
* Add support for ext-idle-notify-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3753
* input: tweak focus behavior to allow focusing parent containers
Sway focuses the inactive child when focusing split containers. However,
there is currently no way to focus the parent container itself by mouse.
A user must use the keyboard to do so.
This commit maintains the current behavior, but makes it such that a
second click on the split container titlebar (i.e., after its children
are visible) focuses the split container itself.
* Fix keymap being NULL and segfaulting on dev add
Moved `libinput_config` to the callers of
`sway_input_configure_libinput_device` so that we send the event after
the added event.
* Rework session lock keyboard focus handling
When removing outputs, it is possible to end up in a situation where
none of the session lock client's surfaces have keyboard focus,
resulting in it not receiving keyboard events. Track the focused
surface and update it as needed on surface destroy.
* Fix focus tracking when session lock is active
Remove the incorrect attempt to block focus changes when an input grab
is present and replace it with the same logic used for layer_shell-based
screen lockers: restore the focus after changing it.
This fixes a use-after-free of seat->workspace if outputs are destroyed
while a screen lock is enabled.
* container_floating_set_default_size: Store workspace size box on the stack
* Support libinput's 1.21 new dwtp option
Support the new dwtp (disable while trackpointing) option introduced in
libinput 1.21, allowing users to control whether the trackpoint (like
those in Thinkpads, but not only) should be disabled while using the
keyboard/touchpad.
See: https://gitlab.freedesktop.org/libinput/libinput/-/issues/731
* tree: support formatting null titles
Any windows that have never had a title set visually behave closer to
that of an empty title, but are unformattable, as the code bails out
early on a NULL title.
* criteria: allow matching on empty (NULL) titles
* criteria: allow matching for NULL string criteria
* ci: install hwdata
* Use wl_signal_emit_mutable()
This function fixes segfaults when emitting a signal potentially
removes arbitrary listeners.
* Use wlr_damage_ring
wlr_output_damage is to be replaced with wlr_damage_ring, so use that.
* lock: fix crash on output destroy
Closes: https://github.com/swaywm/sway/issues/7120
* container_get_siblings: handle NULL workspace
* ci: checkout wlroots 0.16.0
* workspace_create: Don't allow NULL name
(cherry picked from commit 34933bb84350fe805d82276ea02d5732546e9993)
* output: set damage ring bounds to pixel values
Fixes: https://github.com/swaywm/sway/issues/7254
(cherry picked from commit 85005b52fe5b832e4ea914fa28048b0c5c803769)
* Use shm_open instead of mkstemp
shm_open is more reliable because it does not require
a writeable filesystem folder, unlike mkstemp.
(cherry picked from commit e2bc8866f46701e9c825ad7fa5baac02b2e4898f)
* build: drop wayland-scanner fallback
(cherry picked from commit 366f6ef3d31688631dc453028e108f98a1d7ab57)
* build: unify server & client protocol generation
No need to make a difference here, let's just generate header
files for both.
(cherry picked from commit 5be5a038da8a3789a19945719f2a27233291445d)
* build: drop "server" from target name for protocol code
(cherry picked from commit e5475d9310941ce88ed016ce1515b36e3a440252)
* build: drop intermediate libraries for protocols
(cherry picked from commit af8a5a8918ef42336194fb1077b008a736de7af9)
* root: move the workspace matching code to its own file
This removes the pid_workspace bits from tree/root before it gets
too interesting.
No functional change.
(cherry picked from commit eb5021ef990fb29ff86544aea58d687ad62c757a)
* node: prettify node type names
(cherry picked from commit 1c4b94ae3ca94b972410c80a61404a347af1ee68)
* launcher: track workspaces by node
This removes the need to rename the pid_workspaces when a workspace
is renamed.
It also opens the possibility of tracking other node types. Tracking
containers would allow application to be placed correctly in the
container tree even if the user has moved their focus elsewhere since
it was launched.
(cherry picked from commit 3b49f2782e8faf68766269b9c7390b16e25ae824)
* launcher: use xdga tokens
This reuses wlroots token tracking for workspace matching. It doesn't
export any xdga tokens for clients yet.
(cherry picked from commit bd66f4943da1c96edc3ba49573e27b42b688c543)
* launcher: rename pid_workspace to launcher_ctx
Soon we will match views with more than just a pid.
(cherry picked from commit d75c9f9722389d441fd24bd490c5cf12c4bef39a)
* view: associate launch contexts with views
Views now maintain a reference to a launch context which, as a last
resort, is populated at map time with a context associated with its pid.
This opens the possibility of populating it before map via another
source, e.g. xdga-tokens or configuration.
(cherry picked from commit 864b3a9a18f236f92f1898bb44ab977ceaebfd68)
* launcher: initialize launcher_ctxs once on startup
(cherry picked from commit 66568508c06267445489d655c91c94a34d6d9ffe)
* launcher: fudge the interface a bit
We want to create a context before knowing the pid it will match with.
(cherry picked from commit bdeb9f95651f6c99cc2f4cfb59020ddee202cf36)
* launcher: export xdga tokens and use them for workspace matching
(cherry picked from commit 30ad4dc4a5a41ce7c7aa85096a6e18f374172983)
* launcher: export X startup ids and use them for workspace matching
(cherry picked from commit 28fda4c0d38907fab94dc7d82c9dcf0754748b4e)
* swaybar: Prioritize hotspot events to bar bindings
This is consistent with i3bar's behaviour, and for example, allows binding a
command to button1, while still being able to click on tray icons or other
zones on the bar's status line which may have their own bindings.
E.g., in Sway, without this commit, this config. makes tray icons unclickable:
bar {
# ...
bindsym button1 exec swaynag -m You_clicked_the_tray._Want_some_help?
}
But the same configuration in i3 (with i3-nagbar) keeps tray items clickable.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 53f9dbd424dc173a85c9f4cd30802259d38b1ef4)
* swaybar: Make hotspots block bar release bindings
The previous commit prioritized hotspots before bar bindings for press events,
which matches i3's behaviour. However, since hotspots don't need to do any
processing on release events, those were not handled, and simply fell through
to `bindsym --release` bar bindings (if any).
This is counter-intuitive, and doesn't match i3's behaviour. Instead in case
a hotspot handles the press event, it should also handle the release event,
doing nothing, but blocking the event from triggering a --release bar binding.
E.g., in Sway, without this commit, this config. shows a text on tray clicks:
bar {
# ...
bindsym --release button1 exec swaynag -m I_got_the_release_event.
}
But the same configuration in i3 (with i3-nagbar) doesn't show the text.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 94b69acf0d7b26ee5af2172300cb18473508da76)
* build: drop unused wayland-egl dependency
(cherry picked from commit 37e4a3d6370dc6ba2b0877d588845c06781e880e)
* build: bump version to 1.8-rc1
* Fix build on Debian Stable
(cherry picked from commit dca0bb5749bc16f91ab964fc1b06ebb9a453368f)
* build: fix have_xwayland when xcb-icccm is not found
xcb-icccm is required to build Xwayland support.
Backported from commit d41f11e6bd8cef80f02dda4c66d4a31611aed753.
* build: bump version to 1.8-rc2
* seat: Avoid sending redundant keymaps on reload
When we reload the config, we reset every input device and re-apply
configuration from the config file. This means that the keyboard keymap
is updated at least once during config reload, more if the config file
contains keyboard configuration.
When they keyboard keymap changes and is updated through wlr_seat, the
keymap ends up sent to every keyboard bound in every client, seemingly
multiple times. On an x230 of mine with a keyboard layout set in the
config file, I see 42 keymap events sent to foot on config reload.
Reduce events from keyboard configurations by skipping all but the
currently active keyboard for the seat, and by clearing the active
keyboard during input manager device reset. After this change, I only
see a single just-in-time keymap event.
Fixes: https://github.com/swaywm/sway/issues/6654
* criteria: be lenient on window_role and instance too
* build: bump version to 1.8-rc3
* commands/move: Warp cursor after moving workspace to another output
This makes sway's behavior consistent with i3 when `mouse_warping` is
set to any value besides `none`.
Fixes #7027.
(cherry picked from commit e3c63bf58d0744dfb436f0f38442ce3735e40f47)
* seat: Set keyboard if seat keyboard is NULL
sway sends wl_keyboard.enter on seat focus change and when a keyboard
active on a seat is configured. If all keyboards are removed and a
keyboard is added back without changing the focused client, no new
notify event would be sent despite having keyboard focus. This could
lead to key events without notify, which is a protocol violation.
As a quick fix, when configuring a keyboard on a seat where no keyboard
is currently active, activate the keyboard so that a focused surface
will receive a notify event.
Regressed by: e1b268af98edeb09e570e8855ef64f0719cbafe2
Closes: https://github.com/swaywm/sway/issues/7330
(cherry picked from commit 1ade0ce753dc5f588584f444ce80d27c3b1e4300)
* build: bump version to 1.8-rc4
* swaynag: fix NULL font description
The font description was only set if provided on the CLI. It was
left NULL for the defaults and when reading from the config file.
Closes: https://github.com/swaywm/sway/issues/7186
(cherry picked from commit fd0af78e43f4dd67a404f475c676b25ae38a4b82)
* build: bump version to 1.8
* Removed other README languages
* Fixed build issues
* Removed alpha from render_data struct
* Updated PKGBUILDs and COPR spec
* Update sway/desktop/render.c
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
* Fixed deco_data not being initialized properly
* Replaced wlr_egl_(make|unset)_current with eglMakeCurrent
* Added matrix_projection into fx_renderer
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: Sefa Eyeoglu <contact@scrumplex.net>
Co-authored-by: Simon Ser <contact@emersion.fr>
Co-authored-by: Seth Barberee <seth.barberee@gmail.com>
Co-authored-by: Thomas Hebb <tommyhebb@gmail.com>
Co-authored-by: Nathan Schulte <nmschulte@gmail.com>
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
Co-authored-by: David Rosca <nowrep@gmail.com>
Co-authored-by: David96 <david@hameipe.de>
Co-authored-by: Kenny Levinsen <kl@kl.wtf>
Co-authored-by: Aleksei Bavshin <alebastr89@gmail.com>
Co-authored-by: Kirill Chibisov <contact@kchibisov.com>
Co-authored-by: Tudor Brindus <me@tbrindus.ca>
Co-authored-by: Patrick Hilhorst <git@hilhorst.be>
Co-authored-by: Rouven Czerwinski <rouven@czerwinskis.de>
Co-authored-by: Tobias Bengfort <tobias.bengfort@posteo.de>
Co-authored-by: Ronan Pigott <rpigott@berkeley.edu>
Co-authored-by: Kirill Primak <vyivel@eclair.cafe>
Co-authored-by: Tuomas Yrjölä <mail@yrhki.fi>
Co-authored-by: Kirill Primak <vyivel@posteo.net>
Co-authored-by: Alexander Browne <elcste@users.noreply.github.com>
Co-authored-by: Marco Rubin <20150305+Rubo3@users.noreply.github.com>
Co-authored-by: Muhamed Hobi <woohoomoo2u@gmail.com>
Co-authored-by: Simon Zeni <simon@bl4ckb0ne.ca>
Co-authored-by: Nihal Jere <nihal@nihaljere.xyz>
Co-authored-by: Alexander Gramiak <agrambot@gmail.com>
Co-authored-by: Moon Sungjoon <sumoon@seoulsaram.org>
Co-authored-by: Nicolas Avrutin <nicolas@avrutin.net>
Co-authored-by: ndren <andreien@ctemplar.com>
Co-authored-by: Bill Li <billli11hkb@gmail.com>
Co-authored-by: Leonardo Hernández Hernández <leohdz172@protonmail.com>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Co-authored-by: Manuel Stoeckl <code@mstoeckl.com>
Co-authored-by: Yasin Silavi <59373143+sttatusx@users.noreply.github.com>
Co-authored-by: Daniel De Graaf <code@danieldg.net>
Co-authored-by: kraftwerk28 <kefirchik3@gmail.com>
Co-authored-by: Eskil <67291226+eschillus@users.noreply.github.com>
Co-authored-by: Alice Carroll <git@alice-carroll.pet>
Co-authored-by: Alan <51193876+Pound-Hash@users.noreply.github.com>
Co-authored-by: Victor Makarov <vitja.makarov@gmail.com>
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: -k <slowdive@me.com>
Co-authored-by: Hongyi <61831273+FrozenArcher@users.noreply.github.com>
Co-authored-by: Urey. Xue <urey.s.knowledge@gmail.com>
Co-authored-by: LordRishav <75823494+LordRishav@users.noreply.github.com>
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
Co-authored-by: Florian Franzen <Florian.Franzen@gmail.com>
Co-authored-by: Greg Depoire--Ferrer <greg@gregdf.com>
Co-authored-by: Thomas Jost <schnouki@schnouki.net>
Co-authored-by: Hugo Osvaldo Barrera <hugo@barrera.io>
Co-authored-by: zkldi <ktchidev@gmail.com>
Co-authored-by: llyyr <llyyr.public@gmail.com>
Co-authored-by: Baltazár Radics <baltazar.radics@gmail.com>
Co-authored-by: Martin Michlmayr <tbm@cyrius.com>
Co-authored-by: Filip Szczepański <jazz2rulez@gmail.com>
Co-authored-by: Alex Maese <memaese@hotmail.com>
Co-authored-by: マリウス <marius@xn--gckvb8fzb.com>
Co-authored-by: Andri Yngvason <andri@yngvason.is>
Co-authored-by: ohno418 <yutaro.ono.418@gmail.com>
Co-authored-by: Ferdinand Schober <ferdinand.schober@fau.de>
Co-authored-by: cparm <armelcadetpetit@gmail.com>
Co-authored-by: Yaroslav de la Peña Smirnov <yps@yaroslavps.com>
Co-authored-by: Alexander Orzechowski <orzechowski.alexander@gmail.com>
Co-authored-by: pudiva chip líquida <pudiva@skylittlesystem.org>
Co-authored-by: Puck Meerburg <puck@puckipedia.com>
Co-authored-by: Callum Andrew <calcium@mailbox.org>
Co-authored-by: Ronan Pigott <ronan@rjp.ie>
Co-authored-by: Joan Bruguera <joanbrugueram@gmail.com>
Co-authored-by: nerdopolis <bluescreen_avenger@verizon.net>
Co-authored-by: Ankit Pandey <anpandey@protonmail.com>
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
2023-01-05 09:32:43 +11:00
|
|
|
if (!container->pending.workspace) {
|
|
|
|
return NULL;
|
|
|
|
}
|
2021-02-13 09:22:51 +11:00
|
|
|
if (list_find(container->pending.workspace->tiling, container) != -1) {
|
|
|
|
return container->pending.workspace->tiling;
|
2018-08-26 12:05:16 +10:00
|
|
|
}
|
2021-02-13 09:22:51 +11:00
|
|
|
return container->pending.workspace->floating;
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
}
|
2018-08-26 12:05:16 +10:00
|
|
|
|
2019-01-28 20:06:42 +11:00
|
|
|
int container_sibling_index(struct sway_container *child) {
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
return list_find(container_get_siblings(child), child);
|
|
|
|
}
|
2018-08-26 12:05:16 +10:00
|
|
|
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
list_t *container_get_current_siblings(struct sway_container *container) {
|
|
|
|
if (container->current.parent) {
|
|
|
|
return container->current.parent->current.children;
|
|
|
|
}
|
|
|
|
return container->current.workspace->current.tiling;
|
|
|
|
}
|
2018-08-26 12:05:16 +10:00
|
|
|
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
void container_handle_fullscreen_reparent(struct sway_container *con) {
|
2021-02-13 09:22:51 +11:00
|
|
|
if (con->pending.fullscreen_mode != FULLSCREEN_WORKSPACE || !con->pending.workspace ||
|
|
|
|
con->pending.workspace->fullscreen == con) {
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
return;
|
2018-08-26 12:05:16 +10:00
|
|
|
}
|
2021-02-13 09:22:51 +11:00
|
|
|
if (con->pending.workspace->fullscreen) {
|
|
|
|
container_fullscreen_disable(con->pending.workspace->fullscreen);
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
}
|
2021-02-13 09:22:51 +11:00
|
|
|
con->pending.workspace->fullscreen = con;
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
|
2021-02-13 09:22:51 +11:00
|
|
|
arrange_workspace(con->pending.workspace);
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
static void set_workspace(struct sway_container *container, void *data) {
|
2021-02-13 09:22:51 +11:00
|
|
|
container->pending.workspace = container->pending.parent->pending.workspace;
|
2018-08-26 12:05:16 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
void container_insert_child(struct sway_container *parent,
|
|
|
|
struct sway_container *child, int i) {
|
2021-02-13 09:22:51 +11:00
|
|
|
if (child->pending.workspace) {
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
container_detach(child);
|
2018-08-26 12:05:16 +10:00
|
|
|
}
|
2021-02-13 09:22:51 +11:00
|
|
|
list_insert(parent->pending.children, i, child);
|
|
|
|
child->pending.parent = parent;
|
|
|
|
child->pending.workspace = parent->pending.workspace;
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
container_for_each_child(child, set_workspace, NULL);
|
|
|
|
container_handle_fullscreen_reparent(child);
|
|
|
|
container_update_representation(parent);
|
2018-08-26 12:05:16 +10:00
|
|
|
}
|
|
|
|
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
void container_add_sibling(struct sway_container *fixed,
|
2018-09-12 08:46:46 +10:00
|
|
|
struct sway_container *active, bool after) {
|
2021-02-13 09:22:51 +11:00
|
|
|
if (active->pending.workspace) {
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
container_detach(active);
|
|
|
|
}
|
|
|
|
list_t *siblings = container_get_siblings(fixed);
|
|
|
|
int index = list_find(siblings, fixed);
|
2018-09-12 08:46:46 +10:00
|
|
|
list_insert(siblings, index + after, active);
|
2021-02-13 09:22:51 +11:00
|
|
|
active->pending.parent = fixed->pending.parent;
|
|
|
|
active->pending.workspace = fixed->pending.workspace;
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
container_for_each_child(active, set_workspace, NULL);
|
|
|
|
container_handle_fullscreen_reparent(active);
|
|
|
|
container_update_representation(active);
|
2018-08-26 12:05:16 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
void container_add_child(struct sway_container *parent,
|
|
|
|
struct sway_container *child) {
|
2021-02-13 09:22:51 +11:00
|
|
|
if (child->pending.workspace) {
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
container_detach(child);
|
|
|
|
}
|
2021-02-13 09:22:51 +11:00
|
|
|
list_add(parent->pending.children, child);
|
|
|
|
child->pending.parent = parent;
|
|
|
|
child->pending.workspace = parent->pending.workspace;
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
container_for_each_child(child, set_workspace, NULL);
|
|
|
|
container_handle_fullscreen_reparent(child);
|
|
|
|
container_update_representation(parent);
|
|
|
|
node_set_dirty(&child->node);
|
|
|
|
node_set_dirty(&parent->node);
|
2018-08-26 12:05:16 +10:00
|
|
|
}
|
|
|
|
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
void container_detach(struct sway_container *child) {
|
2021-02-13 09:22:51 +11:00
|
|
|
if (child->pending.fullscreen_mode == FULLSCREEN_WORKSPACE) {
|
|
|
|
child->pending.workspace->fullscreen = NULL;
|
2018-08-26 12:05:16 +10:00
|
|
|
}
|
2021-02-13 09:22:51 +11:00
|
|
|
if (child->pending.fullscreen_mode == FULLSCREEN_GLOBAL) {
|
2019-01-25 09:29:21 +11:00
|
|
|
root->fullscreen_global = NULL;
|
|
|
|
}
|
2018-08-26 12:05:16 +10:00
|
|
|
|
2021-02-13 09:22:51 +11:00
|
|
|
struct sway_container *old_parent = child->pending.parent;
|
|
|
|
struct sway_workspace *old_workspace = child->pending.workspace;
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
list_t *siblings = container_get_siblings(child);
|
2018-09-05 17:59:31 +10:00
|
|
|
if (siblings) {
|
|
|
|
int index = list_find(siblings, child);
|
|
|
|
if (index != -1) {
|
|
|
|
list_del(siblings, index);
|
|
|
|
}
|
2018-08-26 12:05:16 +10:00
|
|
|
}
|
2021-02-13 09:22:51 +11:00
|
|
|
child->pending.parent = NULL;
|
|
|
|
child->pending.workspace = NULL;
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
container_for_each_child(child, set_workspace, NULL);
|
2018-08-26 12:05:16 +10:00
|
|
|
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
if (old_parent) {
|
|
|
|
container_update_representation(old_parent);
|
|
|
|
node_set_dirty(&old_parent->node);
|
2018-09-05 17:59:31 +10:00
|
|
|
} else if (old_workspace) {
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
workspace_update_representation(old_workspace);
|
|
|
|
node_set_dirty(&old_workspace->node);
|
2018-08-26 12:05:16 +10:00
|
|
|
}
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
node_set_dirty(&child->node);
|
2018-08-26 12:05:16 +10:00
|
|
|
}
|
|
|
|
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
void container_replace(struct sway_container *container,
|
|
|
|
struct sway_container *replacement) {
|
2021-02-13 09:22:51 +11:00
|
|
|
enum sway_fullscreen_mode fullscreen = container->pending.fullscreen_mode;
|
2019-04-01 14:27:18 +11:00
|
|
|
bool scratchpad = container->scratchpad;
|
2019-06-17 01:36:00 +10:00
|
|
|
struct sway_workspace *ws = NULL;
|
2019-04-01 14:27:18 +11:00
|
|
|
if (fullscreen != FULLSCREEN_NONE) {
|
|
|
|
container_fullscreen_disable(container);
|
|
|
|
}
|
|
|
|
if (scratchpad) {
|
2021-02-13 09:22:51 +11:00
|
|
|
ws = container->pending.workspace;
|
2019-04-01 14:27:18 +11:00
|
|
|
root_scratchpad_show(container);
|
|
|
|
root_scratchpad_remove_container(container);
|
|
|
|
}
|
2021-02-13 09:22:51 +11:00
|
|
|
if (container->pending.parent || container->pending.workspace) {
|
2019-08-06 18:46:57 +10:00
|
|
|
float width_fraction = container->width_fraction;
|
|
|
|
float height_fraction = container->height_fraction;
|
2019-04-25 10:28:19 +10:00
|
|
|
container_add_sibling(container, replacement, 1);
|
|
|
|
container_detach(container);
|
2019-08-06 18:46:57 +10:00
|
|
|
replacement->width_fraction = width_fraction;
|
|
|
|
replacement->height_fraction = height_fraction;
|
2019-04-25 10:28:19 +10:00
|
|
|
}
|
2019-04-01 14:27:18 +11:00
|
|
|
if (scratchpad) {
|
2019-06-17 01:36:00 +10:00
|
|
|
root_scratchpad_add_container(replacement, ws);
|
2019-04-01 14:27:18 +11:00
|
|
|
}
|
|
|
|
switch (fullscreen) {
|
|
|
|
case FULLSCREEN_WORKSPACE:
|
|
|
|
container_fullscreen_workspace(replacement);
|
|
|
|
break;
|
|
|
|
case FULLSCREEN_GLOBAL:
|
|
|
|
container_fullscreen_global(replacement);
|
|
|
|
break;
|
|
|
|
case FULLSCREEN_NONE:
|
|
|
|
// noop
|
|
|
|
break;
|
|
|
|
}
|
2018-08-26 12:05:16 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
struct sway_container *container_split(struct sway_container *child,
|
|
|
|
enum sway_container_layout layout) {
|
2020-10-24 06:00:45 +11:00
|
|
|
// i3 doesn't split singleton H/V containers
|
|
|
|
// https://github.com/i3/i3/blob/3cd1c45eba6de073bc4300eebb4e1cc1a0c4479a/src/tree.c#L354
|
2021-02-13 09:22:51 +11:00
|
|
|
if (child->pending.parent || child->pending.workspace) {
|
2020-10-24 06:00:45 +11:00
|
|
|
list_t *siblings = container_get_siblings(child);
|
|
|
|
if (siblings->length == 1) {
|
|
|
|
enum sway_container_layout current = container_parent_layout(child);
|
|
|
|
if (container_is_floating(child)) {
|
|
|
|
current = L_NONE;
|
|
|
|
}
|
|
|
|
if (current == L_HORIZ || current == L_VERT) {
|
2021-02-13 09:22:51 +11:00
|
|
|
if (child->pending.parent) {
|
|
|
|
child->pending.parent->pending.layout = layout;
|
|
|
|
container_update_representation(child->pending.parent);
|
2020-10-24 06:00:45 +11:00
|
|
|
} else {
|
2021-02-13 09:22:51 +11:00
|
|
|
child->pending.workspace->layout = layout;
|
|
|
|
workspace_update_representation(child->pending.workspace);
|
2020-10-24 06:00:45 +11:00
|
|
|
}
|
|
|
|
return child;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-10-18 22:20:00 +11:00
|
|
|
struct sway_seat *seat = input_manager_get_default_seat();
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
bool set_focus = (seat_get_focus(seat) == &child->node);
|
2018-08-26 12:05:16 +10:00
|
|
|
|
2020-10-28 06:24:30 +11:00
|
|
|
if (container_is_floating(child) && child->view) {
|
|
|
|
view_set_tiled(child->view, true);
|
|
|
|
if (child->view->using_csd) {
|
2021-02-13 09:22:51 +11:00
|
|
|
child->pending.border = child->saved_border;
|
2020-10-28 06:24:30 +11:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
struct sway_container *cont = container_create(NULL);
|
2021-02-13 09:22:51 +11:00
|
|
|
cont->pending.width = child->pending.width;
|
|
|
|
cont->pending.height = child->pending.height;
|
2019-06-29 07:21:20 +10:00
|
|
|
cont->width_fraction = child->width_fraction;
|
|
|
|
cont->height_fraction = child->height_fraction;
|
2021-02-13 09:22:51 +11:00
|
|
|
cont->pending.x = child->pending.x;
|
|
|
|
cont->pending.y = child->pending.y;
|
|
|
|
cont->pending.layout = layout;
|
2018-08-26 12:05:16 +10:00
|
|
|
|
Implement type safe arguments and demote sway_container
This commit changes the meaning of sway_container so that it only refers
to layout containers and view containers. Workspaces, outputs and the
root are no longer known as containers. Instead, root, outputs,
workspaces and containers are all a type of node, and containers come in
two types: layout containers and view containers.
In addition to the above, this implements type safe variables. This
means we use specific types such as sway_output and sway_workspace
instead of generic containers or nodes. However, it's worth noting that
in a few places places (eg. seat focus and transactions) referring to
them in a generic way is unavoidable which is why we still use nodes in
some places.
If you want a TL;DR, look at node.h, as well as the struct definitions
for root, output, workspace and container. Note that sway_output now
contains a workspaces list, and workspaces now contain a tiling and
floating list, and containers now contain a pointer back to the
workspace.
There are now functions for seat_get_focused_workspace and
seat_get_focused_container. The latter will return NULL if a workspace
itself is focused. Most other seat functions like seat_get_focus and
seat_set_focus now accept and return nodes.
In the config->handler_context struct, current_container has been
replaced with three pointers: node, container and workspace. node is the
same as what current_container was, while workspace is the workspace
that the node resides on and container is the actual container, which
may be NULL if a workspace itself is focused.
The global root_container variable has been replaced with one simply
called root, which is a pointer to the sway_root instance.
The way outputs are created, enabled, disabled and destroyed has
changed. Previously we'd wrap the sway_output in a container when it is
enabled, but as we don't have containers any more it needs a different
approach. The output_create and output_destroy functions previously
created/destroyed the container, but now they create/destroy the
sway_output. There is a new function output_disable to disable an output
without destroying it.
Containers have a new view property. If this is populated then the
container is a view container, otherwise it's a layout container. Like
before, this property is immutable for the life of the container.
Containers have both a `sway_container *parent` and
`sway_workspace *workspace`. As we use specific types now, parent cannot
point to a workspace so it'll be NULL for containers which are direct
children of the workspace. The workspace property is set for all
containers, except those which are hidden in the scratchpad as they have
no workspace.
In some cases we need to refer to workspaces in a container-like way.
For example, workspaces have layout and children, but when using
specific types this makes it difficult. Likewise, it's difficult for a
container to get its parent's layout when the parent could be another
container or a workspace. To make it easier, some helper functions have
been created: container_parent_layout and container_get_siblings.
container_remove_child has been renamed to container_detach and
container_replace_child has been renamed to container_replace.
`container_handle_fullscreen_reparent(con, old_parent)` has had the
old_parent removed. We now unfullscreen the workspace when detaching the
container, so this function is simplified and only needs one argument
now.
container_notify_subtree_changed has been renamed to
container_update_representation. This is more descriptive of its
purpose. I also wanted to be able to call it with whatever container was
changed rather than the container's parent, which makes bubbling up to
the workspace easier.
There are now state structs per node thing. ie. sway_output_state,
sway_workspace_state and sway_container_state.
The focus, move and layout commands have been completely refactored to
work with the specific types. I considered making these a separate PR,
but I'd be backporting my changes only to replace them again, and it's
easier just to test everything at once.
2018-08-30 21:00:10 +10:00
|
|
|
container_replace(child, cont);
|
|
|
|
container_add_child(cont, child);
|
2018-08-26 12:05:16 +10:00
|
|
|
|
|
|
|
if (set_focus) {
|
2018-10-15 22:06:24 +11:00
|
|
|
seat_set_raw_focus(seat, &cont->node);
|
2021-02-13 09:22:51 +11:00
|
|
|
if (cont->pending.fullscreen_mode == FULLSCREEN_GLOBAL) {
|
2019-04-01 14:27:18 +11:00
|
|
|
seat_set_focus(seat, &child->node);
|
|
|
|
} else {
|
|
|
|
seat_set_raw_focus(seat, &child->node);
|
|
|
|
}
|
2018-08-26 12:05:16 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
return cont;
|
|
|
|
}
|
2018-10-09 00:00:36 +11:00
|
|
|
|
|
|
|
bool container_is_transient_for(struct sway_container *child,
|
|
|
|
struct sway_container *ancestor) {
|
|
|
|
return config->popup_during_fullscreen == POPUP_SMART &&
|
|
|
|
child->view && ancestor->view &&
|
|
|
|
view_is_transient_for(child->view, ancestor->view);
|
|
|
|
}
|
2018-10-31 22:27:38 +11:00
|
|
|
|
|
|
|
static bool find_by_mark_iterator(struct sway_container *con, void *data) {
|
|
|
|
char *mark = data;
|
|
|
|
return container_has_mark(con, mark);
|
|
|
|
}
|
|
|
|
|
|
|
|
struct sway_container *container_find_mark(char *mark) {
|
|
|
|
return root_find_container(find_by_mark_iterator, mark);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool container_find_and_unmark(char *mark) {
|
|
|
|
struct sway_container *con = root_find_container(
|
|
|
|
find_by_mark_iterator, mark);
|
|
|
|
if (!con) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = 0; i < con->marks->length; ++i) {
|
|
|
|
char *con_mark = con->marks->items[i];
|
|
|
|
if (strcmp(con_mark, mark) == 0) {
|
|
|
|
free(con_mark);
|
|
|
|
list_del(con->marks, i);
|
|
|
|
container_update_marks_textures(con);
|
|
|
|
ipc_event_window(con, "mark");
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void container_clear_marks(struct sway_container *con) {
|
2018-12-09 09:52:29 +11:00
|
|
|
for (int i = 0; i < con->marks->length; ++i) {
|
|
|
|
free(con->marks->items[i]);
|
|
|
|
}
|
2018-10-31 22:27:38 +11:00
|
|
|
con->marks->length = 0;
|
|
|
|
ipc_event_window(con, "mark");
|
|
|
|
}
|
|
|
|
|
|
|
|
bool container_has_mark(struct sway_container *con, char *mark) {
|
|
|
|
for (int i = 0; i < con->marks->length; ++i) {
|
|
|
|
char *item = con->marks->items[i];
|
|
|
|
if (strcmp(item, mark) == 0) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void container_add_mark(struct sway_container *con, char *mark) {
|
|
|
|
list_add(con->marks, strdup(mark));
|
|
|
|
ipc_event_window(con, "mark");
|
|
|
|
}
|
|
|
|
|
|
|
|
static void update_marks_texture(struct sway_container *con,
|
|
|
|
struct wlr_texture **texture, struct border_colors *class) {
|
|
|
|
struct sway_output *output = container_get_effective_output(con);
|
|
|
|
if (!output) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (*texture) {
|
|
|
|
wlr_texture_destroy(*texture);
|
|
|
|
*texture = NULL;
|
|
|
|
}
|
|
|
|
if (!con->marks->length) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
size_t len = 0;
|
|
|
|
for (int i = 0; i < con->marks->length; ++i) {
|
|
|
|
char *mark = con->marks->items[i];
|
|
|
|
if (mark[0] != '_') {
|
|
|
|
len += strlen(mark) + 2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
char *buffer = calloc(len + 1, 1);
|
|
|
|
char *part = malloc(len + 1);
|
|
|
|
|
|
|
|
if (!sway_assert(buffer && part, "Unable to allocate memory")) {
|
|
|
|
free(buffer);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = 0; i < con->marks->length; ++i) {
|
|
|
|
char *mark = con->marks->items[i];
|
|
|
|
if (mark[0] != '_') {
|
rebase: Sway 1.8 (#78)
* build: bump wlroots dependency to 0.16.0
* swaymsg: replace if with switch in pretty_print
* swaymsg: add GET_TREE pretty-printing
* swaybar: fix errno handling in status_handle_readable
If getline fails once, it was not reset before the next getline
call. errno is only overwritten by getline on error.
* Add cairo_image_surface_create error handling
cairo_image_surface_create can fail, e.g. when running out of
memory or when the size is too big. Avoid crashing in this case.
Closes: https://github.com/swaywm/sway/issues/6531
* build: bump version to 1.8-dev
Historically we've been sticking with the last release number in
the master branch. However that's a bit confusing, people can't
easily figure out whether they're using a release or a work-in-progress
snapshot. Only the commit hash appended to the version number may
help, but that's not very explicit and disappears when using a
tarball.
We could bump the version in master to the next release number.
However during the RC cycle there would be a downgrade from 1.8 to
1.8-rc1. Also it would be hard to tell the difference between a
stable release and an old snapshot.
This patch introduces a new pre-release identifier, "dev". It's
alphabetically before "rc" so it should be correctly sorted by
semver comparisons. "dev" is upgraded to "rc" (and then to stable)
when doing a release. The master branch always uses a "dev"
version, only release branches use "rc" or stable versions.
* [IPC] Add repeat delay/rate info to keyboard
Closes #6735
wlroots already has the info in the struct so let's access it and print it out.
* input/seat: unset has_focus when focus_stack becomes empty
We currently track the focus of a seat in two ways: we use a list called
focus_stack to track the order in which nodes have been focused, with
the first node representing what's currently focused, and we use a
variable called has_focus to indicate whether anything has focus--i.e.
whether we should actually treat that first node as focused at any given
time.
In a number of places, we treat has_focus as implying that a focused
node exists. If it's true, we attempt to dereference the return value of
seat_get_focus(), our helper function for getting the first node in
focus_list, with no further checks. But this isn't quite correct with
the current implementation of seat_get_focus(): not only does it return
NULL when has_focus is false, it also returns NULL when focus_stack
contains no items.
In most cases, focus_stack never becomes empty and so this doesn't
matter at all. Since focus_stack stores a history of focused nodes, we
rarely remove nodes from it. The exception to this is when a node itself
goes away. In that case, we call seat_node_destroy() to remove it from
focus_stack and free it. But we don't unset has_focus if we've removed
the final node! This lets us get into a state where has_focus is true
but seat_get_focus() returns NULL, leading to a segfault when we try to
dereference it.
Fix the issue both by updating has_focus in seat_node_destroy() and by
adding an assertion in seat_get_focus() that ensures focus_stack and
has_focus are in sync, which will make it easier to track down similar
issues in the future.
Fixes #6395.
[1] There's some discussion in #1585 from when this was implemented
about whether has_focus is actually necessary; it's possible we could
remove it entirely, but for the moment this is the architecture we have.
* swaybar: fix tray_padding vs min-height re: scale
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
* swaybar: fix tray item icon scaling, positioning
* container: Fix crash when view unmaps + maps quickly
Followup on 4e4898e90f.
If a view quickly maps and unmaps repeatedly, there will be multiple
destroyed containers with same view in a single transaction. Each of
these containers will then try to destroy this view, resulting in use
after free.
The container should only destroy the view if the view still belongs
to the container.
Simple reproducer: couple XMapWindow + XUnmapWindow in a loop followed
by XDestroyWindow.
See #6605
* commands/move: Fix crash when pos_y is omitted
Fixes #6737
* Destroy sub-surfaces with parent layer-shell surface
Closes: https://github.com/swaywm/sway/issues/6337
* Add safety assert in parse_movement_unit
Let's add this just in case a caller passes argc == 0.
References: https://github.com/swaywm/sway/issues/6737#issuecomment-1008082540
* meson: check: false on run_command
Future meson releases will change the default and warns when the
implicit default is used, breaking builds.
Explicitly set check: false to maintain behavior and silence warnings.
* Print deprecation notice when running SUID
SUID privilege drop is needed for the "builtin"-backend of libseat,
which copied our old "direct" backend behavior for the sake of
compatibility and ease of transition.
libseat now has a better alternative in the form of seatd-launch. It
uses the normal seatd daemon and libseat backend and takes care of SUID
for us.
Add a soft deprecation warning to highlight our future intent of
removing this code. The deprecation cycle is needed to avoid surprises
when sway no longer drops privileges.
* xdg-shell: use toplevel geometry to adjust the popup box
`popup_unconstrain` uses view coordinates to init the output box for
popups. However wlroots expects the box to be set in a toplevel surface
coordinate system, which is not always equal to view. The difference
between those is a window geometry set via xdg-shell.
GTK4 reserves some space for client-side decoration and thus has a
window with top left corner not matching to (0, 0) of a surface. The box
calculated without taking that into account was slightly shifted
compared to the actual output and allowed to position part of the popup
off screen.
* build: fix building with basu
02b412a introduced the use of list for sdbus deps, however
it was assuming that all packages which were in a list has a version
higher than 239. That is true for libsystemd and libelogind, since they
use the same versions, however basu is using version numbers which are
way lower than what libsystemd/libelogind are using, so basu only build
is failing.
* Upgrade for wlroots surface refactoring
See [1] for details.
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3412
* commands/focus: drop trailing whitespace
* input/cursor: count pointer gestures as idle activity
Fixes https://github.com/swaywm/sway/issues/6765.
* input/cursor: treat swipe begin as idle activity too
Accidentally overlooked in fd53f80.
* treat fullscreen windows as 'tiled' for commands/focus
* transaction: destroying nodes aren't hidden
Commit 37d7bc69986f ("transaction: Only wait for ack from visible
views") introduced a check which uses view_is_visible() to check if a view
is still visible on the screen. However view_is_visible() will early
return in case the node is in the destroying state. This is incorrect
for transactions, since a destroying view which is visible will trigger
configure events for other clients. This bug was visible when repeatedly
opening and closing two views side by side, since we ignore the
destroying node we get a frame where the still open view is shown with
the old configure values and the rest is the desktop background. The
next frame is than correct again.
Fix this by considering destroying views as visible, we correctly wait
for them and send the configure events to other views in time, fixing
the background flicker.
Fixes #6473
* build: execute wlroots subproject before finding deps
wlroots often requires dependencies more recent than Sway's.
Executing the wlroots subproject first will give Meson a chance to
find these newer dependencies, possibly via subprojects.
The subproject will override the "wlroots" dependency when executed,
so we don't need to use get_variable anymore.
References: https://github.com/swaywm/sway/pull/6498#issuecomment-1001746017
* tray: do not render passive items
https://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/StatusNotifierItem/#org.freedesktop.statusnotifieritem.status
* cmd/swap: error on swapping a container with itself
* input/cursor: pass through pointer hold gestures
This just follows swaywm/wlroots#3047, so `wl_pointer_gestures_v1`
clients can be notified of these events.
* swaynag: remove buffer destruction condition
An address of a variable can never be NULL, so checking it doesn't make
sense; and `destroy_buffer()` can operate on already destroyed buffers
anyway.
Fixes #6780
* Use bools for CLI flags
* xwayland: listen to `request_activate` event
When REAPER submenu is closed `XCB_CLIENT_MESSAGE` with type
`NET_ACTIVE_WINDOW` is sent to set focus to parent menu.
Closes: https://github.com/swaywm/sway/issues/6324
* chore: chase wlr_output_layout_get_box() update
https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3439
* Chase wlroots xdg-shell refactor
* Minor update to focus_on_window_activation
Removed xwayland limitation since wayland clients are supported via xdg-activation.
* Translated README into Italian
* readme: add link to Italian translation
* readme: sort language list alphabetically
* readme: use relative links for translations
* xdg-shell: use wlr_xdg_toplevel in sway_view
Improved type safety.
Closes: https://github.com/swaywm/sway/issues/6813
* xdg-shell: use wlr_xdg_popup in sway_xdg_popup
Improved type safety.
* Fix snprintf compiler warning
* Remove all sprintf calls
Replace them with snprintf, which ensures buffer overflows won't
happen.
* sway/commands: add missing wlr_keyboard interface include in xkb_switch_layout
* sway/input: use wlr_input_device from input device base
* Remove some erroneous apostrophes in comments
* Don't enter seatop_move_floating when fullscreen
Currently, a floating window that's been fullscreened can send us
xdg_toplevel::move, and we'll enter seatop_move_floating, which lets us
drag the surface around while it's fullscreen. We don't want
this--fullscreen surfaces should always be aligned to the screen--so add
the same check that seatop_default already does when entering this mode.
Tested with Weston's weston-fullscreen demo, which sends a move request
if you click anywhere on its surface.
* swaynag: die on all allocation failures
* sway/input: don't pass possibly invalid modifiers pointer
active_keyboard may be NULL, in which case an invalid pointer could be
passed to wlr_input_method_keyboard_grab_v2_send_modifiers. This
procedure call is unnecessary since wlroots commit 372a52ec "input
method: send modifiers in set_keyboard", so the call can simply be
removed.
Fixes #6836.
* sway/input: destroy sway_switch properly
Fix: #6861
Added seat_device_destroy function to seat_device_destroy function.
* commands/focus: fix segfault when no container is already focused.
Fixes #6690.
* Remove WLR_SWITCH_STATE_TOGGLE usage
Ref [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/commit/4792446ee8f50104bd207d9ccd8558a7e4eb4514
* Replace pcre with pcre2
Closes: https://github.com/swaywm/sway/issues/6838
* swaybar: remove swaybar_output.input_region
No need to keep the region around, we can immediately destroy it
after the wl_surface.set_input_region request.
* swaybar: set opaque region
When the background color is fully opaque, set the surface's opaque
region to the whole surface.
* Updating criteria checking with PCRE2
* swaynag: allocate button_details with details
They are used together, so it doesn't make sense to allocate them
separately.
* swaynag: statically allocate button_close, and move declaration
Every swaynag has a close button, so it doesn't make sense to
allocate it dynamically. The declaration is moved later to when
it is actually needed.
* swaynag: remove unnecessary zero of swaynag struct
Global variables are initialized to 0.
* swaynag: remove redundant status variables in main
Instead, we just use `status` for all failures.
* remove unnecessary strlen call
* sway/input/cursor: take device mm size from wlr_tablet
* sway/input/seat: take output name from specialized input device
* sway/input: follow up wlroots input device events renaming
* sway/input: fix bad position of wlr_drag
* sway/input: wlr_seat_keyboard() now takes wlr_keyboard
* bash-completion: localize variables
* sway/main: move constants off the stack
This makes stack traces from gdb slightly easier to read.
* Fix farsi label
* Avoid format-truncation warning
The existing code gives this error when compiled with GCC 12:
../sway/server.c: In function ‘server_init’:
../sway/server.c:217:75: error: ‘%d’ directive output may be truncated writing between 1 and 11 bytes into a region of size 8 [-Werror=format-truncation=]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~
../sway/server.c:217:66: note: directive argument in the range [-2147483647, 32]
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~
../sway/server.c:217:17: note: ‘snprintf’ output between 10 and 20 bytes into a destination of size 16
217 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Because i is never negative, this is a false positive, but it is easy to
change i to unsigned to silence the error.
* Shuffle variables to satisfy -Werror=restrict
This also fixes an invalid strlen invocation on uninitialized memory.
* layer_shell: keep output non-NULL wherever possible
Our layer shell implementation assigns every layer surface to an output
on creation. It tracks this output using the output field on the
underlying wlr_layer_surface_v1 structure. As such, much of the existing
code assumes that output is always non-NULL and omits NULL checks
accordingly.
However, there are currently two cases where we destroy a
sway_layer_surface and output is NULL. The first is when we can't find
an output to assign the surface to and destroy it immediately after
creation. The second is when we destroy a surface in response to its
output getting destroyed, as we set output to NULL in
handle_output_destroy() before we call wlr_layer_surface_v1_destroy(),
which is what calls the appropriate unmap and destroy callbacks.
The former case doesn't cause any problems, since we haven't even
allocated a sway_layer_surface at that point or registered any
callbacks. The latter case, however, currently triggers a crash (#6120)
if a popup is visible, since our popup_handle_unmap() implementation
can't handle a NULL output.
To fix this issue, keep output set until right before we free the
sway_layer_surface. All we need to do is remove some of the cleanup
logic from handle_output_destroy(), since as of commit c9060bcc12d0
("layer-shell: replace close() with destroy()") that same logic is
guaranteed to be happen later when wlroots calls handle_destroy() as
part of wlr_layer_surface_v1_destroy().
This lets us remove some NULL checks from other unmap/destroy callbacks,
which is nice. We also don't need to check that the wlr_output points to
a valid sway_output anymore, since we unset that pointer after disabling
the output as of commit a0bbe67076b8 ("Address emersions comments on
output re-enabling") Just to be safe, I've added assertions that the
wlr_output is non-NULL wherever we use it.
Fixes #6120.
* Chase wlroots X11 hints update
* Add Swedish README
* Support cursor capture in grimshot
Refactor argument parser
Bring back `sh` compatibility
Default to NOTIFY=no
* Update grimshot.1.scd
Fixed typo. The object is **files**, which is plural. **image** modifies files; it's not countable.
* xkb_switch_layout: fix relative layout switches
Fixes #6011
* Implement ext-session-lock-v1
* Avoid inspecting a NULL view in seat_set_focus
Fixes #6968
* swaynag: do error checking and rename read_from_stdin
read_from_stdin not only read from stdin, but trimming trailing
newlines, so rename it to reflect this.
* swaynag: improve robustness when loading config
* swaynag: combine consecutive declaration/assignments
* config: Remove unused mouse binding structure
Mouse bindings are handled alongside normal bindings. Remove the unused
separate data structure definition to avoid confusion.
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
* Replace strncpy with memcpy
strncpy is useless here, is dangerous because it doesn't guarantee
that the string is NUL-terminated and causes the following warning:
../sway/criteria.c: In function ‘criteria_parse’:
../sway/criteria.c:712:25: error: ‘strncpy’ destination unchanged after copying no bytes [-Werror=stringop-truncation]
712 | strncpy(value, valuestart, head - valuestart);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Add descriptions for `stacking` and `tabbed` layouts
Resolves #5918
* man: Fix trailing spaces
* server: request xdg-shell v2
Wlroots does not yet support the newer xdg-shell versions and now
requires the compositor to set the supported xdg-shell version during
creation. Set this to v2 for sway as well.
Fixes https://github.com/swaywm/sway/issues/7001
* realtime: request SCHED_RR using CAP_SYS_NICE
Try to gain SCHED_RR (round-robin) realtime scheduling privileges before
starting the server. This requires CAP_SYS_NICE on Linux systems.
We additionally register a pthread_atfork callback which resets the
scheduling class back to SCHED_OTHER (the Linux system default).
Due to CAP_SYS_NICE, setting RLIMIT_RTPRIO has no effect on the process
as documented within man 7 sched (from Linux):
Privileged (CAP_SYS_NICE) threads ignore the RLIMIT_RTPRIO limit;
as with older kernels, they can make arbitrary changes to
scheduling policy and priority. See getrlimit(2) for further
information on RLIMIT_RTPRIO
Note that this requires the sway distribution packagers to set the
CAP_SYS_NICE capability on the sway binary.
Supersedes #6992
* ext-session-lock: disable direct scan-out when locked
* Polish the language in README.zh-CN.md & sync with English one
Co-Authored-By: Urey. Xue <urey.s.knowledge@gmail.com>
* De-duplicate IPC output descriptions
* Handle NULL output make/model/serial
* chore: chase wlroots xdg-shell update
* xdg-shell: schedule a configure on maximize request
This commit reverts 03879290dbee26127f6867ef60bc2a7f9a6c8c5f and
fc84bcb7fb0ffa29b1f9bed287762241a3473803.
* Add a Hindi (हिन्दी) translation to the README
Hindi is one of the most prominent languages of the Indian Subcontinent.
This commit adds the translation of the README into the Hindi language.
Some of the words are still written in English because there wasn't an
appropriate technical term of the word in the language.
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
* sway: add bindgesture command
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
* build: link with -pthread
Fixes the following FreeBSD error:
ld: error: undefined symbol: pthread_getschedparam
>>> referenced by realtime.c:25 (../sway/realtime.c:25)
>>> sway/sway.p/realtime.c.o:(set_rr_scheduling)
Fixes: a3a82efbf6b5 ("realtime: request SCHED_RR using CAP_SYS_NICE")
* ipc: remove chatty debug log messages
These aren't particularly useful, and clobber the debug logs.
* Refuse to start when SUID is detected
This ensures that those surprised by the deprecation of SUID operation
receive an error rather than accidentally having sway run as root.
This detection will be removed in a future release.
* swaynag: move close_button up to fix SIGSEGV
When swaynag_parse_options encounters '--dismiss-button' (or its
shorthand '-s'), it sets the text of the first button in the
swaynag.buttons list, which is expected to exist and to be the dismiss
button, to the one passed by the user.
Commit 4780afb68b4ee2cdf0e4925f40cf885819f8a74a ("swaynag: statically
allocate button_close, and move declaration") moved the list
initialization to after swaynag_parse_options is called which made that
code fail.
For example, the command 'swaynag --dismiss-button Dismiss' crashes and
'swaynag --message Message --button Yes "" --dismiss-button Dismiss'
shows the wrong buttons.
Move it back to before swaynag_parse_options is called.
* config/output: use wlr_output_commit_state
This makes the code more robust because we don't potentially leave
bad state in wlr_output.pending behind anymore. This also fixes a
bug.
Closes: https://github.com/swaywm/sway/issues/7043
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3610
* Allocate enough space for `cmd_results->error`
* Remove access to wlr_input_device union
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3626
Closes: https://github.com/swaywm/sway/issues/7077
* Rename dpms output command to power
The "dpms" command refers to VESA Display Power Management
Signaling, a deprecated standard. It's superseded by VESA DPM.
Instead of tying out command name to a particular standard, use the
neutral term "power".
* Strip quotes in bindsym --input-device=...
If the input device is quoted, which is common when using variables in the
config file, those quotes must be ignored here, or the input device will be
ignored.
Fixes #7029.
* Avoid unecessary string copy
* Reject font values that are invalid for pango
Use pango to parse font configuration early, and reject the command as
invalid if the value is invalid for pango. Since we're already parsing
the font into a `PangoFontDescription`, keep that instance around and
avoid re-parsing the font each time we render text.
Fixes: https://github.com/swaywm/sway/issues/6805
* Reuse parsed PangoFontDescription
Avoids parsing the configured font each time text is rendered.
* ipc: add "power" to output reply
* config.in: switch to `output power`
* Remove internal references to DPMS
While at it, use an int for the config field, just like we do for
all other fields.
* fix: remove redundant empty statement in main.c
This semi-colon looks like a typo. Luckily, it has no effect on the code as it's treated as an empty statement leading the switch case.
Really straightforward nitpick change, was just something I was confused by when reading over the code.
* input: chase delta_discrete semantics change
* swaymsg: fix floating_nodes being ignored
Fix floating_nodes being ignored in pretty_print_tree.
* ipc: make get_deco_rect check config->hide_lone_tab
Without this, the `IPC_GET_TREE` ipc call would return false information
about the container's `deco_rect` and `rect` properties if
`hide_edge_borders --i3` was in effect.
* grimshot: fix tilde expansion within quotes
* Enable single-pixel-buffer-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3428
* sway-output.5: improve display of parameter
Since "width" and "height" are separate parameters, show them as such.
* man: sway(5) move fixes
* ipc: drop WLR_OUTPUT_ADAPTIVE_SYNC_UNKNOWN case
This has been removed from wlroots.
* config/output: test adaptive sync
Required for [1].
[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3637
* Fix crash in xdg_activation_v1.c
wlr_xdg_surface_from_wlr_surface() can return a NULL pointer, so check for NULL before dereferencing it.
* sway: Add non-desktop-output type
Currently, when encountering a non-desktop display, sway offers the
output for leasing and returns without storing it in a sway specific
output type like `struct sway_output`. Additionally, running
`swaymsg -t get_outputs` doesn't show non-desktop outputs.
This commit stores the non-desktop outputs into a struct called
`sway_output_non_desktop`, and adds them to a list on `sway_root`
* sway: add non-desktop outputs to json when running `swaymsg -t get_outputs`
* swaymsg: show non-desktop property when pretty printing outputs
* man: Add XWayland information
* ipc: expose mode picture aspect ratio
* swaymsg: show mode picture aspect ratio
* build: simplify protocol paths
No need for arrays here.
* sway/commands/output: Add command for unplugging non-physical outputs
* Improve Japanese translation
* allow pointer_constraints on layer_shell surfaces
* check for NULL
* use seat directly
* Use keyboard_state.focused_surface directly
* input: focus floating container when clicked on border
Fixes #7209.
* input: focus container when scrolling on titlebar
Fixes #6503.
* Fix leaks in criteria_destroy()
* Avoid double free in criteria_destroy()
* Add support for ext-idle-notify-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3753
* input: tweak focus behavior to allow focusing parent containers
Sway focuses the inactive child when focusing split containers. However,
there is currently no way to focus the parent container itself by mouse.
A user must use the keyboard to do so.
This commit maintains the current behavior, but makes it such that a
second click on the split container titlebar (i.e., after its children
are visible) focuses the split container itself.
* Fix keymap being NULL and segfaulting on dev add
Moved `libinput_config` to the callers of
`sway_input_configure_libinput_device` so that we send the event after
the added event.
* Rework session lock keyboard focus handling
When removing outputs, it is possible to end up in a situation where
none of the session lock client's surfaces have keyboard focus,
resulting in it not receiving keyboard events. Track the focused
surface and update it as needed on surface destroy.
* Fix focus tracking when session lock is active
Remove the incorrect attempt to block focus changes when an input grab
is present and replace it with the same logic used for layer_shell-based
screen lockers: restore the focus after changing it.
This fixes a use-after-free of seat->workspace if outputs are destroyed
while a screen lock is enabled.
* container_floating_set_default_size: Store workspace size box on the stack
* Support libinput's 1.21 new dwtp option
Support the new dwtp (disable while trackpointing) option introduced in
libinput 1.21, allowing users to control whether the trackpoint (like
those in Thinkpads, but not only) should be disabled while using the
keyboard/touchpad.
See: https://gitlab.freedesktop.org/libinput/libinput/-/issues/731
* tree: support formatting null titles
Any windows that have never had a title set visually behave closer to
that of an empty title, but are unformattable, as the code bails out
early on a NULL title.
* criteria: allow matching on empty (NULL) titles
* criteria: allow matching for NULL string criteria
* ci: install hwdata
* Use wl_signal_emit_mutable()
This function fixes segfaults when emitting a signal potentially
removes arbitrary listeners.
* Use wlr_damage_ring
wlr_output_damage is to be replaced with wlr_damage_ring, so use that.
* lock: fix crash on output destroy
Closes: https://github.com/swaywm/sway/issues/7120
* container_get_siblings: handle NULL workspace
* ci: checkout wlroots 0.16.0
* workspace_create: Don't allow NULL name
(cherry picked from commit 34933bb84350fe805d82276ea02d5732546e9993)
* output: set damage ring bounds to pixel values
Fixes: https://github.com/swaywm/sway/issues/7254
(cherry picked from commit 85005b52fe5b832e4ea914fa28048b0c5c803769)
* Use shm_open instead of mkstemp
shm_open is more reliable because it does not require
a writeable filesystem folder, unlike mkstemp.
(cherry picked from commit e2bc8866f46701e9c825ad7fa5baac02b2e4898f)
* build: drop wayland-scanner fallback
(cherry picked from commit 366f6ef3d31688631dc453028e108f98a1d7ab57)
* build: unify server & client protocol generation
No need to make a difference here, let's just generate header
files for both.
(cherry picked from commit 5be5a038da8a3789a19945719f2a27233291445d)
* build: drop "server" from target name for protocol code
(cherry picked from commit e5475d9310941ce88ed016ce1515b36e3a440252)
* build: drop intermediate libraries for protocols
(cherry picked from commit af8a5a8918ef42336194fb1077b008a736de7af9)
* root: move the workspace matching code to its own file
This removes the pid_workspace bits from tree/root before it gets
too interesting.
No functional change.
(cherry picked from commit eb5021ef990fb29ff86544aea58d687ad62c757a)
* node: prettify node type names
(cherry picked from commit 1c4b94ae3ca94b972410c80a61404a347af1ee68)
* launcher: track workspaces by node
This removes the need to rename the pid_workspaces when a workspace
is renamed.
It also opens the possibility of tracking other node types. Tracking
containers would allow application to be placed correctly in the
container tree even if the user has moved their focus elsewhere since
it was launched.
(cherry picked from commit 3b49f2782e8faf68766269b9c7390b16e25ae824)
* launcher: use xdga tokens
This reuses wlroots token tracking for workspace matching. It doesn't
export any xdga tokens for clients yet.
(cherry picked from commit bd66f4943da1c96edc3ba49573e27b42b688c543)
* launcher: rename pid_workspace to launcher_ctx
Soon we will match views with more than just a pid.
(cherry picked from commit d75c9f9722389d441fd24bd490c5cf12c4bef39a)
* view: associate launch contexts with views
Views now maintain a reference to a launch context which, as a last
resort, is populated at map time with a context associated with its pid.
This opens the possibility of populating it before map via another
source, e.g. xdga-tokens or configuration.
(cherry picked from commit 864b3a9a18f236f92f1898bb44ab977ceaebfd68)
* launcher: initialize launcher_ctxs once on startup
(cherry picked from commit 66568508c06267445489d655c91c94a34d6d9ffe)
* launcher: fudge the interface a bit
We want to create a context before knowing the pid it will match with.
(cherry picked from commit bdeb9f95651f6c99cc2f4cfb59020ddee202cf36)
* launcher: export xdga tokens and use them for workspace matching
(cherry picked from commit 30ad4dc4a5a41ce7c7aa85096a6e18f374172983)
* launcher: export X startup ids and use them for workspace matching
(cherry picked from commit 28fda4c0d38907fab94dc7d82c9dcf0754748b4e)
* swaybar: Prioritize hotspot events to bar bindings
This is consistent with i3bar's behaviour, and for example, allows binding a
command to button1, while still being able to click on tray icons or other
zones on the bar's status line which may have their own bindings.
E.g., in Sway, without this commit, this config. makes tray icons unclickable:
bar {
# ...
bindsym button1 exec swaynag -m You_clicked_the_tray._Want_some_help?
}
But the same configuration in i3 (with i3-nagbar) keeps tray items clickable.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 53f9dbd424dc173a85c9f4cd30802259d38b1ef4)
* swaybar: Make hotspots block bar release bindings
The previous commit prioritized hotspots before bar bindings for press events,
which matches i3's behaviour. However, since hotspots don't need to do any
processing on release events, those were not handled, and simply fell through
to `bindsym --release` bar bindings (if any).
This is counter-intuitive, and doesn't match i3's behaviour. Instead in case
a hotspot handles the press event, it should also handle the release event,
doing nothing, but blocking the event from triggering a --release bar binding.
E.g., in Sway, without this commit, this config. shows a text on tray clicks:
bar {
# ...
bindsym --release button1 exec swaynag -m I_got_the_release_event.
}
But the same configuration in i3 (with i3-nagbar) doesn't show the text.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 94b69acf0d7b26ee5af2172300cb18473508da76)
* build: drop unused wayland-egl dependency
(cherry picked from commit 37e4a3d6370dc6ba2b0877d588845c06781e880e)
* build: bump version to 1.8-rc1
* Fix build on Debian Stable
(cherry picked from commit dca0bb5749bc16f91ab964fc1b06ebb9a453368f)
* build: fix have_xwayland when xcb-icccm is not found
xcb-icccm is required to build Xwayland support.
Backported from commit d41f11e6bd8cef80f02dda4c66d4a31611aed753.
* build: bump version to 1.8-rc2
* seat: Avoid sending redundant keymaps on reload
When we reload the config, we reset every input device and re-apply
configuration from the config file. This means that the keyboard keymap
is updated at least once during config reload, more if the config file
contains keyboard configuration.
When they keyboard keymap changes and is updated through wlr_seat, the
keymap ends up sent to every keyboard bound in every client, seemingly
multiple times. On an x230 of mine with a keyboard layout set in the
config file, I see 42 keymap events sent to foot on config reload.
Reduce events from keyboard configurations by skipping all but the
currently active keyboard for the seat, and by clearing the active
keyboard during input manager device reset. After this change, I only
see a single just-in-time keymap event.
Fixes: https://github.com/swaywm/sway/issues/6654
* criteria: be lenient on window_role and instance too
* build: bump version to 1.8-rc3
* commands/move: Warp cursor after moving workspace to another output
This makes sway's behavior consistent with i3 when `mouse_warping` is
set to any value besides `none`.
Fixes #7027.
(cherry picked from commit e3c63bf58d0744dfb436f0f38442ce3735e40f47)
* seat: Set keyboard if seat keyboard is NULL
sway sends wl_keyboard.enter on seat focus change and when a keyboard
active on a seat is configured. If all keyboards are removed and a
keyboard is added back without changing the focused client, no new
notify event would be sent despite having keyboard focus. This could
lead to key events without notify, which is a protocol violation.
As a quick fix, when configuring a keyboard on a seat where no keyboard
is currently active, activate the keyboard so that a focused surface
will receive a notify event.
Regressed by: e1b268af98edeb09e570e8855ef64f0719cbafe2
Closes: https://github.com/swaywm/sway/issues/7330
(cherry picked from commit 1ade0ce753dc5f588584f444ce80d27c3b1e4300)
* build: bump version to 1.8-rc4
* swaynag: fix NULL font description
The font description was only set if provided on the CLI. It was
left NULL for the defaults and when reading from the config file.
Closes: https://github.com/swaywm/sway/issues/7186
(cherry picked from commit fd0af78e43f4dd67a404f475c676b25ae38a4b82)
* build: bump version to 1.8
* Removed other README languages
* Fixed build issues
* Removed alpha from render_data struct
* Updated PKGBUILDs and COPR spec
* Update sway/desktop/render.c
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
* Fixed deco_data not being initialized properly
* Replaced wlr_egl_(make|unset)_current with eglMakeCurrent
* Added matrix_projection into fx_renderer
Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: Sefa Eyeoglu <contact@scrumplex.net>
Co-authored-by: Simon Ser <contact@emersion.fr>
Co-authored-by: Seth Barberee <seth.barberee@gmail.com>
Co-authored-by: Thomas Hebb <tommyhebb@gmail.com>
Co-authored-by: Nathan Schulte <nmschulte@gmail.com>
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
Co-authored-by: David Rosca <nowrep@gmail.com>
Co-authored-by: David96 <david@hameipe.de>
Co-authored-by: Kenny Levinsen <kl@kl.wtf>
Co-authored-by: Aleksei Bavshin <alebastr89@gmail.com>
Co-authored-by: Kirill Chibisov <contact@kchibisov.com>
Co-authored-by: Tudor Brindus <me@tbrindus.ca>
Co-authored-by: Patrick Hilhorst <git@hilhorst.be>
Co-authored-by: Rouven Czerwinski <rouven@czerwinskis.de>
Co-authored-by: Tobias Bengfort <tobias.bengfort@posteo.de>
Co-authored-by: Ronan Pigott <rpigott@berkeley.edu>
Co-authored-by: Kirill Primak <vyivel@eclair.cafe>
Co-authored-by: Tuomas Yrjölä <mail@yrhki.fi>
Co-authored-by: Kirill Primak <vyivel@posteo.net>
Co-authored-by: Alexander Browne <elcste@users.noreply.github.com>
Co-authored-by: Marco Rubin <20150305+Rubo3@users.noreply.github.com>
Co-authored-by: Muhamed Hobi <woohoomoo2u@gmail.com>
Co-authored-by: Simon Zeni <simon@bl4ckb0ne.ca>
Co-authored-by: Nihal Jere <nihal@nihaljere.xyz>
Co-authored-by: Alexander Gramiak <agrambot@gmail.com>
Co-authored-by: Moon Sungjoon <sumoon@seoulsaram.org>
Co-authored-by: Nicolas Avrutin <nicolas@avrutin.net>
Co-authored-by: ndren <andreien@ctemplar.com>
Co-authored-by: Bill Li <billli11hkb@gmail.com>
Co-authored-by: Leonardo Hernández Hernández <leohdz172@protonmail.com>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Co-authored-by: Manuel Stoeckl <code@mstoeckl.com>
Co-authored-by: Yasin Silavi <59373143+sttatusx@users.noreply.github.com>
Co-authored-by: Daniel De Graaf <code@danieldg.net>
Co-authored-by: kraftwerk28 <kefirchik3@gmail.com>
Co-authored-by: Eskil <67291226+eschillus@users.noreply.github.com>
Co-authored-by: Alice Carroll <git@alice-carroll.pet>
Co-authored-by: Alan <51193876+Pound-Hash@users.noreply.github.com>
Co-authored-by: Victor Makarov <vitja.makarov@gmail.com>
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: -k <slowdive@me.com>
Co-authored-by: Hongyi <61831273+FrozenArcher@users.noreply.github.com>
Co-authored-by: Urey. Xue <urey.s.knowledge@gmail.com>
Co-authored-by: LordRishav <75823494+LordRishav@users.noreply.github.com>
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
Co-authored-by: Florian Franzen <Florian.Franzen@gmail.com>
Co-authored-by: Greg Depoire--Ferrer <greg@gregdf.com>
Co-authored-by: Thomas Jost <schnouki@schnouki.net>
Co-authored-by: Hugo Osvaldo Barrera <hugo@barrera.io>
Co-authored-by: zkldi <ktchidev@gmail.com>
Co-authored-by: llyyr <llyyr.public@gmail.com>
Co-authored-by: Baltazár Radics <baltazar.radics@gmail.com>
Co-authored-by: Martin Michlmayr <tbm@cyrius.com>
Co-authored-by: Filip Szczepański <jazz2rulez@gmail.com>
Co-authored-by: Alex Maese <memaese@hotmail.com>
Co-authored-by: マリウス <marius@xn--gckvb8fzb.com>
Co-authored-by: Andri Yngvason <andri@yngvason.is>
Co-authored-by: ohno418 <yutaro.ono.418@gmail.com>
Co-authored-by: Ferdinand Schober <ferdinand.schober@fau.de>
Co-authored-by: cparm <armelcadetpetit@gmail.com>
Co-authored-by: Yaroslav de la Peña Smirnov <yps@yaroslavps.com>
Co-authored-by: Alexander Orzechowski <orzechowski.alexander@gmail.com>
Co-authored-by: pudiva chip líquida <pudiva@skylittlesystem.org>
Co-authored-by: Puck Meerburg <puck@puckipedia.com>
Co-authored-by: Callum Andrew <calcium@mailbox.org>
Co-authored-by: Ronan Pigott <ronan@rjp.ie>
Co-authored-by: Joan Bruguera <joanbrugueram@gmail.com>
Co-authored-by: nerdopolis <bluescreen_avenger@verizon.net>
Co-authored-by: Ankit Pandey <anpandey@protonmail.com>
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
2023-01-05 09:32:43 +11:00
|
|
|
snprintf(part, len + 1, "[%s]", mark);
|
2018-10-31 22:27:38 +11:00
|
|
|
strcat(buffer, part);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
free(part);
|
|
|
|
|
2021-08-23 06:01:10 +10:00
|
|
|
render_titlebar_text_texture(output, con, texture, class, false, buffer);
|
2018-10-31 22:27:38 +11:00
|
|
|
|
|
|
|
free(buffer);
|
|
|
|
}
|
|
|
|
|
|
|
|
void container_update_marks_textures(struct sway_container *con) {
|
|
|
|
if (!config->show_marks) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
update_marks_texture(con, &con->marks_focused,
|
|
|
|
&config->border_colors.focused);
|
|
|
|
update_marks_texture(con, &con->marks_focused_inactive,
|
|
|
|
&config->border_colors.focused_inactive);
|
|
|
|
update_marks_texture(con, &con->marks_unfocused,
|
|
|
|
&config->border_colors.unfocused);
|
|
|
|
update_marks_texture(con, &con->marks_urgent,
|
|
|
|
&config->border_colors.urgent);
|
2021-12-11 02:09:29 +11:00
|
|
|
update_marks_texture(con, &con->marks_focused_tab_title,
|
|
|
|
&config->border_colors.focused_tab_title);
|
2018-10-31 22:27:38 +11:00
|
|
|
container_damage_whole(con);
|
|
|
|
}
|
2019-01-10 23:04:42 +11:00
|
|
|
|
|
|
|
void container_raise_floating(struct sway_container *con) {
|
|
|
|
// Bring container to front by putting it at the end of the floating list.
|
2020-06-05 04:28:43 +10:00
|
|
|
struct sway_container *floater = container_toplevel_ancestor(con);
|
2021-02-13 09:22:51 +11:00
|
|
|
if (container_is_floating(floater) && floater->pending.workspace) {
|
|
|
|
list_move_to_end(floater->pending.workspace->floating, floater);
|
|
|
|
node_set_dirty(&floater->pending.workspace->node);
|
2019-01-10 23:04:42 +11:00
|
|
|
}
|
|
|
|
}
|
2019-01-28 20:06:42 +11:00
|
|
|
|
|
|
|
bool container_is_scratchpad_hidden(struct sway_container *con) {
|
2021-02-13 09:22:51 +11:00
|
|
|
return con->scratchpad && !con->pending.workspace;
|
2019-01-28 20:06:42 +11:00
|
|
|
}
|
2020-01-15 11:08:01 +11:00
|
|
|
|
|
|
|
bool container_is_scratchpad_hidden_or_child(struct sway_container *con) {
|
2020-06-05 04:28:43 +10:00
|
|
|
con = container_toplevel_ancestor(con);
|
2021-02-13 09:22:51 +11:00
|
|
|
return con->scratchpad && !con->pending.workspace;
|
2020-01-15 11:08:01 +11:00
|
|
|
}
|
2020-11-03 16:16:15 +11:00
|
|
|
|
|
|
|
bool container_is_sticky(struct sway_container *con) {
|
|
|
|
return con->is_sticky && container_is_floating(con);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool container_is_sticky_or_child(struct sway_container *con) {
|
|
|
|
return container_is_sticky(container_toplevel_ancestor(con));
|
|
|
|
}
|
2020-11-02 17:43:07 +11:00
|
|
|
|
|
|
|
static bool is_parallel(enum sway_container_layout first,
|
|
|
|
enum sway_container_layout second) {
|
|
|
|
switch (first) {
|
|
|
|
case L_TABBED:
|
|
|
|
case L_HORIZ:
|
|
|
|
return second == L_TABBED || second == L_HORIZ;
|
|
|
|
case L_STACKED:
|
|
|
|
case L_VERT:
|
|
|
|
return second == L_STACKED || second == L_VERT;
|
|
|
|
default:
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static bool container_is_squashable(struct sway_container *con,
|
|
|
|
struct sway_container *child) {
|
|
|
|
enum sway_container_layout gp_layout = container_parent_layout(con);
|
2021-02-13 09:22:51 +11:00
|
|
|
return (con->pending.layout == L_HORIZ || con->pending.layout == L_VERT) &&
|
|
|
|
(child->pending.layout == L_HORIZ || child->pending.layout == L_VERT) &&
|
|
|
|
!is_parallel(con->pending.layout, child->pending.layout) &&
|
|
|
|
is_parallel(gp_layout, child->pending.layout);
|
2020-11-02 17:43:07 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
static void container_squash_children(struct sway_container *con) {
|
2021-02-13 09:22:51 +11:00
|
|
|
for (int i = 0; i < con->pending.children->length; i++) {
|
|
|
|
struct sway_container *child = con->pending.children->items[i];
|
2020-11-02 17:43:07 +11:00
|
|
|
i += container_squash(child);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int container_squash(struct sway_container *con) {
|
2021-02-13 09:22:51 +11:00
|
|
|
if (!con->pending.children) {
|
2020-11-02 17:43:07 +11:00
|
|
|
return 0;
|
|
|
|
}
|
2021-02-13 09:22:51 +11:00
|
|
|
if (con->pending.children->length != 1) {
|
2020-11-02 17:43:07 +11:00
|
|
|
container_squash_children(con);
|
|
|
|
return 0;
|
|
|
|
}
|
2021-02-13 09:22:51 +11:00
|
|
|
struct sway_container *child = con->pending.children->items[0];
|
2020-11-02 17:43:07 +11:00
|
|
|
int idx = container_sibling_index(con);
|
|
|
|
int change = 0;
|
|
|
|
if (container_is_squashable(con, child)) {
|
|
|
|
// con and child are a redundant H/V pair. Destroy them.
|
2021-02-13 09:22:51 +11:00
|
|
|
while (child->pending.children->length) {
|
|
|
|
struct sway_container *current = child->pending.children->items[0];
|
2020-11-02 17:43:07 +11:00
|
|
|
container_detach(current);
|
2021-02-13 09:22:51 +11:00
|
|
|
if (con->pending.parent) {
|
|
|
|
container_insert_child(con->pending.parent, current, idx);
|
2020-11-02 17:43:07 +11:00
|
|
|
} else {
|
2021-02-13 09:22:51 +11:00
|
|
|
workspace_insert_tiling_direct(con->pending.workspace, current, idx);
|
2020-11-02 17:43:07 +11:00
|
|
|
}
|
|
|
|
change++;
|
|
|
|
}
|
|
|
|
// This will also destroy con because child was its only child
|
|
|
|
container_reap_empty(child);
|
|
|
|
change--;
|
|
|
|
} else {
|
|
|
|
container_squash_children(con);
|
|
|
|
}
|
|
|
|
return change;
|
|
|
|
}
|