Files
OpenRGB/qt/OpenRGBHardwareIDsDialog/OpenRGBHardwareIDsDialog.cpp

135 lines
4.8 KiB
C++

/*---------------------------------------------------------*\
| OpenRGBHardwareIDsDialog.cpp |
| |
| User interface for OpenRGB Hardware IDs dialog |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#include <QString>
#include <QClipboard>
#include <hidapi.h>
#include <libusb.h>
#include "OpenRGBHardwareIDsDialog.h"
#include "ui_OpenRGBHardwareIDsDialog.h"
#include "ResourceManager.h"
#include "StringUtils.h"
OpenRGBHardwareIDsDialog::OpenRGBHardwareIDsDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::OpenRGBHardwareIDsDialog)
{
ui->setupUi(this);
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
ui->HardwareIdsList->header()->resizeSection(0 /*column index*/, 300 /*width*/);
ui->HardwareIdsList->header()->resizeSection(1 /*column index*/, 200 /*width*/);
ui->HardwareIdsList->header()->resizeSection(2 /*column index*/, 100 /*width*/);
}
OpenRGBHardwareIDsDialog::~OpenRGBHardwareIDsDialog()
{
delete ui;
}
int OpenRGBHardwareIDsDialog::show()
{
/*-----------------------------------------------------*\
| Add I2C Buses |
\*-----------------------------------------------------*/
std::vector<i2c_smbus_info> i2c_bus_info = ResourceManager::get()->GetI2CBusInfo();
QTreeWidgetItem* i2c_top = new QTreeWidgetItem(ui->HardwareIdsList, {"I2C Buses"});
strings.push_back("[ I2C Buses ]");
for(i2c_smbus_info bus_info : i2c_bus_info)
{
char line[550];
snprintf(line, 550, "%04X:%04X %04X:%04X", bus_info.pci_vendor, bus_info.pci_device, bus_info.pci_subsystem_vendor, bus_info.pci_subsystem_device);
new QTreeWidgetItem(i2c_top, {line, bus_info.device_name});
snprintf(line, 550, "%04X:%04X %04X:%04X - %s", bus_info.pci_vendor, bus_info.pci_device, bus_info.pci_subsystem_vendor, bus_info.pci_subsystem_device, bus_info.device_name);
strings.push_back(line);
}
/*-----------------------------------------------------*\
| Add HID Devices |
\*-----------------------------------------------------*/
std::vector<HIDDeviceInfo> hid_device_info = ResourceManager::get()->GetHIDDeviceInfo();
QTreeWidgetItem* hid_top = new QTreeWidgetItem(ui->HardwareIdsList, {"HID Devices"});
strings.push_back("\n[ HID Devices ]");
for(HIDDeviceInfo device_info : hid_device_info)
{
char line[550];
snprintf(line, 550, "[%04X:%04X U=%04X P=0x%04X I=%d]", device_info.vendor_id, device_info.product_id, device_info.usage, device_info.usage_page, device_info.interface_number);
new QTreeWidgetItem(hid_top, {line, QString::fromStdString(device_info.product_string), QString::fromStdString(device_info.manufacturer_string)});
snprintf(line, 550, "[%04X:%04X U=%04X P=0x%04X I=%d] %s - %s", device_info.vendor_id, device_info.product_id, device_info.usage, device_info.usage_page, device_info.interface_number, device_info.manufacturer_string.c_str(), device_info.product_string.c_str());
strings.push_back(line);
}
/*-----------------------------------------------------*\
| Add USB Devices |
\*-----------------------------------------------------*/
libusb_device** devices = nullptr;
QTreeWidgetItem* libusb_top = new QTreeWidgetItem(ui->HardwareIdsList, {"USB devices"});
strings.push_back("\n[ USB devices ]");
int ret;
ret = libusb_init(NULL);
if(ret < 0)
{
return 0;
}
ret = libusb_get_device_list(NULL, &devices);
if(ret < 0)
{
return 0;
}
int deviceCount = ret;
for(int i = 0; i < deviceCount; i++)
{
libusb_device* device = devices[i];
libusb_device_descriptor descriptor;
ret = libusb_get_device_descriptor(device, &descriptor);
if(ret < 0)
{
continue;
}
char line[512];
snprintf(line, 512, "%04X:%04X", descriptor.idVendor, descriptor.idProduct);
new QTreeWidgetItem(libusb_top, {line});
strings.push_back(line);
}
if(devices != nullptr)
{
libusb_free_device_list(devices, 1);
}
i2c_top->setExpanded(true);
hid_top->setExpanded(true);
libusb_top->setExpanded(true);
return this->exec();
}
void OpenRGBHardwareIDsDialog::on_CopyToClipboardButton_clicked()
{
QClipboard *clipboard = QGuiApplication::clipboard();
clipboard->setText(strings.join("\n"));
}