diff options
Diffstat (limited to 'widget/gtk/mozwayland')
-rw-r--r-- | widget/gtk/mozwayland/moz.build | 16 | ||||
-rw-r--r-- | widget/gtk/mozwayland/mozwayland.c | 230 | ||||
-rw-r--r-- | widget/gtk/mozwayland/mozwayland.h | 134 |
3 files changed, 380 insertions, 0 deletions
diff --git a/widget/gtk/mozwayland/moz.build b/widget/gtk/mozwayland/moz.build new file mode 100644 index 0000000000..0df3f0f685 --- /dev/null +++ b/widget/gtk/mozwayland/moz.build @@ -0,0 +1,16 @@ +# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- +# vim: set filetype=python: +# 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/. + +SOURCES += [ + "mozwayland.c", +] +EXPORTS.mozilla.widget += [ + "mozwayland.h", +] + +SharedLibrary("mozwayland") + +CFLAGS += CONFIG["MOZ_GTK3_CFLAGS"] diff --git a/widget/gtk/mozwayland/mozwayland.c b/widget/gtk/mozwayland/mozwayland.c new file mode 100644 index 0000000000..eb17d3227e --- /dev/null +++ b/widget/gtk/mozwayland/mozwayland.c @@ -0,0 +1,230 @@ +/* -*- 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/. */ + +#include <stdlib.h> +#include "mozilla/Types.h" +#include <gtk/gtk.h> +#include <gtk/gtkx.h> +#include <gdk/gdkwayland.h> + +union wl_argument; + +/* Those structures are just placeholders and will be replaced by + * real symbols from libwayland during run-time linking. We need to make + * them explicitly visible. + */ +#pragma GCC visibility push(default) +const struct wl_interface wl_buffer_interface; +const struct wl_interface wl_callback_interface; +const struct wl_interface wl_data_device_interface; +const struct wl_interface wl_data_device_manager_interface; +const struct wl_interface wl_keyboard_interface; +const struct wl_interface wl_pointer_interface; +const struct wl_interface wl_region_interface; +const struct wl_interface wl_registry_interface; +const struct wl_interface wl_shm_interface; +const struct wl_interface wl_shm_pool_interface; +const struct wl_interface wl_seat_interface; +const struct wl_interface wl_surface_interface; +const struct wl_interface wl_subsurface_interface; +const struct wl_interface wl_compositor_interface; +const struct wl_interface wl_subcompositor_interface; +const struct wl_interface wl_output_interface; +#pragma GCC visibility pop + +MOZ_EXPORT void wl_event_queue_destroy(struct wl_event_queue* queue) {} + +MOZ_EXPORT void wl_proxy_marshal(struct wl_proxy* p, uint32_t opcode, ...) {} + +MOZ_EXPORT void wl_proxy_marshal_array(struct wl_proxy* p, uint32_t opcode, + union wl_argument* args) {} + +MOZ_EXPORT struct wl_proxy* wl_proxy_create( + struct wl_proxy* factory, const struct wl_interface* interface) { + return NULL; +} + +MOZ_EXPORT void* wl_proxy_create_wrapper(void* proxy) { return NULL; } + +MOZ_EXPORT void wl_proxy_wrapper_destroy(void* proxy_wrapper) {} + +MOZ_EXPORT struct wl_proxy* wl_proxy_marshal_constructor( + struct wl_proxy* proxy, uint32_t opcode, + const struct wl_interface* interface, ...) { + return NULL; +} + +MOZ_EXPORT struct wl_proxy* wl_proxy_marshal_constructor_versioned( + struct wl_proxy* proxy, uint32_t opcode, + const struct wl_interface* interface, uint32_t version, ...) { + return NULL; +} + +MOZ_EXPORT struct wl_proxy* wl_proxy_marshal_array_constructor( + struct wl_proxy* proxy, uint32_t opcode, union wl_argument* args, + const struct wl_interface* interface) { + return NULL; +} + +MOZ_EXPORT struct wl_proxy* wl_proxy_marshal_array_constructor_versioned( + struct wl_proxy* proxy, uint32_t opcode, union wl_argument* args, + const struct wl_interface* interface, uint32_t version) { + return NULL; +} + +MOZ_EXPORT void wl_proxy_destroy(struct wl_proxy* proxy) {} + +MOZ_EXPORT int wl_proxy_add_listener(struct wl_proxy* proxy, + void (**implementation)(void), + void* data) { + return -1; +} + +MOZ_EXPORT const void* wl_proxy_get_listener(struct wl_proxy* proxy) { + return NULL; +} + +typedef int (*wl_dispatcher_func_t)(const void*, void*, uint32_t, + const struct wl_message*, + union wl_argument*); + +MOZ_EXPORT int wl_proxy_add_dispatcher(struct wl_proxy* proxy, + wl_dispatcher_func_t dispatcher_func, + const void* dispatcher_data, + void* data) { + return -1; +} + +MOZ_EXPORT void wl_proxy_set_user_data(struct wl_proxy* proxy, + void* user_data) {} + +MOZ_EXPORT void* wl_proxy_get_user_data(struct wl_proxy* proxy) { return NULL; } + +MOZ_EXPORT uint32_t wl_proxy_get_version(struct wl_proxy* proxy) { return -1; } + +MOZ_EXPORT uint32_t wl_proxy_get_id(struct wl_proxy* proxy) { return -1; } + +MOZ_EXPORT const char* wl_proxy_get_class(struct wl_proxy* proxy) { + return NULL; +} + +MOZ_EXPORT void wl_proxy_set_queue(struct wl_proxy* proxy, + struct wl_event_queue* queue) {} + +MOZ_EXPORT struct wl_display* wl_display_connect(const char* name) { + return NULL; +} + +MOZ_EXPORT struct wl_display* wl_display_connect_to_fd(int fd) { return NULL; } + +MOZ_EXPORT void wl_display_disconnect(struct wl_display* display) {} + +MOZ_EXPORT int wl_display_get_fd(struct wl_display* display) { return -1; } + +MOZ_EXPORT int wl_display_dispatch(struct wl_display* display) { return -1; } + +MOZ_EXPORT int wl_display_dispatch_queue(struct wl_display* display, + struct wl_event_queue* queue) { + return -1; +} + +MOZ_EXPORT int wl_display_dispatch_queue_pending(struct wl_display* display, + struct wl_event_queue* queue) { + return -1; +} + +MOZ_EXPORT int wl_display_dispatch_pending(struct wl_display* display) { + return -1; +} + +MOZ_EXPORT int wl_display_get_error(struct wl_display* display) { return -1; } + +MOZ_EXPORT uint32_t wl_display_get_protocol_error( + struct wl_display* display, const struct wl_interface** interface, + uint32_t* id) { + return -1; +} + +MOZ_EXPORT int wl_display_flush(struct wl_display* display) { return -1; } + +MOZ_EXPORT int wl_display_roundtrip_queue(struct wl_display* display, + struct wl_event_queue* queue) { + return -1; +} + +MOZ_EXPORT int wl_display_roundtrip(struct wl_display* display) { return -1; } + +MOZ_EXPORT struct wl_event_queue* wl_display_create_queue( + struct wl_display* display) { + return NULL; +} + +MOZ_EXPORT int wl_display_prepare_read_queue(struct wl_display* display, + struct wl_event_queue* queue) { + return -1; +} + +MOZ_EXPORT int wl_display_prepare_read(struct wl_display* display) { + return -1; +} + +MOZ_EXPORT void wl_display_cancel_read(struct wl_display* display) {} + +MOZ_EXPORT int wl_display_read_events(struct wl_display* display) { return -1; } + +MOZ_EXPORT void wl_log_set_handler_client(wl_log_func_t handler) {} + +MOZ_EXPORT struct wl_egl_window* wl_egl_window_create( + struct wl_surface* surface, int width, int height) { + return NULL; +} + +MOZ_EXPORT void wl_egl_window_destroy(struct wl_egl_window* egl_window) {} + +MOZ_EXPORT void wl_egl_window_resize(struct wl_egl_window* egl_window, + int width, int height, int dx, int dy) {} + +MOZ_EXPORT void wl_egl_window_get_attached_size( + struct wl_egl_window* egl_window, int* width, int* height) {} + +MOZ_EXPORT void wl_list_init(struct wl_list* list) {} + +MOZ_EXPORT void wl_list_insert(struct wl_list* list, struct wl_list* elm) {} + +MOZ_EXPORT void wl_list_remove(struct wl_list* elm) {} + +MOZ_EXPORT int wl_list_length(const struct wl_list* list) { return -1; } + +MOZ_EXPORT int wl_list_empty(const struct wl_list* list) { return -1; } + +MOZ_EXPORT void wl_list_insert_list(struct wl_list* list, + struct wl_list* other) {} + +MOZ_EXPORT struct wl_proxy* wl_proxy_marshal_flags( + struct wl_proxy* proxy, uint32_t opcode, + const struct wl_interface* interface, uint32_t version, uint32_t flags, + ...) { + return NULL; +} + +MOZ_EXPORT struct wl_compositor* gdk_wayland_display_get_wl_compositor( + GdkDisplay* display) { + return NULL; +} +MOZ_EXPORT struct wl_surface* gdk_wayland_window_get_wl_surface( + GdkWindow* window) { + return NULL; +} + +MOZ_EXPORT struct wl_pointer* gdk_wayland_device_get_wl_pointer( + GdkDevice* device) { + return NULL; +} +MOZ_EXPORT struct wl_display* gdk_wayland_display_get_wl_display( + GdkDisplay* display) { + return NULL; +} diff --git a/widget/gtk/mozwayland/mozwayland.h b/widget/gtk/mozwayland/mozwayland.h new file mode 100644 index 0000000000..22f80d6315 --- /dev/null +++ b/widget/gtk/mozwayland/mozwayland.h @@ -0,0 +1,134 @@ +/* -*- 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/. */ + +/* Wayland compatibility header, it makes Firefox build with + wayland-1.2 and Gtk+ 3.10. +*/ + +#ifndef __MozWayland_h_ +#define __MozWayland_h_ + +#include "mozilla/Types.h" +#include <gtk/gtk.h> +#include <gdk/gdkwayland.h> + +#ifdef __cplusplus +extern "C" { +#endif + +MOZ_EXPORT struct wl_display* wl_display_connect(const char* name); +MOZ_EXPORT int wl_display_roundtrip_queue(struct wl_display* display, + struct wl_event_queue* queue); +MOZ_EXPORT uint32_t wl_proxy_get_version(struct wl_proxy* proxy); +MOZ_EXPORT void wl_proxy_marshal(struct wl_proxy* p, uint32_t opcode, ...); +MOZ_EXPORT struct wl_proxy* wl_proxy_marshal_constructor( + struct wl_proxy* proxy, uint32_t opcode, + const struct wl_interface* interface, ...); +MOZ_EXPORT struct wl_proxy* wl_proxy_marshal_constructor_versioned( + struct wl_proxy* proxy, uint32_t opcode, + const struct wl_interface* interface, uint32_t version, ...); +MOZ_EXPORT void wl_proxy_destroy(struct wl_proxy* proxy); +MOZ_EXPORT void* wl_proxy_create_wrapper(void* proxy); +MOZ_EXPORT void wl_proxy_wrapper_destroy(void* proxy_wrapper); + +/* We need implement some missing functions from wayland-client-protocol.h + */ +#ifndef WL_DATA_DEVICE_MANAGER_DND_ACTION_ENUM +enum wl_data_device_manager_dnd_action { + WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE = 0, + WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY = 1, + WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE = 2, + WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK = 4 +}; +#endif + +#ifndef WL_DATA_OFFER_SET_ACTIONS +# define WL_DATA_OFFER_SET_ACTIONS 4 + +struct moz_wl_data_offer_listener { + void (*offer)(void* data, struct wl_data_offer* wl_data_offer, + const char* mime_type); + void (*source_actions)(void* data, struct wl_data_offer* wl_data_offer, + uint32_t source_actions); + void (*action)(void* data, struct wl_data_offer* wl_data_offer, + uint32_t dnd_action); +}; + +static inline void wl_data_offer_set_actions( + struct wl_data_offer* wl_data_offer, uint32_t dnd_actions, + uint32_t preferred_action) { + wl_proxy_marshal((struct wl_proxy*)wl_data_offer, WL_DATA_OFFER_SET_ACTIONS, + dnd_actions, preferred_action); +} +#else +typedef struct wl_data_offer_listener moz_wl_data_offer_listener; +#endif + +#ifndef WL_SUBCOMPOSITOR_GET_SUBSURFACE +# define WL_SUBCOMPOSITOR_GET_SUBSURFACE 1 +struct wl_subcompositor; + +// Emulate what mozilla header wrapper does - make the +// wl_subcompositor_interface always visible. +# pragma GCC visibility push(default) +extern const struct wl_interface wl_subsurface_interface; +extern const struct wl_interface wl_subcompositor_interface; +# pragma GCC visibility pop + +# define WL_SUBSURFACE_DESTROY 0 +# define WL_SUBSURFACE_SET_POSITION 1 +# define WL_SUBSURFACE_PLACE_ABOVE 2 +# define WL_SUBSURFACE_PLACE_BELOW 3 +# define WL_SUBSURFACE_SET_SYNC 4 +# define WL_SUBSURFACE_SET_DESYNC 5 + +static inline struct wl_subsurface* wl_subcompositor_get_subsurface( + struct wl_subcompositor* wl_subcompositor, struct wl_surface* surface, + struct wl_surface* parent) { + struct wl_proxy* id; + + id = wl_proxy_marshal_constructor( + (struct wl_proxy*)wl_subcompositor, WL_SUBCOMPOSITOR_GET_SUBSURFACE, + &wl_subsurface_interface, NULL, surface, parent); + + return (struct wl_subsurface*)id; +} + +static inline void wl_subsurface_set_position( + struct wl_subsurface* wl_subsurface, int32_t x, int32_t y) { + wl_proxy_marshal((struct wl_proxy*)wl_subsurface, WL_SUBSURFACE_SET_POSITION, + x, y); +} + +static inline void wl_subsurface_set_desync( + struct wl_subsurface* wl_subsurface) { + wl_proxy_marshal((struct wl_proxy*)wl_subsurface, WL_SUBSURFACE_SET_DESYNC); +} + +static inline void wl_subsurface_destroy(struct wl_subsurface* wl_subsurface) { + wl_proxy_marshal((struct wl_proxy*)wl_subsurface, WL_SUBSURFACE_DESTROY); + + wl_proxy_destroy((struct wl_proxy*)wl_subsurface); +} +#endif + +#ifndef WL_SURFACE_DAMAGE_BUFFER +# define WL_SURFACE_DAMAGE_BUFFER 9 + +static inline void wl_surface_damage_buffer(struct wl_surface* wl_surface, + int32_t x, int32_t y, int32_t width, + int32_t height) { + wl_proxy_marshal((struct wl_proxy*)wl_surface, WL_SURFACE_DAMAGE_BUFFER, x, y, + width, height); +} +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __MozWayland_h_ */ |