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