<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, May 7, 2014 at 9:31 PM, Jason Ekstrand <span dir="ltr"><<a href="mailto:jason@jlekstrand.net" target="_blank">jason@jlekstrand.net</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote"><div class="">On Wed, May 7, 2014 at 9:25 AM, Jasper St. Pierre <span dir="ltr"><<a href="mailto:jstpierre@mecheye.net" target="_blank">jstpierre@mecheye.net</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This allows compositors to easily select a good display to listen on.<br>
---<br>
 src/wayland-server.c | 23 +++++++++++++++++++++++<br>
 src/wayland-server.h |  2 ++<br>
 2 files changed, 25 insertions(+)<br>
<br>
diff --git a/src/wayland-server.c b/src/wayland-server.c<br>
index 6bc8dc3..5624199 100644<br>
--- a/src/wayland-server.c<br>
+++ b/src/wayland-server.c<br>
@@ -1078,6 +1078,29 @@ open_socket_for_display_name(struct wl_socket *s, const char *name)<br>
        return 0;<br>
 }<br>
<br>
+WL_EXPORT char *<br>
+wl_choose_default_display(void)<br></blockquote><div><br></div></div><div>I mentioned this on IRC, but this seems like an awkward name.  Perhaps something like wl_display_choose_default_name?  See also below.<br></div><div class="">
<div> </div>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+{<br>
+       struct wl_socket s = { 0 };<br>
+       int displayno = 0;<br>
+       char display_name[16] = "";<br>
+<br>
+       /* A reasonable number of maximum default sockets. If<br>
+        * you need more than this, set WAYLAND_DISPLAY explicitly. */<br>
+       const int MAX_DISPLAYNO = 32;<br>
+<br>
+       do {<br>
+               snprintf(display_name, sizeof display_name, "wayland-%d", displayno);<br>
+               if (open_socket_for_display_name(&s, display_name) >= 0) {<br>
+                       close(s->fd_lock);<br>
+                       return strdup(display_name);<br></blockquote><div><br></div></div><div>We have a race condition here.  If two compositors start up at the same time, it's possible that wl_choose_default_display will return "wayland-1" but then, before we get a chance to actually re-lock and connect to it, some other compositor opens it.  Honestly, this probably isn't going to be a huge problem in practice.  However, we may want to re-think the API a bit.<br>

<br>One option would be to do the enumeration in wl_display_add_socket if the given name is NULL.  This is a small API break, but all it changes is "if name==NULL and  WAYLAND_DISPLAY is not set and wayland-0 is taken, fail" to "if name==NULL and WAYLAND_DISPLAY is not set and wayland-0 is taken, try wayland-1 etc.".  It slightly changes default behavior, but I don't really see why failing on wayland-0 being taken is a good thing.<br>
</div></div></div></div></blockquote><div><br></div><div>This was my initial approach, but then there's no way for a compositor to know which display name was chosen, so it can set WAYLAND_DISPLAY. We could save the name we used in the wl_display, if you'd prefer that.<br>
</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div></div><div>Thanks,<br></div><div>
--Jason Ekstrand<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="">
+               }<br>
+       } while (displayno++ < MAX_DISPLAYNO);<br>
+<br>
+       errno = EINVAL;<br>
+       return NULL;<br>
+}<br>
+<br>
 WL_EXPORT int<br>
 wl_display_add_socket(struct wl_display *display, const char *name)<br>
 {<br>
diff --git a/src/wayland-server.h b/src/wayland-server.h<br>
index 7fc5b47..c9834f1 100644<br>
--- a/src/wayland-server.h<br>
+++ b/src/wayland-server.h<br>
@@ -88,6 +88,8 @@ struct wl_listener *wl_event_loop_get_destroy_listener(<br>
                                        struct wl_event_loop *loop,<br>
                                        wl_notify_func_t notify);<br>
<br>
+char *wl_choose_default_socket(void);<br>
+<br>
 struct wl_display *wl_display_create(void);<br>
 void wl_display_destroy(struct wl_display *display);<br>
 struct wl_event_loop *wl_display_get_event_loop(struct wl_display *display);<br>
</div><span class="HOEnZb"><font color="#888888"><span><font color="#888888">--<br>
1.9.0<br>
<br>
_______________________________________________<br>
wayland-devel mailing list<br>
<a href="mailto:wayland-devel@lists.freedesktop.org" target="_blank">wayland-devel@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/wayland-devel" target="_blank">http://lists.freedesktop.org/mailman/listinfo/wayland-devel</a><br>
</font></span></font></span></blockquote></div><br></div></div>
</blockquote></div><br><br clear="all"><br>-- <br>  Jasper<br>
</div></div>