wayland: Add wayland integration and use stable protocol.

non functional, all changes just make it compile again. Configure changes
by Ivan Vučica.
This commit is contained in:
Ladislav Michl 2018-02-03 15:46:46 +00:00 committed by Ivan Vučica
parent 81456203b2
commit 05f362d528
8 changed files with 2094 additions and 635 deletions

View file

@ -16,7 +16,7 @@
#include <xkbcommon/xkbcommon.h>
#include "cairo/WaylandCairoSurface.h"
#include "wayland/xdg-shell-unstable-v5-client-protocol.h"
#include "wayland/xdg-shell-client-protocol.h"
struct pointer {
struct wl_pointer *wlpointer;
@ -36,14 +36,14 @@ typedef struct _WaylandConfig {
struct wl_registry *registry;
struct wl_compositor *compositor;
struct wl_shell *shell;
struct xdg_shell *xdg_shell;
struct xdg_wm_base *wm_base;
struct wl_shm *shm;
struct wl_seat *seat;
struct wl_keyboard *keyboard;
struct wl_surface *surface;
struct wl_shell_surface *shell_surface;
struct wl_buffer *buffer;
struct wl_list output_list;
int output_count;
struct wl_list window_list;

File diff suppressed because it is too large Load diff

View file

@ -1,559 +0,0 @@
/*
* Copyright © 2008-2013 Kristian Høgsberg
* Copyright © 2013 Rafael Antognolli
* Copyright © 2013 Jasper St. Pierre
* Copyright © 2010-2013 Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef XDG_SHELL_UNSTABLE_V5_CLIENT_PROTOCOL_H
#define XDG_SHELL_UNSTABLE_V5_CLIENT_PROTOCOL_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include <stddef.h>
#include "wayland-client.h"
struct wl_client;
struct wl_resource;
struct wl_output;
struct wl_seat;
struct wl_surface;
struct xdg_popup;
struct xdg_shell;
struct xdg_surface;
extern const struct wl_interface xdg_shell_interface;
extern const struct wl_interface xdg_surface_interface;
extern const struct wl_interface xdg_popup_interface;
#ifndef XDG_SHELL_VERSION_ENUM
#define XDG_SHELL_VERSION_ENUM
/**
* xdg_shell_version - latest protocol version
* @XDG_SHELL_VERSION_CURRENT: Always the latest version
*
* The 'current' member of this enum gives the version of the protocol.
* Implementations can compare this to the version they implement using
* static_assert to ensure the protocol and implementation versions match.
*/
enum xdg_shell_version {
XDG_SHELL_VERSION_CURRENT = 5,
};
#endif /* XDG_SHELL_VERSION_ENUM */
#ifndef XDG_SHELL_ERROR_ENUM
#define XDG_SHELL_ERROR_ENUM
enum xdg_shell_error {
XDG_SHELL_ERROR_ROLE = 0,
XDG_SHELL_ERROR_DEFUNCT_SURFACES = 1,
XDG_SHELL_ERROR_NOT_THE_TOPMOST_POPUP = 2,
XDG_SHELL_ERROR_INVALID_POPUP_PARENT = 3,
};
#endif /* XDG_SHELL_ERROR_ENUM */
/**
* xdg_shell - create desktop-style surfaces
* @ping: check if the client is alive
*
* xdg_shell allows clients to turn a wl_surface into a "real window"
* which can be dragged, resized, stacked, and moved around by the user.
* Everything about this interface is suited towards traditional desktop
* environments.
*/
struct xdg_shell_listener {
/**
* ping - check if the client is alive
* @serial: pass this to the pong request
*
* The ping event asks the client if it's still alive. Pass the
* serial specified in the event back to the compositor by sending
* a "pong" request back with the specified serial.
*
* Compositors can use this to determine if the client is still
* alive. It's unspecified what will happen if the client doesn't
* respond to the ping request, or in what timeframe. Clients
* should try to respond in a reasonable amount of time.
*
* A compositor is free to ping in any way it wants, but a client
* must always respond to any xdg_shell object it created.
*/
void (*ping)(void *data,
struct xdg_shell *xdg_shell,
uint32_t serial);
};
static inline int
xdg_shell_add_listener(struct xdg_shell *xdg_shell,
const struct xdg_shell_listener *listener, void *data)
{
return wl_proxy_add_listener((struct wl_proxy *) xdg_shell,
(void (**)(void)) listener, data);
}
#define XDG_SHELL_DESTROY 0
#define XDG_SHELL_USE_UNSTABLE_VERSION 1
#define XDG_SHELL_GET_XDG_SURFACE 2
#define XDG_SHELL_GET_XDG_SURFACE_SPECIAL 3
#define XDG_SHELL_GET_XDG_POPUP 4
#define XDG_SHELL_PONG 5
static inline void
xdg_shell_set_user_data(struct xdg_shell *xdg_shell, void *user_data)
{
wl_proxy_set_user_data((struct wl_proxy *) xdg_shell, user_data);
}
static inline void *
xdg_shell_get_user_data(struct xdg_shell *xdg_shell)
{
return wl_proxy_get_user_data((struct wl_proxy *) xdg_shell);
}
static inline void
xdg_shell_destroy(struct xdg_shell *xdg_shell)
{
wl_proxy_marshal((struct wl_proxy *) xdg_shell,
XDG_SHELL_DESTROY);
wl_proxy_destroy((struct wl_proxy *) xdg_shell);
}
static inline void
xdg_shell_use_unstable_version(struct xdg_shell *xdg_shell, int32_t version)
{
wl_proxy_marshal((struct wl_proxy *) xdg_shell,
XDG_SHELL_USE_UNSTABLE_VERSION, version);
}
static inline struct xdg_surface *
xdg_shell_get_xdg_surface(struct xdg_shell *xdg_shell, struct wl_surface *surface)
{
struct wl_proxy *id;
id = wl_proxy_marshal_constructor((struct wl_proxy *) xdg_shell,
XDG_SHELL_GET_XDG_SURFACE, &xdg_surface_interface, NULL, surface);
return (struct xdg_surface *) id;
}
static inline struct xdg_surface *
xdg_shell_get_xdg_surface_special(struct xdg_shell *xdg_shell, struct wl_surface *surface, uint32_t type)
{
struct wl_proxy *id;
id = wl_proxy_marshal_constructor((struct wl_proxy *) xdg_shell,
XDG_SHELL_GET_XDG_SURFACE_SPECIAL, &xdg_surface_interface, NULL, surface, type);
return (struct xdg_surface *) id;
}
static inline struct xdg_popup *
xdg_shell_get_xdg_popup(struct xdg_shell *xdg_shell, struct wl_surface *surface, struct wl_surface *parent, struct wl_seat *seat, uint32_t serial, int32_t x, int32_t y)
{
struct wl_proxy *id;
id = wl_proxy_marshal_constructor((struct wl_proxy *) xdg_shell,
XDG_SHELL_GET_XDG_POPUP, &xdg_popup_interface, NULL, surface, parent, seat, serial, x, y);
return (struct xdg_popup *) id;
}
static inline void
xdg_shell_pong(struct xdg_shell *xdg_shell, uint32_t serial)
{
wl_proxy_marshal((struct wl_proxy *) xdg_shell,
XDG_SHELL_PONG, serial);
}
#ifndef XDG_SURFACE_RESIZE_EDGE_ENUM
#define XDG_SURFACE_RESIZE_EDGE_ENUM
/**
* xdg_surface_resize_edge - edge values for resizing
* @XDG_SURFACE_RESIZE_EDGE_NONE: (none)
* @XDG_SURFACE_RESIZE_EDGE_TOP: (none)
* @XDG_SURFACE_RESIZE_EDGE_BOTTOM: (none)
* @XDG_SURFACE_RESIZE_EDGE_LEFT: (none)
* @XDG_SURFACE_RESIZE_EDGE_TOP_LEFT: (none)
* @XDG_SURFACE_RESIZE_EDGE_BOTTOM_LEFT: (none)
* @XDG_SURFACE_RESIZE_EDGE_RIGHT: (none)
* @XDG_SURFACE_RESIZE_EDGE_TOP_RIGHT: (none)
* @XDG_SURFACE_RESIZE_EDGE_BOTTOM_RIGHT: (none)
*
* These values are used to indicate which edge of a surface is being
* dragged in a resize operation.
*/
enum xdg_surface_resize_edge {
XDG_SURFACE_RESIZE_EDGE_NONE = 0,
XDG_SURFACE_RESIZE_EDGE_TOP = 1,
XDG_SURFACE_RESIZE_EDGE_BOTTOM = 2,
XDG_SURFACE_RESIZE_EDGE_LEFT = 4,
XDG_SURFACE_RESIZE_EDGE_TOP_LEFT = 5,
XDG_SURFACE_RESIZE_EDGE_BOTTOM_LEFT = 6,
XDG_SURFACE_RESIZE_EDGE_RIGHT = 8,
XDG_SURFACE_RESIZE_EDGE_TOP_RIGHT = 9,
XDG_SURFACE_RESIZE_EDGE_BOTTOM_RIGHT = 10,
};
#endif /* XDG_SURFACE_RESIZE_EDGE_ENUM */
#ifndef XDG_SURFACE_STATE_ENUM
#define XDG_SURFACE_STATE_ENUM
/**
* xdg_surface_state - the surface is now activated
* @XDG_SURFACE_STATE_MAXIMIZED: the surface is maximized
* @XDG_SURFACE_STATE_FULLSCREEN: the surface is fullscreen
* @XDG_SURFACE_STATE_RESIZING: the surface is being resized
* @XDG_SURFACE_STATE_ACTIVATED: the surface is now activated
*
* Client window decorations should be painted as if the window is
* active. Do not assume this means that the window actually has keyboard
* or pointer focus.
*/
enum xdg_surface_state {
XDG_SURFACE_STATE_MAXIMIZED = 1,
XDG_SURFACE_STATE_FULLSCREEN = 2,
XDG_SURFACE_STATE_RESIZING = 3,
XDG_SURFACE_STATE_ACTIVATED = 4,
};
#endif /* XDG_SURFACE_STATE_ENUM */
/**
* xdg_surface - A desktop window
* @configure: suggest a surface change
* @close: surface wants to be closed
*
* An interface that may be implemented by a wl_surface, for
* implementations that provide a desktop-style user interface.
*
* It provides requests to treat surfaces like windows, allowing to set
* properties like maximized, fullscreen, minimized, and to move and resize
* them, and associate metadata like title and app id.
*
* The client must call wl_surface.commit on the corresponding wl_surface
* for the xdg_surface state to take effect. Prior to committing the new
* state, it can set up initial configuration, such as maximizing or
* setting a window geometry.
*
* Even without attaching a buffer the compositor must respond to initial
* committed configuration, for instance sending a configure event with
* expected window geometry if the client maximized its surface during
* initialization.
*
* For a surface to be mapped by the compositor the client must have
* committed both an xdg_surface state and a buffer.
*/
struct xdg_surface_listener {
/**
* configure - suggest a surface change
* @x: (none)
* @y: (none)
* @width: (none)
* @height: (none)
* @states: (none)
* @serial: (none)
*
* The configure event asks the client to resize its surface or
* to change its state.
*
* The width and height arguments specify a hint to the window
* about how its surface should be resized in window geometry
* coordinates. See set_window_geometry.
*
* If the width or height arguments are zero, it means the client
* should decide its own window dimension. This may happen when the
* compositor need to configure the state of the surface but
* doesn't have any information about any previous or expected
* dimension.
*
* The states listed in the event specify how the width/height
* arguments should be interpreted, and possibly how it should be
* drawn.
*
* Clients should arrange their surface for the new size and
* states, and then send a ack_configure request with the serial
* sent in this configure event at some point before committing the
* new surface.
*
* If the client receives multiple configure events before it can
* respond to one, it is free to discard all but the last event it
* received.
*/
void (*configure)(void *data,
struct xdg_surface *xdg_surface,
int32_t x,
int32_t y,
int32_t width,
int32_t height,
struct wl_array *states,
uint32_t serial);
/**
* close - surface wants to be closed
*
* The close event is sent by the compositor when the user wants
* the surface to be closed. This should be equivalent to the user
* clicking the close button in client-side decorations, if your
* application has any...
*
* This is only a request that the user intends to close your
* window. The client may choose to ignore this request, or show a
* dialog to ask the user to save their data...
*/
void (*close)(void *data,
struct xdg_surface *xdg_surface);
};
static inline int
xdg_surface_add_listener(struct xdg_surface *xdg_surface,
const struct xdg_surface_listener *listener, void *data)
{
return wl_proxy_add_listener((struct wl_proxy *) xdg_surface,
(void (**)(void)) listener, data);
}
#define XDG_SURFACE_DESTROY 0
#define XDG_SURFACE_SET_PARENT 1
#define XDG_SURFACE_SET_TITLE 2
#define XDG_SURFACE_SET_APP_ID 3
#define XDG_SURFACE_SHOW_WINDOW_MENU 4
#define XDG_SURFACE_MOVE 5
#define XDG_SURFACE_RESIZE 6
#define XDG_SURFACE_ACK_CONFIGURE 7
#define XDG_SURFACE_SET_WINDOW_GEOMETRY 8
#define XDG_SURFACE_SET_MAXIMIZED 9
#define XDG_SURFACE_UNSET_MAXIMIZED 10
#define XDG_SURFACE_SET_FULLSCREEN 11
#define XDG_SURFACE_UNSET_FULLSCREEN 12
#define XDG_SURFACE_SET_MINIMIZED 13
static inline void
xdg_surface_set_user_data(struct xdg_surface *xdg_surface, void *user_data)
{
wl_proxy_set_user_data((struct wl_proxy *) xdg_surface, user_data);
}
static inline void *
xdg_surface_get_user_data(struct xdg_surface *xdg_surface)
{
return wl_proxy_get_user_data((struct wl_proxy *) xdg_surface);
}
static inline void
xdg_surface_destroy(struct xdg_surface *xdg_surface)
{
wl_proxy_marshal((struct wl_proxy *) xdg_surface,
XDG_SURFACE_DESTROY);
wl_proxy_destroy((struct wl_proxy *) xdg_surface);
}
static inline void
xdg_surface_set_parent(struct xdg_surface *xdg_surface, struct xdg_surface *parent)
{
wl_proxy_marshal((struct wl_proxy *) xdg_surface,
XDG_SURFACE_SET_PARENT, parent);
}
static inline void
xdg_surface_set_title(struct xdg_surface *xdg_surface, const char *title)
{
wl_proxy_marshal((struct wl_proxy *) xdg_surface,
XDG_SURFACE_SET_TITLE, title);
}
static inline void
xdg_surface_set_app_id(struct xdg_surface *xdg_surface, const char *app_id)
{
wl_proxy_marshal((struct wl_proxy *) xdg_surface,
XDG_SURFACE_SET_APP_ID, app_id);
}
static inline void
xdg_surface_show_window_menu(struct xdg_surface *xdg_surface, struct wl_seat *seat, uint32_t serial, int32_t x, int32_t y)
{
wl_proxy_marshal((struct wl_proxy *) xdg_surface,
XDG_SURFACE_SHOW_WINDOW_MENU, seat, serial, x, y);
}
static inline void
xdg_surface_move(struct xdg_surface *xdg_surface, struct wl_seat *seat, uint32_t serial)
{
wl_proxy_marshal((struct wl_proxy *) xdg_surface,
XDG_SURFACE_MOVE, seat, serial);
}
static inline void
xdg_surface_resize(struct xdg_surface *xdg_surface, struct wl_seat *seat, uint32_t serial, uint32_t edges)
{
wl_proxy_marshal((struct wl_proxy *) xdg_surface,
XDG_SURFACE_RESIZE, seat, serial, edges);
}
static inline void
xdg_surface_ack_configure(struct xdg_surface *xdg_surface, uint32_t serial)
{
wl_proxy_marshal((struct wl_proxy *) xdg_surface,
XDG_SURFACE_ACK_CONFIGURE, serial);
}
static inline void
xdg_surface_set_window_geometry(struct xdg_surface *xdg_surface, int32_t x, int32_t y, int32_t width, int32_t height)
{
wl_proxy_marshal((struct wl_proxy *) xdg_surface,
XDG_SURFACE_SET_WINDOW_GEOMETRY, x, y, width, height);
}
static inline void
xdg_surface_set_maximized(struct xdg_surface *xdg_surface)
{
wl_proxy_marshal((struct wl_proxy *) xdg_surface,
XDG_SURFACE_SET_MAXIMIZED);
}
static inline void
xdg_surface_unset_maximized(struct xdg_surface *xdg_surface)
{
wl_proxy_marshal((struct wl_proxy *) xdg_surface,
XDG_SURFACE_UNSET_MAXIMIZED);
}
static inline void
xdg_surface_set_fullscreen(struct xdg_surface *xdg_surface, struct wl_output *output)
{
wl_proxy_marshal((struct wl_proxy *) xdg_surface,
XDG_SURFACE_SET_FULLSCREEN, output);
}
static inline void
xdg_surface_unset_fullscreen(struct xdg_surface *xdg_surface)
{
wl_proxy_marshal((struct wl_proxy *) xdg_surface,
XDG_SURFACE_UNSET_FULLSCREEN);
}
static inline void
xdg_surface_set_minimized(struct xdg_surface *xdg_surface)
{
wl_proxy_marshal((struct wl_proxy *) xdg_surface,
XDG_SURFACE_SET_MINIMIZED);
}
/**
* xdg_popup - short-lived, popup surfaces for menus
* @popup_done: popup interaction is done
*
* A popup surface is a short-lived, temporary surface that can be used
* to implement menus. It takes an explicit grab on the surface that will
* be dismissed when the user dismisses the popup. This can be done by the
* user clicking outside the surface, using the keyboard, or even locking
* the screen through closing the lid or a timeout.
*
* When the popup is dismissed, a popup_done event will be sent out, and at
* the same time the surface will be unmapped. The xdg_popup object is now
* inert and cannot be reactivated, so clients should destroy it.
* Explicitly destroying the xdg_popup object will also dismiss the popup
* and unmap the surface.
*
* Clients will receive events for all their surfaces during this grab
* (which is an "owner-events" grab in X11 parlance). This is done so that
* users can navigate through submenus and other "nested" popup windows
* without having to dismiss the topmost popup.
*
* Clients that want to dismiss the popup when another surface of their own
* is clicked should dismiss the popup using the destroy request.
*
* The parent surface must have either an xdg_surface or xdg_popup role.
*
* Specifying an xdg_popup for the parent means that the popups are nested,
* with this popup now being the topmost popup. Nested popups must be
* destroyed in the reverse order they were created in, e.g. the only popup
* you are allowed to destroy at all times is the topmost one.
*
* If there is an existing popup when creating a new popup, the parent must
* be the current topmost popup.
*
* A parent surface must be mapped before the new popup is mapped.
*
* When compositors choose to dismiss a popup, they will likely dismiss
* every nested popup as well. When a compositor dismisses popups, it will
* follow the same dismissing order as required from the client.
*
* The x and y arguments passed when creating the popup object specify
* where the top left of the popup should be placed, relative to the local
* surface coordinates of the parent surface. See xdg_shell.get_xdg_popup.
*
* The client must call wl_surface.commit on the corresponding wl_surface
* for the xdg_popup state to take effect.
*
* For a surface to be mapped by the compositor the client must have
* committed both the xdg_popup state and a buffer.
*/
struct xdg_popup_listener {
/**
* popup_done - popup interaction is done
*
* The popup_done event is sent out when a popup is dismissed by
* the compositor. The client should destroy the xdg_popup object
* at this point.
*/
void (*popup_done)(void *data,
struct xdg_popup *xdg_popup);
};
static inline int
xdg_popup_add_listener(struct xdg_popup *xdg_popup,
const struct xdg_popup_listener *listener, void *data)
{
return wl_proxy_add_listener((struct wl_proxy *) xdg_popup,
(void (**)(void)) listener, data);
}
#define XDG_POPUP_DESTROY 0
static inline void
xdg_popup_set_user_data(struct xdg_popup *xdg_popup, void *user_data)
{
wl_proxy_set_user_data((struct wl_proxy *) xdg_popup, user_data);
}
static inline void *
xdg_popup_get_user_data(struct xdg_popup *xdg_popup)
{
return wl_proxy_get_user_data((struct wl_proxy *) xdg_popup);
}
static inline void
xdg_popup_destroy(struct xdg_popup *xdg_popup)
{
wl_proxy_marshal((struct wl_proxy *) xdg_popup,
XDG_POPUP_DESTROY);
wl_proxy_destroy((struct wl_proxy *) xdg_popup);
}
#ifdef __cplusplus
}
#endif
#endif

View file

@ -37,7 +37,7 @@ wayland_LOCALIZED_RESOURCE_FILES = \
# The C source files to be compiled
wayland_C_FILES = \
xdg-shell-unstable-v5-protocol.c \
xdg-shell-protocol.c \
# The Objective-C source files to be compiled
wayland_OBJC_FILES = \

View file

@ -623,24 +623,22 @@ static const struct wl_shell_surface_listener shell_surface_listener = {
};
static void
xdg_shell_ping(void *data, struct xdg_shell *shell, uint32_t serial)
xdg_wm_base_ping(void *data, struct xdg_wm_base *shell, uint32_t serial)
{
WaylandConfig *wlconfig = data;
xdg_shell_pong(shell, serial);
xdg_wm_base_pong(shell, serial);
wl_display_dispatch_pending(wlconfig->display);
wl_display_flush(wlconfig->display);
}
static const struct xdg_shell_listener xdg_shell_listener = {
xdg_shell_ping,
static const struct xdg_wm_base_listener wm_base_listener = {
xdg_wm_base_ping,
};
static void
handle_surface_configure(void *data, struct xdg_surface *xdg_surface,
int32_t x, int32_t y,
int32_t width, int32_t height,
struct wl_array *states, uint32_t serial)
uint32_t serial)
{
struct window *window = data;
WaylandConfig *wlconfig = window->wlconfig;
@ -706,15 +704,8 @@ handle_surface_configure(void *data, struct xdg_surface *xdg_surface,
#endif
}
static void
handle_surface_delete(void *data, struct xdg_surface *xdg_surface)
{
NSDebugLog(@"handle_surface_delete");
}
static const struct xdg_surface_listener xdg_surface_listener = {
handle_surface_configure,
handle_surface_delete,
};
static void
@ -734,11 +725,10 @@ handle_global(void *data, struct wl_registry *registry,
&wl_shell_interface, 1);
*/
} else if (strcmp(interface, "xdg_shell") == 0) {
wlconfig->xdg_shell = wl_registry_bind(registry, name,
&xdg_shell_interface, 1);
xdg_shell_use_unstable_version(wlconfig->xdg_shell, 5);
xdg_shell_add_listener(wlconfig->xdg_shell,
&xdg_shell_listener, wlconfig);
wlconfig->wm_base = wl_registry_bind(registry, name,
&xdg_wm_base_interface, 1);
xdg_shell_add_listener(wlconfig->wm_base,
&wm_base_listener, wlconfig);
} else if (strcmp(interface, "wl_shm") == 0) {
wlconfig->shm = wl_registry_bind(wlconfig->registry, name,
&wl_shm_interface, 1);
@ -982,6 +972,7 @@ int NSToWayland(struct window *window, int ns_y)
window->height = height = NSHeight(frame);
window->pos_x = frame.origin.x;
window->pos_y = NSToWayland(window, frame.origin.y);
window->window_id = wlconfig->last_window_id;
wlsurface = wl_compositor_create_surface(wlconfig->compositor);
if (wlsurface == NULL) {
@ -1001,18 +992,17 @@ int NSToWayland(struct window *window, int ns_y)
}
*/
window->xdg_surface = xdg_wm_base_get_xdg_surface(wlconfig->wm_base,
wlsurface);
// TODO: xdg_shell_get_xdg_surface_special() no longer exists,
// so we need to find another way
if (style & NSMainMenuWindowMask) {
window->xdg_surface =
xdg_shell_get_xdg_surface_special(wlconfig->xdg_shell, wlsurface, 2);
NSDebugLog(@"window id=%d will be a panel", wlconfig->last_window_id);
NSDebugLog(@"window id=%d will be a panel", window->window_id);
} else if (style & NSBackgroundWindowMask) {
NSDebugLog(@"window id=%d will be a ?", window->window_id);
} else {
NSDebugLog(@"window id=%d will be ordinary", window->window_id);
}
else if (style & NSBackgroundWindowMask)
window->xdg_surface =
xdg_shell_get_xdg_surface_special(wlconfig->xdg_shell, wlsurface, 1);
else
window->xdg_surface =
xdg_shell_get_xdg_surface_special(wlconfig->xdg_shell, wlsurface, 0);
xdg_surface_set_user_data(window->xdg_surface, window);
xdg_surface_add_listener(window->xdg_surface,

View file

@ -1,20 +1,24 @@
/*
/* Generated by wayland-scanner 1.17.0 */
/*
* Copyright © 2008-2013 Kristian Høgsberg
* Copyright © 2013 Rafael Antognolli
* Copyright © 2013 Jasper St. Pierre
* Copyright © 2010-2013 Intel Corporation
*
* Copyright © 2015-2017 Samsung Electronics Co., Ltd
* Copyright © 2015-2017 Red Hat Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
@ -32,28 +36,23 @@ extern const struct wl_interface wl_output_interface;
extern const struct wl_interface wl_seat_interface;
extern const struct wl_interface wl_surface_interface;
extern const struct wl_interface xdg_popup_interface;
extern const struct wl_interface xdg_positioner_interface;
extern const struct wl_interface xdg_surface_interface;
extern const struct wl_interface xdg_toplevel_interface;
static const struct wl_interface *types[] = {
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
&xdg_positioner_interface,
&xdg_surface_interface,
&wl_surface_interface,
&xdg_surface_interface,
&wl_surface_interface,
NULL,
&xdg_toplevel_interface,
&xdg_popup_interface,
&wl_surface_interface,
&wl_surface_interface,
&wl_seat_interface,
NULL,
NULL,
NULL,
&xdg_surface_interface,
&xdg_positioner_interface,
&xdg_toplevel_interface,
&wl_seat_interface,
NULL,
NULL,
@ -64,66 +63,102 @@ static const struct wl_interface *types[] = {
NULL,
NULL,
&wl_output_interface,
&wl_seat_interface,
NULL,
};
static const struct wl_message xdg_shell_requests[] = {
static const struct wl_message xdg_wm_base_requests[] = {
{ "destroy", "", types + 0 },
{ "use_unstable_version", "i", types + 0 },
{ "get_xdg_surface", "no", types + 6 },
{ "get_xdg_surface_special", "nou", types + 8 },
{ "get_xdg_popup", "nooouii", types + 11 },
{ "create_positioner", "n", types + 4 },
{ "get_xdg_surface", "no", types + 5 },
{ "pong", "u", types + 0 },
};
static const struct wl_message xdg_shell_events[] = {
static const struct wl_message xdg_wm_base_events[] = {
{ "ping", "u", types + 0 },
};
WL_EXPORT const struct wl_interface xdg_shell_interface = {
"xdg_shell", 1,
6, xdg_shell_requests,
1, xdg_shell_events,
WL_EXPORT const struct wl_interface xdg_wm_base_interface = {
"xdg_wm_base", 2,
4, xdg_wm_base_requests,
1, xdg_wm_base_events,
};
static const struct wl_message xdg_positioner_requests[] = {
{ "destroy", "", types + 0 },
{ "set_size", "ii", types + 0 },
{ "set_anchor_rect", "iiii", types + 0 },
{ "set_anchor", "u", types + 0 },
{ "set_gravity", "u", types + 0 },
{ "set_constraint_adjustment", "u", types + 0 },
{ "set_offset", "ii", types + 0 },
};
WL_EXPORT const struct wl_interface xdg_positioner_interface = {
"xdg_positioner", 2,
7, xdg_positioner_requests,
0, NULL,
};
static const struct wl_message xdg_surface_requests[] = {
{ "destroy", "", types + 0 },
{ "set_parent", "?o", types + 18 },
{ "get_toplevel", "n", types + 7 },
{ "get_popup", "n?oo", types + 8 },
{ "set_window_geometry", "iiii", types + 0 },
{ "ack_configure", "u", types + 0 },
};
static const struct wl_message xdg_surface_events[] = {
{ "configure", "u", types + 0 },
};
WL_EXPORT const struct wl_interface xdg_surface_interface = {
"xdg_surface", 2,
5, xdg_surface_requests,
1, xdg_surface_events,
};
static const struct wl_message xdg_toplevel_requests[] = {
{ "destroy", "", types + 0 },
{ "set_parent", "?o", types + 11 },
{ "set_title", "s", types + 0 },
{ "set_app_id", "s", types + 0 },
{ "show_window_menu", "ouii", types + 19 },
{ "move", "ou", types + 23 },
{ "resize", "ouu", types + 25 },
{ "ack_configure", "u", types + 0 },
{ "set_window_geometry", "iiii", types + 0 },
{ "show_window_menu", "ouii", types + 12 },
{ "move", "ou", types + 16 },
{ "resize", "ouu", types + 18 },
{ "set_max_size", "ii", types + 0 },
{ "set_min_size", "ii", types + 0 },
{ "set_maximized", "", types + 0 },
{ "unset_maximized", "", types + 0 },
{ "set_fullscreen", "?o", types + 28 },
{ "set_fullscreen", "?o", types + 21 },
{ "unset_fullscreen", "", types + 0 },
{ "set_minimized", "", types + 0 },
};
static const struct wl_message xdg_surface_events[] = {
{ "configure", "iiiiau", types + 0 },
static const struct wl_message xdg_toplevel_events[] = {
{ "configure", "iia", types + 0 },
{ "close", "", types + 0 },
};
WL_EXPORT const struct wl_interface xdg_surface_interface = {
"xdg_surface", 1,
14, xdg_surface_requests,
2, xdg_surface_events,
WL_EXPORT const struct wl_interface xdg_toplevel_interface = {
"xdg_toplevel", 2,
14, xdg_toplevel_requests,
2, xdg_toplevel_events,
};
static const struct wl_message xdg_popup_requests[] = {
{ "destroy", "", types + 0 },
{ "grab", "ou", types + 22 },
};
static const struct wl_message xdg_popup_events[] = {
{ "configure", "iiii", types + 0 },
{ "popup_done", "", types + 0 },
};
WL_EXPORT const struct wl_interface xdg_popup_interface = {
"xdg_popup", 1,
1, xdg_popup_requests,
1, xdg_popup_events,
"xdg_popup", 2,
2, xdg_popup_requests,
2, xdg_popup_events,
};

146
configure vendored
View file

@ -707,6 +707,7 @@ infodir
docdir
oldincludedir
includedir
runstatedir
localstatedir
sharedstatedir
sysconfdir
@ -819,6 +820,7 @@ datadir='${datarootdir}'
sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var'
runstatedir='${localstatedir}/run'
includedir='${prefix}/include'
oldincludedir='/usr/include'
docdir='${datarootdir}/doc/${PACKAGE}'
@ -1071,6 +1073,15 @@ do
| -silent | --silent | --silen | --sile | --sil)
silent=yes ;;
-runstatedir | --runstatedir | --runstatedi | --runstated \
| --runstate | --runstat | --runsta | --runst | --runs \
| --run | --ru | --r)
ac_prev=runstatedir ;;
-runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
| --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
| --run=* | --ru=* | --r=*)
runstatedir=$ac_optarg ;;
-sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
ac_prev=sbindir ;;
-sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
@ -1208,7 +1219,7 @@ fi
for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
datadir sysconfdir sharedstatedir localstatedir includedir \
oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
libdir localedir mandir
libdir localedir mandir runstatedir
do
eval ac_val=\$$ac_var
# Remove trailing slashes.
@ -1361,6 +1372,7 @@ Fine tuning of the installation directories:
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
--runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run]
--libdir=DIR object code libraries [EPREFIX/lib]
--includedir=DIR C header files [PREFIX/include]
--oldincludedir=DIR C header files for non-gcc [/usr/include]
@ -1401,7 +1413,7 @@ Optional Features:
--disable-xim Disable XIM support
--disable-wgl Disable WGL support
--enable-glitz Enable Glitz support
--enable-server=SRV Build server type: x11, win32
--enable-server=SRV Build server type: x11, win32, wayland
--enable-graphics=GPH Build graphics: xlib, xdps, winlib, art, cairo, opal
Optional Packages:
@ -7159,6 +7171,8 @@ if test x"$BUILD_GRAPHICS" = "xcairo"; then
$as_echo "$as_me: WARNING: can't find freetype, required for graphics=cairo" >&2;}
if test $BUILD_SERVER = win32; then
BUILD_GRAPHICS=winlib
elif test $BUILD_SERVER = wayland; then
as_fn_error $? "wayland backend requires cairo" "$LINENO" 5
else
BUILD_GRAPHICS=xlib
fi
@ -7169,6 +7183,8 @@ $as_echo "$as_me: Switching to $BUILD_GRAPHICS" >&6;}
$as_echo "$as_me: WARNING: can't find cairo, required for graphics=cairo!" >&2;}
if test $BUILD_SERVER = win32; then
BUILD_GRAPHICS=winlib
elif test $BUILD_SERVER = wayland; then
as_fn_error $? "wayland backend requires cairo" "$LINENO" 5
else
BUILD_GRAPHICS=art
fi
@ -7232,6 +7248,132 @@ $as_echo "winlib" >&6; }
CAIRO_CFLAGS="$CAIRO_CFLAGS $CAIRO_XLIB_CFLAGS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: xlib" >&5
$as_echo "xlib" >&6; }
elif test $BUILD_SERVER = wayland; then
for ac_header in wayland-util.h
do :
ac_fn_c_check_header_mongrel "$LINENO" "wayland-util.h" "ac_cv_header_wayland_util_h" "$ac_includes_default"
if test "x$ac_cv_header_wayland_util_h" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_WAYLAND_UTIL_H 1
_ACEOF
else
as_fn_error $? "**** No wayland-util.h. Install libwayland-dev or equivalent." "$LINENO" 5
fi
done
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for wl_display_flush in -lwayland-client" >&5
$as_echo_n "checking for wl_display_flush in -lwayland-client... " >&6; }
if ${ac_cv_lib_wayland_client_wl_display_flush+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lwayland-client $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char wl_display_flush ();
int
main ()
{
return wl_display_flush ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_wayland_client_wl_display_flush=yes
else
ac_cv_lib_wayland_client_wl_display_flush=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_wayland_client_wl_display_flush" >&5
$as_echo "$ac_cv_lib_wayland_client_wl_display_flush" >&6; }
if test "x$ac_cv_lib_wayland_client_wl_display_flush" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_LIBWAYLAND_CLIENT 1
_ACEOF
LIBS="-lwayland-client $LIBS"
else
as_fn_error $? "**** No wl_display_flush in libwayland-client. Install correct version of libwayland-dev or equivalent." "$LINENO" 5
fi
for ac_header in xkbcommon/xkbcommon.h
do :
ac_fn_c_check_header_mongrel "$LINENO" "xkbcommon/xkbcommon.h" "ac_cv_header_xkbcommon_xkbcommon_h" "$ac_includes_default"
if test "x$ac_cv_header_xkbcommon_xkbcommon_h" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_XKBCOMMON_XKBCOMMON_H 1
_ACEOF
else
as_fn_error $? "**** No xkbcommon/xkbcommon.h. Required for wayland. Install libxkbcommon-dev or equivalent." "$LINENO" 5
fi
done
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for xkb_context_new in -lxkbcommon" >&5
$as_echo_n "checking for xkb_context_new in -lxkbcommon... " >&6; }
if ${ac_cv_lib_xkbcommon_xkb_context_new+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lxkbcommon $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char xkb_context_new ();
int
main ()
{
return xkb_context_new ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_xkbcommon_xkb_context_new=yes
else
ac_cv_lib_xkbcommon_xkb_context_new=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_xkbcommon_xkb_context_new" >&5
$as_echo "$ac_cv_lib_xkbcommon_xkb_context_new" >&6; }
if test "x$ac_cv_lib_xkbcommon_xkb_context_new" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_LIBXKBCOMMON 1
_ACEOF
LIBS="-lxkbcommon $LIBS"
else
as_fn_error $? "**** No xkb_context_new in libxkbcommon. Install correct version of libxkbcommon-dev or equivalent." "$LINENO" 5
fi
CAIRO_LIBS="$CAIRO_LIBS $XFT_LIBS"
CAIRO_CFLAGS="$CAIRO_CFLAGS"
LIBS="-lwayland-client -lxkbcommon $LIBS"
else
as_fn_error $? "Invalid Cairo installation" "$LINENO" 5
fi

View file

@ -647,8 +647,17 @@ if test x"$BUILD_GRAPHICS" = "xcairo"; then
CAIRO_CFLAGS="$CAIRO_CFLAGS $CAIRO_XLIB_CFLAGS"
AC_MSG_RESULT(xlib)
elif test $BUILD_SERVER = wayland; then
AC_CHECK_HEADERS(wayland-util.h,,
[AC_MSG_ERROR([**** No wayland-util.h. Install libwayland-dev or equivalent.])])
AC_CHECK_LIB(wayland-client, wl_display_flush,,
[AC_MSG_ERROR([**** No wl_display_flush in libwayland-client. Install correct version of libwayland-dev or equivalent.])])
AC_CHECK_HEADERS(xkbcommon/xkbcommon.h,,
[AC_MSG_ERROR([**** No xkbcommon/xkbcommon.h. Required for wayland. Install libxkbcommon-dev or equivalent.])])
AC_CHECK_LIB(xkbcommon, xkb_context_new,,
[AC_MSG_ERROR([**** No xkb_context_new in libxkbcommon. Install correct version of libxkbcommon-dev or equivalent.])])
CAIRO_LIBS="$CAIRO_LIBS $XFT_LIBS"
CAIRO_CFLAGS="$CAIRO_CFLAGS"
LIBS="-lwayland-client -lxkbcommon $LIBS"
else
AC_MSG_ERROR([Invalid Cairo installation])
fi