Merge pull request #2775 from chiehw/master
hide keyboard which unsupported && release map mode key
This commit is contained in:
commit
388b107f9d
@ -1193,10 +1193,25 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
|
|||||||
final List<MenuEntryBase<String>> keyboardMenu = [
|
final List<MenuEntryBase<String>> keyboardMenu = [
|
||||||
MenuEntryRadios<String>(
|
MenuEntryRadios<String>(
|
||||||
text: translate('Ratio'),
|
text: translate('Ratio'),
|
||||||
optionsGetter: () => [
|
optionsGetter: () {
|
||||||
MenuEntryRadioOption(text: translate('Legacy mode'), value: 'legacy'),
|
List<MenuEntryRadioOption> list = [];
|
||||||
MenuEntryRadioOption(text: translate('Map mode'), value: 'map'),
|
List<String> modes = ["legacy"];
|
||||||
],
|
|
||||||
|
if (bind.sessionIsKeyboardModeSupported(id: widget.id, mode: "map")) {
|
||||||
|
modes.add("map");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (String mode in modes) {
|
||||||
|
if (mode == "legacy") {
|
||||||
|
list.add(MenuEntryRadioOption(
|
||||||
|
text: translate('Legacy mode'), value: 'legacy'));
|
||||||
|
} else if (mode == "map") {
|
||||||
|
list.add(MenuEntryRadioOption(
|
||||||
|
text: translate('Map mode'), value: 'map'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
},
|
||||||
curOptionGetter: () async {
|
curOptionGetter: () async {
|
||||||
return await bind.sessionGetKeyboardMode(id: widget.id) ?? "legacy";
|
return await bind.sessionGetKeyboardMode(id: widget.id) ?? "legacy";
|
||||||
},
|
},
|
||||||
|
39
libs/hbb_common/src/keyboard.rs
Normal file
39
libs/hbb_common/src/keyboard.rs
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
use std::{fmt, slice::Iter, str::FromStr};
|
||||||
|
|
||||||
|
use crate::protos::message::KeyboardMode;
|
||||||
|
|
||||||
|
impl fmt::Display for KeyboardMode {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
match self {
|
||||||
|
KeyboardMode::Legacy => write!(f, "legacy"),
|
||||||
|
KeyboardMode::Map => write!(f, "map"),
|
||||||
|
KeyboardMode::Translate => write!(f, "translate"),
|
||||||
|
KeyboardMode::Auto => write!(f, "auto"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for KeyboardMode {
|
||||||
|
type Err = ();
|
||||||
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
|
match s {
|
||||||
|
"legacy" => Ok(KeyboardMode::Legacy),
|
||||||
|
"map" => Ok(KeyboardMode::Map),
|
||||||
|
"translate" => Ok(KeyboardMode::Translate),
|
||||||
|
"auto" => Ok(KeyboardMode::Auto),
|
||||||
|
_ => Err(()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl KeyboardMode {
|
||||||
|
pub fn iter() -> Iter<'static, KeyboardMode> {
|
||||||
|
static KEYBOARD_MODES: [KeyboardMode; 4] = [
|
||||||
|
KeyboardMode::Legacy,
|
||||||
|
KeyboardMode::Map,
|
||||||
|
KeyboardMode::Translate,
|
||||||
|
KeyboardMode::Auto,
|
||||||
|
];
|
||||||
|
KEYBOARD_MODES.iter()
|
||||||
|
}
|
||||||
|
}
|
@ -40,6 +40,7 @@ pub use tokio_socks::TargetAddr;
|
|||||||
pub mod password_security;
|
pub mod password_security;
|
||||||
pub use chrono;
|
pub use chrono;
|
||||||
pub use directories_next;
|
pub use directories_next;
|
||||||
|
pub mod keyboard;
|
||||||
|
|
||||||
#[cfg(feature = "quic")]
|
#[cfg(feature = "quic")]
|
||||||
pub type Stream = quic::Connection;
|
pub type Stream = quic::Connection;
|
||||||
|
@ -7,6 +7,7 @@ use cpal::{
|
|||||||
use magnum_opus::{Channels::*, Decoder as AudioDecoder};
|
use magnum_opus::{Channels::*, Decoder as AudioDecoder};
|
||||||
use sha2::{Digest, Sha256};
|
use sha2::{Digest, Sha256};
|
||||||
use std::{
|
use std::{
|
||||||
|
str::FromStr,
|
||||||
collections::HashMap,
|
collections::HashMap,
|
||||||
net::SocketAddr,
|
net::SocketAddr,
|
||||||
ops::{Deref, Not},
|
ops::{Deref, Not},
|
||||||
@ -23,7 +24,7 @@ use hbb_common::{
|
|||||||
Config, PeerConfig, PeerInfoSerde, CONNECT_TIMEOUT, READ_TIMEOUT, RELAY_PORT,
|
Config, PeerConfig, PeerInfoSerde, CONNECT_TIMEOUT, READ_TIMEOUT, RELAY_PORT,
|
||||||
RENDEZVOUS_TIMEOUT,
|
RENDEZVOUS_TIMEOUT,
|
||||||
},
|
},
|
||||||
log,
|
get_version_number, log,
|
||||||
message_proto::{option_message::BoolOption, *},
|
message_proto::{option_message::BoolOption, *},
|
||||||
protobuf::Message as _,
|
protobuf::Message as _,
|
||||||
rand,
|
rand,
|
||||||
@ -47,7 +48,10 @@ pub use super::lang::*;
|
|||||||
pub mod file_trait;
|
pub mod file_trait;
|
||||||
pub mod helper;
|
pub mod helper;
|
||||||
pub mod io_loop;
|
pub mod io_loop;
|
||||||
use crate::server::video_service::{SCRAP_X11_REF_URL, SCRAP_X11_REQUIRED};
|
use crate::{
|
||||||
|
common::{self, is_keyboard_mode_supported},
|
||||||
|
server::video_service::{SCRAP_X11_REF_URL, SCRAP_X11_REQUIRED},
|
||||||
|
};
|
||||||
pub static SERVER_KEYBOARD_ENABLED: AtomicBool = AtomicBool::new(true);
|
pub static SERVER_KEYBOARD_ENABLED: AtomicBool = AtomicBool::new(true);
|
||||||
pub static SERVER_FILE_TRANSFER_ENABLED: AtomicBool = AtomicBool::new(true);
|
pub static SERVER_FILE_TRANSFER_ENABLED: AtomicBool = AtomicBool::new(true);
|
||||||
pub static SERVER_CLIPBOARD_ENABLED: AtomicBool = AtomicBool::new(true);
|
pub static SERVER_CLIPBOARD_ENABLED: AtomicBool = AtomicBool::new(true);
|
||||||
@ -1392,12 +1396,18 @@ impl LoginConfigHandler {
|
|||||||
log::debug!("remove password of {}", self.id);
|
log::debug!("remove password of {}", self.id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if config.keyboard_mode == "" {
|
if config.keyboard_mode.is_empty() {
|
||||||
if hbb_common::get_version_number(&pi.version) < hbb_common::get_version_number("1.2.0")
|
if is_keyboard_mode_supported(&KeyboardMode::Map, get_version_number(&pi.version)) {
|
||||||
{
|
config.keyboard_mode = KeyboardMode::Map.to_string();
|
||||||
config.keyboard_mode = "legacy".to_string();
|
|
||||||
} else {
|
} else {
|
||||||
config.keyboard_mode = "map".to_string();
|
config.keyboard_mode = KeyboardMode::Legacy.to_string();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let keyboard_modes =
|
||||||
|
common::get_supported_keyboard_modes(get_version_number(&pi.version));
|
||||||
|
let current_mode = &KeyboardMode::from_str(&config.keyboard_mode).unwrap_or_default();
|
||||||
|
if !keyboard_modes.contains(current_mode) {
|
||||||
|
config.keyboard_mode = KeyboardMode::Legacy.to_string();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self.conn_id = pi.conn_id;
|
self.conn_id = pi.conn_id;
|
||||||
|
@ -658,6 +658,22 @@ pub fn make_privacy_mode_msg(state: back_notification::PrivacyModeState) -> Mess
|
|||||||
msg_out
|
msg_out
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn is_keyboard_mode_supported(keyboard_mode: &KeyboardMode, version_number: i64) -> bool {
|
||||||
|
match keyboard_mode {
|
||||||
|
KeyboardMode::Legacy => true,
|
||||||
|
KeyboardMode::Map => version_number >= hbb_common::get_version_number("1.2.0"),
|
||||||
|
KeyboardMode::Translate => false,
|
||||||
|
KeyboardMode::Auto => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_supported_keyboard_modes(version: i64) -> Vec<KeyboardMode> {
|
||||||
|
KeyboardMode::iter()
|
||||||
|
.filter(|&mode| is_keyboard_mode_supported(mode, version))
|
||||||
|
.map(|&mode| mode)
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(not(target_os = "linux"))]
|
#[cfg(not(target_os = "linux"))]
|
||||||
lazy_static::lazy_static! {
|
lazy_static::lazy_static! {
|
||||||
pub static ref IS_X11: bool = false;
|
pub static ref IS_X11: bool = false;
|
||||||
|
@ -7,11 +7,14 @@ use std::{
|
|||||||
use flutter_rust_bridge::{StreamSink, SyncReturn, ZeroCopyBuffer};
|
use flutter_rust_bridge::{StreamSink, SyncReturn, ZeroCopyBuffer};
|
||||||
use serde_json::json;
|
use serde_json::json;
|
||||||
|
|
||||||
|
use crate::common::is_keyboard_mode_supported;
|
||||||
|
use hbb_common::message_proto::KeyboardMode;
|
||||||
use hbb_common::ResultType;
|
use hbb_common::ResultType;
|
||||||
use hbb_common::{
|
use hbb_common::{
|
||||||
config::{self, LocalConfig, PeerConfig, ONLINE},
|
config::{self, LocalConfig, PeerConfig, ONLINE},
|
||||||
fs, log,
|
fs, log,
|
||||||
};
|
};
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
// use crate::hbbs_http::account::AuthResult;
|
// use crate::hbbs_http::account::AuthResult;
|
||||||
|
|
||||||
@ -254,6 +257,21 @@ pub fn session_get_custom_image_quality(id: String) -> Option<Vec<i32>> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn session_is_keyboard_mode_supported(id: String, mode: String) -> SyncReturn<bool> {
|
||||||
|
if let Some(session) = SESSIONS.read().unwrap().get(&id) {
|
||||||
|
if let Ok(mode) = KeyboardMode::from_str(&mode[..]) {
|
||||||
|
SyncReturn(is_keyboard_mode_supported(
|
||||||
|
&mode,
|
||||||
|
session.get_peer_version(),
|
||||||
|
))
|
||||||
|
} else {
|
||||||
|
SyncReturn(false)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
SyncReturn(false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn session_set_custom_image_quality(id: String, value: i32) {
|
pub fn session_set_custom_image_quality(id: String, value: i32) {
|
||||||
if let Some(session) = SESSIONS.write().unwrap().get_mut(&id) {
|
if let Some(session) = SESSIONS.write().unwrap().get_mut(&id) {
|
||||||
session.save_custom_image_quality(value);
|
session.save_custom_image_quality(value);
|
||||||
|
@ -4,7 +4,7 @@ use crate::client::{
|
|||||||
input_os_password, load_config, send_mouse, start_video_audio_threads, FileManager, Key,
|
input_os_password, load_config, send_mouse, start_video_audio_threads, FileManager, Key,
|
||||||
LoginConfigHandler, QualityStatus, KEY_MAP,
|
LoginConfigHandler, QualityStatus, KEY_MAP,
|
||||||
};
|
};
|
||||||
use crate::common::GrabState;
|
use crate::common::{self, is_keyboard_mode_supported, GrabState};
|
||||||
use crate::keyboard;
|
use crate::keyboard;
|
||||||
use crate::{client::Data, client::Interface};
|
use crate::{client::Data, client::Interface};
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
@ -74,6 +74,10 @@ impl<T: InvokeUiSession> Session<T> {
|
|||||||
self.lc.read().unwrap().custom_image_quality.clone()
|
self.lc.read().unwrap().custom_image_quality.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_peer_version(&self) -> i64 {
|
||||||
|
self.lc.read().unwrap().version.clone()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get_keyboard_mode(&self) -> String {
|
pub fn get_keyboard_mode(&self) -> String {
|
||||||
self.lc.read().unwrap().keyboard_mode.clone()
|
self.lc.read().unwrap().keyboard_mode.clone()
|
||||||
}
|
}
|
||||||
@ -225,6 +229,11 @@ impl<T: InvokeUiSession> Session<T> {
|
|||||||
crate::platform::is_xfce()
|
crate::platform::is_xfce()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_supported_keyboard_modes(&self) -> Vec<KeyboardMode> {
|
||||||
|
let version = self.get_peer_version();
|
||||||
|
common::get_supported_keyboard_modes(version)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn remove_port_forward(&self, port: i32) {
|
pub fn remove_port_forward(&self, port: i32) {
|
||||||
let mut config = self.load_config();
|
let mut config = self.load_config();
|
||||||
config.port_forwards = config
|
config.port_forwards = config
|
||||||
|
Loading…
x
Reference in New Issue
Block a user