aboutsummaryrefslogtreecommitdiff
path: root/sway/input/cursor.c
AgeCommit message (Collapse)Author
2021-07-26Fix wl_pointer.frame not sent on touch emulationSimon Ser
When emulating touch, the simulating_pointer_from_touch field is set to true. It's switched back to false when a touch_up event is received. However we need to ensure we always send a wl_pointer.frame event following a group of other wl_pointer events. Since a touch_frame event is always guaranteed to come after a group of touch events, unset simulating_pointer_from_touch in the touch_frame handler instead of the touch_up handler. Add a new field to know whether the touch_frame handler should stop emulation.
2021-07-08Add support for touch frame eventsSimon Ser
Update for the breaking change in [1]. [1]: https://github.com/swaywm/wlroots/pull/3001
2021-07-07Update wlr_box includesSimon Ser
Update for the breaking change in [1]. [1]: https://github.com/swaywm/wlroots/pull/3011
2021-06-23input: Move get_current_time_msec in from utilKenny Levinsen
get_current_time_msec is only used in cursor.c, so we can move it in and make it static. This is primarily intended to avoid a symbol collision with wlroots, which we unfortunately do not have a good solution for yet.
2021-02-16container: Move pending state to state structKenny Levinsen
Pending state is currently inlined directly in the container struct, while the current state is in a state struct. A side-effect of this is that it is not immediately obvious that pending double-buffered state is accessed, nor is it obvious what state is double-buffered. Instead, use the state struct for both current and pending.
2021-02-14input: Only commit transactions when necessaryKenny Levinsen
There is no need to check for transactions at the end of every user input, as the vast majority of input will not issue transactions. This implementation can also hide where changes are made without an appropriate transaction commit, as a future unrelated input would issue the commit instead. Instead, commit transactions in places where changes are made or are likely to be made.
2020-12-06input/cursor: unhide cursor on synthetic inputTudor Brindus
Fixes #5847.
2020-11-11Add missing includes for wlr_input_device.hSimon Ser
References: https://github.com/swaywm/wlroots/pull/2470
2020-11-01commands/focus: force container warp when fulfilling `focus mode_toggle`Tudor Brindus
This commit switches focusing behavior to force a warp when executing `focus mode_toggle`. Fixes #5772.
2020-10-31input: remove motion deltas from seatop callbacksTudor Brindus
Straightforward cleanup, they haven't been used for a while.
2020-10-30hide_cursor: Add an option to hide when typingTamir Zahavi-Brunner
Add an option for the `hide_cursor` command to hide the cursor when typing, i.e. whenever a key is pressed.
2020-10-12input/tablet: add tool_mode option to set tablet tools as relative inputTudor Brindus
Closes #4139.
2020-10-12input/cursor: default tablet lens tool to relative motionTudor Brindus
It is recommended that mouse and lens cursor tool default to relative mode and all pen-like tools to absolute mode. Refs https://wayland.freedesktop.org/libinput/doc/1.11.3/tablet-support.html#tablet-relative-motion.
2020-09-16cursor: update hide timer during config applyRouven Czerwinski
We can't arm the timer during cursor creation since the config may not be ready yet. Instead arm the timer while applying the input configuration, by this time the configuration has been parsed and we can arm the hide timer. Fixes #5686
2020-09-15cursor: arm cursor hide timer immediatelyRouven Czerwinski
According to the wayland docs, wayland timers are disarmed on creation. This leads to the cursor not being hidden if there is no activity after creation, since the timer is armed on activity, but not at creation. Arm the timer after creation to ensure the cursor is hidden even if there is no cursor activity after creation. Fixes #5684
2020-09-14input/pointer: update cursor activity after updating button countsTudor Brindus
Otherwise, Sway will not re-hide a cursor after the last button has been released. Needed alongside afa890e to fix #5679.
2020-09-14input/cursor: reset event source after unhideRouven Czerwinski
Reset the event source after unhiding the cursor, to ensure that the timeout starts after showing the cursor. Also remove the open coded variant in seat_consider_warp_to_focus(). Fixes #5679
2020-07-15input/cursor: don't send wl_pointer.motion event on pointer unlock warpTudor Brindus
On warping to a cursor hint, update the pointer position we track as well, so that on the next pointer rebase we don't send an unexpected synthetic motion event to clients. Fixes #5405.
2020-07-10config/output: don't change output state before commitSimon Ser
Previously, we called output_disable prior to wlr_output_commit. This mutates Sway's output state before the output commit actually succeeds. This results in Sway's state getting out-of-sync with wlroots'. An alternative fix [1] was to revert the changes made by output_disable in case of failure. This is a little complicated. Instead, this patch makes it so Sway's internal state is never changed before a successful wlr_output commit. We had two output flags: enabled and configured. However enabled was set prior to the output becoming enabled, and was used to prevent the output event handlers (specifically, the mode handler) from calling apply_output_config again (infinite loop). Rename enabled to enabling and use it exclusively for this purpose. Rename configure to enabled, because that's what it really means. [1]: https://github.com/swaywm/sway/pull/5521 Closes: https://github.com/swaywm/sway/issues/5483
2020-06-18input/pointer: don't trigger pointer bindings for emulated inputTudor Brindus
Prior to this commit, a tablet device could trigger mouse button down bindings if the pen was pressed on a surface that didn't bind tablet handlers -- but it wouldn't if the surface did bind tablet handlers. We should expose consistent behavior to users so that they don't have to care about emulated vs. non-emulated input, so stop triggering bindings for any non-pointer devices.
2020-06-18input/cursor: send idle events based off device type, not input typeTudor Brindus
Previously, a tablet or touch device could report activity as a pointer device if it went through pointer emulation. This commit refactors idle sources to be consistently reported based on the type of the device that generated an input event, and now how that input event is being processed.
2020-06-06common/util: fix `get_current_time_msec` returning microsecondsTudor Brindus
This commit makes `get_current_time_msec` correctly return milliseconds as opposed to microseconds. It also considers the value of `tv_sec`, so we don't lose occasionally go back in time by one second. Finally, the function is moved into `util.c` so that it can be reused elsewhere without having to consider these pitfalls.
2020-06-05Use new wlroots API for clearing keyboard/pointer focus during grabsThomas Hebb
We are not allowed to do what we did in #5222 and pass a `NULL` surface wlr_seat_pointer_notify_enter(), and it's causing crashes when an xdg-shell popup is active (see #5294 and swaywm/wlroots#2161). Instead, solve #5220 using the new wlroots API introduced in swaywm/wlroots#2217.
2020-06-04input/cursor: refactor tablet tool tip events into seatopsTudor Brindus
This commit moves tool tip event generation into seatops. In doing so, some corner cases where we'd erroneously (but likely harmlessly) generate both tablet and pointer events simultaneously are eliminated.
2020-05-29input/cursor: rename `simulated_tool_tip_down` to be more accurateTudor Brindus
This is a tiny cleanup commit that renames `simulated_tool_tip_down` to `simulating_pointer_from_tool_tip`, making it match `simulating_pointer_from_touch`. This is a better name since it makes it clear that it's the *pointer* that's being simulated, not the tool tip.
2020-05-28input/pointer: send pointer enter event on confine warpTudor Brindus
The spec has this to say about sending events on confine creation: Whenever the confinement is activated, it is guaranteed that the surface the pointer is confined to will already have received pointer focus and that the pointer will be within the region passed to the request creating this object. ...and on region update: If warped, a wl_pointer.motion event will be emitted, but no wp_relative_pointer.relative_motion event. Prior to this patch, sway did neither, and updated the hardware cursor position without notifying the underlying surface until the next motion event. This led to inconsistent results, especially in applications that draw their own software cursor.
2020-05-26input/cursor: keep reference to cursor in constraintTudor Brindus
set_region accepts a NULL *data, so we can't use it to reference the constraint and find the cursor through its seat. Fixes #5386.
2020-05-25input/cursor: fix heap-buffer overflow in constraint set_regionTudor Brindus
Fixes #5383, caused by an oversight in 6f0a0bd.
2020-05-25input/tablet: add seatop_down entry for tablet inputTudor Brindus
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-21input/pointer: only warp cursor when the confine region has changedTudor Brindus
Refs #5268.
2020-05-13Implement pointer simulation if client hasn't bound to touchDavid96
2020-05-13input/cursor: don't apply pointer constraint to emulated tablet inputTudor Brindus
Closes #5268.
2020-05-10input/tablet: simplify parameter plumbing for tablet referencesTudor Brindus
This is a small cleanup commit for removing `sway_tablet` parameters from functions that already accept `sway_tablet_tool`, since the tablet reference can be accessed through `tool->tablet`.
2020-05-05Don't unhide cursor on touch eventsDavid96
Touch events hide the cursor so unhiding it again only causes it to flicker.
2020-05-02input/cursor: remove erroneous cast for tablet tool buttonTudor Brindus
The type expected by wlroots is uint32_t, which `event->button` already is.
2020-05-02input: rename pointer handlers to be unambiguousTudor Brindus
This commit renames `motion` and `axis` handlers to `pointer_motion` and `pointer_axis`, respectively, to disambiguate them from their tablet (and future touch) handlers. `button` is left as-is, as it is generic across input devices.
2020-05-02input: refactor tablet motion into seatop handlerTudor Brindus
This commit moves tablet motion logic into a seatop handler. As a side-effect of seatop implementations being able to receive tablet motion events, fixes #5232.
2020-05-02input/cursor: disambiguate cursor functions from pointer functionsTudor Brindus
2020-05-02input/cursor: make cursor rebasing cursor type-agnosticTudor Brindus
This commit refactors `cursor_rebase` into `cursor_update_image`, and moves sending pointer events to the two existing call sites. This will enable this code to be reused for tablets. Refs #5232
2020-05-01input/cursor: release simulated tool tip button when over v2 surfaceTudor Brindus
d88460f addressed sending v2 tool tip up when over a non-v2 surface. This commit addresses the other direction. Fixes #5230.
2020-04-24input/cursor: correctly transfer focus when using tablet penTudor Brindus
Fixes #4819. This commit ensures that `seat_set_focus` is called to transfer focus when a window is selected via a pen. Previously, it would race with `node_at_coords`, and only properly transfer focus if its returned `surface` was NULL.
2020-04-22input/cursor: fix hide cursor timeouts on tablets and touchscreensTudor Brindus
This commit refactors `cursor_handle_activity` to also take the idle source, so that it can be reused for tablet and touch activity. Previously, the timeouts would be tracked, but the cursor would never be un-hidden for anything but pointers. Fixes #5169.
2020-04-22input/cursor: fix jerky resizing of non-tablet_v2 surfacesTudor Brindus
This fixes resizing containers being very jerky under pointer emulation. Refs #5232.
2020-04-22input/cursor: correctly send tablet_v2 up event when over non-v2 surfaceTudor Brindus
If we started holding the tool tip down on a surface that accepts tablet v2, we should notify that surface if it gets released over a surface that doesn't support v2. Since GTK supports tablet v2, this fixes the common case of starting a drag over a GTK surface (e.g. scrollbar) and releasing it outside (e.g. over the gaps between sway containers, or in a terminal). Refs #5230.
2020-04-17Don't transfer focus to NULL node on touchDavid96
Fixes #5185
2020-04-10Adjust focus order to match rendering order of layer shell popups.Aleksei Bavshin
2020-04-03swapped hiding the cursor and sending a touch event as a more logical sequenceSome Chinese Guy
2020-03-29switched to setting focus with seat_set_focusSome Chinese Guy
2020-03-29Added focus following for touch_downSome Chinese Guy
2020-03-16sway/input/cursor.c: fix undefined behaviour when event is NULLJason Nader