diff --git a/legacy/ecore/src/lib/ecore_wayland/Ecore_Wayland.h b/legacy/ecore/src/lib/ecore_wayland/Ecore_Wayland.h index 72a2e02b2b..128d2706bc 100644 --- a/legacy/ecore/src/lib/ecore_wayland/Ecore_Wayland.h +++ b/legacy/ecore/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/legacy/ecore/src/lib/ecore_wayland/ecore_wl.c b/legacy/ecore/src/lib/ecore_wayland/ecore_wl.c index a7a7a0bb49..9339becb23 100644 --- a/legacy/ecore/src/lib/ecore_wayland/ecore_wl.c +++ b/legacy/ecore/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/legacy/ecore/src/lib/ecore_wayland/ecore_wl_dnd.c b/legacy/ecore/src/lib/ecore_wayland/ecore_wl_dnd.c index 5d812251bf..ced46c13dc 100644 --- a/legacy/ecore/src/lib/ecore_wayland/ecore_wl_dnd.c +++ b/legacy/ecore/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/legacy/ecore/src/lib/ecore_wayland/ecore_wl_input.c b/legacy/ecore/src/lib/ecore_wayland/ecore_wl_input.c index 9463562b51..b7e6f9566a 100644 --- a/legacy/ecore/src/lib/ecore_wayland/ecore_wl_input.c +++ b/legacy/ecore/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 (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) { diff --git a/legacy/ecore/src/lib/ecore_wayland/ecore_wl_output.c b/legacy/ecore/src/lib/ecore_wayland/ecore_wl_output.c index 3791ebc3cf..8ad6ce5d70 100644 --- a/legacy/ecore/src/lib/ecore_wayland/ecore_wl_output.c +++ b/legacy/ecore/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/legacy/ecore/src/lib/ecore_wayland/ecore_wl_private.h b/legacy/ecore/src/lib/ecore_wayland/ecore_wl_private.h index 31956a1904..75b562c4e8 100644 --- a/legacy/ecore/src/lib/ecore_wayland/ecore_wl_private.h +++ b/legacy/ecore/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/legacy/ecore/src/lib/ecore_wayland/ecore_wl_window.c b/legacy/ecore/src/lib/ecore_wayland/ecore_wl_window.c index 431e480820..d94933456b 100644 --- a/legacy/ecore/src/lib/ecore_wayland/ecore_wl_window.c +++ b/legacy/ecore/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) { @@ -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