Commit 22e4949a authored by stransky's avatar stransky
Browse files

Bug 1917794 [Wayland] Store gesture nsWindow instead of wl_surface r=emilio

parent a51da3a8
Loading
Loading
Loading
Loading
+12 −16
Original line number Diff line number Diff line
@@ -58,33 +58,29 @@ nsWaylandDisplay* WaylandDisplayGet() {

void nsWaylandDisplay::SetShm(wl_shm* aShm) { mShm = aShm; }

class EventSurface {
class TouchWindow {
 public:
  nsWindow* GetWindow() {
    if (!surface) {
      return nullptr;
    }
  already_AddRefed<nsWindow> GetAndClearWindow() { return mWindow.forget(); }
  RefPtr<nsWindow> TakeWindow(wl_surface* aSurface) {
    GdkWindow* window =
        static_cast<GdkWindow*>(wl_surface_get_user_data(surface));
    return window ? static_cast<nsWindow*>(
        static_cast<GdkWindow*>(wl_surface_get_user_data(aSurface));
    mWindow = window ? static_cast<nsWindow*>(
                           g_object_get_data(G_OBJECT(window), "nsWindow"))
                     : nullptr;
    return mWindow;
  }
  void Set(wl_surface* aSurface) { surface = aSurface; }
  void Clear() { surface = nullptr; }

 private:
  wl_surface* surface = nullptr;
  StaticRefPtr<nsWindow> mWindow;
};

static EventSurface sTouchSurface;
static TouchWindow sTouchWindow;

static void gesture_hold_begin(void* data,
                               struct zwp_pointer_gesture_hold_v1* hold,
                               uint32_t serial, uint32_t time,
                               struct wl_surface* surface, uint32_t fingers) {
  sTouchSurface.Set(surface);
  RefPtr<nsWindow> window = sTouchSurface.GetWindow();
  RefPtr<nsWindow> window = sTouchWindow.TakeWindow(surface);
  if (!window) {
    return;
  }
@@ -95,7 +91,7 @@ static void gesture_hold_end(void* data,
                             struct zwp_pointer_gesture_hold_v1* hold,
                             uint32_t serial, uint32_t time,
                             int32_t cancelled) {
  RefPtr<nsWindow> window = sTouchSurface.GetWindow();
  RefPtr<nsWindow> window = sTouchWindow.GetAndClearWindow();
  if (!window) {
    return;
  }