summaryrefslogtreecommitdiff
path: root/firefox-wayland-crash-mozbz1507475.patch
blob: bab96bcf89ec62a30252d02a59397710f9f96445 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
diff -up firefox-63.0.3/widget/gtk/mozcontainer.cpp.mozbz1507475 firefox-63.0.3/widget/gtk/mozcontainer.cpp
--- firefox-63.0.3/widget/gtk/mozcontainer.cpp.mozbz1507475	2018-11-15 01:20:56.000000000 +0100
+++ firefox-63.0.3/widget/gtk/mozcontainer.cpp	2018-11-21 15:41:41.858692640 +0100
@@ -169,6 +169,8 @@ moz_container_class_init (MozContainerCl
 }
 
 #if defined(MOZ_WAYLAND)
+static struct wl_subcompositor *subcompositor;
+
 static void
 registry_handle_global (void *data,
                         struct wl_registry *registry,
@@ -176,9 +178,8 @@ registry_handle_global (void *data,
                         const char *interface,
                         uint32_t version)
 {
-    MozContainer *container = MOZ_CONTAINER(data);
     if(strcmp(interface, "wl_subcompositor") == 0) {
-        container->subcompositor =
+        subcompositor =
             static_cast<wl_subcompositor*>(wl_registry_bind(registry,
                                            name,
                                            &wl_subcompositor_interface,
@@ -197,6 +198,24 @@ static const struct wl_registry_listener
     registry_handle_global,
     registry_handle_global_remove
 };
+
+struct wl_subcompositor* subcompositor_get(void)
+{
+    if (!subcompositor) {
+        GdkDisplay *gdk_display = gdk_display_get_default();
+        // Available as of GTK 3.8+
+        static auto sGdkWaylandDisplayGetWlDisplay =
+            (wl_display *(*)(GdkDisplay *))
+            dlsym(RTLD_DEFAULT, "gdk_wayland_display_get_wl_display");
+
+        wl_display* display = sGdkWaylandDisplayGetWlDisplay(gdk_display);
+        wl_registry* registry = wl_display_get_registry(display);
+        wl_registry_add_listener(registry, &registry_listener, nullptr);
+        wl_display_dispatch(display);
+        wl_display_roundtrip(display);
+    }
+    return subcompositor;
+}
 #endif
 
 void
@@ -208,25 +227,10 @@ moz_container_init (MozContainer *contai
 
 #if defined(MOZ_WAYLAND)
     {
-      container->subcompositor = nullptr;
       container->surface = nullptr;
       container->subsurface = nullptr;
       container->eglwindow = nullptr;
       container->parent_surface_committed = false;
-
-      GdkDisplay *gdk_display = gtk_widget_get_display(GTK_WIDGET(container));
-      if (GDK_IS_WAYLAND_DISPLAY (gdk_display)) {
-          // Available as of GTK 3.8+
-          static auto sGdkWaylandDisplayGetWlDisplay =
-              (wl_display *(*)(GdkDisplay *))
-              dlsym(RTLD_DEFAULT, "gdk_wayland_display_get_wl_display");
-
-          wl_display* display = sGdkWaylandDisplayGetWlDisplay(gdk_display);
-          wl_registry* registry = wl_display_get_registry(display);
-          wl_registry_add_listener(registry, &registry_listener, container);
-          wl_display_dispatch(display);
-          wl_display_roundtrip(display);
-        }
     }
 #endif
 }
@@ -298,7 +302,7 @@ moz_container_map_surface(MozContainer *
         }
 
         container->subsurface =
-          wl_subcompositor_get_subsurface (container->subcompositor,
+          wl_subcompositor_get_subsurface (subcompositor_get(),
                                            container->surface,
                                            gtk_surface);
         gint x, y;
diff -up firefox-63.0.3/widget/gtk/mozcontainer.h.mozbz1507475 firefox-63.0.3/widget/gtk/mozcontainer.h
--- firefox-63.0.3/widget/gtk/mozcontainer.h.mozbz1507475	2018-11-15 01:20:56.000000000 +0100
+++ firefox-63.0.3/widget/gtk/mozcontainer.h	2018-11-21 14:16:54.412397805 +0100
@@ -69,7 +69,6 @@ struct _MozContainer
     GList         *children;
 
 #ifdef MOZ_WAYLAND
-    struct wl_subcompositor *subcompositor;
     struct wl_surface       *surface;
     struct wl_subsurface    *subsurface;
     struct wl_egl_window    *eglwindow;
bgstack15