[PATCH wayland] RFC: Require WAYLAND_DISPLAY to be set instead of using wayland-0 as the default

Dima Ryazanov dima at gmail.com
Mon May 25 01:12:15 PDT 2015


Although defaulting to wayland-0 seems convenient, it has an undesirable
side effect: clients may unintentionally connect to the wrong compositor.
Generally, it's safer to fail instead. Here's a real example:

In Fedora 22, Gtk+ prefers Wayland over X11, though the default session is still
a normal X11 Gnome session. When you launch a Gtk+ app, it will try Wayland,
fail, then try X11, and succesfully start up. That works fine.

Now suppose you launch Weston while running the Gnome session. Suddenly, all
of the Gtk+ apps launched from Gnome will show up inside Weston instead.
That's unexpected. There's also no good way to prevent that from happening
(other than perhaps setting WAYLAND_DISPLAY to an invalid value when launching
an app).

Not using wayland-0 as the default will solve that problem: an app launched
from the X11 Gnome session will use the X11 backend regardless of whether
there's a wayland compositor running at the same time.

Everything else should work as before. The compositor already sets
the WAYLAND_DISPLAY when starting the session, so the lack of the default value
should not make a difference to the user.

Signed-off-by: Dima Ryazanov <dima at gmail.com>
---
 doc/man/wl_display_connect.xml    |  5 ++---
 doc/publican/sources/Protocol.xml |  8 ++++----
 src/wayland-client.c              | 10 ++++++----
 src/wayland-server.c              |  6 +++---
 4 files changed, 15 insertions(+), 14 deletions(-)

diff --git a/doc/man/wl_display_connect.xml b/doc/man/wl_display_connect.xml
index 7e6e05c..ded3cbd 100644
--- a/doc/man/wl_display_connect.xml
+++ b/doc/man/wl_display_connect.xml
@@ -57,9 +57,8 @@
           that was previously opened by a Wayland server. The server socket must
           be placed in <envar>XDG_RUNTIME_DIR</envar> for this function to
           find it. The <varname>name</varname> argument specifies the name of
-          the socket or <constant>NULL</constant> to use the default (which is
-          <constant>"wayland-0"</constant>). The environment variable
-          <envar>WAYLAND_DISPLAY</envar> replaces the default value. If
+          the socket or <constant>NULL</constant> to use the default
+          (which is the value of <envar>WAYLAND_DISPLAY</envar>). If
           <envar>WAYLAND_SOCKET</envar> is set, this function behaves like
           <function>wl_display_connect_to_fd</function> with the file-descriptor
           number taken from the environment variable.</para>
diff --git a/doc/publican/sources/Protocol.xml b/doc/publican/sources/Protocol.xml
index 477063b..9464953 100644
--- a/doc/publican/sources/Protocol.xml
+++ b/doc/publican/sources/Protocol.xml
@@ -60,10 +60,10 @@
     <title>Wire Format</title>
     <para>
       The protocol is sent over a UNIX domain stream socket, where the endpoint
-      usually is named <systemitem class="service">wayland-0</systemitem>
-      (although it can be changed via <emphasis>WAYLAND_DISPLAY</emphasis>
-      in the environment).  The protocol is message-based.  A
-      message sent by a client to the server is called request.  A message
+      name is determined by the <emphasis>WAYLAND_DISPLAY</emphasis>
+      environment variable.  Its value will usually be
+      <systemitem class="service">wayland-0</systemitem>.  The protocol is message-based.
+      A message sent by a client to the server is called request.  A message
       from the server to a client is called event.  Every message is
       structured as 32-bit words, values are represented in the host's
       byte-order.
diff --git a/src/wayland-client.c b/src/wayland-client.c
index ed108e1..2e612d0 100644
--- a/src/wayland-client.c
+++ b/src/wayland-client.c
@@ -759,8 +759,11 @@ connect_to_socket(const char *name)
 
 	if (name == NULL)
 		name = getenv("WAYLAND_DISPLAY");
-	if (name == NULL)
-		name = "wayland-0";
+	if (name == NULL) {
+		wl_log("error: WAYLAND_DISPLAY not set in the environment.\n");
+		errno = ENOENT;
+		return -1;
+	}
 
 	fd = wl_os_socket_cloexec(PF_LOCAL, SOCK_STREAM, 0);
 	if (fd < 0)
@@ -864,8 +867,7 @@ wl_display_connect_to_fd(int fd)
  * \return A \ref wl_display object or \c NULL on failure
  *
  * Connect to the Wayland display named \c name. If \c name is \c NULL,
- * its value will be replaced with the WAYLAND_DISPLAY environment
- * variable if it is set, otherwise display "wayland-0" will be used.
+ * its value will be replaced with the WAYLAND_DISPLAY environment variable.
  *
  * \memberof wl_display
  */
diff --git a/src/wayland-server.c b/src/wayland-server.c
index ecbae68..acb090f 100644
--- a/src/wayland-server.c
+++ b/src/wayland-server.c
@@ -1205,8 +1205,8 @@ wl_display_add_socket_auto(struct wl_display *display)
  * connect to Wayland display.
  *
  * If NULL is passed as name, then it would look for WAYLAND_DISPLAY env
- * variable for the socket name. If WAYLAND_DISPLAY is not set, then default
- * wayland-0 is used.
+ * variable for the socket name. If WAYLAND_DISPLAY is not set, this function
+ * fails and returns -1.
  *
  * The Unix socket will be created in the directory pointed to by environment
  * variable XDG_RUNTIME_DIR. If XDG_RUNTIME_DIR is not set, then this function
@@ -1231,7 +1231,7 @@ wl_display_add_socket(struct wl_display *display, const char *name)
 	if (name == NULL)
 		name = getenv("WAYLAND_DISPLAY");
 	if (name == NULL)
-		name = "wayland-0";
+		return -1;
 
 	if (wl_socket_init_for_display_name(s, name) < 0) {
 		wl_socket_destroy(s);
-- 
2.4.1



More information about the wayland-devel mailing list