File add-MM731-rebased.patch of Package OpenRGB-git-qt6

 .../CoolerMasterController/CMMM731Controller.cpp   | 209 +++++++++++++++++++++
 .../CoolerMasterController/CMMM731Controller.h     | 101 ++++++++++
 .../CoolerMasterControllerDetect.cpp               |  20 ++
 .../RGBController_CMMM731Controller.cpp            | 187 ++++++++++++++++++
 .../RGBController_CMMM731Controller.h              |  40 ++++
 5 files changed, 557 insertions(+)

diff --git OpenRGBc/Controllers/CoolerMasterController/CMMM731Controller.cpp OpenRGBc/Controllers/CoolerMasterController/CMMM731Controller.cpp
new file mode 100644
index 0000000..844a55b
--- /dev/null
+++ OpenRGBc/Controllers/CoolerMasterController/CMMM731Controller.cpp
@@ -0,0 +1,209 @@
+/*-------------------------------------------------------------------*\
+| CMMM731Controller.cpp                                               |
+|                                                                     |
+|   Driver for the Cooler Master MM731 Mouse                          |
+|                                                                     |
+|   Chris M (Dr_No)                              1 Jan 2022           |
+|                                                                     |
+|   This file is part of the OpenRGB project                          |
+|   SPDX-License-Identifier: GPL-2.0-only                             |
+\*-------------------------------------------------------------------*/
+
+#include <cstring>
+#include "CMMM731Controller.h"
+#include "StringUtils.h"
+
+CMMM731Controller::CMMM731Controller(hid_device* dev_handle, char *_path)
+{
+    dev                 = dev_handle;
+    location            = _path;
+    current_speed       = CM_MM731_SPEED_NORMAL;
+
+    /*---------------------------------------------------------*\
+    | Get device name from HID manufacturer and product strings |
+    \*---------------------------------------------------------*/
+    wchar_t name_string[HID_MAX_STR];
+
+    hid_get_manufacturer_string(dev, name_string, HID_MAX_STR);
+    device_name = StringUtils::wstring_to_string(name_string);
+
+    hid_get_product_string(dev, name_string, HID_MAX_STR);
+    device_name.append(" ").append(StringUtils::wstring_to_string(name_string));
+
+    hid_get_indexed_string(dev, 2, name_string, HID_MAX_STR);
+    serial = StringUtils::wstring_to_string(name_string);
+
+    SendInitPacket();
+}
+
+CMMM731Controller::~CMMM731Controller()
+{
+    hid_close(dev);
+}
+
+/*void CMMM731Controller::GetColourStatus()
+{
+    uint8_t buffer[CM_MM731_PACKET_SIZE]    = { 0x00, 0x52, 0x2B };
+
+    hid_write(dev, buffer, CM_MM731_PACKET_SIZE);
+    hid_read_timeout(dev, buffer, CM_MM731_PACKET_SIZE, CM_MM731_INTERRUPT_TIMEOUT);
+
+    current_brightness      = buffer[CM_MM731_BRIGHTNESS_BYTE - 1];
+    current_red             = buffer[CM_MM731_RED_BYTE - 1];
+    current_green           = buffer[CM_MM731_GREEN_BYTE - 1];
+    current_blue            = buffer[CM_MM731_BLUE_BYTE - 1];
+}*/
+
+/*void CMMM731Controller::GetCustomStatus()
+{
+    uint8_t buffer[CM_MM731_PACKET_SIZE]    = { 0x00, 0x52, 0xA8 };
+    int read_size                           = CM_MM731_PACKET_SIZE - 1;
+    int result                              = 0;
+
+    hid_write(dev, buffer, CM_MM711_PACKET_SIZE);
+    do
+    {
+        result = hid_read_timeout(dev, buffer, read_size, CM_MM731_INTERRUPT_TIMEOUT);
+    }while(buffer[1] != 0xA8 && result == read_size);
+
+    if(result == read_size)
+    {
+        wheel_colour            = ToRGBColor(buffer[4], buffer[5], buffer[6]);
+        logo_colour             = ToRGBColor(buffer[7], buffer[8], buffer[9]);
+    }
+}*/
+
+std::string CMMM731Controller::GetDeviceName()
+{
+    return device_name;
+}
+
+std::string CMMM731Controller::GetSerial()
+{
+    return(serial);
+}
+
+std::string CMMM731Controller::GetLocation()
+{
+    return("HID: " + location);
+}
+
+uint8_t CMMM731Controller::GetMode()
+{
+    return(current_mode);
+}
+
+uint8_t CMMM731Controller::GetLedRed()
+{
+    return(current_red);
+}
+
+uint8_t CMMM731Controller::GetLedGreen()
+{
+    return(current_green);
+}
+
+uint8_t CMMM731Controller::GetLedBlue()
+{
+    return(current_blue);
+}
+
+uint8_t CMMM731Controller::GetLedSpeed()
+{
+    return(current_speed);
+}
+
+uint8_t CMMM731Controller::GetBrightness()
+{
+    return(current_brightness);
+}
+
+bool CMMM731Controller::GetRandomColours()
+{
+    return(bool_random);
+}
+
+void CMMM731Controller::SetMode(uint8_t mode, uint8_t speed, uint8_t brightness, RGBColor colour, bool random_colours)
+{
+    bool needs_update       = !( (current_mode == mode) && (current_speed == speed) && (current_brightness == brightness) && (ToRGBColor(current_red, current_green, current_blue) == colour));
+
+    if (needs_update)
+    {
+        current_mode        = mode;
+        current_speed       = speed;
+        current_brightness  = brightness;
+        current_red         = RGBGetRValue(colour);
+        current_green       = RGBGetGValue(colour);
+        current_blue        = RGBGetBValue(colour);
+        bool_random         = random_colours;
+        SendUpdate();
+    }
+}
+
+void  CMMM731Controller::SetLedsDirect(RGBColor logo_colour)
+{
+    uint8_t buffer[CM_MM731_PACKET_SIZE]    = { 0x00, 0x4C, 0x81, 0x04, CM_MM731_MODE_STATIC, CM_MM731_BRIGHTNESS_MAX, CM_MM731_BRIGHTNESS_MAX, CM_MM731_SPEED_NORMAL };
+
+    buffer[CM_MM731_RED_BYTE]               = RGBGetRValue(logo_colour);
+    buffer[CM_MM731_GREEN_BYTE]             = RGBGetGValue(logo_colour);
+    buffer[CM_MM731_BLUE_BYTE]              = RGBGetBValue(logo_colour);
+    buffer[CM_MM731_NFI_2]                  = CM_MM731_BRIGHTNESS_MAX;
+
+    hid_write(dev, buffer, CM_MM731_PACKET_SIZE);
+    hid_read_timeout(dev, buffer, CM_MM731_PACKET_SIZE, CM_MM731_INTERRUPT_TIMEOUT);
+}
+
+void CMMM731Controller::GetStatus()
+{
+    uint8_t buffer[CM_MM731_PACKET_SIZE]    = { 0x00, 0x52, 0x28 };
+
+    hid_write(dev, buffer, CM_MM731_PACKET_SIZE);
+    hid_read_timeout(dev, buffer, CM_MM731_PACKET_SIZE, CM_MM731_INTERRUPT_TIMEOUT);
+
+    current_mode                            = buffer[CM_MM731_MODE_BYTE - 1];
+}
+
+void CMMM731Controller::SendUpdate()
+{
+    uint8_t buffer[CM_MM731_PACKET_SIZE]    = { 0x00, 0x4C, 0x81, 0x04 };
+
+    buffer[CM_MM731_MODE_BYTE]              = current_mode;
+    buffer[CM_MM731_NFI_1]                  = CM_MM731_BRIGHTNESS_MAX;
+    buffer[CM_MM731_BRIGHTNESS_BYTE]        = current_brightness;
+    buffer[CM_MM731_SPEED_BYTE]             = current_speed;
+    buffer[CM_MM731_RED_BYTE]               = current_red;
+    buffer[CM_MM731_GREEN_BYTE]             = current_green;
+    buffer[CM_MM731_BLUE_BYTE]              = current_blue;
+    buffer[CM_MM731_NFI_2]                  = CM_MM731_BRIGHTNESS_MAX;
+
+    hid_write(dev, buffer, CM_MM731_PACKET_SIZE);
+    hid_read_timeout(dev, buffer, CM_MM731_PACKET_SIZE, CM_MM731_INTERRUPT_TIMEOUT);
+
+    SendApplyPacket();
+}
+
+void CMMM731Controller::SendApplyPacket()
+{
+    uint8_t buffer[CM_MM731_PACKET_SIZE]    = { 0x00, 0x4C, 0x81, 0x08, current_mode };
+
+    hid_write(dev, buffer, CM_MM731_PACKET_SIZE);
+    hid_read_timeout(dev, buffer, CM_MM731_PACKET_SIZE, CM_MM731_INTERRUPT_TIMEOUT);
+}
+
+void CMMM731Controller::SendInitPacket()
+{
+    uint8_t buffer[CM_MM731_PACKET_SIZE]    = { 0x00, 0x44, 0x81, 0x02 };
+
+    hid_write(dev, buffer, CM_MM731_PACKET_SIZE);
+    hid_read_timeout(dev, buffer, CM_MM731_PACKET_SIZE, CM_MM731_INTERRUPT_TIMEOUT);
+
+}
+
+void CMMM731Controller::SendSavePacket()
+{
+    uint8_t buffer[CM_MM731_PACKET_SIZE]    = { 0x00, 0x54, 0x81, 0x01 };
+
+    hid_write(dev, buffer, CM_MM731_PACKET_SIZE);
+    hid_read_timeout(dev, buffer, CM_MM731_PACKET_SIZE, CM_MM731_INTERRUPT_TIMEOUT);
+}
+
diff --git OpenRGBc/Controllers/CoolerMasterController/CMMM731Controller.h OpenRGBc/Controllers/CoolerMasterController/CMMM731Controller.h
new file mode 100644
index 0000000..7a43b46
--- /dev/null
+++ OpenRGBc/Controllers/CoolerMasterController/CMMM731Controller.h
@@ -0,0 +1,101 @@
+/*-------------------------------------------------------------------*\
+| CMMM731Controller.h                                                 |
+|                                                                     |
+|   Driver for the Cooler Master MM731 Mouse                          |
+|                                                                     |
+|   Chris M (Dr_No)                              1 Jan 2022           |
+|                                                                     |
+|   This file is part of the OpenRGB project                          |
+|   SPDX-License-Identifier: GPL-2.0-only                             |
+\*-------------------------------------------------------------------*/
+
+#include <string>
+#include <hidapi.h>
+#include "RGBController.h"
+
+#pragma once
+
+#define CM_MM731_INTERRUPT_TIMEOUT  250
+#define CM_MM731_PACKET_SIZE        65
+#define CM_MM731_BRIGHTNESS_MIN     0
+#define CM_MM731_BRIGHTNESS_MAX     255
+#define HID_MAX_STR 255
+
+enum
+{
+    CM_MM731_MODE_STATIC            = 0x00, //Static Mode - Set entire zone to a single color.
+    CM_MM731_MODE_BREATHING         = 0x01, //Breathing Mode - Fades between fully off and fully on.
+    CM_MM731_MODE_SPECTRUM          = 0x02, //Spectrum Cycle Mode - Cycles through the color spectrum on all lights on the device
+    CM_MM731_MODE_OFF               = 0x03, //Turn off - All leds off
+};
+
+enum
+{
+    CM_MM731_REPORT_BYTE            = 1,
+    CM_MM731_COMMAND_BYTE           = 2,
+    CM_MM731_FUNCTION_BYTE          = 3,
+    CM_MM731_MODE_BYTE              = 4,
+    CM_MM731_NFI_1                  = 5,
+    CM_MM731_BRIGHTNESS_BYTE        = 6,
+    CM_MM731_SPEED_BYTE             = 7,
+    CM_MM731_RED_BYTE               = 8,
+    CM_MM731_GREEN_BYTE             = 9,
+    CM_MM731_BLUE_BYTE              = 10,
+    CM_MM731_NFI_2                  = 11,
+};
+
+enum
+{
+    CM_MM731_SPEED_SLOWEST          = 0x00, // Slowest speed
+    CM_MM731_SPEED_SLOW             = 0x01, // Slower speed
+    CM_MM731_SPEED_NORMAL           = 0x02, // Normal speed
+    CM_MM731_SPEED_FAST             = 0x03, // Fast speed
+    CM_MM731_SPEED_FASTEST          = 0x04, // Fastest speed
+};
+
+class CMMM731Controller
+{
+public:
+    CMMM731Controller(hid_device* dev_handle, char *_path);
+    ~CMMM731Controller();
+
+    std::string     GetDeviceName();
+    std::string     GetSerial();
+    std::string     GetLocation();
+
+    uint8_t         GetMode();
+    uint8_t         GetLedSpeed();
+
+    uint8_t         GetLedRed();
+    uint8_t         GetLedGreen();
+    uint8_t         GetLedBlue();
+    uint8_t         GetBrightness();
+    bool            GetRandomColours();
+
+    void            SetMode(uint8_t mode, uint8_t speed, uint8_t brightness, RGBColor colour, bool random_colours);
+    void            SetLedsDirect(RGBColor logo_colour);
+    void            SendSavePacket();
+private:
+    std::string     device_name;
+    std::string     serial;
+    std::string     location;
+    hid_device*     dev;
+
+    uint8_t         zone_index;
+    uint8_t         current_mode;
+    uint8_t         current_speed;
+
+    uint8_t         current_red;
+    uint8_t         current_green;
+    uint8_t         current_blue;
+    uint8_t         current_brightness;
+    bool            bool_random;
+
+    void            GetStatus();
+    void            SendUpdate();
+
+    //void        GetColourStatus();
+    //void        GetCustomStatus();
+    void            SendInitPacket();
+    void            SendApplyPacket();
+};
diff --git OpenRGB/Controllers/CoolerMasterController/CoolerMasterControllerDetect.cpp OpenRGBc/Controllers/CoolerMasterController/CoolerMasterControllerDetect.cpp
index f9c9813..2aa4174 100644
--- OpenRGB/Controllers/CoolerMasterController/CoolerMasterControllerDetect.cpp
+++ OpenRGBc/Controllers/CoolerMasterController/CoolerMasterControllerDetect.cpp
@@ -20,6 +20,7 @@
 #include "RGBController_CMMMController.h"
 #include "RGBController_CMMM711Controller.h"
 #include "RGBController_CMMM712Controller.h"
+#include "RGBController_CMMM731Controller.h"
 #include "RGBController_CMMP750Controller.h"
 #include "RGBController_CMARGBController.h"
 #include "RGBController_CMSmallARGBController.h"
@@ -63,6 +64,9 @@
 #define COOLERMASTER_MM712_PID                      0x0169
 #define COOLERMASTER_MM720_PID                      0x0141
 #define COOLERMASTER_MM730_PID                      0x0165
+#define COOLERMASTER_MM731_WIRED_PID                0x0167
+#define COOLERMASTER_MM731_WIRELESS_PID             0x0171
+#define COOLERMASTER_MM731_WIRELESS_R2_PID          0x01B7
 
 /*-----------------------------------------------------*\
 | Coolermaster Mousemats                                |
@@ -243,6 +247,19 @@ void DetectCoolerMasterMouse712(hid_device_info* info, const std::string& /*name
     }
 }
 
+void DetectCoolerMasterMouse731(hid_device_info* info, const std::string& /*name*/)
+{
+    hid_device* dev = hid_open_path(info->path);
+
+    if(dev)
+    {
+        CMMM731Controller*               controller     = new CMMM731Controller(dev, info->path);
+        RGBController_CMMM731Controller* rgb_controller = new RGBController_CMMM731Controller(controller);
+        // Constructor sets the name
+        ResourceManager::get()->RegisterRGBController(rgb_controller);
+    }
+}
+
 void DetectCoolerMasterMousemats(hid_device_info* info, const std::string& /*name*/)
 {
     hid_device* dev = hid_open_path(info->path);
@@ -337,6 +354,9 @@ REGISTER_HID_DETECTOR_IPU("Cooler Master MM711",                    DetectCooler
 REGISTER_HID_DETECTOR_IPU("Cooler Master MM712",                    DetectCoolerMasterMouse712,     COOLERMASTER_VID,   COOLERMASTER_MM712_PID,                     3,      0xFF0A, 2);
 REGISTER_HID_DETECTOR_IPU("Cooler Master MM720",                    DetectCoolerMasterMouse,        COOLERMASTER_VID,   COOLERMASTER_MM720_PID,                     1,      0xFF00, 1);
 REGISTER_HID_DETECTOR_IPU("Cooler Master MM730",                    DetectCoolerMasterMouse,        COOLERMASTER_VID,   COOLERMASTER_MM730_PID,                     1,      0xFF00, 1);
+REGISTER_HID_DETECTOR_IPU("Cooler Master MM731 (Wired)",            DetectCoolerMasterMouse731,     COOLERMASTER_VID,   COOLERMASTER_MM731_WIRED_PID,               3,      0xFF0A, 1);
+REGISTER_HID_DETECTOR_IPU("Cooler Master MM731 (Wireless)",         DetectCoolerMasterMouse731,     COOLERMASTER_VID,   COOLERMASTER_MM731_WIRELESS_PID,            3,      0xFF0A, 1);
+REGISTER_HID_DETECTOR_IPU("Cooler Master MM731 (Wireless)",         DetectCoolerMasterMouse731,     COOLERMASTER_VID,   COOLERMASTER_MM731_WIRELESS_R2_PID,         3,      0xFF0A, 1);
 
 /*-----------------------------------------------------*\
 | Coolermaster Mousemats                                |
diff --git OpenRGBc/Controllers/CoolerMasterController/RGBController_CMMM731Controller.cpp OpenRGBc/Controllers/CoolerMasterController/RGBController_CMMM731Controller.cpp
new file mode 100644
index 0000000..146e7cc
--- /dev/null
+++ OpenRGBc/Controllers/CoolerMasterController/RGBController_CMMM731Controller.cpp
@@ -0,0 +1,187 @@
+/*-------------------------------------------------------------------*\
+| RGBController_CMMM731Controller.cpp                                 |
+|                                                                     |
+|   Driver for the Cooler Master MM731 Mouse                          |
+|                                                                     |
+|   Chris M (Dr_No)                              1 Jan 2022           |
+|                                                                     |
+|   This file is part of the OpenRGB project                          |
+|   SPDX-License-Identifier: GPL-2.0-only                             |
+\*-------------------------------------------------------------------*/
+
+#include "RGBController_CMMM731Controller.h"
+
+/**------------------------------------------------------------------*\
+    @name Coolermaster Master Mouse 731
+    @category Mouse
+    @type USB
+    @save :white_check_mark:
+    @direct :white_check_mark:
+    @effects :white_check_mark:
+    @detectors DetectCoolerMasterMouse
+    @comment
+\*-------------------------------------------------------------------*/
+
+RGBController_CMMM731Controller::RGBController_CMMM731Controller(CMMM731Controller *controller_ptr)
+{
+    controller                  = controller_ptr;
+    uint8_t speed               = controller->GetLedSpeed();
+
+    name                        = controller->GetDeviceName();
+    vendor                      = "Cooler Master";
+    type                        = DEVICE_TYPE_MOUSE;
+    description                 = controller->GetDeviceName();
+    version                     = "1.0";
+    serial                      = controller->GetSerial();
+    location                    = controller->GetLocation();
+
+    mode Direct;
+    Direct.name                 = "Direct";
+    Direct.value                = CM_MM731_MODE_STATIC; //Direct is Static that does not send a save packet
+    Direct.flags                = MODE_FLAG_HAS_PER_LED_COLOR;
+    Direct.color_mode           = MODE_COLORS_PER_LED;
+    modes.push_back(Direct);
+
+    mode Static;
+    Static.name                 = "Static";
+    Static.value                = CM_MM731_MODE_STATIC;
+    Static.flags                = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_MANUAL_SAVE;
+    Static.colors_min           = 1;
+    Static.colors_max           = 1;
+    Static.colors.resize(Static.colors_max);
+    Static.brightness_min       = CM_MM731_BRIGHTNESS_MIN;
+    Static.brightness_max       = CM_MM731_BRIGHTNESS_MAX;
+    Static.brightness           = CM_MM731_BRIGHTNESS_MAX;
+    Static.speed_min            = CM_MM731_SPEED_SLOWEST;
+    Static.speed_max            = CM_MM731_SPEED_FASTEST;
+    Static.color_mode           = MODE_COLORS_MODE_SPECIFIC;
+    Static.speed                = speed;
+    modes.push_back(Static);
+
+    mode Breathing;
+    Breathing.name              = "Breathing";
+    Breathing.value             = CM_MM731_MODE_BREATHING;
+    Breathing.flags             = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_MANUAL_SAVE;
+    Breathing.colors_min        = 1;
+    Breathing.colors_max        = 1;
+    Breathing.colors.resize(Breathing.colors_max);
+    Breathing.brightness_min    = CM_MM731_BRIGHTNESS_MIN;
+    Breathing.brightness_max    = CM_MM731_BRIGHTNESS_MAX;
+    Breathing.brightness        = CM_MM731_BRIGHTNESS_MAX;
+    Breathing.speed_min         = CM_MM731_SPEED_SLOWEST;
+    Breathing.speed_max         = CM_MM731_SPEED_FASTEST;
+    Breathing.color_mode        = MODE_COLORS_MODE_SPECIFIC;
+    Breathing.speed             = speed;
+    modes.push_back(Breathing);
+
+
+    mode Spectrum;
+    Spectrum.name               = "Spectrum";
+    Spectrum.value              = CM_MM731_MODE_SPECTRUM;
+    Spectrum.flags              = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_MANUAL_SAVE;
+    Spectrum.brightness_min     = CM_MM731_BRIGHTNESS_MIN;
+    Spectrum.brightness_max     = CM_MM731_BRIGHTNESS_MAX;
+    Spectrum.brightness         = CM_MM731_BRIGHTNESS_MAX;
+    Spectrum.speed_min          = CM_MM731_SPEED_SLOWEST;
+    Spectrum.speed_max          = CM_MM731_SPEED_FASTEST;
+    Spectrum.color_mode         = MODE_COLORS_NONE;
+    Spectrum.speed              = speed;
+    modes.push_back(Spectrum);
+
+    mode Off;
+    Off.name                    = "Turn Off";
+    Off.value                   = CM_MM731_MODE_OFF;
+    Off.flags                   = MODE_FLAG_MANUAL_SAVE;
+    Off.color_mode              = MODE_COLORS_NONE;
+    modes.push_back(Off);
+
+    Init_Controller();
+    SetupZones();
+
+    /*int temp_mode               = controller->GetMode();
+    for(std::size_t mode_idx = 0; mode_idx < modes.size() ; mode_idx++)
+    {
+        if (temp_mode == modes[mode_idx].value)
+        {
+            active_mode = mode_idx;
+            break;
+        }
+    }
+    if (modes[active_mode].flags & MODE_FLAG_HAS_MODE_SPECIFIC_COLOR)
+    {
+        modes[active_mode].colors[0] = ToRGBColor(cmargb->GetLedRed(), cmargb->GetLedGreen(), cmargb->GetLedBlue());
+        modes[active_mode].color_mode = (cmargb->GetRandomColours()) ? MODE_COLORS_RANDOM : MODE_COLORS_MODE_SPECIFIC;
+    }
+    if (modes[active_mode].flags & MODE_FLAG_HAS_SPEED)
+    {
+        modes[active_mode].speed = cmargb->GetLedSpeed();
+    }*/
+}
+
+RGBController_CMMM731Controller::~RGBController_CMMM731Controller()
+{
+    delete controller;
+}
+
+void RGBController_CMMM731Controller::Init_Controller()
+{
+    zone mouse_zone;
+    mouse_zone.name         = name;
+    mouse_zone.type         = ZONE_TYPE_SINGLE;
+    mouse_zone.leds_min     = 1;
+    mouse_zone.leds_max     = 1;
+    mouse_zone.leds_count   = 1;
+    mouse_zone.matrix_map   = NULL;
+    zones.push_back(mouse_zone);
+
+    led logo_led;
+    logo_led.name           = "Logo LED";
+    logo_led.value          = 1;
+    leds.push_back(logo_led);
+}
+
+void RGBController_CMMM731Controller::SetupZones()
+{
+    SetupColors();
+}
+
+void RGBController_CMMM731Controller::ResizeZone(int /*zone*/, int /*new_size*/)
+{
+    /*---------------------------------------------------------*\
+    | This device does not support resizing zones               |
+    \*---------------------------------------------------------*/
+}
+
+void RGBController_CMMM731Controller::DeviceUpdateLEDs()
+{
+    controller->SetLedsDirect( colors[0] );
+}
+
+void RGBController_CMMM731Controller::UpdateZoneLEDs(int /*zone*/)
+{
+    controller->SetLedsDirect( colors[0] );
+}
+
+void RGBController_CMMM731Controller::UpdateSingleLED(int /*led*/)
+{
+    controller->SetLedsDirect( colors[0] );
+}
+
+void RGBController_CMMM731Controller::SetCustomMode()
+{
+    active_mode             = 0;
+}
+
+void RGBController_CMMM731Controller::DeviceUpdateMode()
+{
+    bool random_colours     = (modes[active_mode].color_mode == MODE_COLORS_RANDOM);
+    RGBColor colour         = (modes[active_mode].color_mode == MODE_COLORS_MODE_SPECIFIC) ? modes[active_mode].colors[0] : 0;
+
+    controller->SetMode( modes[active_mode].value, modes[active_mode].speed, modes[active_mode].brightness, colour, random_colours );
+}
+
+void RGBController_CMMM731Controller::DeviceSaveMode()
+{
+    DeviceUpdateMode();
+    controller->SendSavePacket();
+}
diff --git OpenRGBc/Controllers/CoolerMasterController/RGBController_CMMM731Controller.h OpenRGBc/Controllers/CoolerMasterController/RGBController_CMMM731Controller.h
new file mode 100644
index 0000000..dc2981b
--- /dev/null
+++ OpenRGBc/Controllers/CoolerMasterController/RGBController_CMMM731Controller.h
@@ -0,0 +1,40 @@
+/*-------------------------------------------------------------------*\
+| RGBController_CMMM731Controller.h                                   |
+|                                                                     |
+|   Driver for the Cooler Master MM731 Mouse                          |
+|                                                                     |
+|   Chris M (Dr_No)                              1 Jan 2022           |
+|                                                                     |
+|   This file is part of the OpenRGB project                          |
+|   SPDX-License-Identifier: GPL-2.0-only                             |
+\*-------------------------------------------------------------------*/
+
+#pragma once
+#include "RGBController.h"
+#include "CMMM731Controller.h"
+#include <vector>
+
+class RGBController_CMMM731Controller : public RGBController
+{
+public:
+    RGBController_CMMM731Controller(CMMM731Controller *controller_ptr);
+    ~RGBController_CMMM731Controller();
+
+    void        SetupZones();
+    void        ResizeZone(int zone, int new_size);
+
+    void        DeviceUpdateLEDs();
+    void        UpdateZoneLEDs(int zone);
+    void        UpdateSingleLED(int led);
+
+    void        SetCustomMode();
+    void        DeviceUpdateMode();
+    void        DeviceSaveMode();
+
+private:
+    void        Init_Controller();
+    int         GetDeviceMode();
+    int         GetLED_Zone(int led_idx);
+
+    CMMM731Controller* controller;
+};
openSUSE Build Service is sponsored by