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