• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright © 2016 Giulio Camuffo
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining
5  * a copy of this software and associated documentation files (the
6  * "Software"), to deal in the Software without restriction, including
7  * without limitation the rights to use, copy, modify, merge, publish,
8  * distribute, sublicense, and/or sell copies of the Software, and to
9  * permit persons to whom the Software is furnished to do so, subject to
10  * the following conditions:
11  *
12  * The above copyright notice and this permission notice (including the
13  * next paragraph) shall be included in all copies or substantial
14  * portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19  * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
20  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
21  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23  * SOFTWARE.
24  */
25 
26 #ifndef XWAYLAND_API_H
27 #define XWAYLAND_API_H
28 
29 #ifdef  __cplusplus
30 extern "C" {
31 #endif
32 
33 #include <unistd.h>
34 
35 #include <libweston/plugin-registry.h>
36 
37 struct weston_compositor;
38 struct weston_xwayland;
39 
40 #define WESTON_XWAYLAND_API_NAME "weston_xwayland_v1"
41 #define WESTON_XWAYLAND_SURFACE_API_NAME "weston_xwayland_surface_v1"
42 
43 typedef pid_t
44 (*weston_xwayland_spawn_xserver_func_t)(
45 	void *user_data, const char *display, int abstract_fd, int unix_fd);
46 
47 /** The libweston Xwayland API
48  *
49  * This API allows control of the Xwayland libweston module.
50  * The module must be loaded at runtime with \a weston_compositor_load_xwayland,
51  * after which the API can be retrieved by using \a weston_xwayland_get_api.
52  */
53 struct weston_xwayland_api {
54 	/** Retrieve the Xwayland context object.
55 	 *
56 	 * Note that this function does not create a new object, but always
57 	 * returns the same object per compositor instance.
58 	 * This function cannot fail while this API object is valid.
59 	 *
60 	 * \param compositor The compositor instance.
61 	 */
62 	struct weston_xwayland *
63 	(*get)(struct weston_compositor *compositor);
64 
65 	/** Listen for X connections.
66 	 *
67 	 * This function tells the Xwayland module to begin creating an X socket
68 	 * and start listening for client connections. When one such connection is
69 	 * detected the given \a spawn_func callback will be called to start
70 	 * the Xwayland process.
71 	 *
72 	 * \param xwayland The Xwayland context object.
73 	 * \param user_data The user data pointer to be passed to \a spawn_func.
74 	 * \param spawn_func The callback function called to start the Xwayland
75 	 *                   server process.
76 	 *
77 	 * \return 0 on success, a negative number otherwise.
78 	 */
79 	int
80 	(*listen)(struct weston_xwayland *xwayland, void *user_data,
81 	          weston_xwayland_spawn_xserver_func_t spawn_func);
82 
83 	/** Notify the Xwayland module that the Xwayland server is loaded.
84 	 *
85 	 * After the Xwayland server process has been spawned it will notify
86 	 * the parent that is has finished the initialization by sending a
87 	 * SIGUSR1 signal.
88 	 * The caller should listen for that signal and call this function
89 	 * when it is received.
90 	 *
91 	 * \param xwayland The Xwayland context object.
92 	 * \param client The wl_client object representing the connection of
93 	 *               the Xwayland server process.
94 	 * \param wm_fd The file descriptor for the wm.
95 	 */
96 	void
97 	(*xserver_loaded)(struct weston_xwayland *xwayland,
98 			  struct wl_client *client, int wm_fd);
99 
100 	/** Notify the Xwayland module that the Xwayland server has exited.
101 	 *
102 	 * Whenever the Xwayland server process quits this function should be
103 	 * called.
104 	 * The Xwayland module will keep listening for X connections on the
105 	 * socket, and may call the spawn function again.
106 	 *
107 	 * \param xwayland The Xwayland context object.
108 	 * \param exit_status The exit status of the Xwayland server process.
109 	 */
110 	void
111 	(*xserver_exited)(struct weston_xwayland *xwayland, int exit_status);
112 };
113 
114 /** Retrieve the API object for the libweston Xwayland module.
115  *
116  * The module must have been previously loaded by calling
117  * \a weston_compositor_load_xwayland.
118  *
119  * \param compositor The compositor instance.
120  */
121 static inline const struct weston_xwayland_api *
weston_xwayland_get_api(struct weston_compositor * compositor)122 weston_xwayland_get_api(struct weston_compositor *compositor)
123 {
124 	const void *api;
125 	api = weston_plugin_api_get(compositor, WESTON_XWAYLAND_API_NAME,
126 				    sizeof(struct weston_xwayland_api));
127 	/* The cast is necessary to use this function in C++ code */
128 	return (const struct weston_xwayland_api *)api;
129 }
130 
131 /** The libweston Xwayland surface API
132  *
133  * This API allows control of the Xwayland libweston module surfaces.
134  * The module must be loaded at runtime with \a weston_compositor_load_xwayland,
135  * after which the API can be retrieved by using
136  * \a weston_xwayland_surface_get_api.
137  */
138 struct weston_xwayland_surface_api {
139 	/** Check if the surface is an Xwayland surface
140 	 *
141 	 * \param surface The surface.
142 	 */
143 	bool
144 	(*is_xwayland_surface)(struct weston_surface *surface);
145 	/** Notify the Xwayland surface that its position changed.
146 	 *
147 	 * \param surface The Xwayland surface.
148 	 * \param x The x-axis position.
149 	 * \param y The y-axis position.
150 	 */
151 	void
152 	(*send_position)(struct weston_surface *surface, int32_t x, int32_t y);
153 };
154 
155 /** Retrieve the API object for the libweston Xwayland surface.
156  *
157  * The module must have been previously loaded by calling
158  * \a weston_compositor_load_xwayland.
159  *
160  * \param compositor The compositor instance.
161  */
162 static inline const struct weston_xwayland_surface_api *
weston_xwayland_surface_get_api(struct weston_compositor * compositor)163 weston_xwayland_surface_get_api(struct weston_compositor *compositor)
164 {
165 	const void *api;
166 	api = weston_plugin_api_get(compositor, WESTON_XWAYLAND_SURFACE_API_NAME,
167 				    sizeof(struct weston_xwayland_surface_api));
168 	/* The cast is necessary to use this function in C++ code */
169 	return (const struct weston_xwayland_surface_api *)api;
170 }
171 
172 #ifdef  __cplusplus
173 }
174 #endif
175 
176 #endif
177