Sharing X Applications With XMX

A Quick Tutorial

John Bazik
jsb@cs.brown.edu

The Virtual Root Window

X client applications draw on a root window, which is just the background upon which all other windows appear. XMX creates a virtual root window, which is a root-window-in-a-window. The virtual root window encapsulates an entire X session.

xmx screenshot

Run xmx

	% xmx
Assuming you are in an X session and your DISPLAY environment variable is set correctly, you should see a virtual root window appear that is a third the size of your screen and has the familiar "root weave" pattern on the background. There are no X client applications running in the session, so there is nothing you can do. Kill it and try this
	% xmxinit
Again, you should see the root weave virtual root window, but this time you will see a lone xterm in the upper left corner. Experienced X users will recognize that this is exactly what xinit does when a user lacks a .xinitrc file. xinit is used to start an X session. xmxinit is used to start an XMX session. A .xinitrc file is a per-user shell script that runs all the X client applications the user wants to see when starting an X session. Similarly, a .xmxinitrc file runs all the X client applications a user wants to see when starting up an XMX session.

The virtual X session is completely separate and self-contained. From the xterm in the virtual root window, run a window manager. Try running some of your favorite applications. Create a .xmxinitrc file. Use your .xinitrc file as a model, but avoid doing things that don't make sense in a nested X session, like running xmodmap or redirecting console output (by running xconsole or xterm -C). To exit the XMX session, type "exit" in the xterm. Rerun xmxinit to try out your new session.

Multiple Displays

A nested X server is a neat trick, but XMX is really about application sharing. Create a shared X session
% xmxinit -- -floor $DISPLAY
Two identical virtual root windows appear on your screen. Notice that as your pointer tracks through one, a telepointer echos the movement in the other. Anything you do in one appears in both. XMX provides a WYSIWIS (What You See Is What I See) shared environment.

Log onto a different host and start an X session (or ask a friend who is logged in to help). On the remote host, issue an xhost command

	remote% xhost +myhost
Now, on myhost, run a shared session
	myhost% xmxinit -- -floor remote:0
Again, two virtual root windows appear, but this time there is one on each of the two machines involved. Both users have control over the virtual X session.

Controlling It

xmtg screenshot From within a shared X session, run
% xmtg
xmtg is an XMC (X Multiplexor Control) client application. It allows you to control XMX. The people icons represent participants in the session. Here you see two virtual root windows on a machine named "no" (xmtg added -a to disambiguate the second one).

Select an icon and click on the Drop button. The virtual root window disappears. Click on Add and enter the display string for the just-dropped display, and it reappears. Try adding a new display. Try clicking on Telepointer. Telepointers are optional. The buttons named Floor, Seat and View allow you to control which displays may provide keyboard and mouse input to shared applications.

Floor, Seat, View

Xmx provides three input modes for participants. These input modes dictate what happens when a user types or moves the mouse in a virtual root window. They are named for the roles one might have at a relatively formal meeting. The only mode we have encountered so far is Floor. When you have the Floor, your keyboard and mouse inputs control the shared applications in the virtual X session. Having the floor is like running a meeting, you're in control and everyone is watching what you do.

View mode is the exact opposite of floor mode. When a display is in view mode, the user may only watch passively what goes on in the session. All mouse and keyboard input is ignored. Think of view mode as being in the spectator's gallery.

Seat mode is inbetween floor and view modes. When a display is in seat mode, the user's mouse and keyboard input is ignored by the X clients in the shared session, just like in view mode. But an XMC client, like xmtg, can choose to see input events from displays in seat mode. Think of seat mode as being a member of some organization that is having a meeting - it gives you the right to be recognized and participate, though you are not running things at the moment.

Try running a session with multiple displays (even if they are all on one machine). Try changing the input modes of the virtual root windows. First select an icon in xmtg, then click on either the Floor, Seat or View button to change it's mode. The icon changes to reflect the input mode: displays in floor mode have a gavel and a hat, displays in seat mode have only a hat, displays in view mode are bareheaded. Xmtg insists that you have at least one display in floor mode - otherwise you can do nothing!

When you have a display (a virtual root window) in seat mode, try clicking on the xmtg window there. Xmtg will see the mouse click and raise the hand of the corresponding seat-mode icon. All the other X clients ignore your inputs. In this way, an XMC client can coordinate giving the floor to, or sharing the floor among participants in the shared session.

DISPLAY Magic

X clients need to know what X server to talk to. They determine this from either the -display option provided on the command line, or from the DISPLAY environment variable. The display string has several components.

display string components

All running X servers can be located by a display string. So, too, can a running XMX. By convention, X servers usually default to display zero, as shown above. If there is more than one X server on a particular machine, it must have a different display number, so XMX, when it is actiing like an X server, defaults to display number one to avoid conflicting with the local X server.

Note that X clients use a display string to find XMX, but XMX also uses display strings to find the X servers to which it connects.

	% xmx -display :0 &
	% xterm -display :1
In this example, XMX connects to the X server that is running on the local host at display number zero (since no screen number is given, it is assumed to be zero). Then an xterm connects to XMX, thinking it is an X server, and is displayed within XMX's virtual root window. These two commands are exactly what xmxinit did when it found no .xmxinitrc file.

How Does XMX Work?

X applications or clients, like xterm, do not draw on your screen or watch your keyboard and mouse. They talk to an X server which does that for them. X clients talk to an X server over a data pipeline called a socket. A single X server does all the drawing for all the applications displayed on your machine, and it watches your keyboard and mouse for all the events that any of those applications are interested in.

x diagram

An X client does not need to be running on the same machine as the X server to which it is talking. You can run X clients on faraway machines, and display them on your desktop, and vice versa. And though few clients do, an X client can connect to, and draw on, and receive events from, as many displays as it likes. These are all features of X. X is a network-transparent windowing sytem.

XMX is an X client. But instead of connecting to only one X server, it connects to many X servers, drawing exactly the same thing on each of them. XMX also pretends to be an X server, so that other X clients can talk to it. In this way, it allows many people to share the same client applications, without those clients knowing that there are many people.

xmx diagram

Because XMX is interposed between X clients and X servers, it cannot jump into an existing client-server session and begin sharing it. XMX can only share X sessions it was involved in from the start.

When sharing an X session like this, it is helpful to have participants (X servers) join and leave the session and to control which participant(s) can interact with the X clients while the others watch. This control is provided by a separate XMC (X Multiplexor Control) connection.

xmc diagram

Because the XMC connection is completely separate from the X connection, an XMC client does not have to be displayed in the shared session. It can be displayed in a different, non-shared X session, or it can have no graphical user interface at all. In fact, there is a unix command-line XMC application called xmc, which is included in the xmx distribution.

Like the X Window System itself, XMX does not set any policy. The way a shared session works, the way that input modes are assigned, and users join or leave, is entirely up to the XMC clients that control it. Xmtg is merely a sample.


This document: http://www.cs.brown.edu/software/xmx/tutorial/
PDF version: http://www.cs.brown.edu/software/xmx/tutorial.pdf
October 7, 1999
John Bazik