Merge pull request #5645 from fufesou/feat/scroll_mode
feat, mouse wheel and touchpad scroll mode, default or reverse
This commit is contained in:
commit
f6973f9a70
@ -138,6 +138,11 @@ const kRemoteScrollStyleAuto = 'scrollauto';
|
||||
/// [kRemoteScrollStyleBar] Scroll image with scroll bar.
|
||||
const kRemoteScrollStyleBar = 'scrollbar';
|
||||
|
||||
/// [kScrollModeDefault] Mouse or touchpad, the default scroll mode.
|
||||
const kScrollModeDefault = 'default';
|
||||
/// [kScrollModeReverse] Mouse or touchpad, the reverse scroll mode.
|
||||
const kScrollModeReverse = 'reverse';
|
||||
|
||||
/// [kRemoteImageQualityBest] Best image quality.
|
||||
const kRemoteImageQualityBest = 'best';
|
||||
|
||||
|
@ -1216,6 +1216,7 @@ class _DisplayState extends State<_Display> {
|
||||
otherRow('Disable clipboard', 'disable_clipboard'),
|
||||
otherRow('Lock after session end', 'lock_after_session_end'),
|
||||
otherRow('Privacy mode', 'privacy_mode'),
|
||||
otherRow('Reverse mouse wheel', 'reverse_mouse_wheel'),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
@ -101,7 +101,7 @@ class ToolbarState {
|
||||
class _ToolbarTheme {
|
||||
static const Color blueColor = MyTheme.button;
|
||||
static const Color hoverBlueColor = MyTheme.accent;
|
||||
static Color inactiveColor = Colors.grey[800]!;
|
||||
static Color inactiveColor = Colors.grey[800]!;
|
||||
static Color hoverInactiveColor = Colors.grey[850]!;
|
||||
|
||||
static const Color redColor = Colors.redAccent;
|
||||
@ -546,9 +546,11 @@ class _PinMenu extends StatelessWidget {
|
||||
assetName: state.pin ? "assets/pinned.svg" : "assets/unpinned.svg",
|
||||
tooltip: state.pin ? 'Unpin Toolbar' : 'Pin Toolbar',
|
||||
onPressed: state.switchPin,
|
||||
color: state.pin ? _ToolbarTheme.blueColor : _ToolbarTheme.inactiveColor,
|
||||
hoverColor:
|
||||
state.pin ? _ToolbarTheme.hoverBlueColor : _ToolbarTheme.hoverInactiveColor,
|
||||
color:
|
||||
state.pin ? _ToolbarTheme.blueColor : _ToolbarTheme.inactiveColor,
|
||||
hoverColor: state.pin
|
||||
? _ToolbarTheme.hoverBlueColor
|
||||
: _ToolbarTheme.hoverInactiveColor,
|
||||
),
|
||||
);
|
||||
}
|
||||
@ -561,15 +563,18 @@ class _MobileActionMenu extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (!ffi.ffiModel.isPeerAndroid) return Offstage();
|
||||
return Obx(()=>_IconMenuButton(
|
||||
assetName: 'assets/actions_mobile.svg',
|
||||
tooltip: 'Mobile Actions',
|
||||
onPressed: () => ffi.dialogManager.toggleMobileActionsOverlay(ffi: ffi),
|
||||
color: ffi.dialogManager.mobileActionsOverlayVisible.isTrue
|
||||
? _ToolbarTheme.blueColor : _ToolbarTheme.inactiveColor,
|
||||
hoverColor: ffi.dialogManager.mobileActionsOverlayVisible.isTrue
|
||||
? _ToolbarTheme.hoverBlueColor : _ToolbarTheme.hoverInactiveColor,
|
||||
));
|
||||
return Obx(() => _IconMenuButton(
|
||||
assetName: 'assets/actions_mobile.svg',
|
||||
tooltip: 'Mobile Actions',
|
||||
onPressed: () =>
|
||||
ffi.dialogManager.toggleMobileActionsOverlay(ffi: ffi),
|
||||
color: ffi.dialogManager.mobileActionsOverlayVisible.isTrue
|
||||
? _ToolbarTheme.blueColor
|
||||
: _ToolbarTheme.inactiveColor,
|
||||
hoverColor: ffi.dialogManager.mobileActionsOverlayVisible.isTrue
|
||||
? _ToolbarTheme.hoverBlueColor
|
||||
: _ToolbarTheme.hoverInactiveColor,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
@ -1304,23 +1309,25 @@ class _KeyboardMenu extends StatelessWidget {
|
||||
color: _ToolbarTheme.blueColor,
|
||||
hoverColor: _ToolbarTheme.hoverBlueColor,
|
||||
menuChildren: [
|
||||
mode(modeOnly),
|
||||
keyboardMode(modeOnly),
|
||||
localKeyboardType(),
|
||||
Divider(),
|
||||
view_mode(),
|
||||
viewMode(),
|
||||
Divider(),
|
||||
reverseMouseWheel(),
|
||||
]);
|
||||
}
|
||||
|
||||
mode(String? modeOnly) {
|
||||
keyboardMode(String? modeOnly) {
|
||||
return futureBuilder(future: () async {
|
||||
return await bind.sessionGetKeyboardMode(sessionId: ffi.sessionId) ??
|
||||
_kKeyLegacyMode;
|
||||
}(), hasData: (data) {
|
||||
final groupValue = data as String;
|
||||
List<KeyboardModeMenu> modes = [
|
||||
KeyboardModeMenu(key: _kKeyLegacyMode, menu: 'Legacy mode'),
|
||||
KeyboardModeMenu(key: _kKeyMapMode, menu: 'Map mode'),
|
||||
KeyboardModeMenu(key: _kKeyTranslateMode, menu: 'Translate mode'),
|
||||
List<InputModeMenu> modes = [
|
||||
InputModeMenu(key: _kKeyLegacyMode, menu: 'Legacy mode'),
|
||||
InputModeMenu(key: _kKeyMapMode, menu: 'Map mode'),
|
||||
InputModeMenu(key: _kKeyTranslateMode, menu: 'Translate mode'),
|
||||
];
|
||||
List<RdoMenuButton> list = [];
|
||||
final enabled = !ffi.ffiModel.viewOnly;
|
||||
@ -1330,7 +1337,7 @@ class _KeyboardMenu extends StatelessWidget {
|
||||
sessionId: ffi.sessionId, value: value);
|
||||
}
|
||||
|
||||
for (KeyboardModeMenu mode in modes) {
|
||||
for (InputModeMenu mode in modes) {
|
||||
if (modeOnly != null && mode.key != modeOnly) {
|
||||
continue;
|
||||
} else if (!bind.sessionIsKeyboardModeSupported(
|
||||
@ -1379,7 +1386,7 @@ class _KeyboardMenu extends StatelessWidget {
|
||||
);
|
||||
}
|
||||
|
||||
view_mode() {
|
||||
viewMode() {
|
||||
final ffiModel = ffi.ffiModel;
|
||||
final enabled = version_cmp(pi.version, '1.2.0') >= 0 && ffiModel.keyboard;
|
||||
return CkbMenuButton(
|
||||
@ -1395,6 +1402,32 @@ class _KeyboardMenu extends StatelessWidget {
|
||||
ffi: ffi,
|
||||
child: Text(translate('View Mode')));
|
||||
}
|
||||
|
||||
reverseMouseWheel() {
|
||||
return futureBuilder(future: () async {
|
||||
final v =
|
||||
await bind.sessionGetReverseMouseWheel(sessionId: ffi.sessionId);
|
||||
debugPrint('REMOVE ME ======================== $v');
|
||||
if (v != null && v != '') {
|
||||
return v;
|
||||
}
|
||||
return bind.mainGetUserDefaultOption(key: 'reverse_mouse_wheel');
|
||||
}(), hasData: (data) {
|
||||
debugPrint('REMOVE ME ======================== data $data');
|
||||
final enabled = !ffi.ffiModel.viewOnly;
|
||||
onChanged(bool? value) async {
|
||||
if (value == null) return;
|
||||
await bind.sessionSetReverseMouseWheel(
|
||||
sessionId: ffi.sessionId, value: value ? 'Y' : 'N');
|
||||
}
|
||||
|
||||
return CkbMenuButton(
|
||||
value: data == 'Y',
|
||||
onChanged: enabled ? onChanged : null,
|
||||
child: Text(translate('Reverse mouse wheel')),
|
||||
ffi: ffi);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
class _ChatMenu extends StatefulWidget {
|
||||
@ -1592,26 +1625,26 @@ class _IconMenuButtonState extends State<_IconMenuButton> {
|
||||
width: _ToolbarTheme.buttonSize,
|
||||
height: _ToolbarTheme.buttonSize,
|
||||
child: MenuItemButton(
|
||||
style: ButtonStyle(
|
||||
backgroundColor: MaterialStatePropertyAll(Colors.transparent),
|
||||
padding: MaterialStatePropertyAll(EdgeInsets.zero),
|
||||
overlayColor: MaterialStatePropertyAll(Colors.transparent)),
|
||||
onHover: (value) => setState(() {
|
||||
hover = value;
|
||||
}),
|
||||
onPressed: widget.onPressed,
|
||||
child: Tooltip(
|
||||
message: translate(widget.tooltip),
|
||||
child: Material(
|
||||
type: MaterialType.transparency,
|
||||
child: Ink(
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(_ToolbarTheme.iconRadius),
|
||||
color: hover ? widget.hoverColor : widget.color,
|
||||
),
|
||||
child: icon)),
|
||||
)
|
||||
),
|
||||
style: ButtonStyle(
|
||||
backgroundColor: MaterialStatePropertyAll(Colors.transparent),
|
||||
padding: MaterialStatePropertyAll(EdgeInsets.zero),
|
||||
overlayColor: MaterialStatePropertyAll(Colors.transparent)),
|
||||
onHover: (value) => setState(() {
|
||||
hover = value;
|
||||
}),
|
||||
onPressed: widget.onPressed,
|
||||
child: Tooltip(
|
||||
message: translate(widget.tooltip),
|
||||
child: Material(
|
||||
type: MaterialType.transparency,
|
||||
child: Ink(
|
||||
decoration: BoxDecoration(
|
||||
borderRadius:
|
||||
BorderRadius.circular(_ToolbarTheme.iconRadius),
|
||||
color: hover ? widget.hoverColor : widget.color,
|
||||
),
|
||||
child: icon)),
|
||||
)),
|
||||
).marginSymmetric(
|
||||
horizontal: widget.hMargin ?? _ToolbarTheme.buttonHMargin,
|
||||
vertical: widget.vMargin ?? _ToolbarTheme.buttonVMargin);
|
||||
@ -1675,18 +1708,17 @@ class _IconSubmenuButtonState extends State<_IconSubmenuButton> {
|
||||
onHover: (value) => setState(() {
|
||||
hover = value;
|
||||
}),
|
||||
child: Tooltip(
|
||||
message: translate(widget.tooltip),
|
||||
child: Material(
|
||||
child: Tooltip(
|
||||
message: translate(widget.tooltip),
|
||||
child: Material(
|
||||
type: MaterialType.transparency,
|
||||
child: Ink(
|
||||
decoration: BoxDecoration(
|
||||
borderRadius:
|
||||
BorderRadius.circular(_ToolbarTheme.iconRadius),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius:
|
||||
BorderRadius.circular(_ToolbarTheme.iconRadius),
|
||||
color: hover ? widget.hoverColor : widget.color,
|
||||
),
|
||||
child: icon))
|
||||
),
|
||||
),
|
||||
child: icon))),
|
||||
menuChildren: widget.menuChildren
|
||||
.map((e) => _buildPointerTrackWidget(e, widget.ffi))
|
||||
.toList()));
|
||||
@ -1973,11 +2005,11 @@ class _DraggableShowHideState extends State<_DraggableShowHide> {
|
||||
}
|
||||
}
|
||||
|
||||
class KeyboardModeMenu {
|
||||
class InputModeMenu {
|
||||
final String key;
|
||||
final String menu;
|
||||
|
||||
KeyboardModeMenu({required this.key, required this.menu});
|
||||
InputModeMenu({required this.key, required this.menu});
|
||||
}
|
||||
|
||||
_menuDismissCallback(FFI ffi) => ffi.inputModel.refreshMousePos();
|
||||
|
@ -230,6 +230,7 @@ pub struct PeerConfig {
|
||||
skip_serializing_if = "String::is_empty"
|
||||
)]
|
||||
pub view_style: String,
|
||||
// Image scroll style, scrollbar or scroll auto
|
||||
#[serde(
|
||||
default = "PeerConfig::default_scroll_style",
|
||||
deserialize_with = "PeerConfig::deserialize_scroll_style",
|
||||
@ -276,6 +277,13 @@ pub struct PeerConfig {
|
||||
pub keyboard_mode: String,
|
||||
#[serde(flatten)]
|
||||
pub view_only: ViewOnly,
|
||||
// Mouse wheel or touchpad scroll mode
|
||||
#[serde(
|
||||
default = "PeerConfig::default_reverse_mouse_wheel",
|
||||
deserialize_with = "PeerConfig::deserialize_reverse_mouse_wheel",
|
||||
skip_serializing_if = "String::is_empty"
|
||||
)]
|
||||
pub reverse_mouse_wheel: String,
|
||||
|
||||
#[serde(
|
||||
default,
|
||||
@ -319,6 +327,7 @@ impl Default for PeerConfig {
|
||||
show_quality_monitor: Default::default(),
|
||||
keyboard_mode: Default::default(),
|
||||
view_only: Default::default(),
|
||||
reverse_mouse_wheel: Self::default_reverse_mouse_wheel(),
|
||||
custom_resolutions: Default::default(),
|
||||
options: Self::default_options(),
|
||||
ui_flutter: Default::default(),
|
||||
@ -1130,6 +1139,11 @@ impl PeerConfig {
|
||||
deserialize_image_quality,
|
||||
UserDefaultConfig::read().get("image_quality")
|
||||
);
|
||||
serde_field_string!(
|
||||
default_reverse_mouse_wheel,
|
||||
deserialize_reverse_mouse_wheel,
|
||||
UserDefaultConfig::read().get("reverse_mouse_wheel")
|
||||
);
|
||||
|
||||
fn default_custom_image_quality() -> Vec<i32> {
|
||||
let f: f64 = UserDefaultConfig::read()
|
||||
@ -1483,7 +1497,11 @@ impl UserDefaultConfig {
|
||||
}
|
||||
|
||||
pub fn set(&mut self, key: String, value: String) {
|
||||
self.options.insert(key, value);
|
||||
if value.is_empty() {
|
||||
self.options.remove(&key);
|
||||
} else {
|
||||
self.options.insert(key, value);
|
||||
}
|
||||
self.store();
|
||||
}
|
||||
|
||||
|
@ -1195,6 +1195,17 @@ impl LoginConfigHandler {
|
||||
self.save_config(config);
|
||||
}
|
||||
|
||||
/// Save reverse mouse wheel ("", "Y") to the current config.
|
||||
///
|
||||
/// # Arguments
|
||||
///
|
||||
/// * `value` - The reverse mouse wheel ("", "Y").
|
||||
pub fn save_reverse_mouse_wheel(&mut self, value: String) {
|
||||
let mut config = self.load_config();
|
||||
config.reverse_mouse_wheel = value;
|
||||
self.save_config(config);
|
||||
}
|
||||
|
||||
/// Save scroll style to the current config.
|
||||
///
|
||||
/// # Arguments
|
||||
|
@ -21,8 +21,6 @@ use hbb_common::{
|
||||
};
|
||||
use std::{
|
||||
collections::HashMap,
|
||||
ffi::{CStr, CString},
|
||||
os::raw::c_char,
|
||||
str::FromStr,
|
||||
sync::{
|
||||
atomic::{AtomicI32, Ordering},
|
||||
@ -302,6 +300,20 @@ pub fn session_set_keyboard_mode(session_id: SessionID, value: String) {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn session_get_reverse_mouse_wheel(session_id: SessionID) -> Option<String> {
|
||||
if let Some(session) = SESSIONS.read().unwrap().get(&session_id) {
|
||||
Some(session.get_reverse_mouse_wheel())
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
pub fn session_set_reverse_mouse_wheel(session_id: SessionID, value: String) {
|
||||
if let Some(session) = SESSIONS.write().unwrap().get_mut(&session_id) {
|
||||
session.save_reverse_mouse_wheel(value);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn session_get_custom_image_quality(session_id: SessionID) -> Option<Vec<i32>> {
|
||||
if let Some(session) = SESSIONS.read().unwrap().get(&session_id) {
|
||||
Some(session.get_custom_image_quality())
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", ""),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", ""),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", "HSV 色"),
|
||||
("Installation Successful!", "安装成功!"),
|
||||
("Installation failed!", "安装失败!"),
|
||||
("Reverse mouse wheel", "鼠标滚轮反向"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", ""),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", ""),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", "HSV-Farbe"),
|
||||
("Installation Successful!", "Installation erfolgreich!"),
|
||||
("Installation failed!", "Installation fehlgeschlagen!"),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", ""),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -77,5 +77,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("pull_ab_failed_tip", "Failed to refresh address book"),
|
||||
("push_ab_failed_tip", "Failed to sync address book to server"),
|
||||
("synced_peer_readded_tip", "The devices that were present in the recent sessions will be synchronized back to the address book."),
|
||||
("View Mode", "View mode"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", ""),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", "Color HSV"),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", ""),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", "Couleur TSL"),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", ""),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", "Warna HSV"),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", "Colore HSV"),
|
||||
("Installation Successful!", "Installazione completata"),
|
||||
("Installation failed!", "Installazione fallita"),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", ""),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", ""),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", ""),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", ""),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", "HSV Kleur"),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", ""),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", ""),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", ""),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", ""),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", "Цвет HSV"),
|
||||
("Installation Successful!", "Установка выполнена успешно!"),
|
||||
("Installation failed!", "Установка не выполнена!"),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", ""),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", ""),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", ""),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", ""),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", ""),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", ""),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", ""),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", "HSV Rengi"),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", "HSV 色"),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", ""),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -543,5 +543,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("HSV Color", ""),
|
||||
("Installation Successful!", ""),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
use crate::input::{MOUSE_BUTTON_LEFT, MOUSE_TYPE_DOWN, MOUSE_TYPE_UP};
|
||||
use crate::input::{MOUSE_BUTTON_LEFT, MOUSE_TYPE_DOWN, MOUSE_TYPE_UP, MOUSE_TYPE_WHEEL};
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
use std::{collections::HashMap, sync::atomic::AtomicBool};
|
||||
use std::{
|
||||
@ -175,6 +175,14 @@ impl<T: InvokeUiSession> Session<T> {
|
||||
self.lc.write().unwrap().save_keyboard_mode(value);
|
||||
}
|
||||
|
||||
pub fn get_reverse_mouse_wheel(&self) -> String {
|
||||
self.lc.read().unwrap().reverse_mouse_wheel.clone()
|
||||
}
|
||||
|
||||
pub fn save_reverse_mouse_wheel(&mut self, value: String) {
|
||||
self.lc.write().unwrap().save_reverse_mouse_wheel(value);
|
||||
}
|
||||
|
||||
pub fn save_view_style(&mut self, value: String) {
|
||||
self.lc.write().unwrap().save_view_style(value);
|
||||
}
|
||||
@ -730,6 +738,7 @@ impl<T: InvokeUiSession> Session<T> {
|
||||
});
|
||||
}
|
||||
"pan_update" => {
|
||||
let (x, y) = self.get_scroll_xy((x, y));
|
||||
touch_evt.set_pan_update(TouchPanUpdate {
|
||||
x,
|
||||
y,
|
||||
@ -753,6 +762,21 @@ impl<T: InvokeUiSession> Session<T> {
|
||||
send_pointer_device_event(evt, alt, ctrl, shift, command, self);
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
fn is_scroll_reverse_mode(&self) -> bool {
|
||||
self.lc.read().unwrap().reverse_mouse_wheel.eq("Y")
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn get_scroll_xy(&self, xy: (i32, i32)) -> (i32, i32) {
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
if self.is_scroll_reverse_mode() {
|
||||
return (-xy.0, -xy.1);
|
||||
}
|
||||
xy
|
||||
}
|
||||
|
||||
pub fn send_mouse(
|
||||
&self,
|
||||
mask: i32,
|
||||
@ -772,6 +796,12 @@ impl<T: InvokeUiSession> Session<T> {
|
||||
}
|
||||
}
|
||||
|
||||
let (x, y) = if mask == MOUSE_TYPE_WHEEL {
|
||||
self.get_scroll_xy((x, y))
|
||||
} else {
|
||||
(x, y)
|
||||
};
|
||||
|
||||
// #[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
let (alt, ctrl, shift, command) =
|
||||
keyboard::client::get_modifiers_state(alt, ctrl, shift, command);
|
||||
|
Loading…
x
Reference in New Issue
Block a user