This patch introduces more configuration options for pointer devices:
* adds `tap` option
* adds `tap-drag` option
* adds `tap-drag-lock` option
* adds `natural-scrolling` option
* adds `no-scroll` to `scroll-method`
This also changes the way unconfigured options are handled. `hikari` is no
longer going to overwrite unconfigured values with its own default but rather
keeps them unchanged.
Xwayland uses layout coordinates for positioning surfaces, while hikari uses
coordinates relative to the position of a view's output. That means that
coordinates need to be converted first before they are used in Xwayland calls
(and vice versa).
This basically reverts fdcada068164e5d4c89a932fdea94eb42d3e7c09 and
(hopefully) fixes the remaining places where a conversion was missing.
These are very different operations and this should be reflected in the code as
well. This patch also allows to write code that can migrate views on demand.
If this does not happen the focus can change to a different view during this
action. This is disorienting. To prevent this we raise the view to the top at
the beginning of the action.
This patch allows to position views relative to the output by stating one of the
following values as position:
* `bottom-left`
* `bottom-middle`
* `bottom-right`
* `center`
* `center-left`
* `center-right`
* `top-left`
* `top-middle`
* `top-right`
As documented in issue #1 destroying a layer before mapping it leads to the
freed memory still being linked to the `layer_surfaces` list. This patch adds
the invariant the we always need to be able to remove this link. This is ensured
by doing a `wl_list_init` after every `wl_list_remove`.
This allows clients to set the cursor surface. There is still a bug lurking in
`wlroots` that might cause some unpleasant screen flickering which is triggered
by this patch. To prevent this from happening one can set `WLR_DRM_NO_ATOMIC` to
`1` in the environment before startup.
Exchanging maximized views can lead to confusing results since they happen to
resize tiles to the maximized size. They lose their maximization state and
cannot be unmaximized anymore because this is now the actual tile size. This
patch uses the size of the tiles leading to more predictable behavior.
Entering normal mode is now used in all modes to quit their current mode, this
centralizes cursor focus in this function since we need to refresh it after
exiting a mode.
This patch reworks entirely how `hikari` marks areas as damaged. Instead of
damaging all views during indication just the views that actually change
indication get damaged.
There are currently two different code paths where layouts get applied. One in
layout mode and one for directly applying a layout via a shortcut. This leads do
confusing behavior, hence we centralize the action in the workspace module.
The code for entering each mode is currently in the server module, moving those
into the appropriate mode modules allows for more optimizations (like properly
refreshing indicators).
Applications like `wofi` and others should grab the focus when they appear,
otherwise the user needs to manually cycle to those views.
Views from the `top` and `overlay` layer gain focus if they happen to request
it.
Since sheet groups have been removed this does not need to be checked for
anymore. Group names can now start with digits since there are no special
purpose groups anymore that can overlap.
If this is not checked the damage of a subsurface will get processed even though
the view that contains it (and therefore the subsurface) is hidden. This can be
seen when e.g. a Youtube video is running on another sheet.
Before this we only damaged the surface are of the view that was operated on,
this does not take things like subsurfaces into account and leads to damage
artifacts when subsurfaces get resized before the operation is being committed.
This also makes the `geometry_before` parameter redundant.
The cursor needs to be centered during `commit_tile` otherwise the cursor might
center the opposite view of the exchange. This happens when the tile operation
shortcuts if the size of the source and target tile are equal.
This orders the listeners so that they are linked and unlinked in the same
order. This way it's easier to spot missing unlinks.
`set_title` should also be linked during `map` since it gets unlined during
`unmap`.
Trying to cycle from a borrowed tiled view on a tiled sheet causes a crash. We
need to check if the layout of the view and the sheet differ, if that's the case
have to fall back.
Resizing should be possible in every direction, this is especially useful for
views that have been tiled.
This patch adds the following action to complete the set of resize operations.
* view-increase-size-up
* view-decrease-size-down
* view-increase-size-left
* view-decrease-size-right
This adds layer-shell support to hikari. Outputs now have a usable area instead
of just the view geometry. This is used to prevent views from being placed under
status bars etc. Support for layer shell is optional and can be compiled in via
`WITH_LAYERSHELL=YES`.
Cursor focus needs to be triggered after tiling because the view under the
cursor might change. Currently this event will not change focus which is
confusing.
This event should be sent to all output views and not only those present on the
workspace. Leaving out views can cause the impression of view content lagging
behind when displaying views that have been hidden and updated during that time
period.
Sheets no longer have a special group. Each view needs to be part of a group
though, therefore we take the app id or class of a view when no explicit group
is assigned. This conveniently allows the user to figure out app id or class of
a view without the need for additional tooling.
The operations allow for new views to be attached to an existing layout. The
operation behaves just like setting layout but without changing layout order.
Reset and migration are currently to complicated and can cause faulty behavior.
One thing that can happen is that detached tiles can get detached again. This
patch ensures that reset views are all in a detached state so commit actions
always do the right thing.
This automatically hides borrowed views and moves views of sheet 0 to the bottom
of the stack. Hidden views automatically get displayed and do not need to be
shown with the scan function which also makes things a lot more consistent.
This raises floating views to the top of the stack after a tiling operation.
This should be a little less surprising for users of tiling window managers it
also makes a bit more sense for tiling semantics.
This really didn't belong here in the first place. This patch replaces the
resolver with a generic keysym iterator that allows for module site
implementation of the wanted functionality.
Font metrics are now cached in the font struct and do not need to be recomputed
with every indicator bar update. This also fixes issues with reloading the
configuration and related font changes.
In some cases indicator frames do not get damaged properly, we
need to refresh indication more often especially when the
focus view disappears and overlapping indicator frames exist.
Binding actions to the release event for a certain key is not enough for
functionality like "push to talk". The release action might get lost when a user
releases modifiers first.
This patch introduces *begin* and *end* actions. The *begin* action is followed
by the *end* action once we release any key or push more keys.
Due to increased use of features like "push-to-talk" because of pandemic
reasons, people have requested to be able to bind release key events to actions.
This can now be done by prefixing a binding with `^`.
Iconified state has always been a misnomer. The view is not iconified at all,
there is no icon laying around it is just invisible when a sheet is shown.
Resetting geometry should always work even when the view is marked as dirty.
This means that there can be a pending tile structure which would not be
properly freed in this case. We now force cancellation of the tiling operation
and free the pending tile in the process. This is the same operation that
happens when we destroy a view with a pending tile.
During sheet assignment mode the sheet should never become `NULL`. A couple
asserts are checking for this. During input processing we should always fall
back to the sheet currently selected by the mode, which is never `NULL`.
Backgrounds can now be defined just by specifying the path to the wallpaper
image or by an object specifying the fit as well. This ties `fit` to the
background image in a more specify way and allows for better configuration
processing.
Since layout mode the default bindings for layout cycling have been bound to
`L+n` and `L+p` by default. Cycling through views can be done with `LS+n` and
`LS+p.` This leads to muscle memory issues when going to the "previous" view
because `hikari` interprets the next view as the one going down the stack and
the previous one as going up the stack. This is counterintuitive because going
back to the previous view requires the user to issue `LS+n`. Therefore we just
switch the meaning for next and previous around for everything by layout
cycling.
Also cycling through sheet views only can be very disorienting with borrowed
views on the workspace. Therefore we replace sheet cycling with cycling though
all the views on the workspace.
`execute-mode` was always kind of a crutch that aimed to be a simple program
runner. It's functionality is now merged with mark selection. If a mark gets
selected that is not set to any view `hikari` is going to execute a specified
command. It is left to the user if that application is going to take up that
mark when it started. The user needs to configure an `autoconf` settings for
this.
Mark actions can now also be bound to a keybinding. That way one does not need
to enter `mark-select` or `mark-switch-select` mode and marks can be selected
just by a issuing a keybinding. The actions are called `mark-show-a` to `z` and
`mark-switch-to-a` to `z`.
Some users might want to bind certain layouts to a key binding. This introduces
actions `layout-apply-a` to `layout-apply-z`. Empty layout registers will result
in a no-op.
Migrating views from one output to another during output destroy turns out to be
a lot trickier. The commit logic needs to be adjusted as well to prevent views
from jumping around on show. Also view geometry needs to be reset and therefore
tiles need to be detached from layouts, which leads to layout deallocation when
there are no more views left inside the layout.
Layout bindings are taking up valuable key bindings and since one can have quite
a lot of them it is better to move them into registers just like we are already
doing with execute registers.
Since it's now possible to move views between sheets this adds a mode where one
can manually select the target sheet. On entering the mode a sheet is selected
by pressing the number of the target sheet. Tab is used to cycle between target
workspaces.
Sheet group names now contain their output's name. This means that a user could
potentially create a group for a sheet that does not exist yet and gets created
on a monitor hotplug event, leading to a confusing state. To prevent this we
disallow groups that start with digits.
"actions" and "layouts" are parsed only when they are being bound which leads to
the possibility of having faulty configurations without noticing.
We now parse those two sections entirely during startup. This also leads to a
simpler cleanup routine for configuration finalization.
Splits are also named "horizontal" and "vertical" this is sort of confusing when
there exist layouts also named "vertical" and "horizontal". Therefore we rename
those layouts to "stack" and "queue".
"single" is a fullscreen container that only contains a single view. "empty"
containers contain no views and only take up space. These can be used to model
more complex layouts. All other container types now start with a minimum of 2
views and a maximum of 256.
Naming this property `ratio` does not make a whole lot of sense. Hence we rename
it to `scale` and also make it reflect the scaling of the main side of the split.
This effectively means one should subtract the current value from 1.0 to convert
it to the new scaling value (e.g. 0.25 becomes 0.75).
Key codes still work, but it's now possible to use key symbols as well by
using "+" as separator between modifiers and key. Note that libucl requires
keys containing a "+" to be quoted.
XWayland support has not been maintained for quite a while so we need to make it
work in the new infrastructure. This patch introduces the view method `move_resize`
which allows to move and resize a view atomically, this is needed for properly
handling XWayland views.