<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, May 14, 2015 at 12:57 AM, Marek Chalupa <span dir="ltr"><<a href="mailto:mchqwerty@gmail.com" target="_blank">mchqwerty@gmail.com</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"><div><div><div class="gmail_extra"><div class="gmail_quote"><span class="">On Tue, May 12, 2015 at 7:21 PM, Dima Ryazanov <span dir="ltr"><<a href="mailto:dima@gmail.com" target="_blank">dima@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">The logic is pretty much copied from weston's clients/window.c.<br>
<br>
Signed-off-by: Dima Ryazanov <<a href="mailto:dima@gmail.com" target="_blank">dima@gmail.com</a>><br>
---<br>
 hw/xwayland/xwayland.c | 25 ++++++++++++++++++++++++-<br>
 hw/xwayland/xwayland.h |  8 ++++++++<br>
 2 files changed, 32 insertions(+), 1 deletion(-)<br>
<br>
diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c<br>
index 7e8d667..e99fbac 100644<br>
--- a/hw/xwayland/xwayland.c<br>
+++ b/hw/xwayland/xwayland.c<br>
@@ -383,6 +383,17 @@ registry_global(void *data, struct wl_registry *registry, uint32_t id,<br>
                 const char *interface, uint32_t version)<br>
 {<br>
     struct xwl_screen *xwl_screen = data;<br>
+    struct xwl_global *xwl_global;<br>
+<br>
+    xwl_global = calloc(sizeof *xwl_global, 1);<br>
+    if (xwl_global == NULL) {<br>
+        ErrorF("registry_global ENOMEM\n");<br>
+        return;<br>
+    }<br>
+    xwl_global->name = id;<br>
+    xwl_global->interface = strdup(interface);<br></blockquote><div> </div></span>You should probably check if the strdup succeeds here. In the following patch you do<br>  if (strcmp(xwl_global->interface, "wl_output") == 0)<br></div><div class="gmail_quote">and if the strdup returns NULL, then this contition will be false even thoug it should be true.</div></div></div></div></div></blockquote><div> </div><div>Oh, good catch.</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><div><div class="gmail_extra"><div class="gmail_quote"></div><div class="gmail_quote"><span class=""><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+    xwl_global->version = version;<br>
+    xorg_list_add(&xwl_global->link, &xwl_screen->global_list);<br>
<br>
     if (strcmp(interface, "wl_compositor") == 0) {<br>
         xwl_screen->compositor =<br>
@@ -410,7 +421,18 @@ registry_global(void *data, struct wl_registry *registry, uint32_t id,<br>
 static void<br>
 global_remove(void *data, struct wl_registry *registry, uint32_t name)<br>
 {<br>
-    /* Nothing to do here, wl_compositor and wl_shm should not be removed */<br>
+    struct xwl_screen *xwl_screen = data;<br>
+    struct xwl_global *xwl_global, *next_xwl_global;<br>
+<br>
+    xorg_list_for_each_entry_safe(xwl_global, next_xwl_global,<br>
+                                  &xwl_screen->global_list, link) {<br>
+        if (xwl_global->name != name)<br>
+            continue;<br>
+<br>
+        xorg_list_del(&xwl_global->link);<br>
+        free(xwl_global->interface);<br>
+        free(xwl_global);<br></blockquote><div><br></div></span><div>Here a break would be handy, so that we won't iterate over the rest of globals after we found the one we need.<br></div></div></div></div></div></div></blockquote><div><br></div><div>Sure.</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><div><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div class="h5">+    }<br>
 }<br>
<br>
 static const struct wl_registry_listener registry_listener = {<br>
@@ -562,6 +584,7 @@ xwl_screen_init(ScreenPtr pScreen, int argc, char **argv)<br>
             listen_on_fds(xwl_screen);<br>
     }<br>
<br>
+    xorg_list_init(&xwl_screen->global_list);<br>
     xorg_list_init(&xwl_screen->output_list);<br>
     xorg_list_init(&xwl_screen->seat_list);<br>
     xorg_list_init(&xwl_screen->damage_window_list);<br>
diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h<br>
index cfb343d..2ba5312 100644<br>
--- a/hw/xwayland/xwayland.h<br>
+++ b/hw/xwayland/xwayland.h<br>
@@ -64,6 +64,7 @@ struct xwl_screen {<br>
     UnrealizeWindowProcPtr UnrealizeWindow;<br>
     XYToWindowProcPtr XYToWindow;<br>
<br>
+    struct xorg_list global_list;<br>
     struct xorg_list output_list;<br>
     struct xorg_list seat_list;<br>
     struct xorg_list damage_window_list;<br>
@@ -95,6 +96,13 @@ struct xwl_screen {<br>
     struct glamor_context *glamor_ctx;<br>
 };<br>
<br>
+struct xwl_global {<br>
+    uint32_t name;<br>
+    char *interface;<br>
+    uint32_t version;<br>
+    struct xorg_list link;<br>
+};<br>
+<br>
 struct xwl_window {<br>
     struct xwl_screen *xwl_screen;<br>
     struct wl_surface *surface;<br>
</div></div><span><font color="#888888">--<br>
2.4.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></blockquote><div><br></div><div>Isn't storing all globals redundant for this purpose? Couldn't we add the name (id) into struct xwl_output and then<br></div><div>iterate just over the output_list?<br></div></div></div></div></div></div></blockquote><div><br></div><div>Correct - if we only care about xwl_output, then the globals list is unnecessary. I only did it that way because that's how weston does it, and it feels more generic - it makes it easy to handle different types of globals in the future. That said, it offers no performance advantages since it's just iterating over the whole list. A hash table would make more sense.</div><div><br></div><div>Anyways, I'll remove it for now.</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><div><div class="gmail_extra"><div class="gmail_quote"><div><br></div><div>Thanks,<br></div><div>Marek<br></div></div><br></div></div></div></div>
</blockquote></div><br></div></div>