feat(device): add screen size input

This commit is contained in:
AkiChase 2024-04-16 17:07:25 +08:00
parent a9cc446671
commit 2578449304
8 changed files with 44 additions and 66 deletions

View File

@ -58,32 +58,6 @@ impl Device {
.spawn()
.context("Failed to execute 'adb shell'")?)
}
pub fn cmd_screen_size(res_dir: &PathBuf, id: &str) -> Result<(u16, u16)> {
let mut adb_command = Adb::cmd_base(res_dir);
let output = adb_command
.args(&["-s", id, "shell", "wm", "size"])
.output()
.context("Failed to execute 'adb shell wm size'")?;
let lines = output.stdout.lines();
let mut size = (0, 0);
for line in lines {
if let std::result::Result::Ok(s) = line {
println!("{}", s);
if s.starts_with("Physical size:") {
let mut iter = s.split_whitespace();
iter.next();
iter.next();
let mut size_str = iter.next().unwrap().split('x');
let width = size_str.next().unwrap().parse::<u16>().unwrap();
let height = size_str.next().unwrap().parse::<u16>().unwrap();
size = (width, height);
break;
}
}
}
Ok(size)
}
}
pub struct Adb;

View File

@ -40,11 +40,6 @@ impl ScrcpyClient {
Adb::cmd_forward_remove(res_dir)
}
/// get the screen size of the device
pub fn get_screen_size(res_dir: &PathBuf, id: &str) -> Result<(u16, u16)> {
Device::cmd_screen_size(res_dir, id)
}
/// push server file to current device
pub fn push_server_file(res_dir: &PathBuf, id: &str) -> Result<()> {
let info = Device::cmd_push(

View File

@ -20,16 +20,6 @@ fn adb_devices(app: tauri::AppHandle) -> Result<Vec<Device>, String> {
}
}
#[tauri::command]
/// get screen size of the device
fn get_screen_size(id: String, app: tauri::AppHandle) -> Result<(u16, u16), String> {
let dir = app.path().resource_dir().unwrap().join("resource");
match ScrcpyClient::get_screen_size(&dir, &id) {
Ok(size) => Ok(size),
Err(e) => Err(e.to_string()),
}
}
#[tauri::command]
/// forward local port to the device port
fn forward_server_port(
@ -170,7 +160,6 @@ async fn main() {
.plugin(tauri_plugin_os::init())
.invoke_handler(tauri::generate_handler![
adb_devices,
get_screen_size,
forward_server_port,
push_server_file,
start_scrcpy_server

View File

@ -15,7 +15,6 @@ import {
pushServerFile,
forwardServerPort,
startScrcpyServer,
getScreenSize,
} from "../invoke";
import {
NH4,
@ -26,11 +25,13 @@ import {
NEmpty,
NTooltip,
NFlex,
NFormItem,
NIcon,
NSpin,
DataTableColumns,
DropdownOption,
useDialog,
useMessage,
} from "naive-ui";
import { CloseCircle, InformationCircle } from "@vicons/ionicons5";
import { Refresh } from "@vicons/ionicons5";
@ -40,6 +41,7 @@ import { useGlobalStore } from "../store/global";
const dialog = useDialog();
const store = useGlobalStore();
const message = useMessage();
const port = ref(27183);
@ -168,14 +170,21 @@ async function onMenuSelect(key: string) {
if (!port.value) {
port.value = 27183;
}
if (!(store.screenSizeW > 0) || !(store.screenSizeH > 0)) {
message.error("请正确输入当前控制设备的屏幕尺寸");
store.screenSizeW = 0;
store.screenSizeH = 0;
store.hideLoading();
return;
}
let device = devices.value[rowIndex];
let scid = (
"00000000" + Math.floor(Math.random() * 100000).toString(16)
).slice(-8);
let screenSize = await getScreenSize(device.id);
await pushServerFile(device.id);
await forwardServerPort(device.id, scid, port.value);
await startScrcpyServer(device.id, scid, `127.0.0.1:${port.value}`);
@ -186,7 +195,6 @@ async function onMenuSelect(key: string) {
scid,
deviceName,
device,
screenSize,
};
nextTick(() => {
store.hideLoading();
@ -202,13 +210,6 @@ async function refreshDevices() {
devices.value = await adbDevices();
store.hideLoading();
}
const screenSizeInfo = computed(() => {
if (store.controledDevice) {
return `${store.controledDevice.screenSize[0]} x ${store.controledDevice.screenSize[1]}`;
}
return "";
});
</script>
<template>
@ -222,6 +223,28 @@ const screenSizeInfo = computed(() => {
:max="49151"
style="max-width: 300px"
/>
<NH4 prefix="bar">屏幕尺寸</NH4>
<NFlex justify="left" align="center">
<NFormItem label="宽度">
<NInputNumber
v-model:value="store.screenSizeW"
placeholder="屏幕宽度"
:min="0"
:disabled="store.controledDevice !== null"
/>
</NFormItem>
<NFormItem label="高度">
<NInputNumber
v-model:value="store.screenSizeH"
placeholder="屏幕高度"
:min="0"
:disabled="store.controledDevice !== null"
/>
</NFormItem>
</NFlex>
<NP
>提示请正确输入当前控制设备的屏幕尺寸这是成功发送触摸事件的必要参数</NP
>
<NH4 prefix="bar">受控设备</NH4>
<div class="controled-device-list">
<NEmpty
@ -246,7 +269,6 @@ const screenSizeInfo = computed(() => {
</template>
scid: {{ store.controledDevice.scid }} <br />status:
{{ store.controledDevice.device.status }} <br />screen:
{{ screenSizeInfo }}
</NTooltip>
<NButton quaternary circle type="error" @click="shutdownSC()">
<template #icon>

View File

@ -3,11 +3,7 @@ import { onActivated, ref } from "vue";
import { NDialog } from "naive-ui";
import { useGlobalStore } from "../store/global";
import { onBeforeRouteLeave, useRouter } from "vue-router";
import {
initShortcuts,
listenToKeyEvent,
unlistenToKeyEvent,
} from "../hotkey";
import { initShortcuts, listenToKeyEvent, unlistenToKeyEvent } from "../hotkey";
const maskRef = ref<HTMLElement | null>(null);
@ -33,7 +29,7 @@ onActivated(async () => {
}
if (store.controledDevice) {
if (maskRef.value) {
initShortcuts(store.controledDevice.screenSize, maskRef.value);
initShortcuts([store.screenSizeW, store.screenSizeH], maskRef.value);
listenToKeyEvent();
isShortcutInited = true;
}

View File

@ -6,6 +6,8 @@ import {
touch,
} from "./frontcommand/scrcpyMaskCmd";
// TODO 根据当前蒙版的尺寸换算屏幕尺寸
function clientxToPosx(clientx: number) {
return clientx < 70 ? 0 : Math.floor(clientx - 70);
}

View File

@ -9,10 +9,6 @@ export async function adbDevices(): Promise<Device[]> {
return await invoke("adb_devices");
}
export async function getScreenSize(id: string): Promise<[number, number]> {
return await invoke("get_screen_size", { id });
}
export async function forwardServerPort(
id: string,
scid: string,

View File

@ -15,15 +15,19 @@ export const useGlobalStore = defineStore("counter", () => {
scid: string;
deviceName: string;
device: Device;
screenSize: [number, number];
}
const controledDevice: Ref<ControledDevice|null> = ref(null);
const screenSizeW: Ref<number> = ref(1280);
const screenSizeH: Ref<number> = ref(720);
const controledDevice: Ref<ControledDevice | null> = ref(null);
return {
showLoading,
hideLoading,
showLoadingRef,
controledDevice,
screenSizeW,
screenSizeH,
};
});