blob: 6a392fcb5f4fedd5e14195d598ea28f0dfc5efe4 [file] [log] [blame]
Kristian Høgsberg82f6e8a2008-12-19 13:47:53 -05001/*
2 * Copyright © 2008 Kristian Høgsberg
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software Foundation,
16 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 */
18
19#ifndef _WAYLAND_SYSTEM_COMPOSITOR_H_
20#define _WAYLAND_SYSTEM_COMPOSITOR_H_
21
Kristian Høgsbergfc783d42010-06-11 12:56:24 -040022#include <libudev.h>
Kristian Høgsberg31bd6c72011-02-13 13:00:51 -050023#include <pixman.h>
Kristian Høgsberga661f262010-08-10 14:12:05 -040024#include "wayland-server.h"
Kristian Høgsbergfc783d42010-06-11 12:56:24 -040025#include "wayland-util.h"
26
Kristian Høgsberg5fcd0aa2010-08-09 14:43:33 -040027#define GL_GLEXT_PROTOTYPES
28#define EGL_EGLEXT_PROTOTYPES
29#include <GLES2/gl2.h>
30#include <GLES2/gl2ext.h>
Kristian Høgsbergfc783d42010-06-11 12:56:24 -040031#include <EGL/egl.h>
32#include <EGL/eglext.h>
33
34#define ARRAY_LENGTH(a) (sizeof (a) / sizeof (a)[0])
35
36struct wlsc_matrix {
37 GLfloat d[16];
38};
39
Kristian Høgsbergfc783d42010-06-11 12:56:24 -040040struct wlsc_surface;
41
Kristian Høgsbergfc783d42010-06-11 12:56:24 -040042struct wlsc_output {
Kristian Høgsbergb313b022010-12-01 17:07:41 -050043 struct wl_object object;
Kristian Høgsbergfc783d42010-06-11 12:56:24 -040044 struct wl_list link;
45 struct wlsc_compositor *compositor;
46 struct wlsc_surface *background;
47 struct wlsc_matrix matrix;
48 int32_t x, y, width, height;
Kristian Høgsberg31bd6c72011-02-13 13:00:51 -050049 pixman_region32_t previous_damage_region;
Benjamin Franzke9c26ff32011-03-15 15:08:41 +010050 uint32_t flags;
Benjamin Franzkeec4d3422011-03-14 12:07:26 +010051 int repaint_needed;
52 int finished;
Benjamin Franzkeeefc36c2011-03-11 16:39:20 +010053
54 int (*prepare_render)(struct wlsc_output *output);
Benjamin Franzkeec4d3422011-03-14 12:07:26 +010055 int (*present)(struct wlsc_output *output);
Kristian Høgsbergfc783d42010-06-11 12:56:24 -040056};
57
Kristian Høgsberg1db21f12010-08-16 16:08:12 -040058enum wlsc_pointer_type {
59 WLSC_POINTER_BOTTOM_LEFT,
60 WLSC_POINTER_BOTTOM_RIGHT,
61 WLSC_POINTER_BOTTOM,
62 WLSC_POINTER_DRAGGING,
63 WLSC_POINTER_LEFT_PTR,
64 WLSC_POINTER_LEFT,
65 WLSC_POINTER_RIGHT,
66 WLSC_POINTER_TOP_LEFT,
67 WLSC_POINTER_TOP_RIGHT,
68 WLSC_POINTER_TOP,
69 WLSC_POINTER_IBEAM,
70};
71
Kristian Høgsbergfc783d42010-06-11 12:56:24 -040072struct wlsc_input_device {
Kristian Høgsbergb313b022010-12-01 17:07:41 -050073 struct wl_input_device input_device;
Kristian Høgsbergfc783d42010-06-11 12:56:24 -040074 struct wlsc_surface *sprite;
Kristian Høgsberg77fb1672010-08-16 10:38:29 -040075 int32_t hotspot_x, hotspot_y;
Kristian Høgsbergfc783d42010-06-11 12:56:24 -040076 struct wl_list link;
Kristian Høgsberg5b75f1b2010-08-04 23:21:41 -040077 uint32_t modifier_state;
Kristian Høgsbergae6c8a62011-01-18 09:08:53 -050078 struct wl_selection *selection;
Kristian Høgsbergfc783d42010-06-11 12:56:24 -040079};
80
Kristian Høgsberg3d5bae02010-10-06 21:17:40 -040081struct wlsc_shm {
Kristian Høgsbergb313b022010-12-01 17:07:41 -050082 struct wl_object object;
Kristian Høgsberg3d5bae02010-10-06 21:17:40 -040083};
84
Kristian Høgsbergfc783d42010-06-11 12:56:24 -040085struct wlsc_compositor {
Kristian Høgsbergb313b022010-12-01 17:07:41 -050086 struct wl_compositor compositor;
Kristian Høgsbergfc783d42010-06-11 12:56:24 -040087
Kristian Høgsberg3d5bae02010-10-06 21:17:40 -040088 struct wlsc_shm shm;
Kristian Høgsbergfc783d42010-06-11 12:56:24 -040089 EGLDisplay display;
90 EGLContext context;
Benjamin Franzkebe014562011-02-18 17:04:24 +010091 EGLConfig config;
Kristian Høgsbergfa4e2a72011-02-13 13:44:55 -050092 GLuint fbo;
Kristian Høgsbergfc783d42010-06-11 12:56:24 -040093 GLuint proj_uniform, tex_uniform;
Kristian Høgsberg8525a502011-01-14 16:20:21 -050094 struct wl_buffer **pointer_buffers;
Kristian Høgsbergfc783d42010-06-11 12:56:24 -040095 struct wl_display *wl_display;
96
Kristian Høgsberg83fc0612010-08-04 22:44:55 -040097 /* We implement the shell interface. */
Kristian Høgsberg77a4a792010-08-16 16:24:19 -040098 struct wl_shell shell;
Kristian Høgsberg83fc0612010-08-04 22:44:55 -040099
Kristian Høgsbergfc783d42010-06-11 12:56:24 -0400100 /* There can be more than one, but not right now... */
Kristian Høgsberg9c3e8d72010-12-08 09:48:52 -0500101 struct wl_input_device *input_device;
Kristian Høgsbergfc783d42010-06-11 12:56:24 -0400102
103 struct wl_list output_list;
104 struct wl_list input_device_list;
105 struct wl_list surface_list;
106
Kristian Høgsbergfc783d42010-06-11 12:56:24 -0400107 /* Repaint state. */
108 struct wl_event_source *timer_source;
Kristian Høgsbergfc783d42010-06-11 12:56:24 -0400109 int repaint_on_timeout;
110 struct timespec previous_swap;
Kristian Høgsberg31bd6c72011-02-13 13:00:51 -0500111 pixman_region32_t damage_region;
Kristian Høgsberg525e4c02011-02-14 10:39:54 -0500112 struct wl_array vertices, indices;
Kristian Høgsbergfc783d42010-06-11 12:56:24 -0400113
Kristian Høgsbergc9824dd2011-02-06 16:54:59 -0500114 struct wlsc_switcher *switcher;
Kristian Høgsberg86e09892010-07-07 09:51:11 -0400115 uint32_t focus;
Kristian Høgsbergce5325d2010-06-14 11:54:00 -0400116
Kristian Høgsbergcaa64422010-12-01 16:52:15 -0500117 void (*destroy)(struct wlsc_compositor *ec);
Kristian Høgsberg640609a2010-08-09 22:11:47 -0400118 int (*authenticate)(struct wlsc_compositor *c, uint32_t id);
Kristian Høgsberg8525a502011-01-14 16:20:21 -0500119 struct wl_buffer *(*create_buffer)(struct wlsc_compositor *c,
120 int32_t width, int32_t height,
Benjamin Franzkec649a922011-03-02 11:56:04 +0100121 int32_t stride, struct wl_visual *visual,
122 void *data);
Kristian Høgsbergfc783d42010-06-11 12:56:24 -0400123};
124
125#define MODIFIER_CTRL (1 << 8)
126#define MODIFIER_ALT (1 << 9)
Kristian Høgsberg5b75f1b2010-08-04 23:21:41 -0400127#define MODIFIER_SUPER (1 << 10)
Kristian Høgsbergfc783d42010-06-11 12:56:24 -0400128
Benjamin Franzke1b765ff2011-02-18 16:51:37 +0100129enum wlsc_output_flags {
130 WL_OUTPUT_FLIPPED = 0x01
131};
132
Kristian Høgsbergfc783d42010-06-11 12:56:24 -0400133struct wlsc_vector {
134 GLfloat f[4];
135};
136
Kristian Høgsberg0ce24572011-01-28 15:18:33 -0500137enum wlsc_surface_map_type {
138 WLSC_SURFACE_MAP_UNMAPPED,
139 WLSC_SURFACE_MAP_TOPLEVEL,
140 WLSC_SURFACE_MAP_TRANSIENT,
141 WLSC_SURFACE_MAP_FULLSCREEN
142};
143
Kristian Høgsbergfc783d42010-06-11 12:56:24 -0400144struct wlsc_surface {
Kristian Høgsbergb313b022010-12-01 17:07:41 -0500145 struct wl_surface surface;
Kristian Høgsbergfc783d42010-06-11 12:56:24 -0400146 struct wlsc_compositor *compositor;
Kristian Høgsbergfc783d42010-06-11 12:56:24 -0400147 GLuint texture;
Kristian Høgsberg83fc0612010-08-04 22:44:55 -0400148 int32_t x, y, width, height;
Kristian Høgsberg0ce24572011-01-28 15:18:33 -0500149 int32_t saved_x, saved_y;
Kristian Høgsbergfc783d42010-06-11 12:56:24 -0400150 struct wl_list link;
151 struct wlsc_matrix matrix;
152 struct wlsc_matrix matrix_inv;
Kristian Høgsberg5fcd0aa2010-08-09 14:43:33 -0400153 struct wl_visual *visual;
Kristian Høgsberg3d5bae02010-10-06 21:17:40 -0400154 struct wl_buffer *buffer;
Benjamin Franzkeec4d3422011-03-14 12:07:26 +0100155 struct wlsc_output *output;
Kristian Høgsberg0ce24572011-01-28 15:18:33 -0500156 enum wlsc_surface_map_type map_type;
157 struct wlsc_output *fullscreen_output;
Kristian Høgsbergfc783d42010-06-11 12:56:24 -0400158};
159
Kristian Høgsberg82f6e8a2008-12-19 13:47:53 -0500160void
Kristian Høgsberg4cca3492011-01-18 07:53:49 -0500161wlsc_surface_update_matrix(struct wlsc_surface *es);
162
163void
Kristian Høgsberg9c3e8d72010-12-08 09:48:52 -0500164notify_motion(struct wl_input_device *device,
Kristian Høgsberg808fd412010-07-20 17:06:19 -0400165 uint32_t time, int x, int y);
Kristian Høgsberg82f6e8a2008-12-19 13:47:53 -0500166void
Kristian Høgsberg9c3e8d72010-12-08 09:48:52 -0500167notify_button(struct wl_input_device *device,
Kristian Høgsberg808fd412010-07-20 17:06:19 -0400168 uint32_t time, int32_t button, int32_t state);
Kristian Høgsberg82f6e8a2008-12-19 13:47:53 -0500169void
Kristian Høgsberg9c3e8d72010-12-08 09:48:52 -0500170notify_key(struct wl_input_device *device,
Kristian Høgsberg808fd412010-07-20 17:06:19 -0400171 uint32_t time, uint32_t key, uint32_t state);
Kristian Høgsberg82f6e8a2008-12-19 13:47:53 -0500172
Kristian Høgsbergfc783d42010-06-11 12:56:24 -0400173void
Kristian Høgsberg93331ff2011-01-26 20:35:07 -0500174notify_pointer_focus(struct wl_input_device *device,
175 uint32_t time,
176 struct wlsc_output *output,
177 int32_t x, int32_t y);
178
179void
Kristian Høgsberg3ba48582011-01-27 11:57:19 -0500180notify_keyboard_focus(struct wl_input_device *device,
181 uint32_t time, struct wlsc_output *output,
182 struct wl_array *keys);
183
184void
Benjamin Franzkeec4d3422011-03-14 12:07:26 +0100185wlsc_output_finish_frame(struct wlsc_output *output, int msecs);
Kristian Høgsberg86e09892010-07-07 09:51:11 -0400186void
187wlsc_compositor_schedule_repaint(struct wlsc_compositor *compositor);
Kristian Høgsbergfc783d42010-06-11 12:56:24 -0400188
Kristian Høgsberg4cca3492011-01-18 07:53:49 -0500189void
Benjamin Franzkeec4d3422011-03-14 12:07:26 +0100190wlsc_surface_assign_output(struct wlsc_surface *surface);
191
192void
Kristian Høgsberg31bd6c72011-02-13 13:00:51 -0500193wlsc_surface_damage(struct wlsc_surface *surface);
194
195void
196wlsc_surface_damage_rectangle(struct wlsc_surface *surface,
197 int32_t x, int32_t y,
198 int32_t width, int32_t height);
199
200void
Kristian Høgsberg4cca3492011-01-18 07:53:49 -0500201wlsc_input_device_set_pointer_image(struct wlsc_input_device *device,
202 enum wlsc_pointer_type type);
203struct wlsc_surface *
204pick_surface(struct wl_input_device *device, int32_t *sx, int32_t *sy);
205
Kristian Høgsbergae6c8a62011-01-18 09:08:53 -0500206void
207wlsc_selection_set_focus(struct wl_selection *selection,
208 struct wl_surface *surface, uint32_t time);
209
Kristian Høgsberg4cca3492011-01-18 07:53:49 -0500210uint32_t
211get_time(void);
212
Kristian Høgsberg8525a502011-01-14 16:20:21 -0500213struct wl_buffer *
Benjamin Franzkec649a922011-03-02 11:56:04 +0100214wlsc_shm_buffer_create(struct wlsc_compositor *ec,
215 int32_t width, int32_t height,
216 int32_t stride, struct wl_visual *visual,
217 void *data);
Kristian Høgsberg3d5bae02010-10-06 21:17:40 -0400218
Kristian Høgsbergce5325d2010-06-14 11:54:00 -0400219int
220wlsc_compositor_init(struct wlsc_compositor *ec, struct wl_display *display);
221void
Benjamin Franzke9c26ff32011-03-15 15:08:41 +0100222wlsc_output_move(struct wlsc_output *output, int x, int y);
223void
Kristian Høgsbergce5325d2010-06-14 11:54:00 -0400224wlsc_output_init(struct wlsc_output *output, struct wlsc_compositor *c,
Benjamin Franzke1b765ff2011-02-18 16:51:37 +0100225 int x, int y, int width, int height, uint32_t flags);
Kristian Høgsbergce5325d2010-06-14 11:54:00 -0400226void
Benjamin Franzke9c26ff32011-03-15 15:08:41 +0100227wlsc_output_destroy(struct wlsc_output *output);
228
229void
Kristian Høgsbergce5325d2010-06-14 11:54:00 -0400230wlsc_input_device_init(struct wlsc_input_device *device,
231 struct wlsc_compositor *ec);
232
Kristian Høgsberg3d5bae02010-10-06 21:17:40 -0400233int
234wlsc_shm_init(struct wlsc_compositor *ec);
235
Kristian Høgsberg4cca3492011-01-18 07:53:49 -0500236int
237wlsc_shell_init(struct wlsc_compositor *ec);
238
239void
240shell_move(struct wl_client *client, struct wl_shell *shell,
241 struct wl_surface *surface,
242 struct wl_input_device *device, uint32_t time);
243
244void
245shell_resize(struct wl_client *client, struct wl_shell *shell,
246 struct wl_surface *surface,
247 struct wl_input_device *device, uint32_t time, uint32_t edges);
248
Kristian Høgsbergce5325d2010-06-14 11:54:00 -0400249struct wlsc_compositor *
Kristian Høgsberg61a82512010-10-26 11:26:44 -0400250x11_compositor_create(struct wl_display *display, int width, int height);
Kristian Høgsbergce5325d2010-06-14 11:54:00 -0400251
252struct wlsc_compositor *
Kristian Høgsberg61a82512010-10-26 11:26:44 -0400253drm_compositor_create(struct wl_display *display, int connector);
Kristian Høgsbergce5325d2010-06-14 11:54:00 -0400254
Benjamin Franzkeec2e6422010-11-27 19:04:12 +0100255struct wlsc_compositor *
256wayland_compositor_create(struct wl_display *display, int width, int height);
257
Kristian Høgsbergfc783d42010-06-11 12:56:24 -0400258void
Kristian Høgsberg43db4012011-01-14 14:45:42 -0500259evdev_input_add_devices(struct wlsc_compositor *c, struct udev *udev);
260
Kristian Høgsberge4762a62011-01-14 14:59:13 -0500261struct tty *
262tty_create(struct wlsc_compositor *compositor);
263
264void
265tty_destroy(struct tty *tty);
266
Kristian Høgsberg43db4012011-01-14 14:45:42 -0500267void
Kristian Høgsbergfc783d42010-06-11 12:56:24 -0400268screenshooter_create(struct wlsc_compositor *ec);
269
Kristian Høgsbergf58d8ca2011-01-26 14:37:07 -0500270uint32_t *
271wlsc_load_image(const char *filename, int width, int height);
272
Kristian Høgsberg82f6e8a2008-12-19 13:47:53 -0500273#endif