Ecore_Wayland: Cleanup header inclusions. Fix issues with efl wayland

clients not moving or resizing properly with most recent git wayland.
Make use of wayland's new 'serial' stuff in place of timestamps (where
appropriate). Add code to handle new wayland 'ping' events.



SVN revision: 70443
This commit is contained in:
Christopher Michael 2012-04-24 16:59:35 +00:00
parent 623f145cd9
commit 0a889a10c5
7 changed files with 226 additions and 226 deletions

View File

@ -146,6 +146,8 @@ struct _Ecore_Wl_Window
/* Eina_Bool redraw_scheduled : 1; */
/* Eina_Bool resize_scheduled : 1; */
Eina_Bool transparent : 1;
Eina_Bool moving : 1;
Eina_Bool resizing : 1;
Ecore_Wl_Window_Type type;
Ecore_Wl_Window_Buffer_Type buffer_type;
@ -282,7 +284,7 @@ EAPI int ecore_wl_dpi_get(void);
EAPI void ecore_wl_display_iterate(void);
EAPI void ecore_wl_input_grab(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int button);
EAPI void ecore_wl_input_ungrab(Ecore_Wl_Input *input, unsigned int timestamp);
EAPI void ecore_wl_input_ungrab(Ecore_Wl_Input *input);
EAPI struct wl_list ecore_wl_outputs_get(void);
@ -299,6 +301,7 @@ EAPI void ecore_wl_window_maximized_set(Ecore_Wl_Window *win, Eina_Bool maximize
EAPI void ecore_wl_window_fullscreen_set(Ecore_Wl_Window *win, Eina_Bool fullscreen);
EAPI void ecore_wl_window_transparent_set(Ecore_Wl_Window *win, Eina_Bool transparent);
EAPI void ecore_wl_window_update_size(Ecore_Wl_Window *win, int w, int h);
EAPI void ecore_wl_window_update_location(Ecore_Wl_Window *win, int x, int y);
EAPI struct wl_surface *ecore_wl_window_surface_get(Ecore_Wl_Window *win);
EAPI struct wl_shell_surface *ecore_wl_window_shell_surface_get(Ecore_Wl_Window *win);
EAPI Ecore_Wl_Window *ecore_wl_window_find(unsigned int id);

View File

@ -18,11 +18,7 @@
# define BTN_BACK 0x116
#endif
#include "Ecore.h"
#include "ecore_private.h"
#include "Ecore_Input.h"
#include "ecore_wl_private.h"
#include "Ecore_Wayland.h"
/* local function prototypes */
static Eina_Bool _ecore_wl_shutdown(Eina_Bool close);
@ -156,6 +152,8 @@ ecore_wl_init(const char *name)
wl_display_add_global_listener(_ecore_wl_disp->wl.display,
_ecore_wl_cb_handle_global, _ecore_wl_disp);
/* Init egl */
/* FIXME: Process connection events ?? */
/* wl_display_iterate(_ecore_wl_disp->wl.display, WL_DISPLAY_READABLE); */

View File

@ -2,10 +2,7 @@
# include <config.h>
#endif
#include "Ecore.h"
#include "ecore_private.h"
#include "ecore_wl_private.h"
#include "Ecore_Wayland.h"
/* local function prototypes */
static void _ecore_wl_dnd_offer(void *data, struct wl_data_offer *wl_data_offer __UNUSED__, const char *type);
@ -77,6 +74,8 @@ _ecore_wl_dnd_leave(void *data, struct wl_data_device *data_device __UNUSED__)
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!(input = data)) return;
/* FIXME: NB: This MAY need to raise a wl_event_dnd_leave for the
* source window */
_ecore_wl_dnd_del(input->drag_source);
input->drag_source = NULL;
}

View File

@ -2,11 +2,22 @@
# include <config.h>
#endif
#include "Ecore.h"
#include "ecore_private.h"
#include "Ecore_Input.h"
/**
* NB: Events that receive a 'serial' instead of timestamp
*
* input_device_attach (for pointer image)
* input_device_button_event (button press/release)
* input_device_key_press
* input_device_pointer_enter
* input_device_pointer_leave
* input_device_keyboard_enter
* input_device_keyboard_leave
* input_device_touch_down
* input_device_touch_up
*
**/
#include "ecore_wl_private.h"
#include "Ecore_Wayland.h"
/* FIXME: This gives BTN_LEFT/RIGHT/MIDDLE for linux systems ...
* What about other OSs ?? */
@ -26,11 +37,11 @@
static void _ecore_wl_input_cb_motion(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int timestamp, int sx, int sy);
static void _ecore_wl_input_cb_button(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, unsigned int timestamp, unsigned int button, unsigned int state);
static void _ecore_wl_input_cb_axis(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int timestamp, unsigned int axis, int value);
static void _ecore_wl_input_cb_key(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, unsigned int timestamp __UNUSED__, unsigned int key, unsigned int state);
static void _ecore_wl_input_cb_key(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, unsigned int timestamp, unsigned int key, unsigned int state);
static void _ecore_wl_input_cb_pointer_enter(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, struct wl_surface *surface, int sx, int sy);
static void _ecore_wl_input_cb_pointer_leave(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, struct wl_surface *surface __UNUSED__);
static void _ecore_wl_input_cb_pointer_leave(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, struct wl_surface *surface);
static void _ecore_wl_input_cb_keyboard_enter(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, struct wl_surface *surface, struct wl_array *keys);
static void _ecore_wl_input_cb_keyboard_leave(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, struct wl_surface *surface __UNUSED__);
static void _ecore_wl_input_cb_keyboard_leave(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, struct wl_surface *surface);
static void _ecore_wl_input_cb_touch_down(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, unsigned int timestamp, struct wl_surface *surface __UNUSED__, int id __UNUSED__, int x, int y);
static void _ecore_wl_input_cb_touch_up(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, unsigned int timestamp, int id __UNUSED__);
static void _ecore_wl_input_cb_touch_motion(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int timestamp, int id __UNUSED__, int x, int y);
@ -43,16 +54,13 @@ static void _ecore_wl_input_cb_data_motion(void *data, struct wl_data_device *da
static void _ecore_wl_input_cb_data_drop(void *data, struct wl_data_device *data_device);
static void _ecore_wl_input_cb_data_selection(void *data, struct wl_data_device *data_device, struct wl_data_offer *offer);
static void _ecore_wl_input_keyboard_focus_remove(Ecore_Wl_Input *input, unsigned int timestamp);
static void _ecore_wl_input_pointer_focus_set(Ecore_Wl_Input *input, Ecore_Wl_Window *focus, unsigned int timestamp);
static void _ecore_wl_input_pointer_focus_remove(Ecore_Wl_Input *input, unsigned int timestamp);
static void _ecore_wl_input_mouse_move_send(Ecore_Wl_Input *input, unsigned int timestamp);
static void _ecore_wl_input_mouse_move_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int timestamp);
static void _ecore_wl_input_mouse_in_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int timestamp);
static void _ecore_wl_input_mouse_out_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int timestamp);
static void _ecore_wl_input_focus_in_send(Ecore_Wl_Input *input, unsigned int timestamp);
static void _ecore_wl_input_focus_out_send(Ecore_Wl_Input *input, unsigned int timestamp);
static void _ecore_wl_input_mouse_down_send(Ecore_Wl_Input *input, unsigned int timestamp);
static void _ecore_wl_input_mouse_up_send(Ecore_Wl_Input *input, unsigned int timestamp);
static void _ecore_wl_input_focus_in_send(Ecore_Wl_Input *input __UNUSED__, Ecore_Wl_Window *win, unsigned int timestamp);
static void _ecore_wl_input_focus_out_send(Ecore_Wl_Input *input __UNUSED__, Ecore_Wl_Window *win, unsigned int timestamp);
static void _ecore_wl_input_mouse_down_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int timestamp);
static void _ecore_wl_input_mouse_up_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int timestamp);
static void _ecore_wl_input_mouse_wheel_send(Ecore_Wl_Input *input, unsigned int axis, int value, unsigned int timestamp);
/* wayland interfaces */
@ -96,16 +104,12 @@ ecore_wl_input_grab(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int bu
}
EAPI void
ecore_wl_input_ungrab(Ecore_Wl_Input *input, unsigned int timestamp)
ecore_wl_input_ungrab(Ecore_Wl_Input *input)
{
LOGFN(__FILE__, __LINE__, __FUNCTION__);
input->grab = NULL;
input->grab_button = 0;
if (input->pointer_focus)
_ecore_wl_input_pointer_focus_set(input, input->pointer_focus,
timestamp);
}
void
@ -143,9 +147,6 @@ _ecore_wl_input_del(Ecore_Wl_Input *input)
{
if (!input) return;
_ecore_wl_input_keyboard_focus_remove(input, 0);
_ecore_wl_input_pointer_focus_remove(input, 0);
if (input->drag_source) _ecore_wl_dnd_del(input->drag_source);
input->drag_source = NULL;
@ -183,12 +184,9 @@ _ecore_wl_input_cb_motion(void *data, struct wl_input_device *input_device __UNU
input->timestamp = timestamp;
if (!(input->grab && input->grab_button))
_ecore_wl_input_pointer_focus_set(input, input->pointer_focus,
timestamp);
/* TODO: FIXME: NB: Weston window code has set pointer image here also */
_ecore_wl_input_mouse_move_send(input, timestamp);
if (input->pointer_focus)
_ecore_wl_input_mouse_move_send(input, input->pointer_focus, timestamp);
}
static void
@ -203,28 +201,28 @@ _ecore_wl_input_cb_button(void *data, struct wl_input_device *input_device __UNU
input->timestamp = timestamp;
input->display->serial = serial;
_ecore_wl_input_mouse_move_send(input, timestamp);
// _ecore_wl_input_mouse_move_send(input, timestamp);
if ((input->pointer_focus) && (!input->grab) && (state))
ecore_wl_input_grab(input, input->pointer_focus, button);
if (input->grab)
if (state)
{
if (state)
{
if ((input->pointer_focus) && (!input->grab) && (state))
ecore_wl_input_grab(input, input->pointer_focus, button);
input->button = button;
_ecore_wl_input_mouse_down_send(input, timestamp);
}
else
{
_ecore_wl_input_mouse_up_send(input, timestamp);
input->button = 0;
}
input->button = button;
_ecore_wl_input_mouse_down_send(input, input->pointer_focus,
timestamp);
}
else
{
_ecore_wl_input_mouse_up_send(input, input->pointer_focus,
timestamp);
input->button = 0;
if ((input->grab) && (input->grab_button == button) && (!state))
ecore_wl_input_ungrab(input);
}
if ((input->grab) && (input->grab_button == button) && (!state))
ecore_wl_input_ungrab(input, timestamp);
// _ecore_wl_input_mouse_move_send(input, timestamp);
}
static void
@ -239,7 +237,7 @@ _ecore_wl_input_cb_axis(void *data, struct wl_input_device *input_device __UNUSE
}
static void
_ecore_wl_input_cb_key(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, unsigned int timestamp __UNUSED__, unsigned int key, unsigned int state)
_ecore_wl_input_cb_key(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, unsigned int timestamp, unsigned int key, unsigned int state)
{
Ecore_Wl_Input *input;
Ecore_Wl_Window *win;
@ -249,6 +247,7 @@ _ecore_wl_input_cb_key(void *data, struct wl_input_device *input_device __UNUSED
if (!(input = data)) return;
input->timestamp = timestamp;
input->display->serial = serial;
win = input->keyboard_focus;
if ((!win) || (win->keyboard_device != input)) return;
@ -278,25 +277,66 @@ _ecore_wl_input_cb_pointer_enter(void *data, struct wl_input_device *input_devic
if (!(input = data)) return;
input->display->serial = serial;
input->pointer_enter_serial = serial;
if (!input->timestamp)
{
struct timeval tv;
if ((win = wl_surface_get_user_data(surface)))
win->pointer_device = input;
else
return;
gettimeofday(&tv, NULL);
input->timestamp = (tv.tv_sec * 1000 + tv.tv_usec / 1000);
}
input->sx = sx;
input->sy = sy;
input->display->serial = serial;
input->pointer_enter_serial = serial;
_ecore_wl_input_mouse_move_send(input, input->timestamp);
_ecore_wl_input_pointer_focus_set(input, win, input->timestamp);
if (!(win = wl_surface_get_user_data(surface))) return;
win->pointer_device = input;
input->pointer_focus = win;
_ecore_wl_input_mouse_move_send(input, win, input->timestamp);
_ecore_wl_input_mouse_in_send(input, win, input->timestamp);
/* NB: This whole 'if' below is a major HACK due to wayland's stupidness
* of not sending a mouse_up (or any notification at all for that matter)
* when a move or resize grab is finished */
if (input->grab)
{
/* NB: This COULD mean a move has finished, or it could mean that
* a 'drag' is being done to a different surface */
if ((input->grab == win) && (win->moving))
{
/* NB: 'Fake' a mouse_up for move finished */
win->moving = EINA_FALSE;
_ecore_wl_input_mouse_up_send(input, win, input->timestamp);
input->button = 0;
if ((input->grab) && (input->grab_button == BTN_LEFT))
ecore_wl_input_ungrab(input);
}
else if ((input->grab == win) && (win->resizing))
{
/* NB: 'Fake' a mouse_up for resize finished */
win->resizing = EINA_FALSE;
_ecore_wl_input_mouse_up_send(input, win, input->timestamp);
input->button = 0;
if ((input->grab) && (input->grab_button == BTN_LEFT))
ecore_wl_input_ungrab(input);
}
/* FIXME: Test d-n-d and potentially add needed case here */
}
}
static void
_ecore_wl_input_cb_pointer_leave(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, struct wl_surface *surface __UNUSED__)
_ecore_wl_input_cb_pointer_leave(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, struct wl_surface *surface)
{
Ecore_Wl_Input *input;
Ecore_Wl_Window *win;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
@ -304,8 +344,21 @@ _ecore_wl_input_cb_pointer_leave(void *data, struct wl_input_device *input_devic
input->display->serial = serial;
_ecore_wl_input_mouse_move_send(input, input->timestamp);
_ecore_wl_input_pointer_focus_remove(input, input->timestamp);
if (!surface) return;
if (!(win = wl_surface_get_user_data(surface))) return;
win->pointer_device = NULL;
input->pointer_focus = NULL;
_ecore_wl_input_mouse_move_send(input, win, input->timestamp);
_ecore_wl_input_mouse_out_send(input, win, input->timestamp);
if (input->grab)
{
/* move or resize started */
/* printf("Pointer Leave WITH a Grab\n"); */
}
}
static void
@ -319,30 +372,57 @@ _ecore_wl_input_cb_keyboard_enter(void *data, struct wl_input_device *input_devi
if (!(input = data)) return;
input->display->serial = serial;
input->keyboard_focus = wl_surface_get_user_data(surface);
if (!input->timestamp)
{
struct timeval tv;
gettimeofday(&tv, NULL);
input->timestamp = (tv.tv_sec * 1000 + tv.tv_usec / 1000);
}
end = keys->data + keys->size;
input->modifiers = 0;
for (k = keys->data; k < end; k++)
input->modifiers |= _ecore_wl_disp->xkb->map->modmap[*k];
win = input->keyboard_focus;
win->keyboard_device = input;
input->display->serial = serial;
_ecore_wl_input_focus_in_send(input, input->timestamp);
if (!(win = wl_surface_get_user_data(surface))) return;
win->keyboard_device = input;
input->keyboard_focus = win;
/* FIXME: NB: This may need to be 'serial' */
_ecore_wl_input_focus_in_send(input, win, input->timestamp);
}
static void
_ecore_wl_input_cb_keyboard_leave(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, struct wl_surface *surface __UNUSED__)
_ecore_wl_input_cb_keyboard_leave(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, struct wl_surface *surface)
{
Ecore_Wl_Input *input;
Ecore_Wl_Window *win;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!(input = data)) return;
if (!input->timestamp)
{
struct timeval tv;
gettimeofday(&tv, NULL);
input->timestamp = (tv.tv_sec * 1000 + tv.tv_usec / 1000);
}
input->display->serial = serial;
_ecore_wl_input_keyboard_focus_remove(input, input->timestamp);
if (!surface) return;
if (!(win = wl_surface_get_user_data(surface))) return;
win->keyboard_device = NULL;
input->keyboard_focus = NULL;
_ecore_wl_input_focus_out_send(input, win, input->timestamp);
}
static void
@ -361,7 +441,7 @@ _ecore_wl_input_cb_touch_down(void *data, struct wl_input_device *input_device _
input->button = 0;
input->sx = x;
input->sy = y;
_ecore_wl_input_mouse_down_send(input, timestamp);
_ecore_wl_input_mouse_down_send(input, input->pointer_focus, timestamp);
}
static void
@ -378,7 +458,7 @@ _ecore_wl_input_cb_touch_up(void *data, struct wl_input_device *input_device __U
/* input->timestamp = timestamp; */
input->button = 0;
input->display->serial = serial;
_ecore_wl_input_mouse_up_send(input, timestamp);
_ecore_wl_input_mouse_up_send(input, input->pointer_focus, timestamp);
}
static void
@ -396,7 +476,7 @@ _ecore_wl_input_cb_touch_motion(void *data, struct wl_input_device *input_device
input->sx = x;
input->sy = y;
_ecore_wl_input_mouse_move_send(input, timestamp);
_ecore_wl_input_mouse_move_send(input, input->pointer_focus, timestamp);
}
static void
@ -460,71 +540,9 @@ _ecore_wl_input_cb_data_selection(void *data, struct wl_data_device *data_device
}
static void
_ecore_wl_input_keyboard_focus_remove(Ecore_Wl_Input *input, unsigned int timestamp)
{
Ecore_Wl_Window *win;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!(win = input->keyboard_focus)) return;
win->keyboard_device = NULL;
_ecore_wl_input_focus_out_send(input, timestamp);
input->keyboard_focus = NULL;
}
static void
_ecore_wl_input_pointer_focus_set(Ecore_Wl_Input *input, Ecore_Wl_Window *focus, unsigned int timestamp)
{
Ecore_Wl_Window *ofocus = NULL;
if ((focus) && (focus == input->pointer_focus)) return;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if ((ofocus = input->pointer_focus))
{
if (input->grab) ofocus = input->grab;
_ecore_wl_input_mouse_out_send(input, ofocus, timestamp);
input->pointer_focus = NULL;
ofocus->pointer_device = NULL;
}
if (focus)
{
Ecore_Wl_Window *win;
win = focus;
if (input->grab) win = input->grab;
_ecore_wl_input_mouse_in_send(input, win, timestamp);
input->pointer_focus = focus;
focus->pointer_device = input;
}
}
static void
_ecore_wl_input_pointer_focus_remove(Ecore_Wl_Input *input, unsigned int timestamp)
{
Ecore_Wl_Window *win;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
win = input->pointer_focus;
_ecore_wl_input_pointer_focus_set(input, NULL, timestamp);
input->pointer_focus = NULL;
if (win) win->pointer_device = NULL;
}
static void
_ecore_wl_input_mouse_move_send(Ecore_Wl_Input *input, unsigned int timestamp)
_ecore_wl_input_mouse_move_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int timestamp)
{
Ecore_Event_Mouse_Move *ev;
// Ecore_Event *event;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
@ -533,8 +551,8 @@ _ecore_wl_input_mouse_move_send(Ecore_Wl_Input *input, unsigned int timestamp)
ev->timestamp = timestamp;
ev->x = input->sx;
ev->y = input->sy;
ev->root.x = input->sx;
ev->root.y = input->sy;
/* ev->root.x = input->sx; */
/* ev->root.y = input->sy; */
ev->modifiers = input->modifiers;
ev->multi.device = 0;
ev->multi.radius = 1;
@ -545,16 +563,8 @@ _ecore_wl_input_mouse_move_send(Ecore_Wl_Input *input, unsigned int timestamp)
ev->multi.x = input->sx;
ev->multi.y = input->sy;
if (input->grab)
{
ev->window = input->grab->id;
ev->event_window = input->grab->id;
}
else if (input->pointer_focus)
{
ev->window = input->pointer_focus->id;
ev->event_window = input->pointer_focus->id;
}
ev->window = win->id;
ev->event_window = win->id;
ecore_event_add(ECORE_EVENT_MOUSE_MOVE, ev, NULL, NULL);
}
@ -570,8 +580,8 @@ _ecore_wl_input_mouse_in_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsig
ev->x = input->sx;
ev->y = input->sy;
ev->root.x = input->sx;
ev->root.y = input->sy;
/* ev->root.x = input->sx; */
/* ev->root.y = input->sy; */
ev->modifiers = input->modifiers;
ev->timestamp = timestamp;
@ -592,8 +602,8 @@ _ecore_wl_input_mouse_out_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsi
ev->x = input->sx;
ev->y = input->sy;
ev->root.x = input->sx;
ev->root.y = input->sy;
/* ev->root.x = input->sx; */
/* ev->root.y = input->sy; */
ev->modifiers = input->modifiers;
ev->timestamp = timestamp;
@ -604,7 +614,7 @@ _ecore_wl_input_mouse_out_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsi
}
static void
_ecore_wl_input_focus_in_send(Ecore_Wl_Input *input, unsigned int timestamp)
_ecore_wl_input_focus_in_send(Ecore_Wl_Input *input __UNUSED__, Ecore_Wl_Window *win, unsigned int timestamp)
{
Ecore_Wl_Event_Focus_In *ev;
@ -612,13 +622,12 @@ _ecore_wl_input_focus_in_send(Ecore_Wl_Input *input, unsigned int timestamp)
if (!(ev = calloc(1, sizeof(Ecore_Wl_Event_Focus_In)))) return;
ev->timestamp = timestamp;
if (input->keyboard_focus)
ev->win = input->keyboard_focus->id;
ev->win = win->id;
ecore_event_add(ECORE_WL_EVENT_FOCUS_IN, ev, NULL, NULL);
}
static void
_ecore_wl_input_focus_out_send(Ecore_Wl_Input *input, unsigned int timestamp)
_ecore_wl_input_focus_out_send(Ecore_Wl_Input *input __UNUSED__, Ecore_Wl_Window *win, unsigned int timestamp)
{
Ecore_Wl_Event_Focus_Out *ev;
@ -626,13 +635,12 @@ _ecore_wl_input_focus_out_send(Ecore_Wl_Input *input, unsigned int timestamp)
if (!(ev = calloc(1, sizeof(Ecore_Wl_Event_Focus_Out)))) return;
ev->timestamp = timestamp;
if (input->keyboard_focus)
ev->win = input->keyboard_focus->id;
ev->win = win->id;
ecore_event_add(ECORE_WL_EVENT_FOCUS_OUT, ev, NULL, NULL);
}
static void
_ecore_wl_input_mouse_down_send(Ecore_Wl_Input *input, unsigned int timestamp)
_ecore_wl_input_mouse_down_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int timestamp)
{
Ecore_Event_Mouse_Button *ev;
@ -652,8 +660,8 @@ _ecore_wl_input_mouse_down_send(Ecore_Wl_Input *input, unsigned int timestamp)
ev->timestamp = timestamp;
ev->x = input->sx;
ev->y = input->sy;
ev->root.x = input->sx;
ev->root.y = input->sy;
/* ev->root.x = input->sx; */
/* ev->root.y = input->sy; */
ev->modifiers = input->modifiers;
/* FIXME: Need to get these from wayland somehow */
@ -669,22 +677,14 @@ _ecore_wl_input_mouse_down_send(Ecore_Wl_Input *input, unsigned int timestamp)
ev->multi.x = input->sx;
ev->multi.y = input->sy;
if (input->grab)
{
ev->window = input->grab->id;
ev->event_window = input->grab->id;
}
else if (input->pointer_focus)
{
ev->window = input->pointer_focus->id;
ev->event_window = input->pointer_focus->id;
}
ev->window = win->id;
ev->event_window = win->id;
ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, ev, NULL, NULL);
}
static void
_ecore_wl_input_mouse_up_send(Ecore_Wl_Input *input, unsigned int timestamp)
_ecore_wl_input_mouse_up_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int timestamp)
{
Ecore_Event_Mouse_Button *ev;
@ -704,8 +704,8 @@ _ecore_wl_input_mouse_up_send(Ecore_Wl_Input *input, unsigned int timestamp)
ev->timestamp = timestamp;
ev->x = input->sx;
ev->y = input->sy;
ev->root.x = input->sx;
ev->root.y = input->sy;
/* ev->root.x = input->sx; */
/* ev->root.y = input->sy; */
ev->modifiers = input->modifiers;
/* FIXME: Need to get these from wayland somehow */
@ -721,16 +721,8 @@ _ecore_wl_input_mouse_up_send(Ecore_Wl_Input *input, unsigned int timestamp)
ev->multi.x = input->sx;
ev->multi.y = input->sy;
if (input->grab)
{
ev->window = input->grab->id;
ev->event_window = input->grab->id;
}
else if (input->pointer_focus)
{
ev->window = input->pointer_focus->id;
ev->event_window = input->pointer_focus->id;
}
ev->window = win->id;
ev->event_window = win->id;
ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, ev, NULL, NULL);
}
@ -748,8 +740,8 @@ _ecore_wl_input_mouse_wheel_send(Ecore_Wl_Input *input, unsigned int axis, int v
ev->modifiers = input->modifiers;
ev->x = input->sx;
ev->y = input->sy;
ev->root.x = input->sx;
ev->root.y = input->sy;
/* ev->root.x = input->sx; */
/* ev->root.y = input->sy; */
if (axis == WL_INPUT_DEVICE_AXIS_VERTICAL_SCROLL)
{

View File

@ -2,10 +2,7 @@
# include <config.h>
#endif
#include "Ecore.h"
#include "ecore_private.h"
#include "ecore_wl_private.h"
#include "Ecore_Wayland.h"
/* local function prototypes */
static void _ecore_wl_output_cb_geometry(void *data, struct wl_output *wl_output __UNUSED__, int x, int y, int w, int h, int subpixel __UNUSED__, const char *make __UNUSED__, const char *model __UNUSED__);

View File

@ -4,6 +4,8 @@
# include <limits.h>
# include <xkbcommon/xkbcommon.h>
# include "Ecore.h"
# include "Ecore_Input.h"
# include "Ecore_Wayland.h"
//# define LOGFNS 1

View File

@ -2,12 +2,10 @@
# include <config.h>
#endif
#include "Ecore.h"
#include "ecore_private.h"
#include "ecore_wl_private.h"
#include "Ecore_Wayland.h"
/* local function prototypes */
static void _ecore_wl_window_cb_ping(void *data __UNUSED__, struct wl_shell_surface *shell_surface, unsigned int serial);
static void _ecore_wl_window_cb_configure(void *data, struct wl_shell_surface *shell_surface __UNUSED__, unsigned int edges, int w, int h);
static void _ecore_wl_window_cb_popup_done(void *data, struct wl_shell_surface *shell_surface __UNUSED__);
static void _ecore_wl_window_configure_send(Ecore_Wl_Window *win, int w, int h, unsigned int timestamp);
@ -18,6 +16,7 @@ static Eina_Hash *_windows = NULL;
/* wayland listeners */
static const struct wl_shell_surface_listener _ecore_wl_shell_surface_listener =
{
_ecore_wl_window_cb_ping,
_ecore_wl_window_cb_configure,
_ecore_wl_window_cb_popup_done
};
@ -118,8 +117,9 @@ ecore_wl_window_free(Ecore_Wl_Window *win)
}
if (win->region.input) wl_region_destroy(win->region.input);
win->region.input = NULL;
if (win->region.opaque) wl_region_destroy(win->region.opaque);
win->region.opaque = NULL;
if (win->shell_surface) wl_shell_surface_destroy(win->shell_surface);
win->shell_surface = NULL;
@ -148,8 +148,10 @@ ecore_wl_window_move(Ecore_Wl_Window *win, int x, int y)
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!win) return;
win->allocation.x = x;
win->allocation.y = y;
if (win->shell_surface)
{
Ecore_Wl_Input *input;
@ -165,7 +167,6 @@ ecore_wl_window_move(Ecore_Wl_Window *win, int x, int y)
if ((!input) || (!input->input_device)) return;
ecore_wl_input_ungrab(input, input->timestamp);
wl_shell_surface_move(win->shell_surface, input->input_device,
input->display->serial);
}
@ -191,8 +192,10 @@ ecore_wl_window_resize(Ecore_Wl_Window *win, int w, int h, int location)
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!win) return;
win->allocation.w = w;
win->allocation.h = h;
if (win->type != ECORE_WL_WINDOW_TYPE_FULLSCREEN)
{
win->region.input =
@ -200,6 +203,7 @@ ecore_wl_window_resize(Ecore_Wl_Window *win, int w, int h, int location)
wl_region_add(win->region.input, win->allocation.x, win->allocation.y,
win->allocation.w, win->allocation.h);
}
if (!win->transparent)
{
win->region.opaque =
@ -223,7 +227,6 @@ ecore_wl_window_resize(Ecore_Wl_Window *win, int w, int h, int location)
if ((!input) || (!input->input_device)) return;
ecore_wl_input_ungrab(input, input->timestamp);
wl_shell_surface_resize(win->shell_surface, input->input_device,
input->display->serial, location);
}
@ -255,21 +258,8 @@ ecore_wl_window_buffer_attach(Ecore_Wl_Window *win, struct wl_buffer *buffer, in
case ECORE_WL_WINDOW_BUFFER_TYPE_SHM:
if (win->surface)
{
int dx = 0, dy = 0;
if ((win->server_allocation.w != win->allocation.w) ||
(win->server_allocation.h != win->allocation.h))
{
dx = win->allocation.w - win->server_allocation.w;
dy = win->allocation.h - win->server_allocation.h;
if (buffer)
wl_surface_attach(win->surface, buffer, dx, dy);
}
else
{
if (buffer)
wl_surface_attach(win->surface, buffer, x, y);
}
if (buffer)
wl_surface_attach(win->surface, buffer, x, y);
win->server_allocation = win->allocation;
}
@ -278,6 +268,10 @@ ecore_wl_window_buffer_attach(Ecore_Wl_Window *win, struct wl_buffer *buffer, in
return;
}
if (win->surface)
wl_surface_damage(win->surface, 0, 0,
win->allocation.w, win->allocation.h);
if (win->region.input)
{
wl_surface_set_input_region(win->surface, win->region.input);
@ -291,10 +285,6 @@ ecore_wl_window_buffer_attach(Ecore_Wl_Window *win, struct wl_buffer *buffer, in
wl_region_destroy(win->region.opaque);
win->region.opaque = NULL;
}
if (win->surface)
wl_surface_damage(win->surface, 0, 0,
win->allocation.w, win->allocation.h);
}
/**
@ -490,6 +480,16 @@ ecore_wl_window_update_size(Ecore_Wl_Window *win, int w, int h)
win->allocation.h = h;
}
EAPI void
ecore_wl_window_update_location(Ecore_Wl_Window *win, int x, int y)
{
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!win) return;
win->allocation.x = x;
win->allocation.y = y;
}
EAPI struct wl_surface *
ecore_wl_window_surface_get(Ecore_Wl_Window *win)
{
@ -553,6 +553,12 @@ ecore_wl_window_parent_set(Ecore_Wl_Window *win, Ecore_Wl_Window *parent)
}
/* local functions */
static void
_ecore_wl_window_cb_ping(void *data __UNUSED__, struct wl_shell_surface *shell_surface, unsigned int serial)
{
wl_shell_surface_pong(shell_surface, serial);
}
static void
_ecore_wl_window_cb_configure(void *data, struct wl_shell_surface *shell_surface __UNUSED__, unsigned int edges, int w, int h)
{
@ -561,17 +567,20 @@ _ecore_wl_window_cb_configure(void *data, struct wl_shell_surface *shell_surface
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!(win = data)) return;
if ((w <= 0) || (h <= 0)) return;
win->edges = edges;
win->allocation.w = w;
win->allocation.h = h;
if (win->region.input) wl_region_destroy(win->region.input);
win->region.input = NULL;
if (win->region.opaque) wl_region_destroy(win->region.opaque);
win->region.opaque = NULL;
/* FIXME: 0 timestamp here may not work. need to test */
_ecore_wl_window_configure_send(win, w, h, 0);
if ((win->allocation.w != w) || (win->allocation.h != h))
{
win->edges = edges;
if (win->region.input) wl_region_destroy(win->region.input);
win->region.input = NULL;
if (win->region.opaque) wl_region_destroy(win->region.opaque);
win->region.opaque = NULL;
/* FIXME: 0 timestamp here may not work. need to test */
_ecore_wl_window_configure_send(win, w, h, 0);
}
}
static void
@ -582,7 +591,7 @@ _ecore_wl_window_cb_popup_done(void *data, struct wl_shell_surface *shell_surfac
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!(win = data)) return;
ecore_wl_input_ungrab(win->pointer_device, 0);
ecore_wl_input_ungrab(win->pointer_device);
}
static void