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
的那一大串命令,這樣就可以切換了。