2018-11-25 12:12:48 +01:00
|
|
|
#define _POSIX_C_SOURCE 200809L
|
2019-08-15 06:59:39 +02:00
|
|
|
#include <assert.h>
|
2018-07-20 01:28:22 +02:00
|
|
|
#include <linux/input-event-codes.h>
|
2019-01-24 12:32:49 +01:00
|
|
|
#include <string.h>
|
2018-04-08 20:15:13 +02:00
|
|
|
#include <strings.h>
|
2018-04-03 23:03:29 +02:00
|
|
|
#include <time.h>
|
2022-11-26 20:18:43 +01:00
|
|
|
#include <wlr/config.h>
|
2017-12-08 13:22:26 +01:00
|
|
|
#include <wlr/types/wlr_cursor.h>
|
2018-12-02 22:57:05 +01:00
|
|
|
#include <wlr/types/wlr_data_device.h>
|
2022-10-04 11:44:05 +02:00
|
|
|
#include <wlr/types/wlr_idle_notify_v1.h>
|
2020-05-14 03:12:53 +02:00
|
|
|
#include <wlr/types/wlr_keyboard_group.h>
|
2018-03-31 21:13:27 +02:00
|
|
|
#include <wlr/types/wlr_output_layout.h>
|
2018-12-02 22:57:05 +01:00
|
|
|
#include <wlr/types/wlr_primary_selection.h>
|
2019-09-18 06:46:29 +02:00
|
|
|
#include <wlr/types/wlr_tablet_v2.h>
|
2022-03-08 23:01:54 +01:00
|
|
|
#include <wlr/types/wlr_touch.h>
|
2017-12-09 17:51:28 +01:00
|
|
|
#include <wlr/types/wlr_xcursor_manager.h>
|
2018-07-25 13:32:20 +02:00
|
|
|
#include "config.h"
|
2019-06-12 03:41:02 +02:00
|
|
|
#include "list.h"
|
2018-12-02 22:57:05 +01:00
|
|
|
#include "log.h"
|
2020-12-28 22:36:12 +01:00
|
|
|
#include "sway/config.h"
|
2023-11-22 01:55:47 +01:00
|
|
|
#include "sway/scene_descriptor.h"
|
2017-12-08 14:07:47 +01:00
|
|
|
#include "sway/input/cursor.h"
|
|
|
|
#include "sway/input/input-manager.h"
|
2017-12-10 19:59:04 +01:00
|
|
|
#include "sway/input/keyboard.h"
|
2021-02-08 19:24:20 +01:00
|
|
|
#include "sway/input/libinput.h"
|
2018-06-09 14:26:03 +02:00
|
|
|
#include "sway/input/seat.h"
|
2019-03-20 04:47:29 +01:00
|
|
|
#include "sway/input/switch.h"
|
2019-09-18 06:46:29 +02:00
|
|
|
#include "sway/input/tablet.h"
|
2018-03-29 22:51:36 +02:00
|
|
|
#include "sway/ipc-server.h"
|
2018-04-03 23:03:29 +02:00
|
|
|
#include "sway/layers.h"
|
2017-12-09 17:51:28 +01:00
|
|
|
#include "sway/output.h"
|
2019-06-01 21:05:09 +02:00
|
|
|
#include "sway/server.h"
|
2018-04-28 03:26:14 +02:00
|
|
|
#include "sway/tree/arrange.h"
|
2018-03-30 16:31:21 +02:00
|
|
|
#include "sway/tree/container.h"
|
2018-08-26 04:05:16 +02:00
|
|
|
#include "sway/tree/root.h"
|
2018-03-30 05:41:33 +02:00
|
|
|
#include "sway/tree/view.h"
|
2018-04-17 01:31:34 +02:00
|
|
|
#include "sway/tree/workspace.h"
|
2017-12-07 15:58:32 +01:00
|
|
|
|
2017-12-14 17:11:56 +01:00
|
|
|
static void seat_device_destroy(struct sway_seat_device *seat_device) {
|
|
|
|
if (!seat_device) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
sway_keyboard_destroy(seat_device->keyboard);
|
2019-09-18 06:46:29 +02:00
|
|
|
sway_tablet_destroy(seat_device->tablet);
|
|
|
|
sway_tablet_pad_destroy(seat_device->tablet_pad);
|
2022-03-05 17:47:58 +01:00
|
|
|
sway_switch_destroy(seat_device->switch_device);
|
2017-12-14 17:11:56 +01:00
|
|
|
wlr_cursor_detach_input_device(seat_device->sway_seat->cursor->cursor,
|
|
|
|
seat_device->input_device->wlr_device);
|
|
|
|
wl_list_remove(&seat_device->link);
|
|
|
|
free(seat_device);
|
|
|
|
}
|
|
|
|
|
2020-12-28 03:53:43 +01:00
|
|
|
static void seat_node_destroy(struct sway_seat_node *seat_node) {
|
|
|
|
wl_list_remove(&seat_node->destroy.link);
|
|
|
|
wl_list_remove(&seat_node->link);
|
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.
2022-01-06 12:44:55 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
* This is the only time we remove items from the focus stack without
|
|
|
|
* immediately re-adding them. If we just removed the last thing,
|
|
|
|
* mark that nothing has focus anymore.
|
|
|
|
*/
|
|
|
|
if (wl_list_empty(&seat_node->seat->focus_stack)) {
|
|
|
|
seat_node->seat->has_focus = false;
|
|
|
|
}
|
|
|
|
|
2020-12-28 03:53:43 +01:00
|
|
|
free(seat_node);
|
|
|
|
}
|
|
|
|
|
2018-04-02 14:45:37 +02:00
|
|
|
void seat_destroy(struct sway_seat *seat) {
|
2020-12-28 22:36:12 +01:00
|
|
|
if (seat == config->handler_context.seat) {
|
|
|
|
config->handler_context.seat = input_manager_get_default_seat();
|
|
|
|
}
|
2018-01-16 21:16:04 +01:00
|
|
|
struct sway_seat_device *seat_device, *next;
|
|
|
|
wl_list_for_each_safe(seat_device, next, &seat->devices, link) {
|
|
|
|
seat_device_destroy(seat_device);
|
|
|
|
}
|
2020-12-28 03:53:43 +01:00
|
|
|
struct sway_seat_node *seat_node, *next_seat_node;
|
|
|
|
wl_list_for_each_safe(seat_node, next_seat_node, &seat->focus_stack,
|
|
|
|
link) {
|
|
|
|
seat_node_destroy(seat_node);
|
|
|
|
}
|
2020-12-28 03:07:41 +01:00
|
|
|
sway_input_method_relay_finish(&seat->im_relay);
|
2018-01-16 21:16:04 +01:00
|
|
|
sway_cursor_destroy(seat->cursor);
|
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 13:00:10 +02:00
|
|
|
wl_list_remove(&seat->new_node.link);
|
2019-02-16 11:55:44 +01:00
|
|
|
wl_list_remove(&seat->request_start_drag.link);
|
|
|
|
wl_list_remove(&seat->start_drag.link);
|
2018-12-02 22:57:05 +01:00
|
|
|
wl_list_remove(&seat->request_set_selection.link);
|
|
|
|
wl_list_remove(&seat->request_set_primary_selection.link);
|
2018-01-16 21:16:04 +01:00
|
|
|
wl_list_remove(&seat->link);
|
|
|
|
wlr_seat_destroy(seat->wlr_seat);
|
2019-06-12 03:41:02 +02:00
|
|
|
for (int i = 0; i < seat->deferred_bindings->length; i++) {
|
|
|
|
free_sway_binding(seat->deferred_bindings->items[i]);
|
|
|
|
}
|
2023-11-22 01:55:47 +01:00
|
|
|
wlr_scene_node_destroy(&seat->scene_tree->node);
|
2019-06-12 03:41:02 +02:00
|
|
|
list_free(seat->deferred_bindings);
|
2018-10-21 03:26:22 +02:00
|
|
|
free(seat->prev_workspace_name);
|
|
|
|
free(seat);
|
2018-01-16 21:16:04 +01:00
|
|
|
}
|
|
|
|
|
2019-12-11 17:00:39 +01:00
|
|
|
void seat_idle_notify_activity(struct sway_seat *seat,
|
|
|
|
enum sway_input_idle_source source) {
|
2023-07-12 10:14:15 +02:00
|
|
|
if ((source & seat->idle_inhibit_sources) == 0) {
|
|
|
|
return;
|
2019-12-11 17:00:39 +01:00
|
|
|
}
|
2023-07-12 10:14:15 +02:00
|
|
|
wlr_idle_notifier_v1_notify_activity(server.idle_notifier_v1, seat->wlr_seat);
|
2019-12-11 17:00:39 +01:00
|
|
|
}
|
|
|
|
|
2018-05-11 01:13:40 +02:00
|
|
|
/**
|
|
|
|
* Activate all views within this container recursively.
|
|
|
|
*/
|
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 13:00:10 +02:00
|
|
|
static void seat_send_activate(struct sway_node *node, struct sway_seat *seat) {
|
|
|
|
if (node_is_view(node)) {
|
|
|
|
if (!seat_is_input_allowed(seat, node->sway_container->view->surface)) {
|
2019-01-20 19:51:12 +01:00
|
|
|
sway_log(SWAY_DEBUG, "Refusing to set focus, input is inhibited");
|
2018-05-11 01:13:40 +02: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 13:00:10 +02:00
|
|
|
view_set_activated(node->sway_container->view, true);
|
2018-03-31 23:07:37 +02:00
|
|
|
} else {
|
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 13:00:10 +02:00
|
|
|
list_t *children = node_get_children(node);
|
|
|
|
for (int i = 0; i < children->length; ++i) {
|
|
|
|
struct sway_container *child = children->items[i];
|
|
|
|
seat_send_activate(&child->node, seat);
|
2018-05-11 01:13:40 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-08-15 06:59:39 +02:00
|
|
|
static struct sway_keyboard *sway_keyboard_for_wlr_keyboard(
|
|
|
|
struct sway_seat *seat, struct wlr_keyboard *wlr_keyboard) {
|
|
|
|
struct sway_seat_device *seat_device;
|
|
|
|
wl_list_for_each(seat_device, &seat->devices, link) {
|
|
|
|
struct sway_input_device *input_device = seat_device->input_device;
|
|
|
|
if (input_device->wlr_device->type != WLR_INPUT_DEVICE_KEYBOARD) {
|
|
|
|
continue;
|
|
|
|
}
|
2022-06-21 23:10:38 +02:00
|
|
|
if (input_device->wlr_device == &wlr_keyboard->base) {
|
2019-08-15 06:59:39 +02:00
|
|
|
return seat_device->keyboard;
|
|
|
|
}
|
|
|
|
}
|
2019-11-03 20:20:05 +01:00
|
|
|
struct sway_keyboard_group *group;
|
|
|
|
wl_list_for_each(group, &seat->keyboard_groups, link) {
|
|
|
|
struct sway_input_device *input_device =
|
|
|
|
group->seat_device->input_device;
|
2022-06-21 23:10:38 +02:00
|
|
|
if (input_device->wlr_device == &wlr_keyboard->base) {
|
2019-11-03 20:20:05 +01:00
|
|
|
return group->seat_device->keyboard;
|
|
|
|
}
|
|
|
|
}
|
2019-08-15 06:59:39 +02:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void seat_keyboard_notify_enter(struct sway_seat *seat,
|
|
|
|
struct wlr_surface *surface) {
|
|
|
|
struct wlr_keyboard *keyboard = wlr_seat_get_keyboard(seat->wlr_seat);
|
|
|
|
if (!keyboard) {
|
|
|
|
wlr_seat_keyboard_notify_enter(seat->wlr_seat, surface, NULL, 0, NULL);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct sway_keyboard *sway_keyboard =
|
|
|
|
sway_keyboard_for_wlr_keyboard(seat, keyboard);
|
|
|
|
assert(sway_keyboard && "Cannot find sway_keyboard for seat keyboard");
|
|
|
|
|
|
|
|
struct sway_shortcut_state *state = &sway_keyboard->state_pressed_sent;
|
|
|
|
wlr_seat_keyboard_notify_enter(seat->wlr_seat, surface,
|
|
|
|
state->pressed_keycodes, state->npressed, &keyboard->modifiers);
|
|
|
|
}
|
|
|
|
|
2023-01-09 16:28:59 +01:00
|
|
|
static void seat_tablet_pads_set_focus(struct sway_seat *seat,
|
2019-09-18 06:46:29 +02:00
|
|
|
struct wlr_surface *surface) {
|
|
|
|
struct sway_seat_device *seat_device;
|
|
|
|
wl_list_for_each(seat_device, &seat->devices, link) {
|
2023-01-09 16:28:59 +01:00
|
|
|
sway_tablet_pad_set_focus(seat_device->tablet_pad, surface);
|
2019-09-18 06:46:29 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-05-11 01:13:40 +02:00
|
|
|
/**
|
|
|
|
* If con is a view, set it as active and enable keyboard input.
|
|
|
|
* If con is a container, set all child views as active and don't enable
|
|
|
|
* keyboard input on any.
|
|
|
|
*/
|
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 13:00:10 +02:00
|
|
|
static void seat_send_focus(struct sway_node *node, struct sway_seat *seat) {
|
|
|
|
seat_send_activate(node, seat);
|
2018-05-11 01:13:40 +02: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 13:00:10 +02:00
|
|
|
struct sway_view *view = node->type == N_CONTAINER ?
|
|
|
|
node->sway_container->view : NULL;
|
|
|
|
|
|
|
|
if (view && seat_is_input_allowed(seat, view->surface)) {
|
2018-11-18 00:33:06 +01:00
|
|
|
#if HAVE_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 13:00:10 +02:00
|
|
|
if (view->type == SWAY_VIEW_XWAYLAND) {
|
2018-10-18 13:20:00 +02:00
|
|
|
struct wlr_xwayland *xwayland = server.xwayland.wlr_xwayland;
|
2018-05-11 01:13:40 +02:00
|
|
|
wlr_xwayland_set_seat(xwayland, seat->wlr_seat);
|
|
|
|
}
|
2018-07-24 23:37:41 +02:00
|
|
|
#endif
|
2019-08-15 06:59:39 +02:00
|
|
|
|
|
|
|
seat_keyboard_notify_enter(seat, view->surface);
|
2023-01-09 16:28:59 +01:00
|
|
|
seat_tablet_pads_set_focus(seat, view->surface);
|
2019-10-18 12:57:17 +02:00
|
|
|
sway_input_method_relay_set_focus(&seat->im_relay, view->surface);
|
2019-01-26 00:45:06 +01:00
|
|
|
|
|
|
|
struct wlr_pointer_constraint_v1 *constraint =
|
|
|
|
wlr_pointer_constraints_v1_constraint_for_surface(
|
|
|
|
server.pointer_constraints, view->surface, seat->wlr_seat);
|
|
|
|
sway_cursor_constrain(seat->cursor, constraint);
|
2018-03-31 23:07:37 +02: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 13:00:10 +02:00
|
|
|
void seat_for_each_node(struct sway_seat *seat,
|
|
|
|
void (*f)(struct sway_node *node, void *data), void *data) {
|
|
|
|
struct sway_seat_node *current = NULL;
|
2018-04-07 22:14:12 +02:00
|
|
|
wl_list_for_each(current, &seat->focus_stack, link) {
|
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 13:00:10 +02:00
|
|
|
f(current->node, data);
|
2018-04-07 22:14:12 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-04-07 22:06:36 +02:00
|
|
|
struct sway_container *seat_get_focus_inactive_view(struct sway_seat *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 13:00:10 +02:00
|
|
|
struct sway_node *ancestor) {
|
2021-10-09 15:40:24 +02:00
|
|
|
if (node_is_view(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 13:00:10 +02:00
|
|
|
return ancestor->sway_container;
|
2018-08-17 09:32:53 +02: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 13:00:10 +02:00
|
|
|
struct sway_seat_node *current;
|
2018-08-17 09:32:53 +02:00
|
|
|
wl_list_for_each(current, &seat->focus_stack, link) {
|
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 13:00:10 +02:00
|
|
|
struct sway_node *node = current->node;
|
2021-10-09 15:40:24 +02:00
|
|
|
if (node_is_view(node) && node_has_ancestor(node, 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 13:00:10 +02:00
|
|
|
return node->sway_container;
|
2018-08-17 09:32:53 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return NULL;
|
2018-04-07 22:06:36 +02: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 13:00:10 +02:00
|
|
|
static void handle_seat_node_destroy(struct wl_listener *listener, void *data) {
|
|
|
|
struct sway_seat_node *seat_node =
|
|
|
|
wl_container_of(listener, seat_node, destroy);
|
|
|
|
struct sway_seat *seat = seat_node->seat;
|
|
|
|
struct sway_node *node = seat_node->node;
|
|
|
|
struct sway_node *parent = node_get_parent(node);
|
|
|
|
struct sway_node *focus = seat_get_focus(seat);
|
2018-02-11 00:10:29 +01:00
|
|
|
|
2018-10-02 07:42:16 +02:00
|
|
|
if (node->type == N_WORKSPACE) {
|
2019-08-12 08:28:49 +02:00
|
|
|
seat_node_destroy(seat_node);
|
2019-02-23 05:09:39 +01:00
|
|
|
// If an unmanaged or layer surface is focused when an output gets
|
|
|
|
// disabled and an empty workspace on the output was focused by the
|
2022-02-22 08:13:18 +01:00
|
|
|
// seat, the seat needs to refocus its focus inactive to update the
|
2019-02-23 05:09:39 +01:00
|
|
|
// value of seat->workspace.
|
|
|
|
if (seat->workspace == node->sway_workspace) {
|
|
|
|
struct sway_node *node = seat_get_focus_inactive(seat, &root->node);
|
|
|
|
seat_set_focus(seat, NULL);
|
|
|
|
if (node) {
|
|
|
|
seat_set_focus(seat, node);
|
|
|
|
} else {
|
|
|
|
seat->workspace = NULL;
|
|
|
|
}
|
|
|
|
}
|
2018-10-02 07:42:16 +02:00
|
|
|
return;
|
|
|
|
}
|
2018-02-11 00:10:29 +01:00
|
|
|
|
2018-10-02 07:42:16 +02:00
|
|
|
// Even though the container being destroyed might be nowhere near the
|
|
|
|
// focused container, we still need to set focus_inactive on a sibling of
|
|
|
|
// the container being destroyed.
|
|
|
|
bool needs_new_focus = focus &&
|
|
|
|
(focus == node || node_has_ancestor(focus, node));
|
2018-02-11 00:10:29 +01:00
|
|
|
|
2018-10-02 07:42:16 +02:00
|
|
|
seat_node_destroy(seat_node);
|
2018-02-11 00:10:29 +01:00
|
|
|
|
2019-04-01 05:27:18 +02:00
|
|
|
if (!parent && !needs_new_focus) {
|
2018-10-05 08:39:20 +02:00
|
|
|
// Destroying a container that is no longer in the tree
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-10-02 07:42:16 +02:00
|
|
|
// Find new focus_inactive (ie. sibling, or workspace if no siblings left)
|
|
|
|
struct sway_node *next_focus = NULL;
|
2019-04-01 05:27:18 +02:00
|
|
|
while (next_focus == NULL && parent != NULL) {
|
2018-10-02 07:42:16 +02:00
|
|
|
struct sway_container *con =
|
|
|
|
seat_get_focus_inactive_view(seat, parent);
|
|
|
|
next_focus = con ? &con->node : NULL;
|
2018-04-01 00:52:02 +02:00
|
|
|
|
2018-10-02 07:42:16 +02:00
|
|
|
if (next_focus == NULL && parent->type == N_WORKSPACE) {
|
|
|
|
next_focus = parent;
|
|
|
|
break;
|
2018-03-31 21:22:10 +02:00
|
|
|
}
|
2018-02-11 00:10:29 +01:00
|
|
|
|
2018-10-02 07:42:16 +02:00
|
|
|
parent = node_get_parent(parent);
|
|
|
|
}
|
|
|
|
|
2019-04-01 05:27:18 +02:00
|
|
|
if (!next_focus) {
|
|
|
|
struct sway_workspace *ws = seat_get_last_known_workspace(seat);
|
|
|
|
if (!ws) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
struct sway_container *con =
|
|
|
|
seat_get_focus_inactive_view(seat, &ws->node);
|
|
|
|
next_focus = con ? &(con->node) : &(ws->node);
|
|
|
|
}
|
|
|
|
|
2018-12-14 19:59:54 +01:00
|
|
|
if (next_focus->type == N_WORKSPACE &&
|
|
|
|
!workspace_is_visible(next_focus->sway_workspace)) {
|
|
|
|
// Do not change focus to a non-visible workspace
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-10-02 07:42:16 +02:00
|
|
|
if (needs_new_focus) {
|
2019-04-01 05:27:18 +02:00
|
|
|
// Make sure the workspace IPC event gets sent
|
|
|
|
if (node->type == N_CONTAINER && node->sway_container->scratchpad) {
|
|
|
|
seat_set_focus(seat, NULL);
|
|
|
|
}
|
2018-10-02 07:42:16 +02:00
|
|
|
// The structure change might have caused it to move up to the top of
|
2018-03-31 23:07:37 +02:00
|
|
|
// the focus stack without sending focus notifications to the view
|
2020-03-23 09:23:01 +01:00
|
|
|
if (seat_get_focus(seat) == next_focus) {
|
|
|
|
seat_send_focus(next_focus, seat);
|
|
|
|
} else {
|
|
|
|
seat_set_focus(seat, next_focus);
|
|
|
|
}
|
2018-10-02 07:42:16 +02:00
|
|
|
} else {
|
|
|
|
// Setting focus_inactive
|
2018-10-26 11:15:12 +02:00
|
|
|
focus = seat_get_focus_inactive(seat, &root->node);
|
2018-10-15 13:06:24 +02:00
|
|
|
seat_set_raw_focus(seat, next_focus);
|
2021-02-12 23:22:51 +01:00
|
|
|
if (focus->type == N_CONTAINER && focus->sway_container->pending.workspace) {
|
|
|
|
seat_set_raw_focus(seat, &focus->sway_container->pending.workspace->node);
|
2018-10-26 11:15:12 +02:00
|
|
|
}
|
2018-10-15 13:06:24 +02:00
|
|
|
seat_set_raw_focus(seat, focus);
|
2018-03-31 21:22:10 +02:00
|
|
|
}
|
2018-02-04 19:39:10 +01: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 13:00:10 +02:00
|
|
|
static struct sway_seat_node *seat_node_from_node(
|
|
|
|
struct sway_seat *seat, struct sway_node *node) {
|
|
|
|
if (node->type == N_ROOT || node->type == N_OUTPUT) {
|
|
|
|
// these don't get seat nodes ever
|
2018-02-11 00:10:29 +01: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 13:00:10 +02:00
|
|
|
struct sway_seat_node *seat_node = NULL;
|
|
|
|
wl_list_for_each(seat_node, &seat->focus_stack, link) {
|
|
|
|
if (seat_node->node == node) {
|
|
|
|
return seat_node;
|
2018-02-04 19:39:10 +01: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 13:00:10 +02:00
|
|
|
seat_node = calloc(1, sizeof(struct sway_seat_node));
|
|
|
|
if (seat_node == NULL) {
|
2019-01-20 19:51:12 +01:00
|
|
|
sway_log(SWAY_ERROR, "could not allocate seat node");
|
2018-02-04 19:39:10 +01: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 13:00:10 +02:00
|
|
|
seat_node->node = node;
|
|
|
|
seat_node->seat = seat;
|
|
|
|
wl_list_insert(seat->focus_stack.prev, &seat_node->link);
|
|
|
|
wl_signal_add(&node->events.destroy, &seat_node->destroy);
|
|
|
|
seat_node->destroy.notify = handle_seat_node_destroy;
|
2018-02-04 19:39:10 +01: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 13:00:10 +02:00
|
|
|
return seat_node;
|
2018-02-04 19:39:10 +01: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 13:00:10 +02:00
|
|
|
static void handle_new_node(struct wl_listener *listener, void *data) {
|
|
|
|
struct sway_seat *seat = wl_container_of(listener, seat, new_node);
|
|
|
|
struct sway_node *node = data;
|
|
|
|
seat_node_from_node(seat, node);
|
2018-02-04 19:39:10 +01:00
|
|
|
}
|
|
|
|
|
2023-11-22 01:55:47 +01:00
|
|
|
static void drag_icon_update_position(struct sway_seat *seat, struct wlr_scene_node *node) {
|
|
|
|
struct wlr_drag_icon *wlr_icon = scene_descriptor_try_get(node, SWAY_SCENE_DESC_DRAG_ICON);
|
2018-06-09 14:26:03 +02:00
|
|
|
struct wlr_cursor *cursor = seat->cursor->cursor;
|
2023-11-22 01:55:47 +01:00
|
|
|
|
2019-02-16 11:55:44 +01:00
|
|
|
switch (wlr_icon->drag->grab_type) {
|
|
|
|
case WLR_DRAG_GRAB_KEYBOARD:
|
|
|
|
return;
|
|
|
|
case WLR_DRAG_GRAB_KEYBOARD_POINTER:
|
2023-11-22 01:55:47 +01:00
|
|
|
wlr_scene_node_set_position(node, cursor->x, cursor->y);
|
2019-02-16 11:55:44 +01:00
|
|
|
break;
|
|
|
|
case WLR_DRAG_GRAB_KEYBOARD_TOUCH:;
|
2018-06-09 14:26:03 +02:00
|
|
|
struct wlr_touch_point *point =
|
2019-02-16 11:55:44 +01:00
|
|
|
wlr_seat_touch_get_point(seat->wlr_seat, wlr_icon->drag->touch_id);
|
2018-06-09 14:26:03 +02:00
|
|
|
if (point == NULL) {
|
|
|
|
return;
|
|
|
|
}
|
2023-11-22 01:55:47 +01:00
|
|
|
wlr_scene_node_set_position(node, seat->touch_x, seat->touch_y);
|
2018-06-09 14:26:03 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-11-22 01:55:47 +01:00
|
|
|
void drag_icons_update_position(struct sway_seat *seat) {
|
|
|
|
struct wlr_scene_node *node;
|
|
|
|
wl_list_for_each(node, &seat->drag_icons->children, link) {
|
|
|
|
drag_icon_update_position(seat, node);
|
|
|
|
}
|
2018-06-09 14:26:03 +02:00
|
|
|
}
|
|
|
|
|
2020-06-28 15:33:03 +02:00
|
|
|
static void drag_handle_destroy(struct wl_listener *listener, void *data) {
|
|
|
|
struct sway_drag *drag = wl_container_of(listener, drag, destroy);
|
|
|
|
|
|
|
|
// Focus enter isn't sent during drag, so refocus the focused node, layer
|
|
|
|
// surface or unmanaged surface.
|
|
|
|
struct sway_seat *seat = drag->seat;
|
|
|
|
struct sway_node *focus = seat_get_focus(seat);
|
|
|
|
if (focus) {
|
|
|
|
seat_set_focus(seat, NULL);
|
|
|
|
seat_set_focus(seat, focus);
|
|
|
|
} else if (seat->focused_layer) {
|
|
|
|
struct wlr_layer_surface_v1 *layer = seat->focused_layer;
|
|
|
|
seat_set_focus_layer(seat, NULL);
|
|
|
|
seat_set_focus_layer(seat, layer);
|
|
|
|
} else {
|
|
|
|
struct wlr_surface *unmanaged = seat->wlr_seat->keyboard_state.focused_surface;
|
|
|
|
seat_set_focus_surface(seat, NULL, false);
|
|
|
|
seat_set_focus_surface(seat, unmanaged, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
drag->wlr_drag->data = NULL;
|
|
|
|
wl_list_remove(&drag->destroy.link);
|
|
|
|
free(drag);
|
|
|
|
}
|
|
|
|
|
2019-02-16 11:55:44 +01:00
|
|
|
static void handle_request_start_drag(struct wl_listener *listener,
|
|
|
|
void *data) {
|
|
|
|
struct sway_seat *seat = wl_container_of(listener, seat, request_start_drag);
|
|
|
|
struct wlr_seat_request_start_drag_event *event = data;
|
|
|
|
|
|
|
|
if (wlr_seat_validate_pointer_grab_serial(seat->wlr_seat,
|
|
|
|
event->origin, event->serial)) {
|
|
|
|
wlr_seat_start_pointer_drag(seat->wlr_seat, event->drag, event->serial);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct wlr_touch_point *point;
|
|
|
|
if (wlr_seat_validate_touch_grab_serial(seat->wlr_seat,
|
|
|
|
event->origin, event->serial, &point)) {
|
|
|
|
wlr_seat_start_touch_drag(seat->wlr_seat,
|
|
|
|
event->drag, event->serial, point);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: tablet grabs
|
|
|
|
|
|
|
|
sway_log(SWAY_DEBUG, "Ignoring start_drag request: "
|
|
|
|
"could not validate pointer or touch serial %" PRIu32, event->serial);
|
|
|
|
wlr_data_source_destroy(event->drag->source);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void handle_start_drag(struct wl_listener *listener, void *data) {
|
|
|
|
struct sway_seat *seat = wl_container_of(listener, seat, start_drag);
|
|
|
|
struct wlr_drag *wlr_drag = data;
|
2020-06-28 15:33:03 +02:00
|
|
|
|
|
|
|
struct sway_drag *drag = calloc(1, sizeof(struct sway_drag));
|
|
|
|
if (drag == NULL) {
|
|
|
|
sway_log(SWAY_ERROR, "Allocation failed");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
drag->seat = seat;
|
|
|
|
drag->wlr_drag = wlr_drag;
|
|
|
|
wlr_drag->data = drag;
|
|
|
|
|
|
|
|
drag->destroy.notify = drag_handle_destroy;
|
|
|
|
wl_signal_add(&wlr_drag->events.destroy, &drag->destroy);
|
|
|
|
|
2019-02-16 11:55:44 +01:00
|
|
|
struct wlr_drag_icon *wlr_drag_icon = wlr_drag->icon;
|
2020-07-06 23:17:04 +02:00
|
|
|
if (wlr_drag_icon != NULL) {
|
2023-11-22 01:55:47 +01:00
|
|
|
struct wlr_scene_tree *tree = wlr_scene_drag_icon_create(seat->drag_icons, wlr_drag_icon);
|
|
|
|
if (!tree) {
|
|
|
|
sway_log(SWAY_ERROR, "Failed to allocate a drag icon scene tree");
|
2020-07-06 23:17:04 +02:00
|
|
|
return;
|
|
|
|
}
|
2018-06-09 14:26:03 +02:00
|
|
|
|
2023-11-22 01:55:47 +01:00
|
|
|
if (!scene_descriptor_assign(&tree->node, SWAY_SCENE_DESC_DRAG_ICON,
|
|
|
|
wlr_drag_icon)) {
|
|
|
|
sway_log(SWAY_ERROR, "Failed to allocate a drag icon scene descriptor");
|
|
|
|
wlr_scene_node_destroy(&tree->node);
|
|
|
|
return;
|
|
|
|
}
|
2018-06-09 14:26:03 +02:00
|
|
|
|
2023-11-22 01:55:47 +01:00
|
|
|
drag_icon_update_position(seat, &tree->node);
|
2020-07-06 23:17:04 +02:00
|
|
|
}
|
Introduce default seatop
This introduces a `default` seat operation which is used when no mouse
buttons are being held. This means there is now always a seat operation
in progress. It allows us to separate `default` code from the standard
cursor management code.
The sway_seatop_impl struct has gained callbacks `axis`, `rebase` and
`end`, and lost callbacks `finish` and `abort`. `axis` and `rebase` are
only used by the default seatop. `end` is called when a seatop is being
replaced by another one and allows the seatop to free any resources,
though no seatop currently needs to do this. `finish` is no longer
required, as each seatop can gracefully finish in their `button`
callback. And `abort` is not needed, as calling `end` would achieve the
same thing. The struct has also gained a bool named allow_set_cursor
which allows the client to set a new cursor during `default` and `down`
seatops.
Seatops would previously store which button they were started with and
stop when that button was released. This behaviour is changed so that it
only ends once all buttons are released. So you can start a drag with
$mod+left, then click and hold right, release left and it'll continue
dragging while the right button is held.
The motion callback now accepts dx and dy. Most seatops don't use this
as they store the cursor position when the seatop is started and compare
it with the current cursor position. This approach doesn't make sense
for the default seatop though, hence why dx and dy are needed.
The pressed_buttons array has been moved from the sway_cursor struct to
the default seatop's data. This is only used for the default seatop to
check bindings. The total pressed button count remains in the
sway_cursor struct though, because all the other seatops check it to
know if they should end.
The `down` seatop no longer has a `moved` property. This was used to
track if the cursor moved and to recheck focus_follows_mouse, but seems
to work without it.
The logic for focus_follows_mouse has been refactored. As part of this
I've removed the call to wlr_seat_keyboard_has_grab as we don't appear
to use keyboard grabs.
The functions for handling relative motion, absolute motion and tool
axis have been changed. Previously the handler functions were
handle_cursor_motion, handle_cursor_motion_absolute and
handle_tool_axis. The latter two both called cursor_motion_absolute.
Both handle_cursor_motion and cursor_motion_absolute did very similar
things. These are now simplified into three handlers and a single common
function called cursor_motion. All three handlers call cursor_motion. As
cursor_motion works with relative distances, the absolute and tool axis
handlers convert them to relative first.
2019-03-16 08:47:39 +01:00
|
|
|
seatop_begin_default(seat);
|
2018-06-09 14:26:03 +02:00
|
|
|
}
|
|
|
|
|
2018-12-02 22:57:05 +01:00
|
|
|
static void handle_request_set_selection(struct wl_listener *listener,
|
|
|
|
void *data) {
|
|
|
|
struct sway_seat *seat =
|
|
|
|
wl_container_of(listener, seat, request_set_selection);
|
|
|
|
struct wlr_seat_request_set_selection_event *event = data;
|
|
|
|
wlr_seat_set_selection(seat->wlr_seat, event->source, event->serial);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void handle_request_set_primary_selection(struct wl_listener *listener,
|
|
|
|
void *data) {
|
|
|
|
struct sway_seat *seat =
|
|
|
|
wl_container_of(listener, seat, request_set_primary_selection);
|
|
|
|
struct wlr_seat_request_set_primary_selection_event *event = data;
|
|
|
|
wlr_seat_set_primary_selection(seat->wlr_seat, event->source, event->serial);
|
|
|
|
}
|
|
|
|
|
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 13:00:10 +02:00
|
|
|
static void collect_focus_iter(struct sway_node *node, void *data) {
|
2018-02-10 22:52:45 +01:00
|
|
|
struct sway_seat *seat = 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 13:00:10 +02:00
|
|
|
struct sway_seat_node *seat_node = seat_node_from_node(seat, node);
|
|
|
|
if (!seat_node) {
|
2018-02-10 22:52:45 +01: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 13:00:10 +02:00
|
|
|
wl_list_remove(&seat_node->link);
|
|
|
|
wl_list_insert(&seat->focus_stack, &seat_node->link);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void collect_focus_workspace_iter(struct sway_workspace *workspace,
|
|
|
|
void *data) {
|
|
|
|
collect_focus_iter(&workspace->node, data);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void collect_focus_container_iter(struct sway_container *container,
|
|
|
|
void *data) {
|
|
|
|
collect_focus_iter(&container->node, data);
|
2018-02-10 22:52:45 +01:00
|
|
|
}
|
|
|
|
|
2018-10-18 13:20:00 +02:00
|
|
|
struct sway_seat *seat_create(const char *seat_name) {
|
2017-12-07 15:58:32 +01:00
|
|
|
struct sway_seat *seat = calloc(1, sizeof(struct sway_seat));
|
|
|
|
if (!seat) {
|
|
|
|
return NULL;
|
|
|
|
}
|
2017-12-08 13:22:26 +01:00
|
|
|
|
2023-11-22 01:55:47 +01:00
|
|
|
bool failed = false;
|
|
|
|
seat->scene_tree = alloc_scene_tree(root->layers.seat, &failed);
|
|
|
|
seat->drag_icons = alloc_scene_tree(seat->scene_tree, &failed);
|
|
|
|
if (failed) {
|
|
|
|
wlr_scene_node_destroy(&seat->scene_tree->node);
|
|
|
|
free(seat);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2018-10-18 13:20:00 +02:00
|
|
|
seat->wlr_seat = wlr_seat_create(server.wl_display, seat_name);
|
2017-12-14 17:11:56 +01:00
|
|
|
if (!sway_assert(seat->wlr_seat, "could not allocate seat")) {
|
2023-11-22 01:55:47 +01:00
|
|
|
wlr_scene_node_destroy(&seat->scene_tree->node);
|
2017-12-20 12:12:08 +01:00
|
|
|
free(seat);
|
2017-12-08 13:22:26 +01:00
|
|
|
return NULL;
|
|
|
|
}
|
2018-07-20 01:28:22 +02:00
|
|
|
seat->wlr_seat->data = seat;
|
2017-12-08 13:22:26 +01:00
|
|
|
|
|
|
|
seat->cursor = sway_cursor_create(seat);
|
|
|
|
if (!seat->cursor) {
|
2023-11-22 01:55:47 +01:00
|
|
|
wlr_scene_node_destroy(&seat->scene_tree->node);
|
2017-12-14 17:11:56 +01:00
|
|
|
wlr_seat_destroy(seat->wlr_seat);
|
2017-12-08 13:22:26 +01:00
|
|
|
free(seat);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2019-12-11 17:00:39 +01:00
|
|
|
seat->idle_inhibit_sources = seat->idle_wake_sources =
|
|
|
|
IDLE_SOURCE_KEYBOARD |
|
|
|
|
IDLE_SOURCE_POINTER |
|
|
|
|
IDLE_SOURCE_TOUCH |
|
|
|
|
IDLE_SOURCE_TABLET_PAD |
|
|
|
|
IDLE_SOURCE_TABLET_TOOL |
|
|
|
|
IDLE_SOURCE_SWITCH;
|
|
|
|
|
2018-02-04 19:39:10 +01:00
|
|
|
// init the focus stack
|
|
|
|
wl_list_init(&seat->focus_stack);
|
2018-02-10 22:52:45 +01:00
|
|
|
|
2019-11-24 21:41:18 +01:00
|
|
|
wl_list_init(&seat->devices);
|
|
|
|
|
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 13:00:10 +02:00
|
|
|
root_for_each_workspace(collect_focus_workspace_iter, seat);
|
|
|
|
root_for_each_container(collect_focus_container_iter, seat);
|
2018-02-04 19:39:10 +01:00
|
|
|
|
2019-06-12 03:41:02 +02:00
|
|
|
seat->deferred_bindings = create_list();
|
|
|
|
|
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 13:00:10 +02:00
|
|
|
wl_signal_add(&root->events.new_node, &seat->new_node);
|
|
|
|
seat->new_node.notify = handle_new_node;
|
2018-02-04 19:39:10 +01:00
|
|
|
|
2019-02-16 11:55:44 +01:00
|
|
|
wl_signal_add(&seat->wlr_seat->events.request_start_drag,
|
|
|
|
&seat->request_start_drag);
|
|
|
|
seat->request_start_drag.notify = handle_request_start_drag;
|
|
|
|
|
|
|
|
wl_signal_add(&seat->wlr_seat->events.start_drag, &seat->start_drag);
|
|
|
|
seat->start_drag.notify = handle_start_drag;
|
2018-06-09 14:26:03 +02:00
|
|
|
|
2018-12-02 22:57:05 +01:00
|
|
|
wl_signal_add(&seat->wlr_seat->events.request_set_selection,
|
|
|
|
&seat->request_set_selection);
|
|
|
|
seat->request_set_selection.notify = handle_request_set_selection;
|
|
|
|
|
|
|
|
wl_signal_add(&seat->wlr_seat->events.request_set_primary_selection,
|
|
|
|
&seat->request_set_primary_selection);
|
|
|
|
seat->request_set_primary_selection.notify =
|
|
|
|
handle_request_set_primary_selection;
|
|
|
|
|
2019-11-03 20:20:05 +01:00
|
|
|
wl_list_init(&seat->keyboard_groups);
|
2020-02-15 20:55:33 +01:00
|
|
|
wl_list_init(&seat->keyboard_shortcuts_inhibitors);
|
2017-12-10 17:11:47 +01:00
|
|
|
|
2019-10-18 12:57:17 +02:00
|
|
|
sway_input_method_relay_init(seat, &seat->im_relay);
|
|
|
|
|
2020-07-02 10:59:16 +02:00
|
|
|
bool first = wl_list_empty(&server.input->seats);
|
2018-10-18 13:20:00 +02:00
|
|
|
wl_list_insert(&server.input->seats, &seat->link);
|
2017-12-10 19:59:04 +01:00
|
|
|
|
2020-07-02 10:59:16 +02:00
|
|
|
if (!first) {
|
|
|
|
// Since this is not the first seat, attempt to set initial focus
|
|
|
|
struct sway_seat *current_seat = input_manager_current_seat();
|
|
|
|
struct sway_node *current_focus =
|
|
|
|
seat_get_focus_inactive(current_seat, &root->node);
|
|
|
|
seat_set_focus(seat, current_focus);
|
|
|
|
}
|
|
|
|
|
Introduce default seatop
This introduces a `default` seat operation which is used when no mouse
buttons are being held. This means there is now always a seat operation
in progress. It allows us to separate `default` code from the standard
cursor management code.
The sway_seatop_impl struct has gained callbacks `axis`, `rebase` and
`end`, and lost callbacks `finish` and `abort`. `axis` and `rebase` are
only used by the default seatop. `end` is called when a seatop is being
replaced by another one and allows the seatop to free any resources,
though no seatop currently needs to do this. `finish` is no longer
required, as each seatop can gracefully finish in their `button`
callback. And `abort` is not needed, as calling `end` would achieve the
same thing. The struct has also gained a bool named allow_set_cursor
which allows the client to set a new cursor during `default` and `down`
seatops.
Seatops would previously store which button they were started with and
stop when that button was released. This behaviour is changed so that it
only ends once all buttons are released. So you can start a drag with
$mod+left, then click and hold right, release left and it'll continue
dragging while the right button is held.
The motion callback now accepts dx and dy. Most seatops don't use this
as they store the cursor position when the seatop is started and compare
it with the current cursor position. This approach doesn't make sense
for the default seatop though, hence why dx and dy are needed.
The pressed_buttons array has been moved from the sway_cursor struct to
the default seatop's data. This is only used for the default seatop to
check bindings. The total pressed button count remains in the
sway_cursor struct though, because all the other seatops check it to
know if they should end.
The `down` seatop no longer has a `moved` property. This was used to
track if the cursor moved and to recheck focus_follows_mouse, but seems
to work without it.
The logic for focus_follows_mouse has been refactored. As part of this
I've removed the call to wlr_seat_keyboard_has_grab as we don't appear
to use keyboard grabs.
The functions for handling relative motion, absolute motion and tool
axis have been changed. Previously the handler functions were
handle_cursor_motion, handle_cursor_motion_absolute and
handle_tool_axis. The latter two both called cursor_motion_absolute.
Both handle_cursor_motion and cursor_motion_absolute did very similar
things. These are now simplified into three handlers and a single common
function called cursor_motion. All three handlers call cursor_motion. As
cursor_motion works with relative distances, the absolute and tool axis
handlers convert them to relative first.
2019-03-16 08:47:39 +01:00
|
|
|
seatop_begin_default(seat);
|
|
|
|
|
2017-12-07 15:58:32 +01:00
|
|
|
return seat;
|
|
|
|
}
|
|
|
|
|
2018-09-23 14:00:18 +02:00
|
|
|
static void seat_update_capabilities(struct sway_seat *seat) {
|
|
|
|
uint32_t caps = 0;
|
2019-08-31 14:25:58 +02:00
|
|
|
uint32_t previous_caps = seat->wlr_seat->capabilities;
|
2018-09-23 14:00:18 +02:00
|
|
|
struct sway_seat_device *seat_device;
|
|
|
|
wl_list_for_each(seat_device, &seat->devices, link) {
|
|
|
|
switch (seat_device->input_device->wlr_device->type) {
|
|
|
|
case WLR_INPUT_DEVICE_KEYBOARD:
|
|
|
|
caps |= WL_SEAT_CAPABILITY_KEYBOARD;
|
|
|
|
break;
|
|
|
|
case WLR_INPUT_DEVICE_POINTER:
|
|
|
|
caps |= WL_SEAT_CAPABILITY_POINTER;
|
|
|
|
break;
|
|
|
|
case WLR_INPUT_DEVICE_TOUCH:
|
|
|
|
caps |= WL_SEAT_CAPABILITY_TOUCH;
|
|
|
|
break;
|
|
|
|
case WLR_INPUT_DEVICE_TABLET_TOOL:
|
2018-09-23 15:36:12 +02:00
|
|
|
caps |= WL_SEAT_CAPABILITY_POINTER;
|
|
|
|
break;
|
2018-12-16 14:27:45 +01:00
|
|
|
case WLR_INPUT_DEVICE_SWITCH:
|
2019-03-20 04:47:29 +01:00
|
|
|
case WLR_INPUT_DEVICE_TABLET_PAD:
|
2018-09-23 14:00:18 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2018-09-23 15:36:12 +02:00
|
|
|
|
2018-10-23 14:00:57 +02:00
|
|
|
// Hide cursor if seat doesn't have pointer capability.
|
|
|
|
// We must call cursor_set_image while the wlr_seat has the capabilities
|
|
|
|
// otherwise it's a no op.
|
2018-09-23 15:36:12 +02:00
|
|
|
if ((caps & WL_SEAT_CAPABILITY_POINTER) == 0) {
|
2018-09-24 13:29:47 +02:00
|
|
|
cursor_set_image(seat->cursor, NULL, NULL);
|
2018-10-23 14:00:57 +02:00
|
|
|
wlr_seat_set_capabilities(seat->wlr_seat, caps);
|
2018-09-23 15:36:12 +02:00
|
|
|
} else {
|
2018-10-23 14:00:57 +02:00
|
|
|
wlr_seat_set_capabilities(seat->wlr_seat, caps);
|
2019-08-31 14:25:58 +02:00
|
|
|
if ((previous_caps & WL_SEAT_CAPABILITY_POINTER) == 0) {
|
2023-06-23 12:28:15 +02:00
|
|
|
cursor_set_image(seat->cursor, "default", NULL);
|
2019-08-31 14:25:58 +02:00
|
|
|
}
|
2018-09-23 15:36:12 +02:00
|
|
|
}
|
2018-09-23 14:00:18 +02:00
|
|
|
}
|
|
|
|
|
2019-01-09 06:09:20 +01:00
|
|
|
static void seat_reset_input_config(struct sway_seat *seat,
|
|
|
|
struct sway_seat_device *sway_device) {
|
2019-01-20 19:51:12 +01:00
|
|
|
sway_log(SWAY_DEBUG, "Resetting output mapping for input device %s",
|
2019-01-09 06:09:20 +01:00
|
|
|
sway_device->input_device->identifier);
|
|
|
|
wlr_cursor_map_input_to_output(seat->cursor->cursor,
|
|
|
|
sway_device->input_device->wlr_device, NULL);
|
|
|
|
}
|
|
|
|
|
2021-02-08 19:24:20 +01:00
|
|
|
static bool has_prefix(const char *str, const char *prefix) {
|
|
|
|
return strncmp(str, prefix, strlen(prefix)) == 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the name of the built-in output, if any. Returns NULL if there isn't
|
|
|
|
* exactly one built-in output.
|
|
|
|
*/
|
|
|
|
static const char *get_builtin_output_name(void) {
|
|
|
|
const char *match = NULL;
|
|
|
|
for (int i = 0; i < root->outputs->length; ++i) {
|
|
|
|
struct sway_output *output = root->outputs->items[i];
|
|
|
|
const char *name = output->wlr_output->name;
|
|
|
|
if (has_prefix(name, "eDP-") || has_prefix(name, "LVDS-") ||
|
|
|
|
has_prefix(name, "DSI-")) {
|
|
|
|
if (match != NULL) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
match = name;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return match;
|
|
|
|
}
|
|
|
|
|
|
|
|
static bool is_touch_or_tablet_tool(struct sway_seat_device *seat_device) {
|
|
|
|
switch (seat_device->input_device->wlr_device->type) {
|
|
|
|
case WLR_INPUT_DEVICE_TOUCH:
|
|
|
|
case WLR_INPUT_DEVICE_TABLET_TOOL:
|
|
|
|
return true;
|
|
|
|
default:
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-11-16 14:50:52 +01:00
|
|
|
static void seat_apply_input_mapping(struct sway_seat *seat,
|
2018-04-08 20:15:13 +02:00
|
|
|
struct sway_seat_device *sway_device) {
|
2019-11-01 18:37:29 +01:00
|
|
|
struct input_config *ic =
|
|
|
|
input_device_get_config(sway_device->input_device);
|
2019-10-29 01:26:00 +01:00
|
|
|
|
2023-11-16 14:56:46 +01:00
|
|
|
switch (sway_device->input_device->wlr_device->type) {
|
|
|
|
case WLR_INPUT_DEVICE_POINTER:
|
|
|
|
case WLR_INPUT_DEVICE_TOUCH:
|
|
|
|
case WLR_INPUT_DEVICE_TABLET_TOOL:
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return; // these devices don't support mappings
|
|
|
|
}
|
|
|
|
|
2023-11-16 14:50:52 +01:00
|
|
|
sway_log(SWAY_DEBUG, "Applying input mapping to %s",
|
2019-11-01 18:37:29 +01:00
|
|
|
sway_device->input_device->identifier);
|
2019-10-29 01:26:00 +01:00
|
|
|
|
2020-10-15 23:52:55 +02:00
|
|
|
const char *mapped_to_output = ic == NULL ? NULL : ic->mapped_to_output;
|
|
|
|
struct wlr_box *mapped_to_region = ic == NULL ? NULL : ic->mapped_to_region;
|
|
|
|
enum input_config_mapped_to mapped_to =
|
|
|
|
ic == NULL ? MAPPED_TO_DEFAULT : ic->mapped_to;
|
2018-05-03 15:16:17 +02:00
|
|
|
|
2020-10-15 23:52:55 +02:00
|
|
|
switch (mapped_to) {
|
2022-03-08 23:01:54 +01:00
|
|
|
case MAPPED_TO_DEFAULT:;
|
2021-02-08 19:24:20 +01:00
|
|
|
/*
|
|
|
|
* If the wlroots backend provides an output name, use that.
|
|
|
|
*
|
2022-03-08 23:01:54 +01:00
|
|
|
* Otherwise, try to map built-in touch and pointer devices to the
|
2021-02-08 19:24:20 +01:00
|
|
|
* built-in output.
|
|
|
|
*/
|
2022-03-08 23:01:54 +01:00
|
|
|
struct wlr_input_device *dev = sway_device->input_device->wlr_device;
|
|
|
|
switch (dev->type) {
|
|
|
|
case WLR_INPUT_DEVICE_POINTER:
|
2022-06-21 23:10:38 +02:00
|
|
|
mapped_to_output = wlr_pointer_from_input_device(dev)->output_name;
|
2022-03-08 23:01:54 +01:00
|
|
|
break;
|
|
|
|
case WLR_INPUT_DEVICE_TOUCH:
|
2022-06-21 23:10:38 +02:00
|
|
|
mapped_to_output = wlr_touch_from_input_device(dev)->output_name;
|
2022-03-08 23:01:54 +01:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
mapped_to_output = NULL;
|
|
|
|
break;
|
|
|
|
}
|
2022-11-26 20:18:43 +01:00
|
|
|
#if WLR_HAS_LIBINPUT_BACKEND
|
2021-02-08 19:24:20 +01:00
|
|
|
if (mapped_to_output == NULL && is_touch_or_tablet_tool(sway_device) &&
|
|
|
|
sway_libinput_device_is_builtin(sway_device->input_device)) {
|
|
|
|
mapped_to_output = get_builtin_output_name();
|
|
|
|
if (mapped_to_output) {
|
|
|
|
sway_log(SWAY_DEBUG, "Auto-detected output '%s' for device '%s'",
|
|
|
|
mapped_to_output, sway_device->input_device->identifier);
|
|
|
|
}
|
|
|
|
}
|
2022-11-26 20:18:43 +01:00
|
|
|
#else
|
|
|
|
(void)is_touch_or_tablet_tool;
|
|
|
|
(void)get_builtin_output_name;
|
|
|
|
#endif
|
2019-11-01 18:37:29 +01:00
|
|
|
if (mapped_to_output == NULL) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
/* fallthrough */
|
|
|
|
case MAPPED_TO_OUTPUT:
|
2019-01-20 19:51:12 +01:00
|
|
|
sway_log(SWAY_DEBUG, "Mapping input device %s to output %s",
|
2018-05-03 15:16:17 +02:00
|
|
|
sway_device->input_device->identifier, mapped_to_output);
|
2019-01-09 01:52:19 +01:00
|
|
|
if (strcmp("*", mapped_to_output) == 0) {
|
|
|
|
wlr_cursor_map_input_to_output(seat->cursor->cursor,
|
|
|
|
sway_device->input_device->wlr_device, NULL);
|
2019-11-01 18:37:29 +01:00
|
|
|
wlr_cursor_map_input_to_region(seat->cursor->cursor,
|
|
|
|
sway_device->input_device->wlr_device, NULL);
|
2019-01-20 19:51:12 +01:00
|
|
|
sway_log(SWAY_DEBUG, "Reset output mapping");
|
2019-01-09 01:52:19 +01:00
|
|
|
return;
|
|
|
|
}
|
2018-12-20 19:02:45 +01:00
|
|
|
struct sway_output *output = output_by_name_or_id(mapped_to_output);
|
2019-11-01 18:37:29 +01:00
|
|
|
if (!output) {
|
2020-04-20 23:52:52 +02:00
|
|
|
sway_log(SWAY_DEBUG, "Requested output %s for device %s isn't present",
|
|
|
|
mapped_to_output, sway_device->input_device->identifier);
|
2019-11-01 18:37:29 +01:00
|
|
|
return;
|
2018-04-08 20:15:13 +02:00
|
|
|
}
|
2019-11-01 18:37:29 +01:00
|
|
|
wlr_cursor_map_input_to_output(seat->cursor->cursor,
|
|
|
|
sway_device->input_device->wlr_device, output->wlr_output);
|
|
|
|
wlr_cursor_map_input_to_region(seat->cursor->cursor,
|
|
|
|
sway_device->input_device->wlr_device, NULL);
|
|
|
|
sway_log(SWAY_DEBUG,
|
|
|
|
"Mapped to output %s", output->wlr_output->name);
|
|
|
|
return;
|
|
|
|
case MAPPED_TO_REGION:
|
2019-10-29 01:26:00 +01:00
|
|
|
sway_log(SWAY_DEBUG, "Mapping input device %s to %d,%d %dx%d",
|
|
|
|
sway_device->input_device->identifier,
|
|
|
|
mapped_to_region->x, mapped_to_region->y,
|
|
|
|
mapped_to_region->width, mapped_to_region->height);
|
2019-11-01 18:37:29 +01:00
|
|
|
wlr_cursor_map_input_to_output(seat->cursor->cursor,
|
|
|
|
sway_device->input_device->wlr_device, NULL);
|
2019-10-29 01:26:00 +01:00
|
|
|
wlr_cursor_map_input_to_region(seat->cursor->cursor,
|
|
|
|
sway_device->input_device->wlr_device, mapped_to_region);
|
2019-11-01 18:37:29 +01:00
|
|
|
return;
|
2018-04-08 20:15:13 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-14 17:11:56 +01:00
|
|
|
static void seat_configure_pointer(struct sway_seat *seat,
|
|
|
|
struct sway_seat_device *sway_device) {
|
2022-06-06 17:16:29 +02:00
|
|
|
seat_configure_xcursor(seat);
|
2017-12-12 14:29:37 +01:00
|
|
|
wlr_cursor_attach_input_device(seat->cursor->cursor,
|
2017-12-14 17:11:56 +01:00
|
|
|
sway_device->input_device->wlr_device);
|
2020-09-15 17:48:21 +02:00
|
|
|
wl_event_source_timer_update(
|
|
|
|
seat->cursor->hide_source, cursor_get_timeout(seat->cursor));
|
2017-12-08 13:22:26 +01:00
|
|
|
}
|
|
|
|
|
2017-12-14 17:11:56 +01:00
|
|
|
static void seat_configure_keyboard(struct sway_seat *seat,
|
|
|
|
struct sway_seat_device *seat_device) {
|
|
|
|
if (!seat_device->keyboard) {
|
|
|
|
sway_keyboard_create(seat, seat_device);
|
|
|
|
}
|
2020-05-18 23:52:13 +02:00
|
|
|
sway_keyboard_configure(seat_device->keyboard);
|
2022-12-04 01:20:06 +01:00
|
|
|
|
|
|
|
// We only need to update the current keyboard, as the rest will be updated
|
|
|
|
// as they are activated.
|
|
|
|
struct wlr_keyboard *wlr_keyboard =
|
|
|
|
wlr_keyboard_from_input_device(seat_device->input_device->wlr_device);
|
|
|
|
struct wlr_keyboard *current_keyboard = seat->wlr_seat->keyboard_state.keyboard;
|
|
|
|
if (wlr_keyboard != current_keyboard) {
|
|
|
|
return;
|
|
|
|
}
|
2022-03-09 03:14:26 +01:00
|
|
|
|
|
|
|
// force notify reenter to pick up the new configuration. This reuses
|
|
|
|
// the current focused surface to avoid breaking input grabs.
|
|
|
|
struct wlr_surface *surface = seat->wlr_seat->keyboard_state.focused_surface;
|
|
|
|
if (surface) {
|
2020-05-21 03:20:19 +02:00
|
|
|
wlr_seat_keyboard_notify_clear_focus(seat->wlr_seat);
|
2022-03-09 03:14:26 +01:00
|
|
|
seat_keyboard_notify_enter(seat, surface);
|
2017-12-17 14:30:20 +01:00
|
|
|
}
|
2017-12-12 14:29:37 +01:00
|
|
|
}
|
|
|
|
|
2019-03-20 04:47:29 +01:00
|
|
|
static void seat_configure_switch(struct sway_seat *seat,
|
2020-04-20 23:52:52 +02:00
|
|
|
struct sway_seat_device *seat_device) {
|
2019-03-20 04:47:29 +01:00
|
|
|
if (!seat_device->switch_device) {
|
|
|
|
sway_switch_create(seat, seat_device);
|
|
|
|
}
|
|
|
|
sway_switch_configure(seat_device->switch_device);
|
|
|
|
}
|
|
|
|
|
2018-05-02 15:00:26 +02:00
|
|
|
static void seat_configure_touch(struct sway_seat *seat,
|
|
|
|
struct sway_seat_device *sway_device) {
|
|
|
|
wlr_cursor_attach_input_device(seat->cursor->cursor,
|
|
|
|
sway_device->input_device->wlr_device);
|
|
|
|
}
|
|
|
|
|
2018-04-08 16:48:13 +02:00
|
|
|
static void seat_configure_tablet_tool(struct sway_seat *seat,
|
|
|
|
struct sway_seat_device *sway_device) {
|
2019-09-18 06:46:29 +02:00
|
|
|
if (!sway_device->tablet) {
|
|
|
|
sway_device->tablet = sway_tablet_create(seat, sway_device);
|
2019-08-31 14:42:08 +02:00
|
|
|
}
|
2019-09-18 06:46:29 +02:00
|
|
|
sway_configure_tablet(sway_device->tablet);
|
2018-04-08 16:48:13 +02:00
|
|
|
wlr_cursor_attach_input_device(seat->cursor->cursor,
|
|
|
|
sway_device->input_device->wlr_device);
|
|
|
|
}
|
|
|
|
|
2019-09-18 06:46:29 +02:00
|
|
|
static void seat_configure_tablet_pad(struct sway_seat *seat,
|
|
|
|
struct sway_seat_device *sway_device) {
|
2020-03-11 15:03:03 +01:00
|
|
|
if (!sway_device->tablet_pad) {
|
2019-09-18 06:46:29 +02:00
|
|
|
sway_device->tablet_pad = sway_tablet_pad_create(seat, sway_device);
|
|
|
|
}
|
|
|
|
sway_configure_tablet_pad(sway_device->tablet_pad);
|
|
|
|
}
|
|
|
|
|
2018-04-02 14:45:37 +02:00
|
|
|
static struct sway_seat_device *seat_get_device(struct sway_seat *seat,
|
2017-12-14 17:11:56 +01:00
|
|
|
struct sway_input_device *input_device) {
|
|
|
|
struct sway_seat_device *seat_device = NULL;
|
|
|
|
wl_list_for_each(seat_device, &seat->devices, link) {
|
|
|
|
if (seat_device->input_device == input_device) {
|
|
|
|
return seat_device;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-05-14 03:12:53 +02:00
|
|
|
struct sway_keyboard_group *group = NULL;
|
|
|
|
wl_list_for_each(group, &seat->keyboard_groups, link) {
|
|
|
|
if (group->seat_device->input_device == input_device) {
|
|
|
|
return group->seat_device;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-14 17:11:56 +01:00
|
|
|
return NULL;
|
2017-12-10 19:59:04 +01:00
|
|
|
}
|
|
|
|
|
2018-04-02 14:45:37 +02:00
|
|
|
void seat_configure_device(struct sway_seat *seat,
|
2017-12-14 17:11:56 +01:00
|
|
|
struct sway_input_device *input_device) {
|
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 13:00:10 +02:00
|
|
|
struct sway_seat_device *seat_device = seat_get_device(seat, input_device);
|
2017-12-14 17:11:56 +01:00
|
|
|
if (!seat_device) {
|
2017-12-12 14:29:37 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2017-12-14 17:11:56 +01:00
|
|
|
switch (input_device->wlr_device->type) {
|
2017-12-08 13:22:26 +01:00
|
|
|
case WLR_INPUT_DEVICE_POINTER:
|
2017-12-14 17:11:56 +01:00
|
|
|
seat_configure_pointer(seat, seat_device);
|
2017-12-08 13:22:26 +01:00
|
|
|
break;
|
|
|
|
case WLR_INPUT_DEVICE_KEYBOARD:
|
2017-12-14 17:11:56 +01:00
|
|
|
seat_configure_keyboard(seat, seat_device);
|
2017-12-10 19:59:04 +01:00
|
|
|
break;
|
2019-03-20 04:47:29 +01:00
|
|
|
case WLR_INPUT_DEVICE_SWITCH:
|
|
|
|
seat_configure_switch(seat, seat_device);
|
|
|
|
break;
|
2018-05-02 15:00:26 +02:00
|
|
|
case WLR_INPUT_DEVICE_TOUCH:
|
|
|
|
seat_configure_touch(seat, seat_device);
|
|
|
|
break;
|
2017-12-08 13:22:26 +01:00
|
|
|
case WLR_INPUT_DEVICE_TABLET_TOOL:
|
2018-04-08 16:48:13 +02:00
|
|
|
seat_configure_tablet_tool(seat, seat_device);
|
|
|
|
break;
|
|
|
|
case WLR_INPUT_DEVICE_TABLET_PAD:
|
2019-09-18 06:46:29 +02:00
|
|
|
seat_configure_tablet_pad(seat, seat_device);
|
2017-12-08 13:22:26 +01:00
|
|
|
break;
|
|
|
|
}
|
2023-11-16 14:56:46 +01:00
|
|
|
|
|
|
|
seat_apply_input_mapping(seat, seat_device);
|
|
|
|
}
|
|
|
|
|
|
|
|
void seat_configure_device_mapping(struct sway_seat *seat,
|
|
|
|
struct sway_input_device *input_device) {
|
|
|
|
struct sway_seat_device *seat_device = seat_get_device(seat, input_device);
|
|
|
|
if (!seat_device) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
seat_apply_input_mapping(seat, seat_device);
|
2017-12-08 13:22:26 +01:00
|
|
|
}
|
|
|
|
|
2019-01-09 06:09:20 +01:00
|
|
|
void seat_reset_device(struct sway_seat *seat,
|
|
|
|
struct sway_input_device *input_device) {
|
|
|
|
struct sway_seat_device *seat_device = seat_get_device(seat, input_device);
|
|
|
|
if (!seat_device) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (input_device->wlr_device->type) {
|
|
|
|
case WLR_INPUT_DEVICE_POINTER:
|
|
|
|
seat_reset_input_config(seat, seat_device);
|
|
|
|
break;
|
|
|
|
case WLR_INPUT_DEVICE_KEYBOARD:
|
2019-01-14 20:06:35 +01:00
|
|
|
sway_keyboard_disarm_key_repeat(seat_device->keyboard);
|
2019-01-09 06:09:20 +01:00
|
|
|
sway_keyboard_configure(seat_device->keyboard);
|
|
|
|
break;
|
|
|
|
case WLR_INPUT_DEVICE_TOUCH:
|
|
|
|
seat_reset_input_config(seat, seat_device);
|
|
|
|
break;
|
|
|
|
case WLR_INPUT_DEVICE_TABLET_TOOL:
|
|
|
|
seat_reset_input_config(seat, seat_device);
|
|
|
|
break;
|
|
|
|
case WLR_INPUT_DEVICE_TABLET_PAD:
|
2019-01-20 19:51:12 +01:00
|
|
|
sway_log(SWAY_DEBUG, "TODO: reset tablet pad");
|
2019-01-09 06:09:20 +01:00
|
|
|
break;
|
|
|
|
case WLR_INPUT_DEVICE_SWITCH:
|
2019-01-20 19:51:12 +01:00
|
|
|
sway_log(SWAY_DEBUG, "TODO: reset switch device");
|
2019-01-09 06:09:20 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-04-02 14:45:37 +02:00
|
|
|
void seat_add_device(struct sway_seat *seat,
|
2017-12-14 17:11:56 +01:00
|
|
|
struct sway_input_device *input_device) {
|
2018-04-02 14:45:37 +02:00
|
|
|
if (seat_get_device(seat, input_device)) {
|
|
|
|
seat_configure_device(seat, input_device);
|
2017-12-14 17:11:56 +01:00
|
|
|
return;
|
2017-12-10 21:37:17 +01:00
|
|
|
}
|
|
|
|
|
2017-12-14 17:11:56 +01:00
|
|
|
struct sway_seat_device *seat_device =
|
|
|
|
calloc(1, sizeof(struct sway_seat_device));
|
|
|
|
if (!seat_device) {
|
2019-01-20 19:51:12 +01:00
|
|
|
sway_log(SWAY_DEBUG, "could not allocate seat device");
|
2017-12-14 17:11:56 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-01-20 19:51:12 +01:00
|
|
|
sway_log(SWAY_DEBUG, "adding device %s to seat %s",
|
2017-12-16 19:16:58 +01:00
|
|
|
input_device->identifier, seat->wlr_seat->name);
|
|
|
|
|
2017-12-14 17:11:56 +01:00
|
|
|
seat_device->sway_seat = seat;
|
|
|
|
seat_device->input_device = input_device;
|
|
|
|
wl_list_insert(&seat->devices, &seat_device->link);
|
|
|
|
|
2018-04-02 14:45:37 +02:00
|
|
|
seat_configure_device(seat, input_device);
|
2018-09-23 14:00:18 +02:00
|
|
|
|
|
|
|
seat_update_capabilities(seat);
|
2017-12-07 15:58:32 +01:00
|
|
|
}
|
|
|
|
|
2018-04-02 14:45:37 +02:00
|
|
|
void seat_remove_device(struct sway_seat *seat,
|
2017-12-14 17:11:56 +01:00
|
|
|
struct sway_input_device *input_device) {
|
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 13:00:10 +02:00
|
|
|
struct sway_seat_device *seat_device = seat_get_device(seat, input_device);
|
2017-12-12 14:29:37 +01:00
|
|
|
|
2017-12-14 17:11:56 +01:00
|
|
|
if (!seat_device) {
|
|
|
|
return;
|
2017-12-08 13:22:26 +01:00
|
|
|
}
|
2017-12-12 14:29:37 +01:00
|
|
|
|
2019-01-20 19:51:12 +01:00
|
|
|
sway_log(SWAY_DEBUG, "removing device %s from seat %s",
|
2017-12-16 19:16:58 +01:00
|
|
|
input_device->identifier, seat->wlr_seat->name);
|
|
|
|
|
2017-12-14 17:11:56 +01:00
|
|
|
seat_device_destroy(seat_device);
|
2018-09-23 14:00:18 +02:00
|
|
|
|
|
|
|
seat_update_capabilities(seat);
|
2017-12-07 15:58:32 +01:00
|
|
|
}
|
2017-12-09 17:51:28 +01:00
|
|
|
|
2019-06-01 21:05:09 +02:00
|
|
|
static bool xcursor_manager_is_named(const struct wlr_xcursor_manager *manager,
|
|
|
|
const char *name) {
|
|
|
|
return (!manager->name && !name) ||
|
|
|
|
(name && manager->name && strcmp(name, manager->name) == 0);
|
|
|
|
}
|
|
|
|
|
2018-04-02 14:45:37 +02:00
|
|
|
void seat_configure_xcursor(struct sway_seat *seat) {
|
2019-06-01 21:05:09 +02:00
|
|
|
unsigned cursor_size = 24;
|
2018-03-31 06:13:26 +02:00
|
|
|
const char *cursor_theme = NULL;
|
2017-12-09 17:51:28 +01:00
|
|
|
|
2019-06-01 21:05:09 +02:00
|
|
|
const struct seat_config *seat_config = seat_get_config(seat);
|
|
|
|
if (!seat_config) {
|
|
|
|
seat_config = seat_get_config_by_name("*");
|
|
|
|
}
|
|
|
|
if (seat_config) {
|
|
|
|
cursor_size = seat_config->xcursor_theme.size;
|
|
|
|
cursor_theme = seat_config->xcursor_theme.name;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (seat == input_manager_get_default_seat()) {
|
|
|
|
char cursor_size_fmt[16];
|
2020-06-04 15:43:42 +02:00
|
|
|
snprintf(cursor_size_fmt, sizeof(cursor_size_fmt), "%u", cursor_size);
|
2019-06-01 21:05:09 +02:00
|
|
|
setenv("XCURSOR_SIZE", cursor_size_fmt, 1);
|
|
|
|
if (cursor_theme != NULL) {
|
|
|
|
setenv("XCURSOR_THEME", cursor_theme, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
#if HAVE_XWAYLAND
|
2020-07-02 13:48:57 +02:00
|
|
|
if (server.xwayland.wlr_xwayland && (!server.xwayland.xcursor_manager ||
|
2019-06-01 21:05:09 +02:00
|
|
|
!xcursor_manager_is_named(server.xwayland.xcursor_manager,
|
|
|
|
cursor_theme) ||
|
2019-06-08 16:28:10 +02:00
|
|
|
server.xwayland.xcursor_manager->size != cursor_size)) {
|
2019-06-01 21:05:09 +02:00
|
|
|
|
|
|
|
wlr_xcursor_manager_destroy(server.xwayland.xcursor_manager);
|
|
|
|
|
|
|
|
server.xwayland.xcursor_manager =
|
|
|
|
wlr_xcursor_manager_create(cursor_theme, cursor_size);
|
|
|
|
sway_assert(server.xwayland.xcursor_manager,
|
|
|
|
"Cannot create XCursor manager for theme");
|
|
|
|
|
|
|
|
wlr_xcursor_manager_load(server.xwayland.xcursor_manager, 1);
|
|
|
|
struct wlr_xcursor *xcursor = wlr_xcursor_manager_get_xcursor(
|
2023-06-23 12:28:15 +02:00
|
|
|
server.xwayland.xcursor_manager, "default", 1);
|
2019-06-01 21:05:09 +02:00
|
|
|
if (xcursor != NULL) {
|
|
|
|
struct wlr_xcursor_image *image = xcursor->images[0];
|
|
|
|
wlr_xwayland_set_cursor(
|
|
|
|
server.xwayland.wlr_xwayland, image->buffer,
|
|
|
|
image->width * 4, image->width, image->height,
|
|
|
|
image->hotspot_x, image->hotspot_y);
|
|
|
|
}
|
2017-12-09 20:06:00 +01:00
|
|
|
}
|
2019-06-01 21:05:09 +02:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Create xcursor manager if we don't have one already, or if the
|
|
|
|
* theme has changed */
|
|
|
|
if (!seat->cursor->xcursor_manager ||
|
|
|
|
!xcursor_manager_is_named(
|
|
|
|
seat->cursor->xcursor_manager, cursor_theme) ||
|
|
|
|
seat->cursor->xcursor_manager->size != cursor_size) {
|
|
|
|
|
|
|
|
wlr_xcursor_manager_destroy(seat->cursor->xcursor_manager);
|
|
|
|
seat->cursor->xcursor_manager =
|
|
|
|
wlr_xcursor_manager_create(cursor_theme, cursor_size);
|
2020-04-15 18:19:49 +02:00
|
|
|
if (!seat->cursor->xcursor_manager) {
|
|
|
|
sway_log(SWAY_ERROR,
|
|
|
|
"Cannot create XCursor manager for theme '%s'", cursor_theme);
|
|
|
|
}
|
2017-12-09 17:51:28 +01:00
|
|
|
|
2022-06-06 17:16:29 +02:00
|
|
|
|
|
|
|
for (int i = 0; i < root->outputs->length; ++i) {
|
|
|
|
struct sway_output *sway_output = root->outputs->items[i];
|
|
|
|
struct wlr_output *output = sway_output->wlr_output;
|
|
|
|
bool result =
|
|
|
|
wlr_xcursor_manager_load(seat->cursor->xcursor_manager,
|
|
|
|
output->scale);
|
|
|
|
if (!result) {
|
|
|
|
sway_log(SWAY_ERROR,
|
|
|
|
"Cannot load xcursor theme for output '%s' with scale %f",
|
|
|
|
output->name, output->scale);
|
|
|
|
}
|
2020-04-15 18:19:49 +02:00
|
|
|
}
|
2017-12-09 17:51:28 +01:00
|
|
|
|
2022-06-06 17:16:29 +02:00
|
|
|
// Reset the cursor so that we apply it to outputs that just appeared
|
|
|
|
cursor_set_image(seat->cursor, NULL, NULL);
|
|
|
|
cursor_set_image(seat->cursor, "default", NULL);
|
|
|
|
wlr_cursor_warp(seat->cursor->cursor, NULL, seat->cursor->cursor->x,
|
|
|
|
seat->cursor->cursor->y);
|
|
|
|
}
|
2017-12-09 17:51:28 +01:00
|
|
|
}
|
2017-12-10 17:11:47 +01:00
|
|
|
|
2018-04-04 03:25:42 +02:00
|
|
|
bool seat_is_input_allowed(struct sway_seat *seat,
|
|
|
|
struct wlr_surface *surface) {
|
2024-01-18 16:04:26 +01:00
|
|
|
if (server.session_lock.lock) {
|
|
|
|
return sway_session_lock_has_surface(server.session_lock.lock, surface);
|
2023-12-05 16:50:31 +01:00
|
|
|
}
|
2024-01-18 16:04:26 +01:00
|
|
|
return true;
|
2018-04-03 23:03:29 +02: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 13:00:10 +02:00
|
|
|
static void send_unfocus(struct sway_container *con, void *data) {
|
|
|
|
if (con->view) {
|
|
|
|
view_set_activated(con->view, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-05-11 01:13:40 +02:00
|
|
|
// Unfocus the container and any children (eg. when leaving `focus 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 13:00:10 +02:00
|
|
|
static void seat_send_unfocus(struct sway_node *node, struct sway_seat *seat) {
|
2019-01-26 00:45:06 +01:00
|
|
|
sway_cursor_constrain(seat->cursor, NULL);
|
2020-05-21 03:20:19 +02:00
|
|
|
wlr_seat_keyboard_notify_clear_focus(seat->wlr_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 13:00:10 +02:00
|
|
|
if (node->type == N_WORKSPACE) {
|
|
|
|
workspace_for_each_container(node->sway_workspace, send_unfocus, seat);
|
2018-05-11 01:13:40 +02:00
|
|
|
} else {
|
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 13:00:10 +02:00
|
|
|
send_unfocus(node->sway_container, seat);
|
|
|
|
container_for_each_child(node->sway_container, send_unfocus, seat);
|
2018-05-11 01:13:40 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-07-15 14:43:33 +02:00
|
|
|
static int handle_urgent_timeout(void *data) {
|
|
|
|
struct sway_view *view = data;
|
|
|
|
view_set_urgent(view, false);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2018-10-16 00:17:24 +02:00
|
|
|
static void set_workspace(struct sway_seat *seat,
|
|
|
|
struct sway_workspace *new_ws) {
|
|
|
|
if (seat->workspace == new_ws) {
|
|
|
|
return;
|
|
|
|
}
|
2019-03-14 16:43:39 +01:00
|
|
|
|
|
|
|
if (seat->workspace) {
|
|
|
|
free(seat->prev_workspace_name);
|
2019-09-07 21:52:48 +02:00
|
|
|
seat->prev_workspace_name = strdup(seat->workspace->name);
|
2019-03-14 16:43:39 +01:00
|
|
|
if (!seat->prev_workspace_name) {
|
|
|
|
sway_log(SWAY_ERROR, "Unable to allocate previous workspace name");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-10-16 00:17:24 +02:00
|
|
|
ipc_event_workspace(seat->workspace, new_ws, "focus");
|
|
|
|
seat->workspace = new_ws;
|
|
|
|
}
|
|
|
|
|
2018-10-15 13:06:24 +02:00
|
|
|
void seat_set_raw_focus(struct sway_seat *seat, struct sway_node *node) {
|
|
|
|
struct sway_seat_node *seat_node = seat_node_from_node(seat, node);
|
|
|
|
wl_list_remove(&seat_node->link);
|
|
|
|
wl_list_insert(&seat->focus_stack, &seat_node->link);
|
|
|
|
node_set_dirty(node);
|
2019-04-01 05:27:18 +02:00
|
|
|
|
|
|
|
// If focusing a scratchpad container that is fullscreen global, parent
|
|
|
|
// will be NULL
|
|
|
|
struct sway_node *parent = node_get_parent(node);
|
|
|
|
if (parent) {
|
|
|
|
node_set_dirty(parent);
|
|
|
|
}
|
2018-10-15 13:06:24 +02:00
|
|
|
}
|
|
|
|
|
2022-04-30 06:46:53 +02:00
|
|
|
static void seat_set_workspace_focus(struct sway_seat *seat, struct sway_node *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 13:00:10 +02:00
|
|
|
struct sway_node *last_focus = seat_get_focus(seat);
|
|
|
|
if (last_focus == node) {
|
2017-12-10 17:11:47 +01: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 13:00:10 +02:00
|
|
|
struct sway_workspace *last_workspace = seat_get_focused_workspace(seat);
|
2018-08-26 20:00:59 +02: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 13:00:10 +02:00
|
|
|
if (node == NULL) {
|
2018-08-26 20:00:59 +02:00
|
|
|
// Close any popups on the old focus
|
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 13:00:10 +02:00
|
|
|
if (node_is_view(last_focus)) {
|
|
|
|
view_close_popups(last_focus->sway_container->view);
|
2018-08-26 20:00:59 +02:00
|
|
|
}
|
|
|
|
seat_send_unfocus(last_focus, seat);
|
2019-10-18 12:57:17 +02:00
|
|
|
sway_input_method_relay_set_focus(&seat->im_relay, NULL);
|
2018-08-26 20:00:59 +02:00
|
|
|
seat->has_focus = false;
|
|
|
|
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 13:00:10 +02:00
|
|
|
struct sway_workspace *new_workspace = node->type == N_WORKSPACE ?
|
2021-02-12 23:22:51 +01:00
|
|
|
node->sway_workspace : node->sway_container->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 13:00:10 +02:00
|
|
|
struct sway_container *container = node->type == N_CONTAINER ?
|
|
|
|
node->sway_container : NULL;
|
2018-04-16 12:36:40 +02:00
|
|
|
|
2021-01-20 22:20:00 +01:00
|
|
|
// Deny setting focus to a view which is hidden by a fullscreen container or global
|
|
|
|
if (container && container_obstructing_fullscreen_container(container)) {
|
|
|
|
return;
|
2018-04-16 12:36:40 +02:00
|
|
|
}
|
2021-01-20 22:20:00 +01:00
|
|
|
|
2019-01-24 23:29:21 +01:00
|
|
|
// Deny setting focus to a workspace node when using fullscreen global
|
|
|
|
if (root->fullscreen_global && !container && new_workspace) {
|
|
|
|
return;
|
|
|
|
}
|
2018-04-16 12:36:40 +02:00
|
|
|
|
2019-04-01 05:27:18 +02:00
|
|
|
struct sway_output *new_output =
|
|
|
|
new_workspace ? new_workspace->output : NULL;
|
2018-04-15 08:24:04 +02:00
|
|
|
|
2018-09-07 00:08:40 +02:00
|
|
|
if (last_workspace != new_workspace && new_output) {
|
2018-09-06 13:15:24 +02:00
|
|
|
node_set_dirty(&new_output->node);
|
|
|
|
}
|
|
|
|
|
2018-04-15 08:24:04 +02:00
|
|
|
// find new output's old workspace, which might have to be removed if empty
|
2018-09-23 02:39:24 +02:00
|
|
|
struct sway_workspace *new_output_last_ws =
|
|
|
|
new_output ? output_get_active_workspace(new_output) : NULL;
|
2018-04-15 08:24:04 +02:00
|
|
|
|
2018-08-31 23:57:07 +02:00
|
|
|
// Unfocus the previous focus
|
|
|
|
if (last_focus) {
|
|
|
|
seat_send_unfocus(last_focus, seat);
|
|
|
|
node_set_dirty(last_focus);
|
2018-09-02 07:37:56 +02:00
|
|
|
struct sway_node *parent = node_get_parent(last_focus);
|
|
|
|
if (parent) {
|
|
|
|
node_set_dirty(parent);
|
|
|
|
}
|
2018-08-31 23:57:07 +02: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 13:00:10 +02:00
|
|
|
// Put the container parents on the focus stack, then the workspace, then
|
|
|
|
// the focused container.
|
|
|
|
if (container) {
|
2021-02-12 23:22:51 +01:00
|
|
|
struct sway_container *parent = container->pending.parent;
|
2018-04-08 17:34:38 +02:00
|
|
|
while (parent) {
|
2018-10-15 13:06:24 +02:00
|
|
|
seat_set_raw_focus(seat, &parent->node);
|
2021-02-12 23:22:51 +01:00
|
|
|
parent = parent->pending.parent;
|
2018-04-08 17:34:38 +02: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 13:00:10 +02:00
|
|
|
}
|
|
|
|
if (new_workspace) {
|
2018-10-15 13:06:24 +02:00
|
|
|
seat_set_raw_focus(seat, &new_workspace->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 13:00:10 +02:00
|
|
|
}
|
|
|
|
if (container) {
|
2018-10-15 13:06:24 +02:00
|
|
|
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 13:00:10 +02:00
|
|
|
seat_send_focus(&container->node, seat);
|
2018-08-26 20:00:59 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// emit ipc events
|
2018-10-16 00:17:24 +02:00
|
|
|
set_workspace(seat, 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 13:00:10 +02:00
|
|
|
if (container && container->view) {
|
2018-08-26 20:00:59 +02:00
|
|
|
ipc_event_window(container, "focus");
|
|
|
|
}
|
|
|
|
|
2018-09-23 02:39:24 +02:00
|
|
|
// Move sticky containers to new workspace
|
2019-04-01 05:27:18 +02:00
|
|
|
if (new_workspace && new_output_last_ws
|
|
|
|
&& new_workspace != new_output_last_ws) {
|
2018-09-23 02:39:24 +02:00
|
|
|
for (int i = 0; i < new_output_last_ws->floating->length; ++i) {
|
|
|
|
struct sway_container *floater =
|
|
|
|
new_output_last_ws->floating->items[i];
|
2020-11-03 06:16:15 +01:00
|
|
|
if (container_is_sticky(floater)) {
|
2018-09-23 02:39:24 +02:00
|
|
|
container_detach(floater);
|
|
|
|
workspace_add_floating(new_workspace, floater);
|
|
|
|
--i;
|
|
|
|
}
|
|
|
|
}
|
2018-08-26 20:00:59 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// Close any popups on the old focus
|
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 13:00:10 +02:00
|
|
|
if (last_focus && node_is_view(last_focus)) {
|
|
|
|
view_close_popups(last_focus->sway_container->view);
|
2017-12-10 17:11:47 +01:00
|
|
|
}
|
|
|
|
|
2018-07-21 02:27:40 +02:00
|
|
|
// If urgent, either unset the urgency or start a timer to unset it
|
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 13:00:10 +02:00
|
|
|
if (container && container->view && view_is_urgent(container->view) &&
|
|
|
|
!container->view->urgent_timer) {
|
|
|
|
struct sway_view *view = container->view;
|
2018-07-21 02:27:40 +02:00
|
|
|
if (last_workspace && last_workspace != new_workspace &&
|
|
|
|
config->urgent_timeout > 0) {
|
|
|
|
view->urgent_timer = wl_event_loop_add_timer(server.wl_event_loop,
|
|
|
|
handle_urgent_timeout, view);
|
2018-07-28 01:22:37 +02:00
|
|
|
if (view->urgent_timer) {
|
|
|
|
wl_event_source_timer_update(view->urgent_timer,
|
|
|
|
config->urgent_timeout);
|
|
|
|
} else {
|
2019-01-24 12:32:49 +01:00
|
|
|
sway_log_errno(SWAY_ERROR, "Unable to create urgency timer");
|
2018-07-28 01:22:37 +02:00
|
|
|
handle_urgent_timeout(view);
|
|
|
|
}
|
2018-07-21 02:27:40 +02:00
|
|
|
} else {
|
|
|
|
view_set_urgent(view, false);
|
|
|
|
}
|
2018-07-15 14:43:33 +02:00
|
|
|
}
|
|
|
|
|
2018-09-23 02:39:24 +02:00
|
|
|
if (new_output_last_ws) {
|
|
|
|
workspace_consider_destroy(new_output_last_ws);
|
|
|
|
}
|
|
|
|
if (last_workspace && last_workspace != new_output_last_ws) {
|
|
|
|
workspace_consider_destroy(last_workspace);
|
|
|
|
}
|
2018-04-07 20:03:30 +02:00
|
|
|
|
2018-08-26 20:00:59 +02:00
|
|
|
seat->has_focus = true;
|
2018-04-06 17:49:27 +02:00
|
|
|
|
2019-04-01 05:27:18 +02:00
|
|
|
if (config->smart_gaps && new_workspace) {
|
2018-10-01 15:41:15 +02:00
|
|
|
// When smart gaps is on, gaps may change when the focus changes so
|
|
|
|
// the workspace needs to be arranged
|
|
|
|
arrange_workspace(new_workspace);
|
|
|
|
}
|
2017-12-10 17:11:47 +01:00
|
|
|
}
|
2017-12-14 17:11:56 +01:00
|
|
|
|
2022-04-30 06:46:53 +02:00
|
|
|
void seat_set_focus(struct sway_seat *seat, struct sway_node *node) {
|
2023-06-05 15:31:16 +02:00
|
|
|
// Prevents the layer from losing focus if it has keyboard exclusivity
|
|
|
|
if (seat->has_exclusive_layer) {
|
2022-04-30 06:46:53 +02:00
|
|
|
struct wlr_layer_surface_v1 *layer = seat->focused_layer;
|
|
|
|
seat_set_focus_layer(seat, NULL);
|
|
|
|
seat_set_workspace_focus(seat, node);
|
|
|
|
seat_set_focus_layer(seat, layer);
|
2023-06-05 15:31:16 +02:00
|
|
|
} else if (seat->focused_layer) {
|
|
|
|
seat_set_focus_layer(seat, NULL);
|
|
|
|
seat_set_workspace_focus(seat, node);
|
2022-04-30 06:46:53 +02:00
|
|
|
} else {
|
|
|
|
seat_set_workspace_focus(seat, node);
|
|
|
|
}
|
2024-01-18 16:04:26 +01:00
|
|
|
if (server.session_lock.lock) {
|
|
|
|
seat_set_focus_surface(seat, server.session_lock.lock->focused, false);
|
2022-04-30 06:46:53 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-09-06 11:26:56 +02:00
|
|
|
void seat_set_focus_container(struct sway_seat *seat,
|
|
|
|
struct sway_container *con) {
|
2018-10-18 15:08:45 +02:00
|
|
|
seat_set_focus(seat, con ? &con->node : NULL);
|
2018-09-06 11:26:56 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void seat_set_focus_workspace(struct sway_seat *seat,
|
|
|
|
struct sway_workspace *ws) {
|
2018-10-18 15:08:45 +02:00
|
|
|
seat_set_focus(seat, ws ? &ws->node : NULL);
|
2018-09-06 11:26:56 +02:00
|
|
|
}
|
|
|
|
|
2018-04-07 20:03:30 +02:00
|
|
|
void seat_set_focus_surface(struct sway_seat *seat,
|
2018-07-18 21:00:48 +02:00
|
|
|
struct wlr_surface *surface, bool unfocus) {
|
|
|
|
if (seat->has_focus && unfocus) {
|
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 13:00:10 +02:00
|
|
|
struct sway_node *focus = seat_get_focus(seat);
|
2018-05-11 01:13:40 +02:00
|
|
|
seat_send_unfocus(focus, seat);
|
2018-04-07 20:03:30 +02:00
|
|
|
seat->has_focus = false;
|
|
|
|
}
|
2020-06-19 18:23:23 +02:00
|
|
|
|
|
|
|
if (surface) {
|
|
|
|
seat_keyboard_notify_enter(seat, surface);
|
|
|
|
} else {
|
|
|
|
wlr_seat_keyboard_notify_clear_focus(seat->wlr_seat);
|
|
|
|
}
|
|
|
|
|
2021-01-30 03:16:57 +01:00
|
|
|
sway_input_method_relay_set_focus(&seat->im_relay, surface);
|
2023-01-09 16:28:59 +01:00
|
|
|
seat_tablet_pads_set_focus(seat, surface);
|
2018-04-07 20:03:30 +02:00
|
|
|
}
|
|
|
|
|
2018-04-03 03:07:46 +02:00
|
|
|
void seat_set_focus_layer(struct sway_seat *seat,
|
2018-09-14 19:21:44 +02:00
|
|
|
struct wlr_layer_surface_v1 *layer) {
|
2018-04-03 21:42:32 +02:00
|
|
|
if (!layer && seat->focused_layer) {
|
2018-04-03 03:07:46 +02:00
|
|
|
seat->focused_layer = 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 13:00:10 +02:00
|
|
|
struct sway_node *previous = seat_get_focus_inactive(seat, &root->node);
|
2018-04-03 23:03:29 +02:00
|
|
|
if (previous) {
|
2018-04-03 21:42:32 +02:00
|
|
|
// Hack to get seat to re-focus the return value of get_focus
|
2018-08-31 13:34:16 +02:00
|
|
|
seat_set_focus(seat, NULL);
|
2018-04-03 23:03:29 +02:00
|
|
|
seat_set_focus(seat, previous);
|
2018-04-03 21:42:32 +02:00
|
|
|
}
|
2018-04-03 03:07:46 +02:00
|
|
|
return;
|
2023-06-05 15:31:16 +02:00
|
|
|
} else if (!layer) {
|
2018-04-03 03:07:46 +02:00
|
|
|
return;
|
|
|
|
}
|
2023-03-05 21:49:45 +01:00
|
|
|
assert(layer->surface->mapped);
|
2023-06-05 15:31:16 +02:00
|
|
|
if (layer->current.layer >= ZWLR_LAYER_SHELL_V1_LAYER_TOP &&
|
|
|
|
layer->current.keyboard_interactive
|
|
|
|
== ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE) {
|
|
|
|
seat->has_exclusive_layer = true;
|
2018-04-03 03:07:46 +02:00
|
|
|
}
|
2023-06-05 15:31:16 +02:00
|
|
|
if (seat->focused_layer == layer) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
seat_set_focus_surface(seat, layer->surface, true);
|
|
|
|
seat->focused_layer = layer;
|
2018-04-03 03:07:46 +02:00
|
|
|
}
|
|
|
|
|
2023-12-04 15:59:11 +01:00
|
|
|
void seat_unfocus_unless_client(struct sway_seat *seat, struct wl_client *client) {
|
2018-04-03 23:03:29 +02:00
|
|
|
if (seat->focused_layer) {
|
|
|
|
if (wl_resource_get_client(seat->focused_layer->resource) != client) {
|
|
|
|
seat_set_focus_layer(seat, NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (seat->has_focus) {
|
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 13:00:10 +02:00
|
|
|
struct sway_node *focus = seat_get_focus(seat);
|
|
|
|
if (node_is_view(focus) && wl_resource_get_client(
|
|
|
|
focus->sway_container->view->surface->resource) != client) {
|
2018-04-03 23:03:29 +02:00
|
|
|
seat_set_focus(seat, NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (seat->wlr_seat->pointer_state.focused_client) {
|
|
|
|
if (seat->wlr_seat->pointer_state.focused_client->client != client) {
|
2020-05-21 03:20:19 +02:00
|
|
|
wlr_seat_pointer_notify_clear_focus(seat->wlr_seat);
|
2018-04-03 23:03:29 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
struct timespec now;
|
|
|
|
clock_gettime(CLOCK_MONOTONIC, &now);
|
|
|
|
struct wlr_touch_point *point;
|
|
|
|
wl_list_for_each(point, &seat->wlr_seat->touch_state.touch_points, link) {
|
|
|
|
if (point->client->client != client) {
|
|
|
|
wlr_seat_touch_point_clear_focus(seat->wlr_seat,
|
|
|
|
now.tv_nsec / 1000, point->touch_id);
|
|
|
|
}
|
|
|
|
}
|
2018-04-03 22:16:42 +02: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 13:00:10 +02:00
|
|
|
struct sway_node *seat_get_focus_inactive(struct sway_seat *seat,
|
|
|
|
struct sway_node *node) {
|
|
|
|
if (node_is_view(node)) {
|
|
|
|
return node;
|
2018-08-17 09:32:53 +02: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 13:00:10 +02:00
|
|
|
struct sway_seat_node *current;
|
2018-08-17 09:32:53 +02:00
|
|
|
wl_list_for_each(current, &seat->focus_stack, link) {
|
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 13:00:10 +02:00
|
|
|
if (node_has_ancestor(current->node, node)) {
|
|
|
|
return current->node;
|
2018-08-17 09:32:53 +02: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 13:00:10 +02:00
|
|
|
if (node->type == N_WORKSPACE) {
|
|
|
|
return node;
|
|
|
|
}
|
2018-08-17 09:32:53 +02:00
|
|
|
return NULL;
|
2018-07-26 14:58:42 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
struct sway_container *seat_get_focus_inactive_tiling(struct sway_seat *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 13:00:10 +02:00
|
|
|
struct sway_workspace *workspace) {
|
|
|
|
if (!workspace->tiling->length) {
|
|
|
|
return NULL;
|
2018-08-17 09:32:53 +02: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 13:00:10 +02:00
|
|
|
struct sway_seat_node *current;
|
2018-08-17 09:32:53 +02:00
|
|
|
wl_list_for_each(current, &seat->focus_stack, link) {
|
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 13:00:10 +02:00
|
|
|
struct sway_node *node = current->node;
|
|
|
|
if (node->type == N_CONTAINER &&
|
|
|
|
!container_is_floating_or_child(node->sway_container) &&
|
2021-02-12 23:22:51 +01:00
|
|
|
node->sway_container->pending.workspace == 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 13:00:10 +02:00
|
|
|
return node->sway_container;
|
2018-08-17 09:32:53 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct sway_container *seat_get_focus_inactive_floating(struct sway_seat *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 13:00:10 +02:00
|
|
|
struct sway_workspace *workspace) {
|
|
|
|
if (!workspace->floating->length) {
|
2018-08-17 09:32:53 +02: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 13:00:10 +02:00
|
|
|
struct sway_seat_node *current;
|
2018-08-17 09:32:53 +02:00
|
|
|
wl_list_for_each(current, &seat->focus_stack, link) {
|
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 13:00:10 +02:00
|
|
|
struct sway_node *node = current->node;
|
|
|
|
if (node->type == N_CONTAINER &&
|
|
|
|
container_is_floating_or_child(node->sway_container) &&
|
2021-02-12 23:22:51 +01:00
|
|
|
node->sway_container->pending.workspace == 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 13:00:10 +02:00
|
|
|
return node->sway_container;
|
2018-08-17 09:32:53 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2018-09-16 14:01:54 +02:00
|
|
|
struct sway_node *seat_get_active_tiling_child(struct sway_seat *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 13:00:10 +02:00
|
|
|
struct sway_node *parent) {
|
|
|
|
if (node_is_view(parent)) {
|
2018-08-17 09:32:53 +02:00
|
|
|
return 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 13:00:10 +02:00
|
|
|
struct sway_seat_node *current;
|
2018-06-03 14:31:54 +02:00
|
|
|
wl_list_for_each(current, &seat->focus_stack, link) {
|
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 13:00:10 +02:00
|
|
|
struct sway_node *node = current->node;
|
2018-09-16 06:04:25 +02:00
|
|
|
if (node_get_parent(node) != parent) {
|
|
|
|
continue;
|
2018-06-03 14:31:54 +02:00
|
|
|
}
|
2018-09-16 06:04:25 +02:00
|
|
|
if (parent->type == N_WORKSPACE) {
|
|
|
|
// Only consider tiling children
|
|
|
|
struct sway_workspace *ws = parent->sway_workspace;
|
|
|
|
if (list_find(ws->tiling, node->sway_container) == -1) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return node;
|
2018-05-20 01:11:55 +02:00
|
|
|
}
|
2018-06-03 14:31:54 +02:00
|
|
|
return NULL;
|
2018-05-20 01:11:55 +02: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 13:00:10 +02:00
|
|
|
struct sway_node *seat_get_focus(struct sway_seat *seat) {
|
2018-02-08 00:17:57 +01:00
|
|
|
if (!seat->has_focus) {
|
|
|
|
return NULL;
|
|
|
|
}
|
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.
2022-01-06 12:44:55 +01:00
|
|
|
sway_assert(!wl_list_empty(&seat->focus_stack),
|
|
|
|
"focus_stack is empty, but has_focus is true");
|
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 13:00:10 +02:00
|
|
|
struct sway_seat_node *current =
|
2018-08-17 09:32:53 +02:00
|
|
|
wl_container_of(seat->focus_stack.next, current, link);
|
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 13:00:10 +02:00
|
|
|
return current->node;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct sway_workspace *seat_get_focused_workspace(struct sway_seat *seat) {
|
2019-03-10 21:47:30 +01:00
|
|
|
struct sway_node *focus = seat_get_focus_inactive(seat, &root->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 13:00:10 +02:00
|
|
|
if (!focus) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
if (focus->type == N_CONTAINER) {
|
2021-02-12 23:22:51 +01:00
|
|
|
return focus->sway_container->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 13:00:10 +02:00
|
|
|
}
|
|
|
|
if (focus->type == N_WORKSPACE) {
|
|
|
|
return focus->sway_workspace;
|
|
|
|
}
|
2019-03-10 21:47:30 +01:00
|
|
|
return NULL; // output doesn't have a workspace yet
|
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 13:00:10 +02:00
|
|
|
}
|
|
|
|
|
2019-04-01 05:27:18 +02:00
|
|
|
struct sway_workspace *seat_get_last_known_workspace(struct sway_seat *seat) {
|
|
|
|
struct sway_seat_node *current;
|
|
|
|
wl_list_for_each(current, &seat->focus_stack, link) {
|
|
|
|
struct sway_node *node = current->node;
|
|
|
|
if (node->type == N_CONTAINER &&
|
2021-02-12 23:22:51 +01:00
|
|
|
node->sway_container->pending.workspace) {
|
|
|
|
return node->sway_container->pending.workspace;
|
2019-04-01 05:27:18 +02:00
|
|
|
} else if (node->type == N_WORKSPACE) {
|
|
|
|
return node->sway_workspace;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
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 13:00:10 +02:00
|
|
|
struct sway_container *seat_get_focused_container(struct sway_seat *seat) {
|
|
|
|
struct sway_node *focus = seat_get_focus(seat);
|
|
|
|
if (focus && focus->type == N_CONTAINER) {
|
|
|
|
return focus->sway_container;
|
|
|
|
}
|
|
|
|
return NULL;
|
2018-02-08 00:17:57 +01:00
|
|
|
}
|
2017-12-14 17:11:56 +01:00
|
|
|
|
2018-04-02 16:37:31 +02:00
|
|
|
void seat_apply_config(struct sway_seat *seat,
|
2017-12-14 17:11:56 +01:00
|
|
|
struct seat_config *seat_config) {
|
|
|
|
struct sway_seat_device *seat_device = NULL;
|
|
|
|
|
|
|
|
if (!seat_config) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-12-11 17:00:39 +01:00
|
|
|
seat->idle_inhibit_sources = seat_config->idle_inhibit_sources;
|
|
|
|
seat->idle_wake_sources = seat_config->idle_wake_sources;
|
|
|
|
|
2017-12-14 17:11:56 +01:00
|
|
|
wl_list_for_each(seat_device, &seat->devices, link) {
|
2018-04-02 14:45:37 +02:00
|
|
|
seat_configure_device(seat, seat_device->input_device);
|
2020-12-06 05:58:57 +01:00
|
|
|
cursor_handle_activity_from_device(seat->cursor,
|
2020-06-14 22:38:48 +02:00
|
|
|
seat_device->input_device->wlr_device);
|
2017-12-14 17:11:56 +01:00
|
|
|
}
|
|
|
|
}
|
2018-04-02 16:37:31 +02:00
|
|
|
|
|
|
|
struct seat_config *seat_get_config(struct sway_seat *seat) {
|
|
|
|
struct seat_config *seat_config = NULL;
|
|
|
|
for (int i = 0; i < config->seat_configs->length; ++i ) {
|
|
|
|
seat_config = config->seat_configs->items[i];
|
|
|
|
if (strcmp(seat->wlr_seat->name, seat_config->name) == 0) {
|
|
|
|
return seat_config;
|
|
|
|
}
|
2017-12-14 17:11:56 +01:00
|
|
|
}
|
2018-04-02 16:37:31 +02:00
|
|
|
|
|
|
|
return NULL;
|
2017-12-14 17:11:56 +01:00
|
|
|
}
|
2018-07-20 01:28:22 +02:00
|
|
|
|
2018-12-27 06:32:15 +01:00
|
|
|
struct seat_config *seat_get_config_by_name(const char *name) {
|
|
|
|
struct seat_config *seat_config = NULL;
|
|
|
|
for (int i = 0; i < config->seat_configs->length; ++i ) {
|
|
|
|
seat_config = config->seat_configs->items[i];
|
|
|
|
if (strcmp(name, seat_config->name) == 0) {
|
|
|
|
return seat_config;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2018-07-21 03:23:48 +02:00
|
|
|
void seat_pointer_notify_button(struct sway_seat *seat, uint32_t time_msec,
|
|
|
|
uint32_t button, enum wlr_button_state state) {
|
|
|
|
seat->last_button_serial = wlr_seat_pointer_notify_button(seat->wlr_seat,
|
|
|
|
time_msec, button, state);
|
|
|
|
}
|
2018-10-18 23:57:50 +02:00
|
|
|
|
|
|
|
void seat_consider_warp_to_focus(struct sway_seat *seat) {
|
|
|
|
struct sway_node *focus = seat_get_focus(seat);
|
2018-10-19 14:28:02 +02:00
|
|
|
if (config->mouse_warping == WARP_NO || !focus) {
|
2018-10-18 23:57:50 +02:00
|
|
|
return;
|
|
|
|
}
|
2018-10-19 14:28:02 +02:00
|
|
|
if (config->mouse_warping == WARP_OUTPUT) {
|
|
|
|
struct sway_output *output = node_get_output(focus);
|
2019-04-13 12:33:07 +02:00
|
|
|
if (output) {
|
|
|
|
struct wlr_box box;
|
|
|
|
output_get_box(output, &box);
|
|
|
|
if (wlr_box_contains_point(&box,
|
|
|
|
seat->cursor->cursor->x, seat->cursor->cursor->y)) {
|
|
|
|
return;
|
|
|
|
}
|
2018-10-19 14:28:02 +02:00
|
|
|
}
|
2018-10-18 23:57:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if (focus->type == N_CONTAINER) {
|
2020-11-01 00:56:40 +01:00
|
|
|
cursor_warp_to_container(seat->cursor, focus->sway_container, false);
|
2018-10-18 23:57:50 +02:00
|
|
|
} else {
|
|
|
|
cursor_warp_to_workspace(seat->cursor, focus->sway_workspace);
|
|
|
|
}
|
|
|
|
}
|
2019-01-10 13:04:42 +01:00
|
|
|
|
|
|
|
void seatop_unref(struct sway_seat *seat, struct sway_container *con) {
|
Introduce default seatop
This introduces a `default` seat operation which is used when no mouse
buttons are being held. This means there is now always a seat operation
in progress. It allows us to separate `default` code from the standard
cursor management code.
The sway_seatop_impl struct has gained callbacks `axis`, `rebase` and
`end`, and lost callbacks `finish` and `abort`. `axis` and `rebase` are
only used by the default seatop. `end` is called when a seatop is being
replaced by another one and allows the seatop to free any resources,
though no seatop currently needs to do this. `finish` is no longer
required, as each seatop can gracefully finish in their `button`
callback. And `abort` is not needed, as calling `end` would achieve the
same thing. The struct has also gained a bool named allow_set_cursor
which allows the client to set a new cursor during `default` and `down`
seatops.
Seatops would previously store which button they were started with and
stop when that button was released. This behaviour is changed so that it
only ends once all buttons are released. So you can start a drag with
$mod+left, then click and hold right, release left and it'll continue
dragging while the right button is held.
The motion callback now accepts dx and dy. Most seatops don't use this
as they store the cursor position when the seatop is started and compare
it with the current cursor position. This approach doesn't make sense
for the default seatop though, hence why dx and dy are needed.
The pressed_buttons array has been moved from the sway_cursor struct to
the default seatop's data. This is only used for the default seatop to
check bindings. The total pressed button count remains in the
sway_cursor struct though, because all the other seatops check it to
know if they should end.
The `down` seatop no longer has a `moved` property. This was used to
track if the cursor moved and to recheck focus_follows_mouse, but seems
to work without it.
The logic for focus_follows_mouse has been refactored. As part of this
I've removed the call to wlr_seat_keyboard_has_grab as we don't appear
to use keyboard grabs.
The functions for handling relative motion, absolute motion and tool
axis have been changed. Previously the handler functions were
handle_cursor_motion, handle_cursor_motion_absolute and
handle_tool_axis. The latter two both called cursor_motion_absolute.
Both handle_cursor_motion and cursor_motion_absolute did very similar
things. These are now simplified into three handlers and a single common
function called cursor_motion. All three handlers call cursor_motion. As
cursor_motion works with relative distances, the absolute and tool axis
handlers convert them to relative first.
2019-03-16 08:47:39 +01:00
|
|
|
if (seat->seatop_impl->unref) {
|
2019-01-10 13:04:42 +01:00
|
|
|
seat->seatop_impl->unref(seat, con);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-16 00:18:54 +01:00
|
|
|
void seatop_button(struct sway_seat *seat, uint32_t time_msec,
|
|
|
|
struct wlr_input_device *device, uint32_t button,
|
|
|
|
enum wlr_button_state state) {
|
Introduce default seatop
This introduces a `default` seat operation which is used when no mouse
buttons are being held. This means there is now always a seat operation
in progress. It allows us to separate `default` code from the standard
cursor management code.
The sway_seatop_impl struct has gained callbacks `axis`, `rebase` and
`end`, and lost callbacks `finish` and `abort`. `axis` and `rebase` are
only used by the default seatop. `end` is called when a seatop is being
replaced by another one and allows the seatop to free any resources,
though no seatop currently needs to do this. `finish` is no longer
required, as each seatop can gracefully finish in their `button`
callback. And `abort` is not needed, as calling `end` would achieve the
same thing. The struct has also gained a bool named allow_set_cursor
which allows the client to set a new cursor during `default` and `down`
seatops.
Seatops would previously store which button they were started with and
stop when that button was released. This behaviour is changed so that it
only ends once all buttons are released. So you can start a drag with
$mod+left, then click and hold right, release left and it'll continue
dragging while the right button is held.
The motion callback now accepts dx and dy. Most seatops don't use this
as they store the cursor position when the seatop is started and compare
it with the current cursor position. This approach doesn't make sense
for the default seatop though, hence why dx and dy are needed.
The pressed_buttons array has been moved from the sway_cursor struct to
the default seatop's data. This is only used for the default seatop to
check bindings. The total pressed button count remains in the
sway_cursor struct though, because all the other seatops check it to
know if they should end.
The `down` seatop no longer has a `moved` property. This was used to
track if the cursor moved and to recheck focus_follows_mouse, but seems
to work without it.
The logic for focus_follows_mouse has been refactored. As part of this
I've removed the call to wlr_seat_keyboard_has_grab as we don't appear
to use keyboard grabs.
The functions for handling relative motion, absolute motion and tool
axis have been changed. Previously the handler functions were
handle_cursor_motion, handle_cursor_motion_absolute and
handle_tool_axis. The latter two both called cursor_motion_absolute.
Both handle_cursor_motion and cursor_motion_absolute did very similar
things. These are now simplified into three handlers and a single common
function called cursor_motion. All three handlers call cursor_motion. As
cursor_motion works with relative distances, the absolute and tool axis
handlers convert them to relative first.
2019-03-16 08:47:39 +01:00
|
|
|
if (seat->seatop_impl->button) {
|
2019-03-16 00:18:54 +01:00
|
|
|
seat->seatop_impl->button(seat, time_msec, device, button, state);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-10-31 22:56:21 +01:00
|
|
|
void seatop_pointer_motion(struct sway_seat *seat, uint32_t time_msec) {
|
2020-05-02 18:15:39 +02:00
|
|
|
if (seat->seatop_impl->pointer_motion) {
|
2020-10-31 22:56:21 +01:00
|
|
|
seat->seatop_impl->pointer_motion(seat, time_msec);
|
2019-01-10 13:04:42 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-05-02 18:15:39 +02:00
|
|
|
void seatop_pointer_axis(struct sway_seat *seat,
|
2022-03-09 22:50:20 +01:00
|
|
|
struct wlr_pointer_axis_event *event) {
|
2020-05-02 18:15:39 +02:00
|
|
|
if (seat->seatop_impl->pointer_axis) {
|
|
|
|
seat->seatop_impl->pointer_axis(seat, event);
|
2019-01-10 13:04:42 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-08-21 16:04:08 +02:00
|
|
|
void seatop_touch_motion(struct sway_seat *seat, struct wlr_touch_motion_event *event,
|
|
|
|
double lx, double ly) {
|
|
|
|
if (seat->seatop_impl->touch_motion) {
|
|
|
|
seat->seatop_impl->touch_motion(seat, event, lx, ly);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void seatop_touch_up(struct sway_seat *seat, struct wlr_touch_up_event *event) {
|
|
|
|
if (seat->seatop_impl->touch_up) {
|
|
|
|
seat->seatop_impl->touch_up(seat, event);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void seatop_touch_down(struct sway_seat *seat, struct wlr_touch_down_event *event,
|
|
|
|
double lx, double ly) {
|
|
|
|
if (seat->seatop_impl->touch_down) {
|
|
|
|
seat->seatop_impl->touch_down(seat, event, lx, ly);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-05-04 01:13:33 +02:00
|
|
|
void seatop_touch_cancel(struct sway_seat *seat, struct wlr_touch_cancel_event *event) {
|
|
|
|
if (seat->seatop_impl->touch_cancel) {
|
|
|
|
seat->seatop_impl->touch_cancel(seat, event);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
input/tablet: add seatop_down entry for tablet input
Currently, when tablet input exits a window during an implicit grab, it
passes focus to another window.
For instance, this is problematic when trying to drag a scrollbar, and
exiting the window — the scrollbar motion stops. Additionally,
without `focus_follows_mouse no`, the tablet passes focus to whatever
surface it goes over regardless of if there is an active implicit.
If the tablet is over a surface that does not bind tablet handlers, sway
will fall back to pointer emulation, and all of this works fine. It
probably should have consistent behavior between emulated and
not-emulated input, though.
This commit adds a condition for entering seatop_down when a tablet's
tool tip goes down, and exiting when it goes up. Since events won't be
routed through seatop_default, this prevents windows losing focus during
implicit grabs.
Closes #5302.
2020-05-04 23:34:28 +02:00
|
|
|
void seatop_tablet_tool_tip(struct sway_seat *seat,
|
|
|
|
struct sway_tablet_tool *tool, uint32_t time_msec,
|
|
|
|
enum wlr_tablet_tool_tip_state state) {
|
|
|
|
if (seat->seatop_impl->tablet_tool_tip) {
|
|
|
|
seat->seatop_impl->tablet_tool_tip(seat, tool, time_msec, state);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-25 23:57:47 +02:00
|
|
|
void seatop_tablet_tool_motion(struct sway_seat *seat,
|
2020-10-31 22:56:21 +01:00
|
|
|
struct sway_tablet_tool *tool, uint32_t time_msec) {
|
2020-04-25 23:57:47 +02:00
|
|
|
if (seat->seatop_impl->tablet_tool_motion) {
|
2020-10-31 22:56:21 +01:00
|
|
|
seat->seatop_impl->tablet_tool_motion(seat, tool, time_msec);
|
2020-04-25 23:57:47 +02:00
|
|
|
} else {
|
2020-10-31 22:56:21 +01:00
|
|
|
seatop_pointer_motion(seat, time_msec);
|
2020-04-25 23:57:47 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-04-23 10:27:47 +02:00
|
|
|
void seatop_hold_begin(struct sway_seat *seat,
|
|
|
|
struct wlr_pointer_hold_begin_event *event) {
|
|
|
|
if (seat->seatop_impl->hold_begin) {
|
|
|
|
seat->seatop_impl->hold_begin(seat, event);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void seatop_hold_end(struct sway_seat *seat,
|
|
|
|
struct wlr_pointer_hold_end_event *event) {
|
|
|
|
if (seat->seatop_impl->hold_end) {
|
|
|
|
seat->seatop_impl->hold_end(seat, event);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void seatop_pinch_begin(struct sway_seat *seat,
|
|
|
|
struct wlr_pointer_pinch_begin_event *event) {
|
|
|
|
if (seat->seatop_impl->pinch_begin) {
|
|
|
|
seat->seatop_impl->pinch_begin(seat, event);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void seatop_pinch_update(struct sway_seat *seat,
|
|
|
|
struct wlr_pointer_pinch_update_event *event) {
|
|
|
|
if (seat->seatop_impl->pinch_update) {
|
|
|
|
seat->seatop_impl->pinch_update(seat, event);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void seatop_pinch_end(struct sway_seat *seat,
|
|
|
|
struct wlr_pointer_pinch_end_event *event) {
|
|
|
|
if (seat->seatop_impl->pinch_end) {
|
|
|
|
seat->seatop_impl->pinch_end(seat, event);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void seatop_swipe_begin(struct sway_seat *seat,
|
|
|
|
struct wlr_pointer_swipe_begin_event *event) {
|
|
|
|
if (seat->seatop_impl->swipe_begin) {
|
|
|
|
seat->seatop_impl->swipe_begin(seat, event);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void seatop_swipe_update(struct sway_seat *seat,
|
|
|
|
struct wlr_pointer_swipe_update_event *event) {
|
|
|
|
if (seat->seatop_impl->swipe_update) {
|
|
|
|
seat->seatop_impl->swipe_update(seat, event);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void seatop_swipe_end(struct sway_seat *seat,
|
|
|
|
struct wlr_pointer_swipe_end_event *event) {
|
|
|
|
if (seat->seatop_impl->swipe_end) {
|
|
|
|
seat->seatop_impl->swipe_end(seat, event);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Introduce default seatop
This introduces a `default` seat operation which is used when no mouse
buttons are being held. This means there is now always a seat operation
in progress. It allows us to separate `default` code from the standard
cursor management code.
The sway_seatop_impl struct has gained callbacks `axis`, `rebase` and
`end`, and lost callbacks `finish` and `abort`. `axis` and `rebase` are
only used by the default seatop. `end` is called when a seatop is being
replaced by another one and allows the seatop to free any resources,
though no seatop currently needs to do this. `finish` is no longer
required, as each seatop can gracefully finish in their `button`
callback. And `abort` is not needed, as calling `end` would achieve the
same thing. The struct has also gained a bool named allow_set_cursor
which allows the client to set a new cursor during `default` and `down`
seatops.
Seatops would previously store which button they were started with and
stop when that button was released. This behaviour is changed so that it
only ends once all buttons are released. So you can start a drag with
$mod+left, then click and hold right, release left and it'll continue
dragging while the right button is held.
The motion callback now accepts dx and dy. Most seatops don't use this
as they store the cursor position when the seatop is started and compare
it with the current cursor position. This approach doesn't make sense
for the default seatop though, hence why dx and dy are needed.
The pressed_buttons array has been moved from the sway_cursor struct to
the default seatop's data. This is only used for the default seatop to
check bindings. The total pressed button count remains in the
sway_cursor struct though, because all the other seatops check it to
know if they should end.
The `down` seatop no longer has a `moved` property. This was used to
track if the cursor moved and to recheck focus_follows_mouse, but seems
to work without it.
The logic for focus_follows_mouse has been refactored. As part of this
I've removed the call to wlr_seat_keyboard_has_grab as we don't appear
to use keyboard grabs.
The functions for handling relative motion, absolute motion and tool
axis have been changed. Previously the handler functions were
handle_cursor_motion, handle_cursor_motion_absolute and
handle_tool_axis. The latter two both called cursor_motion_absolute.
Both handle_cursor_motion and cursor_motion_absolute did very similar
things. These are now simplified into three handlers and a single common
function called cursor_motion. All three handlers call cursor_motion. As
cursor_motion works with relative distances, the absolute and tool axis
handlers convert them to relative first.
2019-03-16 08:47:39 +01:00
|
|
|
void seatop_rebase(struct sway_seat *seat, uint32_t time_msec) {
|
|
|
|
if (seat->seatop_impl->rebase) {
|
|
|
|
seat->seatop_impl->rebase(seat, time_msec);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void seatop_end(struct sway_seat *seat) {
|
|
|
|
if (seat->seatop_impl && seat->seatop_impl->end) {
|
|
|
|
seat->seatop_impl->end(seat);
|
2019-01-10 13:04:42 +01:00
|
|
|
}
|
|
|
|
free(seat->seatop_data);
|
|
|
|
seat->seatop_data = NULL;
|
|
|
|
seat->seatop_impl = NULL;
|
|
|
|
}
|
|
|
|
|
Introduce default seatop
This introduces a `default` seat operation which is used when no mouse
buttons are being held. This means there is now always a seat operation
in progress. It allows us to separate `default` code from the standard
cursor management code.
The sway_seatop_impl struct has gained callbacks `axis`, `rebase` and
`end`, and lost callbacks `finish` and `abort`. `axis` and `rebase` are
only used by the default seatop. `end` is called when a seatop is being
replaced by another one and allows the seatop to free any resources,
though no seatop currently needs to do this. `finish` is no longer
required, as each seatop can gracefully finish in their `button`
callback. And `abort` is not needed, as calling `end` would achieve the
same thing. The struct has also gained a bool named allow_set_cursor
which allows the client to set a new cursor during `default` and `down`
seatops.
Seatops would previously store which button they were started with and
stop when that button was released. This behaviour is changed so that it
only ends once all buttons are released. So you can start a drag with
$mod+left, then click and hold right, release left and it'll continue
dragging while the right button is held.
The motion callback now accepts dx and dy. Most seatops don't use this
as they store the cursor position when the seatop is started and compare
it with the current cursor position. This approach doesn't make sense
for the default seatop though, hence why dx and dy are needed.
The pressed_buttons array has been moved from the sway_cursor struct to
the default seatop's data. This is only used for the default seatop to
check bindings. The total pressed button count remains in the
sway_cursor struct though, because all the other seatops check it to
know if they should end.
The `down` seatop no longer has a `moved` property. This was used to
track if the cursor moved and to recheck focus_follows_mouse, but seems
to work without it.
The logic for focus_follows_mouse has been refactored. As part of this
I've removed the call to wlr_seat_keyboard_has_grab as we don't appear
to use keyboard grabs.
The functions for handling relative motion, absolute motion and tool
axis have been changed. Previously the handler functions were
handle_cursor_motion, handle_cursor_motion_absolute and
handle_tool_axis. The latter two both called cursor_motion_absolute.
Both handle_cursor_motion and cursor_motion_absolute did very similar
things. These are now simplified into three handlers and a single common
function called cursor_motion. All three handlers call cursor_motion. As
cursor_motion works with relative distances, the absolute and tool axis
handlers convert them to relative first.
2019-03-16 08:47:39 +01:00
|
|
|
bool seatop_allows_set_cursor(struct sway_seat *seat) {
|
|
|
|
return seat->seatop_impl->allow_set_cursor;
|
|
|
|
}
|
2020-02-15 20:55:33 +01:00
|
|
|
|
|
|
|
struct sway_keyboard_shortcuts_inhibitor *
|
2020-03-12 22:10:04 +01:00
|
|
|
keyboard_shortcuts_inhibitor_get_for_surface(
|
|
|
|
const struct sway_seat *seat,
|
|
|
|
const struct wlr_surface *surface) {
|
2020-02-15 20:55:33 +01:00
|
|
|
struct sway_keyboard_shortcuts_inhibitor *sway_inhibitor = NULL;
|
|
|
|
wl_list_for_each(sway_inhibitor, &seat->keyboard_shortcuts_inhibitors, link) {
|
2020-03-12 22:10:04 +01:00
|
|
|
if (sway_inhibitor->inhibitor->surface == surface) {
|
2020-02-15 20:55:33 +01:00
|
|
|
return sway_inhibitor;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
2020-03-12 22:10:04 +01:00
|
|
|
|
|
|
|
struct sway_keyboard_shortcuts_inhibitor *
|
|
|
|
keyboard_shortcuts_inhibitor_get_for_focused_surface(
|
|
|
|
const struct sway_seat *seat) {
|
|
|
|
return keyboard_shortcuts_inhibitor_get_for_surface(seat,
|
|
|
|
seat->wlr_seat->keyboard_state.focused_surface);
|
|
|
|
}
|