diff options
Diffstat (limited to '')
-rw-r--r-- | widget/gtk/nsWaylandDisplay.h | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/widget/gtk/nsWaylandDisplay.h b/widget/gtk/nsWaylandDisplay.h new file mode 100644 index 0000000000..6beb7ef684 --- /dev/null +++ b/widget/gtk/nsWaylandDisplay.h @@ -0,0 +1,130 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim:expandtab:shiftwidth=4:tabstop=4: + */ +/* 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/. */ + +#ifndef __MOZ_WAYLAND_DISPLAY_H__ +#define __MOZ_WAYLAND_DISPLAY_H__ + +#include "DMABufLibWrapper.h" + +#include "mozilla/widget/mozwayland.h" +#include "mozilla/widget/gbm.h" +#include "mozilla/widget/gtk-primary-selection-client-protocol.h" +#include "mozilla/widget/idle-inhibit-unstable-v1-client-protocol.h" +#include "mozilla/widget/linux-dmabuf-unstable-v1-client-protocol.h" +#include "mozilla/widget/primary-selection-unstable-v1-client-protocol.h" + +namespace mozilla { +namespace widget { + +// Our general connection to Wayland display server, +// holds our display connection and runs event loop. +// We have a global nsWaylandDisplay object for each thread. +class nsWaylandDisplay { + public: + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(nsWaylandDisplay) + + // Create nsWaylandDisplay object on top of native Wayland wl_display + // connection. When aLighWrapper is set we don't get wayland registry + // objects and only event loop is provided. + explicit nsWaylandDisplay(wl_display* aDisplay, bool aLighWrapper = false); + + bool DispatchEventQueue(); + + void SyncBegin(); + void QueueSyncBegin(); + void SyncEnd(); + void WaitForSyncEnd(); + + bool Matches(wl_display* aDisplay); + + wl_display* GetDisplay() { return mDisplay; }; + wl_event_queue* GetEventQueue() { return mEventQueue; }; + wl_compositor* GetCompositor(void) { return mCompositor; }; + wl_subcompositor* GetSubcompositor(void) { return mSubcompositor; }; + wl_data_device_manager* GetDataDeviceManager(void) { + return mDataDeviceManager; + }; + wl_seat* GetSeat(void) { return mSeat; }; + wl_shm* GetShm(void) { return mShm; }; + gtk_primary_selection_device_manager* GetPrimarySelectionDeviceManagerGtk( + void) { + return mPrimarySelectionDeviceManagerGtk; + }; + zwp_primary_selection_device_manager_v1* + GetPrimarySelectionDeviceManagerZwpV1(void) { + return mPrimarySelectionDeviceManagerZwpV1; + }; + zwp_idle_inhibit_manager_v1* GetIdleInhibitManager(void) { + return mIdleInhibitManager; + } + + bool IsMainThreadDisplay() { return mEventQueue == nullptr; } + + void SetShm(wl_shm* aShm); + void SetCompositor(wl_compositor* aCompositor); + void SetSubcompositor(wl_subcompositor* aSubcompositor); + void SetDataDeviceManager(wl_data_device_manager* aDataDeviceManager); + void SetSeat(wl_seat* aSeat); + void SetPrimarySelectionDeviceManager( + gtk_primary_selection_device_manager* aPrimarySelectionDeviceManager); + void SetPrimarySelectionDeviceManager( + zwp_primary_selection_device_manager_v1* aPrimarySelectionDeviceManager); + void SetIdleInhibitManager(zwp_idle_inhibit_manager_v1* aIdleInhibitManager); + + bool IsExplicitSyncEnabled() { return mExplicitSync; } + + private: + ~nsWaylandDisplay(); + + PRThread* mThreadId; + wl_display* mDisplay; + wl_event_queue* mEventQueue; + wl_data_device_manager* mDataDeviceManager; + wl_compositor* mCompositor; + wl_subcompositor* mSubcompositor; + wl_seat* mSeat; + wl_shm* mShm; + wl_callback* mSyncCallback; + gtk_primary_selection_device_manager* mPrimarySelectionDeviceManagerGtk; + zwp_primary_selection_device_manager_v1* mPrimarySelectionDeviceManagerZwpV1; + zwp_idle_inhibit_manager_v1* mIdleInhibitManager; + wl_registry* mRegistry; + bool mExplicitSync; +}; + +void WaylandDispatchDisplays(); +void WaylandDisplayRelease(); + +RefPtr<nsWaylandDisplay> WaylandDisplayGet(GdkDisplay* aGdkDisplay = nullptr); +wl_display* WaylandDisplayGetWLDisplay(GdkDisplay* aGdkDisplay = nullptr); + +} // namespace widget +} // namespace mozilla + +template <class T> +static inline T* WaylandRegistryBind(struct wl_registry* wl_registry, + uint32_t name, + const struct wl_interface* interface, + uint32_t version) { + struct wl_proxy* id; + + // When libwayland-client does not provide this symbol, it will be + // linked to the fallback in libmozwayland, which returns NULL. + id = wl_proxy_marshal_constructor_versioned( + (struct wl_proxy*)wl_registry, WL_REGISTRY_BIND, interface, version, name, + interface->name, version, nullptr); + + if (id == nullptr) { + id = wl_proxy_marshal_constructor((struct wl_proxy*)wl_registry, + WL_REGISTRY_BIND, interface, name, + interface->name, version, nullptr); + } + + return reinterpret_cast<T*>(id); +} + +#endif // __MOZ_WAYLAND_DISPLAY_H__ |