Skip to content

Commit cfa9699

Browse files
committed
Add API to allow handling pointer lock requests and events
Similar to the fullscreen API there's now a pointer lock handler that can be set to handle the requests to lock or unlock the pointer. A new input type wpe_input_pointer_lock_event has been added, which extends wpe_input_pointer_event to include the movement delta required by pointer lock motion events.
1 parent 5902d8e commit cfa9699

File tree

4 files changed

+107
-1
lines changed

4 files changed

+107
-1
lines changed

include/wpe/input.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,11 @@ struct wpe_input_pointer_event {
8686
uint32_t modifiers;
8787
};
8888

89+
struct wpe_input_pointer_lock_event {
90+
struct wpe_input_pointer_event base;
91+
double x_delta;
92+
double y_delta;
93+
};
8994

9095
enum wpe_input_axis_event_type {
9196
wpe_input_axis_event_type_null,

include/wpe/view-backend.h

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ struct wpe_view_backend;
5353
struct wpe_input_axis_event;
5454
struct wpe_input_keyboard_event;
5555
struct wpe_input_pointer_event;
56+
struct wpe_input_pointer_lock_event;
5657
struct wpe_input_touch_event;
5758

5859
struct wpe_view_backend_client;
@@ -146,6 +147,37 @@ WPE_EXPORT
146147
void
147148
wpe_view_backend_set_fullscreen_handler(struct wpe_view_backend*, wpe_view_backend_fullscreen_handler handler, void* userdata);
148149

150+
/**
151+
* wpe_view_backend_pointer_lock_handler:
152+
* @userdata: (transfer none): User data passed to the embedder.
153+
* @enable: (transfer none): User data passed to the embedder.
154+
*
155+
* Type of functions used by an embedder to implement pointer lock in web views.
156+
*
157+
* Returns: a boolean indicating whether the operation was completed.
158+
*
159+
* Since: 1.14
160+
*/
161+
typedef bool (*wpe_view_backend_pointer_lock_handler)(void* userdata, bool enable);
162+
163+
/**
164+
* wpe_view_backend_set_pointer_lock_handler:
165+
* @view_backend: (transfer none): The view backend to obtains events from.
166+
* @handler: (transfer none): Function used by an embedder to implement pointer lock.
167+
* @userdata: (transfer none): User data passed to the handler function.
168+
*
169+
* Handler function set by an embedder to implement pointer lock in web views.
170+
*
171+
* This function must be only used once for a given @view_backend, the handler
172+
* cannot be changed once it has been set.
173+
*
174+
* Since: 1.14
175+
*/
176+
WPE_EXPORT
177+
void wpe_view_backend_set_pointer_lock_handler(struct wpe_view_backend*,
178+
wpe_view_backend_pointer_lock_handler handler,
179+
void* userdata);
180+
149181
WPE_EXPORT
150182
void
151183
wpe_view_backend_initialize(struct wpe_view_backend*);
@@ -231,12 +263,12 @@ struct wpe_view_backend_input_client {
231263
void (*handle_pointer_event)(void*, struct wpe_input_pointer_event*);
232264
void (*handle_axis_event)(void*, struct wpe_input_axis_event*);
233265
void (*handle_touch_event)(void*, struct wpe_input_touch_event*);
266+
void (*handle_pointer_lock_event)(void*, struct wpe_input_pointer_lock_event*);
234267

235268
/*< private >*/
236269
void (*_wpe_reserved0)(void);
237270
void (*_wpe_reserved1)(void);
238271
void (*_wpe_reserved2)(void);
239-
void (*_wpe_reserved3)(void);
240272
};
241273

242274
WPE_EXPORT
@@ -255,6 +287,9 @@ WPE_EXPORT
255287
void
256288
wpe_view_backend_dispatch_touch_event(struct wpe_view_backend*, struct wpe_input_touch_event*);
257289

290+
WPE_EXPORT
291+
void wpe_view_backend_dispatch_pointer_lock_event(struct wpe_view_backend*, struct wpe_input_pointer_lock_event*);
292+
258293
/**
259294
* wpe_view_backend_fullscreen_client:
260295
* @did_enter_fullscreen: Invoked after fullscreen has been successfully entered.
@@ -345,6 +380,31 @@ WPE_EXPORT
345380
void
346381
wpe_view_backend_dispatch_request_exit_fullscreen(struct wpe_view_backend*);
347382

383+
/**
384+
* wpe_view_backend_request_pointer_lock:
385+
* @view_backend: (transfer none): The view backend that triggered the event.
386+
*
387+
* Request the platform to lock the pointer.
388+
*
389+
* Returns: a boolean indicating whether the operation was completed.
390+
*
391+
* Since: 1.14
392+
*/
393+
WPE_EXPORT
394+
bool wpe_view_backend_request_pointer_lock(struct wpe_view_backend*);
395+
396+
/**
397+
* wpe_view_backend_request_pointer_unlock:
398+
* @view_backend: (transfer none): The view backend that triggered the event.
399+
*
400+
* Request the platform to unlock the pointer.
401+
*
402+
* Returns: a boolean indicating whether the operation was completed.
403+
*
404+
* Since: 1.14
405+
*/
406+
WPE_EXPORT
407+
bool wpe_view_backend_request_pointer_unlock(struct wpe_view_backend*);
348408

349409
#ifdef __cplusplus
350410
}

src/view-backend-private.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ struct wpe_view_backend {
4848
wpe_view_backend_fullscreen_handler fullscreen_handler;
4949
void* fullscreen_handler_data;
5050

51+
wpe_view_backend_pointer_lock_handler pointer_lock_handler;
52+
void* pointer_lock_handler_data;
53+
5154
uint32_t activity_state;
5255
uint32_t refresh_rate;
5356
};

src/view-backend.c

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ wpe_view_backend_destroy(struct wpe_view_backend* backend)
6868
backend->fullscreen_client = NULL;
6969
backend->fullscreen_client_data = NULL;
7070

71+
backend->pointer_lock_handler = NULL;
72+
backend->pointer_lock_handler_data = NULL;
73+
7174
backend->activity_state = 0;
7275
backend->refresh_rate = 0;
7376

@@ -208,6 +211,14 @@ wpe_view_backend_dispatch_pointer_event(struct wpe_view_backend* backend, struct
208211
backend->input_client->handle_pointer_event(backend->input_client_data, event);
209212
}
210213

214+
void
215+
wpe_view_backend_dispatch_pointer_lock_event(struct wpe_view_backend* backend,
216+
struct wpe_input_pointer_lock_event* event)
217+
{
218+
if (backend->input_client)
219+
backend->input_client->handle_pointer_lock_event(backend->input_client_data, event);
220+
}
221+
211222
void
212223
wpe_view_backend_dispatch_axis_event(struct wpe_view_backend* backend, struct wpe_input_axis_event* event)
213224
{
@@ -266,3 +277,30 @@ wpe_view_backend_dispatch_request_exit_fullscreen(struct wpe_view_backend* backe
266277
if (backend->fullscreen_client)
267278
backend->fullscreen_client->request_exit_fullscreen(backend->fullscreen_client_data);
268279
}
280+
281+
void
282+
wpe_view_backend_set_pointer_lock_handler(struct wpe_view_backend* backend,
283+
wpe_view_backend_pointer_lock_handler handler,
284+
void* userdata)
285+
{
286+
assert(!backend->pointer_lock_handler);
287+
288+
backend->pointer_lock_handler = handler;
289+
backend->pointer_lock_handler_data = userdata;
290+
}
291+
292+
bool
293+
wpe_view_backend_request_pointer_lock(struct wpe_view_backend* backend)
294+
{
295+
if (backend->pointer_lock_handler)
296+
return backend->pointer_lock_handler(backend->pointer_lock_handler_data, true);
297+
return false;
298+
}
299+
300+
bool
301+
wpe_view_backend_request_pointer_unlock(struct wpe_view_backend* backend)
302+
{
303+
if (backend->pointer_lock_handler)
304+
return backend->pointer_lock_handler(backend->pointer_lock_handler_data, false);
305+
return false;
306+
}

0 commit comments

Comments
 (0)