OSX 中的通用后退/前进鼠标按钮而不是 M4/M5?

Arc*_*gon 7 mouse navigation logitech-mouse macos

我对我的 Logitech MX Master 鼠标上两个侧键的行为感到困惑。在我所有的其他鼠标上,侧按钮被检测为通用的“按钮 4”和“按钮 5”。(我使用 Xcode 验证了这一点。)与 Windows 相比,OS X 似乎将这些命令视为中间点击,因此为了获得您可能期望的后退/前进行为,您需要使用 USB Overdrive 之类的工具来映射他们到?+[?+ ]。不幸的是,此解决方法不适用于每个应用程序,并且在您触发它时会闪烁菜单栏。

同时,我的 Xcode 鼠标点击根本无法检测到 Master 上的侧按钮,但不知何故,它们几乎可以在任何带有导航栏的应用程序中使用。我已经在 Finder、Safari、系统偏好设置和 Xcode 中测试过它们。没有菜单闪烁,鼠标光标必须在由导航栏控制的窗口区域上方,这意味着有某种通用的后退/前进事件正在发送(与通常的 M4/M5 相反)。但是,我找不到 OS X 中存在的此类事件的文档。大多数 M4/M5 修复都涉及将这些按钮映射到?+[?+ ]

那么 Master 用这些侧键做什么,我如何在所有其他鼠标上复制相同的行为?

小智 12

VS Code 现在支持Go BackGo Forward操作,默认键绑定分别为CTRL+-CTRL++ 。SHIFT-

我能够通过以下方式配置 Logi Options 以使用这些快捷方式,而不会破坏其他应用程序:

  1. 添加 VS Code 配置文件,通过All Applications-> Add Application-> Other...,然后搜索“Visual Studio Code”
  2. 将后退和前进按钮重新映射为Keystroke assignment,按键序列与 VS Code 键绑定匹配

这是后退按钮配置的样子,选择了配置文件:

Logi 选项,选择了 Visual Studio Code 配置文件

完成这些更改后,前进和后退按钮可以在 VS Code 中使用,并且其他应用程序(例如 Chrome)中的导航不受影响。

  • 太棒了!显然,如果您确实不需要 Logi Options 的任何功能,另一个解决方案是卸载它。这将使您的 Logitech 后退和前进按钮无需特殊分配即可工作(请参阅 https://github.com/microsoft/vscode/issues/88029#issuecomment-722294184)。我不想卸载它,因为这是我发现禁用滚轮加速的唯一方法,所以你的解决方案是理想的。 (3认同)

Arc*_*gon 8

我为我的所有NSWindow事件添加了一个水龙头。结果……大师正在模拟滑动事件!

NSEvent: type=Swipe loc=(252,60) time=5443.9 flags=0x100 win=0x100b091f0 winNum=2014 ctxt=0x0 phase: 1 axis:0 amount=0.000 velocity={0, 0}
NSEvent: type=Swipe loc=(252,60) time=5443.9 flags=0x100 win=0x100b091f0 winNum=2014 ctxt=0x0 phase: 8 axis:0 amount=0.000 velocity={0, 0}
NSEvent: type=Swipe loc=(252,60) time=5445.7 flags=0x100 win=0x100b091f0 winNum=2014 ctxt=0x0 phase: 1 axis:0 amount=0.000 velocity={0, 0}
NSEvent: type=Swipe loc=(252,60) time=5445.7 flags=0x100 win=0x100b091f0 winNum=2014 ctxt=0x0 phase: 8 axis:0 amount=0.000 velocity={0, 0}
Run Code Online (Sandbox Code Playgroud)

好的,这很聪明,因为它基本上意味着它可以在任何支持swipeWithEvent:选择器的视图中工作。我不知道为什么这不是侧面按钮的默认行为!现在我必须弄清楚如何将此功能添加到我的其他鼠标。我不认为 USB Overdrive 可以做这样的事情......除非 AppleScript 有模拟手势的方法。

更新:我设法使用natevw的逆向工程手势模拟功能复制了这些事件,https://github.com/calftrail/Touch。可能仍然需要修复一下,但它有效!最后一步将是创建一个始终运行的应用程序,该应用程序可以处理 M4 和 M5 事件并输出这些手势。

NSEvent: type=Swipe loc=(252,60) time=5443.9 flags=0x100 win=0x100b091f0 winNum=2014 ctxt=0x0 phase: 1 axis:0 amount=0.000 velocity={0, 0}
NSEvent: type=Swipe loc=(252,60) time=5443.9 flags=0x100 win=0x100b091f0 winNum=2014 ctxt=0x0 phase: 8 axis:0 amount=0.000 velocity={0, 0}
NSEvent: type=Swipe loc=(252,60) time=5445.7 flags=0x100 win=0x100b091f0 winNum=2014 ctxt=0x0 phase: 1 axis:0 amount=0.000 velocity={0, 0}
NSEvent: type=Swipe loc=(252,60) time=5445.7 flags=0x100 win=0x100b091f0 winNum=2014 ctxt=0x0 phase: 8 axis:0 amount=0.000 velocity={0, 0}
Run Code Online (Sandbox Code Playgroud)

更新 2:这是全局捕获 M4 和 M5 并发出滑动的视图控制器的粗略工作草图。

TLInfoSwipeDirection dir = kTLInfoSwipeLeft;

NSDictionary* swipeInfo1 = [NSDictionary dictionaryWithObjectsAndKeys:
                            @(kTLInfoSubtypeSwipe), kTLInfoKeyGestureSubtype,
                            @(1), kTLInfoKeyGesturePhase,
                            nil];

NSDictionary* swipeInfo2 = [NSDictionary dictionaryWithObjectsAndKeys:
                            @(kTLInfoSubtypeSwipe), kTLInfoKeyGestureSubtype,
                            @(dir), kTLInfoKeySwipeDirection,
                            @(4), kTLInfoKeyGesturePhase,
                            nil];

CGEventRef event1 = tl_CGEventCreateFromGesture((__bridge CFDictionaryRef)(swipeInfo1), (__bridge CFArrayRef)@[]);
CGEventRef event2 = tl_CGEventCreateFromGesture((__bridge CFDictionaryRef)(swipeInfo2), (__bridge CFArrayRef)@[]);

CGEventPost(kCGHIDEventTap, event1);
CGEventPost(kCGHIDEventTap, event2);

// not sure if necessary under ARC
CFRelease(event1);
CFRelease(event2);
Run Code Online (Sandbox Code Playgroud)

更新 3:我发布了一个开源菜单栏应用程序,它为所有第三方鼠标复制了 Master 的行为。它被称为SensibleSideButtons。技术细节在网站上有描述。