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
This commit is contained in:
Christopher Michael 2012-01-31 14:16:48 +00:00
parent 8e219d3455
commit 75b6d29ad6
4 changed files with 58 additions and 41 deletions

View File

@ -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))
{

View File

@ -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)
{

View File

@ -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

View File

@ -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);
}