mirror of
https://github.com/Genymobile/scrcpy.git
synced 2025-12-18 22:14:20 +01:00
Add shortcut to open keyboard settings
The keyboard settings can be opened by:
adb shell am start -a android.settings.HARD_KEYBOARD_SETTINGS
Add a shortcut (MOD+k) for convenience if the current keyboard is HID.
PR #4473 <https://github.com/Genymobile/scrcpy/pull/4473>
This commit is contained in:
@@ -377,8 +377,9 @@ static const struct sc_option options[] = {
|
||||
"For \"uhid\" and \"aoa\", the keyboard layout must be "
|
||||
"configured (once and for all) on the device, via Settings -> "
|
||||
"System -> Languages and input -> Physical keyboard. This "
|
||||
"settings page can be started directly: `adb shell am start -a "
|
||||
"android.settings.HARD_KEYBOARD_SETTINGS`.\n"
|
||||
"settings page can be started directly using the shortcut "
|
||||
"MOD+k (except in OTG mode) or by executing: `adb shell am "
|
||||
"start -a android.settings.HARD_KEYBOARD_SETTINGS`.\n"
|
||||
"This option is only available when a HID keyboard is enabled "
|
||||
"(or a physical keyboard is connected).\n"
|
||||
"Also see --mouse.",
|
||||
@@ -965,6 +966,10 @@ static const struct sc_shortcut shortcuts[] = {
|
||||
.shortcuts = { "MOD+Shift+v" },
|
||||
.text = "Inject computer clipboard text as a sequence of key events",
|
||||
},
|
||||
{
|
||||
.shortcuts = { "MOD+k" },
|
||||
.text = "Open keyboard settings on the device (for HID keyboard only)",
|
||||
},
|
||||
{
|
||||
.shortcuts = { "MOD+i" },
|
||||
.text = "Enable/disable FPS counter (print frames/second in logs)",
|
||||
|
||||
@@ -161,6 +161,7 @@ sc_control_msg_serialize(const struct sc_control_msg *msg, uint8_t *buf) {
|
||||
case SC_CONTROL_MSG_TYPE_EXPAND_SETTINGS_PANEL:
|
||||
case SC_CONTROL_MSG_TYPE_COLLAPSE_PANELS:
|
||||
case SC_CONTROL_MSG_TYPE_ROTATE_DEVICE:
|
||||
case SC_CONTROL_MSG_TYPE_OPEN_HARD_KEYBOARD_SETTINGS:
|
||||
// no additional data
|
||||
return 1;
|
||||
default:
|
||||
@@ -270,6 +271,9 @@ sc_control_msg_log(const struct sc_control_msg *msg) {
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SC_CONTROL_MSG_TYPE_OPEN_HARD_KEYBOARD_SETTINGS:
|
||||
LOG_CMSG("open hard keyboard settings");
|
||||
break;
|
||||
default:
|
||||
LOG_CMSG("unknown type: %u", (unsigned) msg->type);
|
||||
break;
|
||||
|
||||
@@ -40,6 +40,7 @@ enum sc_control_msg_type {
|
||||
SC_CONTROL_MSG_TYPE_ROTATE_DEVICE,
|
||||
SC_CONTROL_MSG_TYPE_UHID_CREATE,
|
||||
SC_CONTROL_MSG_TYPE_UHID_INPUT,
|
||||
SC_CONTROL_MSG_TYPE_OPEN_HARD_KEYBOARD_SETTINGS,
|
||||
};
|
||||
|
||||
enum sc_screen_power_mode {
|
||||
|
||||
@@ -318,6 +318,18 @@ rotate_device(struct sc_input_manager *im) {
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
open_hard_keyboard_settings(struct sc_input_manager *im) {
|
||||
assert(im->controller);
|
||||
|
||||
struct sc_control_msg msg;
|
||||
msg.type = SC_CONTROL_MSG_TYPE_OPEN_HARD_KEYBOARD_SETTINGS;
|
||||
|
||||
if (!sc_controller_push_msg(im->controller, &msg)) {
|
||||
LOGW("Could not request opening hard keyboard settings");
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
apply_orientation_transform(struct sc_input_manager *im,
|
||||
enum sc_orientation transform) {
|
||||
@@ -550,6 +562,13 @@ sc_input_manager_process_key(struct sc_input_manager *im,
|
||||
rotate_device(im);
|
||||
}
|
||||
return;
|
||||
case SDLK_k:
|
||||
if (control && !shift && !repeat && down
|
||||
&& im->kp && im->kp->hid) {
|
||||
// Only if the current keyboard is hid
|
||||
open_hard_keyboard_settings(im);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
@@ -340,5 +340,6 @@ sc_keyboard_sdk_init(struct sc_keyboard_sdk *kb,
|
||||
|
||||
// Key injection and clipboard synchronization are serialized
|
||||
kb->key_processor.async_paste = false;
|
||||
kb->key_processor.hid = false;
|
||||
kb->key_processor.ops = &ops;
|
||||
}
|
||||
|
||||
@@ -23,6 +23,13 @@ struct sc_key_processor {
|
||||
*/
|
||||
bool async_paste;
|
||||
|
||||
/**
|
||||
* Set by the implementation to indicate that the keyboard is HID. In
|
||||
* practice, it is used to react on a shortcut to open the hard keyboard
|
||||
* settings only if the keyboard is HID.
|
||||
*/
|
||||
bool hid;
|
||||
|
||||
const struct sc_key_processor_ops *ops;
|
||||
};
|
||||
|
||||
|
||||
@@ -137,6 +137,7 @@ sc_keyboard_uhid_init(struct sc_keyboard_uhid *kb,
|
||||
// Clipboard synchronization is requested over the same control socket, so
|
||||
// there is no need for a specific synchronization mechanism
|
||||
kb->key_processor.async_paste = false;
|
||||
kb->key_processor.hid = true;
|
||||
kb->key_processor.ops = &ops;
|
||||
|
||||
static const struct sc_uhid_receiver_ops uhid_receiver_ops = {
|
||||
|
||||
@@ -94,6 +94,7 @@ sc_keyboard_aoa_init(struct sc_keyboard_aoa *kb, struct sc_aoa *aoa) {
|
||||
// events are sent over AOA, so it must wait for clipboard synchronization
|
||||
// to be acknowledged by the device before injecting Ctrl+v.
|
||||
kb->key_processor.async_paste = true;
|
||||
kb->key_processor.hid = true;
|
||||
kb->key_processor.ops = &ops;
|
||||
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user