Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5cbdd567bd | ||
|
|
86c91e183d |
21
README.md
21
README.md
@@ -71,12 +71,6 @@ On Debian and Ubuntu:
|
|||||||
apt install scrcpy
|
apt install scrcpy
|
||||||
```
|
```
|
||||||
|
|
||||||
On Arch Linux:
|
|
||||||
|
|
||||||
```
|
|
||||||
pacman -S scrcpy
|
|
||||||
```
|
|
||||||
|
|
||||||
A [Snap] package is available: [`scrcpy`][snap-link].
|
A [Snap] package is available: [`scrcpy`][snap-link].
|
||||||
|
|
||||||
[snap-link]: https://snapstats.org/snaps/scrcpy
|
[snap-link]: https://snapstats.org/snaps/scrcpy
|
||||||
@@ -88,6 +82,10 @@ For Fedora, a [COPR] package is available: [`scrcpy`][copr-link].
|
|||||||
[COPR]: https://fedoraproject.org/wiki/Category:Copr
|
[COPR]: https://fedoraproject.org/wiki/Category:Copr
|
||||||
[copr-link]: https://copr.fedorainfracloud.org/coprs/zeno/scrcpy/
|
[copr-link]: https://copr.fedorainfracloud.org/coprs/zeno/scrcpy/
|
||||||
|
|
||||||
|
For Arch Linux, an [AUR] package is available: [`scrcpy`][aur-link].
|
||||||
|
|
||||||
|
[AUR]: https://wiki.archlinux.org/index.php/Arch_User_Repository
|
||||||
|
[aur-link]: https://aur.archlinux.org/packages/scrcpy/
|
||||||
|
|
||||||
For Gentoo, an [Ebuild] is available: [`scrcpy/`][ebuild-link].
|
For Gentoo, an [Ebuild] is available: [`scrcpy/`][ebuild-link].
|
||||||
|
|
||||||
@@ -938,7 +936,7 @@ _<kbd>[Super]</kbd> is typically the <kbd>Windows</kbd> or <kbd>Cmd</kbd> key._
|
|||||||
| Click on `HOME` | <kbd>MOD</kbd>+<kbd>h</kbd> \| _Middle-click_
|
| Click on `HOME` | <kbd>MOD</kbd>+<kbd>h</kbd> \| _Middle-click_
|
||||||
| Click on `BACK` | <kbd>MOD</kbd>+<kbd>b</kbd> \| _Right-click²_
|
| Click on `BACK` | <kbd>MOD</kbd>+<kbd>b</kbd> \| _Right-click²_
|
||||||
| Click on `APP_SWITCH` | <kbd>MOD</kbd>+<kbd>s</kbd> \| _4th-click³_
|
| Click on `APP_SWITCH` | <kbd>MOD</kbd>+<kbd>s</kbd> \| _4th-click³_
|
||||||
| Click on `MENU` (unlock screen)⁴ | <kbd>MOD</kbd>+<kbd>m</kbd>
|
| Click on `MENU` (unlock screen) | <kbd>MOD</kbd>+<kbd>m</kbd>
|
||||||
| Click on `VOLUME_UP` | <kbd>MOD</kbd>+<kbd>↑</kbd> _(up)_
|
| Click on `VOLUME_UP` | <kbd>MOD</kbd>+<kbd>↑</kbd> _(up)_
|
||||||
| Click on `VOLUME_DOWN` | <kbd>MOD</kbd>+<kbd>↓</kbd> _(down)_
|
| Click on `VOLUME_DOWN` | <kbd>MOD</kbd>+<kbd>↓</kbd> _(down)_
|
||||||
| Click on `POWER` | <kbd>MOD</kbd>+<kbd>p</kbd>
|
| Click on `POWER` | <kbd>MOD</kbd>+<kbd>p</kbd>
|
||||||
@@ -949,9 +947,9 @@ _<kbd>[Super]</kbd> is typically the <kbd>Windows</kbd> or <kbd>Cmd</kbd> key._
|
|||||||
| Expand notification panel | <kbd>MOD</kbd>+<kbd>n</kbd> \| _5th-click³_
|
| Expand notification panel | <kbd>MOD</kbd>+<kbd>n</kbd> \| _5th-click³_
|
||||||
| Expand settings panel | <kbd>MOD</kbd>+<kbd>n</kbd>+<kbd>n</kbd> \| _Double-5th-click³_
|
| Expand settings panel | <kbd>MOD</kbd>+<kbd>n</kbd>+<kbd>n</kbd> \| _Double-5th-click³_
|
||||||
| Collapse panels | <kbd>MOD</kbd>+<kbd>Shift</kbd>+<kbd>n</kbd>
|
| Collapse panels | <kbd>MOD</kbd>+<kbd>Shift</kbd>+<kbd>n</kbd>
|
||||||
| Copy to clipboard⁵ | <kbd>MOD</kbd>+<kbd>c</kbd>
|
| Copy to clipboard⁴ | <kbd>MOD</kbd>+<kbd>c</kbd>
|
||||||
| Cut to clipboard⁵ | <kbd>MOD</kbd>+<kbd>x</kbd>
|
| Cut to clipboard⁴ | <kbd>MOD</kbd>+<kbd>x</kbd>
|
||||||
| Synchronize clipboards and paste⁵ | <kbd>MOD</kbd>+<kbd>v</kbd>
|
| Synchronize clipboards and paste⁴ | <kbd>MOD</kbd>+<kbd>v</kbd>
|
||||||
| Inject computer clipboard text | <kbd>MOD</kbd>+<kbd>Shift</kbd>+<kbd>v</kbd>
|
| Inject computer clipboard text | <kbd>MOD</kbd>+<kbd>Shift</kbd>+<kbd>v</kbd>
|
||||||
| Enable/disable FPS counter (on stdout) | <kbd>MOD</kbd>+<kbd>i</kbd>
|
| Enable/disable FPS counter (on stdout) | <kbd>MOD</kbd>+<kbd>i</kbd>
|
||||||
| Pinch-to-zoom | <kbd>Ctrl</kbd>+_click-and-move_
|
| Pinch-to-zoom | <kbd>Ctrl</kbd>+_click-and-move_
|
||||||
@@ -961,8 +959,7 @@ _<kbd>[Super]</kbd> is typically the <kbd>Windows</kbd> or <kbd>Cmd</kbd> key._
|
|||||||
_¹Double-click on black borders to remove them._
|
_¹Double-click on black borders to remove them._
|
||||||
_²Right-click turns the screen on if it was off, presses BACK otherwise._
|
_²Right-click turns the screen on if it was off, presses BACK otherwise._
|
||||||
_³4th and 5th mouse buttons, if your mouse has them._
|
_³4th and 5th mouse buttons, if your mouse has them._
|
||||||
_⁴For react-native apps in development, `MENU` triggers development menu._
|
_⁴Only on Android >= 7._
|
||||||
_⁵Only on Android >= 7._
|
|
||||||
|
|
||||||
Shortcuts with repeated keys are executted by releasing and pressing the key a
|
Shortcuts with repeated keys are executted by releasing and pressing the key a
|
||||||
second time. For example, to execute "Expand settings panel":
|
second time. For example, to execute "Expand settings panel":
|
||||||
|
|||||||
@@ -30,9 +30,7 @@ sc_process_execute_p(const char *const argv[], HANDLE *handle, unsigned flags,
|
|||||||
bool inherit_stderr = !perr && !(flags & SC_PROCESS_NO_STDERR);
|
bool inherit_stderr = !perr && !(flags & SC_PROCESS_NO_STDERR);
|
||||||
|
|
||||||
// Add 1 per non-NULL pointer
|
// Add 1 per non-NULL pointer
|
||||||
unsigned handle_count = !!pin
|
unsigned handle_count = !!pin || !!pout || !!perr;
|
||||||
+ (pout || inherit_stdout)
|
|
||||||
+ (perr || inherit_stderr);
|
|
||||||
|
|
||||||
enum sc_process_result ret = SC_PROCESS_ERROR_GENERIC;
|
enum sc_process_result ret = SC_PROCESS_ERROR_GENERIC;
|
||||||
|
|
||||||
@@ -81,23 +79,29 @@ sc_process_execute_p(const char *const argv[], HANDLE *handle, unsigned flags,
|
|||||||
si.StartupInfo.cb = sizeof(si);
|
si.StartupInfo.cb = sizeof(si);
|
||||||
HANDLE handles[3];
|
HANDLE handles[3];
|
||||||
|
|
||||||
|
si.StartupInfo.dwFlags = STARTF_USESTDHANDLES;
|
||||||
|
if (inherit_stdout) {
|
||||||
|
si.StartupInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||||
|
}
|
||||||
|
if (inherit_stderr) {
|
||||||
|
si.StartupInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);
|
||||||
|
}
|
||||||
|
|
||||||
LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList = NULL;
|
LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList = NULL;
|
||||||
if (handle_count) {
|
if (handle_count) {
|
||||||
si.StartupInfo.dwFlags = STARTF_USESTDHANDLES;
|
|
||||||
|
|
||||||
unsigned i = 0;
|
unsigned i = 0;
|
||||||
if (pin) {
|
if (pin) {
|
||||||
si.StartupInfo.hStdInput = stdin_read_handle;
|
si.StartupInfo.hStdInput = stdin_read_handle;
|
||||||
handles[i++] = si.StartupInfo.hStdInput;
|
handles[i++] = si.StartupInfo.hStdInput;
|
||||||
}
|
}
|
||||||
if (pout || inherit_stdout) {
|
if (pout) {
|
||||||
si.StartupInfo.hStdOutput = pout ? stdout_write_handle
|
assert(!inherit_stdout);
|
||||||
: GetStdHandle(STD_OUTPUT_HANDLE);
|
si.StartupInfo.hStdOutput = stdout_write_handle;
|
||||||
handles[i++] = si.StartupInfo.hStdOutput;
|
handles[i++] = si.StartupInfo.hStdOutput;
|
||||||
}
|
}
|
||||||
if (perr || inherit_stderr) {
|
if (perr) {
|
||||||
si.StartupInfo.hStdError = perr ? stderr_write_handle
|
assert(!inherit_stderr);
|
||||||
: GetStdHandle(STD_ERROR_HANDLE);
|
si.StartupInfo.hStdError = stderr_write_handle;
|
||||||
handles[i++] = si.StartupInfo.hStdError;
|
handles[i++] = si.StartupInfo.hStdError;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -146,15 +150,22 @@ sc_process_execute_p(const char *const argv[], HANDLE *handle, unsigned flags,
|
|||||||
goto error_free_attribute_list;
|
goto error_free_attribute_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL bInheritHandles = handle_count > 0;
|
BOOL bInheritHandles = handle_count > 0 || inherit_stdout || inherit_stderr;
|
||||||
// DETACHED_PROCESS to disable stdin, stdout and stderr
|
DWORD dwCreationFlags = 0;
|
||||||
DWORD dwCreationFlags = handle_count > 0 ? EXTENDED_STARTUPINFO_PRESENT
|
if (handle_count > 0) {
|
||||||
: DETACHED_PROCESS;
|
dwCreationFlags |= EXTENDED_STARTUPINFO_PRESENT;
|
||||||
|
}
|
||||||
|
if (!inherit_stdout && !inherit_stderr) {
|
||||||
|
// DETACHED_PROCESS to disable stdin, stdout and stderr
|
||||||
|
dwCreationFlags |= DETACHED_PROCESS;
|
||||||
|
}
|
||||||
BOOL ok = CreateProcessW(NULL, wide, NULL, NULL, bInheritHandles,
|
BOOL ok = CreateProcessW(NULL, wide, NULL, NULL, bInheritHandles,
|
||||||
dwCreationFlags, NULL, NULL, &si.StartupInfo, &pi);
|
dwCreationFlags, NULL, NULL, &si.StartupInfo, &pi);
|
||||||
free(wide);
|
free(wide);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
if (GetLastError() == ERROR_FILE_NOT_FOUND) {
|
int err = GetLastError();
|
||||||
|
LOGE("CreateProcessW() error %d", err);
|
||||||
|
if (err == ERROR_FILE_NOT_FOUND) {
|
||||||
ret = SC_PROCESS_ERROR_MISSING_BINARY;
|
ret = SC_PROCESS_ERROR_MISSING_BINARY;
|
||||||
}
|
}
|
||||||
goto error_free_attribute_list;
|
goto error_free_attribute_list;
|
||||||
|
|||||||
Reference in New Issue
Block a user