Kristian Høgsberg | 82f6e8a | 2008-12-19 13:47:53 -0500 | [diff] [blame] | 1 | /* |
| 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øgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 22 | #include <xf86drm.h> |
| 23 | #include <xf86drmMode.h> |
| 24 | #include <libudev.h> |
Kristian Høgsberg | a661f26 | 2010-08-10 14:12:05 -0400 | [diff] [blame] | 25 | #include "wayland-server.h" |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 26 | #include "wayland-util.h" |
| 27 | |
Kristian Høgsberg | 5fcd0aa | 2010-08-09 14:43:33 -0400 | [diff] [blame] | 28 | #define GL_GLEXT_PROTOTYPES |
| 29 | #define EGL_EGLEXT_PROTOTYPES |
| 30 | #include <GLES2/gl2.h> |
| 31 | #include <GLES2/gl2ext.h> |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 32 | #include <EGL/egl.h> |
| 33 | #include <EGL/eglext.h> |
| 34 | |
| 35 | #define ARRAY_LENGTH(a) (sizeof (a) / sizeof (a)[0]) |
| 36 | |
| 37 | struct wlsc_matrix { |
| 38 | GLfloat d[16]; |
| 39 | }; |
| 40 | |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 41 | struct wlsc_surface; |
| 42 | |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 43 | struct wlsc_output { |
Kristian Høgsberg | b313b02 | 2010-12-01 17:07:41 -0500 | [diff] [blame] | 44 | struct wl_object object; |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 45 | struct wl_list link; |
| 46 | struct wlsc_compositor *compositor; |
| 47 | struct wlsc_surface *background; |
| 48 | struct wlsc_matrix matrix; |
| 49 | int32_t x, y, width, height; |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 50 | }; |
| 51 | |
Kristian Høgsberg | 1db21f1 | 2010-08-16 16:08:12 -0400 | [diff] [blame] | 52 | enum wlsc_pointer_type { |
| 53 | WLSC_POINTER_BOTTOM_LEFT, |
| 54 | WLSC_POINTER_BOTTOM_RIGHT, |
| 55 | WLSC_POINTER_BOTTOM, |
| 56 | WLSC_POINTER_DRAGGING, |
| 57 | WLSC_POINTER_LEFT_PTR, |
| 58 | WLSC_POINTER_LEFT, |
| 59 | WLSC_POINTER_RIGHT, |
| 60 | WLSC_POINTER_TOP_LEFT, |
| 61 | WLSC_POINTER_TOP_RIGHT, |
| 62 | WLSC_POINTER_TOP, |
| 63 | WLSC_POINTER_IBEAM, |
| 64 | }; |
| 65 | |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 66 | struct wlsc_input_device { |
Kristian Høgsberg | b313b02 | 2010-12-01 17:07:41 -0500 | [diff] [blame] | 67 | struct wl_input_device input_device; |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 68 | struct wlsc_surface *sprite; |
Kristian Høgsberg | 77fb167 | 2010-08-16 10:38:29 -0400 | [diff] [blame] | 69 | int32_t hotspot_x, hotspot_y; |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 70 | struct wl_list link; |
Kristian Høgsberg | 5b75f1b | 2010-08-04 23:21:41 -0400 | [diff] [blame] | 71 | uint32_t modifier_state; |
Kristian Høgsberg | ae6c8a6 | 2011-01-18 09:08:53 -0500 | [diff] [blame] | 72 | struct wl_selection *selection; |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 73 | }; |
| 74 | |
Kristian Høgsberg | 5fcd0aa | 2010-08-09 14:43:33 -0400 | [diff] [blame] | 75 | struct wlsc_drm { |
Kristian Høgsberg | b313b02 | 2010-12-01 17:07:41 -0500 | [diff] [blame] | 76 | struct wl_object object; |
Kristian Høgsberg | 5fcd0aa | 2010-08-09 14:43:33 -0400 | [diff] [blame] | 77 | int fd; |
| 78 | char *filename; |
| 79 | }; |
| 80 | |
Kristian Høgsberg | 3d5bae0 | 2010-10-06 21:17:40 -0400 | [diff] [blame] | 81 | struct wlsc_shm { |
Kristian Høgsberg | b313b02 | 2010-12-01 17:07:41 -0500 | [diff] [blame] | 82 | struct wl_object object; |
Kristian Høgsberg | 3d5bae0 | 2010-10-06 21:17:40 -0400 | [diff] [blame] | 83 | }; |
| 84 | |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 85 | struct wlsc_compositor { |
Kristian Høgsberg | b313b02 | 2010-12-01 17:07:41 -0500 | [diff] [blame] | 86 | struct wl_compositor compositor; |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 87 | |
Kristian Høgsberg | 5fcd0aa | 2010-08-09 14:43:33 -0400 | [diff] [blame] | 88 | struct wlsc_drm drm; |
Kristian Høgsberg | 3d5bae0 | 2010-10-06 21:17:40 -0400 | [diff] [blame] | 89 | struct wlsc_shm shm; |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 90 | EGLDisplay display; |
| 91 | EGLContext context; |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 92 | GLuint fbo, vbo; |
| 93 | GLuint proj_uniform, tex_uniform; |
Kristian Høgsberg | 8525a50 | 2011-01-14 16:20:21 -0500 | [diff] [blame] | 94 | struct wl_buffer **pointer_buffers; |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 95 | struct wl_display *wl_display; |
| 96 | |
Kristian Høgsberg | 83fc061 | 2010-08-04 22:44:55 -0400 | [diff] [blame] | 97 | /* We implement the shell interface. */ |
Kristian Høgsberg | 77a4a79 | 2010-08-16 16:24:19 -0400 | [diff] [blame] | 98 | struct wl_shell shell; |
Kristian Høgsberg | 83fc061 | 2010-08-04 22:44:55 -0400 | [diff] [blame] | 99 | |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 100 | /* There can be more than one, but not right now... */ |
Kristian Høgsberg | 9c3e8d7 | 2010-12-08 09:48:52 -0500 | [diff] [blame] | 101 | struct wl_input_device *input_device; |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 102 | |
| 103 | struct wl_list output_list; |
| 104 | struct wl_list input_device_list; |
| 105 | struct wl_list surface_list; |
| 106 | |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 107 | /* Repaint state. */ |
| 108 | struct wl_event_source *timer_source; |
| 109 | int repaint_needed; |
| 110 | int repaint_on_timeout; |
| 111 | struct timespec previous_swap; |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 112 | |
Kristian Høgsberg | c9824dd | 2011-02-06 16:54:59 -0500 | [diff] [blame^] | 113 | struct wlsc_switcher *switcher; |
Kristian Høgsberg | 86e0989 | 2010-07-07 09:51:11 -0400 | [diff] [blame] | 114 | uint32_t focus; |
Kristian Høgsberg | ce5325d | 2010-06-14 11:54:00 -0400 | [diff] [blame] | 115 | |
Kristian Høgsberg | caa6442 | 2010-12-01 16:52:15 -0500 | [diff] [blame] | 116 | void (*destroy)(struct wlsc_compositor *ec); |
Kristian Høgsberg | 640609a | 2010-08-09 22:11:47 -0400 | [diff] [blame] | 117 | int (*authenticate)(struct wlsc_compositor *c, uint32_t id); |
Kristian Høgsberg | ce5325d | 2010-06-14 11:54:00 -0400 | [diff] [blame] | 118 | void (*present)(struct wlsc_compositor *c); |
Kristian Høgsberg | 8525a50 | 2011-01-14 16:20:21 -0500 | [diff] [blame] | 119 | struct wl_buffer *(*create_buffer)(struct wlsc_compositor *c, |
| 120 | int32_t width, int32_t height, |
| 121 | struct wl_visual *visual, |
| 122 | const void *data); |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 123 | }; |
| 124 | |
| 125 | #define MODIFIER_CTRL (1 << 8) |
| 126 | #define MODIFIER_ALT (1 << 9) |
Kristian Høgsberg | 5b75f1b | 2010-08-04 23:21:41 -0400 | [diff] [blame] | 127 | #define MODIFIER_SUPER (1 << 10) |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 128 | |
| 129 | struct wlsc_vector { |
| 130 | GLfloat f[4]; |
| 131 | }; |
| 132 | |
Kristian Høgsberg | 0ce2457 | 2011-01-28 15:18:33 -0500 | [diff] [blame] | 133 | enum wlsc_surface_map_type { |
| 134 | WLSC_SURFACE_MAP_UNMAPPED, |
| 135 | WLSC_SURFACE_MAP_TOPLEVEL, |
| 136 | WLSC_SURFACE_MAP_TRANSIENT, |
| 137 | WLSC_SURFACE_MAP_FULLSCREEN |
| 138 | }; |
| 139 | |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 140 | struct wlsc_surface { |
Kristian Høgsberg | b313b02 | 2010-12-01 17:07:41 -0500 | [diff] [blame] | 141 | struct wl_surface surface; |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 142 | struct wlsc_compositor *compositor; |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 143 | GLuint texture; |
Kristian Høgsberg | 83fc061 | 2010-08-04 22:44:55 -0400 | [diff] [blame] | 144 | int32_t x, y, width, height; |
Kristian Høgsberg | 0ce2457 | 2011-01-28 15:18:33 -0500 | [diff] [blame] | 145 | int32_t saved_x, saved_y; |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 146 | struct wl_list link; |
| 147 | struct wlsc_matrix matrix; |
| 148 | struct wlsc_matrix matrix_inv; |
Kristian Høgsberg | 5fcd0aa | 2010-08-09 14:43:33 -0400 | [diff] [blame] | 149 | struct wl_visual *visual; |
Kristian Høgsberg | 3d5bae0 | 2010-10-06 21:17:40 -0400 | [diff] [blame] | 150 | struct wl_buffer *buffer; |
Kristian Høgsberg | 0ce2457 | 2011-01-28 15:18:33 -0500 | [diff] [blame] | 151 | enum wlsc_surface_map_type map_type; |
| 152 | struct wlsc_output *fullscreen_output; |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 153 | }; |
| 154 | |
Kristian Høgsberg | 82f6e8a | 2008-12-19 13:47:53 -0500 | [diff] [blame] | 155 | void |
Kristian Høgsberg | 4cca349 | 2011-01-18 07:53:49 -0500 | [diff] [blame] | 156 | wlsc_surface_update_matrix(struct wlsc_surface *es); |
| 157 | |
| 158 | void |
Kristian Høgsberg | 9c3e8d7 | 2010-12-08 09:48:52 -0500 | [diff] [blame] | 159 | notify_motion(struct wl_input_device *device, |
Kristian Høgsberg | 808fd41 | 2010-07-20 17:06:19 -0400 | [diff] [blame] | 160 | uint32_t time, int x, int y); |
Kristian Høgsberg | 82f6e8a | 2008-12-19 13:47:53 -0500 | [diff] [blame] | 161 | void |
Kristian Høgsberg | 9c3e8d7 | 2010-12-08 09:48:52 -0500 | [diff] [blame] | 162 | notify_button(struct wl_input_device *device, |
Kristian Høgsberg | 808fd41 | 2010-07-20 17:06:19 -0400 | [diff] [blame] | 163 | uint32_t time, int32_t button, int32_t state); |
Kristian Høgsberg | 82f6e8a | 2008-12-19 13:47:53 -0500 | [diff] [blame] | 164 | void |
Kristian Høgsberg | 9c3e8d7 | 2010-12-08 09:48:52 -0500 | [diff] [blame] | 165 | notify_key(struct wl_input_device *device, |
Kristian Høgsberg | 808fd41 | 2010-07-20 17:06:19 -0400 | [diff] [blame] | 166 | uint32_t time, uint32_t key, uint32_t state); |
Kristian Høgsberg | 82f6e8a | 2008-12-19 13:47:53 -0500 | [diff] [blame] | 167 | |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 168 | void |
Kristian Høgsberg | 93331ff | 2011-01-26 20:35:07 -0500 | [diff] [blame] | 169 | notify_pointer_focus(struct wl_input_device *device, |
| 170 | uint32_t time, |
| 171 | struct wlsc_output *output, |
| 172 | int32_t x, int32_t y); |
| 173 | |
| 174 | void |
Kristian Høgsberg | 3ba4858 | 2011-01-27 11:57:19 -0500 | [diff] [blame] | 175 | notify_keyboard_focus(struct wl_input_device *device, |
| 176 | uint32_t time, struct wlsc_output *output, |
| 177 | struct wl_array *keys); |
| 178 | |
| 179 | void |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 180 | wlsc_compositor_finish_frame(struct wlsc_compositor *compositor, int msecs); |
Kristian Høgsberg | 86e0989 | 2010-07-07 09:51:11 -0400 | [diff] [blame] | 181 | void |
| 182 | wlsc_compositor_schedule_repaint(struct wlsc_compositor *compositor); |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 183 | |
Kristian Høgsberg | 4cca349 | 2011-01-18 07:53:49 -0500 | [diff] [blame] | 184 | void |
| 185 | wlsc_input_device_set_pointer_image(struct wlsc_input_device *device, |
| 186 | enum wlsc_pointer_type type); |
| 187 | struct wlsc_surface * |
| 188 | pick_surface(struct wl_input_device *device, int32_t *sx, int32_t *sy); |
| 189 | |
Kristian Høgsberg | ae6c8a6 | 2011-01-18 09:08:53 -0500 | [diff] [blame] | 190 | void |
| 191 | wlsc_selection_set_focus(struct wl_selection *selection, |
| 192 | struct wl_surface *surface, uint32_t time); |
| 193 | |
Kristian Høgsberg | 4cca349 | 2011-01-18 07:53:49 -0500 | [diff] [blame] | 194 | uint32_t |
| 195 | get_time(void); |
| 196 | |
Kristian Høgsberg | 8525a50 | 2011-01-14 16:20:21 -0500 | [diff] [blame] | 197 | struct wl_buffer * |
Kristian Høgsberg | 3d5bae0 | 2010-10-06 21:17:40 -0400 | [diff] [blame] | 198 | wlsc_drm_buffer_create(struct wlsc_compositor *ec, |
Kristian Høgsberg | 8525a50 | 2011-01-14 16:20:21 -0500 | [diff] [blame] | 199 | int width, int height, |
| 200 | struct wl_visual *visual, const void *data); |
Kristian Høgsberg | 3d5bae0 | 2010-10-06 21:17:40 -0400 | [diff] [blame] | 201 | |
Kristian Høgsberg | ce5325d | 2010-06-14 11:54:00 -0400 | [diff] [blame] | 202 | int |
| 203 | wlsc_compositor_init(struct wlsc_compositor *ec, struct wl_display *display); |
| 204 | void |
| 205 | wlsc_output_init(struct wlsc_output *output, struct wlsc_compositor *c, |
| 206 | int x, int y, int width, int height); |
| 207 | void |
| 208 | wlsc_input_device_init(struct wlsc_input_device *device, |
| 209 | struct wlsc_compositor *ec); |
Kristian Høgsberg | 5fcd0aa | 2010-08-09 14:43:33 -0400 | [diff] [blame] | 210 | int |
| 211 | wlsc_drm_init(struct wlsc_compositor *ec, int fd, const char *filename); |
Kristian Høgsberg | ce5325d | 2010-06-14 11:54:00 -0400 | [diff] [blame] | 212 | |
Kristian Høgsberg | 3d5bae0 | 2010-10-06 21:17:40 -0400 | [diff] [blame] | 213 | int |
| 214 | wlsc_shm_init(struct wlsc_compositor *ec); |
| 215 | |
Kristian Høgsberg | 4cca349 | 2011-01-18 07:53:49 -0500 | [diff] [blame] | 216 | int |
| 217 | wlsc_shell_init(struct wlsc_compositor *ec); |
| 218 | |
| 219 | void |
| 220 | shell_move(struct wl_client *client, struct wl_shell *shell, |
| 221 | struct wl_surface *surface, |
| 222 | struct wl_input_device *device, uint32_t time); |
| 223 | |
| 224 | void |
| 225 | shell_resize(struct wl_client *client, struct wl_shell *shell, |
| 226 | struct wl_surface *surface, |
| 227 | struct wl_input_device *device, uint32_t time, uint32_t edges); |
| 228 | |
Kristian Høgsberg | 3d5bae0 | 2010-10-06 21:17:40 -0400 | [diff] [blame] | 229 | struct wl_buffer * |
| 230 | wl_buffer_create_drm(struct wlsc_compositor *compositor, |
| 231 | struct wl_visual *visual); |
| 232 | |
Kristian Høgsberg | ce5325d | 2010-06-14 11:54:00 -0400 | [diff] [blame] | 233 | struct wlsc_compositor * |
Kristian Høgsberg | 61a8251 | 2010-10-26 11:26:44 -0400 | [diff] [blame] | 234 | x11_compositor_create(struct wl_display *display, int width, int height); |
Kristian Høgsberg | ce5325d | 2010-06-14 11:54:00 -0400 | [diff] [blame] | 235 | |
| 236 | struct wlsc_compositor * |
Kristian Høgsberg | 61a8251 | 2010-10-26 11:26:44 -0400 | [diff] [blame] | 237 | drm_compositor_create(struct wl_display *display, int connector); |
Kristian Høgsberg | ce5325d | 2010-06-14 11:54:00 -0400 | [diff] [blame] | 238 | |
Benjamin Franzke | ec2e642 | 2010-11-27 19:04:12 +0100 | [diff] [blame] | 239 | struct wlsc_compositor * |
| 240 | wayland_compositor_create(struct wl_display *display, int width, int height); |
| 241 | |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 242 | void |
Kristian Høgsberg | 43db401 | 2011-01-14 14:45:42 -0500 | [diff] [blame] | 243 | evdev_input_add_devices(struct wlsc_compositor *c, struct udev *udev); |
| 244 | |
Kristian Høgsberg | e4762a6 | 2011-01-14 14:59:13 -0500 | [diff] [blame] | 245 | struct tty * |
| 246 | tty_create(struct wlsc_compositor *compositor); |
| 247 | |
| 248 | void |
| 249 | tty_destroy(struct tty *tty); |
| 250 | |
Kristian Høgsberg | 43db401 | 2011-01-14 14:45:42 -0500 | [diff] [blame] | 251 | void |
Kristian Høgsberg | fc783d4 | 2010-06-11 12:56:24 -0400 | [diff] [blame] | 252 | screenshooter_create(struct wlsc_compositor *ec); |
| 253 | |
Kristian Høgsberg | f58d8ca | 2011-01-26 14:37:07 -0500 | [diff] [blame] | 254 | uint32_t * |
| 255 | wlsc_load_image(const char *filename, int width, int height); |
| 256 | |
Kristian Høgsberg | 82f6e8a | 2008-12-19 13:47:53 -0500 | [diff] [blame] | 257 | #endif |