98 lines
3.1 KiB
Go
98 lines
3.1 KiB
Go
package utils
|
||
|
||
import (
|
||
"fmt"
|
||
|
||
"github.com/progrium/darwinkit/macos/appkit"
|
||
)
|
||
|
||
// --- 硬件识别常量 ---
|
||
|
||
// RAZER_VID (Vendor ID) 是雷蛇在 USB 协会注册的厂商唯一识别码
|
||
const RAZER_VID = 0x1532
|
||
|
||
// RAZER_DEVICES 将产品 ID (PID) 映射到具体的设备型号名称
|
||
var RAZER_DEVICES = map[uint16]string{
|
||
0x0A24: "雷蛇猎魂光轮 V3 竞技版 (BlackWidow V3 TKL)",
|
||
0x0013: "Razer Orochi 2011 (八岐大蛇)",
|
||
}
|
||
|
||
// RAZER_DEVICE_TYPES 定义设备的分类,用于后续逻辑区分键盘或鼠标
|
||
var RAZER_DEVICE_TYPES = map[uint16]string{
|
||
0x0A24: "keyboard",
|
||
0x0013: "mouse",
|
||
}
|
||
|
||
// RAZER_TRANSACTION_IDS 事务 ID:用于协议握手,确保指令被正确识别
|
||
var RAZER_TRANSACTION_IDS = map[uint16]uint8{
|
||
0x0A24: 0x1F,
|
||
0x0013: 0xFF,
|
||
}
|
||
|
||
// --- 协议报文配置 ---
|
||
|
||
// REPORT_LEN 定义了发送给 USB 设备的标准报文长度(通常为 90 字节)
|
||
const REPORT_LEN = 90
|
||
|
||
// VARSTORE 指向设备的非易失性存储区域,用于断电后保存配置
|
||
const VARSTORE = 0x01
|
||
|
||
// --- 灯效模式常量 (鼠标) ---
|
||
|
||
const MOUSE_EFFECT_STATIC = 0x01 // 鼠标:常亮模式
|
||
const MOUSE_EFFECT_BREATHING = 0x02 // 鼠标:呼吸模式
|
||
const MOUSE_EFFECT_WAVE = 0x03 // 鼠标:波浪模式
|
||
const MOUSE_EFFECT_REACTIVE = 0x04 // 鼠标:响应模式(点击触发)
|
||
|
||
// --- 灯效模式常量 (键盘) ---
|
||
|
||
const KBD_EFFECT_STATIC = 0x01 // 键盘:常亮模式
|
||
const KBD_EFFECT_BREATHING = 0x02 // 键盘:呼吸模式
|
||
const KBD_EFFECT_WAVE = 0x03 // 键盘:波浪模式
|
||
const KBD_EFFECT_REACTIVE = 0x04 // 键盘:响应模式
|
||
|
||
const KBD_EFFECT_OFFLIGHTS = 0x099 // 键盘:关灯模式
|
||
|
||
// --- 指令集参数 (鼠标) ---
|
||
|
||
const MOUSE_SCROLL_WHEEL_LED = 0x01 // 鼠标滚轮灯光控制索引
|
||
const MOUSE_CMD_CLASS = 0x0F // 鼠标指令分类 (Command Class)
|
||
const MOUSE_CMD_ID = 0x02 // 鼠标指令标识 (Command ID)
|
||
const MOUSE_DATA_SIZE = 9 // 鼠标数据包的有效负载长度
|
||
|
||
// --- 指令集参数 (键盘) ---
|
||
|
||
const KBD_BACKLIGHT_LED = 0x05 // 键盘背光灯光控制索引
|
||
const KBD_CMD_CLASS = 0x0F // 键盘指令分类 (Command Class)
|
||
const KBD_CMD_ID = 0x02 // 键盘指令标识 (Command ID)
|
||
const KBD_DATA_SIZE = 9 // 键盘数据包的有效负载长度
|
||
|
||
// 全局变量,追踪当前色盘控制的设备
|
||
var (
|
||
activeDeviceKey string
|
||
colorPanel appkit.ColorPanel
|
||
)
|
||
|
||
func initColorPanel() {
|
||
// 修复:unsafe.Pointer 与 nil 比较
|
||
if colorPanel.Ptr() == nil {
|
||
colorPanel = appkit.ColorPanel_SharedColorPanel()
|
||
colorPanel.SetContinuous(true)
|
||
}
|
||
}
|
||
|
||
func openColorPicker() {
|
||
// 1. 获取共享的色盘实例(推荐做法)
|
||
colorPanel := appkit.ColorPanel_SharedColorPanel()
|
||
|
||
// 2. 配置 Target/Action (可选)
|
||
// 注意:在 Go 中处理 Selector 回调比较复杂,通常需要注册一个特定的 Class
|
||
|
||
// 3. 激活应用并显示色盘
|
||
// 如果你的程序不是 GUI 模式,色盘可能会隐藏在其他窗口后面
|
||
appkit.Application_SharedApplication().ActivateIgnoringOtherApps(true)
|
||
colorPanel.MakeKeyAndOrderFront(nil)
|
||
|
||
fmt.Println("Color Picker 已经尝试打开")
|
||
}
|