/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "WaylandSurfaceLock.h"
#ifdef MOZ_WAYLAND
#  include "WaylandSurface.h"
#endif
#include "MozContainer.h"
#include "WidgetUtilsGtk.h"

namespace mozilla::widget {

WaylandSurfaceLock::WaylandSurfaceLock(RefPtr<WaylandSurface> aWaylandSurface,
                                       bool aSkipCommit) {
#ifdef MOZ_WAYLAND
  MOZ_DIAGNOSTIC_ASSERT(aWaylandSurface);
  mWaylandSurface = std::move(aWaylandSurface);
  mSkipCommit = aSkipCommit;
  if (GdkIsWaylandDisplay()) {
    mSurface = mWaylandSurface->Lock(this);
  }
#endif
}

#ifdef MOZ_WAYLAND
void WaylandSurfaceLock::Commit() {
  if (GdkIsWaylandDisplay()) {
    mWaylandSurface->Commit(this, mForceCommit,
                            /* flush display */ false);
  }
}
#endif

WaylandSurfaceLock::~WaylandSurfaceLock() {
#ifdef MOZ_WAYLAND
  if (GdkIsWaylandDisplay()) {
    if (mForceCommit || !mSkipCommit) {
      Commit();
    }
    mWaylandSurface->Unlock(&mSurface, this);
  }
#endif
}

WaylandSurface* WaylandSurfaceLock::GetWaylandSurface() const {
#ifdef MOZ_WAYLAND
  return mWaylandSurface.get();
#else
  return nullptr;
#endif
}

}  // namespace mozilla::widget
