wayland: move pointer-related functions to ecore_wl2_input namespace

windows do not have pointers or cursors under wayland, seats do. due to
lack of multiseat support, most components simply use the "default" seat
with these functions, but this should make the corresponding code more
easily adaptable
This commit is contained in:
Mike Blumenkrantz 2017-05-17 16:02:53 -04:00
parent 55cfc97455
commit 2fe7878235
8 changed files with 124 additions and 146 deletions

View File

@ -928,59 +928,6 @@ EAPI Eina_Bool ecore_wl2_window_iconified_get(Ecore_Wl2_Window *window);
*/
EAPI void ecore_wl2_window_iconified_set(Ecore_Wl2_Window *window, Eina_Bool iconified);
/**
* Retrieves the mouse position of the current window.
*
* @param window The window on which to retrieve the mouse position
* @param x where to return the horizontal position. May be NULL. Returns 0 on error.
* @param y where to return the vertical position. May be NULL. Returns 0 on error.
*
* @ingroup Ecore_Wl2_Window_Group
* @see ecore_wl2_window_pointer_device_xy_get
* @since 1.17
*/
EAPI void ecore_wl2_window_pointer_xy_get(Ecore_Wl2_Window *window, int *x, int *y);
/**
* Retrieves the mouse position of the current window.
*
* @param window The window on which to retrieve the mouse position.
* @param pointer The Efl.Input.Pointer device to fetch the position.
* @param x where to return the horizontal position. May be NULL. Returns 0 on error.
* @param y where to return the vertical position. May be NULL. Returns 0 on error.
* @ingroup Ecore_Wl2_Window_Group
* @since 1.19
*/
EAPI void ecore_wl2_window_pointer_device_xy_get(Ecore_Wl2_Window *window, const Eo *pointer, int *x, int *y);
/**
* Set a given wl_surface to use as the pointer on a window
*
* @param window The window to set this surface as the pointer on
* @param surface The surface to use as the pointer
* @param hot_x The x coordinate to use as the cursor hot spot
* @param hot_y The y coordinate to use as the cursor hot spot
*
* @ingroup Ecore_Wl2_Window_Group
* @since 1.17
*/
EAPI void ecore_wl2_window_pointer_set(Ecore_Wl2_Window *window, struct wl_surface *surface, int hot_x, int hot_y);
/**
* Set a specific cursor on a given window
*
* @brief This function will try to find a matching cursor inside the existing
* cursor theme and set the pointer which is over the given window to be
* the specified cursor
*
* @param window The window to set the cursor on
* @param cursor The name of the cursor to try and set
*
* @ingroup Ecore_Wl2_Window_Group
* @since 1.17
*/
EAPI void ecore_wl2_window_cursor_from_name_set(Ecore_Wl2_Window *window, const char *cursor);
/**
* Set the type of a given window
*
@ -1074,6 +1021,45 @@ EAPI Eina_Bool ecore_wl2_input_keyboard_repeat_get(const Ecore_Wl2_Input *input,
* @since 1.20
*/
EAPI Eo *ecore_wl2_input_seat_device_get(const Ecore_Wl2_Input *input, const Ecore_Wl2_Window *window);
/**
* Retrieves the mouse position of the seat
*
* @param input The seat
* @param x where to return the horizontal position. May be NULL. Returns 0 on error.
* @param y where to return the vertical position. May be NULL. Returns 0 on error.
* @return @c EINA_TRUE if coords were successfully retrieved
*
* @since 1.20
*/
EAPI Eina_Bool ecore_wl2_input_pointer_xy_get(const Ecore_Wl2_Input *input, int *x, int *y);
/**
* Set a given wl_surface to use as the pointer on a seat
*
* @param input The seat to set this surface as the pointer on
* @param surface The surface to use as the pointer
* @param hot_x The x coordinate to use as the cursor hot spot
* @param hot_y The y coordinate to use as the cursor hot spot
*
* @since 1.20
*/
EAPI void ecore_wl2_input_pointer_set(Ecore_Wl2_Input *input, struct wl_surface *surface, int hot_x, int hot_y);
/**
* Set a specific cursor on a given seat
*
* @brief This function will try to find a matching cursor inside the existing
* cursor theme and set the pointer for the specified seat to be
* the specified cursor
*
* @param input The seat to set the cursor on
* @param cursor The name of the cursor to try and set
*
* @since 1.20
*/
EAPI void ecore_wl2_input_cursor_from_name_set(Ecore_Wl2_Input *input, const char *cursor);
/**
* @defgroup Ecore_Wl2_Dnd_Group Wayland Library Drag-n-Drop Functions
* @ingroup Ecore_Wl2_Group

View File

@ -486,7 +486,7 @@ ecore_wl2_dnd_drag_start(Ecore_Wl2_Input *input, Ecore_Wl2_Window *window, Ecore
osurface, dsurface, input->display->serial);
input->data.drag.serial = input->display->serial;
ecore_wl2_window_cursor_from_name_set(window, "move");
ecore_wl2_input_cursor_from_name_set(input, "move");
}
return input->data.drag.serial;
}

View File

@ -1698,3 +1698,35 @@ ecore_wl2_input_seat_device_get(const Ecore_Wl2_Input *input, const Ecore_Wl2_Wi
devices = _ecore_wl2_devices_get(input, window->id);
return devices ? devices->seat_dev : NULL;
}
EAPI void
ecore_wl2_input_pointer_set(Ecore_Wl2_Input *input, struct wl_surface *surface, int hot_x, int hot_y)
{
EINA_SAFETY_ON_NULL_RETURN(input);
input->cursor.surface = surface;
input->cursor.hot_x = hot_x;
input->cursor.hot_y = hot_y;
_ecore_wl2_input_cursor_update(input);
}
EAPI void
ecore_wl2_input_cursor_from_name_set(Ecore_Wl2_Input *input, const char *cursor)
{
EINA_SAFETY_ON_NULL_RETURN(input);
_ecore_wl2_input_cursor_set(input, cursor);
}
EAPI Eina_Bool
ecore_wl2_input_pointer_xy_get(const Ecore_Wl2_Input *input, int *x, int *y)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(input, EINA_FALSE);
if (x) *x = 0;
if (y) *y = 0;
if (!input->wl.pointer) return EINA_FALSE;
if (x) *x = input->pointer.sx;
if (y) *y = input->pointer.sy;
return EINA_TRUE;
}

View File

@ -1143,80 +1143,10 @@ ecore_wl2_window_iconified_set(Ecore_Wl2_Window *window, Eina_Bool iconified)
}
EAPI void
ecore_wl2_window_pointer_xy_get(Ecore_Wl2_Window *window, int *x, int *y)
ecore_wl2_window_type_set(Ecore_Wl2_Window *window, Ecore_Wl2_Window_Type type)
{
Ecore_Wl2_Input *input;
EINA_SAFETY_ON_NULL_RETURN(window);
if (x) *x = 0;
if (y) *y = 0;
input = ecore_wl2_window_input_get(window);
if (!input) return;
if (x) *x = input->pointer.sx;
if (y) *y = input->pointer.sy;
}
EAPI void
ecore_wl2_window_pointer_device_xy_get(Ecore_Wl2_Window *window, const Eo *pointer, int *x, int *y)
{
Ecore_Wl2_Input_Devices *devs;
Eina_List *l;
Ecore_Wl2_Input *input;
EINA_SAFETY_ON_NULL_RETURN(window);
EINA_SAFETY_ON_NULL_RETURN(pointer);
if (x) *x = 0;
if (y) *y = 0;
EINA_INLIST_FOREACH(window->display->inputs, input)
{
if (!input->wl.pointer)
continue;
EINA_LIST_FOREACH(input->devices_list, l, devs)
{
if ((devs->window_id == window->id) &&
(devs->pointer_dev == pointer))
{
if (x) *x = input->pointer.sx;
if (y) *y = input->pointer.sy;
}
}
}
}
EAPI void
ecore_wl2_window_pointer_set(Ecore_Wl2_Window *window, struct wl_surface *surface, int hot_x, int hot_y)
{
Ecore_Wl2_Input *input;
EINA_SAFETY_ON_NULL_RETURN(window);
input = ecore_wl2_window_input_get(window);
if (!input) return;
input->cursor.surface = surface;
input->cursor.hot_x = hot_x;
input->cursor.hot_y = hot_y;
_ecore_wl2_input_cursor_update(input);
}
EAPI void
ecore_wl2_window_cursor_from_name_set(Ecore_Wl2_Window *window, const char *cursor)
{
Ecore_Wl2_Input *input;
EINA_SAFETY_ON_NULL_RETURN(window);
input = ecore_wl2_window_input_get(window);
if (!input) return;
_ecore_wl2_input_cursor_set(input, cursor);
window->type = type;
}
EAPI void

View File

@ -3128,8 +3128,14 @@ _elm_win_wl_cursor_set(Evas_Object *obj, const char *cursor)
}
if ((sd->wl.win) && (sd->pointer.surf) && (sd->pointer.visible))
ecore_wl2_window_pointer_set(sd->wl.win, sd->pointer.surf,
sd->pointer.hot_x, sd->pointer.hot_y);
{
/* FIXME: multiseat */
Ecore_Wl2_Input *input;
input = ecore_wl2_display_input_find_by_name(ecore_wl2_window_display_get(sd->wl.win), "default");
EINA_SAFETY_ON_NULL_RETURN(input);
ecore_wl2_input_pointer_set(input, sd->pointer.surf, sd->pointer.hot_x, sd->pointer.hot_y);
}
}
#endif
@ -4080,7 +4086,7 @@ _elm_win_frame_cb_menu(void *data,
if (x < 0) x += wx;
if (y < 0) y += wy;
input = ecore_wl2_window_input_get(sd->wl.win);
input = ecore_wl2_display_input_find_by_name(ecore_wl2_window_display_get(sd->wl.win), "default");
if (sd->wl.win->zxdg_toplevel)
zxdg_toplevel_v6_show_window_menu(sd->wl.win->zxdg_toplevel,

View File

@ -2880,6 +2880,18 @@ _wl_sel_obj_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_i
if (dragwidget == obj) dragwidget = NULL;
}
static Ecore_Wl2_Input *
_wl_default_seat_get(Ecore_Wl2_Window *win, Evas_Object *obj)
{
Eo *seat;
if (!obj) return ecore_wl2_display_input_find_by_name(ecore_wl2_window_display_get(win), "default");
seat = evas_device_get(evas_object_evas_get(obj), "default");
EINA_SAFETY_ON_NULL_RETURN_VAL(seat, NULL);
return ecore_wl2_display_input_find(ecore_wl2_window_display_get(win),
evas_device_seat_id_get(seat));
}
static void
_wl_sel_obj_del2(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
{
@ -2973,7 +2985,7 @@ _wl_elm_cnp_selection_set(Evas_Object *obj, Elm_Sel_Type selection, Elm_Sel_Form
}
types[count - 1] = 0;
sel->selection_serial = ecore_wl2_dnd_selection_set(ecore_wl2_window_input_get(win), types);
sel->selection_serial = ecore_wl2_dnd_selection_set(_wl_default_seat_get(win, obj), types);
free(types);
return EINA_TRUE;
@ -3098,7 +3110,7 @@ _wl_elm_cnp_selection_get(const Evas_Object *obj, Elm_Sel_Type selection, Elm_Se
if (selection == ELM_SEL_TYPE_XDND) return EINA_FALSE;
input = ecore_wl2_window_input_get(win);
input = _wl_default_seat_get(win, (void*)obj);
offer = ecore_wl2_dnd_selection_get(input);
//there can be no selection available
@ -3173,7 +3185,7 @@ _wl_elm_cnp_selection_clear(Evas_Object *obj, Elm_Sel_Type selection EINA_UNUSED
ELM_SAFE_FREE(sel->selbuf, free);
sel->buflen = 0;
/* sel->clear(); */
sel->selection_serial = ecore_wl2_dnd_selection_clear(ecore_wl2_window_input_get(_wl_elm_widget_window_get(obj)));
sel->selection_serial = ecore_wl2_dnd_selection_clear(_wl_default_seat_get(_wl_elm_widget_window_get(obj), obj));
return EINA_TRUE;
}
@ -3426,7 +3438,7 @@ _wl_elm_drag_start(Evas_Object *obj, Elm_Sel_Format format, const char *data,
types[nb_types] = NULL;
win = _wl_elm_widget_window_get(obj);
ecore_wl2_dnd_drag_types_set(ecore_wl2_window_input_get(win), types);
ecore_wl2_dnd_drag_types_set(_wl_default_seat_get(win, obj), types);
/* set the drag data used when a drop occurs */
free(wl_cnp_selection.selbuf);
@ -3517,7 +3529,7 @@ _wl_elm_drag_start(Evas_Object *obj, Elm_Sel_Format format, const char *data,
parent = ecore_evas_wayland2_window_get(ee);
}
wl_cnp_selection.drag_serial = ecore_wl2_dnd_drag_start(ecore_wl2_window_input_get(win), parent, win);
wl_cnp_selection.drag_serial = ecore_wl2_dnd_drag_start(_wl_default_seat_get(win, obj), parent, win);
return EINA_TRUE;
}
@ -3772,7 +3784,7 @@ _wl_dnd_drop(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
}
win = ecore_wl2_display_window_find(_elm_wl_display, ev->win);
ecore_wl2_dnd_drag_end(ecore_wl2_window_input_get(win));
ecore_wl2_dnd_drag_end(_wl_default_seat_get(win, NULL));
return ECORE_CALLBACK_PASS_ON;
}
@ -3812,7 +3824,7 @@ _wl_dnd_end(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
doaccept = EINA_FALSE;
win = ecore_wl2_display_window_find(_elm_wl_display, ev->win);
ecore_wl2_input_ungrab(ecore_wl2_window_input_get(win));
ecore_wl2_input_ungrab(_wl_default_seat_get(win, NULL));
return ECORE_CALLBACK_PASS_ON;
}
@ -3863,7 +3875,7 @@ _wl_dropable_data_handle(Wl_Cnp_Selection *sel, Ecore_Wl2_Event_Offer_Data_Ready
}
}
win = _wl_elm_widget_window_get(sel->requestwidget);
ecore_wl2_dnd_drag_end(ecore_wl2_window_input_get(win));
ecore_wl2_dnd_drag_end(_wl_default_seat_get(win, NULL));
if (tmp_info) _tmpinfo_free(tmp_info);
free(ddata.data);
return;
@ -3871,7 +3883,7 @@ _wl_dropable_data_handle(Wl_Cnp_Selection *sel, Ecore_Wl2_Event_Offer_Data_Ready
}
win = _wl_elm_widget_window_get(sel->requestwidget);
ecore_wl2_dnd_drag_end(ecore_wl2_window_input_get(win));
ecore_wl2_dnd_drag_end(_wl_default_seat_get(win, NULL));
savedtypes.textreq = 0;
}
@ -5255,7 +5267,7 @@ elm_selection_selection_has_owner(Evas_Object *obj)
win = _wl_elm_widget_window_get(obj);
if (win)
return !!ecore_wl2_dnd_selection_get(ecore_wl2_window_input_get(win));
return !!ecore_wl2_dnd_selection_get(_wl_default_seat_get(win, obj));
#endif
return _local_elm_selection_selection_has_owner(obj);
}
@ -5784,7 +5796,7 @@ elm_drag_cancel(Evas_Object *obj)
win = _wl_elm_widget_window_get(obj);
if (win)
ecore_wl2_dnd_drag_end(ecore_wl2_window_input_get(win));
ecore_wl2_dnd_drag_end(_wl_default_seat_get(win, obj));
#endif
end:

View File

@ -1095,22 +1095,30 @@ static void
_ecore_evas_wl_common_pointer_xy_get(const Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y)
{
Ecore_Evas_Engine_Wl_Data *wdata;
Ecore_Wl2_Input *input;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
wdata = ee->engine.data;
ecore_wl2_window_pointer_xy_get(wdata->win, x, y);
input = ecore_wl2_display_input_find_by_name(ecore_wl2_window_display_get(wdata->win), "default");
if (input) ecore_wl2_input_pointer_xy_get(input, x, y);
}
static void
_ecore_evas_wl_common_pointer_device_xy_get(const Ecore_Evas *ee, const Efl_Input_Device *pointer, Evas_Coord *x, Evas_Coord *y)
{
Ecore_Evas_Engine_Wl_Data *wdata;
Ecore_Wl2_Input *input;
const Eo *seat;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
wdata = ee->engine.data;
ecore_wl2_window_pointer_device_xy_get(wdata->win, pointer, x, y);
seat = evas_device_parent_get(pointer);
EINA_SAFETY_ON_NULL_RETURN(seat);
input = ecore_wl2_display_input_find(ecore_wl2_window_display_get(wdata->win), evas_device_seat_id_get(seat));
EINA_SAFETY_ON_NULL_RETURN(input);
ecore_wl2_input_pointer_xy_get(input, x, y);
}
static void
@ -1233,13 +1241,15 @@ _ecore_evas_wl_common_aspect_set(Ecore_Evas *ee, double aspect)
}
static void
_ecore_evas_wl_common_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer EINA_UNUSED, int hot_x EINA_UNUSED, int hot_y EINA_UNUSED)
_ecore_evas_wl_common_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer EINA_UNUSED, int hot_x, int hot_y)
{
Ecore_Evas_Engine_Wl_Data *wdata;
Ecore_Wl2_Input *input;
wdata = ee->engine.data;
if (obj != _ecore_evas_default_cursor_image_get(ee))
ecore_wl2_window_pointer_set(wdata->win, NULL, 0, 0);
if (obj == _ecore_evas_default_cursor_image_get(ee)) return;
input = ecore_wl2_display_input_find_by_name(ecore_wl2_window_display_get(wdata->win), "default");
if (input) ecore_wl2_input_pointer_set(input, NULL, hot_x, hot_y);
}
static void

View File

@ -374,7 +374,9 @@ static void
set_focus(Ecore_IMF_Context *ctx)
{
WaylandIMContext *imcontext = (WaylandIMContext *)ecore_imf_context_data_get(ctx);
Ecore_Wl2_Input *input = ecore_wl2_window_input_get(imcontext->window);
Ecore_Wl2_Input *input;
input = ecore_wl2_display_input_find_by_name(ecore_wl2_window_display_get(imcontext->window), "default");
if (!input)
return;