From d4dba8341e15c8ec5373cc98dcb9586aa0386f80 Mon Sep 17 00:00:00 2001 From: devilhorns Date: Tue, 24 Apr 2012 16:59:35 +0000 Subject: [PATCH] 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. git-svn-id: http://svn.enlightenment.org/svn/e/trunk/ecore@70443 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/lib/ecore_wayland/Ecore_Wayland.h | 5 +- src/lib/ecore_wayland/ecore_wl.c | 6 +- src/lib/ecore_wayland/ecore_wl_dnd.c | 5 +- src/lib/ecore_wayland/ecore_wl_input.c | 348 +++++++++++++++---------------- src/lib/ecore_wayland/ecore_wl_output.c | 3 - src/lib/ecore_wayland/ecore_wl_private.h | 2 + src/lib/ecore_wayland/ecore_wl_window.c | 79 +++---- 7 files changed, 224 insertions(+), 224 deletions(-) diff --git a/src/lib/ecore_wayland/Ecore_Wayland.h b/src/lib/ecore_wayland/Ecore_Wayland.h index 72a2e02..128d270 100644 --- a/src/lib/ecore_wayland/Ecore_Wayland.h +++ b/src/lib/ecore_wayland/Ecore_Wayland.h @@ -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); diff --git a/src/lib/ecore_wayland/ecore_wl.c b/src/lib/ecore_wayland/ecore_wl.c index a7a7a0b..9339bec 100644 --- a/src/lib/ecore_wayland/ecore_wl.c +++ b/src/lib/ecore_wayland/ecore_wl.c @@ -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); */ diff --git a/src/lib/ecore_wayland/ecore_wl_dnd.c b/src/lib/ecore_wayland/ecore_wl_dnd.c index 5d81225..ced46c1 100644 --- a/src/lib/ecore_wayland/ecore_wl_dnd.c +++ b/src/lib/ecore_wayland/ecore_wl_dnd.c @@ -2,10 +2,7 @@ # include #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; } diff --git a/src/lib/ecore_wayland/ecore_wl_input.c b/src/lib/ecore_wayland/ecore_wl_input.c index 9463562..b7e6f95 100644 --- a/src/lib/ecore_wayland/ecore_wl_input.c +++ b/src/lib/ecore_wayland/ecore_wl_input.c @@ -2,11 +2,22 @@ # include #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 (state) + { + if ((input->pointer_focus) && (!input->grab) && (state)) + ecore_wl_input_grab(input, input->pointer_focus, button); - if (input->grab) + input->button = button; + _ecore_wl_input_mouse_down_send(input, input->pointer_focus, + timestamp); + } + else { - if (state) - { + _ecore_wl_input_mouse_up_send(input, input->pointer_focus, + timestamp); + input->button = 0; - input->button = button; - _ecore_wl_input_mouse_down_send(input, timestamp); - } - else - { - _ecore_wl_input_mouse_up_send(input, 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; + + 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; - _ecore_wl_input_mouse_move_send(input, input->timestamp); - _ecore_wl_input_pointer_focus_set(input, win, input->timestamp); + 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; + input->display->serial = serial; + + if (!(win = wl_surface_get_user_data(surface))) return; + win->keyboard_device = input; + input->keyboard_focus = win; - _ecore_wl_input_focus_in_send(input, input->timestamp); + /* 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) { diff --git a/src/lib/ecore_wayland/ecore_wl_output.c b/src/lib/ecore_wayland/ecore_wl_output.c index 3791ebc..8ad6ce5 100644 --- a/src/lib/ecore_wayland/ecore_wl_output.c +++ b/src/lib/ecore_wayland/ecore_wl_output.c @@ -2,10 +2,7 @@ # include #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__); diff --git a/src/lib/ecore_wayland/ecore_wl_private.h b/src/lib/ecore_wayland/ecore_wl_private.h index 31956a1..75b562c 100644 --- a/src/lib/ecore_wayland/ecore_wl_private.h +++ b/src/lib/ecore_wayland/ecore_wl_private.h @@ -4,6 +4,8 @@ # include # include +# include "Ecore.h" +# include "Ecore_Input.h" # include "Ecore_Wayland.h" //# define LOGFNS 1 diff --git a/src/lib/ecore_wayland/ecore_wl_window.c b/src/lib/ecore_wayland/ecore_wl_window.c index 431e480..d949334 100644 --- a/src/lib/ecore_wayland/ecore_wl_window.c +++ b/src/lib/ecore_wayland/ecore_wl_window.c @@ -2,12 +2,10 @@ # include #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) { @@ -554,6 +554,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) { Ecore_Wl_Window *win; @@ -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 -- 2.7.4