Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package libratbag for openSUSE:Factory 
checked in at 2021-06-25 15:01:26
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libratbag (Old)
 and      /work/SRC/openSUSE:Factory/.libratbag.new.2625 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "libratbag"

Fri Jun 25 15:01:26 2021 rev:12 rq:902204 version:0.16

Changes:
--------
--- /work/SRC/openSUSE:Factory/libratbag/libratbag.changes      2021-01-01 
21:13:46.819391139 +0100
+++ /work/SRC/openSUSE:Factory/.libratbag.new.2625/libratbag.changes    
2021-06-25 15:02:07.908209678 +0200
@@ -1,0 +2,15 @@
+Thu Jun 24 18:40:51 UTC 2021 - [email protected] - 0.16
+
+- Update to version 0.16:
+  * Events are now scheduled as soon as possible
+  * Improvements to the sinowealth driver
+  * Added support for a few devices:
+    + Logitech G915 TKL
+    + Logitech G Pro X Wireless (only via USB connection)
+    + Logitech M545
+    + Logitech M500s
+    + SteelSeries Kinzu V2 Pro Edition
+    + Roccat Kone Pure SEL
+    + openinput devices
+
+-------------------------------------------------------------------

Old:
----
  libratbag-0.15.tar.xz

New:
----
  libratbag-0.16.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ libratbag.spec ++++++
--- /var/tmp/diff_new_pack.oXlyP3/_old  2021-06-25 15:02:08.364210234 +0200
+++ /var/tmp/diff_new_pack.oXlyP3/_new  2021-06-25 15:02:08.368210240 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package libratbag
 #
-# Copyright (c) 2020 SUSE LLC
+# Copyright (c) 2021 SUSE LLC
 # Copyright (c) 2019 Matthias Bach <[email protected]>.
 #
 # All modifications and additions to the file contributed by third parties
@@ -18,7 +18,7 @@
 
 
 Name:           libratbag
-Version:        0.15
+Version:        0.16
 Release:        0
 Summary:        Configuration library for gaming mice
 License:        MIT

++++++ _service ++++++
--- /var/tmp/diff_new_pack.oXlyP3/_old  2021-06-25 15:02:08.400210279 +0200
+++ /var/tmp/diff_new_pack.oXlyP3/_new  2021-06-25 15:02:08.400210279 +0200
@@ -2,7 +2,7 @@
   <service name="obs_scm" mode="disabled">
     <param name="url">https://github.com/libratbag/libratbag.git</param>
     <param name="scm">git</param>
-    <param name="revision">v0.15</param>
+    <param name="revision">v0.16</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="changesgenerate">enable</param>
     <param name="versionrewrite-pattern">v(.*)</param>

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.oXlyP3/_old  2021-06-25 15:02:08.416210298 +0200
+++ /var/tmp/diff_new_pack.oXlyP3/_new  2021-06-25 15:02:08.420210303 +0200
@@ -1,4 +1,4 @@
 <servicedata>
 <service name="tar_scm">
                 <param 
name="url">https://github.com/libratbag/libratbag.git</param>
-              <param 
name="changesrevision">f7c22ed88c31f03e6beddd6f04d3f7826ec3b7e2</param></service></servicedata>
\ No newline at end of file
+              <param 
name="changesrevision">952bd9dc07f0dc20a7457afdac96030c4c7468cc</param></service></servicedata>
\ No newline at end of file

++++++ libratbag-0.15.tar.xz -> libratbag-0.16.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libratbag-0.15/.circleci/config.yml 
new/libratbag-0.16/.circleci/config.yml
--- old/libratbag-0.15/.circleci/config.yml     2020-09-25 22:38:01.000000000 
+0200
+++ new/libratbag-0.16/.circleci/config.yml     2021-06-24 16:11:34.000000000 
+0200
@@ -231,10 +231,10 @@
 
 version: 2
 jobs:
-  fedora_31:
+  fedora_32:
     <<: *fedora_settings
     docker:
-      - image: fedora:31
+      - image: fedora:32
   arch:
     <<: *arch_settings
     docker:
@@ -246,11 +246,11 @@
   doc_build:
     <<: *doc_build
     docker:
-      - image: fedora:31
+      - image: fedora:32
   doc_deploy:
     <<: *docs_deploy
     docker:
-      - image: fedora:31
+      - image: fedora:32
 
 
 workflows:
@@ -258,8 +258,8 @@
   compile_and_test:
     jobs:
       - ubuntu_20_04
-      - arch
-      - fedora_31
+#      - arch
+      - fedora_32
       - doc_build
       - doc_deploy:
           requires:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libratbag-0.15/data/devices/logitech-M500s.device 
new/libratbag-0.16/data/devices/logitech-M500s.device
--- old/libratbag-0.15/data/devices/logitech-M500s.device       1970-01-01 
01:00:00.000000000 +0100
+++ new/libratbag-0.16/data/devices/logitech-M500s.device       2021-06-24 
16:11:34.000000000 +0200
@@ -0,0 +1,5 @@
+# Logitech M500s
+[Device]
+Name=Logitech M500s
+DeviceMatch=usb:046d:c093
+Driver=hidpp20
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libratbag-0.15/data/devices/logitech-M545.device 
new/libratbag-0.16/data/devices/logitech-M545.device
--- old/libratbag-0.15/data/devices/logitech-M545.device        1970-01-01 
01:00:00.000000000 +0100
+++ new/libratbag-0.16/data/devices/logitech-M545.device        2021-06-24 
16:11:34.000000000 +0200
@@ -0,0 +1,5 @@
+# Logitech M545
+[Device]
+Name=Logitech M545
+DeviceMatch=usb:046d:4052
+Driver=hidpp20
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libratbag-0.15/data/devices/logitech-MX-Anywhere-3.device 
new/libratbag-0.16/data/devices/logitech-MX-Anywhere-3.device
--- old/libratbag-0.15/data/devices/logitech-MX-Anywhere-3.device       
1970-01-01 01:00:00.000000000 +0100
+++ new/libratbag-0.16/data/devices/logitech-MX-Anywhere-3.device       
2021-06-24 16:11:34.000000000 +0200
@@ -0,0 +1,5 @@
+# Logitech MX Anywhere 3
+[Device]
+Name=Logitech MX Anywhere 3
+DeviceMatch=bluetooth:046d:b025;usb:046d:4090
+Driver=hidpp20
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libratbag-0.15/data/devices/logitech-MX-Anywhere2.device 
new/libratbag-0.16/data/devices/logitech-MX-Anywhere2.device
--- old/libratbag-0.15/data/devices/logitech-MX-Anywhere2.device        
2020-09-25 22:38:01.000000000 +0200
+++ new/libratbag-0.16/data/devices/logitech-MX-Anywhere2.device        
2021-06-24 16:11:34.000000000 +0200
@@ -1,4 +1,4 @@
 [Device]
 Name=Logitech MX Anywhere 2
-DeviceMatch=usb:046d:404a;bluetooth:046d:b013;bluetooth:046d:b018;bluetooth:046d:b01f
+DeviceMatch=usb:046d:404a;usb:046d:4072;usb:046d:4063;bluetooth:046d:b013;bluetooth:046d:b018;bluetooth:046d:b01f
 Driver=hidpp20
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libratbag-0.15/data/devices/logitech-MX-Vertical.device 
new/libratbag-0.16/data/devices/logitech-MX-Vertical.device
--- old/libratbag-0.15/data/devices/logitech-MX-Vertical.device 2020-09-25 
22:38:01.000000000 +0200
+++ new/libratbag-0.16/data/devices/logitech-MX-Vertical.device 2021-06-24 
16:11:34.000000000 +0200
@@ -1,4 +1,4 @@
 [Device]
 Name=Logitech MX Vertical
-DeviceMatch=bluetooth:046d:b020;usb:046d:407b
+DeviceMatch=bluetooth:046d:b020;usb:046d:407b;usb:046d:c08a
 Driver=hidpp20
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libratbag-0.15/data/devices/logitech-g-pro-x-wireless-superlight.device 
new/libratbag-0.16/data/devices/logitech-g-pro-x-wireless-superlight.device
--- old/libratbag-0.15/data/devices/logitech-g-pro-x-wireless-superlight.device 
1970-01-01 01:00:00.000000000 +0100
+++ new/libratbag-0.16/data/devices/logitech-g-pro-x-wireless-superlight.device 
2021-06-24 16:11:34.000000000 +0200
@@ -0,0 +1,5 @@
+[Device]
+Name=Logitech G Pro X Wireless Superlight
+DeviceMatch=usb:046d:4093;usb:046d:c094
+LedTypes=logo;battery;dpi;
+Driver=hidpp20
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libratbag-0.15/data/devices/logitech-g915-tkl.device 
new/libratbag-0.16/data/devices/logitech-g915-tkl.device
--- old/libratbag-0.15/data/devices/logitech-g915-tkl.device    1970-01-01 
01:00:00.000000000 +0100
+++ new/libratbag-0.16/data/devices/logitech-g915-tkl.device    2021-06-24 
16:11:34.000000000 +0200
@@ -0,0 +1,8 @@
+[Device]
+Name=Logitech G915 TKL
+DeviceMatch=usb:046d:c343;bluetooth:046d:b35f
+LedTypes=logo;switches
+Driver=hidpp20
+
+[Driver/hidpp20]
+DeviceIndex=1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libratbag-0.15/data/devices/openinput.device 
new/libratbag-0.16/data/devices/openinput.device
--- old/libratbag-0.15/data/devices/openinput.device    1970-01-01 
01:00:00.000000000 +0100
+++ new/libratbag-0.16/data/devices/openinput.device    2021-06-24 
16:11:34.000000000 +0200
@@ -0,0 +1,4 @@
+[Device]
+Name=openinput
+DeviceMatch=usb:1d50:616a
+Driver=openinput
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libratbag-0.15/data/devices/roccat-kone-pure.device 
new/libratbag-0.16/data/devices/roccat-kone-pure.device
--- old/libratbag-0.15/data/devices/roccat-kone-pure.device     2020-09-25 
22:38:01.000000000 +0200
+++ new/libratbag-0.16/data/devices/roccat-kone-pure.device     2021-06-24 
16:11:34.000000000 +0200
@@ -1,4 +1,4 @@
 [Device]
 Name=Roccat Kone Pure
-DeviceMatch=usb:1e7d:2dc2;usb:1e7d:2dbe
+DeviceMatch=usb:1e7d:2dc2;usb:1e7d:2dbe;usb:1e7d:2dcb
 Driver=roccat-kone-pure
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libratbag-0.15/data/devices/steelseries-kinzu-v2-pro.device 
new/libratbag-0.16/data/devices/steelseries-kinzu-v2-pro.device
--- old/libratbag-0.15/data/devices/steelseries-kinzu-v2-pro.device     
1970-01-01 01:00:00.000000000 +0100
+++ new/libratbag-0.16/data/devices/steelseries-kinzu-v2-pro.device     
2021-06-24 16:11:34.000000000 +0200
@@ -0,0 +1,11 @@
+[Device]
+Name=SteelSeries Kinzu V2 Pro Edition
+DeviceMatch=usb:1038:1366
+Driver=steelseries
+
+[Driver/steelseries]
+DeviceVersion=1
+Buttons=3
+Leds=0
+DpiList=400;800;1600;3200
+MacroLength=0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libratbag-0.15/meson.build 
new/libratbag-0.16/meson.build
--- old/libratbag-0.15/meson.build      2020-09-25 22:38:01.000000000 +0200
+++ new/libratbag-0.16/meson.build      2021-06-24 16:11:34.000000000 +0200
@@ -1,5 +1,5 @@
 project('libratbag', 'c',
-       version : '0.15',
+       version : '0.16',
        license : 'MIT/Expat',
        default_options : [ 'c_std=gnu99', 'warning_level=2' ],
        meson_version : '>= 0.40.0')
@@ -174,6 +174,7 @@
        'src/driver-roccat.c',
        'src/driver-roccat-kone-pure.c',
        'src/driver-gskill.c',
+       'src/driver-openinput.c',
        'src/driver-steelseries.c',
        'src/driver-sinowealth.c',
        'src/driver-sinowealth-nubwo.c',
@@ -283,6 +284,8 @@
        'data/devices/etekcity-scroll-alpha.device',
        'data/devices/gskill-MX-780.device',
        'data/devices/logitech-M325.device',
+       'data/devices/logitech-M500s.device',
+       'data/devices/logitech-M545.device',
        'data/devices/logitech-M570.device',
        'data/devices/logitech-M585-M590.device',
        'data/devices/logitech-M705.device',
@@ -296,6 +299,7 @@
        'data/devices/logitech-Wireless-Touchpad.device',
        'data/devices/logitech-g-powerplay.device',
        'data/devices/logitech-g-pro-wireless.device',
+       'data/devices/logitech-g-pro-x-wireless-superlight.device',
        'data/devices/logitech-g-pro.device',
        'data/devices/logitech-g102-g203.device',
        'data/devices/logitech-g300.device',
@@ -332,16 +336,20 @@
        'data/devices/logitech-g815.device',
        'data/devices/logitech-g910.device',
        'data/devices/logitech-g915.device',
+       'data/devices/logitech-g915-tkl.device',
        'data/devices/logitech-g935.device',
        'data/devices/logitech-g9x-Call-of-Duty-MW3-Edition.device',
        'data/devices/logitech-g9x-Original.device',
        'data/devices/logitech-Marathon-M705.device',
        'data/devices/logitech-MX-Anywhere2.device',
        'data/devices/logitech-MX-Anywhere2S.device',
+       'data/devices/logitech-MX-Anywhere-3.device',
        'data/devices/logitech-MX-Vertical.device',
+       'data/devices/openinput.device',
        'data/devices/roccat-kone-pure.device',
        'data/devices/roccat-kone-xtd.device',
        'data/devices/steelseries-kinzu-v2.device',
+       'data/devices/steelseries-kinzu-v2-pro.device',
        'data/devices/steelseries-kinzu-v3.device',
        'data/devices/steelseries-rival-310.device',
        'data/devices/steelseries-rival-600.device',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libratbag-0.15/ratbagd/ratbagd-json.c 
new/libratbag-0.16/ratbagd/ratbagd-json.c
--- old/libratbag-0.15/ratbagd/ratbagd-json.c   2020-09-25 22:38:01.000000000 
+0200
+++ new/libratbag-0.16/ratbagd/ratbagd-json.c   2021-06-24 16:11:34.000000000 
+0200
@@ -515,6 +515,7 @@
        JsonArray *arr;
        int r = -EINVAL;
        g_autoptr(GError) error = NULL;
+       g_autoptr(GList) list = NULL;
 
        error = 0;
        parser = json_parser_new();
@@ -540,7 +541,7 @@
        num_buttons = device->num_buttons;
        num_leds = device->num_leds;
 
-       g_autoptr(GList) list = json_array_get_elements(arr);
+       list = json_array_get_elements(arr);
        GList *l = list;
        int idx = 0;
        while (l != NULL) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libratbag-0.15/ratbagd/ratbagd.c 
new/libratbag-0.16/ratbagd/ratbagd.c
--- old/libratbag-0.15/ratbagd/ratbagd.c        2020-09-25 22:38:01.000000000 
+0200
+++ new/libratbag-0.16/ratbagd/ratbagd.c        2021-06-24 16:11:34.000000000 
+0200
@@ -697,5 +697,5 @@
        cb->callback = callback;
        cb->userdata = userdata;
 
-       sd_event_add_post(ctx->event, &source, ratbagd_callback_handler, cb);
+       sd_event_add_defer(ctx->event, &source, ratbagd_callback_handler, cb);
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libratbag-0.15/src/driver-logitech-g600.c 
new/libratbag-0.16/src/driver-logitech-g600.c
--- old/libratbag-0.15/src/driver-logitech-g600.c       2020-09-25 
22:38:01.000000000 +0200
+++ new/libratbag-0.16/src/driver-logitech-g600.c       2021-06-24 
16:11:34.000000000 +0200
@@ -34,7 +34,7 @@
 #include "libratbag-hidraw.h"
 
 #define LOGITECH_G600_NUM_PROFILES                     3
-#define LOGITECH_G600_NUM_BUTTONS                      20
+#define LOGITECH_G600_NUM_BUTTONS                      41 // 20 buttons + 1 
color buffer + 20 G-shift
 #define LOGITECH_G600_NUM_DPI                          4
 #define LOGITECH_G600_NUM_LED                          1
 #define LOGITECH_G600_DPI_MIN                          200
@@ -109,20 +109,41 @@
        { 3, RATBAG_BUTTON_TYPE_WHEEL_LEFT },
        { 4, RATBAG_BUTTON_TYPE_WHEEL_RIGHT },
        { 5, RATBAG_BUTTON_TYPE_PINKIE },
-       { 6, RATBAG_BUTTON_TYPE_PROFILE_CYCLE_UP },
-       { 7, RATBAG_BUTTON_TYPE_RESOLUTION_CYCLE_UP },
-       { 8, RATBAG_BUTTON_TYPE_SIDE }, // 8 = G9 ... 19 = G20
-       { 9, RATBAG_BUTTON_TYPE_SIDE },
-       { 10, RATBAG_BUTTON_TYPE_SIDE },
-       { 11, RATBAG_BUTTON_TYPE_SIDE },
-       { 12, RATBAG_BUTTON_TYPE_SIDE },
-       { 13, RATBAG_BUTTON_TYPE_SIDE },
-       { 14, RATBAG_BUTTON_TYPE_SIDE },
-       { 15, RATBAG_BUTTON_TYPE_SIDE },
-       { 16, RATBAG_BUTTON_TYPE_SIDE },
-       { 17, RATBAG_BUTTON_TYPE_SIDE },
-       { 18, RATBAG_BUTTON_TYPE_SIDE },
-       { 19, RATBAG_BUTTON_TYPE_SIDE },
+       { 6, RATBAG_BUTTON_TYPE_PROFILE_CYCLE_UP }, // G07
+       { 7, RATBAG_BUTTON_TYPE_RESOLUTION_CYCLE_UP }, // G08
+       { 8, RATBAG_BUTTON_TYPE_SIDE },  // G09
+       { 9, RATBAG_BUTTON_TYPE_SIDE },  // G10
+       { 10, RATBAG_BUTTON_TYPE_SIDE }, // G11
+       { 11, RATBAG_BUTTON_TYPE_SIDE }, // G12
+       { 12, RATBAG_BUTTON_TYPE_SIDE }, // G13
+       { 13, RATBAG_BUTTON_TYPE_SIDE }, // G14
+       { 14, RATBAG_BUTTON_TYPE_SIDE }, // G15
+       { 15, RATBAG_BUTTON_TYPE_SIDE }, // G16
+       { 16, RATBAG_BUTTON_TYPE_SIDE }, // G17
+       { 17, RATBAG_BUTTON_TYPE_SIDE }, // G18
+       { 18, RATBAG_BUTTON_TYPE_SIDE }, // G19
+       { 19, RATBAG_BUTTON_TYPE_SIDE }, // G20
+       { 20, RATBAG_BUTTON_TYPE_UNKNOWN }, //HACK is where the G-shift color 
information is located
+       { 21, RATBAG_BUTTON_TYPE_LEFT }, // G-shift + left
+       { 22, RATBAG_BUTTON_TYPE_RIGHT }, // G-shift + right click
+       { 23, RATBAG_BUTTON_TYPE_MIDDLE }, // G-shift + middle
+       { 24, RATBAG_BUTTON_TYPE_WHEEL_LEFT},  // G-shift + scroll left
+       { 25, RATBAG_BUTTON_TYPE_WHEEL_RIGHT}, // G-shift + scroll right
+       { 26, RATBAG_BUTTON_TYPE_PINKIE }, // G-shift + Pinky(shift modifer)
+       { 27, RATBAG_BUTTON_TYPE_PROFILE_CYCLE_UP }, // G-shift + 07
+       { 28, RATBAG_BUTTON_TYPE_RESOLUTION_CYCLE_UP }, // G-shift + G08
+       { 29, RATBAG_BUTTON_TYPE_SIDE }, // G-shift + G09
+       { 30, RATBAG_BUTTON_TYPE_SIDE }, // G-shift + G10
+       { 31, RATBAG_BUTTON_TYPE_SIDE }, // G-shift + G11
+       { 32, RATBAG_BUTTON_TYPE_SIDE }, // G-shift + G12
+       { 33, RATBAG_BUTTON_TYPE_SIDE }, // G-shift + G13
+       { 34, RATBAG_BUTTON_TYPE_SIDE }, // G-shift + G14
+       { 35, RATBAG_BUTTON_TYPE_SIDE }, // G-shift + G15
+       { 36, RATBAG_BUTTON_TYPE_SIDE }, // G-shift + G16
+    { 37, RATBAG_BUTTON_TYPE_SIDE }, // G-shift + G17
+    { 38, RATBAG_BUTTON_TYPE_SIDE }, // G-shift + G18
+    { 39, RATBAG_BUTTON_TYPE_SIDE }, // G-shift + G19
+    { 40, RATBAG_BUTTON_TYPE_SIDE }, // G-shift + G20
 };
 
 static enum ratbag_button_type
@@ -144,7 +165,7 @@
 };
 
 static struct logitech_g600_button_mapping logitech_g600_button_mapping[] = {
-       /* 0x00 is either key or unassigned. Must be handled separatly  */
+       /* 0x00 is either key or unassigned. Must be handled separately  */
        { 0x01, BUTTON_ACTION_BUTTON(1) },
        { 0x02, BUTTON_ACTION_BUTTON(2) },
        { 0x03, BUTTON_ACTION_BUTTON(3) },
@@ -600,6 +621,12 @@
                        report->led_duration = 0x0f;
        }
 
+       // For now the default will copy over the main color into the g-shift 
color
+       // future update may add support to set this via cli command
+       report->g_shift_color[0] = report->led_red;
+       report->g_shift_color[1] = report->led_green;
+       report->g_shift_color[2] = report->led_blue;
+
        buf = (uint8_t*)report;
 
        rc = ratbag_hidraw_raw_request(device, report->id,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libratbag-0.15/src/driver-openinput.c 
new/libratbag-0.16/src/driver-openinput.c
--- old/libratbag-0.15/src/driver-openinput.c   1970-01-01 01:00:00.000000000 
+0100
+++ new/libratbag-0.16/src/driver-openinput.c   2021-06-24 16:11:34.000000000 
+0200
@@ -0,0 +1,482 @@
+/*
+ * Copyright ?? 2021 Filipe La??ns
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include "config.h"
+
+#include "libratbag-private.h"
+
+
+/* reports */
+#define OI_REPORT_SHORT                0x20
+#define OI_REPORT_LONG         0x21
+#define OI_REPORT_SHORT_SIZE   8
+#define OI_REPORT_LONG_SIZE    32
+
+#define OI_REPORT_MAX_SIZE             OI_REPORT_LONG_SIZE
+#define OI_REPORT_DATA_INDEX           3
+#define OI_REPORT_DATA_MAX_SIZE                OI_REPORT_LONG_SIZE - 
OI_REPORT_DATA_INDEX
+
+/* protocol function pages */
+#define OI_PAGE_INFO                   0x00
+#define OI_PAGE_GIMMICKS               0xFD
+#define OI_PAGE_DEBUG                  0xFE
+#define OI_PAGE_ERROR                  0xFF
+
+/* info page (0x00) functions */
+#define OI_FUNCTION_VERSION                    0x00
+#define OI_FUNCTION_FW_INFO                    0x01
+#define OI_FUNCTION_SUPPORTED_FUNCTION_PAGES   0x02
+#define OI_FUNCTION_SUPPORTED_FUNCTIONS                0x03
+
+/* error page (0xFF) */
+#define OI_ERROR_INVALID_VALUE         0x01
+#define OI_ERROR_UNSUPPORTED_FUNCTION  0x02
+#define OI_ERROR_CUSTOM                        0xFE
+
+
+static unsigned int report_rates[] = { 125, 250, 500, 750, 1000 };
+
+struct openinput_drv_data {
+       unsigned int num_profiles;
+       unsigned int num_resolutions;
+       unsigned int num_buttons;
+       unsigned int num_leds;
+       unsigned int fw_major;
+       unsigned int fw_minor;
+       unsigned int fw_patch;
+       uint64_t supported;
+};
+
+struct oi_report_t {
+       uint8_t id;
+       uint8_t function_page;
+       uint8_t function;
+       uint8_t data[29];
+} __attribute__((__packed__));
+
+
+#define CASE_RETURN_STRING(a) case a: return #a; break
+static const char*
+openinput_function_page_get_name(uint8_t page)
+{
+       static char numeric[16];
+       char *str;
+
+       switch(page) {
+       CASE_RETURN_STRING(OI_PAGE_INFO);
+       CASE_RETURN_STRING(OI_PAGE_GIMMICKS);
+       CASE_RETURN_STRING(OI_PAGE_DEBUG);
+       CASE_RETURN_STRING(OI_PAGE_ERROR);
+       default:
+               sprintf_safe(numeric, "0x%02x", page);
+               str = numeric;
+               break;
+       }
+
+       return str;
+}
+
+static const char*
+openinput_function_get_name(uint8_t page, uint8_t function)
+{
+       static char numeric[32];
+       char *str = NULL;
+
+       switch(page) {
+       case OI_PAGE_INFO:
+               switch (function) {
+               CASE_RETURN_STRING(OI_FUNCTION_VERSION);
+               CASE_RETURN_STRING(OI_FUNCTION_FW_INFO);
+               CASE_RETURN_STRING(OI_FUNCTION_SUPPORTED_FUNCTION_PAGES);
+               CASE_RETURN_STRING(OI_FUNCTION_SUPPORTED_FUNCTIONS);
+               }
+       }
+
+       if (!str) {
+               sprintf_safe(numeric, "0x%02x 0x%02x", page, function);
+               str = numeric;
+       }
+
+       return str;
+}
+#undef CASE_RETURN_STRING
+
+static const char*
+openinput_get_error_string(struct oi_report_t *report)
+{
+       char help_str[OI_REPORT_LONG_SIZE - OI_REPORT_DATA_INDEX + 1] = {0};
+       char *str;
+
+       switch (report->function) {
+       case OI_ERROR_INVALID_VALUE:
+               xasprintf(&str, "Invalid value (in position %u)", 
report->data[2]);
+               break;
+       case OI_ERROR_CUSTOM:
+               memcpy(help_str, report->data, sizeof(help_str)-1); /* copy 
error string */
+               xasprintf(&str, "Custom error (%s)", help_str);
+               break;
+       case OI_ERROR_UNSUPPORTED_FUNCTION:
+               xasprintf(&str, "Unsupported function (0x%02x, 0x%02x)", 
report->data[0], report->data[1]);
+               break;
+       default:
+               xasprintf(&str, "Unkown error (%u)", report->function);
+               break;
+       }
+
+       return str;
+}
+
+static size_t
+openinput_get_report_size(unsigned int report)
+{
+       switch (report) {
+       case OI_REPORT_SHORT:
+               return OI_REPORT_SHORT_SIZE;
+       case OI_REPORT_LONG:
+               return OI_REPORT_LONG_SIZE;
+       default:
+               return 0;
+       }
+}
+
+static int
+openinput_send_report(struct ratbag_device *device, struct oi_report_t *report)
+{
+       int ret;
+       uint8_t buffer[OI_REPORT_MAX_SIZE];
+       size_t size = openinput_get_report_size(report->id);
+
+       memcpy(buffer, report, size);
+
+       ret = ratbag_hidraw_output_report(device, buffer, size);
+       if (ret < 0) {
+               log_error(device->ratbag, "openinput: failed to send data to 
device (%s)\n",
+                         strerror(-ret));
+               return ret;
+       }
+
+       ret = ratbag_hidraw_read_input_report(device, buffer, 
OI_REPORT_MAX_SIZE);
+       if (ret < 0) {
+               log_error(device->ratbag, "openinput: failed to read data from 
device (%s)\n",
+                         strerror(-ret));
+               return ret;
+       }
+
+       memcpy(report, buffer, openinput_get_report_size(buffer[0]));
+
+       /* check for error */
+       if (report->function_page == OI_PAGE_ERROR) {
+               log_error(device->ratbag, "openinput: %s\n", 
openinput_get_error_string(report));
+               return report->function;
+       }
+
+       return 0;
+}
+
+static int
+openinput_info_version(struct ratbag_device *device)
+{
+       int ret;
+       struct openinput_drv_data *drv_data = ratbag_get_drv_data(device);
+       struct oi_report_t report = {
+               .id = OI_REPORT_SHORT,
+               .function_page = OI_PAGE_INFO,
+               .function = OI_FUNCTION_VERSION
+       };
+
+       ret = openinput_send_report(device, &report);
+       if (ret)
+               return ret;
+
+       drv_data->fw_major = report.data[0];
+       drv_data->fw_minor = report.data[1];
+       drv_data->fw_patch = report.data[2];
+
+       log_info(device->ratbag, "openinput: protocol version %u.%u.%u\n",
+                drv_data->fw_major, drv_data->fw_minor, drv_data->fw_patch);
+
+       return 0;
+}
+
+#define OI_FUNCTION_FW_INFO_VENDOR             0x00
+#define OI_FUNCTION_FW_INFO_VERSION            0x01
+#define OI_FUNCTION_FW_INFO_DEVICE_NAME                0x02
+
+static int
+openinput_info_fw_info(struct ratbag_device *device,
+                                 uint8_t field_id,
+                                 unsigned char *description,
+                                 size_t description_size)
+{
+       int ret;
+       struct oi_report_t report = {
+               .id = OI_REPORT_SHORT,
+               .function_page = OI_PAGE_INFO,
+               .function = OI_FUNCTION_FW_INFO,
+               .data = {field_id}
+       };
+
+       ret = openinput_send_report(device, &report);
+       if (ret)
+               return ret;
+
+       memcpy(description, report.data, min(sizeof(report.data), 
description_size));
+
+       return 0;
+}
+
+
+static int
+openinput_info_supported_function_pages(struct ratbag_device *device,
+                                                  uint8_t start_index,
+                                                  uint8_t *pages_count,
+                                                  uint8_t *pages_left,
+                                                  uint8_t *pages,
+                                                  size_t pages_size)
+{
+       int ret;
+       struct oi_report_t report = {
+               .id = OI_REPORT_SHORT,
+               .function_page = OI_PAGE_INFO,
+               .function = OI_FUNCTION_SUPPORTED_FUNCTION_PAGES,
+               .data = {start_index}
+       };
+
+       ret = openinput_send_report(device, &report);
+       if (ret)
+               return ret;
+
+       *pages_count = report.data[0];
+       *pages_left = report.data[1];
+       memcpy(pages, report.data + 2, min(sizeof(report.data), pages_size));
+
+       return 0;
+}
+
+static int
+openinput_info_supported_functions(struct ratbag_device *device,
+                                             uint8_t function_page,
+                                             uint8_t start_index,
+                                             uint8_t *functions_count,
+                                             uint8_t *functions_left,
+                                             uint8_t *functions,
+                                             size_t functions_size)
+{
+       int ret;
+       struct oi_report_t report = {
+               .id = OI_REPORT_SHORT,
+               .function_page = OI_PAGE_INFO,
+               .function = OI_FUNCTION_SUPPORTED_FUNCTIONS,
+               .data = {function_page, start_index}
+       };
+
+       ret = openinput_send_report(device, &report);
+       if (ret)
+               return ret;
+
+       *functions_count = report.data[0];
+       *functions_left = report.data[1];
+       memcpy(functions, report.data + 2, min(sizeof(report.data), 
functions_size));
+
+       return 0;
+}
+
+static int
+openinput_read_supported_functions(struct ratbag_device *device, uint8_t page)
+{
+       struct ratbag *ratbag = device->ratbag;
+       int ret;
+       uint8_t i, total, read = 0, count = 0, left = 0;
+       uint8_t buffer[OI_REPORT_DATA_MAX_SIZE];
+
+       ret = openinput_info_supported_functions(device,
+                                                page,
+                                                read,
+                                                &count, &left,
+                                                buffer, sizeof(buffer));
+       if (ret)
+               return ret;
+
+       total = count + left;
+       uint8_t functions[total];
+
+       memcpy(functions, buffer, count);
+
+       /* there are still functions left to read! */
+       while (left) {
+               ret = openinput_info_supported_functions(device,
+                                                        page,
+                                                        read,
+                                                        &count, &left,
+                                                        buffer, 
sizeof(buffer));
+               if (ret)
+                       return ret;
+
+               /* make sure the new size values make sense, to avoid deadlocks 
*/
+               if (total != (read + count + left)) {
+                       log_error(ratbag, "openinput: invalid number of 
functions left to read (%u)\n", left);
+                       return -EINVAL;
+               }
+               log_debug(ratbag, "openinput: read %u functions, %u left\n", 
count, left);
+
+               memcpy(functions + read, buffer, count);
+               read += count;
+       }
+
+       /* iterate over read functions */
+       for (i = 0; i < total; i++) {
+               log_debug(ratbag, "openinput: found function %s\n", 
openinput_function_get_name(page, functions[i]));
+               /* TODO: set bits in drv_data->supported when we implement 
support for certain capabilities */
+       }
+
+       return 0;
+}
+
+static int
+openinput_read_supported_function_pages(struct ratbag_device *device)
+{
+       struct ratbag *ratbag = device->ratbag;
+       int ret;
+       uint8_t i, total, read = 0, count = 0, left = 0;
+       uint8_t buffer[OI_REPORT_DATA_MAX_SIZE];
+
+       log_debug(ratbag, "openinput: starting reading device functions...\n");
+
+       ret = openinput_info_supported_function_pages(device,
+                                                     read,
+                                                     &count, &left,
+                                                     buffer, sizeof(buffer));
+       if (ret)
+               return ret;
+
+       total = count + left;
+       uint8_t pages[total];
+
+       memcpy(pages, buffer, count);
+
+       /* there are still function pages left to read! */
+       while (left) {
+               ret = openinput_info_supported_function_pages(device,
+                                                             read,
+                                                             &count, &left,
+                                                             buffer, 
sizeof(buffer));
+               if (ret)
+                       return ret;
+
+               /* make sure the new size values make sense, to avoid deadlocks 
*/
+               if (total != (read + count + left)) {
+                       log_error(ratbag, "openinput: invalid number of 
function pages left to read (%u)\n", left);
+                       return -EINVAL;
+               }
+               log_debug(ratbag, "openinput: read %u pages, %u left\n", count, 
left);
+
+               memcpy(pages + read, buffer, count);
+               read += count;
+       }
+
+       /* iterate over read function pages, and read their functions */
+       for (i = 0; i < total; i++) {
+               log_debug(ratbag, "openinput: found function page %s\n", 
openinput_function_page_get_name(pages[i]));
+               openinput_read_supported_functions(device, pages[i]);
+       }
+
+       return 0;
+}
+
+static void
+openinput_read_profile(struct ratbag_profile *profile)
+{
+       ratbag_profile_set_report_rate_list(profile, report_rates, 
sizeof(*report_rates));
+       profile->is_active = true;
+}
+
+static int
+openinput_test_hidraw(struct ratbag_device *device)
+{
+       return ratbag_hidraw_has_report(device, OI_REPORT_SHORT);
+}
+
+static int
+openinput_probe(struct ratbag_device *device)
+{
+       int ret;
+       struct openinput_drv_data *drv_data;
+       struct ratbag_profile *profile;
+       unsigned char str[OI_REPORT_DATA_MAX_SIZE];
+
+       ret = ratbag_find_hidraw(device, openinput_test_hidraw);
+       if (ret)
+               return ret;
+
+       drv_data = zalloc(sizeof(*drv_data));
+
+       drv_data->num_profiles = 1;
+
+       ratbag_set_drv_data(device, drv_data);
+
+       openinput_info_version(device);
+
+       ret = openinput_info_fw_info(device, OI_FUNCTION_FW_INFO_VENDOR, str, 
sizeof(str));
+       if (ret)
+               return ret;
+       log_info(device->ratbag, "openinput: firmware vendor: %s\n", str);
+
+       ret = openinput_info_fw_info(device, OI_FUNCTION_FW_INFO_VERSION, str, 
sizeof(str));
+       if (ret)
+               return ret;
+       log_info(device->ratbag, "openinput: firmware version: %s\n", str);
+
+       ret = openinput_info_fw_info(device, OI_FUNCTION_FW_INFO_DEVICE_NAME, 
str, sizeof(str));
+       if (ret)
+               return ret;
+       log_info(device->ratbag, "openinput: device: %s\n", str);
+
+       ret = openinput_read_supported_function_pages(device);
+       if (ret)
+               return ret;
+
+       ratbag_device_init_profiles(device,
+                                   drv_data->num_profiles,
+                                   drv_data->num_resolutions,
+                                   drv_data->num_buttons,
+                                   drv_data->num_leds);
+
+       ratbag_device_for_each_profile(device, profile)
+               openinput_read_profile(profile);
+
+       return 0;
+}
+
+static void
+openinput_remove(struct ratbag_device *device)
+{
+       ratbag_close_hidraw(device);
+       free(ratbag_get_drv_data(device));
+}
+
+struct ratbag_driver openinput_driver = {
+       .name = "openinput",
+       .id = "openinput",
+       .probe = openinput_probe,
+       .remove = openinput_remove,
+};
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libratbag-0.15/src/driver-sinowealth-nubwo.c 
new/libratbag-0.16/src/driver-sinowealth-nubwo.c
--- old/libratbag-0.15/src/driver-sinowealth-nubwo.c    2020-09-25 
22:38:01.000000000 +0200
+++ new/libratbag-0.16/src/driver-sinowealth-nubwo.c    2021-06-24 
16:11:34.000000000 +0200
@@ -21,6 +21,7 @@
  * DEALINGS IN THE SOFTWARE.
  */
 
+#include "config.h"
 #include "libratbag-enums.h"
 #include "libratbag-hidraw.h"
 #include "libratbag-private.h"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libratbag-0.15/src/driver-sinowealth.c 
new/libratbag-0.16/src/driver-sinowealth.c
--- old/libratbag-0.15/src/driver-sinowealth.c  2020-09-25 22:38:01.000000000 
+0200
+++ new/libratbag-0.16/src/driver-sinowealth.c  2021-06-24 16:11:34.000000000 
+0200
@@ -245,6 +245,20 @@
        unsigned int hz = 1000; /* TODO */
        int rc;
 
+       /* Print firmware version */
+       uint8_t version[6] = {SINOWEALTH_REPORT_ID_CMD, 
SINOWEALTH_CMD_FIRMWARE_VERSION};
+       rc = ratbag_hidraw_set_feature_report(device, SINOWEALTH_REPORT_ID_CMD, 
version, sizeof(version));
+       if (rc != sizeof(version)) {
+               log_error(device->ratbag, "Error while sending read firmware 
version command: %d\n", rc);
+               return -1;
+       }
+       rc = ratbag_hidraw_get_feature_report(device, SINOWEALTH_REPORT_ID_CMD, 
version, sizeof(version));
+       if (rc != sizeof(version)) {
+               log_error(device->ratbag, "Could not read firmware version: 
%d\n", rc);
+               return -1;
+       }
+       log_debug(device->ratbag, "firmware version: %.4s\n", version + 2);
+
        uint8_t cmd[6] = {SINOWEALTH_REPORT_ID_CMD, SINOWEALTH_CMD_GET_CONFIG};
        rc = ratbag_hidraw_set_feature_report(device, SINOWEALTH_REPORT_ID_CMD, 
cmd, sizeof(cmd));
        if (rc != sizeof(cmd)) {
@@ -277,7 +291,7 @@
                        resolution->dpi_x = 0;
                        resolution->dpi_y = 0;
                }
-               resolution->is_active = resolution->index == config->active_dpi 
- 1;
+               resolution->is_active = resolution->index == config->active_dpi 
- 1u;
                resolution->is_default = resolution->is_active;
        }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libratbag-0.15/src/libratbag-data.c 
new/libratbag-0.16/src/libratbag-data.c
--- old/libratbag-0.15/src/libratbag-data.c     2020-09-25 22:38:01.000000000 
+0200
+++ new/libratbag-0.16/src/libratbag-data.c     2021-06-24 16:11:34.000000000 
+0200
@@ -34,6 +34,7 @@
 #include "libratbag-private.h"
 #include "libratbag-data.h"
 #include "hidpp20.h"
+#include "usb-ids.h"
 
 #define GROUP_DEVICE "Device"
 
@@ -53,6 +54,7 @@
        STEELSERIES,
        SINOWEALTH,
        SINOWEALTH_NUBWO,
+       OPENINPUT,
 };
 
 struct data_hidpp20 {
@@ -271,6 +273,7 @@
        { STEELSERIES, "steelseries", init_data_steelseries },
        { SINOWEALTH, "sinowealth", NULL },
        { SINOWEALTH_NUBWO, "sinowealth_nubwo", NULL},
+       { OPENINPUT, "openinput", NULL },
 };
 
 const char *
@@ -517,7 +520,9 @@
                        goto out;
        }
 
-       if (!data)
+       if (id->vendor == USB_VENDOR_ID_LOGITECH && (id->product & 0xff00) == 
0xc500)
+               log_debug(ratbag, "%04x:%04x is a Logitech receiver, not a 
device. Ignoring...\n", id->vendor, id->product);
+       else if (!data)
                log_debug(ratbag, "No data file found for %04x:%04x\n", 
id->vendor, id->product);
 
 out:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libratbag-0.15/src/libratbag-private.h 
new/libratbag-0.16/src/libratbag-private.h
--- old/libratbag-0.15/src/libratbag-private.h  2020-09-25 22:38:01.000000000 
+0200
+++ new/libratbag-0.16/src/libratbag-private.h  2021-06-24 16:11:34.000000000 
+0200
@@ -597,6 +597,7 @@
 extern struct ratbag_driver steelseries_driver;
 extern struct ratbag_driver sinowealth_driver;
 extern struct ratbag_driver sinowealth_nubwo_driver;
+extern struct ratbag_driver openinput_driver;
 
 struct ratbag_device*
 ratbag_device_new(struct ratbag *ratbag, struct udev_device *udev_device,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libratbag-0.15/src/libratbag.c 
new/libratbag-0.16/src/libratbag.c
--- old/libratbag-0.15/src/libratbag.c  2020-09-25 22:38:01.000000000 +0200
+++ new/libratbag-0.16/src/libratbag.c  2021-06-24 16:11:34.000000000 +0200
@@ -604,6 +604,7 @@
        ratbag_register_driver(ratbag, &steelseries_driver);
        ratbag_register_driver(ratbag, &sinowealth_driver);
        ratbag_register_driver(ratbag, &sinowealth_nubwo_driver);
+       ratbag_register_driver(ratbag, &openinput_driver);
 
        return ratbag;
 }

Reply via email to