Commit Graph

1272 Commits

Author SHA1 Message Date
Uli Schlachter df01587459 Become the X11 window manager after Xwayland startup
This commits adds the necessary magic incantations to become the X11 WM
after Xwayland starts.

This uses the pure-Rust implementation from x11rb, but any other X11
crate could be used as well.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2021-02-19 11:38:17 +01:00
Uli Schlachter 2f0dadd6ca anvil: Add a xwayland feature
This commit adds an xwayland feature to anvil. Right now, this feature
doesn't do much. anvil uses the smithay code to start XWayland, but does
not do anything with it once it is running.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2021-02-19 11:38:17 +01:00
Gary Guo 4a065818c4 Document shell approach for Xwayland launching 2021-02-14 21:15:49 +01:00
Gary Guo 4d25153397 Use sh to handle SIGUSR1 and replace fork+exec with spawn 2021-02-14 21:15:49 +01:00
Uli Schlachter a7f18e5deb winit: Allow moving the cursor
It is not necessary to set the cursor position on winit since the
windowing system already updates the position on its own. Instead, doing
this makes the cursor (almost) stuck and unmovable. Thus, this commit
just removes that code from the winit backend.

Fixes: https://github.com/Smithay/smithay/issues/241
Signed-off-by: Uli Schlachter <psychon@znc.in>
2021-02-14 21:08:40 +01:00
Uli Schlachter 4d012e17a0
XWayland: Use a fork helper process to launch Xwayland (#250)
* xwayland: Add LaunchHelper

Calling fork() in a multi-threaded process is a bad idea. I am getting
crashes at exit() and "man fork" says that only async-signal-safe
functions can be called after forking in a multi-threaded process.
exit() is not async-signal safe. Thus, forking needs to happen before
any threads are created.

This commit adds a LaunchHelper to the public API. This is a handle to a
forked child process. So far this does not do much, but the intention is
to use this later instead of fork()ing directly.

Signed-off-by: Uli Schlachter <psychon@znc.in>

* xwayland: Move the fork dance to LaunchHelper

No functional changes intended. This only moves the code over and does
not actually use the LaunchHelper for anything.

Signed-off-by: Uli Schlachter <psychon@znc.in>

* Move checking the launch status to LaunchHelper

This should again have no functional changes, but the error log output
might change slightly, since an IOError instead of a NixError is
returned.

Signed-off-by: Uli Schlachter <psychon@znc.in>

* xwayland: Set $DISPLAY earlier

This way, the WM already gets the correct value of $DISPLAY.

Signed-off-by: Uli Schlachter <psychon@znc.in>

* xwayland: Use the launch helper process

FD passing is now used to give the display number and the sockets to the
launch helper process. That process then forks of the actual process
that spawns Xwayland. Once Xwayland started, this is reported back with
another write on the pipe.

Signed-off-by: Uli Schlachter <psychon@znc.in>

* Add to the comment explaining Xwayland startup

Signed-off-by: Uli Schlachter <psychon@znc.in>

* Please rustfmt

Signed-off-by: Uli Schlachter <psychon@znc.in>

* Make clippy happy

Signed-off-by: Uli Schlachter <psychon@znc.in>
2020-12-29 15:41:29 +01:00
Uli Schlachter 1a2b170606 Make clippy happy
This fixes the following clippy warnings:

error: usage of `Rc<T>` when T is a buffer type
   --> src/wayland/dmabuf/mod.rs:265:14
    |
265 |     formats: Rc<Vec<Format>>,
    |              ^^^^^^^^^^^^^^^ help: try: `Rc<[Format]>`
    |
    = note: `-D clippy::rc-buffer` implied by `-D warnings`
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#rc_buffer

error: usage of `Rc<T>` when T is a buffer type
  --> src/wayland/shm/mod.rs:91:14
   |
91 |     formats: Rc<Vec<wl_shm::Format>>,
   |              ^^^^^^^^^^^^^^^^^^^^^^^ help: try: `Rc<[wl_shm::Format]>`
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#rc_buffer

Signed-off-by: Uli Schlachter <psychon@znc.in>
2020-12-29 14:43:56 +01:00
Uli Schlachter 06c44ede55 xwayland: Unlink X11 socket before binding to it
When starting xwayland with smithay, the first time I would get the
following output (do not ask what happens with displays 0, 1, 2. That's
not important right now):

Dec 29 14:13:31.031 DEBG Attempting to aquire an X11 display lock, D: 3, smithay_module: XWayland
Dec 29 14:13:31.032 DEBG X11 lock aquired, D: 3, smithay_module: XWayland
Dec 29 14:13:31.032 INFO Initialization completed, starting the main loop.

When killing the process with ctrl-c and starting it again, this
happened:

Dec 29 14:13:29.138 DEBG Attempting to aquire an X11 display lock, D: 3, smithay_module: XWayland
Dec 29 14:13:29.138 DEBG Failed to acquire lock, D: 3, smithay_module: XWayland
Dec 29 14:13:29.138 DEBG Lock was blocked by a defunct X11 server, trying again, D: 3, smithay_module: XWayland
Dec 29 14:13:29.139 DEBG Attempting to aquire an X11 display lock, D: 3, smithay_module: XWayland
Dec 29 14:13:29.139 DEBG X11 lock aquired, D: 3, smithay_module: XWayland
Dec 29 14:13:29.139 INFO Cleaning up X11 lock., smithay_module: XWayland
Dec 29 14:13:29.139 DEBG Attempting to aquire an X11 display lock, D: 4, smithay_module: XWayland
Dec 29 14:13:29.139 DEBG X11 lock aquired, D: 4, smithay_module: XWayland
Dec 29 14:13:29.139 INFO Initialization completed, starting the main loop.

The reason for the above behaviour is the
smithay::xwayland::x11_sockets::open_x11_sockets_for_display() failed.
The code successfully acquired the lock file, but then could not bind
the sockets. More specifically, the concrete socket in /tmp/.X11-unix/
already existed and thus bind() failed with EADDRINUSE.

(The code in X11Lock::grab() would then drop the already acquired
X11Lock and its Drop impl deleted the socket. Thus, when I started
things again, this time it successfully acquired display 3.)

Fix this removing the socket before trying to bind it.

This is also done by wlroots: In xwayland/sockets.x, the function
open_socket() has the same job as smithay's open_socket() function.
However, for non-abstract sockets, it would first unlink the target
before trying to bind:

        if (addr->sun_path[0]) {
                unlink(addr->sun_path);
        }

Signed-off-by: Uli Schlachter <psychon@znc.in>
2020-12-29 14:42:42 +01:00
Uli Schlachter 0f2faf6e91 Fix a typo in a log message
Signed-off-by: Uli Schlachter <psychon@znc.in>
2020-12-29 14:42:19 +01:00
Uli Schlachter 95fbce096c Fix clippy::unnecessary-lazy-evaluations warnings
Signed-off-by: Uli Schlachter <psychon@znc.in>
2020-12-27 12:32:48 +01:00
Uli Schlachter 9e14e43bd8 Fix writing /tmp/.X{}.lock
Here is a lock file not created by smithay:

$ xxd /tmp/.X0-lock
00000000: 2020 2020 2020 2035 3537 0a                     557.

And this is a lock file created by smithay:

$ xxd /tmp/.X23-lock
00000000: 2020 2020 3130 3733 3332                     107332

As you see, the difference is a trailing newline (0x0a).

Lock files 1 to 22 where also created by smithay, because I started it a
couple of times. Reading these lock files fails, since the code expects
a file with at least 11 bytes of content: It uses read_exact() with a
buffer of length 11 in the Err()-branch of the match that this commit
modifies.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2020-12-26 14:21:29 +01:00
Uli Schlachter e427787353 xwayland: Use pipe instead of signal
Handling SIGUSR1 requires setting a signal handler, which is a global
resource. This can also cause problems in the presence of threads, since
every thread needs to set up a signal handler. This commit instead
changes the code to use a pipe instead (actually a UnixStream). When the
child closes the pipe, the parent wakes up and knows "to do something".

Fixes: https://github.com/Smithay/smithay/issues/246
Signed-off-by: Uli Schlachter <psychon@znc.in>
2020-12-25 22:29:39 +01:00
Victor Berger 36e11284c2 New clippy fixes 2020-11-02 10:24:55 +01:00
Victor Berger 8fde779806 Dependencies updates 2020-11-02 10:24:55 +01:00
Eric Anholt 78d28165c3
Update nix to 0.19 (#237) 2020-10-31 18:33:18 +01:00
Victor Berger d3429fa37d anvil: send frame callback before blocking to draw on winit 2020-10-26 12:52:28 +01:00
Victor Berger 5421b9675c anvil: send millisecond time in frame callback
This is what the protocol requires, and apps rely on it to figure
out how long time elapsed between draws.
2020-10-26 12:52:28 +01:00
Arnout Engelen 04625405a0 typo: functionnalities -> functionalities 2020-09-24 13:30:42 +02:00
Jonas Platte bcc8f13b2b Fix most rustc & clippy warnings 2020-09-16 12:56:32 +02:00
Jonas Platte c4f64489e8 Update wayland-rs to 0.28 2020-09-16 12:56:32 +02:00
Mateus Carmo M de F Barbosa d5931c5957 Add unit tests for SerialCounter 2020-08-27 13:07:01 +02:00
Mateus Carmo M de F Barbosa 2a351d0879 Use Serial type for all serials 2020-08-27 13:07:01 +02:00
Mateus Carmo M de F Barbosa 0a0399a339 Implement Serial type to take wrap-around into account 2020-08-27 13:07:01 +02:00
Victor Berger 737b1f00cf Dependecies update 2020-08-07 11:59:36 +02:00
Victor Berger 467972700e ci: document public dependencies as well 2020-07-16 13:28:07 +02:00
Victor Berger 2e3a520400 ci: run apt-get update in doc-generation 2020-07-14 20:54:57 +02:00
Victor Berger 77cc680f65 ci: use nightly to build doc for doclinks 2020-07-14 20:29:49 +02:00
Victor Berger 49dda88c63 backend.input: keep sub-pixel precision in events
libinput provides sub-pixel precision for pointer motion & touch events.
Keep this precision by switching all coordinates values from input
events to f64 (rather than i32 or u32). Otherwise, values are rounded
and part of the movment is lost.

Potentially fixes #224
2020-07-13 17:56:20 +02:00
Victor Berger 25365ed69a tempfile is only needed with wayland_frontend feature 2020-07-12 16:38:05 +02:00
Victor Berger b06aecf868 Disable image default features 2020-07-12 16:38:05 +02:00
Victor Berger 1871b5ddae Make slog-stdlog into an optional dependency
slog-stdlog has a significant dependency tree and is basically unsued if
the downstream crate of Smithay always provides a logger (like anvil),
so it is not really needed.
2020-07-12 16:38:05 +02:00
Victor Brekenfeld b75d6524ce
Merge pull request #221 from Smithay/anvil/outputs
anvil: support multiple outputs
2020-06-28 15:16:15 +02:00
Victor Brekenfeld 9c3c3d939e cargo fmt & lint 2020-06-28 00:25:15 +02:00
Victor Brekenfeld 3fd336aba5 anvil: GliumDrawer handle hardware cursors and track state 2020-06-28 00:23:24 +02:00
Victor Brekenfeld a1f14cb571 reexports: reexport winit 2020-06-28 00:23:24 +02:00
Victor Brekenfeld 107b18a4c1 logind: do not include dbus code without dbus dependency 2020-06-28 00:23:24 +02:00
Victor Brekenfeld 51b5b39b75 cursor: allow cursor clearing on CursorBackend 2020-06-28 00:23:24 +02:00
Victor Brekenfeld bf011e8071 anvil: Introduce BufferTextures 2020-06-28 00:23:24 +02:00
Victor Brekenfeld d603a9ccfb egl: Do not store and release WlBuffer for EGLImages 2020-06-28 00:23:24 +02:00
Victor Brekenfeld 4930e7e8b2 anvil: create a texture per backend 2020-06-28 00:23:24 +02:00
Victor Brekenfeld f84d6cb180 anvil/udev: do not upload a cursor every frame 2020-06-28 00:23:24 +02:00
Victor Brekenfeld 7e75a68e57 anvil: allow swapping monitors via shortcut 2020-06-28 00:23:24 +02:00
Victor Brekenfeld 33fb393383 anvil: clamp input to current output instead of full hd 2020-06-28 00:23:22 +02:00
Victor Brekenfeld d7f800c76d anvil: create and render to multiple outputs independently 2020-06-28 00:05:01 +02:00
Victor Brekenfeld 9fd8dd9cec anvil: allow draw_windows to take optional output coordinates 2020-06-28 00:05:01 +02:00
Hilmar Gústafsson e402af4855 Update dbus to 0.8.3
Older versions of dbus fail to compile due to API differences
2020-06-24 09:19:09 +02:00
Kirill Chibisov 102f41c1e1 wayland.seat: Send modifiers event right after enter event
wl_keyboard.modifiers must be sent after wl_keyboard.enter event,
otherwise it's a protocol violation.
2020-06-14 18:38:08 +02:00
Victor Brekenfeld 44570700fb
Merge pull request #220 from Smithay/feature/drm_send
drm: Make surfaces `Send`
2020-06-13 17:54:15 +02:00
Victor Brekenfeld 7b4459f649 drm: Make surfaces `Send` 2020-06-11 18:57:05 +02:00
Victor Brekenfeld 68f3c0642d
Merge pull request #219 from Smithay/docs/drm
More documentation for the drm code
2020-06-11 12:26:38 +02:00