compositor-drm: Fix multi head rendering
diff --git a/compositor/compositor.c b/compositor/compositor.c
index c1db8f2..afa0e59 100644
--- a/compositor/compositor.c
+++ b/compositor/compositor.c
@@ -24,6 +24,7 @@
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
+#include <limits.h>
#include <stdarg.h>
#include <sys/ioctl.h>
#include <fcntl.h>
@@ -493,6 +494,8 @@
struct wlsc_input_device *eid;
pixman_region32_t new_damage, total_damage;
+ output->prepare_render(output);
+
glViewport(0, 0, output->width, output->height);
glUniformMatrix4fv(ec->proj_uniform, 1, GL_FALSE, output->matrix.d);
@@ -849,17 +852,40 @@
const struct wl_grab_interface *interface;
struct wlsc_input_device *wd = (struct wlsc_input_device *) device;
int32_t sx, sy;
+ int x_valid = 0, y_valid = 0;
+ int min_x = INT_MAX, min_y = INT_MAX, max_x = INT_MIN, max_y = INT_MIN;
- /* FIXME: We need some multi head love here. */
- output = container_of(ec->output_list.next, struct wlsc_output, link);
- if (x < output->x)
- x = 0;
- if (y < output->y)
- y = 0;
- if (x >= output->x + output->width)
- x = output->x + output->width - 1;
- if (y >= output->y + output->height)
- y = output->y + output->height - 1;
+ wl_list_for_each(output, &ec->output_list, link) {
+ if (output->x <= x && x <= output->x + output->width)
+ x_valid = 1;
+
+ if (output->y <= y && y <= output->y + output->height)
+ y_valid = 1;
+
+ /* FIXME: calculate this only on output addition/deletion */
+ if (output->x < min_x)
+ min_x = output->x;
+ if (output->y < min_y)
+ min_y = output->y;
+
+ if (output->x + output->width > max_x)
+ max_x = output->x + output->width;
+ if (output->y + output->height > max_y)
+ max_y = output->y + output->height;
+ }
+
+ if (!x_valid) {
+ if (x < min_x)
+ x = min_x;
+ else if (x >= max_x)
+ x = max_x;
+ }
+ if (!y_valid) {
+ if (y < min_y)
+ y = min_y;
+ else if (y >= max_y)
+ y = max_y;
+ }
device->x = x;
device->y = y;