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; }
