4c569c6fa0d677651f3c6551c8f65d5544c7b812
[profile/ivi/weston.git] / src / compositor.c
1 /*
2  * Copyright © 2010-2011 Intel Corporation
3  * Copyright © 2008-2011 Kristian Høgsberg
4  * Copyright © 2012 Collabora, Ltd.
5  *
6  * Permission to use, copy, modify, distribute, and sell this software and
7  * its documentation for any purpose is hereby granted without fee, provided
8  * that the above copyright notice appear in all copies and that both that
9  * copyright notice and this permission notice appear in supporting
10  * documentation, and that the name of the copyright holders not be used in
11  * advertising or publicity pertaining to distribution of the software
12  * without specific, written prior permission.  The copyright holders make
13  * no representations about the suitability of this software for any
14  * purpose.  It is provided "as is" without express or implied warranty.
15  *
16  * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
17  * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
18  * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
19  * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
20  * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
21  * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
22  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23  */
24
25 #define _GNU_SOURCE
26
27 #include "config.h"
28
29 #include <fcntl.h>
30 #include <stdio.h>
31 #include <string.h>
32 #include <stdlib.h>
33 #include <stdint.h>
34 #include <limits.h>
35 #include <stdarg.h>
36 #include <assert.h>
37 #include <sys/ioctl.h>
38 #include <sys/mman.h>
39 #include <sys/wait.h>
40 #include <sys/socket.h>
41 #include <sys/utsname.h>
42 #include <sys/stat.h>
43 #include <unistd.h>
44 #include <math.h>
45 #include <linux/input.h>
46 #include <dlfcn.h>
47 #include <signal.h>
48 #include <setjmp.h>
49 #include <sys/time.h>
50 #include <time.h>
51 #include <ctype.h>
52
53 #include <wayland-server.h>
54 #include "compositor.h"
55 #include "../shared/os-compatibility.h"
56 #include "log.h"
57 #include "git-version.h"
58
59 static struct wl_list child_process_list;
60 static jmp_buf segv_jmp_buf;
61
62 static int
63 sigchld_handler(int signal_number, void *data)
64 {
65         struct weston_process *p;
66         int status;
67         pid_t pid;
68
69         pid = waitpid(-1, &status, WNOHANG);
70         if (!pid)
71                 return 1;
72
73         wl_list_for_each(p, &child_process_list, link) {
74                 if (p->pid == pid)
75                         break;
76         }
77
78         if (&p->link == &child_process_list) {
79                 weston_log("unknown child process exited\n");
80                 return 1;
81         }
82
83         wl_list_remove(&p->link);
84         p->cleanup(p, status);
85
86         return 1;
87 }
88
89 WL_EXPORT int
90 weston_output_switch_mode(struct weston_output *output, struct weston_mode *mode)
91 {
92         if (!output->switch_mode)
93                 return -1;
94
95         return output->switch_mode(output, mode);
96 }
97
98 WL_EXPORT void
99 weston_watch_process(struct weston_process *process)
100 {
101         wl_list_insert(&child_process_list, &process->link);
102 }
103
104 static void
105 child_client_exec(int sockfd, const char *path)
106 {
107         int clientfd;
108         char s[32];
109         sigset_t allsigs;
110
111         /* do not give our signal mask to the new process */
112         sigfillset(&allsigs);
113         sigprocmask(SIG_UNBLOCK, &allsigs, NULL);
114
115         /* Launch clients as the user. */
116         seteuid(getuid());
117
118         /* SOCK_CLOEXEC closes both ends, so we dup the fd to get a
119          * non-CLOEXEC fd to pass through exec. */
120         clientfd = dup(sockfd);
121         if (clientfd == -1) {
122                 weston_log("compositor: dup failed: %m\n");
123                 return;
124         }
125
126         snprintf(s, sizeof s, "%d", clientfd);
127         setenv("WAYLAND_SOCKET", s, 1);
128
129         if (execl(path, path, NULL) < 0)
130                 weston_log("compositor: executing '%s' failed: %m\n",
131                         path);
132 }
133
134 WL_EXPORT struct wl_client *
135 weston_client_launch(struct weston_compositor *compositor,
136                      struct weston_process *proc,
137                      const char *path,
138                      weston_process_cleanup_func_t cleanup)
139 {
140         int sv[2];
141         pid_t pid;
142         struct wl_client *client;
143
144         if (os_socketpair_cloexec(AF_UNIX, SOCK_STREAM, 0, sv) < 0) {
145                 weston_log("weston_client_launch: "
146                         "socketpair failed while launching '%s': %m\n",
147                         path);
148                 return NULL;
149         }
150
151         pid = fork();
152         if (pid == -1) {
153                 close(sv[0]);
154                 close(sv[1]);
155                 weston_log("weston_client_launch: "
156                         "fork failed while launching '%s': %m\n", path);
157                 return NULL;
158         }
159
160         if (pid == 0) {
161                 child_client_exec(sv[1], path);
162                 exit(-1);
163         }
164
165         close(sv[1]);
166
167         client = wl_client_create(compositor->wl_display, sv[0]);
168         if (!client) {
169                 close(sv[0]);
170                 weston_log("weston_client_launch: "
171                         "wl_client_create failed while launching '%s'.\n",
172                         path);
173                 return NULL;
174         }
175
176         proc->pid = pid;
177         proc->cleanup = cleanup;
178         weston_watch_process(proc);
179
180         return client;
181 }
182
183 static void
184 update_shm_texture(struct weston_surface *surface);
185
186 static void
187 surface_handle_buffer_destroy(struct wl_listener *listener, void *data)
188 {
189         struct weston_surface *es =
190                 container_of(listener, struct weston_surface, 
191                              buffer_destroy_listener);
192
193         if (es->buffer && wl_buffer_is_shm(es->buffer))
194                 update_shm_texture(es);
195
196         es->buffer = NULL;
197 }
198
199 static const pixman_region32_data_t undef_region_data;
200
201 static void
202 undef_region(pixman_region32_t *region)
203 {
204         if (region->data != &undef_region_data)
205                 pixman_region32_fini(region);
206         region->data = (pixman_region32_data_t *) &undef_region_data;
207 }
208
209 static int
210 region_is_undefined(pixman_region32_t *region)
211 {
212         return region->data == &undef_region_data;
213 }
214
215 static void
216 empty_region(pixman_region32_t *region)
217 {
218         if (!region_is_undefined(region))
219                 pixman_region32_fini(region);
220
221         pixman_region32_init(region);
222 }
223
224 WL_EXPORT struct weston_surface *
225 weston_surface_create(struct weston_compositor *compositor)
226 {
227         struct weston_surface *surface;
228
229         surface = calloc(1, sizeof *surface);
230         if (surface == NULL)
231                 return NULL;
232
233         wl_signal_init(&surface->surface.resource.destroy_signal);
234
235         wl_list_init(&surface->link);
236         wl_list_init(&surface->layer_link);
237
238         surface->surface.resource.client = NULL;
239
240         surface->compositor = compositor;
241         surface->image = EGL_NO_IMAGE_KHR;
242         surface->alpha = 1.0;
243         surface->blend = 1;
244         surface->opaque_rect[0] = 0.0;
245         surface->opaque_rect[1] = 0.0;
246         surface->opaque_rect[2] = 0.0;
247         surface->opaque_rect[3] = 0.0;
248         surface->pitch = 1;
249
250         surface->buffer = NULL;
251         surface->output = NULL;
252
253         pixman_region32_init(&surface->damage);
254         pixman_region32_init(&surface->opaque);
255         pixman_region32_init(&surface->clip);
256         undef_region(&surface->input);
257         pixman_region32_init(&surface->transform.opaque);
258         wl_list_init(&surface->frame_callback_list);
259
260         surface->buffer_destroy_listener.notify =
261                 surface_handle_buffer_destroy;
262
263         wl_list_init(&surface->geometry.transformation_list);
264         wl_list_insert(&surface->geometry.transformation_list,
265                        &surface->transform.position.link);
266         weston_matrix_init(&surface->transform.position.matrix);
267         pixman_region32_init(&surface->transform.boundingbox);
268         surface->geometry.dirty = 1;
269
270         return surface;
271 }
272
273 WL_EXPORT void
274 weston_surface_set_color(struct weston_surface *surface,
275                  GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
276 {
277         surface->color[0] = red;
278         surface->color[1] = green;
279         surface->color[2] = blue;
280         surface->color[3] = alpha;
281         surface->shader = &surface->compositor->solid_shader;
282 }
283
284 WL_EXPORT void
285 weston_surface_to_global_float(struct weston_surface *surface,
286                                GLfloat sx, GLfloat sy, GLfloat *x, GLfloat *y)
287 {
288         if (surface->transform.enabled) {
289                 struct weston_vector v = { { sx, sy, 0.0f, 1.0f } };
290
291                 weston_matrix_transform(&surface->transform.matrix, &v);
292
293                 if (fabsf(v.f[3]) < 1e-6) {
294                         weston_log("warning: numerical instability in "
295                                 "weston_surface_to_global(), divisor = %g\n",
296                                 v.f[3]);
297                         *x = 0;
298                         *y = 0;
299                         return;
300                 }
301
302                 *x = v.f[0] / v.f[3];
303                 *y = v.f[1] / v.f[3];
304         } else {
305                 *x = sx + surface->geometry.x;
306                 *y = sy + surface->geometry.y;
307         }
308 }
309
310 WL_EXPORT void
311 weston_surface_damage_below(struct weston_surface *surface)
312 {
313         struct weston_compositor *compositor = surface->compositor;
314         pixman_region32_t damage;
315
316         if (surface->plane != WESTON_PLANE_PRIMARY)
317                 return;
318
319         pixman_region32_init(&damage);
320         pixman_region32_subtract(&damage, &surface->transform.boundingbox,
321                                  &surface->clip);
322         pixman_region32_union(&compositor->damage,
323                               &compositor->damage, &damage);
324         pixman_region32_fini(&damage);
325 }
326
327 static void
328 surface_compute_bbox(struct weston_surface *surface, int32_t sx, int32_t sy,
329                      int32_t width, int32_t height,
330                      pixman_region32_t *bbox)
331 {
332         GLfloat min_x = HUGE_VALF,  min_y = HUGE_VALF;
333         GLfloat max_x = -HUGE_VALF, max_y = -HUGE_VALF;
334         int32_t s[4][2] = {
335                 { sx,         sy },
336                 { sx,         sy + height },
337                 { sx + width, sy },
338                 { sx + width, sy + height }
339         };
340         GLfloat int_x, int_y;
341         int i;
342
343         for (i = 0; i < 4; ++i) {
344                 GLfloat x, y;
345                 weston_surface_to_global_float(surface,
346                                                s[i][0], s[i][1], &x, &y);
347                 if (x < min_x)
348                         min_x = x;
349                 if (x > max_x)
350                         max_x = x;
351                 if (y < min_y)
352                         min_y = y;
353                 if (y > max_y)
354                         max_y = y;
355         }
356
357         int_x = floorf(min_x);
358         int_y = floorf(min_y);
359         pixman_region32_init_rect(bbox, int_x, int_y,
360                                   ceilf(max_x) - int_x, ceilf(max_y) - int_y);
361 }
362
363 static void
364 weston_surface_update_transform_disable(struct weston_surface *surface)
365 {
366         surface->transform.enabled = 0;
367
368         /* round off fractions when not transformed */
369         surface->geometry.x = roundf(surface->geometry.x);
370         surface->geometry.y = roundf(surface->geometry.y);
371
372         pixman_region32_init_rect(&surface->transform.boundingbox,
373                                   surface->geometry.x,
374                                   surface->geometry.y,
375                                   surface->geometry.width,
376                                   surface->geometry.height);
377
378         if (surface->alpha == 1.0) {
379                 pixman_region32_copy(&surface->transform.opaque,
380                                      &surface->opaque);
381                 pixman_region32_translate(&surface->transform.opaque,
382                                           surface->geometry.x,
383                                           surface->geometry.y);
384         }
385 }
386
387 static int
388 weston_surface_update_transform_enable(struct weston_surface *surface)
389 {
390         struct weston_matrix *matrix = &surface->transform.matrix;
391         struct weston_matrix *inverse = &surface->transform.inverse;
392         struct weston_transform *tform;
393
394         surface->transform.enabled = 1;
395
396         /* Otherwise identity matrix, but with x and y translation. */
397         surface->transform.position.matrix.d[12] = surface->geometry.x;
398         surface->transform.position.matrix.d[13] = surface->geometry.y;
399
400         weston_matrix_init(matrix);
401         wl_list_for_each(tform, &surface->geometry.transformation_list, link)
402                 weston_matrix_multiply(matrix, &tform->matrix);
403
404         if (weston_matrix_invert(inverse, matrix) < 0) {
405                 /* Oops, bad total transformation, not invertible */
406                 weston_log("error: weston_surface %p"
407                         " transformation not invertible.\n", surface);
408                 return -1;
409         }
410
411         surface_compute_bbox(surface, 0, 0, surface->geometry.width,
412                              surface->geometry.height,
413                              &surface->transform.boundingbox);
414
415         return 0;
416 }
417
418 WL_EXPORT void
419 weston_surface_update_transform(struct weston_surface *surface)
420 {
421         if (!surface->geometry.dirty)
422                 return;
423
424         surface->geometry.dirty = 0;
425
426         weston_surface_damage_below(surface);
427
428         pixman_region32_fini(&surface->transform.boundingbox);
429         pixman_region32_fini(&surface->transform.opaque);
430         pixman_region32_init(&surface->transform.opaque);
431
432         if (region_is_undefined(&surface->input))
433                 pixman_region32_init_rect(&surface->input, 0, 0, 
434                                           surface->geometry.width,
435                                           surface->geometry.height);
436
437         /* transform.position is always in transformation_list */
438         if (surface->geometry.transformation_list.next ==
439             &surface->transform.position.link &&
440             surface->geometry.transformation_list.prev ==
441             &surface->transform.position.link) {
442                 weston_surface_update_transform_disable(surface);
443         } else {
444                 if (weston_surface_update_transform_enable(surface) < 0)
445                         weston_surface_update_transform_disable(surface);
446         }
447
448         /* weston_surface_damage() without update */
449         pixman_region32_union_rect(&surface->damage, &surface->damage,
450                                    0, 0, surface->geometry.width,
451                                    surface->geometry.height);
452
453         if (weston_surface_is_mapped(surface))
454                 weston_surface_assign_output(surface);
455 }
456
457 WL_EXPORT void
458 weston_surface_to_global_fixed(struct weston_surface *surface,
459                                wl_fixed_t sx, wl_fixed_t sy,
460                                wl_fixed_t *x, wl_fixed_t *y)
461 {
462         GLfloat xf, yf;
463
464         weston_surface_to_global_float(surface,
465                                        wl_fixed_to_double(sx),
466                                        wl_fixed_to_double(sy),
467                                        &xf, &yf);
468         *x = wl_fixed_from_double(xf);
469         *y = wl_fixed_from_double(yf);
470 }
471
472 static void
473 surface_from_global_float(struct weston_surface *surface,
474                           GLfloat x, GLfloat y, GLfloat *sx, GLfloat *sy)
475 {
476         if (surface->transform.enabled) {
477                 struct weston_vector v = { { x, y, 0.0f, 1.0f } };
478
479                 weston_matrix_transform(&surface->transform.inverse, &v);
480
481                 if (fabsf(v.f[3]) < 1e-6) {
482                         weston_log("warning: numerical instability in "
483                                 "weston_surface_from_global(), divisor = %g\n",
484                                 v.f[3]);
485                         *sx = 0;
486                         *sy = 0;
487                         return;
488                 }
489
490                 *sx = v.f[0] / v.f[3];
491                 *sy = v.f[1] / v.f[3];
492         } else {
493                 *sx = x - surface->geometry.x;
494                 *sy = y - surface->geometry.y;
495         }
496 }
497
498 WL_EXPORT void
499 weston_surface_from_global_fixed(struct weston_surface *surface,
500                                  wl_fixed_t x, wl_fixed_t y,
501                                  wl_fixed_t *sx, wl_fixed_t *sy)
502 {
503         GLfloat sxf, syf;
504
505         surface_from_global_float(surface,
506                                   wl_fixed_to_double(x),
507                                   wl_fixed_to_double(y),
508                                   &sxf, &syf);
509         *sx = wl_fixed_from_double(sxf);
510         *sy = wl_fixed_from_double(syf);
511 }
512
513 WL_EXPORT void
514 weston_surface_from_global(struct weston_surface *surface,
515                            int32_t x, int32_t y, int32_t *sx, int32_t *sy)
516 {
517         GLfloat sxf, syf;
518
519         surface_from_global_float(surface, x, y, &sxf, &syf);
520         *sx = floorf(sxf);
521         *sy = floorf(syf);
522 }
523
524 WL_EXPORT void
525 weston_surface_damage(struct weston_surface *surface)
526 {
527         pixman_region32_union_rect(&surface->damage, &surface->damage,
528                                    0, 0, surface->geometry.width,
529                                    surface->geometry.height);
530
531         weston_compositor_schedule_repaint(surface->compositor);
532 }
533
534 WL_EXPORT void
535 weston_surface_configure(struct weston_surface *surface,
536                          GLfloat x, GLfloat y, int width, int height)
537 {
538         surface->geometry.x = x;
539         surface->geometry.y = y;
540         surface->geometry.width = width;
541         surface->geometry.height = height;
542         surface->geometry.dirty = 1;
543 }
544
545 WL_EXPORT void
546 weston_surface_set_position(struct weston_surface *surface,
547                             GLfloat x, GLfloat y)
548 {
549         surface->geometry.x = x;
550         surface->geometry.y = y;
551         surface->geometry.dirty = 1;
552 }
553
554 WL_EXPORT int
555 weston_surface_is_mapped(struct weston_surface *surface)
556 {
557         if (surface->output)
558                 return 1;
559         else
560                 return 0;
561 }
562
563 WL_EXPORT uint32_t
564 weston_compositor_get_time(void)
565 {
566        struct timeval tv;
567
568        gettimeofday(&tv, NULL);
569
570        return tv.tv_sec * 1000 + tv.tv_usec / 1000;
571 }
572
573 static struct weston_surface *
574 weston_compositor_pick_surface(struct weston_compositor *compositor,
575                                wl_fixed_t x, wl_fixed_t y,
576                                wl_fixed_t *sx, wl_fixed_t *sy)
577 {
578         struct weston_surface *surface;
579
580         wl_list_for_each(surface, &compositor->surface_list, link) {
581                 weston_surface_from_global_fixed(surface, x, y, sx, sy);
582                 if (pixman_region32_contains_point(&surface->input,
583                                                    wl_fixed_to_int(*sx),
584                                                    wl_fixed_to_int(*sy),
585                                                    NULL))
586                         return surface;
587         }
588
589         return NULL;
590 }
591
592 static void
593 weston_device_repick(struct wl_seat *seat)
594 {
595         struct weston_seat *ws = (struct weston_seat *) seat;
596         const struct wl_pointer_grab_interface *interface;
597         struct weston_surface *surface, *focus;
598
599         if (!seat->pointer)
600                 return;
601
602         surface = weston_compositor_pick_surface(ws->compositor,
603                                                  seat->pointer->x,
604                                                  seat->pointer->y,
605                                                  &seat->pointer->current_x,
606                                                  &seat->pointer->current_y);
607
608         if (&surface->surface != seat->pointer->current) {
609                 interface = seat->pointer->grab->interface;
610                 seat->pointer->current = &surface->surface;
611                 interface->focus(seat->pointer->grab, &surface->surface,
612                                  seat->pointer->current_x,
613                                  seat->pointer->current_y);
614         }
615
616         focus = (struct weston_surface *) seat->pointer->grab->focus;
617         if (focus)
618                 weston_surface_from_global_fixed(focus,
619                                                  seat->pointer->x,
620                                                  seat->pointer->y,
621                                                  &seat->pointer->grab->x,
622                                                  &seat->pointer->grab->y);
623 }
624
625 static void
626 weston_compositor_repick(struct weston_compositor *compositor)
627 {
628         struct weston_seat *seat;
629
630         if (!compositor->focus)
631                 return;
632
633         wl_list_for_each(seat, &compositor->seat_list, link)
634                 weston_device_repick(&seat->seat);
635 }
636
637 static void
638 weston_surface_unmap(struct weston_surface *surface)
639 {
640         struct weston_seat *seat;
641
642         weston_surface_damage_below(surface);
643         surface->output = NULL;
644         wl_list_remove(&surface->layer_link);
645
646         wl_list_for_each(seat, &surface->compositor->seat_list, link) {
647                 if (seat->seat.keyboard &&
648                     seat->seat.keyboard->focus == &surface->surface)
649                         wl_keyboard_set_focus(seat->seat.keyboard, NULL);
650                 if (seat->seat.pointer &&
651                     seat->seat.pointer->focus == &surface->surface)
652                         wl_pointer_set_focus(seat->seat.pointer,
653                                              NULL,
654                                              wl_fixed_from_int(0),
655                                              wl_fixed_from_int(0));
656         }
657
658         weston_compositor_schedule_repaint(surface->compositor);
659 }
660
661 static void
662 destroy_surface(struct wl_resource *resource)
663 {
664         struct weston_surface *surface =
665                 container_of(resource,
666                              struct weston_surface, surface.resource);
667         struct weston_compositor *compositor = surface->compositor;
668
669         if (weston_surface_is_mapped(surface))
670                 weston_surface_unmap(surface);
671
672         if (surface->texture)
673                 glDeleteTextures(1, &surface->texture);
674
675         if (surface->buffer)
676                 wl_list_remove(&surface->buffer_destroy_listener.link);
677
678         if (surface->image != EGL_NO_IMAGE_KHR)
679                 compositor->destroy_image(compositor->egl_display,
680                                           surface->image);
681
682         pixman_region32_fini(&surface->transform.boundingbox);
683         pixman_region32_fini(&surface->damage);
684         pixman_region32_fini(&surface->opaque);
685         pixman_region32_fini(&surface->clip);
686         if (!region_is_undefined(&surface->input))
687                 pixman_region32_fini(&surface->input);
688
689         free(surface);
690 }
691
692 WL_EXPORT void
693 weston_surface_destroy(struct weston_surface *surface)
694 {
695         /* Not a valid way to destroy a client surface */
696         assert(surface->surface.resource.client == NULL);
697
698         wl_signal_emit(&surface->surface.resource.destroy_signal,
699                        &surface->surface.resource);
700         destroy_surface(&surface->surface.resource);
701 }
702
703 static void
704 weston_surface_attach(struct wl_surface *surface, struct wl_buffer *buffer)
705 {
706         struct weston_surface *es = (struct weston_surface *) surface;
707         struct weston_compositor *ec = es->compositor;
708
709         if (es->buffer) {
710                 weston_buffer_post_release(es->buffer);
711                 wl_list_remove(&es->buffer_destroy_listener.link);
712         }
713
714         es->buffer = buffer;
715
716         if (!buffer) {
717                 if (weston_surface_is_mapped(es))
718                         weston_surface_unmap(es);
719                 if (es->image != EGL_NO_IMAGE_KHR) {
720                         ec->destroy_image(ec->egl_display, es->image);
721                         es->image = NULL;
722                 }
723                 if (es->texture) {
724                         glDeleteTextures(1, &es->texture);
725                         es->texture = 0;
726                 }
727                 return;
728         }
729
730         buffer->busy_count++;
731         wl_signal_add(&es->buffer->resource.destroy_signal,
732                       &es->buffer_destroy_listener);
733
734         if (es->geometry.width != buffer->width ||
735             es->geometry.height != buffer->height) {
736                 undef_region(&es->input);
737                 pixman_region32_fini(&es->opaque);
738                 pixman_region32_init(&es->opaque);
739         }
740
741         if (!es->texture) {
742                 glGenTextures(1, &es->texture);
743                 glBindTexture(GL_TEXTURE_2D, es->texture);
744                 glTexParameteri(GL_TEXTURE_2D,
745                                 GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
746                 glTexParameteri(GL_TEXTURE_2D,
747                                 GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
748                 es->shader = &ec->texture_shader;
749         } else {
750                 glBindTexture(GL_TEXTURE_2D, es->texture);
751         }
752
753         if (wl_buffer_is_shm(buffer)) {
754                 es->pitch = wl_shm_buffer_get_stride(buffer) / 4;
755                 glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT,
756                              es->pitch, es->buffer->height, 0,
757                              GL_BGRA_EXT, GL_UNSIGNED_BYTE, NULL);
758                 if (wl_shm_buffer_get_format(buffer) == WL_SHM_FORMAT_XRGB8888)
759                         es->blend = 0;
760                 else
761                         es->blend = 1;
762         } else {
763                 if (es->image != EGL_NO_IMAGE_KHR)
764                         ec->destroy_image(ec->egl_display, es->image);
765                 es->image = ec->create_image(ec->egl_display, NULL,
766                                              EGL_WAYLAND_BUFFER_WL,
767                                              buffer, NULL);
768
769                 ec->image_target_texture_2d(GL_TEXTURE_2D, es->image);
770
771                 es->pitch = buffer->width;
772         }
773 }
774
775 static int
776 texture_region(struct weston_surface *es, pixman_region32_t *region)
777 {
778         struct weston_compositor *ec = es->compositor;
779         GLfloat *v, inv_width, inv_height;
780         GLfloat sx, sy;
781         pixman_box32_t *rectangles;
782         unsigned int *p;
783         int i, n;
784
785         rectangles = pixman_region32_rectangles(region, &n);
786         v = wl_array_add(&ec->vertices, n * 16 * sizeof *v);
787         p = wl_array_add(&ec->indices, n * 6 * sizeof *p);
788         inv_width = 1.0 / es->pitch;
789         inv_height = 1.0 / es->geometry.height;
790
791         for (i = 0; i < n; i++, v += 16, p += 6) {
792                 surface_from_global_float(es, rectangles[i].x1,
793                                           rectangles[i].y1, &sx, &sy);
794                 v[ 0] = rectangles[i].x1;
795                 v[ 1] = rectangles[i].y1;
796                 v[ 2] = sx * inv_width;
797                 v[ 3] = sy * inv_height;
798
799                 surface_from_global_float(es, rectangles[i].x1,
800                                           rectangles[i].y2, &sx, &sy);
801                 v[ 4] = rectangles[i].x1;
802                 v[ 5] = rectangles[i].y2;
803                 v[ 6] = sx * inv_width;
804                 v[ 7] = sy * inv_height;
805
806                 surface_from_global_float(es, rectangles[i].x2,
807                                           rectangles[i].y1, &sx, &sy);
808                 v[ 8] = rectangles[i].x2;
809                 v[ 9] = rectangles[i].y1;
810                 v[10] = sx * inv_width;
811                 v[11] = sy * inv_height;
812
813                 surface_from_global_float(es, rectangles[i].x2,
814                                           rectangles[i].y2, &sx, &sy);
815                 v[12] = rectangles[i].x2;
816                 v[13] = rectangles[i].y2;
817                 v[14] = sx * inv_width;
818                 v[15] = sy * inv_height;
819
820                 p[0] = i * 4 + 0;
821                 p[1] = i * 4 + 1;
822                 p[2] = i * 4 + 2;
823                 p[3] = i * 4 + 2;
824                 p[4] = i * 4 + 1;
825                 p[5] = i * 4 + 3;
826         }
827
828         return n;
829 }
830
831 WL_EXPORT void
832 weston_surface_draw(struct weston_surface *es, struct weston_output *output,
833                     pixman_region32_t *damage)
834 {
835         GLfloat surface_rect[4] = { 0.0, 1.0, 0.0, 1.0 };
836         struct weston_compositor *ec = es->compositor;
837         GLfloat *v;
838         pixman_region32_t repaint;
839         GLint filter;
840         int n;
841
842         pixman_region32_init(&repaint);
843         pixman_region32_intersect(&repaint,
844                                   &es->transform.boundingbox, damage);
845         pixman_region32_subtract(&repaint, &repaint, &es->clip);
846
847         if (!pixman_region32_not_empty(&repaint))
848                 goto out;
849
850         glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
851         if (es->blend || es->alpha < 1.0)
852                 glEnable(GL_BLEND);
853         else
854                 glDisable(GL_BLEND);
855
856         if (ec->current_shader != es->shader) {
857                 glUseProgram(es->shader->program);
858                 ec->current_shader = es->shader;
859         }
860
861         glUniformMatrix4fv(es->shader->proj_uniform,
862                            1, GL_FALSE, output->matrix.d);
863         glUniform1i(es->shader->tex_uniform, 0);
864         glUniform4fv(es->shader->color_uniform, 1, es->color);
865         glUniform1f(es->shader->alpha_uniform, es->alpha);
866         glUniform1f(es->shader->texwidth_uniform,
867                     (GLfloat)es->geometry.width / es->pitch);
868         if (es->blend)
869                 glUniform4fv(es->shader->opaque_uniform, 1, es->opaque_rect);
870         else
871                 glUniform4fv(es->shader->opaque_uniform, 1, surface_rect);
872
873         if (es->transform.enabled || output->zoom.active)
874                 filter = GL_LINEAR;
875         else
876                 filter = GL_NEAREST;
877
878         n = texture_region(es, &repaint);
879
880         glBindTexture(GL_TEXTURE_2D, es->texture);
881         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);
882         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter);
883
884         v = ec->vertices.data;
885         glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof *v, &v[0]);
886         glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof *v, &v[2]);
887         glEnableVertexAttribArray(0);
888         glEnableVertexAttribArray(1);
889
890         glDrawElements(GL_TRIANGLES, n * 6, GL_UNSIGNED_INT, ec->indices.data);
891
892         glDisableVertexAttribArray(1);
893         glDisableVertexAttribArray(0);
894
895         ec->vertices.size = 0;
896         ec->indices.size = 0;
897
898 out:
899         pixman_region32_fini(&repaint);
900 }
901
902 WL_EXPORT void
903 weston_surface_restack(struct weston_surface *surface, struct wl_list *below)
904 {
905         wl_list_remove(&surface->layer_link);
906         wl_list_insert(below, &surface->layer_link);
907         weston_surface_damage_below(surface);
908         weston_surface_damage(surface);
909 }
910
911 WL_EXPORT void
912 weston_compositor_damage_all(struct weston_compositor *compositor)
913 {
914         struct weston_output *output;
915
916         wl_list_for_each(output, &compositor->output_list, link)
917                 weston_output_damage(output);
918 }
919
920 WL_EXPORT void
921 weston_buffer_post_release(struct wl_buffer *buffer)
922 {
923         if (--buffer->busy_count > 0)
924                 return;
925
926         assert(buffer->resource.client != NULL);
927         wl_resource_queue_event(&buffer->resource, WL_BUFFER_RELEASE);
928 }
929
930 WL_EXPORT void
931 weston_output_damage(struct weston_output *output)
932 {
933         struct weston_compositor *compositor = output->compositor;
934
935         pixman_region32_union(&compositor->damage,
936                               &compositor->damage, &output->region);
937         weston_output_schedule_repaint(output);
938 }
939
940 static void
941 fade_frame(struct weston_animation *animation,
942            struct weston_output *output, uint32_t msecs)
943 {
944         struct weston_compositor *compositor =
945                 container_of(animation,
946                              struct weston_compositor, fade.animation);
947         struct weston_surface *surface;
948
949         if (animation->frame_counter <= 1)
950                 compositor->fade.spring.timestamp = msecs;
951
952         surface = compositor->fade.surface;
953         weston_spring_update(&compositor->fade.spring, msecs);
954         weston_surface_set_color(surface, 0.0, 0.0, 0.0,
955                                  compositor->fade.spring.current);
956         weston_surface_damage(surface);
957
958         if (weston_spring_done(&compositor->fade.spring)) {
959                 compositor->fade.spring.current =
960                         compositor->fade.spring.target;
961                 wl_list_remove(&animation->link);
962                 wl_list_init(&animation->link);
963
964                 if (compositor->fade.spring.current < 0.001) {
965                         destroy_surface(&surface->surface.resource);
966                         compositor->fade.surface = NULL;
967                 } else if (compositor->fade.spring.current > 0.999) {
968                         compositor->state = WESTON_COMPOSITOR_SLEEPING;
969                         wl_signal_emit(&compositor->lock_signal, compositor);
970                 }
971         }
972 }
973
974 static void
975 update_shm_texture(struct weston_surface *surface)
976 {
977 #ifdef GL_UNPACK_ROW_LENGTH
978         pixman_box32_t *rectangles;
979         void *data;
980         int i, n;
981 #endif
982
983         glBindTexture(GL_TEXTURE_2D, surface->texture);
984
985         if (!surface->compositor->has_unpack_subimage) {
986                 glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT,
987                              surface->pitch, surface->buffer->height, 0,
988                              GL_BGRA_EXT, GL_UNSIGNED_BYTE,
989                              wl_shm_buffer_get_data(surface->buffer));
990
991                 return;
992         }
993
994 #ifdef GL_UNPACK_ROW_LENGTH
995         /* Mesa does not define GL_EXT_unpack_subimage */
996         glPixelStorei(GL_UNPACK_ROW_LENGTH, surface->pitch);
997         data = wl_shm_buffer_get_data(surface->buffer);
998         rectangles = pixman_region32_rectangles(&surface->damage, &n);
999         for (i = 0; i < n; i++) {
1000                 glPixelStorei(GL_UNPACK_SKIP_PIXELS, rectangles[i].x1);
1001                 glPixelStorei(GL_UNPACK_SKIP_ROWS, rectangles[i].y1);
1002                 glTexSubImage2D(GL_TEXTURE_2D, 0,
1003                                 rectangles[i].x1, rectangles[i].y1,
1004                                 rectangles[i].x2 - rectangles[i].y1,
1005                                 rectangles[i].y2 - rectangles[i].y1,
1006                                 GL_BGRA_EXT, GL_UNSIGNED_BYTE, data);
1007         }
1008 #endif
1009 }
1010
1011 static void
1012 surface_accumulate_damage(struct weston_surface *surface,
1013                           pixman_region32_t *new_damage,
1014                           pixman_region32_t *opaque)
1015 {
1016         if (surface->buffer && wl_buffer_is_shm(surface->buffer))
1017                 update_shm_texture(surface);
1018
1019         if (surface->transform.enabled) {
1020                 pixman_box32_t *extents;
1021
1022                 extents = pixman_region32_extents(&surface->damage);
1023                 surface_compute_bbox(surface, extents->x1, extents->y1,
1024                                      extents->x2 - extents->x1,
1025                                      extents->y2 - extents->y1,
1026                                      &surface->damage);
1027         } else {
1028                 pixman_region32_translate(&surface->damage,
1029                                           surface->geometry.x,
1030                                           surface->geometry.y);
1031         }
1032
1033         pixman_region32_subtract(&surface->damage, &surface->damage, opaque);
1034         pixman_region32_union(new_damage, new_damage, &surface->damage);
1035         empty_region(&surface->damage);
1036         pixman_region32_copy(&surface->clip, opaque);
1037         pixman_region32_union(opaque, opaque, &surface->transform.opaque);
1038 }
1039
1040 struct weston_frame_callback {
1041         struct wl_resource resource;
1042         struct wl_list link;
1043 };
1044
1045 static void
1046 weston_output_repaint(struct weston_output *output, int msecs)
1047 {
1048         struct weston_compositor *ec = output->compositor;
1049         struct weston_surface *es;
1050         struct weston_layer *layer;
1051         struct weston_animation *animation, *next;
1052         struct weston_frame_callback *cb, *cnext;
1053         struct wl_list frame_callback_list;
1054         pixman_region32_t opaque, new_damage, output_damage;
1055         int32_t width, height;
1056
1057         weston_compositor_update_drag_surfaces(ec);
1058
1059         width = output->current->width +
1060                 output->border.left + output->border.right;
1061         height = output->current->height +
1062                 output->border.top + output->border.bottom;
1063         glViewport(0, 0, width, height);
1064
1065         /* Rebuild the surface list and update surface transforms up front. */
1066         wl_list_init(&ec->surface_list);
1067         wl_list_init(&frame_callback_list);
1068         wl_list_for_each(layer, &ec->layer_list, link) {
1069                 wl_list_for_each(es, &layer->surface_list, layer_link) {
1070                         weston_surface_update_transform(es);
1071                         wl_list_insert(ec->surface_list.prev, &es->link);
1072                         if (es->output == output) {
1073                                 wl_list_insert_list(&frame_callback_list,
1074                                                     &es->frame_callback_list);
1075                                 wl_list_init(&es->frame_callback_list);
1076                         }
1077                 }
1078         }
1079
1080         if (output->assign_planes)
1081                 /*
1082                  * This will queue flips for the fbs and sprites where
1083                  * applicable and clear the damage for those surfaces.
1084                  * The repaint loop below will repaint everything
1085                  * else.
1086                  */
1087                 output->assign_planes(output);
1088
1089         pixman_region32_init(&new_damage);
1090         pixman_region32_init(&opaque);
1091
1092         wl_list_for_each(es, &ec->surface_list, link)
1093                 surface_accumulate_damage(es, &new_damage, &opaque);
1094
1095         pixman_region32_union(&ec->damage, &ec->damage, &new_damage);
1096
1097         pixman_region32_init(&output_damage);
1098         pixman_region32_union(&output_damage,
1099                               &ec->damage, &output->previous_damage);
1100         pixman_region32_copy(&output->previous_damage, &ec->damage);
1101         pixman_region32_intersect(&output_damage,
1102                                   &output_damage, &output->region);
1103         pixman_region32_subtract(&ec->damage, &ec->damage, &output->region);
1104
1105         pixman_region32_fini(&opaque);
1106         pixman_region32_fini(&new_damage);
1107
1108         if (output->dirty)
1109                 weston_output_update_matrix(output);
1110
1111         output->repaint(output, &output_damage);
1112
1113         pixman_region32_fini(&output_damage);
1114
1115         output->repaint_needed = 0;
1116
1117         weston_compositor_repick(ec);
1118         wl_event_loop_dispatch(ec->input_loop, 0);
1119
1120         wl_list_for_each_safe(cb, cnext, &frame_callback_list, link) {
1121                 wl_callback_send_done(&cb->resource, msecs);
1122                 wl_resource_destroy(&cb->resource);
1123         }
1124         wl_list_init(&frame_callback_list);
1125
1126         wl_list_for_each_safe(animation, next, &output->animation_list, link) {
1127                 animation->frame_counter++;
1128                 animation->frame(animation, output, msecs);
1129         }
1130 }
1131
1132 static int
1133 weston_compositor_read_input(int fd, uint32_t mask, void *data)
1134 {
1135         struct weston_compositor *compositor = data;
1136
1137         wl_event_loop_dispatch(compositor->input_loop, 0);
1138
1139         return 1;
1140 }
1141
1142 WL_EXPORT void
1143 weston_output_finish_frame(struct weston_output *output, int msecs)
1144 {
1145         struct weston_compositor *compositor = output->compositor;
1146         struct wl_event_loop *loop =
1147                 wl_display_get_event_loop(compositor->wl_display);
1148         int fd;
1149
1150         output->frame_time = msecs;
1151         if (output->repaint_needed) {
1152                 weston_output_repaint(output, msecs);
1153                 return;
1154         }
1155
1156         output->repaint_scheduled = 0;
1157         if (compositor->input_loop_source)
1158                 return;
1159
1160         fd = wl_event_loop_get_fd(compositor->input_loop);
1161         compositor->input_loop_source =
1162                 wl_event_loop_add_fd(loop, fd, WL_EVENT_READABLE,
1163                                      weston_compositor_read_input, compositor);
1164 }
1165
1166 static void
1167 idle_repaint(void *data)
1168 {
1169         struct weston_output *output = data;
1170
1171         weston_output_finish_frame(output, weston_compositor_get_time());
1172 }
1173
1174 WL_EXPORT void
1175 weston_layer_init(struct weston_layer *layer, struct wl_list *below)
1176 {
1177         wl_list_init(&layer->surface_list);
1178         if (below != NULL)
1179                 wl_list_insert(below, &layer->link);
1180 }
1181
1182 WL_EXPORT void
1183 weston_output_schedule_repaint(struct weston_output *output)
1184 {
1185         struct weston_compositor *compositor = output->compositor;
1186         struct wl_event_loop *loop;
1187
1188         if (compositor->state == WESTON_COMPOSITOR_SLEEPING)
1189                 return;
1190
1191         loop = wl_display_get_event_loop(compositor->wl_display);
1192         output->repaint_needed = 1;
1193         if (output->repaint_scheduled)
1194                 return;
1195
1196         wl_event_loop_add_idle(loop, idle_repaint, output);
1197         output->repaint_scheduled = 1;
1198
1199         if (compositor->input_loop_source) {
1200                 wl_event_source_remove(compositor->input_loop_source);
1201                 compositor->input_loop_source = NULL;
1202         }
1203 }
1204
1205 WL_EXPORT void
1206 weston_compositor_schedule_repaint(struct weston_compositor *compositor)
1207 {
1208         struct weston_output *output;
1209
1210         wl_list_for_each(output, &compositor->output_list, link)
1211                 weston_output_schedule_repaint(output);
1212 }
1213
1214 WL_EXPORT void
1215 weston_compositor_fade(struct weston_compositor *compositor, float tint)
1216 {
1217         struct weston_output *output;
1218         struct weston_surface *surface;
1219
1220         output = container_of(compositor->output_list.next,
1221                              struct weston_output, link);
1222
1223         compositor->fade.spring.target = tint;
1224         if (weston_spring_done(&compositor->fade.spring))
1225                 return;
1226
1227         if (compositor->fade.surface == NULL) {
1228                 surface = weston_surface_create(compositor);
1229                 weston_surface_configure(surface, 0, 0, 8192, 8192);
1230                 weston_surface_set_color(surface, 0.0, 0.0, 0.0, 0.0);
1231                 wl_list_insert(&compositor->fade_layer.surface_list,
1232                                &surface->layer_link);
1233                 weston_surface_assign_output(surface);
1234                 compositor->fade.surface = surface;
1235                 pixman_region32_init(&surface->input);
1236         }
1237
1238         weston_surface_damage(compositor->fade.surface);
1239         if (wl_list_empty(&compositor->fade.animation.link)) {
1240                 compositor->fade.animation.frame_counter = 0;
1241                 wl_list_insert(output->animation_list.prev,
1242                                &compositor->fade.animation.link);
1243         }
1244 }
1245
1246 static void
1247 surface_destroy(struct wl_client *client, struct wl_resource *resource)
1248 {
1249         wl_resource_destroy(resource);
1250 }
1251
1252 static struct wl_resource *
1253 find_resource_for_client(struct wl_list *list, struct wl_client *client)
1254 {
1255         struct wl_resource *r;
1256
1257         wl_list_for_each(r, list, link) {
1258                 if (r->client == client)
1259                         return r;
1260         }
1261
1262         return NULL;
1263 }
1264
1265 static void
1266 weston_surface_update_output_mask(struct weston_surface *es, uint32_t mask)
1267 {
1268         uint32_t different = es->output_mask ^ mask;
1269         uint32_t entered = mask & different;
1270         uint32_t left = es->output_mask & different;
1271         struct weston_output *output;
1272         struct wl_resource *resource = NULL;
1273         struct wl_client *client = es->surface.resource.client;
1274
1275         if (es->surface.resource.client == NULL)
1276                 return;
1277         if (different == 0)
1278                 return;
1279
1280         es->output_mask = mask;
1281         wl_list_for_each(output, &es->compositor->output_list, link) {
1282                 if (1 << output->id & different)
1283                         resource =
1284                                 find_resource_for_client(&output->resource_list,
1285                                                          client);
1286                 if (1 << output->id & entered)
1287                         wl_surface_send_enter(&es->surface.resource, resource);
1288                 if (1 << output->id & left)
1289                         wl_surface_send_leave(&es->surface.resource, resource);
1290         }
1291 }
1292
1293 WL_EXPORT void
1294 weston_surface_assign_output(struct weston_surface *es)
1295 {
1296         struct weston_compositor *ec = es->compositor;
1297         struct weston_output *output, *new_output;
1298         pixman_region32_t region;
1299         uint32_t max, area, mask;
1300         pixman_box32_t *e;
1301
1302         new_output = NULL;
1303         max = 0;
1304         mask = 0;
1305         pixman_region32_init(&region);
1306         wl_list_for_each(output, &ec->output_list, link) {
1307                 pixman_region32_intersect(&region, &es->transform.boundingbox,
1308                                           &output->region);
1309
1310                 e = pixman_region32_extents(&region);
1311                 area = (e->x2 - e->x1) * (e->y2 - e->y1);
1312
1313                 if (area > 0)
1314                         mask |= 1 << output->id;
1315
1316                 if (area >= max) {
1317                         new_output = output;
1318                         max = area;
1319                 }
1320         }
1321         pixman_region32_fini(&region);
1322
1323         es->output = new_output;
1324         weston_surface_update_output_mask(es, mask);
1325 }
1326
1327 static void
1328 surface_attach(struct wl_client *client,
1329                struct wl_resource *resource,
1330                struct wl_resource *buffer_resource, int32_t sx, int32_t sy)
1331 {
1332         struct weston_surface *es = resource->data;
1333         struct wl_buffer *buffer = NULL;
1334
1335         if (buffer_resource)
1336                 buffer = buffer_resource->data;
1337
1338         weston_surface_attach(&es->surface, buffer);
1339
1340         if (buffer && es->configure)
1341                 es->configure(es, sx, sy);
1342 }
1343
1344 static void
1345 surface_damage(struct wl_client *client,
1346                struct wl_resource *resource,
1347                int32_t x, int32_t y, int32_t width, int32_t height)
1348 {
1349         struct weston_surface *es = resource->data;
1350
1351         pixman_region32_union_rect(&es->damage, &es->damage,
1352                                    x, y, width, height);
1353
1354         weston_compositor_schedule_repaint(es->compositor);
1355 }
1356
1357 static void
1358 destroy_frame_callback(struct wl_resource *resource)
1359 {
1360         struct weston_frame_callback *cb = resource->data;
1361
1362         wl_list_remove(&cb->link);
1363         free(cb);
1364 }
1365
1366 static void
1367 surface_frame(struct wl_client *client,
1368               struct wl_resource *resource, uint32_t callback)
1369 {
1370         struct weston_frame_callback *cb;
1371         struct weston_surface *es = resource->data;
1372
1373         cb = malloc(sizeof *cb);
1374         if (cb == NULL) {
1375                 wl_resource_post_no_memory(resource);
1376                 return;
1377         }
1378                 
1379         cb->resource.object.interface = &wl_callback_interface;
1380         cb->resource.object.id = callback;
1381         cb->resource.destroy = destroy_frame_callback;
1382         cb->resource.client = client;
1383         cb->resource.data = cb;
1384
1385         wl_client_add_resource(client, &cb->resource);
1386         wl_list_insert(es->frame_callback_list.prev, &cb->link);
1387 }
1388
1389 static void
1390 surface_set_opaque_region(struct wl_client *client,
1391                           struct wl_resource *resource,
1392                           struct wl_resource *region_resource)
1393 {
1394         struct weston_surface *surface = resource->data;
1395         struct weston_region *region;
1396
1397         pixman_region32_fini(&surface->opaque);
1398
1399         if (region_resource) {
1400                 region = region_resource->data;
1401                 pixman_region32_init_rect(&surface->opaque, 0, 0,
1402                                           surface->geometry.width,
1403                                           surface->geometry.height);
1404                 pixman_region32_intersect(&surface->opaque,
1405                                           &surface->opaque, &region->region);
1406         } else {
1407                 pixman_region32_init(&surface->opaque);
1408         }
1409
1410         surface->geometry.dirty = 1;
1411 }
1412
1413 static void
1414 surface_set_input_region(struct wl_client *client,
1415                          struct wl_resource *resource,
1416                          struct wl_resource *region_resource)
1417 {
1418         struct weston_surface *surface = resource->data;
1419         struct weston_region *region;
1420
1421         if (region_resource) {
1422                 region = region_resource->data;
1423                 pixman_region32_init_rect(&surface->input, 0, 0,
1424                                           surface->geometry.width,
1425                                           surface->geometry.height);
1426                 pixman_region32_intersect(&surface->input,
1427                                           &surface->input, &region->region);
1428         } else {
1429                 pixman_region32_init_rect(&surface->input, 0, 0,
1430                                           surface->geometry.width,
1431                                           surface->geometry.height);
1432         }
1433
1434         weston_compositor_schedule_repaint(surface->compositor);
1435 }
1436
1437 static const struct wl_surface_interface surface_interface = {
1438         surface_destroy,
1439         surface_attach,
1440         surface_damage,
1441         surface_frame,
1442         surface_set_opaque_region,
1443         surface_set_input_region
1444 };
1445
1446 static void
1447 compositor_create_surface(struct wl_client *client,
1448                           struct wl_resource *resource, uint32_t id)
1449 {
1450         struct weston_compositor *ec = resource->data;
1451         struct weston_surface *surface;
1452
1453         surface = weston_surface_create(ec);
1454         if (surface == NULL) {
1455                 wl_resource_post_no_memory(resource);
1456                 return;
1457         }
1458
1459         surface->surface.resource.destroy = destroy_surface;
1460
1461         surface->surface.resource.object.id = id;
1462         surface->surface.resource.object.interface = &wl_surface_interface;
1463         surface->surface.resource.object.implementation =
1464                 (void (**)(void)) &surface_interface;
1465         surface->surface.resource.data = surface;
1466
1467         wl_client_add_resource(client, &surface->surface.resource);
1468 }
1469
1470 static void
1471 destroy_region(struct wl_resource *resource)
1472 {
1473         struct weston_region *region =
1474                 container_of(resource, struct weston_region, resource);
1475
1476         pixman_region32_fini(&region->region);
1477         free(region);
1478 }
1479
1480 static void
1481 region_destroy(struct wl_client *client, struct wl_resource *resource)
1482 {
1483         wl_resource_destroy(resource);
1484 }
1485
1486 static void
1487 region_add(struct wl_client *client, struct wl_resource *resource,
1488            int32_t x, int32_t y, int32_t width, int32_t height)
1489 {
1490         struct weston_region *region = resource->data;
1491
1492         pixman_region32_union_rect(&region->region, &region->region,
1493                                    x, y, width, height);
1494 }
1495
1496 static void
1497 region_subtract(struct wl_client *client, struct wl_resource *resource,
1498                 int32_t x, int32_t y, int32_t width, int32_t height)
1499 {
1500         struct weston_region *region = resource->data;
1501         pixman_region32_t rect;
1502
1503         pixman_region32_init_rect(&rect, x, y, width, height);
1504         pixman_region32_subtract(&region->region, &region->region, &rect);
1505         pixman_region32_fini(&rect);
1506 }
1507
1508 static const struct wl_region_interface region_interface = {
1509         region_destroy,
1510         region_add,
1511         region_subtract
1512 };
1513
1514 static void
1515 compositor_create_region(struct wl_client *client,
1516                          struct wl_resource *resource, uint32_t id)
1517 {
1518         struct weston_region *region;
1519
1520         region = malloc(sizeof *region);
1521         if (region == NULL) {
1522                 wl_resource_post_no_memory(resource);
1523                 return;
1524         }
1525
1526         region->resource.destroy = destroy_region;
1527
1528         region->resource.object.id = id;
1529         region->resource.object.interface = &wl_region_interface;
1530         region->resource.object.implementation =
1531                 (void (**)(void)) &region_interface;
1532         region->resource.data = region;
1533
1534         pixman_region32_init(&region->region);
1535
1536         wl_client_add_resource(client, &region->resource);
1537 }
1538
1539 static const struct wl_compositor_interface compositor_interface = {
1540         compositor_create_surface,
1541         compositor_create_region
1542 };
1543
1544 WL_EXPORT void
1545 weston_compositor_wake(struct weston_compositor *compositor)
1546 {
1547         compositor->state = WESTON_COMPOSITOR_ACTIVE;
1548         weston_compositor_fade(compositor, 0.0);
1549
1550         wl_event_source_timer_update(compositor->idle_source,
1551                                      compositor->idle_time * 1000);
1552 }
1553
1554 static void
1555 weston_compositor_dpms_on(struct weston_compositor *compositor)
1556 {
1557         struct weston_output *output;
1558
1559         wl_list_for_each(output, &compositor->output_list, link)
1560                 if (output->set_dpms)
1561                         output->set_dpms(output, WESTON_DPMS_ON);
1562 }
1563
1564 WL_EXPORT void
1565 weston_compositor_activity(struct weston_compositor *compositor)
1566 {
1567         if (compositor->state == WESTON_COMPOSITOR_ACTIVE) {
1568                 weston_compositor_wake(compositor);
1569         } else {
1570                 weston_compositor_dpms_on(compositor);
1571                 wl_signal_emit(&compositor->unlock_signal, compositor);
1572         }
1573 }
1574
1575 static void
1576 weston_compositor_idle_inhibit(struct weston_compositor *compositor)
1577 {
1578         weston_compositor_activity(compositor);
1579         compositor->idle_inhibit++;
1580 }
1581
1582 static void
1583 weston_compositor_idle_release(struct weston_compositor *compositor)
1584 {
1585         compositor->idle_inhibit--;
1586         weston_compositor_activity(compositor);
1587 }
1588
1589 static int
1590 idle_handler(void *data)
1591 {
1592         struct weston_compositor *compositor = data;
1593
1594         if (compositor->idle_inhibit)
1595                 return 1;
1596
1597         weston_compositor_fade(compositor, 1.0);
1598
1599         return 1;
1600 }
1601
1602 static  void
1603 weston_seat_update_drag_surface(struct wl_seat *seat, int dx, int dy);
1604
1605 static void
1606 clip_pointer_motion(struct weston_seat *seat, wl_fixed_t *fx, wl_fixed_t *fy)
1607 {
1608         struct weston_compositor *ec = seat->compositor;
1609         struct weston_output *output, *prev = NULL;
1610         int x, y, old_x, old_y, valid = 0;
1611
1612         x = wl_fixed_to_int(*fx);
1613         y = wl_fixed_to_int(*fy);
1614         old_x = wl_fixed_to_int(seat->seat.pointer->x);
1615         old_y = wl_fixed_to_int(seat->seat.pointer->y);
1616
1617         wl_list_for_each(output, &ec->output_list, link) {
1618                 if (pixman_region32_contains_point(&output->region,
1619                                                    x, y, NULL))
1620                         valid = 1;
1621                 if (pixman_region32_contains_point(&output->region,
1622                                                    old_x, old_y, NULL))
1623                         prev = output;
1624         }
1625
1626         if (!valid) {
1627                 if (x < prev->x)
1628                         *fx = wl_fixed_from_int(prev->x);
1629                 else if (x >= prev->x + prev->current->width)
1630                         *fx = wl_fixed_from_int(prev->x +
1631                                                 prev->current->width - 1);
1632                 if (y < prev->y)
1633                         *fy = wl_fixed_from_int(prev->y);
1634                 else if (y >= prev->y + prev->current->height)
1635                         *fy = wl_fixed_from_int(prev->y +
1636                                                 prev->current->height - 1);
1637         }
1638 }
1639
1640 WL_EXPORT void
1641 notify_motion(struct wl_seat *seat, uint32_t time, wl_fixed_t x, wl_fixed_t y)
1642 {
1643         const struct wl_pointer_grab_interface *interface;
1644         struct weston_seat *ws = (struct weston_seat *) seat;
1645         struct weston_compositor *ec = ws->compositor;
1646         struct weston_output *output;
1647         int32_t ix, iy;
1648
1649         weston_compositor_activity(ec);
1650
1651         clip_pointer_motion(ws, &x, &y);
1652
1653         weston_seat_update_drag_surface(seat,
1654                                         x - seat->pointer->x,
1655                                         y - seat->pointer->y);
1656
1657         seat->pointer->x = x;
1658         seat->pointer->y = y;
1659
1660         ix = wl_fixed_to_int(x);
1661         iy = wl_fixed_to_int(y);
1662
1663         wl_list_for_each(output, &ec->output_list, link)
1664                 if (output->zoom.active &&
1665                     pixman_region32_contains_point(&output->region,
1666                                                    ix, iy, NULL))
1667                         weston_output_update_zoom(output, ZOOM_FOCUS_POINTER);
1668
1669         weston_device_repick(seat);
1670         interface = seat->pointer->grab->interface;
1671         interface->motion(seat->pointer->grab, time,
1672                           seat->pointer->grab->x, seat->pointer->grab->y);
1673
1674         if (ws->sprite) {
1675                 weston_surface_set_position(ws->sprite,
1676                                             ix - ws->hotspot_x,
1677                                             iy - ws->hotspot_y);
1678                 weston_compositor_schedule_repaint(ec);
1679         }
1680 }
1681
1682 WL_EXPORT void
1683 weston_surface_activate(struct weston_surface *surface,
1684                         struct weston_seat *seat)
1685 {
1686         struct weston_compositor *compositor = seat->compositor;
1687
1688         if (seat->seat.keyboard) {
1689                 wl_keyboard_set_focus(seat->seat.keyboard, &surface->surface);
1690                 wl_data_device_set_keyboard_focus(&seat->seat);
1691
1692                 if (seat->seat.keyboard->focus_resource) {
1693                         wl_keyboard_send_modifiers(
1694                                 seat->seat.keyboard->focus_resource,
1695                                 wl_display_next_serial(compositor->wl_display),
1696                                 seat->xkb_state.mods_depressed,
1697                                 seat->xkb_state.mods_latched,
1698                                 seat->xkb_state.mods_locked,
1699                                 seat->xkb_state.group);
1700                 }
1701         }
1702
1703         wl_signal_emit(&compositor->activate_signal, surface);
1704 }
1705
1706 WL_EXPORT void
1707 notify_button(struct wl_seat *seat, uint32_t time, int32_t button,
1708               enum wl_pointer_button_state state)
1709 {
1710         struct weston_seat *ws = (struct weston_seat *) seat;
1711         struct weston_compositor *compositor = ws->compositor;
1712         struct weston_surface *focus =
1713                 (struct weston_surface *) seat->pointer->focus;
1714         uint32_t serial = wl_display_next_serial(compositor->wl_display);
1715
1716         if (state == WL_POINTER_BUTTON_STATE_PRESSED) {
1717                 if (compositor->ping_handler && focus)
1718                         compositor->ping_handler(focus, serial);
1719                 weston_compositor_idle_inhibit(compositor);
1720                 if (seat->pointer->button_count == 0) {
1721                         seat->pointer->grab_button = button;
1722                         seat->pointer->grab_time = time;
1723                         seat->pointer->grab_x = seat->pointer->x;
1724                         seat->pointer->grab_y = seat->pointer->y;
1725                 }
1726                 seat->pointer->button_count++;
1727         } else {
1728                 weston_compositor_idle_release(compositor);
1729                 seat->pointer->button_count--;
1730         }
1731
1732         weston_compositor_run_button_binding(compositor, ws, time, button,
1733                                              state);
1734
1735         seat->pointer->grab->interface->button(seat->pointer->grab, time,
1736                                                button, state);
1737
1738         if (seat->pointer->button_count == 1)
1739                 seat->pointer->grab_serial =
1740                         wl_display_get_serial(compositor->wl_display);
1741 }
1742
1743 WL_EXPORT void
1744 notify_axis(struct wl_seat *seat, uint32_t time, uint32_t axis,
1745             wl_fixed_t value)
1746 {
1747         struct weston_seat *ws = (struct weston_seat *) seat;
1748         struct weston_compositor *compositor = ws->compositor;
1749         struct weston_surface *focus =
1750                 (struct weston_surface *) seat->pointer->focus;
1751         uint32_t serial = wl_display_next_serial(compositor->wl_display);
1752
1753         if (compositor->ping_handler && focus)
1754                 compositor->ping_handler(focus, serial);
1755
1756         weston_compositor_activity(compositor);
1757
1758         if (value)
1759                 weston_compositor_run_axis_binding(compositor, ws, time, axis,
1760                                                    value);
1761         else
1762                 return;
1763
1764         if (seat->pointer->focus_resource)
1765                 wl_pointer_send_axis(seat->pointer->focus_resource, time, axis,
1766                                      value);
1767 }
1768
1769 static int
1770 update_modifier_state(struct weston_seat *seat, uint32_t key, uint32_t state)
1771 {
1772         uint32_t mods_depressed, mods_latched, mods_locked, group;
1773         uint32_t mods_lookup;
1774         enum weston_led leds = 0;
1775         int ret = 0;
1776
1777         /* First update the XKB state object with the keypress. */
1778         xkb_state_update_key(seat->xkb_state.state, key + 8,
1779                              state ? XKB_KEY_DOWN : XKB_KEY_UP);
1780
1781         /* Serialize and update our internal state, checking to see if it's
1782          * different to the previous state. */
1783         mods_depressed = xkb_state_serialize_mods(seat->xkb_state.state,
1784                                                   XKB_STATE_DEPRESSED);
1785         mods_latched = xkb_state_serialize_mods(seat->xkb_state.state,
1786                                                 XKB_STATE_LATCHED);
1787         mods_locked = xkb_state_serialize_mods(seat->xkb_state.state,
1788                                                XKB_STATE_LOCKED);
1789         group = xkb_state_serialize_group(seat->xkb_state.state,
1790                                           XKB_STATE_EFFECTIVE);
1791
1792         if (mods_depressed != seat->xkb_state.mods_depressed ||
1793             mods_latched != seat->xkb_state.mods_latched ||
1794             mods_locked != seat->xkb_state.mods_locked ||
1795             group != seat->xkb_state.group)
1796                 ret = 1;
1797
1798         seat->xkb_state.mods_depressed = mods_depressed;
1799         seat->xkb_state.mods_latched = mods_latched;
1800         seat->xkb_state.mods_locked = mods_locked;
1801         seat->xkb_state.group = group;
1802
1803         /* And update the modifier_state for bindings. */
1804         mods_lookup = mods_depressed | mods_latched;
1805         seat->modifier_state = 0;
1806         if (mods_lookup & (1 << seat->xkb_info.ctrl_mod))
1807                 seat->modifier_state |= MODIFIER_CTRL;
1808         if (mods_lookup & (1 << seat->xkb_info.alt_mod))
1809                 seat->modifier_state |= MODIFIER_ALT;
1810         if (mods_lookup & (1 << seat->xkb_info.super_mod))
1811                 seat->modifier_state |= MODIFIER_SUPER;
1812
1813         /* Finally, notify the compositor that LEDs have changed. */
1814         if (xkb_state_led_index_is_active(seat->xkb_state.state,
1815                                           seat->xkb_info.num_led))
1816                 leds |= LED_NUM_LOCK;
1817         if (xkb_state_led_index_is_active(seat->xkb_state.state,
1818                                           seat->xkb_info.caps_led))
1819                 leds |= LED_CAPS_LOCK;
1820         if (xkb_state_led_index_is_active(seat->xkb_state.state,
1821                                           seat->xkb_info.scroll_led))
1822                 leds |= LED_SCROLL_LOCK;
1823         if (leds != seat->xkb_state.leds && seat->led_update)
1824                 seat->led_update(seat, leds);
1825         seat->xkb_state.leds = leds;
1826
1827         return ret;
1828 }
1829
1830 WL_EXPORT void
1831 notify_key(struct wl_seat *seat, uint32_t time, uint32_t key,
1832            enum wl_keyboard_key_state state)
1833 {
1834         struct weston_seat *ws = (struct weston_seat *) seat;
1835         struct weston_compositor *compositor = ws->compositor;
1836         struct weston_surface *focus =
1837                 (struct weston_surface *) seat->pointer->focus;
1838         struct wl_keyboard_grab *grab = seat->keyboard->grab;
1839         uint32_t serial = wl_display_next_serial(compositor->wl_display);
1840         uint32_t *k, *end;
1841         int mods;
1842
1843         if (state == WL_KEYBOARD_KEY_STATE_PRESSED) {
1844                 if (compositor->ping_handler && focus)
1845                         compositor->ping_handler(focus, serial);
1846
1847                 weston_compositor_idle_inhibit(compositor);
1848                 seat->keyboard->grab_key = key;
1849                 seat->keyboard->grab_time = time;
1850         } else {
1851                 weston_compositor_idle_release(compositor);
1852         }
1853
1854         mods = update_modifier_state(ws, key, state);
1855         end = seat->keyboard->keys.data + seat->keyboard->keys.size;
1856         for (k = seat->keyboard->keys.data; k < end; k++) {
1857                 if (*k == key)
1858                         *k = *--end;
1859         }
1860         seat->keyboard->keys.size = (void *) end - seat->keyboard->keys.data;
1861         if (state == WL_KEYBOARD_KEY_STATE_PRESSED) {
1862                 k = wl_array_add(&seat->keyboard->keys, sizeof *k);
1863                 *k = key;
1864         }
1865
1866         if (grab == &seat->keyboard->default_grab) {
1867                 weston_compositor_run_key_binding(compositor, ws, time, key,
1868                                                   state);
1869                 grab = seat->keyboard->grab;
1870         }
1871
1872         grab->interface->key(grab, time, key, state);
1873         if (mods)
1874                 grab->interface->modifiers(grab,
1875                                            wl_display_get_serial(compositor->wl_display),
1876                                            ws->xkb_state.mods_depressed,
1877                                            ws->xkb_state.mods_latched,
1878                                            ws->xkb_state.mods_locked,
1879                                            ws->xkb_state.group);
1880 }
1881
1882 WL_EXPORT void
1883 notify_pointer_focus(struct wl_seat *seat, struct weston_output *output,
1884                      wl_fixed_t x, wl_fixed_t y)
1885 {
1886         struct weston_seat *ws = (struct weston_seat *) seat;
1887         struct weston_compositor *compositor = ws->compositor;
1888
1889         if (output) {
1890                 weston_seat_update_drag_surface(seat,
1891                                                 x - seat->pointer->x,
1892                                                 y - seat->pointer->y);
1893
1894                 seat->pointer->x = x;
1895                 seat->pointer->y = y;
1896                 compositor->focus = 1;
1897                 weston_compositor_repick(compositor);
1898         } else {
1899                 compositor->focus = 0;
1900                 weston_compositor_repick(compositor);
1901         }
1902 }
1903
1904 static void
1905 destroy_device_saved_kbd_focus(struct wl_listener *listener, void *data)
1906 {
1907         struct weston_seat *ws;
1908
1909         ws = container_of(listener, struct weston_seat,
1910                           saved_kbd_focus_listener);
1911
1912         ws->saved_kbd_focus = NULL;
1913 }
1914
1915 WL_EXPORT void
1916 notify_keyboard_focus(struct wl_seat *seat, struct wl_array *keys)
1917 {
1918         struct weston_seat *ws = (struct weston_seat *) seat;
1919         struct weston_compositor *compositor = ws->compositor;
1920         struct wl_surface *surface;
1921         uint32_t *k;
1922
1923         if (keys) {
1924                 wl_array_copy(&seat->keyboard->keys, keys);
1925                 ws->modifier_state = 0;
1926                 wl_array_for_each(k, &seat->keyboard->keys) {
1927                         weston_compositor_idle_inhibit(compositor);
1928                         update_modifier_state(ws, *k, 1);
1929                 }
1930
1931                 surface = ws->saved_kbd_focus;
1932
1933                 if (surface) {
1934                         wl_list_remove(&ws->saved_kbd_focus_listener.link);
1935                         wl_keyboard_set_focus(ws->seat.keyboard, surface);
1936
1937                         if (seat->keyboard->focus_resource) {
1938                                 wl_keyboard_send_modifiers(seat->keyboard->focus_resource,
1939                                                            wl_display_next_serial(compositor->wl_display),
1940                                                            ws->xkb_state.mods_depressed,
1941                                                            ws->xkb_state.mods_latched,
1942                                                            ws->xkb_state.mods_locked,
1943                                                            ws->xkb_state.group);
1944                         }
1945                         ws->saved_kbd_focus = NULL;
1946                 }
1947         } else {
1948                 wl_array_for_each(k, &seat->keyboard->keys)
1949                         weston_compositor_idle_release(compositor);
1950
1951                 ws->modifier_state = 0;
1952
1953                 surface = ws->seat.keyboard->focus;
1954
1955                 if (surface) {
1956                         ws->saved_kbd_focus = surface;
1957                         ws->saved_kbd_focus_listener.notify =
1958                                 destroy_device_saved_kbd_focus;
1959                         wl_signal_add(&surface->resource.destroy_signal,
1960                                       &ws->saved_kbd_focus_listener);
1961                 }
1962
1963                 wl_keyboard_set_focus(ws->seat.keyboard, NULL);
1964                 /* FIXME: We really need keyboard grab cancel here to
1965                  * let the grab shut down properly.  As it is we leak
1966                  * the grab data. */
1967                 wl_keyboard_end_grab(ws->seat.keyboard);
1968         }
1969 }
1970
1971 static void
1972 lose_touch_focus_resource(struct wl_listener *listener, void *data)
1973 {
1974         struct weston_seat *seat = container_of(listener, struct weston_seat,
1975                                                 touch_focus_resource_listener);
1976
1977         seat->touch_focus_resource = NULL;
1978 }
1979
1980 static void
1981 lose_touch_focus(struct wl_listener *listener, void *data)
1982 {
1983         struct weston_seat *seat = container_of(listener, struct weston_seat,
1984                                                 touch_focus_listener);
1985
1986         seat->touch_focus = NULL;
1987 }
1988
1989 static void
1990 touch_set_focus(struct weston_seat *ws, struct wl_surface *surface)
1991 {
1992         struct wl_seat *seat = &ws->seat;
1993         struct wl_resource *resource;
1994
1995         if (ws->touch_focus == surface)
1996                 return;
1997
1998         if (surface) {
1999                 resource =
2000                         find_resource_for_client(&seat->touch->resource_list,
2001                                                  surface->resource.client);
2002                 if (!resource) {
2003                         weston_log("couldn't find resource\n");
2004                         return;
2005                 }
2006
2007                 ws->touch_focus_resource_listener.notify =
2008                         lose_touch_focus_resource;
2009                 wl_signal_add(&resource->destroy_signal,
2010                               &ws->touch_focus_resource_listener);
2011                 ws->touch_focus_listener.notify = lose_touch_focus;
2012                 wl_signal_add(&surface->resource.destroy_signal,
2013                                &ws->touch_focus_listener);
2014
2015                 seat->touch->focus = surface;
2016                 seat->touch->focus_resource = resource;
2017         } else {
2018                 if (seat->touch->focus)
2019                         wl_list_remove(&ws->touch_focus_listener.link);
2020                 if (seat->touch->focus_resource)
2021                         wl_list_remove(&ws->touch_focus_resource_listener.link);
2022                 seat->touch->focus = NULL;
2023                 seat->touch->focus_resource = NULL;
2024         }
2025 }
2026
2027 /**
2028  * notify_touch - emulates button touches and notifies surfaces accordingly.
2029  *
2030  * It assumes always the correct cycle sequence until it gets here: touch_down
2031  * → touch_update → ... → touch_update → touch_end. The driver is responsible
2032  * for sending along such order.
2033  *
2034  */
2035 WL_EXPORT void
2036 notify_touch(struct wl_seat *seat, uint32_t time, int touch_id,
2037              wl_fixed_t x, wl_fixed_t y, int touch_type)
2038 {
2039         struct weston_seat *ws = (struct weston_seat *) seat;
2040         struct weston_compositor *ec = ws->compositor;
2041         struct weston_surface *es;
2042         wl_fixed_t sx, sy;
2043         uint32_t serial = 0;
2044
2045         switch (touch_type) {
2046         case WL_TOUCH_DOWN:
2047                 weston_compositor_idle_inhibit(ec);
2048
2049                 ws->num_tp++;
2050
2051                 /* the first finger down picks the surface, and all further go
2052                  * to that surface for the remainder of the touch session i.e.
2053                  * until all touch points are up again. */
2054                 if (ws->num_tp == 1) {
2055                         es = weston_compositor_pick_surface(ec, x, y, &sx, &sy);
2056                         touch_set_focus(ws, &es->surface);
2057                 } else if (ws->touch_focus) {
2058                         es = (struct weston_surface *) ws->touch_focus;
2059                         weston_surface_from_global_fixed(es, x, y, &sx, &sy);
2060                 }
2061
2062                 if (ws->touch_focus_resource && ws->touch_focus)
2063                         wl_touch_send_down(ws->touch_focus_resource,
2064                                            serial, time,
2065                                            &ws->touch_focus->resource,
2066                                            touch_id, sx, sy);
2067                 break;
2068         case WL_TOUCH_MOTION:
2069                 es = (struct weston_surface *) ws->touch_focus;
2070                 if (!es)
2071                         break;
2072
2073                 weston_surface_from_global_fixed(es, x, y, &sx, &sy);
2074                 if (ws->touch_focus_resource)
2075                         wl_touch_send_motion(ws->touch_focus_resource,
2076                                              time, touch_id, sx, sy);
2077                 break;
2078         case WL_TOUCH_UP:
2079                 weston_compositor_idle_release(ec);
2080                 ws->num_tp--;
2081
2082                 if (ws->touch_focus_resource)
2083                         wl_touch_send_up(ws->touch_focus_resource,
2084                                          serial, time, touch_id);
2085                 if (ws->num_tp == 0)
2086                         touch_set_focus(ws, NULL);
2087                 break;
2088         }
2089 }
2090
2091 static void
2092 pointer_handle_sprite_destroy(struct wl_listener *listener, void *data)
2093 {
2094         struct weston_seat *seat = container_of(listener, struct weston_seat,
2095                                                 sprite_destroy_listener);
2096
2097         seat->sprite = NULL;
2098 }
2099
2100 static void
2101 pointer_cursor_surface_configure(struct weston_surface *es,
2102                                  int32_t dx, int32_t dy)
2103 {
2104         struct weston_seat *seat = es->private;
2105         int x, y;
2106
2107         assert(es == seat->sprite);
2108
2109         seat->hotspot_x -= dx;
2110         seat->hotspot_y -= dy;
2111
2112         x = wl_fixed_to_int(seat->seat.pointer->x) - seat->hotspot_x;
2113         y = wl_fixed_to_int(seat->seat.pointer->y) - seat->hotspot_y;
2114
2115         weston_surface_configure(seat->sprite, x, y,
2116                                  es->buffer->width, es->buffer->height);
2117
2118         if (!weston_surface_is_mapped(es)) {
2119                 wl_list_insert(&es->compositor->cursor_layer.surface_list,
2120                                &es->layer_link);
2121                 weston_surface_assign_output(es);
2122                 empty_region(&es->input);
2123         }
2124 }
2125
2126 static void
2127 pointer_unmap_sprite(struct weston_seat *seat)
2128 {
2129         if (weston_surface_is_mapped(seat->sprite))
2130                 weston_surface_unmap(seat->sprite);
2131
2132         wl_list_remove(&seat->sprite_destroy_listener.link);
2133         seat->sprite->configure = NULL;
2134         seat->sprite->private = NULL;
2135         seat->sprite = NULL;
2136 }
2137
2138 static void
2139 pointer_set_cursor(struct wl_client *client, struct wl_resource *resource,
2140                    uint32_t serial, struct wl_resource *surface_resource,
2141                    int32_t x, int32_t y)
2142 {
2143         struct weston_seat *seat = resource->data;
2144         struct weston_surface *surface = NULL;
2145
2146         if (serial < seat->seat.pointer->focus_serial)
2147                 return;
2148         if (seat->seat.pointer->focus == NULL)
2149                 return;
2150         if (seat->seat.pointer->focus->resource.client != client)
2151                 return;
2152
2153         if (surface_resource)
2154                 surface = container_of(surface_resource->data,
2155                                        struct weston_surface, surface);
2156
2157         if (surface && surface != seat->sprite && surface->configure) {
2158                 wl_resource_post_error(&surface->surface.resource,
2159                                        WL_DISPLAY_ERROR_INVALID_OBJECT,
2160                                        "surface->configure already set");
2161                 return;
2162         }
2163
2164         if (seat->sprite)
2165                 pointer_unmap_sprite(seat);
2166
2167         if (!surface)
2168                 return;
2169
2170         wl_signal_add(&surface->surface.resource.destroy_signal,
2171                       &seat->sprite_destroy_listener);
2172
2173         surface->configure = pointer_cursor_surface_configure;
2174         surface->private = seat;
2175         empty_region(&surface->input);
2176
2177         seat->sprite = surface;
2178         seat->hotspot_x = x;
2179         seat->hotspot_y = y;
2180
2181         weston_surface_set_position(surface,
2182                                     wl_fixed_to_int(seat->seat.pointer->x) - x,
2183                                     wl_fixed_to_int(seat->seat.pointer->y) - y);
2184 }
2185
2186 static const struct wl_pointer_interface pointer_interface = {
2187         pointer_set_cursor
2188 };
2189
2190 static void
2191 handle_drag_surface_destroy(struct wl_listener *listener, void *data)
2192 {
2193         struct weston_seat *seat;
2194
2195         seat = container_of(listener, struct weston_seat,
2196                             drag_surface_destroy_listener);
2197
2198         seat->drag_surface = NULL;
2199 }
2200
2201 static void unbind_resource(struct wl_resource *resource)
2202 {
2203         wl_list_remove(&resource->link);
2204         free(resource);
2205 }
2206
2207 static void
2208 seat_get_pointer(struct wl_client *client, struct wl_resource *resource,
2209                  uint32_t id)
2210 {
2211         struct weston_seat *seat = resource->data;
2212         struct wl_resource *cr;
2213
2214         if (!seat->seat.pointer)
2215                 return;
2216
2217         cr = wl_client_add_object(client, &wl_pointer_interface,
2218                                   &pointer_interface, id, seat);
2219         wl_list_insert(&seat->seat.pointer->resource_list, &cr->link);
2220         cr->destroy = unbind_resource;
2221
2222         if (seat->seat.pointer->focus &&
2223             seat->seat.pointer->focus->resource.client == client) {
2224                 struct weston_surface *surface;
2225                 wl_fixed_t sx, sy;
2226
2227                 surface = (struct weston_surface *) seat->seat.pointer->focus;
2228                 weston_surface_from_global_fixed(surface,
2229                                                  seat->seat.pointer->x,
2230                                                  seat->seat.pointer->y,
2231                                                  &sx,
2232                                                  &sy);
2233                 wl_pointer_set_focus(seat->seat.pointer,
2234                                      seat->seat.pointer->focus,
2235                                      sx,
2236                                      sy);
2237         }
2238 }
2239
2240 static void
2241 seat_get_keyboard(struct wl_client *client, struct wl_resource *resource,
2242                   uint32_t id)
2243 {
2244         struct weston_seat *seat = resource->data;
2245         struct wl_resource *cr;
2246
2247         if (!seat->seat.keyboard)
2248                 return;
2249
2250         cr = wl_client_add_object(client, &wl_keyboard_interface, NULL, id,
2251                                   seat);
2252         wl_list_insert(&seat->seat.keyboard->resource_list, &cr->link);
2253         cr->destroy = unbind_resource;
2254
2255         wl_keyboard_send_keymap(cr, WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1,
2256                                 seat->xkb_info.keymap_fd,
2257                                 seat->xkb_info.keymap_size);
2258
2259         if (seat->seat.keyboard->focus &&
2260             seat->seat.keyboard->focus->resource.client == client) {
2261                 wl_keyboard_set_focus(seat->seat.keyboard,
2262                                       seat->seat.keyboard->focus);
2263         }
2264 }
2265
2266 static void
2267 seat_get_touch(struct wl_client *client, struct wl_resource *resource,
2268                uint32_t id)
2269 {
2270         struct weston_seat *seat = resource->data;
2271         struct wl_resource *cr;
2272
2273         if (!seat->seat.touch)
2274                 return;
2275
2276         cr = wl_client_add_object(client, &wl_touch_interface, NULL, id, seat);
2277         wl_list_insert(&seat->seat.touch->resource_list, &cr->link);
2278         cr->destroy = unbind_resource;
2279 }
2280
2281 static const struct wl_seat_interface seat_interface = {
2282         seat_get_pointer,
2283         seat_get_keyboard,
2284         seat_get_touch,
2285 };
2286
2287 static void
2288 bind_seat(struct wl_client *client, void *data, uint32_t version, uint32_t id)
2289 {
2290         struct wl_seat *seat = data;
2291         struct wl_resource *resource;
2292         enum wl_seat_capability caps = 0;
2293
2294         resource = wl_client_add_object(client, &wl_seat_interface,
2295                                         &seat_interface, id, data);
2296         wl_list_insert(&seat->base_resource_list, &resource->link);
2297         resource->destroy = unbind_resource;
2298
2299         if (seat->pointer)
2300                 caps |= WL_SEAT_CAPABILITY_POINTER;
2301         if (seat->keyboard)
2302                 caps |= WL_SEAT_CAPABILITY_KEYBOARD;
2303         if (seat->touch)
2304                 caps |= WL_SEAT_CAPABILITY_TOUCH;
2305
2306         wl_seat_send_capabilities(resource, caps);
2307 }
2308
2309 static void
2310 device_handle_new_drag_icon(struct wl_listener *listener, void *data)
2311 {
2312         struct weston_seat *seat;
2313
2314         seat = container_of(listener, struct weston_seat,
2315                             new_drag_icon_listener);
2316
2317         weston_seat_update_drag_surface(&seat->seat, 0, 0);
2318 }
2319
2320 static void weston_compositor_xkb_init(struct weston_compositor *ec,
2321                                        struct xkb_rule_names *names)
2322 {
2323         if (ec->xkb_context == NULL) {
2324                 ec->xkb_context = xkb_context_new(0);
2325                 if (ec->xkb_context == NULL) {
2326                         weston_log("failed to create XKB context\n");
2327                         exit(1);
2328                 }
2329         }
2330
2331         if (names)
2332                 ec->xkb_names = *names;
2333         if (!ec->xkb_names.rules)
2334                 ec->xkb_names.rules = strdup("evdev");
2335         if (!ec->xkb_names.model)
2336                 ec->xkb_names.model = strdup("pc105");
2337         if (!ec->xkb_names.layout)
2338                 ec->xkb_names.layout = strdup("us");
2339 }
2340
2341 static void xkb_info_destroy(struct weston_xkb_info *xkb_info)
2342 {
2343         if (xkb_info->keymap)
2344                 xkb_map_unref(xkb_info->keymap);
2345
2346         if (xkb_info->keymap_area)
2347                 munmap(xkb_info->keymap_area, xkb_info->keymap_size);
2348         if (xkb_info->keymap_fd >= 0)
2349                 close(xkb_info->keymap_fd);
2350 }
2351
2352 static void weston_compositor_xkb_destroy(struct weston_compositor *ec)
2353 {
2354         free((char *) ec->xkb_names.rules);
2355         free((char *) ec->xkb_names.model);
2356         free((char *) ec->xkb_names.layout);
2357         free((char *) ec->xkb_names.variant);
2358         free((char *) ec->xkb_names.options);
2359
2360         xkb_info_destroy(&ec->xkb_info);
2361         xkb_context_unref(ec->xkb_context);
2362 }
2363
2364 static void
2365 weston_xkb_info_new_keymap(struct weston_xkb_info *xkb_info)
2366 {
2367         char *keymap_str;
2368
2369         xkb_info->ctrl_mod = xkb_map_mod_get_index(xkb_info->keymap,
2370                                                    XKB_MOD_NAME_CTRL);
2371         xkb_info->alt_mod = xkb_map_mod_get_index(xkb_info->keymap,
2372                                                   XKB_MOD_NAME_ALT);
2373         xkb_info->super_mod = xkb_map_mod_get_index(xkb_info->keymap,
2374                                                     XKB_MOD_NAME_LOGO);
2375
2376         xkb_info->num_led = xkb_map_led_get_index(xkb_info->keymap,
2377                                                   XKB_LED_NAME_NUM);
2378         xkb_info->caps_led = xkb_map_led_get_index(xkb_info->keymap,
2379                                                    XKB_LED_NAME_CAPS);
2380         xkb_info->scroll_led = xkb_map_led_get_index(xkb_info->keymap,
2381                                                      XKB_LED_NAME_SCROLL);
2382
2383         keymap_str = xkb_map_get_as_string(xkb_info->keymap);
2384         if (keymap_str == NULL) {
2385                 weston_log("failed to get string version of keymap\n");
2386                 exit(EXIT_FAILURE);
2387         }
2388         xkb_info->keymap_size = strlen(keymap_str) + 1;
2389
2390         xkb_info->keymap_fd = os_create_anonymous_file(xkb_info->keymap_size);
2391         if (xkb_info->keymap_fd < 0) {
2392                 weston_log("creating a keymap file for %lu bytes failed: %m\n",
2393                         (unsigned long) xkb_info->keymap_size);
2394                 goto err_keymap_str;
2395         }
2396
2397         xkb_info->keymap_area = mmap(NULL, xkb_info->keymap_size,
2398                                      PROT_READ | PROT_WRITE,
2399                                      MAP_SHARED, xkb_info->keymap_fd, 0);
2400         if (xkb_info->keymap_area == MAP_FAILED) {
2401                 weston_log("failed to mmap() %lu bytes\n",
2402                         (unsigned long) xkb_info->keymap_size);
2403                 goto err_dev_zero;
2404         }
2405         strcpy(xkb_info->keymap_area, keymap_str);
2406         free(keymap_str);
2407
2408         return;
2409
2410 err_dev_zero:
2411         close(xkb_info->keymap_fd);
2412         xkb_info->keymap_fd = -1;
2413 err_keymap_str:
2414         free(keymap_str);
2415         exit(EXIT_FAILURE);
2416 }
2417
2418 static void
2419 weston_compositor_build_global_keymap(struct weston_compositor *ec)
2420 {
2421         if (ec->xkb_info.keymap != NULL)
2422                 return;
2423
2424         ec->xkb_info.keymap = xkb_map_new_from_names(ec->xkb_context,
2425                                                      &ec->xkb_names,
2426                                                      0);
2427         if (ec->xkb_info.keymap == NULL) {
2428                 weston_log("failed to compile global XKB keymap\n");
2429                 weston_log("  tried rules %s, model %s, layout %s, variant %s, "
2430                         "options %s",
2431                         ec->xkb_names.rules, ec->xkb_names.model,
2432                         ec->xkb_names.layout, ec->xkb_names.variant,
2433                         ec->xkb_names.options);
2434                 exit(1);
2435         }
2436
2437         weston_xkb_info_new_keymap(&ec->xkb_info);
2438 }
2439
2440 WL_EXPORT void
2441 weston_seat_init_keyboard(struct weston_seat *seat, struct xkb_keymap *keymap)
2442 {
2443         if (seat->has_keyboard)
2444                 return;
2445
2446         if (keymap != NULL) {
2447                 seat->xkb_info.keymap = xkb_map_ref(keymap);
2448                 weston_xkb_info_new_keymap(&seat->xkb_info);
2449         }
2450         else {
2451                 weston_compositor_build_global_keymap(seat->compositor);
2452                 seat->xkb_info = seat->compositor->xkb_info;
2453                 seat->xkb_info.keymap = xkb_map_ref(seat->xkb_info.keymap);
2454         }
2455
2456         seat->xkb_state.state = xkb_state_new(seat->xkb_info.keymap);
2457         if (seat->xkb_state.state == NULL) {
2458                 weston_log("failed to initialise XKB state\n");
2459                 exit(1);
2460         }
2461
2462         seat->xkb_state.mods_depressed = 0;
2463         seat->xkb_state.mods_latched = 0;
2464         seat->xkb_state.mods_locked = 0;
2465         seat->xkb_state.group = 0;
2466
2467         wl_keyboard_init(&seat->keyboard);
2468         wl_seat_set_keyboard(&seat->seat, &seat->keyboard);
2469
2470         seat->has_keyboard = 1;
2471 }
2472
2473 WL_EXPORT void
2474 weston_seat_init_pointer(struct weston_seat *seat)
2475 {
2476         if (seat->has_pointer)
2477                 return;
2478
2479         wl_pointer_init(&seat->pointer);
2480         wl_seat_set_pointer(&seat->seat, &seat->pointer);
2481
2482         seat->has_pointer = 1;
2483 }
2484
2485 WL_EXPORT void
2486 weston_seat_init_touch(struct weston_seat *seat)
2487 {
2488         if (seat->has_touch)
2489                 return;
2490
2491         wl_touch_init(&seat->touch);
2492         wl_seat_set_touch(&seat->seat, &seat->touch);
2493
2494         seat->has_touch = 1;
2495 }
2496
2497 WL_EXPORT void
2498 weston_seat_init(struct weston_seat *seat, struct weston_compositor *ec)
2499 {
2500         wl_seat_init(&seat->seat);
2501         seat->has_pointer = 0;
2502         seat->has_keyboard = 0;
2503         seat->has_touch = 0;
2504
2505         wl_display_add_global(ec->wl_display, &wl_seat_interface, seat,
2506                               bind_seat);
2507
2508         seat->sprite = NULL;
2509         seat->sprite_destroy_listener.notify = pointer_handle_sprite_destroy;
2510
2511         seat->compositor = ec;
2512         seat->hotspot_x = 16;
2513         seat->hotspot_y = 16;
2514         seat->modifier_state = 0;
2515         seat->num_tp = 0;
2516
2517         seat->drag_surface_destroy_listener.notify =
2518                 handle_drag_surface_destroy;
2519
2520         wl_list_insert(ec->seat_list.prev, &seat->link);
2521
2522         seat->new_drag_icon_listener.notify = device_handle_new_drag_icon;
2523         wl_signal_add(&seat->seat.drag_icon_signal,
2524                       &seat->new_drag_icon_listener);
2525
2526         clipboard_create(seat);
2527 }
2528
2529 WL_EXPORT void
2530 weston_seat_release(struct weston_seat *seat)
2531 {
2532         wl_list_remove(&seat->link);
2533         /* The global object is destroyed at wl_display_destroy() time. */
2534
2535         if (seat->sprite)
2536                 pointer_unmap_sprite(seat);
2537
2538         if (seat->xkb_state.state != NULL)
2539                 xkb_state_unref(seat->xkb_state.state);
2540         xkb_info_destroy(&seat->xkb_info);
2541
2542         wl_seat_release(&seat->seat);
2543 }
2544
2545 static void
2546 drag_surface_configure(struct weston_surface *es, int32_t sx, int32_t sy)
2547 {
2548         weston_surface_configure(es,
2549                                  es->geometry.x + sx, es->geometry.y + sy,
2550                                  es->buffer->width, es->buffer->height);
2551 }
2552
2553 static int
2554 device_setup_new_drag_surface(struct weston_seat *ws,
2555                               struct weston_surface *surface)
2556 {
2557         struct wl_seat *seat = &ws->seat;
2558
2559         if (surface->configure) {
2560                 wl_resource_post_error(&surface->surface.resource,
2561                                        WL_DISPLAY_ERROR_INVALID_OBJECT,
2562                                        "surface->configure already set");
2563                 return 0;
2564         }
2565
2566         ws->drag_surface = surface;
2567
2568         weston_surface_set_position(ws->drag_surface,
2569                                     wl_fixed_to_double(seat->pointer->x),
2570                                     wl_fixed_to_double(seat->pointer->y));
2571
2572         surface->configure = drag_surface_configure;
2573
2574         wl_signal_add(&surface->surface.resource.destroy_signal,
2575                        &ws->drag_surface_destroy_listener);
2576
2577         return 1;
2578 }
2579
2580 static void
2581 device_release_drag_surface(struct weston_seat *seat)
2582 {
2583         seat->drag_surface->configure = NULL;
2584         undef_region(&seat->drag_surface->input);
2585         wl_list_remove(&seat->drag_surface_destroy_listener.link);
2586         seat->drag_surface = NULL;
2587 }
2588
2589 static void
2590 device_map_drag_surface(struct weston_seat *seat)
2591 {
2592         struct wl_list *list;
2593
2594         if (weston_surface_is_mapped(seat->drag_surface) ||
2595             !seat->drag_surface->buffer)
2596                 return;
2597
2598         if (seat->sprite && weston_surface_is_mapped(seat->sprite))
2599                 list = &seat->sprite->layer_link;
2600         else
2601                 list = &seat->compositor->cursor_layer.surface_list;
2602
2603         wl_list_insert(list, &seat->drag_surface->layer_link);
2604         weston_surface_assign_output(seat->drag_surface);
2605         empty_region(&seat->drag_surface->input);
2606 }
2607
2608 static  void
2609 weston_seat_update_drag_surface(struct wl_seat *seat,
2610                                 int dx, int dy)
2611 {
2612         int surface_changed = 0;
2613         struct weston_seat *ws = (struct weston_seat *) seat;
2614
2615         if (!ws->drag_surface && !seat->drag_surface)
2616                 return;
2617
2618         if (ws->drag_surface && seat->drag_surface &&
2619             (&ws->drag_surface->surface.resource !=
2620              &seat->drag_surface->resource))
2621                 /* between calls to this funcion we got a new drag_surface */
2622                 surface_changed = 1;
2623
2624         if (!seat->drag_surface || surface_changed) {
2625                 device_release_drag_surface(ws);
2626                 if (!surface_changed)
2627                         return;
2628         }
2629
2630         if (!ws->drag_surface || surface_changed) {
2631                 struct weston_surface *surface = (struct weston_surface *)
2632                         seat->drag_surface;
2633                 if (!device_setup_new_drag_surface(ws, surface))
2634                         return;
2635         }
2636
2637         /* the client may not have attached a buffer to the drag surface
2638          * when we setup it up, so check if map is needed on every update */
2639         device_map_drag_surface(ws);
2640
2641         /* the client may have attached a buffer with a different size to
2642          * the drag surface, causing the input region to be reset */
2643         if (region_is_undefined(&ws->drag_surface->input))
2644                 empty_region(&ws->drag_surface->input);
2645
2646         if (!dx && !dy)
2647                 return;
2648
2649         weston_surface_set_position(ws->drag_surface,
2650                                     ws->drag_surface->geometry.x + wl_fixed_to_double(dx),
2651                                     ws->drag_surface->geometry.y + wl_fixed_to_double(dy));
2652 }
2653
2654 WL_EXPORT void
2655 weston_compositor_update_drag_surfaces(struct weston_compositor *compositor)
2656 {
2657         struct weston_seat *seat;
2658
2659         wl_list_for_each(seat, &compositor->seat_list, link)
2660                 weston_seat_update_drag_surface(&seat->seat, 0, 0);
2661 }
2662
2663 static void
2664 bind_output(struct wl_client *client,
2665             void *data, uint32_t version, uint32_t id)
2666 {
2667         struct weston_output *output = data;
2668         struct weston_mode *mode;
2669         struct wl_resource *resource;
2670
2671         resource = wl_client_add_object(client,
2672                                         &wl_output_interface, NULL, id, data);
2673
2674         wl_list_insert(&output->resource_list, &resource->link);
2675         resource->destroy = unbind_resource;
2676
2677         wl_output_send_geometry(resource,
2678                                 output->x,
2679                                 output->y,
2680                                 output->mm_width,
2681                                 output->mm_height,
2682                                 output->subpixel,
2683                                 output->make, output->model);
2684
2685         wl_list_for_each (mode, &output->mode_list, link) {
2686                 wl_output_send_mode(resource,
2687                                     mode->flags,
2688                                     mode->width,
2689                                     mode->height,
2690                                     mode->refresh);
2691         }
2692 }
2693
2694 static const char vertex_shader[] =
2695         "uniform mat4 proj;\n"
2696         "attribute vec2 position;\n"
2697         "attribute vec2 texcoord;\n"
2698         "varying vec2 v_texcoord;\n"
2699         "void main()\n"
2700         "{\n"
2701         "   gl_Position = proj * vec4(position, 0.0, 1.0);\n"
2702         "   v_texcoord = texcoord;\n"
2703         "}\n";
2704
2705 static const char texture_fragment_shader[] =
2706         "precision mediump float;\n"
2707         "varying vec2 v_texcoord;\n"
2708         "uniform sampler2D tex;\n"
2709         "uniform float alpha;\n"
2710         "uniform float texwidth;\n"
2711         "uniform vec4 opaque;\n"
2712         "void main()\n"
2713         "{\n"
2714         "   if (v_texcoord.x < 0.0 || v_texcoord.x > texwidth ||\n"
2715         "       v_texcoord.y < 0.0 || v_texcoord.y > 1.0)\n"
2716         "      discard;\n"
2717         "   gl_FragColor = texture2D(tex, v_texcoord)\n;"
2718         "   if (opaque.x <= v_texcoord.x && v_texcoord.x < opaque.y &&\n"
2719         "       opaque.z <= v_texcoord.y && v_texcoord.y < opaque.w)\n"
2720         "      gl_FragColor.a = 1.0;\n"
2721         "   gl_FragColor = alpha * gl_FragColor;\n"
2722         "}\n";
2723
2724 static const char solid_fragment_shader[] =
2725         "precision mediump float;\n"
2726         "uniform vec4 color;\n"
2727         "uniform float alpha;\n"
2728         "void main()\n"
2729         "{\n"
2730         "   gl_FragColor = alpha * color\n;"
2731         "}\n";
2732
2733 static int
2734 compile_shader(GLenum type, const char *source)
2735 {
2736         GLuint s;
2737         char msg[512];
2738         GLint status;
2739
2740         s = glCreateShader(type);
2741         glShaderSource(s, 1, &source, NULL);
2742         glCompileShader(s);
2743         glGetShaderiv(s, GL_COMPILE_STATUS, &status);
2744         if (!status) {
2745                 glGetShaderInfoLog(s, sizeof msg, NULL, msg);
2746                 weston_log("shader info: %s\n", msg);
2747                 return GL_NONE;
2748         }
2749
2750         return s;
2751 }
2752
2753 static int
2754 weston_shader_init(struct weston_shader *shader,
2755                    const char *vertex_source, const char *fragment_source)
2756 {
2757         char msg[512];
2758         GLint status;
2759
2760         shader->vertex_shader =
2761                 compile_shader(GL_VERTEX_SHADER, vertex_source);
2762         shader->fragment_shader =
2763                 compile_shader(GL_FRAGMENT_SHADER, fragment_source);
2764
2765         shader->program = glCreateProgram();
2766         glAttachShader(shader->program, shader->vertex_shader);
2767         glAttachShader(shader->program, shader->fragment_shader);
2768         glBindAttribLocation(shader->program, 0, "position");
2769         glBindAttribLocation(shader->program, 1, "texcoord");
2770
2771         glLinkProgram(shader->program);
2772         glGetProgramiv(shader->program, GL_LINK_STATUS, &status);
2773         if (!status) {
2774                 glGetProgramInfoLog(shader->program, sizeof msg, NULL, msg);
2775                 weston_log("link info: %s\n", msg);
2776                 return -1;
2777         }
2778
2779         shader->proj_uniform = glGetUniformLocation(shader->program, "proj");
2780         shader->tex_uniform = glGetUniformLocation(shader->program, "tex");
2781         shader->alpha_uniform = glGetUniformLocation(shader->program, "alpha");
2782         shader->color_uniform = glGetUniformLocation(shader->program, "color");
2783         shader->texwidth_uniform = glGetUniformLocation(shader->program, "texwidth");
2784         shader->opaque_uniform = glGetUniformLocation(shader->program, "opaque");
2785
2786         return 0;
2787 }
2788
2789 WL_EXPORT void
2790 weston_output_destroy(struct weston_output *output)
2791 {
2792         struct weston_compositor *c = output->compositor;
2793
2794         pixman_region32_fini(&output->region);
2795         pixman_region32_fini(&output->previous_damage);
2796         output->compositor->output_id_pool &= ~(1 << output->id);
2797
2798         wl_display_remove_global(c->wl_display, output->global);
2799 }
2800
2801 WL_EXPORT void
2802 weston_output_update_matrix(struct weston_output *output)
2803 {
2804         int flip;
2805         float magnification;
2806         struct weston_matrix camera;
2807         struct weston_matrix modelview;
2808
2809         weston_matrix_init(&output->matrix);
2810         weston_matrix_translate(&output->matrix,
2811                                 -(output->x + (output->border.right + output->current->width - output->border.left) / 2.0),
2812                                 -(output->y + (output->border.bottom + output->current->height - output->border.top) / 2.0), 0);
2813
2814         flip = (output->flags & WL_OUTPUT_FLIPPED) ? -1 : 1;
2815         weston_matrix_scale(&output->matrix,
2816                             2.0 / (output->current->width + output->border.left + output->border.right),
2817                             flip * 2.0 / (output->current->height + output->border.top + output->border.bottom), 1);
2818
2819         if (output->zoom.active) {
2820                 magnification = 1 / (1 - output->zoom.spring_z.current);
2821                 weston_matrix_init(&camera);
2822                 weston_matrix_init(&modelview);
2823                 weston_output_update_zoom(output, output->zoom.type);
2824                 weston_matrix_translate(&camera, output->zoom.trans_x,
2825                                           flip * output->zoom.trans_y, 0);
2826                 weston_matrix_invert(&modelview, &camera);
2827                 weston_matrix_scale(&modelview, magnification, magnification, 1.0);
2828                 weston_matrix_multiply(&output->matrix, &modelview);
2829         }
2830
2831         output->dirty = 0;
2832 }
2833
2834 WL_EXPORT void
2835 weston_output_move(struct weston_output *output, int x, int y)
2836 {
2837         output->x = x;
2838         output->y = y;
2839
2840         pixman_region32_init(&output->previous_damage);
2841         pixman_region32_init_rect(&output->region, x, y,
2842                                   output->current->width,
2843                                   output->current->height);
2844 }
2845
2846 WL_EXPORT void
2847 weston_output_init(struct weston_output *output, struct weston_compositor *c,
2848                    int x, int y, int width, int height, uint32_t flags)
2849 {
2850         output->compositor = c;
2851         output->x = x;
2852         output->y = y;
2853         output->border.top = 0;
2854         output->border.bottom = 0;
2855         output->border.left = 0;
2856         output->border.right = 0;
2857         output->mm_width = width;
2858         output->mm_height = height;
2859         output->dirty = 1;
2860
2861         weston_output_init_zoom(output);
2862
2863         output->flags = flags;
2864         weston_output_move(output, x, y);
2865         weston_output_damage(output);
2866
2867         wl_signal_init(&output->frame_signal);
2868         wl_list_init(&output->animation_list);
2869         wl_list_init(&output->resource_list);
2870
2871         output->id = ffs(~output->compositor->output_id_pool) - 1;
2872         output->compositor->output_id_pool |= 1 << output->id;
2873
2874         output->global =
2875                 wl_display_add_global(c->wl_display, &wl_output_interface,
2876                                       output, bind_output);
2877 }
2878
2879 static void
2880 compositor_bind(struct wl_client *client,
2881                 void *data, uint32_t version, uint32_t id)
2882 {
2883         struct weston_compositor *compositor = data;
2884
2885         wl_client_add_object(client, &wl_compositor_interface,
2886                              &compositor_interface, id, compositor);
2887 }
2888
2889 static void
2890 log_uname(void)
2891 {
2892         struct utsname usys;
2893
2894         uname(&usys);
2895
2896         weston_log("OS: %s, %s, %s, %s\n", usys.sysname, usys.release,
2897                                                 usys.version, usys.machine);
2898 }
2899
2900 static void
2901 log_extensions(const char *name, const char *extensions)
2902 {
2903         const char *p, *end;
2904         int l;
2905
2906         l = weston_log("%s:", name);
2907         p = extensions;
2908         while (*p) {
2909                 end = strchrnul(p, ' ');
2910                 if (l + (end - p) > 78)
2911                         l = weston_log_continue("\n" STAMP_SPACE "%.*s",
2912                                                 end - p, p);
2913                 else
2914                         l += weston_log_continue(" %.*s", end - p, p);
2915                 for (p = end; isspace(*p); p++)
2916                         ;
2917         }
2918         weston_log_continue("\n");
2919 }
2920
2921 static void
2922 log_egl_gl_info(EGLDisplay egldpy)
2923 {
2924         const char *str;
2925
2926         str = eglQueryString(egldpy, EGL_VERSION);
2927         weston_log("EGL version: %s\n", str ? str : "(null)");
2928
2929         str = eglQueryString(egldpy, EGL_VENDOR);
2930         weston_log("EGL vendor: %s\n", str ? str : "(null)");
2931
2932         str = eglQueryString(egldpy, EGL_CLIENT_APIS);
2933         weston_log("EGL client APIs: %s\n", str ? str : "(null)");
2934
2935         str = eglQueryString(egldpy, EGL_EXTENSIONS);
2936         log_extensions("EGL extensions", str ? str : "(null)");
2937
2938         str = (char *)glGetString(GL_VERSION);
2939         weston_log("GL version: %s\n", str ? str : "(null)");
2940
2941         str = (char *)glGetString(GL_SHADING_LANGUAGE_VERSION);
2942         weston_log("GLSL version: %s\n", str ? str : "(null)");
2943
2944         str = (char *)glGetString(GL_VENDOR);
2945         weston_log("GL vendor: %s\n", str ? str : "(null)");
2946
2947         str = (char *)glGetString(GL_RENDERER);
2948         weston_log("GL renderer: %s\n", str ? str : "(null)");
2949
2950         str = (char *)glGetString(GL_EXTENSIONS);
2951         log_extensions("GL extensions", str ? str : "(null)");
2952 }
2953
2954 WL_EXPORT int
2955 weston_compositor_init(struct weston_compositor *ec,
2956                        struct wl_display *display,
2957                        int argc,
2958                        char *argv[],
2959                        const char *config_file)
2960 {
2961         struct wl_event_loop *loop;
2962         const char *extensions;
2963         struct xkb_rule_names xkb_names;
2964         const struct config_key keyboard_config_keys[] = {
2965                 { "keymap_rules", CONFIG_KEY_STRING, &xkb_names.rules },
2966                 { "keymap_model", CONFIG_KEY_STRING, &xkb_names.model },
2967                 { "keymap_layout", CONFIG_KEY_STRING, &xkb_names.layout },
2968                 { "keymap_variant", CONFIG_KEY_STRING, &xkb_names.variant },
2969                 { "keymap_options", CONFIG_KEY_STRING, &xkb_names.options },
2970         };
2971         const struct config_section cs[] = {
2972                 { "keyboard",
2973                   keyboard_config_keys, ARRAY_LENGTH(keyboard_config_keys) },
2974         };
2975
2976         memset(&xkb_names, 0, sizeof(xkb_names));
2977         parse_config_file(config_file, cs, ARRAY_LENGTH(cs), ec);
2978
2979         ec->wl_display = display;
2980         wl_signal_init(&ec->destroy_signal);
2981         wl_signal_init(&ec->activate_signal);
2982         wl_signal_init(&ec->lock_signal);
2983         wl_signal_init(&ec->unlock_signal);
2984         ec->launcher_sock = weston_environment_get_fd("WESTON_LAUNCHER_SOCK");
2985
2986         ec->output_id_pool = 0;
2987
2988         if (!wl_display_add_global(display, &wl_compositor_interface,
2989                                    ec, compositor_bind))
2990                 return -1;
2991
2992         wl_display_init_shm(display);
2993
2994         log_egl_gl_info(ec->egl_display);
2995
2996         ec->image_target_texture_2d =
2997                 (void *) eglGetProcAddress("glEGLImageTargetTexture2DOES");
2998         ec->image_target_renderbuffer_storage = (void *)
2999                 eglGetProcAddress("glEGLImageTargetRenderbufferStorageOES");
3000         ec->create_image = (void *) eglGetProcAddress("eglCreateImageKHR");
3001         ec->destroy_image = (void *) eglGetProcAddress("eglDestroyImageKHR");
3002         ec->bind_display =
3003                 (void *) eglGetProcAddress("eglBindWaylandDisplayWL");
3004         ec->unbind_display =
3005                 (void *) eglGetProcAddress("eglUnbindWaylandDisplayWL");
3006
3007         extensions = (const char *) glGetString(GL_EXTENSIONS);
3008         if (!extensions) {
3009                 weston_log("Retrieving GL extension string failed.\n");
3010                 return -1;
3011         }
3012
3013         if (!strstr(extensions, "GL_EXT_texture_format_BGRA8888")) {
3014                 weston_log("GL_EXT_texture_format_BGRA8888 not available\n");
3015                 return -1;
3016         }
3017
3018         if (strstr(extensions, "GL_EXT_read_format_bgra"))
3019                 ec->read_format = GL_BGRA_EXT;
3020         else
3021                 ec->read_format = GL_RGBA;
3022
3023         if (strstr(extensions, "GL_EXT_unpack_subimage"))
3024                 ec->has_unpack_subimage = 1;
3025
3026         extensions =
3027                 (const char *) eglQueryString(ec->egl_display, EGL_EXTENSIONS);
3028         if (!extensions) {
3029                 weston_log("Retrieving EGL extension string failed.\n");
3030                 return -1;
3031         }
3032
3033         if (strstr(extensions, "EGL_WL_bind_wayland_display"))
3034                 ec->has_bind_display = 1;
3035         if (ec->has_bind_display)
3036                 ec->bind_display(ec->egl_display, ec->wl_display);
3037
3038         wl_list_init(&ec->surface_list);
3039         wl_list_init(&ec->layer_list);
3040         wl_list_init(&ec->seat_list);
3041         wl_list_init(&ec->output_list);
3042         wl_list_init(&ec->key_binding_list);
3043         wl_list_init(&ec->button_binding_list);
3044         wl_list_init(&ec->axis_binding_list);
3045         weston_spring_init(&ec->fade.spring, 30.0, 1.0, 1.0);
3046         ec->fade.animation.frame = fade_frame;
3047         wl_list_init(&ec->fade.animation.link);
3048
3049         weston_layer_init(&ec->fade_layer, &ec->layer_list);
3050         weston_layer_init(&ec->cursor_layer, &ec->fade_layer.link);
3051
3052         screenshooter_create(ec);
3053         text_cursor_position_notifier_create(ec);
3054
3055         ec->ping_handler = NULL;
3056
3057         wl_data_device_manager_init(ec->wl_display);
3058
3059         glActiveTexture(GL_TEXTURE0);
3060
3061         if (weston_shader_init(&ec->texture_shader,
3062                              vertex_shader, texture_fragment_shader) < 0)
3063                 return -1;
3064         if (weston_shader_init(&ec->solid_shader,
3065                              vertex_shader, solid_fragment_shader) < 0)
3066                 return -1;
3067
3068         weston_compositor_xkb_init(ec, &xkb_names);
3069
3070         loop = wl_display_get_event_loop(ec->wl_display);
3071         ec->idle_source = wl_event_loop_add_timer(loop, idle_handler, ec);
3072         wl_event_source_timer_update(ec->idle_source, ec->idle_time * 1000);
3073
3074         ec->input_loop = wl_event_loop_create();
3075
3076         weston_compositor_schedule_repaint(ec);
3077
3078         return 0;
3079 }
3080
3081 WL_EXPORT void
3082 weston_compositor_shutdown(struct weston_compositor *ec)
3083 {
3084         struct weston_output *output, *next;
3085
3086         wl_event_source_remove(ec->idle_source);
3087         if (ec->input_loop_source)
3088                 wl_event_source_remove(ec->input_loop_source);
3089
3090         /* Destroy all outputs associated with this compositor */
3091         wl_list_for_each_safe(output, next, &ec->output_list, link)
3092                 output->destroy(output);
3093
3094         weston_binding_list_destroy_all(&ec->key_binding_list);
3095         weston_binding_list_destroy_all(&ec->button_binding_list);
3096         weston_binding_list_destroy_all(&ec->axis_binding_list);
3097
3098         wl_array_release(&ec->vertices);
3099         wl_array_release(&ec->indices);
3100
3101         wl_event_loop_destroy(ec->input_loop);
3102 }
3103
3104 static int on_term_signal(int signal_number, void *data)
3105 {
3106         struct wl_display *display = data;
3107
3108         weston_log("caught signal %d\n", signal_number);
3109         wl_display_terminate(display);
3110
3111         return 1;
3112 }
3113
3114 static void
3115 on_segv_signal(int s, siginfo_t *siginfo, void *context)
3116 {
3117         void *buffer[32];
3118         int i, count;
3119         Dl_info info;
3120
3121         weston_log("caught segv\n");
3122
3123         count = backtrace(buffer, ARRAY_LENGTH(buffer));
3124         for (i = 0; i < count; i++) {
3125                 dladdr(buffer[i], &info);
3126                 weston_log("  [%016lx]  %s  (%s)\n",
3127                         (long) buffer[i],
3128                         info.dli_sname ? info.dli_sname : "--",
3129                         info.dli_fname);
3130         }
3131
3132         longjmp(segv_jmp_buf, 1);
3133 }
3134
3135
3136 static void *
3137 load_module(const char *name, const char *entrypoint, void **handle)
3138 {
3139         char path[PATH_MAX];
3140         void *module, *init;
3141
3142         if (name[0] != '/')
3143                 snprintf(path, sizeof path, "%s/%s", MODULEDIR, name);
3144         else
3145                 snprintf(path, sizeof path, "%s", name);
3146
3147         weston_log("Loading module '%s'\n", path);
3148         module = dlopen(path, RTLD_LAZY);
3149         if (!module) {
3150                 weston_log("Failed to load module: %s\n", dlerror());
3151                 return NULL;
3152         }
3153
3154         init = dlsym(module, entrypoint);
3155         if (!init) {
3156                 weston_log("Failed to lookup init function: %s\n", dlerror());
3157                 return NULL;
3158         }
3159
3160         return init;
3161 }
3162
3163 static const char xdg_error_message[] =
3164         "fatal: environment variable XDG_RUNTIME_DIR is not set.\n";
3165
3166 static const char xdg_wrong_message[] =
3167         "fatal: environment variable XDG_RUNTIME_DIR\n"
3168         "is set to \"%s\", which is not a directory.\n";
3169
3170 static const char xdg_wrong_mode_message[] =
3171         "warning: XDG_RUNTIME_DIR \"%s\" is not configured\n"
3172         "correctly.  Unix access mode must be 0700 but is %o,\n"
3173         "and XDG_RUNTIME_DIR must be owned by the user, but is\n"
3174         "owned by UID %d.\n"
3175
3176 static const char xdg_detail_message[] =
3177         "Refer to your distribution on how to get it, or\n"
3178         "http://www.freedesktop.org/wiki/Specifications/basedir-spec\n"
3179         "on how to implement it.\n";
3180
3181 static void
3182 verify_xdg_runtime_dir(void)
3183 {
3184         char *dir = getenv("XDG_RUNTIME_DIR");
3185         struct stat s;
3186
3187         if (!dir) {
3188                 weston_log(xdg_error_message);
3189                 weston_log_continue(xdg_detail_message);
3190                 exit(EXIT_FAILURE);
3191         }
3192
3193         if (stat(dir, &s) || !S_ISDIR(s.st_mode)) {
3194                 weston_log(xdg_wrong_message, dir);
3195                 weston_log_continue(xdg_detail_message);
3196                 exit(EXIT_FAILURE);
3197         }
3198
3199         if ((s.st_mode & 0777) != 0700 || s.st_uid != getuid()) {
3200                 weston_log(xdg_wrong_mode_message,
3201                            dir, s.st_mode & 0777, s.st_uid);
3202                 weston_log_continue(xdg_detail_message);
3203         }
3204 }
3205
3206 int main(int argc, char *argv[])
3207 {
3208         int ret = EXIT_SUCCESS;
3209         struct wl_display *display;
3210         struct weston_compositor *ec;
3211         struct wl_event_source *signals[4];
3212         struct wl_event_loop *loop;
3213         struct sigaction segv_action;
3214         void *shell_module, *backend_module, *xserver_module;
3215         int (*module_init)(struct weston_compositor *ec);
3216         struct weston_compositor
3217                 *(*backend_init)(struct wl_display *display,
3218                                  int argc, char *argv[], const char *config_file);
3219         int i;
3220         char *backend = NULL;
3221         char *shell = NULL;
3222         char *module = NULL;
3223         char *log = NULL;
3224         int32_t idle_time = 300;
3225         int32_t xserver = 0;
3226         char *socket_name = NULL;
3227         char *config_file;
3228
3229         const struct config_key shell_config_keys[] = {
3230                 { "type", CONFIG_KEY_STRING, &shell },
3231         };
3232
3233         const struct config_section cs[] = {
3234                 { "shell",
3235                   shell_config_keys, ARRAY_LENGTH(shell_config_keys) },
3236         };
3237
3238         const struct weston_option core_options[] = {
3239                 { WESTON_OPTION_STRING, "backend", 'B', &backend },
3240                 { WESTON_OPTION_STRING, "socket", 'S', &socket_name },
3241                 { WESTON_OPTION_INTEGER, "idle-time", 'i', &idle_time },
3242                 { WESTON_OPTION_BOOLEAN, "xserver", 0, &xserver },
3243                 { WESTON_OPTION_STRING, "module", 0, &module },
3244                 { WESTON_OPTION_STRING, "log", 0, &log },
3245         };
3246
3247         argc = parse_options(core_options,
3248                              ARRAY_LENGTH(core_options), argc, argv);
3249
3250         weston_log_file_open(log);
3251         
3252         weston_log("%s\n"
3253                    STAMP_SPACE "%s\n"
3254                    STAMP_SPACE "Bug reports to: %s\n"
3255                    STAMP_SPACE "Build: %s\n",
3256                    PACKAGE_STRING, PACKAGE_URL, PACKAGE_BUGREPORT,
3257                    BUILD_ID);
3258         log_uname();
3259
3260         verify_xdg_runtime_dir();
3261
3262         display = wl_display_create();
3263
3264         loop = wl_display_get_event_loop(display);
3265         signals[0] = wl_event_loop_add_signal(loop, SIGTERM, on_term_signal,
3266                                               display);
3267         signals[1] = wl_event_loop_add_signal(loop, SIGINT, on_term_signal,
3268                                               display);
3269         signals[2] = wl_event_loop_add_signal(loop, SIGQUIT, on_term_signal,
3270                                               display);
3271
3272         wl_list_init(&child_process_list);
3273         signals[3] = wl_event_loop_add_signal(loop, SIGCHLD, sigchld_handler,
3274                                               NULL);
3275
3276         segv_action.sa_flags = SA_SIGINFO | SA_RESETHAND;
3277         segv_action.sa_sigaction = on_segv_signal;
3278         sigemptyset(&segv_action.sa_mask);
3279         sigaction(SIGSEGV, &segv_action, NULL);
3280
3281         if (!backend) {
3282                 if (getenv("WAYLAND_DISPLAY"))
3283                         backend = "wayland-backend.so";
3284                 else if (getenv("DISPLAY"))
3285                         backend = "x11-backend.so";
3286                 else if (getenv("OPENWFD"))
3287                         backend = "openwfd-backend.so";
3288                 else
3289                         backend = "drm-backend.so";
3290         }
3291
3292         config_file = config_file_path("weston.ini");
3293         parse_config_file(config_file, cs, ARRAY_LENGTH(cs), shell);
3294
3295         backend_init = load_module(backend, "backend_init", &backend_module);
3296         if (!backend_init)
3297                 exit(EXIT_FAILURE);
3298
3299         ec = backend_init(display, argc, argv, config_file);
3300         if (ec == NULL) {
3301                 weston_log("failed to create compositor\n");
3302                 exit(EXIT_FAILURE);
3303         }
3304
3305         for (i = 1; argv[i]; i++)
3306                 weston_log("unhandled option: %s\n", argv[i]);
3307         if (argv[1])
3308                 exit(EXIT_FAILURE);
3309
3310         free(config_file);
3311
3312         ec->option_idle_time = idle_time;
3313         ec->idle_time = idle_time;
3314
3315         module_init = NULL;
3316         if (xserver)
3317                 module_init = load_module("xwayland.so",
3318                                           "weston_xserver_init",
3319                                           &xserver_module);
3320         if (module_init && module_init(ec) < 0)
3321                 exit(EXIT_FAILURE);
3322
3323         if (!shell)
3324                 shell = "desktop-shell.so";
3325         module_init = load_module(shell, "shell_init", &shell_module);
3326         if (!module_init || module_init(ec) < 0)
3327                 exit(EXIT_FAILURE);
3328
3329
3330         module_init = NULL;
3331         if (module)
3332                 module_init = load_module(module, "module_init", NULL);
3333         if (module_init && module_init(ec) < 0)
3334                 exit(EXIT_FAILURE);
3335
3336         if (wl_display_add_socket(display, socket_name)) {
3337                 weston_log("failed to add socket: %m\n");
3338                 exit(EXIT_FAILURE);
3339         }
3340
3341         weston_compositor_dpms_on(ec);
3342         weston_compositor_wake(ec);
3343         if (setjmp(segv_jmp_buf) == 0)
3344                 wl_display_run(display);
3345         else
3346                 ret = EXIT_FAILURE;
3347
3348         /* prevent further rendering while shutting down */
3349         ec->state = WESTON_COMPOSITOR_SLEEPING;
3350
3351         wl_signal_emit(&ec->destroy_signal, ec);
3352
3353         if (ec->has_bind_display)
3354                 ec->unbind_display(ec->egl_display, display);
3355
3356         for (i = ARRAY_LENGTH(signals); i;)
3357                 wl_event_source_remove(signals[--i]);
3358
3359         weston_compositor_xkb_destroy(ec);
3360
3361         ec->destroy(ec);
3362         wl_display_destroy(display);
3363
3364         weston_log_file_close();
3365
3366         return ret;
3367 }