From 5ac3d5f535a7fc4f7dd089695a173340a83c5983 Mon Sep 17 00:00:00 2001
From: Luke Horwell <code@horwell.me>
Date: Fri, 23 Oct 2020 18:27:13 +0100
Subject: [PATCH] daemon: fix misconfigured matrix capabilities

Devices were throwing an exception that was:
- "embedded null byte"
- or "setCustom is not a valid method of interface"

This was due to devices missing a sysfs file in the driver. Or rather,
they had one (matrix_effect_custom), but was incorrectly specified here.

For devices that are missing a sysfs file, it's possible custom frames
are unsupported or was simply left out in the driver when the device was
added. Users of these devices should try amending their device in the
driver, as we don't have the hardware to check.

Fixes #1252
Addresses polychromatic/polychromatic#266
---
 daemon/openrazer_daemon/hardware/keyboards.py | 13 +++----------
 daemon/openrazer_daemon/hardware/mouse.py     |  5 ++++-
 daemon/openrazer_daemon/hardware/mouse_mat.py |  7 +++----
 3 files changed, 10 insertions(+), 15 deletions(-)

diff --git a/daemon/openrazer_daemon/hardware/keyboards.py b/daemon/openrazer_daemon/hardware/keyboards.py
index 663e1c71..a47a2431 100644
--- a/daemon/openrazer_daemon/hardware/keyboards.py
+++ b/daemon/openrazer_daemon/hardware/keyboards.py
@@ -744,13 +744,10 @@ class RazerBlackWidowLite(_RippleKeyboard):
 
     USB_VID = 0x1532
     USB_PID = 0x0235
-    HAS_MATRIX = True
-    MATRIX_DIMS = [6, 22]
     METHODS = ['get_device_type_keyboard', 'set_static_effect',
                'set_none_effect', 'set_breath_single_effect',
-               'set_key_row', 'get_game_mode', 'set_game_mode', 'get_macro_mode', 'set_macro_mode',
-               'get_macro_effect', 'set_macro_effect', 'get_macros', 'delete_macro', 'add_macro',
-               ]
+               'get_game_mode', 'set_game_mode', 'get_macro_mode', 'set_macro_mode',
+               'get_macro_effect', 'set_macro_effect', 'get_macros', 'delete_macro', 'add_macro']
 
     DEVICE_IMAGE = "https://assets.razerzone.com/eeimages/support/products/1456/1456_blackwidowlite_-_2.png"
 
@@ -786,7 +783,7 @@ class RazerBlackWidowEssential(_RippleKeyboard):
     HAS_MATRIX = True
     MATRIX_DIMS = [6, 22]
     METHODS = ['get_device_type_keyboard', 'set_static_effect', 'set_none_effect',
-               'set_breath_single_effect', 'set_key_row', 'get_game_mode',
+               'set_breath_single_effect', 'set_key_row', 'set_custom_effect', 'get_game_mode',
                'set_game_mode', 'get_macro_mode', 'set_macro_mode', 'get_macro_effect',
                'set_macro_effect', 'get_macros', 'delete_macro', 'add_macro']
 
@@ -1002,8 +999,6 @@ class RazerBlade2018Base(_RippleKeyboard):
 
     USB_VID = 0x1532
     USB_PID = 0x023B
-    HAS_MATRIX = True
-    MATRIX_DIMS = [6, 16]
     METHODS = ['get_device_type_keyboard', 'set_static_effect', 'set_spectrum_effect',
                'set_none_effect', 'set_breath_random_effect', 'set_breath_single_effect']
 
@@ -1018,8 +1013,6 @@ class RazerBladeStealth2019(_RippleKeyboard):
 
     USB_VID = 0x1532
     USB_PID = 0x0239
-    HAS_MATRIX = True
-    MATRIX_DIMS = [6, 16]
     METHODS = ['get_device_type_keyboard', 'set_static_effect', 'set_spectrum_effect',
                'set_none_effect', 'set_breath_random_effect', 'set_breath_single_effect']
 
diff --git a/daemon/openrazer_daemon/hardware/mouse.py b/daemon/openrazer_daemon/hardware/mouse.py
index 9d9d8873..d6514e9c 100644
--- a/daemon/openrazer_daemon/hardware/mouse.py
+++ b/daemon/openrazer_daemon/hardware/mouse.py
@@ -941,7 +941,7 @@ class RazerNagaTrinity(__RazerDeviceSpecialBrightnessSuspend):
 
     USB_VID = 0x1532
     USB_PID = 0x0067
-    HAS_MATRIX = True
+    HAS_MATRIX = False  # TODO Device supports matrix, driver missing
     DEDICATED_MACRO_KEYS = True
     MATRIX_DIMS = [1, 3]
     METHODS = ['get_device_type_mouse', 'get_dpi_xy', 'set_dpi_xy', 'get_poll_rate', 'set_poll_rate',
@@ -1682,6 +1682,7 @@ class RazerViperUltimateWired(__RazerDeviceSpecialBrightnessSuspend):
 
     USB_VID = 0x1532
     USB_PID = 0x007A
+    HAS_MATRIX = False  # TODO device probably has matrix support
     METHODS = ['get_device_type_mouse', 'max_dpi', 'get_dpi_xy', 'set_dpi_xy', 'get_poll_rate', 'set_poll_rate', 'get_logo_brightness', 'set_logo_brightness',
                # Battery
                'get_battery', 'is_charging', 'set_idle_time', 'set_low_battery_threshold',
@@ -1752,6 +1753,8 @@ class RazerViper(__RazerDeviceSpecialBrightnessSuspend):
 
     USB_VID = 0x1532
     USB_PID = 0x0078
+    HAS_MATRIX = False  # TODO Device should have matrix support
+    MATRIX_DIMS = [1, 1]
     METHODS = ['get_device_type_mouse', 'max_dpi', 'get_dpi_xy', 'set_dpi_xy', 'get_poll_rate', 'set_poll_rate', 'get_logo_brightness', 'set_logo_brightness',
                # Logo
                'set_logo_static_naga_hex_v2', 'set_logo_spectrum_naga_hex_v2', 'set_logo_none_naga_hex_v2', 'set_logo_reactive_naga_hex_v2',
diff --git a/daemon/openrazer_daemon/hardware/mouse_mat.py b/daemon/openrazer_daemon/hardware/mouse_mat.py
index 1a0a9fe8..bebaa262 100644
--- a/daemon/openrazer_daemon/hardware/mouse_mat.py
+++ b/daemon/openrazer_daemon/hardware/mouse_mat.py
@@ -26,10 +26,9 @@ class RazerFireflyHyperflux(__RazerDeviceBrightnessSuspend):
     USB_VID = 0x1532
     USB_PID = 0x0068
     HAS_MATRIX = True
-    MATRIX_DIMS = [1, 1]
-    METHODS = ['get_device_type_mousemat', 'set_static_effect', 'set_spectrum_effect',
-               'set_none_effect', 'set_breath_random_effect', 'set_breath_single_effect', 'set_breath_dual_effect',
-               'set_key_row']
+    MATRIX_DIMS = [1, 17]
+    METHODS = ['get_device_type_mousemat', 'set_static_effect', 'set_spectrum_effect', 'set_key_row', 'set_custom_effect',
+               'set_none_effect', 'set_breath_random_effect', 'set_breath_single_effect', 'set_breath_dual_effect']
 
     DEVICE_IMAGE = "https://assets.razerzone.com/eeimages/support/products/594/594_firefly_500x500.png"
 
-- 
GitLab