[高效] Logitech MX Master 3 在Linux与Windows下快速切换
1.0 Logitech MX Master 3 在Linux与Windows下快速切换
趁着打折入手了 Logitech MX Master 3,用起来手感很惊艳,而且”快速滚轮“很好用。
无奈安装了Logitech Options之后发现介绍的快速切换设备的Flow无法工作在Linux下。而且鼠标的智障设计把切换设备的按钮放到了鼠标背面,每次都需要翻过来才能切换设备,而且这个切换设备的操作不能映射到其他表面按钮。一度想退掉换M720,但是又舍不得到手的低价产品和扎实的手感。
最后看到了网上的几个开源库,折腾了一番最终实现了按下中键下方的按钮实现在Ubuntu和Windows之间切换。(p.s. 这个不是无缝切换,会稍稍有些延迟)
2.0 Linux上的鼠标按键自定义
2.1 安装Logiops
logiops是一个开源项目,实现了部分Logitech的鼠标的按键自定义功能。该项目支持自定义MX Master 3。
在Linux系统上安装logiops
安装方法只需要跟着readme,装好依赖,make就好,在Ubuntu下
sudo apt install cmake libevdev-dev libudev-dev libconfig++-dev
git clone https://github.com/PixlOne/logiops.git
cd logiops
mkdir build
cd build
cmake ..
make
# 安装到系统
sudo make install
如果想测试的话就运行
sudo ./logid
配置文件在 /etc/logid.cfg 在中
启动服务
sudo systemctl restart logid
sudo systemctl enable logid
自动重启服务
Add an udev rules in /etc/udev/rules.d/90-my.rules
# /etc/udev/rules.d/90-my.rules
ACTION=="add", SUBSYSTEM=="bluetooth", RUN{program}="/bin/systemctl restart logid.service"
and call
sudo udevadm control --reload
This will restart logid service when a new bluetooth device added.
If your mouse use the usb, you can modify "bluetooth" to "usb".
配置Logiops
devices: (
{
name: "Wireless Mouse MX Master 3";
buttons: (
{
cid: 0xc3;
action =
{
type: "Gestures";
gestures: (
{
direction: "Up";
mode: "OnRelease";
action =
{
type: "Keypress";
keys: ["KEY_UP"];
};
},
{
direction: "Down";
mode: "OnRelease";
action =
{
type: "Keypress";
keys: ["KEY_LEFTMETA", "KEY_D"];
};
},
{
direction: "Left";
mode: "OnRelease";
action =
{
type: "CycleDPI";
dpis: [400, 600, 800, 1000, 1200, 1400, 1600];
};
},
{
direction: "Right";
mode: "OnRelease";
action =
{
type = "ChangeHost";
host = 1;
}
},
{
direction: "None"
mode: "OnRelease";
action =
{
type: "Keypress";
keys: ["KEY_LEFTALT", "KEY_TAB"];
};
}
);
};
},
{
cid: 0xc4;
action =
{
type: "ChangeHost";
host = 1;
};
}
);
}
);
在Windows上实现切换设备
观察了下Logiops的源码,发现调用了hidpp库的功能实现控制鼠标的。因此在Windows就将目光转向了hidpp这个项目,因为在项目的介绍页上说该项目可以在Windows上编译。
在Windows上编译安装hidpp
这个花了我很长时间琢磨,首先我自己电脑上有Visual Studio,所以当然选择用MSVC编译安装了。
在hidpp的简介中,介绍了如果使用MSVC编译,需要getopt库的支持,而项目建议使用vcpkg中的getopt。
getopt的获取
vcpkg介绍了工具的安装方法,十分简单clone下来库并运行一个.bat
即可完成安装了。
> git clone https://github.com/microsoft/vcpkg
> .\vcpkg\bootstrap-vcpkg.bat
# 安装getopt库
> .\vcpkg\vcpkg install getopt
这里注意VS需要安装English语言包才能正常使用vcpkg的功能!
在vcpkg 的安装目录下寻找
installed\x86-windows\include # 头文件路径
installed\x86-windows\lib # 库路径
按照vcpkg的介绍,cmake只需要设定一个变量即可自动查找到由vcpkg安装过的库,但是不知道是不是hidpp项目的CMakeList没有处理vcpkg的内容,所以需要手动指定getopt的路径
cmake安装
cmake是比较常用的构建工具,并且在MSVC 2015之后就支持cmake了,下载msi安装包安装即可。
hidpp的编译
-
构建
git clone https://github.com/cvuchener/hidpp.git
mkdir build
cd build创建构建的VS工程
cmake .. -DGETOPT_INCLUDE_DIR=
/installed/x86-windows/include -DGETOPT_LIBRARY= /installed/x86-windows/lib/getopt.lib -DBUILD_SHARED_LIBS=OFF -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON -A Win32
注意手动指定getopt的路径,按照hidpp介绍中的说明关掉shared libs的开关, -A Win32 来指定编译32位应用(因为getopt是32位的!)
- 编译
cmake构建完之后,会在目录中生成VS的工程,找到hidpp.sln
来打开vs
之后执行生成解决方案来编译全部内容。
编译好之后,在<Path-to-hidpp>\build\src\tools\Debug
中找到编译好的工具。
使用hidpp工具切换MX Master 3的主机
获取鼠标设备路径
首先在powershell中切换目录到<Path-to-hidpp>\build\src\tools\Debug
运行hidpp-list-devices.exe
来获取设备地址,其中冒号前面的全部内容就是设备地址了。
BTHLEDEVICE\{00001812-0000-1000-8000-00805F9B34FB}_DEV_VID&02046D_PID&B023_REV&0015_D1758C989E14\8&315FBC5A&0&0021
切换鼠标主机的方法
按照Nestor Lopez Casado for providing Logitech documentation on the HID++ protocol中x1814_change_host.pdf中的方法,
.\hidpp20-call-function.exe "BTHLEDEVICE\{00001812-0000-1000-8000-00805F9B34FB}_DEV_VID&02046D_PID&B023_REV&0015_D1758C989E14\8&315FBC5A&0&0021" 10 1 0
其中参数10 表示change_host_feature, 1表示调用上图中的setCurrentHost
方法,0表示鼠标上的1号设备(没错设备编号是从0开始的)
使用Logitech Options把切换主机命令映射到鼠标按键
我选择设置滚轮下面的按钮为切换设备,原因是这个按钮的默认功能是切换滚轮方式,但是smartshift的体验足够好,不需要手动切换,因此就把这个按键换了。
但是经过测试这个启动应用程序并不能附加参数,因此不能把上面一大行放入这里执行。
因此在VS中写了一个简单的应用程序来调用
#include <iostream>
//不显示控制台
#pragma comment( linker, "/subsystem:windows /entry:mainCRTStartup" )
int main()
{
system("<path-to-hidpp>\\build\\src\\tools\\Debug\\hidpp20-call-function.exe \"BTHLEDEVICE\\{00001812-0000-1000-8000-00805F9B34FB}_DEV_VID&02046D_PID&B023_REV&0015_D1758C989E14\\8&315FBC5A&0&0021\" 10 1 1");
}
注意更改路径,别忘记转义特殊符号
最终生成的CallPS.exe就是执行了上面hidpp20-call-function.exe
的那一大串命令,这样就可以切换了。