From 75b6d29ad6fd142603c6701e883fb82cb3cb1132 Mon Sep 17 00:00:00 2001 From: Christopher Michael Date: Tue, 31 Jan 2012 14:16:48 +0000 Subject: [PATCH] E Comp (wayland): Add a surface repick when old surface gets destroyed. Add a surface repick call when we raise an existing surface. Fix redraw for surfaces which use a gl texture. SVN revision: 67633 --- src/modules/comp/e_mod_comp_wl_buffer.c | 19 ++++++-- src/modules/comp/e_mod_comp_wl_comp.c | 59 ++++++++++++------------ src/modules/comp/e_mod_comp_wl_comp.h | 1 + src/modules/comp/e_mod_comp_wl_surface.c | 20 ++++---- 4 files changed, 58 insertions(+), 41 deletions(-) diff --git a/src/modules/comp/e_mod_comp_wl_buffer.c b/src/modules/comp/e_mod_comp_wl_buffer.c index ca1780adb..001e5a0eb 100644 --- a/src/modules/comp/e_mod_comp_wl_buffer.c +++ b/src/modules/comp/e_mod_comp_wl_buffer.c @@ -24,10 +24,23 @@ e_mod_comp_wl_buffer_attach(struct wl_buffer *buffer, struct wl_surface *surface ws = (Wayland_Surface *)surface; - if (ws->saved_texture != 0) - ws->texture = ws->saved_texture; + if (!ws->texture) + { + glGenTextures(1, &ws->texture); + glBindTexture(GL_TEXTURE_2D, ws->texture); + glTexParameteri(GL_TEXTURE_2D, + GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, + GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); +// ws->shader = &ws->texture_shader; + } + else + glBindTexture(GL_TEXTURE_2D, ws->texture); - glBindTexture(GL_TEXTURE_2D, ws->texture); + /* if (ws->saved_texture != 0) */ + /* ws->texture = ws->saved_texture; */ + + /* glBindTexture(GL_TEXTURE_2D, ws->texture); */ if (wl_buffer_is_shm(buffer)) { diff --git a/src/modules/comp/e_mod_comp_wl_comp.c b/src/modules/comp/e_mod_comp_wl_comp.c index 64d462385..96c88851e 100644 --- a/src/modules/comp/e_mod_comp_wl_comp.c +++ b/src/modules/comp/e_mod_comp_wl_comp.c @@ -40,7 +40,6 @@ static Eina_Bool _e_mod_comp_wl_cb_mouse_up(void *data __UNUSED__, int type __UN static Eina_Bool _e_mod_comp_wl_cb_key_down(void *data __UNUSED__, int type __UNUSED__, void *event); static Eina_Bool _e_mod_comp_wl_cb_key_up(void *data __UNUSED__, int type __UNUSED__, void *event); -static void _e_mod_comp_wl_comp_repick(struct wl_input_device *device, uint32_t timestamp); static Wayland_Surface *_e_mod_comp_wl_comp_pick_surface(int32_t x __UNUSED__, int32_t y __UNUSED__, int32_t *sx, int32_t *sy); static void _e_mod_comp_wl_comp_update_modifier(Wayland_Input *input, uint32_t key, uint32_t state); @@ -180,6 +179,32 @@ e_mod_comp_wl_comp_get(void) return _wl_comp; } +void +e_mod_comp_wl_comp_repick(struct wl_input_device *device, uint32_t timestamp) +{ + Wayland_Surface *ws, *focus; + + ws = + _e_mod_comp_wl_comp_pick_surface(device->x, device->y, + &device->current_x, &device->current_y); + if (!ws) return; + if (&ws->surface != device->current) + { + const struct wl_grab_interface *interface; + + interface = device->grab->interface; + interface->focus(device->grab, timestamp, &ws->surface, + device->current_x, device->current_y); + device->current = &ws->surface; + } + + if ((focus = (Wayland_Surface *)device->grab->focus)) + { + device->grab->x = device->x - focus->x; + device->grab->y = device->y - focus->y; + } +} + /* local functions */ static Eina_Bool _e_mod_comp_wl_comp_egl_init(void) @@ -378,7 +403,7 @@ _e_mod_comp_wl_cb_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *eve input->input_device.y = ev->y; timestamp = e_mod_comp_wl_time_get(); - _e_mod_comp_wl_comp_repick(&input->input_device, timestamp); + e_mod_comp_wl_comp_repick(&input->input_device, timestamp); return ECORE_CALLBACK_PASS_ON; } @@ -397,7 +422,7 @@ _e_mod_comp_wl_cb_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *ev input = e_mod_comp_wl_input_get(); timestamp = e_mod_comp_wl_time_get(); - _e_mod_comp_wl_comp_repick(&input->input_device, timestamp); + e_mod_comp_wl_comp_repick(&input->input_device, timestamp); return ECORE_CALLBACK_PASS_ON; } @@ -422,7 +447,7 @@ _e_mod_comp_wl_cb_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *e device->y = ev->y; timestamp = e_mod_comp_wl_time_get(); - _e_mod_comp_wl_comp_repick(device, timestamp); + e_mod_comp_wl_comp_repick(device, timestamp); interface = device->grab->interface; interface->motion(device->grab, timestamp, device->grab->x, device->grab->y); @@ -590,32 +615,6 @@ _e_mod_comp_wl_cb_key_up(void *data __UNUSED__, int type __UNUSED__, void *event return ECORE_CALLBACK_PASS_ON; } -static void -_e_mod_comp_wl_comp_repick(struct wl_input_device *device, uint32_t timestamp) -{ - Wayland_Surface *ws, *focus; - - ws = - _e_mod_comp_wl_comp_pick_surface(device->x, device->y, - &device->current_x, &device->current_y); - if (!ws) return; - if (&ws->surface != device->current) - { - const struct wl_grab_interface *interface; - - interface = device->grab->interface; - interface->focus(device->grab, timestamp, &ws->surface, - device->current_x, device->current_y); - device->current = &ws->surface; - } - - if ((focus = (Wayland_Surface *)device->grab->focus)) - { - device->grab->x = device->x - focus->x; - device->grab->y = device->y - focus->y; - } -} - static Wayland_Surface * _e_mod_comp_wl_comp_pick_surface(int32_t x __UNUSED__, int32_t y __UNUSED__, int32_t *sx, int32_t *sy) { diff --git a/src/modules/comp/e_mod_comp_wl_comp.h b/src/modules/comp/e_mod_comp_wl_comp.h index 273e2d36d..6fa41a803 100644 --- a/src/modules/comp/e_mod_comp_wl_comp.h +++ b/src/modules/comp/e_mod_comp_wl_comp.h @@ -6,6 +6,7 @@ Eina_Bool e_mod_comp_wl_comp_init(void); void e_mod_comp_wl_comp_shutdown(void); Wayland_Compositor *e_mod_comp_wl_comp_get(void); +void e_mod_comp_wl_comp_repick(struct wl_input_device *device, uint32_t timestamp); # endif #endif diff --git a/src/modules/comp/e_mod_comp_wl_surface.c b/src/modules/comp/e_mod_comp_wl_surface.c index c5a4633d9..7578563be 100644 --- a/src/modules/comp/e_mod_comp_wl_surface.c +++ b/src/modules/comp/e_mod_comp_wl_surface.c @@ -143,6 +143,7 @@ void e_mod_comp_wl_surface_destroy_surface(struct wl_resource *resource) { Wayland_Surface *ws; + Wayland_Input *input; LOGFN(__FILE__, __LINE__, __FUNCTION__); @@ -151,15 +152,15 @@ e_mod_comp_wl_surface_destroy_surface(struct wl_resource *resource) /* TODO: damage below */ /* TODO: flush damage */ + input = e_mod_comp_wl_input_get(); + if (ws->win) e_object_del(E_OBJECT(ws->win)); wl_list_remove(&ws->link); + e_mod_comp_wl_comp_repick(&input->input_device, e_mod_comp_wl_time_get()); - if (!ws->saved_texture) - glDeleteTextures(1, &ws->texture); - else - glDeleteTextures(1, &ws->saved_texture); + if (ws->texture) glDeleteTextures(1, &ws->texture); if (ws->buffer) wl_list_remove(&ws->buffer_destroy_listener.link); @@ -194,6 +195,9 @@ e_mod_comp_wl_surface_configure(Wayland_Surface *ws, int32_t x, int32_t y, int32 ws->w = width; ws->h = height; + if (ws->win) + e_win_move_resize(ws->win, ws->x, ws->y, ws->w, ws->h); + if (!wl_list_empty(&ws->frame_callbacks)) { Wayland_Output *output; @@ -211,9 +215,6 @@ e_mod_comp_wl_surface_configure(Wayland_Surface *ws, int32_t x, int32_t y, int32 pixman_region32_init_rect(&ws->opaque, ws->x, ws->y, ws->w, ws->h); else pixman_region32_init(&ws->opaque); - - if (ws->win) - e_win_move_resize(ws->win, ws->x, ws->y, ws->w, ws->h); } void @@ -256,13 +257,16 @@ static void _e_mod_comp_wl_surface_raise(Wayland_Surface *ws) { Wayland_Compositor *comp; + Wayland_Input *input; LOGFN(__FILE__, __LINE__, __FUNCTION__); comp = e_mod_comp_wl_comp_get(); + input = e_mod_comp_wl_input_get(); + wl_list_remove(&ws->link); wl_list_insert(&comp->surfaces, &ws->link); - /* TODO: repick */ + e_mod_comp_wl_comp_repick(&input->input_device, e_mod_comp_wl_time_get()); e_mod_comp_wl_surface_damage_surface(ws); }