Skip to content

Commit 010e07b

Browse files
author
Mariotaku
committed
improved mouse/keyboard grabbing
1 parent dfbf2a3 commit 010e07b

12 files changed

Lines changed: 75 additions & 35 deletions

File tree

src/app/app.c

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,6 @@ int app_init(app_t *app, app_settings_loader *settings_loader, int argc, char *a
6868
SDL_SetHint(SDL_HINT_WEBOS_CURSOR_FREQUENCY, "60");
6969
SDL_SetHint(SDL_HINT_WEBOS_CURSOR_CALIBRATION_DISABLE, "true");
7070
SDL_SetHint(SDL_HINT_WEBOS_HIDAPI_IGNORE_BLUETOOTH_DEVICES, "0x057e/0x0000");
71-
if (app->settings.syskey_capture) {
72-
SDL_SetHint(SDL_HINT_WEBOS_ACCESS_POLICY_KEYS_HOME, "true");
73-
SDL_SetHint(SDL_HINT_WEBOS_ACCESS_POLICY_RIBBON, "false");
74-
}
75-
#else
76-
if (app->settings.syskey_capture) {
77-
SDL_SetHint(SDL_HINT_GRAB_KEYBOARD, "1");
78-
}
7971
#endif
8072
// DO not init video subsystem before NDL/LGNC initialization
8173
if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) {

src/app/app.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ GS_CLIENT app_gs_client_new(app_t *app);
8787

8888
void app_set_mouse_grab(app_input_t *input, bool grab);
8989

90+
void app_set_keyboard_grab(app_input_t *input, bool grab);
91+
9092
bool app_get_mouse_relative();
9193

9294
void app_set_keep_awake(app_t *app, bool awake);

src/app/input/app_input.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,14 @@ void app_set_mouse_grab(app_input_t *input, bool grab) {
5757
bool app_get_mouse_relative() {
5858
return SDL_GetRelativeMouseMode() == SDL_TRUE;
5959
}
60+
61+
void app_set_keyboard_grab(app_input_t *input, bool grab) {
62+
(void) input;
63+
#if TARGET_WEBOS
64+
SDL_SetHint(SDL_HINT_WEBOS_ACCESS_POLICY_KEYS_HOME, grab ? "true" : "false");
65+
SDL_SetHint(SDL_HINT_WEBOS_ACCESS_POLICY_KEYS_META, grab ? "true" : "false");
66+
SDL_SetHint(SDL_HINT_WEBOS_ACCESS_POLICY_RIBBON, grab ? "false" : "true");
67+
#else
68+
SDL_SetHint(SDL_HINT_GRAB_KEYBOARD, grab ? "1" : "0");
69+
#endif
70+
}

src/app/stream/input/session_evmouse.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,14 @@ void session_evmouse_enable(session_evmouse_t *mouse) {
6565
SDL_UnlockMutex(mouse->lock);
6666
}
6767

68+
void session_evmouse_set_grab(session_evmouse_t *mouse, SDL_bool grab) {
69+
SDL_LockMutex(mouse->lock);
70+
if (mouse->dev != NULL) {
71+
evmouse_set_grab(mouse->dev, grab);
72+
}
73+
SDL_UnlockMutex(mouse->lock);
74+
}
75+
6876
static int mouse_worker(session_evmouse_t *mouse) {
6977
evmouse_t *dev = evmouse_open_default();
7078
set_evmouse(mouse, dev);

src/app/stream/input/session_evmouse.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,6 @@ void session_evmouse_interrupt(session_evmouse_t *mouse);
2323

2424
void session_evmouse_disable(session_evmouse_t *mouse);
2525

26-
void session_evmouse_enable(session_evmouse_t *mouse);
26+
void session_evmouse_enable(session_evmouse_t *mouse);
27+
28+
void session_evmouse_set_grab(session_evmouse_t *mouse, SDL_bool grab);

src/app/stream/input/session_input.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,4 +84,13 @@ void session_input_screen_keyboard_closed(stream_input_t *input) {
8484
session_evmouse_enable(&input->evmouse);
8585
}
8686
#endif
87+
}
88+
89+
void session_input_set_mouse_grab(stream_input_t *input, bool grab) {
90+
#if FEATURE_INPUT_EVMOUSE
91+
const session_config_t *config = &input->session->config;
92+
if (config->hardware_mouse) {
93+
session_evmouse_set_grab(&input->evmouse, grab);
94+
}
95+
#endif
8796
}

src/app/stream/input/session_input.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ void session_input_screen_keyboard_opened(stream_input_t *input);
5555

5656
void session_input_screen_keyboard_closed(stream_input_t *input);
5757

58+
void session_input_set_mouse_grab(stream_input_t *input, bool grab);
59+
5860
void stream_input_send_gamepad_arrive(const stream_input_t *input, app_gamepad_state_t *gamepad);
5961

6062
void stream_input_handle_key(stream_input_t *input, const SDL_KeyboardEvent *event);

src/app/stream/session.c

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,10 @@ void session_screen_keyboard_closed(session_t *session) {
164164
session_input_screen_keyboard_closed(&session->input);
165165
}
166166

167+
void session_set_mouse_grab(session_t *session, bool grab) {
168+
session_input_set_mouse_grab(&session->input, grab);
169+
}
170+
167171
void streaming_display_size(session_t *session, short width, short height) {
168172
session->display_width = width;
169173
session->display_height = height;
@@ -179,7 +183,9 @@ void streaming_enter_fullscreen(session_t *session) {
179183
}
180184

181185
void streaming_enter_overlay(session_t *session, int x, int y, int w, int h) {
186+
app_set_keyboard_grab(&session->app->input, false);
182187
app_set_mouse_grab(&session->app->input, false);
188+
session_set_mouse_grab(session, false);
183189
SS4S_VideoRect dst = {x, y, w, h};
184190
if ((session->video_cap.transform & SS4S_VIDEO_CAP_TRANSFORM_UI_COMPOSITING) == 0) {
185191
SS4S_PlayerVideoSetDisplayArea(session->player, NULL, &dst);
@@ -193,35 +199,35 @@ void streaming_set_hdr(session_t *session, bool hdr) {
193199
SS4S_PlayerVideoSetHDRInfo(session->player, NULL);
194200
} else if (LiGetHdrMetadata(&hdr_metadata)) {
195201
SS4S_VideoHDRInfo info = {
196-
.displayPrimariesX = {
197-
hdr_metadata.displayPrimaries[0].x,
198-
hdr_metadata.displayPrimaries[1].x,
199-
hdr_metadata.displayPrimaries[2].x
200-
},
201-
.displayPrimariesY = {
202-
hdr_metadata.displayPrimaries[0].y,
203-
hdr_metadata.displayPrimaries[1].y,
204-
hdr_metadata.displayPrimaries[2].y
205-
},
206-
.whitePointX = hdr_metadata.whitePoint.x,
207-
.whitePointY = hdr_metadata.whitePoint.y,
208-
.maxDisplayMasteringLuminance = hdr_metadata.maxDisplayLuminance * LUMINANCE_SCALE,
209-
.minDisplayMasteringLuminance = hdr_metadata.minDisplayLuminance,
210-
.maxContentLightLevel = hdr_metadata.maxContentLightLevel,
211-
.maxPicAverageLightLevel = hdr_metadata.maxFrameAverageLightLevel,
202+
.displayPrimariesX = {
203+
hdr_metadata.displayPrimaries[0].x,
204+
hdr_metadata.displayPrimaries[1].x,
205+
hdr_metadata.displayPrimaries[2].x
206+
},
207+
.displayPrimariesY = {
208+
hdr_metadata.displayPrimaries[0].y,
209+
hdr_metadata.displayPrimaries[1].y,
210+
hdr_metadata.displayPrimaries[2].y
211+
},
212+
.whitePointX = hdr_metadata.whitePoint.x,
213+
.whitePointY = hdr_metadata.whitePoint.y,
214+
.maxDisplayMasteringLuminance = hdr_metadata.maxDisplayLuminance * LUMINANCE_SCALE,
215+
.minDisplayMasteringLuminance = hdr_metadata.minDisplayLuminance,
216+
.maxContentLightLevel = hdr_metadata.maxContentLightLevel,
217+
.maxPicAverageLightLevel = hdr_metadata.maxFrameAverageLightLevel,
212218
};
213219
populate_hdr_info_vui(&info, &session->config.stream);
214220
SS4S_PlayerVideoSetHDRInfo(session->player, &info);
215221
} else {
216222
SS4S_VideoHDRInfo info = {
217-
.displayPrimariesX = {34000, 13250, 7500},
218-
.displayPrimariesY = {16000, 34500, 3000},
219-
.whitePointX = 15635,
220-
.whitePointY = 16450,
221-
.maxDisplayMasteringLuminance = 1000 * LUMINANCE_SCALE,
222-
.minDisplayMasteringLuminance = 50,
223-
.maxContentLightLevel = 1000,
224-
.maxPicAverageLightLevel = 400,
223+
.displayPrimariesX = {34000, 13250, 7500},
224+
.displayPrimariesY = {16000, 34500, 3000},
225+
.whitePointX = 15635,
226+
.whitePointY = 16450,
227+
.maxDisplayMasteringLuminance = 1000 * LUMINANCE_SCALE,
228+
.minDisplayMasteringLuminance = 50,
229+
.maxContentLightLevel = 1000,
230+
.maxPicAverageLightLevel = 400,
225231
};
226232
populate_hdr_info_vui(&info, &session->config.stream);
227233
SS4S_PlayerVideoSetHDRInfo(session->player, &info);

src/app/stream/session.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ void session_screen_keyboard_opened(session_t *session);
8888

8989
void session_screen_keyboard_closed(session_t *session);
9090

91+
void session_set_mouse_grab(session_t *session, bool grab);
92+
9193
bool session_accepting_input(session_t *session);
9294

9395
void streaming_display_size(session_t *session, short width, short height);

src/app/ui/root.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,9 @@ bool ui_dispatch_userevent(app_t *app, int which, void *data1, void *data2) {
165165
// }
166166
}
167167
if (session_start_input(app->session)) {
168+
app_set_keyboard_grab(&app->input, true);
168169
app_set_mouse_grab(&app->input, true);
170+
session_set_mouse_grab(app->session, true);
169171
}
170172
app_set_keep_awake(app, true);
171173
streaming_enter_fullscreen(app->session);
@@ -184,7 +186,9 @@ bool ui_dispatch_userevent(app_t *app, int which, void *data1, void *data2) {
184186
// }
185187
app_set_keep_awake(app, false);
186188
if (session_has_input(app->session)) {
189+
app_set_keyboard_grab(&app->input, false);
187190
app_set_mouse_grab(&app->input, false);
191+
session_set_mouse_grab(app->session, false);
188192
session_stop_input(app->session);
189193
}
190194
// ui_stream_render = NULL;

0 commit comments

Comments
 (0)