compositor: Put cursor surfaces into the big surface list
This commit is contained in:
+20
-16
@@ -241,6 +241,8 @@ wlsc_surface_create(struct wlsc_compositor *compositor,
|
|||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
|
||||||
|
surface->surface.client = NULL;
|
||||||
|
|
||||||
surface->compositor = compositor;
|
surface->compositor = compositor;
|
||||||
surface->visual = NULL;
|
surface->visual = NULL;
|
||||||
surface->image = EGL_NO_IMAGE_KHR;
|
surface->image = EGL_NO_IMAGE_KHR;
|
||||||
@@ -729,7 +731,7 @@ wlsc_output_repaint(struct wlsc_output *output)
|
|||||||
{
|
{
|
||||||
struct wlsc_compositor *ec = output->compositor;
|
struct wlsc_compositor *ec = output->compositor;
|
||||||
struct wlsc_surface *es;
|
struct wlsc_surface *es;
|
||||||
struct wlsc_input_device *eid, *hw_cursor;
|
struct wlsc_input_device *device;
|
||||||
pixman_region32_t new_damage, total_damage;
|
pixman_region32_t new_damage, total_damage;
|
||||||
|
|
||||||
output->prepare_render(output);
|
output->prepare_render(output);
|
||||||
@@ -751,19 +753,26 @@ wlsc_output_repaint(struct wlsc_output *output)
|
|||||||
&output->previous_damage_region);
|
&output->previous_damage_region);
|
||||||
pixman_region32_copy(&output->previous_damage_region, &new_damage);
|
pixman_region32_copy(&output->previous_damage_region, &new_damage);
|
||||||
|
|
||||||
hw_cursor = NULL;
|
device = (struct wlsc_input_device *) ec->input_device;
|
||||||
if (ec->focus && ec->fade.spring.current < 0.001) {
|
if (ec->focus && ec->fade.spring.current < 0.001) {
|
||||||
hw_cursor = (struct wlsc_input_device *) ec->input_device;
|
if (!wl_list_empty(&device->sprite->link)) {
|
||||||
if (output->set_hardware_cursor(output, hw_cursor) < 0)
|
wl_list_remove(&device->sprite->link);
|
||||||
hw_cursor = NULL;
|
wl_list_init(&device->sprite->link);
|
||||||
|
}
|
||||||
|
if (output->set_hardware_cursor(output, device) < 0)
|
||||||
|
wl_list_insert(&ec->surface_list,
|
||||||
|
&device->sprite->link);
|
||||||
} else {
|
} else {
|
||||||
output->set_hardware_cursor(output, NULL);
|
output->set_hardware_cursor(output, NULL);
|
||||||
|
if (wl_list_empty(&device->sprite->link))
|
||||||
|
wl_list_insert(&ec->surface_list,
|
||||||
|
&device->sprite->link);
|
||||||
}
|
}
|
||||||
|
|
||||||
es = container_of(ec->surface_list.next, struct wlsc_surface, link);
|
es = container_of(ec->surface_list.next, struct wlsc_surface, link);
|
||||||
|
|
||||||
if (es->visual == &ec->compositor.rgb_visual && hw_cursor) {
|
if (es->visual == &ec->compositor.rgb_visual &&
|
||||||
if (output->prepare_scanout_surface(output, es) == 0) {
|
output->prepare_scanout_surface(output, es) == 0) {
|
||||||
/* We're drawing nothing now,
|
/* We're drawing nothing now,
|
||||||
* draw the damaged regions later. */
|
* draw the damaged regions later. */
|
||||||
pixman_region32_union(&ec->damage_region,
|
pixman_region32_union(&ec->damage_region,
|
||||||
@@ -779,7 +788,6 @@ wlsc_output_repaint(struct wlsc_output *output)
|
|||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (es->fullscreen_output == output) {
|
if (es->fullscreen_output == output) {
|
||||||
if (es->width < output->current->width ||
|
if (es->width < output->current->width ||
|
||||||
@@ -805,14 +813,6 @@ wlsc_output_repaint(struct wlsc_output *output)
|
|||||||
if (ec->overlay)
|
if (ec->overlay)
|
||||||
wlsc_surface_draw(ec->overlay, output, &total_damage);
|
wlsc_surface_draw(ec->overlay, output, &total_damage);
|
||||||
|
|
||||||
if (ec->focus)
|
|
||||||
wl_list_for_each(eid, &ec->input_device_list, link) {
|
|
||||||
if (&eid->input_device != ec->input_device ||
|
|
||||||
eid != hw_cursor)
|
|
||||||
wlsc_surface_draw(eid->sprite, output,
|
|
||||||
&total_damage);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ec->fade.spring.current > 0.001)
|
if (ec->fade.spring.current > 0.001)
|
||||||
fade_output(output, ec->fade.spring.current, &total_damage);
|
fade_output(output, ec->fade.spring.current, &total_damage);
|
||||||
}
|
}
|
||||||
@@ -1076,6 +1076,8 @@ pick_surface(struct wl_input_device *device, int32_t *sx, int32_t *sy)
|
|||||||
struct wlsc_surface *es;
|
struct wlsc_surface *es;
|
||||||
|
|
||||||
wl_list_for_each(es, &ec->surface_list, link) {
|
wl_list_for_each(es, &ec->surface_list, link) {
|
||||||
|
if (es->surface.client == NULL)
|
||||||
|
continue;
|
||||||
wlsc_surface_transform(es, device->x, device->y, sx, sy);
|
wlsc_surface_transform(es, device->x, device->y, sx, sy);
|
||||||
if (0 <= *sx && *sx < es->width &&
|
if (0 <= *sx && *sx < es->width &&
|
||||||
0 <= *sy && *sy < es->height)
|
0 <= *sy && *sy < es->height)
|
||||||
@@ -1533,6 +1535,8 @@ wlsc_input_device_init(struct wlsc_input_device *device,
|
|||||||
device->sprite = wlsc_surface_create(ec,
|
device->sprite = wlsc_surface_create(ec,
|
||||||
device->input_device.x,
|
device->input_device.x,
|
||||||
device->input_device.y, 32, 32);
|
device->input_device.y, 32, 32);
|
||||||
|
wl_list_insert(&ec->surface_list, &device->sprite->link);
|
||||||
|
|
||||||
device->hotspot_x = 16;
|
device->hotspot_x = 16;
|
||||||
device->hotspot_y = 16;
|
device->hotspot_y = 16;
|
||||||
device->modifier_state = 0;
|
device->modifier_state = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user