Finding the output with the largest scale now checks fractional scaling.
While this is only a minor difference in most cases, it makes the scale
deterministic instead of depending on the order outputs are added.
Rename get_window to window_from_surface and return a
GHOST_WindowWayland instead of an GHOST_IWindow since most callers
needed to cast. It also makes sense that an call for accessing windows
would return the native type.
- Initialize values in the struct declarations
(help avoid accidental uninitialized struct members).
- Use `wl_` prefix for some types to avoid e.g. `output->output`.
- Use `_fn` suffix for locally defined function variables.
- Use `_handle_` as separator for handlers, making function names easier
to follow as this separates the handler name from the interface.
- Add doxy sections for listeners in GHOST_WaylandWindow.cpp.
GHOST_GetDPIHint now returns a value that takes fractional scaling into
account. Otherwise the integer scale is used since Wayland's API's use
integer scale values exclusively.
Use the same method as SDL to calculate the fractional scale.
- Apply the scale before converting cursor coordinates to int.
- Store sub-pixel cursor coordinates internally since
this is what Wayland uses.
- Use `wl_fixed_t xy[2]` for storing coordinates as it simplifies
assigning/passing x/y coordinates to an argument / variable.
- Also fix drag-and-drop coordinates which ignored scale.
Add support for tablet pressure, tilt and type detection
(eraser, pen.. etc).
There is currently an inconsistency where the tablets cursor is scaled
larger than the mouse cursor (when the UI is scaled). Although there
doesn't seem to be a way to control this from the client.
Only the Shift key was working with GHOST's getModifierKeys method.
Now all modifiers are accessible, since there is no way of detecting
left/right modifiers both are set.
Address two glitches on window creation:
- The DPI was zero until the `surface_enter` callback ran which happens
after redrawing, causing the splash to display with incorrect scale
before refreshing once the callback had run.
- The window scale was always 1, even when all outputs were HI-DPI.
Now the maximum scale of all outputs is used. This isn't fool proof in
the case of multiple monitors having different scales, however it
doesn't seem possible to detect the scale used ahead of time
(details in code-comment).
- Use a window method to handle updating the window after scale changes.
This avoids the need for methods that return mutable references to
DPI & scale.
- Remove window.outputs() method that returned window->system->outputs
as it is misleading to expose these as window outputs when the outpurs
returned are all known outputs.
- Use a vector instead of an unordered_set to store window outputs,
while a 'set' does make sense, it means the outputs can't be accessed
in the order they're added which may be useful for further changes.
- Use early returns.
There were two problems dropping files into blender:
- The inputs `focus_pointer` was NULL, causing a crash.
- The wl_data_device_manager version was set to 1, causing the Blender
window to close (when dropping files in gnome-shell 42).
Resolve by storing the drop surface separately from the pointer surface
and bump the device manager version to 3.
Many errors involving mis-use or unexpected situations report an
error and close Blender's window buy don't crash, making it difficult
to track down when the error occurs.
Define an error handler prints the error and a back-trace,
it can also be useful for setting a break-point
The software cursor was being enabled with absolute events,
causing a problem with absolute tablet events.
This caused both cursors to be visible at once when using a tablet
(with D15152 applied).
As Wayland doesn't support moving the cursor, draw a cross-hair cursor
at the location used by Blender.
Without this, the cursor was locked at the location where grab started,
making some actions unusable since the cursor location was invisible.
Resolves T77311.
Grab which didn't wrap would lock the cursor, making actions such
as resizing areas lock the cursor in-place.
Confine the cursor to the window instead.
This behavior was also used for X11 when grabbing the cursor was first
supported but could lock the system if Blender froze while grabbing so
it was disabled [0].
For Wayland this shouldn't be a problem as compositors implement grab
in a way that prevents the client from locking the system.
[0]: 3e3d2b7a4c
Shifted flag for buttons changed was incorrectly compared with
unshifted packet flag to determine button press state.
Also fix button tracking storage; button flags are 32 bits whereas the
member variable was 8.
Differential Revision: https://developer.blender.org/D14915
Since [0], using the view navigation gizmo crashed with Wayland.
This only worked previously because GHOST_kGrabWrap was ignored.
Now the previous grab state is disabled before switching to a new
grab state.
[0]: da9e14b0b9
Dragging number buttons wasn't grabbing the cursor and would stop
when the pointer reached the screen edge & wasn't setting the cursor
visible on completion.