mirror of
				https://gitlab.freedesktop.org/wayland/wayland.git
				synced 2025-11-03 09:01:42 -05:00 
			
		
		
		
	
		
			
	
	
		
			171 lines
		
	
	
	
		
			8.4 KiB
		
	
	
	
		
			XML
		
	
	
	
	
	
		
		
			
		
	
	
			171 lines
		
	
	
	
		
			8.4 KiB
		
	
	
	
		
			XML
		
	
	
	
	
	
| 
								 | 
							
								<?xml version='1.0' encoding='utf-8' ?>
							 | 
						||
| 
								 | 
							
								<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
							 | 
						||
| 
								 | 
							
								<!ENTITY % BOOK_ENTITIES SYSTEM "Wayland.ent">
							 | 
						||
| 
								 | 
							
								%BOOK_ENTITIES;
							 | 
						||
| 
								 | 
							
								]>
							 | 
						||
| 
								 | 
							
								<chapter id="chap-X11-Application-Support">
							 | 
						||
| 
								 | 
							
								  <title>X11 Application Support</title>
							 | 
						||
| 
								 | 
							
								  <section id="sect-X11-Application-Support-introduction">
							 | 
						||
| 
								 | 
							
								    <title>Introduction</title>
							 | 
						||
| 
								 | 
							
								    <para>
							 | 
						||
| 
								 | 
							
								      Being able to run existing X11 applications is crucial for the adoption
							 | 
						||
| 
								 | 
							
								      of Wayland, especially on desktops, as there will always be X11
							 | 
						||
| 
								 | 
							
								      applications that have not been or cannot be converted into Wayland
							 | 
						||
| 
								 | 
							
								      applications, and throwing them all away would be prohibitive.
							 | 
						||
| 
								 | 
							
								      Therefore a Wayland compositor often needs to support running X11
							 | 
						||
| 
								 | 
							
								      applications.
							 | 
						||
| 
								 | 
							
								    </para>
							 | 
						||
| 
								 | 
							
								    <para>
							 | 
						||
| 
								 | 
							
								      X11 and Wayland are different enough that there is no "simple" way to
							 | 
						||
| 
								 | 
							
								      translate between them. Most of X11 is uninteresting to a Wayland
							 | 
						||
| 
								 | 
							
								      compositor. That, combined with the gigantic implementation effort needed
							 | 
						||
| 
								 | 
							
								      to support X11, makes it intractable to just write X11 support directly in
							 | 
						||
| 
								 | 
							
								      a Wayland compositor. The implementation would be nothing short of a
							 | 
						||
| 
								 | 
							
								      real X11 server.
							 | 
						||
| 
								 | 
							
								    </para>
							 | 
						||
| 
								 | 
							
								    <para>
							 | 
						||
| 
								 | 
							
								      Therefore, Wayland compositors should use Xwayland, the X11 server that
							 | 
						||
| 
								 | 
							
								      lives in the Xorg server source code repository and shares most of the
							 | 
						||
| 
								 | 
							
								      implementation with the Xorg server. Xwayland is a complete X11 server,
							 | 
						||
| 
								 | 
							
								      just like Xorg is, but instead of driving the displays and opening input
							 | 
						||
| 
								 | 
							
								      devices, it acts as a Wayland client. The rest of this chapter talks
							 | 
						||
| 
								 | 
							
								      about how Xwayland works.
							 | 
						||
| 
								 | 
							
								    </para>
							 | 
						||
| 
								 | 
							
								    <para>
							 | 
						||
| 
								 | 
							
								      For integration and architecture reasons, while Xwayland is a Wayland
							 | 
						||
| 
								 | 
							
								      client of the Wayland compositor, the Wayland compositor is an X11 client
							 | 
						||
| 
								 | 
							
								      of Xwayland. This circular dependency requires special care from the
							 | 
						||
| 
								 | 
							
								      Wayland compositor.
							 | 
						||
| 
								 | 
							
								    </para>
							 | 
						||
| 
								 | 
							
								  </section>
							 | 
						||
| 
								 | 
							
								  <section id="sect-X11-Application-Support-two-modes">
							 | 
						||
| 
								 | 
							
								    <title>Two Modes for Foreign Windows</title>
							 | 
						||
| 
								 | 
							
								    <para>
							 | 
						||
| 
								 | 
							
								      In general, windows from a foreign window system can be presented in one
							 | 
						||
| 
								 | 
							
								      of two ways: rootless and rootful (not rootless).
							 | 
						||
| 
								 | 
							
								    </para>
							 | 
						||
| 
								 | 
							
								    <para>
							 | 
						||
| 
								 | 
							
								      In rootful mode, the foreign window system as a whole is represented as a
							 | 
						||
| 
								 | 
							
								      window (or more) of its own. You have a native window, inside which all
							 | 
						||
| 
								 | 
							
								      the foreign windows are. The advantage of this approach in Xwayland's
							 | 
						||
| 
								 | 
							
								      case is that you can run your favourite X11 window manager to manage your
							 | 
						||
| 
								 | 
							
								      X11 applications. The disadvantage is that the foreign windows do not
							 | 
						||
| 
								 | 
							
								      integrate with the native desktop. Therefore this mode is not usually
							 | 
						||
| 
								 | 
							
								      used.
							 | 
						||
| 
								 | 
							
								    </para>
							 | 
						||
| 
								 | 
							
								    <para>
							 | 
						||
| 
								 | 
							
								      In rootless mode, each foreign window is a first-class resident among the
							 | 
						||
| 
								 | 
							
								      native windows. Foreign windows are not confined inside a native window
							 | 
						||
| 
								 | 
							
								      but act as if they were native windows. The advantage is that one can
							 | 
						||
| 
								 | 
							
								      freely stack and mix native and foreign windows, which is not possible in
							 | 
						||
| 
								 | 
							
								      rootful mode. The disadvantage is that this mode is harder to implement
							 | 
						||
| 
								 | 
							
								      and fundamental differences in window systems may prevent some things
							 | 
						||
| 
								 | 
							
								      from working. With rootless Xwayland, the Wayland compositor must take
							 | 
						||
| 
								 | 
							
								      the role as the X11 window manager, and one cannot use any other X11
							 | 
						||
| 
								 | 
							
								      window manager in its place.
							 | 
						||
| 
								 | 
							
								    </para>
							 | 
						||
| 
								 | 
							
								    <para>
							 | 
						||
| 
								 | 
							
								      This chapter concentrates on the rootless mode, and ignores the rootful
							 | 
						||
| 
								 | 
							
								      mode.
							 | 
						||
| 
								 | 
							
								    </para>
							 | 
						||
| 
								 | 
							
								  </section>
							 | 
						||
| 
								 | 
							
								  <section id="sect-X11-Application-Support-architecture">
							 | 
						||
| 
								 | 
							
								    <title>Architecture</title>
							 | 
						||
| 
								 | 
							
								    <para>
							 | 
						||
| 
								 | 
							
								      A Wayland compositor usually takes care of launching Xwayland.
							 | 
						||
| 
								 | 
							
								      Xwayland works in cooperation with a Wayland compositor as follows:
							 | 
						||
| 
								 | 
							
								    </para>
							 | 
						||
| 
								 | 
							
								    <figure>
							 | 
						||
| 
								 | 
							
								      <title>Xwayland architecture diagram</title>
							 | 
						||
| 
								 | 
							
								      <mediaobjectco>
							 | 
						||
| 
								 | 
							
								        <imageobjectco>
							 | 
						||
| 
								 | 
							
								          <imageobject>
							 | 
						||
| 
								 | 
							
								            <imagedata fileref="images/xwayland-architecture.png" format="PNG" />
							 | 
						||
| 
								 | 
							
								          </imageobject>
							 | 
						||
| 
								 | 
							
								        </imageobjectco>
							 | 
						||
| 
								 | 
							
								      </mediaobjectco>
							 | 
						||
| 
								 | 
							
								    </figure>
							 | 
						||
| 
								 | 
							
								    <para>
							 | 
						||
| 
								 | 
							
								      An X11 application connects to Xwayland just like it would connect to any
							 | 
						||
| 
								 | 
							
								      X server. Xwayland processes all the X11 requests. On the other end,
							 | 
						||
| 
								 | 
							
								      Xwayland is a Wayland client that connects to the Wayland compositor.
							 | 
						||
| 
								 | 
							
								    </para>
							 | 
						||
| 
								 | 
							
								    <para>
							 | 
						||
| 
								 | 
							
								      The X11 window manager (XWM) is an integral part of the Wayland
							 | 
						||
| 
								 | 
							
								      compositor. XWM uses the usual X11 window management protocol to manage
							 | 
						||
| 
								 | 
							
								      all X11 windows in Xwayland. Most importantly, XWM acts as a bridge
							 | 
						||
| 
								 | 
							
								      between Xwayland window state and the Wayland compositor's window manager
							 | 
						||
| 
								 | 
							
								      (WWM). This way WWM can manage all windows, both native Wayland and X11
							 | 
						||
| 
								 | 
							
								      (Xwayland) windows. This is very important for a coherent user
							 | 
						||
| 
								 | 
							
								      experience.
							 | 
						||
| 
								 | 
							
								    </para>
							 | 
						||
| 
								 | 
							
								    <para>
							 | 
						||
| 
								 | 
							
								      Since Xwayland uses Wayland for input and output, it does not have any
							 | 
						||
| 
								 | 
							
								      use for the device drivers that Xorg uses. None of the xf86-video-* or
							 | 
						||
| 
								 | 
							
								      xf86-input-* modules are used. There also is no configuration file for
							 | 
						||
| 
								 | 
							
								      the Xwayland server. For optional hardware accelerated rendering,
							 | 
						||
| 
								 | 
							
								      Xwayland uses GLAMOR.
							 | 
						||
| 
								 | 
							
								    </para>
							 | 
						||
| 
								 | 
							
								    <para>
							 | 
						||
| 
								 | 
							
								      A Wayland compositor usually spawns only one Xwayland instance. This is
							 | 
						||
| 
								 | 
							
								      because many X11 applications assume they can communicate with other X11
							 | 
						||
| 
								 | 
							
								      applications through the X server, and this requires a shared X server
							 | 
						||
| 
								 | 
							
								      instance. This also means that Xwayland does not protect nor isolate X11
							 | 
						||
| 
								 | 
							
								      clients from each other, unless the Wayland compositor specifically
							 | 
						||
| 
								 | 
							
								      chooses to break the X11 client intercommunications by spawning
							 | 
						||
| 
								 | 
							
								      application specific Xwayland instances. X11 clients are naturally
							 | 
						||
| 
								 | 
							
								      isolated from Wayland clients.
							 | 
						||
| 
								 | 
							
								    </para>
							 | 
						||
| 
								 | 
							
								    <para>
							 | 
						||
| 
								 | 
							
								      Xwayland compatibility compared to a native X server will probably never
							 | 
						||
| 
								 | 
							
								      reach 100%. Desktop environment (DE) components, specifically X11 window
							 | 
						||
| 
								 | 
							
								      managers, are practically never supported. An X11 window manager would
							 | 
						||
| 
								 | 
							
								      not know about native Wayland windows, so it could manage only X11
							 | 
						||
| 
								 | 
							
								      windows. On the other hand, there must be an XWM that reserves the
							 | 
						||
| 
								 | 
							
								      exclusive window manager role so that the Wayland compositor could show
							 | 
						||
| 
								 | 
							
								      the X11 windows appropriately. For other DE components, like pagers and
							 | 
						||
| 
								 | 
							
								      panels, adding the necessary interfaces to support them in WWM through XWM
							 | 
						||
| 
								 | 
							
								      is often considered not worthwhile.
							 | 
						||
| 
								 | 
							
								    </para>
							 | 
						||
| 
								 | 
							
								  </section>
							 | 
						||
| 
								 | 
							
								  <section id="sect-X11-Application-Support-xwm">
							 | 
						||
| 
								 | 
							
								    <title>X Window Manager (XWM)</title>
							 | 
						||
| 
								 | 
							
								    <para>
							 | 
						||
| 
								 | 
							
								      From the X11 point of view, the X window manager (XWM) living inside a
							 | 
						||
| 
								 | 
							
								      Wayland compositor is just like any other window manager. The difference
							 | 
						||
| 
								 | 
							
								      is mostly in which process it resides in, and the few extra conventions
							 | 
						||
| 
								 | 
							
								      in the X11 protocol to support Wayland window management (WWM)
							 | 
						||
| 
								 | 
							
								      specifically.
							 | 
						||
| 
								 | 
							
								    </para>
							 | 
						||
| 
								 | 
							
								    <para>
							 | 
						||
| 
								 | 
							
								      There are two separate asynchronous communication channels between
							 | 
						||
| 
								 | 
							
								      Xwayland and a Wayland compositor: one uses the Wayland protocol, and the
							 | 
						||
| 
								 | 
							
								      other one, solely for XWM, uses X11 protocol. This setting demands great
							 | 
						||
| 
								 | 
							
								      care from the XWM implementation to avoid (random) deadlocks with
							 | 
						||
| 
								 | 
							
								      Xwayland. It is often nearly impossible to prove that synchronous or
							 | 
						||
| 
								 | 
							
								      blocking X11 calls from XWM cannot cause a deadlock, and therefore it is
							 | 
						||
| 
								 | 
							
								      strongly recommended to make all X11 communications asynchronous. All
							 | 
						||
| 
								 | 
							
								      Wayland communications are already asynchonous by design.
							 | 
						||
| 
								 | 
							
								    </para>
							 | 
						||
| 
								 | 
							
								    <section id="sect-X11-Application-Support-xwm-window-identification">
							 | 
						||
| 
								 | 
							
								      <title>Window identification</title>
							 | 
						||
| 
								 | 
							
								      <para>
							 | 
						||
| 
								 | 
							
								        In Xwayland, an X11 window may have a corresponding wl_surface object
							 | 
						||
| 
								 | 
							
								        in Wayland. The wl_surface object is used for input and output: it is
							 | 
						||
| 
								 | 
							
								        referenced by input events and used to provide the X11 window content
							 | 
						||
| 
								 | 
							
								        to the Wayland compositor. The X11 window and the wl_surface live in
							 | 
						||
| 
								 | 
							
								        different protocol streams, and they need to be matched for XWM to do
							 | 
						||
| 
								 | 
							
								        its job.
							 | 
						||
| 
								 | 
							
								      </para>
							 | 
						||
| 
								 | 
							
								      <para>
							 | 
						||
| 
								 | 
							
								        When Xwayland creates a wl_surface on Wayland, it will also send an X11
							 | 
						||
| 
								 | 
							
								        ClientMessage of type atom "WL_SURFACE_ID" to the X11 window carrying
							 | 
						||
| 
								 | 
							
								        the wl_surface Wayland object ID as the first 32-bit data element. This
							 | 
						||
| 
								 | 
							
								        is how XWM can associate a wl_surface with an X11 window. Note that
							 | 
						||
| 
								 | 
							
								        the request to create a wl_surface and the ID message may arrive in any
							 | 
						||
| 
								 | 
							
								        order in the Wayland compositor.
							 | 
						||
| 
								 | 
							
								      </para>
							 | 
						||
| 
								 | 
							
								    </section>
							 | 
						||
| 
								 | 
							
								  </section>
							 | 
						||
| 
								 | 
							
								</chapter>
							 |