Added mouse DPI interface
This commit is contained in:
		@@ -74,6 +74,26 @@ uint32_t driver_getkey(void)
 | 
				
			|||||||
    return (VENDOR_ID << 16) | id;
 | 
					    return (VENDOR_ID << 16) | id;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					device_capacity_t driver_get_capacity(void* handle)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    libusb_device* dev = handle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct libusb_device_descriptor desc;
 | 
				
			||||||
 | 
					    libusb_get_device_descriptor(dev, &desc);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    uint8_t wireless = 0;
 | 
				
			||||||
 | 
					    switch(desc.idProduct)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        case HTX_4K_PRODUCT_ID_WIRELESS:
 | 
				
			||||||
 | 
					        case HTS_PLUS_4K_PRODUCT_ID_WIRELESS:
 | 
				
			||||||
 | 
					        case HSK_PRO_ACE_PRODUCT_ID_WIRELESS:
 | 
				
			||||||
 | 
					            wireless = 1;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return DEVICE_CAPACITY_MOUSE | wireless;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char* driver_get_name(void* handle)
 | 
					char* driver_get_name(void* handle)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    libusb_device* dev = handle;
 | 
					    libusb_device* dev = handle;
 | 
				
			||||||
@@ -119,3 +139,42 @@ char* driver_get_image(void* handle)
 | 
				
			|||||||
            return "";
 | 
					            return "";
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int driver_mouse_dpi_get(void* handle, struct MOUSE_DPI_LEVELS* output)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    libusb_device* dev = handle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Prepare usb device for transfer
 | 
				
			||||||
 | 
					    libusb_device_handle* hand;
 | 
				
			||||||
 | 
					    int openres = libusb_open(dev, &hand);
 | 
				
			||||||
 | 
					    if(openres) return -1;
 | 
				
			||||||
 | 
					    libusb_detach_kernel_driver(hand, 0x2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Send command
 | 
				
			||||||
 | 
					    struct REPORT_DPI_SETTINGS report = {0};
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    bool wireless = false;
 | 
				
			||||||
 | 
					    if(driver_get_capacity(handle) & DEVICE_CAPACITY_WIRELESS) wireless = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int res = send_command(hand, COMMAND_DPI_SETTINGS, REPORT_DPI_SETTINGS_SIZE, &report, wireless);
 | 
				
			||||||
 | 
					    if(res <= 0) return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Format 'output' packet
 | 
				
			||||||
 | 
					    output->max_level_count = 5;
 | 
				
			||||||
 | 
					    output->level_count = report.level_count;
 | 
				
			||||||
 | 
					    output->level_current = report.level_current;
 | 
				
			||||||
 | 
					    output->led_available = true;
 | 
				
			||||||
 | 
					    output->xy_available = false;
 | 
				
			||||||
 | 
					    for(size_t i = 0; i < report.level_count; i++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        output->level[i].dpi_x = report.levels[i].dpi_x_high << 8 | report.levels[i].dpi_x_low;
 | 
				
			||||||
 | 
					        output->level[i].dpi_y = report.levels[i].dpi_y_high << 8 | report.levels[i].dpi_y_low;
 | 
				
			||||||
 | 
					        output->level[i].r = report.levels[i].led_r;
 | 
				
			||||||
 | 
					        output->level[i].g = report.levels[i].led_g;
 | 
				
			||||||
 | 
					        output->level[i].b = report.levels[i].led_b;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    libusb_attach_kernel_driver(hand, 0x2);
 | 
				
			||||||
 | 
					    libusb_close(hand);
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -60,3 +60,13 @@ char* device_get_name(device_t* device)
 | 
				
			|||||||
    char* (*getname_fn)(void*) = dlsym(device->driver, "driver_get_name");
 | 
					    char* (*getname_fn)(void*) = dlsym(device->driver, "driver_get_name");
 | 
				
			||||||
    return getname_fn(device->handle);
 | 
					    return getname_fn(device->handle);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void* device_handle(device_t* device)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return device->handle;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void* device_driver(device_t* device)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return device->driver;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,6 +2,10 @@
 | 
				
			|||||||
#define DEVICE_H
 | 
					#define DEVICE_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <dlfcn.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "driver_interface.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "utils/array.h"
 | 
					#include "utils/array.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct DEVICE device_t;
 | 
					typedef struct DEVICE device_t;
 | 
				
			||||||
@@ -11,6 +15,8 @@ void device_init();
 | 
				
			|||||||
array_t* device_get_array();
 | 
					array_t* device_get_array();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Handling a single device
 | 
					// Handling a single device
 | 
				
			||||||
 | 
					void* device_handle(device_t* device);
 | 
				
			||||||
 | 
					void* device_driver(device_t* device);
 | 
				
			||||||
device_t* device_register(void* driver, void* handle);
 | 
					device_t* device_register(void* driver, void* handle);
 | 
				
			||||||
char* device_get_image(device_t* device);
 | 
					char* device_get_image(device_t* device);
 | 
				
			||||||
char* device_get_name(device_t* device);
 | 
					char* device_get_name(device_t* device);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,9 @@
 | 
				
			|||||||
#ifndef DRIVER_INTERFACE_H
 | 
					#ifndef DRIVER_INTERFACE_H
 | 
				
			||||||
#define DRIVER_INTERFACE_H
 | 
					#define DRIVER_INTERFACE_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					#include <stdbool.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef enum DEVICE_CAPACITY
 | 
					typedef enum DEVICE_CAPACITY
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    DEVICE_CAPACITY_MOUSE,
 | 
					    DEVICE_CAPACITY_MOUSE,
 | 
				
			||||||
@@ -15,6 +18,7 @@ char* driver_get_name(void* handle); // Returns peripheral name
 | 
				
			|||||||
char* driver_get_image(void* handle); // Returns peripheral image
 | 
					char* driver_get_image(void* handle); // Returns peripheral image
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Mouse drivers */
 | 
					/* Mouse drivers */
 | 
				
			||||||
 | 
					#define MAX_DPI_LEVELS 10
 | 
				
			||||||
struct MOUSE_DPI_LEVELS
 | 
					struct MOUSE_DPI_LEVELS
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    unsigned int max_level_count;
 | 
					    unsigned int max_level_count;
 | 
				
			||||||
@@ -29,8 +33,8 @@ struct MOUSE_DPI_LEVELS
 | 
				
			|||||||
        unsigned char r;
 | 
					        unsigned char r;
 | 
				
			||||||
        unsigned char g;
 | 
					        unsigned char g;
 | 
				
			||||||
        unsigned char b;
 | 
					        unsigned char b;
 | 
				
			||||||
    } level[];
 | 
					    } level[MAX_DPI_LEVELS];
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
struct MOUSE_DPI_LEVELS driver_mouse_dpi_get(void* handle);
 | 
					int driver_mouse_dpi_get(void* handle, struct MOUSE_DPI_LEVELS* output);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
@@ -39,8 +39,34 @@ mouse_panel_new(void)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void mouse_panel_set_device(MousePanel* self, device_t* device)
 | 
					void mouse_panel_set_device(MousePanel* self, device_t* device)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    // Set device image
 | 
				
			||||||
    char* image = device_get_image(device);
 | 
					    char* image = device_get_image(device);
 | 
				
			||||||
    gtk_image_set_from_file(self->mouse_image, image);
 | 
					    gtk_image_set_from_file(self->mouse_image, image);
 | 
				
			||||||
    gtk_label_set_label(self->mouse_name, device_get_name(device));
 | 
					 | 
				
			||||||
    free(image);
 | 
					    free(image);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Set device name
 | 
				
			||||||
 | 
					    gtk_label_set_label(self->mouse_name, device_get_name(device));
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // Set mouse dpi
 | 
				
			||||||
 | 
					    struct MOUSE_DPI_LEVELS dpi;
 | 
				
			||||||
 | 
					    int (*driver_mouse_dpi_get)(void*, void*) = dlsym(device_driver(device), "driver_mouse_dpi_get");
 | 
				
			||||||
 | 
					    int dpi_res = driver_mouse_dpi_get(device_handle(device), &dpi);
 | 
				
			||||||
 | 
					    if(!dpi_res)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        // Set dpi list
 | 
				
			||||||
 | 
					        for(size_t i = 0; i < dpi.level_count; i++)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            AdwPreferencesRow* row = ADW_PREFERENCES_ROW(adw_preferences_row_new());
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            // Convert dpi int to string
 | 
				
			||||||
 | 
					            char dpi_str[10];
 | 
				
			||||||
 | 
					            sprintf(dpi_str, "%u", dpi.level[i].dpi_x);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            GtkLabel* label = GTK_LABEL(gtk_label_new(dpi_str));
 | 
				
			||||||
 | 
					            gtk_widget_add_css_class(GTK_WIDGET(label), "heading");
 | 
				
			||||||
 | 
					            gtk_list_box_row_set_child(GTK_LIST_BOX_ROW(row), GTK_WIDGET(label));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            adw_preferences_group_add(self->dpi_preference_group, GTK_WIDGET(row));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user