Hello community,

here is the log from the commit of package roccat-tools for openSUSE:Factory 
checked in at 2015-02-05 11:01:19
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/roccat-tools (Old)
 and      /work/SRC/openSUSE:Factory/.roccat-tools.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "roccat-tools"

Changes:
--------
--- /work/SRC/openSUSE:Factory/roccat-tools/roccat-tools.changes        
2015-02-03 11:39:37.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.roccat-tools.new/roccat-tools.changes   
2015-02-05 11:01:25.000000000 +0100
@@ -1,0 +2,5 @@
+Sun Feb  1 13:06:41 UTC 2015 - [email protected]
+
+- update to version 2.4.0
+
+-------------------------------------------------------------------

Old:
----
  roccat-tools-2.3.0.tar.bz2

New:
----
  roccat-tools-2.4.0.tar.bz2

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

Other differences:
------------------
++++++ roccat-tools.spec ++++++
--- /var/tmp/diff_new_pack.9b9vGO/_old  2015-02-05 11:01:26.000000000 +0100
+++ /var/tmp/diff_new_pack.9b9vGO/_new  2015-02-05 11:01:26.000000000 +0100
@@ -18,7 +18,7 @@
 %{!?_udevrulesdir: %global _udevrulesdir %(pkg-config --variable=udevdir 
udev)/rules.d}
 
 Name:           roccat-tools
-Version:        2.3.0
+Version:        2.4.0
 Release:        0
 License:        GPL-2.0+ and CC-BY-3.0
 Group:          Hardware/Other

++++++ roccat-tools-2.3.0.tar.bz2 -> roccat-tools-2.4.0.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roccat-tools-2.3.0/CMakeLists.txt 
new/roccat-tools-2.4.0/CMakeLists.txt
--- old/roccat-tools-2.3.0/CMakeLists.txt       2015-01-10 20:10:13.000000000 
+0100
+++ new/roccat-tools-2.4.0/CMakeLists.txt       2015-01-25 17:36:09.000000000 
+0100
@@ -80,7 +80,7 @@
   "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
 
 SET(V_MAJOR 2)
-SET(V_MINOR 3)
+SET(V_MINOR 4)
 SET(V_PATCH 0)
 
 ENABLE_TESTING()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roccat-tools-2.3.0/Changelog 
new/roccat-tools-2.4.0/Changelog
--- old/roccat-tools-2.3.0/Changelog    2015-01-10 20:10:13.000000000 +0100
+++ new/roccat-tools-2.4.0/Changelog    2015-01-25 17:36:09.000000000 +0100
@@ -1,3 +1,11 @@
+2.4.0 2015-01-25
+
+ * Added: Tyon support for TalkFX switch
+ * Fixed: Tyon firmware update ended with error, although working flawlessly
+ * Fixed: Tyon macros now support full 480 actions
+ * Fixed: Tyon talk works now with firmware 1.29
+ * Fixed: Macro saving did not work as expected
+
 2.3.0 2015-01-10
 
  * Added: KoneXTD and IskuFX support for TalkFX switch
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/roccat-tools-2.3.0/isku/libiskueventhandler/isku_eventhandler.c 
new/roccat-tools-2.4.0/isku/libiskueventhandler/isku_eventhandler.c
--- old/roccat-tools-2.3.0/isku/libiskueventhandler/isku_eventhandler.c 
2015-01-10 20:10:13.000000000 +0100
+++ new/roccat-tools-2.4.0/isku/libiskueventhandler/isku_eventhandler.c 
2015-01-25 17:36:09.000000000 +0100
@@ -329,7 +329,7 @@
                                (event == 
ISKU_REPORT_BUTTON_EVENT_ACTION_PRESS) ? ROCCAT_TALK_EASYAIM_5 : 
ROCCAT_TALK_EASYAIM_OFF);
                break;
        default:
-               g_debug("unknown talk event of type 0x%2x", 
priv->active_talk_type);
+               g_debug("unknown talk event of type 0x%02x", 
priv->active_talk_type);
        }
 
        if (event == ISKU_REPORT_BUTTON_EVENT_ACTION_RELEASE)
@@ -468,7 +468,7 @@
                                
isku_configuration_get_notification_volume(priv->config));
                break;
        default:
-               g_debug("unknown live recording event of type 0x%2x", event);
+               g_debug("unknown live recording event of type 0x%02x", event);
        }
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/roccat-tools-2.3.0/iskufx/libiskufxeventhandler/iskufx_eventhandler.c 
new/roccat-tools-2.4.0/iskufx/libiskufxeventhandler/iskufx_eventhandler.c
--- old/roccat-tools-2.3.0/iskufx/libiskufxeventhandler/iskufx_eventhandler.c   
2015-01-10 20:10:13.000000000 +0100
+++ new/roccat-tools-2.4.0/iskufx/libiskufxeventhandler/iskufx_eventhandler.c   
2015-01-25 17:36:09.000000000 +0100
@@ -395,7 +395,7 @@
                                (event == 
ISKU_REPORT_BUTTON_EVENT_ACTION_PRESS) ? ROCCAT_TALK_EASYAIM_5 : 
ROCCAT_TALK_EASYAIM_OFF);
                break;
        default:
-               g_debug("unknown talk event of type 0x%2x", 
priv->active_talk_type);
+               g_debug("unknown talk event of type 0x%02x", 
priv->active_talk_type);
        }
 
        if (event == ISKU_REPORT_BUTTON_EVENT_ACTION_RELEASE)
@@ -534,7 +534,7 @@
                                
isku_configuration_get_notification_volume(priv->config));
                break;
        default:
-               g_debug("unknown live recording event of type 0x%2x", event);
+               g_debug("unknown live recording event of type 0x%02x", event);
        }
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roccat-tools-2.3.0/koneplus/libkoneplus/koneplus.h 
new/roccat-tools-2.4.0/koneplus/libkoneplus/koneplus.h
--- old/roccat-tools-2.3.0/koneplus/libkoneplus/koneplus.h      2015-01-10 
20:10:13.000000000 +0100
+++ new/roccat-tools-2.4.0/koneplus/libkoneplus/koneplus.h      2015-01-25 
17:36:09.000000000 +0100
@@ -507,6 +507,7 @@
 
 typedef enum {
        KONEPLUS_CHRDEV_EVENT_TYPE_TILT = 0x10,
+       KONEPLUS_CHRDEV_EVENT_TYPE_SCROLL = 0x1b,
        KONEPLUS_CHRDEV_EVENT_TYPE_PROFILE = 0x20,
        KONEPLUS_CHRDEV_EVENT_TYPE_QUICKLAUNCH = 0x60,
        KONEPLUS_CHRDEV_EVENT_TYPE_TIMER = 0x80,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/roccat-tools-2.3.0/koneplus/libkonepluseventhandler/koneplus_eventhandler.c 
new/roccat-tools-2.4.0/koneplus/libkonepluseventhandler/koneplus_eventhandler.c
--- 
old/roccat-tools-2.3.0/koneplus/libkonepluseventhandler/koneplus_eventhandler.c 
    2015-01-10 20:10:13.000000000 +0100
+++ 
new/roccat-tools-2.4.0/koneplus/libkonepluseventhandler/koneplus_eventhandler.c 
    2015-01-25 17:36:09.000000000 +0100
@@ -410,7 +410,7 @@
                }
                break;
        default:
-               g_debug("unknown talk event of type 0x%2x", 
priv->active_talk_type);
+               g_debug("unknown talk event of type 0x%02x", 
priv->active_talk_type);
        }
 
        if (event == KONEPLUS_CHRDEV_EVENT_ACTION_RELEASE)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/roccat-tools-2.3.0/konepure/libkonepureeventhandler/konepure_eventhandler.c 
new/roccat-tools-2.4.0/konepure/libkonepureeventhandler/konepure_eventhandler.c
--- 
old/roccat-tools-2.3.0/konepure/libkonepureeventhandler/konepure_eventhandler.c 
    2015-01-10 20:10:13.000000000 +0100
+++ 
new/roccat-tools-2.4.0/konepure/libkonepureeventhandler/konepure_eventhandler.c 
    2015-01-25 17:36:09.000000000 +0100
@@ -410,7 +410,7 @@
                }
                break;
        default:
-               g_debug("unknown talk event of type 0x%2x", 
priv->active_talk_type);
+               g_debug("unknown talk event of type 0x%02x", 
priv->active_talk_type);
        }
 
        if (event == KONEPLUS_CHRDEV_EVENT_ACTION_RELEASE)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/roccat-tools-2.3.0/konepuremilitary/libkonepuremilitaryeventhandler/konepuremilitary_eventhandler.c
 
new/roccat-tools-2.4.0/konepuremilitary/libkonepuremilitaryeventhandler/konepuremilitary_eventhandler.c
--- 
old/roccat-tools-2.3.0/konepuremilitary/libkonepuremilitaryeventhandler/konepuremilitary_eventhandler.c
     2015-01-10 20:10:13.000000000 +0100
+++ 
new/roccat-tools-2.4.0/konepuremilitary/libkonepuremilitaryeventhandler/konepuremilitary_eventhandler.c
     2015-01-25 17:36:09.000000000 +0100
@@ -403,7 +403,7 @@
                }
                break;
        default:
-               g_debug("unknown talk event of type 0x%2x", 
priv->active_talk_type);
+               g_debug("unknown talk event of type 0x%02x", 
priv->active_talk_type);
        }
 
        if (event == KONEPLUS_CHRDEV_EVENT_ACTION_RELEASE)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/roccat-tools-2.3.0/konepureoptical/libkonepureopticaleventhandler/konepureoptical_eventhandler.c
 
new/roccat-tools-2.4.0/konepureoptical/libkonepureopticaleventhandler/konepureoptical_eventhandler.c
--- 
old/roccat-tools-2.3.0/konepureoptical/libkonepureopticaleventhandler/konepureoptical_eventhandler.c
        2015-01-10 20:10:13.000000000 +0100
+++ 
new/roccat-tools-2.4.0/konepureoptical/libkonepureopticaleventhandler/konepureoptical_eventhandler.c
        2015-01-25 17:36:09.000000000 +0100
@@ -412,7 +412,7 @@
                }
                break;
        default:
-               g_debug("unknown talk event of type 0x%2x", 
priv->active_talk_type);
+               g_debug("unknown talk event of type 0x%02x", 
priv->active_talk_type);
        }
 
        if (event == KONEPLUS_CHRDEV_EVENT_ACTION_RELEASE)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roccat-tools-2.3.0/konextd/libkonextd/konextd.h 
new/roccat-tools-2.4.0/konextd/libkonextd/konextd.h
--- old/roccat-tools-2.3.0/konextd/libkonextd/konextd.h 2015-01-10 
20:10:13.000000000 +0100
+++ new/roccat-tools-2.4.0/konextd/libkonextd/konextd.h 2015-01-25 
17:36:09.000000000 +0100
@@ -43,9 +43,9 @@
        KONEXTD_CHRDEV_EVENT_TYPE_RAD_THUMB_2 = 0xe5,
        KONEXTD_CHRDEV_EVENT_TYPE_RAD_SCROLL_WHEEL_UP = 0xe6,
        KONEXTD_CHRDEV_EVENT_TYPE_RAD_SCROLL_WHEEL_DOWN = 0xe7,
-       KONEXTD_CHRDEV_EVENT_TYPE_RAD_EASYSHIFT = 0xe8, // only talk?
-       KONEXTD_CHRDEV_EVENT_TYPE_RAD_EASYAIM = 0xe9,
-       KONEXTD_CHRDEV_EVENT_TYPE_RAD_DISTANCE = 0xea, // TOTO unit
+       KONEXTD_CHRDEV_EVENT_TYPE_RAD_DISTANCE = 0xea, // TODO unit?
+       KONEXTD_CHRDEV_EVENT_TYPE_RAD_EASYSHIFT = 0xed,
+       KONEXTD_CHRDEV_EVENT_TYPE_RAD_EASYAIM = 0xee,
 } KonextdChrdevEventType;
 
 struct _KonextdSRom {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/roccat-tools-2.3.0/konextd/libkonextdeventhandler/konextd_eventhandler.c 
new/roccat-tools-2.4.0/konextd/libkonextdeventhandler/konextd_eventhandler.c
--- 
old/roccat-tools-2.3.0/konextd/libkonextdeventhandler/konextd_eventhandler.c    
    2015-01-10 20:10:13.000000000 +0100
+++ 
new/roccat-tools-2.4.0/konextd/libkonextdeventhandler/konextd_eventhandler.c    
    2015-01-25 17:36:09.000000000 +0100
@@ -423,7 +423,7 @@
                }
                break;
        default:
-               g_debug("unknown talk event of type 0x%2x", 
priv->active_talk_type);
+               g_debug("unknown talk event of type 0x%02x", 
priv->active_talk_type);
        }
 
        if (event == KONEPLUS_CHRDEV_EVENT_ACTION_RELEASE)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/roccat-tools-2.3.0/konextdoptical/libkonextdopticaleventhandler/konextdoptical_eventhandler.c
 
new/roccat-tools-2.4.0/konextdoptical/libkonextdopticaleventhandler/konextdoptical_eventhandler.c
--- 
old/roccat-tools-2.3.0/konextdoptical/libkonextdopticaleventhandler/konextdoptical_eventhandler.c
   2015-01-10 20:10:13.000000000 +0100
+++ 
new/roccat-tools-2.4.0/konextdoptical/libkonextdopticaleventhandler/konextdoptical_eventhandler.c
   2015-01-25 17:36:09.000000000 +0100
@@ -409,7 +409,7 @@
                }
                break;
        default:
-               g_debug("unknown talk event of type 0x%2x", 
priv->active_talk_type);
+               g_debug("unknown talk event of type 0x%02x", 
priv->active_talk_type);
        }
 
        if (event == KONEPLUS_CHRDEV_EVENT_ACTION_RELEASE)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/roccat-tools-2.3.0/konextdoptical/libkonextdopticaleventhandler/konextdoptical_eventhandler_channel.c
 
new/roccat-tools-2.4.0/konextdoptical/libkonextdopticaleventhandler/konextdoptical_eventhandler_channel.c
--- 
old/roccat-tools-2.3.0/konextdoptical/libkonextdopticaleventhandler/konextdoptical_eventhandler_channel.c
   2015-01-10 20:10:13.000000000 +0100
+++ 
new/roccat-tools-2.4.0/konextdoptical/libkonextdopticaleventhandler/konextdoptical_eventhandler_channel.c
   2015-01-25 17:36:09.000000000 +0100
@@ -92,7 +92,8 @@
                g_signal_emit((gpointer)eventhandler_channel, 
signals[OPEN_DRIVER], 0);
                break;
        case KONEPLUS_CHRDEV_EVENT_TYPE_TILT:
-               /* just ignore this event */
+       case KONEPLUS_CHRDEV_EVENT_TYPE_SCROLL:
+               /* just ignore these events */
                break;
        case KONEPLUS_CHRDEV_EVENT_TYPE_TIMER:
                if (event->data2 == KONEPLUS_CHRDEV_EVENT_ACTION_PRESS)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roccat-tools-2.3.0/libroccat/roccat_device_hidraw.c 
new/roccat-tools-2.4.0/libroccat/roccat_device_hidraw.c
--- old/roccat-tools-2.3.0/libroccat/roccat_device_hidraw.c     2015-01-10 
20:10:13.000000000 +0100
+++ new/roccat-tools-2.4.0/libroccat/roccat_device_hidraw.c     2015-01-25 
17:36:09.000000000 +0100
@@ -94,13 +94,13 @@
 
        gaminggear_device_unlock(GAMINGGEAR_DEVICE(roccat_device));
 
+       roccat_device_hidraw_debug(roccat_device, TRUE, buffer[0], (guchar 
const *)buffer, length);
+
        if (retval == -1) {
                g_set_error(error, G_FILE_ERROR, 
g_file_error_from_errno(errno), "Error in ioctl HIDIOCSFEATURE: %s", 
g_strerror(errno));
                return FALSE;
        }
 
-       roccat_device_hidraw_debug(roccat_device, TRUE, buffer[0], (guchar 
const *)buffer, length);
-
        return TRUE;
 #else
        g_set_error(error, G_FILE_ERROR, G_FILE_ERROR_NOSYS, "ioctl 
HIDIOCSFEATURE not implemented");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roccat-tools-2.3.0/libroccat/roccat_firmware.c 
new/roccat-tools-2.4.0/libroccat/roccat_firmware.c
--- old/roccat-tools-2.3.0/libroccat/roccat_firmware.c  2015-01-10 
20:10:13.000000000 +0100
+++ new/roccat-tools-2.4.0/libroccat/roccat_firmware.c  2015-01-25 
17:36:09.000000000 +0100
@@ -240,6 +240,7 @@
 
 gboolean roccat_firmware_state_tick(RoccatFirmwareState *state, GError 
**error) {
        guint8 const *chunk;
+       GError *local_error = NULL;
 
        switch (state->update_state) {
        case 0:
@@ -277,8 +278,15 @@
                        ++state->update_state;
                break;
        case 4:
-               if (!roccat_firmware_write_f(state->device, 
state->wait_after_34f, error))
-                       return FALSE;
+               if (!roccat_firmware_write_f(state->device, 
state->wait_after_34f, &local_error)) {
+                       if (g_error_matches(local_error, G_FILE_ERROR, 
G_FILE_ERROR_PIPE)) {
+                               /* It is normal for e.g. Tyon to reset without 
even answering to f */
+                               g_clear_error(&local_error);
+                       } else {
+                               g_propagate_error(error, local_error);
+                               return FALSE;
+                       }
+               }
                ++state->update_state;
                return FALSE;
                break;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roccat-tools-2.3.0/roccat-tools.spec 
new/roccat-tools-2.4.0/roccat-tools.spec
--- old/roccat-tools-2.3.0/roccat-tools.spec    2015-01-10 20:10:13.000000000 
+0100
+++ new/roccat-tools-2.4.0/roccat-tools.spec    2015-01-25 17:36:09.000000000 
+0100
@@ -1,5 +1,5 @@
 Name: roccat
-Version: 2.3.0
+Version: 2.4.0
 Release: 1
 License: GPL
 Source: roccat-tools-%{version}.tar.bz2
@@ -496,5 +496,5 @@
 %{prefix}/share/man/*/man1/tyon*
 
 %changelog
-* Sat Jan 10 2015 Stefan Achatz <[email protected]> 2.3.0-1
+* Sun Jan 25 2015 Stefan Achatz <[email protected]> 2.4.0-1
 - Initial version
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roccat-tools-2.3.0/ryos/libryos/ryos_rkp.c 
new/roccat-tools-2.4.0/ryos/libryos/ryos_rkp.c
--- old/roccat-tools-2.3.0/ryos/libryos/ryos_rkp.c      2015-01-10 
20:10:13.000000000 +0100
+++ new/roccat-tools-2.4.0/ryos/libryos/ryos_rkp.c      2015-01-25 
17:36:09.000000000 +0100
@@ -196,7 +196,7 @@
        guint i;
 
        for (i = 0; i < RYOS_KEYS_THUMBSTER_NUM * 2; ++i) {
-               if (!ryos_rkp_save_macro_when_needed(ryos, rkp, profile_index, 
ryos_keys_thumbster_index_to_macro_index(i), rkp->data.keys_macro.keys[i].type, 
error))
+               if (!ryos_rkp_save_macro_when_needed(ryos, rkp, profile_index, 
ryos_keys_thumbster_index_to_macro_index(i), 
rkp->data.keys_thumbster.keys[i].type, error))
                        return FALSE;
        }
 
@@ -223,7 +223,7 @@
        guint i;
 
        for (i = 0; i < RYOS_KEYS_EASYZONE_NUM; ++i) {
-               if (!ryos_rkp_save_macro_when_needed(ryos, rkp, profile_index, 
ryos_keys_easyzone_index_to_macro_index(i), rkp->data.keys_macro.keys[i].type, 
error))
+               if (!ryos_rkp_save_macro_when_needed(ryos, rkp, profile_index, 
ryos_keys_easyzone_index_to_macro_index(i), 
rkp->data.keys_easyzone.keys[i].type, error))
                        return FALSE;
        }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/roccat-tools-2.3.0/ryos/libryoseventhandler/ryos_eventhandler.c 
new/roccat-tools-2.4.0/ryos/libryoseventhandler/ryos_eventhandler.c
--- old/roccat-tools-2.3.0/ryos/libryoseventhandler/ryos_eventhandler.c 
2015-01-10 20:10:13.000000000 +0100
+++ new/roccat-tools-2.4.0/ryos/libryoseventhandler/ryos_eventhandler.c 
2015-01-25 17:36:09.000000000 +0100
@@ -462,7 +462,7 @@
                                
ryos_configuration_get_notification_volume(priv->config));
                break;
        default:
-               g_debug("unknown live recording event of type 0x%2x", event);
+               g_debug("unknown live recording event of type 0x%02x", event);
        }
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roccat-tools-2.3.0/tyon/libtyon/tyon_device.c 
new/roccat-tools-2.4.0/tyon/libtyon/tyon_device.c
--- old/roccat-tools-2.3.0/tyon/libtyon/tyon_device.c   2015-01-10 
20:10:13.000000000 +0100
+++ new/roccat-tools-2.4.0/tyon/libtyon/tyon_device.c   2015-01-25 
17:36:09.000000000 +0100
@@ -36,7 +36,7 @@
 }
 
 static gboolean tyon_check_write(RoccatDevice *device, GError **error) {
-       return roccat_check_write(device, TYON_COMMAND_CONTROL, 10, 10, error);
+       return roccat_check_write(device, TYON_COMMAND_CONTROL, 200, 500, 
error);
 }
 
 gboolean tyon_device_write(RoccatDevice *device, gchar const *buffer, gssize 
length, GError **error) {
@@ -49,9 +49,8 @@
        return tyon_check_write(device, error);
 }
 
-gboolean tyon_select(RoccatDevice *device, guint profile_index, guint request, 
GError **error) {
-       g_assert(profile_index < TYON_PROFILE_NUM);
-       if (!roccat_select(device, TYON_COMMAND_CONTROL, profile_index, 
request, error))
+gboolean tyon_select(RoccatDevice *device, guint profile_index, 
TyonControlDataIndex data_index, guint request, GError **error) {
+       if (!roccat_select(device, TYON_COMMAND_CONTROL, data_index | 
profile_index, request, error))
                return FALSE;
        return tyon_check_write(device, error);
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roccat-tools-2.3.0/tyon/libtyon/tyon_device.h 
new/roccat-tools-2.4.0/tyon/libtyon/tyon_device.h
--- old/roccat-tools-2.3.0/tyon/libtyon/tyon_device.h   2015-01-10 
20:10:13.000000000 +0100
+++ new/roccat-tools-2.4.0/tyon/libtyon/tyon_device.h   2015-01-25 
17:36:09.000000000 +0100
@@ -24,11 +24,18 @@
 
 typedef enum {
        TYON_CONTROL_REQUEST_CHECK = 0x00,
+       /* button indexes for requesting macros */
        TYON_CONTROL_REQUEST_PROFILE_SETTINGS = 0x80,
        TYON_CONTROL_REQUEST_PROFILE_BUTTONS = 0x90,
 } TyonControlRequest;
 
 typedef enum {
+       TYON_CONTROL_DATA_INDEX_NONE = 0x00,
+       TYON_CONTROL_DATA_INDEX_MACRO_1 = 0x10,
+       TYON_CONTROL_DATA_INDEX_MACRO_2 = 0x20,
+} TyonControlDataIndex;
+
+typedef enum {
        TYON_COMMAND_CONTROL = 0x04, /* 3 */
        TYON_COMMAND_PROFILE = 0x05, /* 3 */
        TYON_COMMAND_PROFILE_SETTINGS = 0x06, /* 30 */
@@ -57,7 +64,7 @@
 
 gchar *tyon_device_read(RoccatDevice *device, guint command, gssize length, 
GError **error);
 gboolean tyon_device_write(RoccatDevice *device, gchar const *buffer, gssize 
length, GError **error);
-gboolean tyon_select(RoccatDevice *device, guint profile_index, guint request, 
GError **error);
+gboolean tyon_select(RoccatDevice *device, guint profile_index, 
TyonControlDataIndex data_index, guint request, GError **error);
 guint tyon_add_event_watch(RoccatDevice *device, guint endpoint, GIOFunc 
callback, gpointer user_data, GError **error);
 
 G_END_DECLS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roccat-tools-2.3.0/tyon/libtyon/tyon_event.h 
new/roccat-tools-2.4.0/tyon/libtyon/tyon_event.h
--- old/roccat-tools-2.3.0/tyon/libtyon/tyon_event.h    2015-01-10 
20:10:13.000000000 +0100
+++ new/roccat-tools-2.4.0/tyon/libtyon/tyon_event.h    2015-01-25 
17:36:09.000000000 +0100
@@ -58,6 +58,7 @@
        TYON_EVENT_TYPE_RAD_EASYSHIFT = 0xe8,
        TYON_EVENT_TYPE_RAD_EASYAIM = 0xe9,
        TYON_EVENT_TYPE_RAD_DISTANCE = 0xea,
+       TYON_EVENT_TYPE_TALK = 0xff, /* data: button_nr, action: press/release 
*/
 } TyonEventType;
 
 typedef enum {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roccat-tools-2.3.0/tyon/libtyon/tyon_macro.c 
new/roccat-tools-2.4.0/tyon/libtyon/tyon_macro.c
--- old/roccat-tools-2.3.0/tyon/libtyon/tyon_macro.c    2015-01-10 
20:10:13.000000000 +0100
+++ new/roccat-tools-2.4.0/tyon/libtyon/tyon_macro.c    2015-01-25 
17:36:09.000000000 +0100
@@ -21,6 +21,28 @@
 #include "roccat.h"
 #include <string.h>
 
+typedef struct _TyonMacro1 TyonMacro1;
+typedef struct _TyonMacro2 TyonMacro2;
+
+enum {
+       TYON_MACRO_1_DATA_SIZE = 1024,
+       TYON_MACRO_2_DATA_SIZE = 973,
+       TYON_MACRO_2_UNUSED_SIZE = 51,
+};
+
+struct _TyonMacro1 {
+       guint8 command;
+       guint8 one;
+       guint8 data[TYON_MACRO_1_DATA_SIZE];
+} __attribute__ ((packed));
+
+struct _TyonMacro2 {
+       guint8 command;
+       guint8 two;
+       guint8 data[TYON_MACRO_2_DATA_SIZE];
+       guint8 unused[TYON_MACRO_2_UNUSED_SIZE];
+} __attribute__ ((packed));
+
 void tyon_macro_set_macroset_name(TyonMacro *macro, gchar const *new_name) {
        g_strlcpy((gchar *)(macro->macroset_name), new_name, 
TYON_MACRO_MACROSET_NAME_LENGTH);
 }
@@ -29,35 +51,78 @@
        g_strlcpy((gchar *)(macro->macro_name), new_name, 
TYON_MACRO_MACRO_NAME_LENGTH);
 }
 
-static void tyon_macro_finalize(TyonMacro *macro, guint command, guint 
profile_index, guint button_index) {
-       macro->command = command;
-       macro->one = 1;
+static void tyon_macro_finalize(TyonMacro *macro, guint profile_index, guint 
button_index) {
        macro->profile_index = profile_index;
        macro->button_index = button_index;
 }
 
 gboolean tyon_macro_write(RoccatDevice *tyon, guint profile_index, guint 
button_index, TyonMacro *macro, GError **error) {
+       TyonMacro1 macro1;
+       TyonMacro2 macro2;
+       gboolean result;
+
        g_assert(profile_index < TYON_PROFILE_NUM);
-       tyon_macro_finalize(macro, TYON_COMMAND_MACRO, profile_index, 
button_index);
-       return tyon_device_write(tyon, (gchar const *)macro, sizeof(TyonMacro), 
error);
+
+       tyon_macro_finalize(macro, profile_index, button_index);
+
+       macro1.command = TYON_COMMAND_MACRO;
+       macro1.one = 1;
+       memcpy(macro1.data, macro, TYON_MACRO_1_DATA_SIZE);
+
+       macro2.command = TYON_COMMAND_MACRO;
+       macro2.two = 2;
+       memcpy(macro2.data, (guint8 *)macro + TYON_MACRO_1_DATA_SIZE, 
TYON_MACRO_2_DATA_SIZE);
+       memset(macro2.unused, 0, TYON_MACRO_2_UNUSED_SIZE);
+
+       result = tyon_device_write(tyon, (gchar const *)&macro1, 
sizeof(TyonMacro1), error);
+       if (!result)
+               return FALSE;
+
+       return tyon_device_write(tyon, (gchar const *)&macro2, 
sizeof(TyonMacro2), error);
 }
 
 TyonMacro *tyon_macro_read(RoccatDevice *tyon, guint profile_index, guint 
button_index, GError **error) {
+       TyonMacro1 *macro1;
+       TyonMacro2 *macro2;
        TyonMacro *macro;
 
        g_assert(profile_index < TYON_PROFILE_NUM);
 
        gaminggear_device_lock(GAMINGGEAR_DEVICE(tyon));
 
-       if (!tyon_select(tyon, profile_index, button_index, error)) {
+       if (!tyon_select(tyon, profile_index, TYON_CONTROL_DATA_INDEX_MACRO_1, 
button_index, error)) {
                gaminggear_device_unlock(GAMINGGEAR_DEVICE(tyon));
                return NULL;
        }
 
-       macro = (TyonMacro *)tyon_device_read(tyon, TYON_COMMAND_MACRO, 
sizeof(TyonMacro), error);
+       macro1 = (TyonMacro1 *)tyon_device_read(tyon, TYON_COMMAND_MACRO, 
sizeof(TyonMacro1), error);
+       if (!macro1) {
+               gaminggear_device_unlock(GAMINGGEAR_DEVICE(tyon));
+               return NULL;
+       }
+
+       if (!tyon_select(tyon, profile_index, TYON_CONTROL_DATA_INDEX_MACRO_2, 
button_index, error)) {
+               gaminggear_device_unlock(GAMINGGEAR_DEVICE(tyon));
+               g_free(macro1);
+               return NULL;
+       }
+
+       macro2 = (TyonMacro2 *)tyon_device_read(tyon, TYON_COMMAND_MACRO, 
sizeof(TyonMacro2), error);
+       if (!macro2) {
+               gaminggear_device_unlock(GAMINGGEAR_DEVICE(tyon));
+               g_free(macro1);
+               return NULL;
+       }
 
        gaminggear_device_unlock(GAMINGGEAR_DEVICE(tyon));
 
+       macro = (TyonMacro *)g_malloc(sizeof(TyonMacro));
+       memcpy(macro, macro1->data, TYON_MACRO_1_DATA_SIZE);
+       memcpy((guint8 *)macro + TYON_MACRO_1_DATA_SIZE, macro2->data, 
TYON_MACRO_2_DATA_SIZE);
+
+       g_free(macro1);
+       g_free(macro2);
+
        return macro;
 }
 
@@ -123,7 +188,7 @@
 
 gboolean tyon_macro_equal(TyonMacro const *left, TyonMacro const *right) {
        gboolean equal;
-       equal = ROCCAT_MEMCMP_PARTIALLY(left, right, TyonMacro, loop, unused2);
+       equal = ROCCAT_MEMCMP_PARTIALLY_TO_END(left, right, TyonMacro, loop);
        return equal ? FALSE : TRUE;
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roccat-tools-2.3.0/tyon/libtyon/tyon_macro.h 
new/roccat-tools-2.4.0/tyon/libtyon/tyon_macro.h
--- old/roccat-tools-2.3.0/tyon/libtyon/tyon_macro.h    2015-01-10 
20:10:13.000000000 +0100
+++ new/roccat-tools-2.4.0/tyon/libtyon/tyon_macro.h    2015-01-25 
17:36:09.000000000 +0100
@@ -27,7 +27,7 @@
 enum {
        TYON_MACRO_MACROSET_NAME_LENGTH = 24,
        TYON_MACRO_MACRO_NAME_LENGTH = 24,
-       TYON_MACRO_KEYSTROKES_NUM = 236,
+       TYON_MACRO_KEYSTROKES_NUM = 480,
 };
 
 typedef struct _TyonKeystroke TyonKeystroke;
@@ -52,9 +52,8 @@
        TYON_KEYSTROKE_ACTION_RELEASE = 2,
 } TyonKeystrokeAction;
 
+/* This structure is transferred to hardware in 2 parts */
 struct _TyonMacro {
-       guint8 command; /* TYON_COMMAND_MACRO */
-       guint8 one;
        guint8 profile_index;
        guint8 button_index;
        guint8 loop;
@@ -63,7 +62,6 @@
        guint8 macro_name[TYON_MACRO_MACRO_NAME_LENGTH];
        guint16 count;
        TyonKeystroke keystrokes[TYON_MACRO_KEYSTROKES_NUM];
-       guint8 unused2[3];
 } __attribute__ ((packed));
 
 static inline guint16 tyon_macro_get_count(TyonMacro const *macro) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/roccat-tools-2.3.0/tyon/libtyon/tyon_profile_buttons.c 
new/roccat-tools-2.4.0/tyon/libtyon/tyon_profile_buttons.c
--- old/roccat-tools-2.3.0/tyon/libtyon/tyon_profile_buttons.c  2015-01-10 
20:10:13.000000000 +0100
+++ new/roccat-tools-2.4.0/tyon/libtyon/tyon_profile_buttons.c  2015-01-25 
17:36:09.000000000 +0100
@@ -38,7 +38,7 @@
 
        gaminggear_device_lock(GAMINGGEAR_DEVICE(device));
 
-       if (!tyon_select(device, profile_index, 
TYON_CONTROL_REQUEST_PROFILE_BUTTONS, error)) {
+       if (!tyon_select(device, profile_index, TYON_CONTROL_DATA_INDEX_NONE, 
TYON_CONTROL_REQUEST_PROFILE_BUTTONS, error)) {
                g_clear_error(error);
                gaminggear_device_unlock(GAMINGGEAR_DEVICE(device));
                return NULL;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/roccat-tools-2.3.0/tyon/libtyon/tyon_profile_settings.c 
new/roccat-tools-2.4.0/tyon/libtyon/tyon_profile_settings.c
--- old/roccat-tools-2.3.0/tyon/libtyon/tyon_profile_settings.c 2015-01-10 
20:10:13.000000000 +0100
+++ new/roccat-tools-2.4.0/tyon/libtyon/tyon_profile_settings.c 2015-01-25 
17:36:09.000000000 +0100
@@ -48,7 +48,7 @@
 
        gaminggear_device_lock(GAMINGGEAR_DEVICE(device));
 
-       if (!tyon_select(device, profile_index, 
TYON_CONTROL_REQUEST_PROFILE_SETTINGS, error)) {
+       if (!tyon_select(device, profile_index, TYON_CONTROL_DATA_INDEX_NONE, 
TYON_CONTROL_REQUEST_PROFILE_SETTINGS, error)) {
                g_clear_error(error);
                gaminggear_device_unlock(GAMINGGEAR_DEVICE(device));
                return NULL;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/roccat-tools-2.3.0/tyon/libtyon/tyon_profile_settings.h 
new/roccat-tools-2.4.0/tyon/libtyon/tyon_profile_settings.h
--- old/roccat-tools-2.3.0/tyon/libtyon/tyon_profile_settings.h 2015-01-10 
20:10:13.000000000 +0100
+++ new/roccat-tools-2.4.0/tyon/libtyon/tyon_profile_settings.h 2015-01-25 
17:36:09.000000000 +0100
@@ -25,6 +25,10 @@
 
 enum {
        TYON_PROFILE_SETTINGS_CPI_LEVELS_NUM = 5,
+       TYON_PROFILE_SETTINGS_POLLING_RATE_MASK = 0x0f,
+       TYON_PROFILE_SETTINGS_TALKFX_MASK = 0xf0,
+       TYON_PROFILE_SETTINGS_POLLING_RATE_SHIFT = 0,
+       TYON_PROFILE_SETTINGS_TALKFX_SHIFT = 4,
 };
 
 typedef struct _TyonProfileSettings TyonProfileSettings;
@@ -48,7 +52,7 @@
        guint8 cpi_levels_enabled;
        guint8 cpi_levels[TYON_PROFILE_SETTINGS_CPI_LEVELS_NUM];
        guint8 cpi_active; /* range 0-4 */
-       guint8 polling_rate;
+       guint8 talkfx_polling_rate;
        guint8 lights_enabled;
        guint8 color_flow;
        guint8 light_effect;
@@ -57,6 +61,22 @@
        guint16 checksum;
 } __attribute__ ((packed));
 
+static inline guint8 
tyon_profile_settings_get_polling_rate(TyonProfileSettings const 
*profile_settings) {
+       return (profile_settings->talkfx_polling_rate & 
TYON_PROFILE_SETTINGS_POLLING_RATE_MASK) >> 
TYON_PROFILE_SETTINGS_POLLING_RATE_SHIFT;
+}
+
+static inline guint8 tyon_profile_settings_get_talkfx(TyonProfileSettings 
const *profile_settings) {
+       return (profile_settings->talkfx_polling_rate & 
TYON_PROFILE_SETTINGS_TALKFX_MASK) >> TYON_PROFILE_SETTINGS_TALKFX_SHIFT;
+}
+
+static inline void tyon_profile_settings_set_polling_rate(TyonProfileSettings 
*profile_settings, guint8 new_value) {
+       profile_settings->talkfx_polling_rate = 
(profile_settings->talkfx_polling_rate & TYON_PROFILE_SETTINGS_TALKFX_MASK) | 
(new_value << TYON_PROFILE_SETTINGS_POLLING_RATE_SHIFT);
+}
+
+static inline void tyon_profile_settings_set_talkfx(TyonProfileSettings 
*profile_settings, guint8 new_value) {
+       profile_settings->talkfx_polling_rate = 
(profile_settings->talkfx_polling_rate & 
TYON_PROFILE_SETTINGS_POLLING_RATE_MASK) | (new_value << 
TYON_PROFILE_SETTINGS_TALKFX_SHIFT);
+}
+
 typedef enum {
        TYON_PROFILE_SETTINGS_ADVANCED_SENSITIVITY_OFF = 0,
        TYON_PROFILE_SETTINGS_ADVANCED_SENSITIVITY_ON = 1,
@@ -75,6 +95,11 @@
 } TyonProfileSettingsPollingRate;
 
 typedef enum {
+       TYON_PROFILE_SETTINGS_TALKFX_ON = 0,
+       TYON_PROFILE_SETTINGS_TALKFX_OFF = 1,
+} TyonProfileSettingsTalkfx;
+
+typedef enum {
        TYON_PROFILE_SETTINGS_LIGHTS_ENABLED_BIT_WHEEL = 0,
        TYON_PROFILE_SETTINGS_LIGHTS_ENABLED_BIT_BOTTOM = 1,
        TYON_PROFILE_SETTINGS_LIGHTS_ENABLED_BIT_CUSTOM_COLOR = 4,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roccat-tools-2.3.0/tyon/libtyon/tyon_rmp.h 
new/roccat-tools-2.4.0/tyon/libtyon/tyon_rmp.h
--- old/roccat-tools-2.3.0/tyon/libtyon/tyon_rmp.h      2015-01-10 
20:10:13.000000000 +0100
+++ new/roccat-tools-2.4.0/tyon/libtyon/tyon_rmp.h      2015-01-25 
17:36:09.000000000 +0100
@@ -96,6 +96,8 @@
 //void tyon_rmp_set_color_options(TyonRmp *rmp, guint value);
 void tyon_rmp_set_use_color_for_all(TyonRmp *rmp, guint value);
 guint tyon_rmp_get_use_color_for_all(TyonRmp *rmp);
+void tyon_rmp_set_talkfx(TyonRmp *rmp, guint value);
+guint tyon_rmp_get_talkfx(TyonRmp *rmp);
 
 guint tyon_rmp_cpi_to_bin(guint rmp_value);
 guint tyon_bin_cpi_to_rmp(guint bin_value);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roccat-tools-2.3.0/tyon/libtyon/tyon_rmp_accessors.c 
new/roccat-tools-2.4.0/tyon/libtyon/tyon_rmp_accessors.c
--- old/roccat-tools-2.3.0/tyon/libtyon/tyon_rmp_accessors.c    2015-01-10 
20:10:13.000000000 +0100
+++ new/roccat-tools-2.4.0/tyon/libtyon/tyon_rmp_accessors.c    2015-01-25 
17:36:09.000000000 +0100
@@ -43,6 +43,7 @@
 static gchar const * const tyon_rmp_color_options_name = "ColorOptions";
 static gchar const * const tyon_rmp_color_change_mode_name = "ColorChangeMode";
 static gchar const * const tyon_rmp_use_color_for_all_name = "UseColorForAll";
+static gchar const * const tyon_rmp_talkfx_name = "HDDKeyboard";
 
 static gchar *tyon_rmp_create_macro_key_info_name(guint index) {
        g_assert(index < TYON_PROFILE_BUTTON_NUM);
@@ -403,3 +404,11 @@
 guint tyon_rmp_get_use_color_for_all(TyonRmp *rmp) {
        return tyon_rmp_get_value(rmp, tyon_rmp_use_color_for_all_name);
 }
+
+void tyon_rmp_set_talkfx(TyonRmp *rmp, guint value) {
+       tyon_rmp_set_value_settings(rmp, tyon_rmp_talkfx_name, value);
+}
+
+guint tyon_rmp_get_talkfx(TyonRmp *rmp) {
+       return tyon_rmp_get_value(rmp, tyon_rmp_talkfx_name);
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/roccat-tools-2.3.0/tyon/libtyon/tyon_rmp_conversions.c 
new/roccat-tools-2.4.0/tyon/libtyon/tyon_rmp_conversions.c
--- old/roccat-tools-2.3.0/tyon/libtyon/tyon_rmp_conversions.c  2015-01-10 
20:10:13.000000000 +0100
+++ new/roccat-tools-2.4.0/tyon/libtyon/tyon_rmp_conversions.c  2015-01-25 
17:36:09.000000000 +0100
@@ -52,7 +52,8 @@
        settings->cpi_levels_enabled = tyon_rmp_get_cpi_all(rmp);
        settings->cpi_active = tyon_rmp_get_cpi_x(rmp);
 
-       settings->polling_rate = tyon_rmp_get_polling_rate(rmp);
+       tyon_profile_settings_set_polling_rate(settings, 
tyon_rmp_get_polling_rate(rmp));
+       tyon_profile_settings_set_talkfx(settings, tyon_rmp_get_talkfx(rmp));
 
        custom_color = tyon_rmp_get_light_chose_type(rmp);
        roccat_set_bit(&settings->lights_enabled, 
TYON_PROFILE_SETTINGS_LIGHTS_ENABLED_BIT_CUSTOM_COLOR,
@@ -111,7 +112,8 @@
        tyon_rmp_set_light_effect_speed(rmp, profile_settings->effect_speed);
        tyon_rmp_set_light_color_flow(rmp, profile_settings->color_flow);
 
-       tyon_rmp_set_polling_rate(rmp, profile_settings->polling_rate);
+       tyon_rmp_set_polling_rate(rmp, 
tyon_profile_settings_get_polling_rate(profile_settings));
+       tyon_rmp_set_talkfx(rmp, 
tyon_profile_settings_get_talkfx(profile_settings));
 }
 
 static void tyon_profile_buttons_set_button(TyonRmp *rmp, guint index,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/roccat-tools-2.3.0/tyon/libtyon/tyon_rmp_macro_key_info.c 
new/roccat-tools-2.4.0/tyon/libtyon/tyon_rmp_macro_key_info.c
--- old/roccat-tools-2.3.0/tyon/libtyon/tyon_rmp_macro_key_info.c       
2015-01-10 20:10:13.000000000 +0100
+++ new/roccat-tools-2.4.0/tyon/libtyon/tyon_rmp_macro_key_info.c       
2015-01-25 17:36:09.000000000 +0100
@@ -159,7 +159,6 @@
 
        macro = g_malloc0(sizeof(TyonMacro));
 
-       macro->command = TYON_COMMAND_MACRO;
        macro->button_index = macro_key_info->button_index;
        macro->loop = tyon_rmp_macro_key_info_get_loop(macro_key_info);
        tyon_macro_set_macroset_name(macro, (gchar const 
*)macro_key_info->macroset_name);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/roccat-tools-2.3.0/tyon/libtyon/tyon_rmp_macro_key_info.h 
new/roccat-tools-2.4.0/tyon/libtyon/tyon_rmp_macro_key_info.h
--- old/roccat-tools-2.3.0/tyon/libtyon/tyon_rmp_macro_key_info.h       
2015-01-10 20:10:13.000000000 +0100
+++ new/roccat-tools-2.4.0/tyon/libtyon/tyon_rmp_macro_key_info.h       
2015-01-25 17:36:09.000000000 +0100
@@ -29,7 +29,7 @@
 enum {
        TYON_RMP_MACRO_KEY_INFO_MACROSET_NAME_LENGTH = 50,
        TYON_RMP_MACRO_KEY_INFO_MACRO_NAME_LENGTH = 50,
-       TYON_RMP_MACRO_KEY_INFO_KEYSTROKES_NUM = 500,
+       TYON_RMP_MACRO_KEY_INFO_KEYSTROKES_NUM = TYON_MACRO_KEYSTROKES_NUM,
        TYON_RMP_MACRO_KEY_INFO_TIMER_NAME_LENGTH = 100,
        TYON_RMP_MACRO_KEY_INFO_FILENAME_LENGTH = 260,
 };
@@ -46,7 +46,7 @@
        guint32 loop;
        guint16 count;
        TyonKeystroke keystrokes[TYON_RMP_MACRO_KEY_INFO_KEYSTROKES_NUM];
-       guint16 unused4;
+       guint8 unused4[82];
        guint32 timer_length;
        guint8 timer_name[TYON_RMP_MACRO_KEY_INFO_TIMER_NAME_LENGTH];
        guint8 filename[TYON_RMP_MACRO_KEY_INFO_FILENAME_LENGTH];
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/roccat-tools-2.3.0/tyon/libtyoneventhandler/tyon_eventhandler.c 
new/roccat-tools-2.4.0/tyon/libtyoneventhandler/tyon_eventhandler.c
--- old/roccat-tools-2.3.0/tyon/libtyoneventhandler/tyon_eventhandler.c 
2015-01-10 20:10:13.000000000 +0100
+++ new/roccat-tools-2.4.0/tyon/libtyoneventhandler/tyon_eventhandler.c 
2015-01-25 17:36:09.000000000 +0100
@@ -199,17 +199,26 @@
        return retval;
 }
 
+static gboolean should_execute_fx(TyonEventhandler *eventhandler) {
+       TyonEventhandlerPrivate *priv = eventhandler->priv;
+       return tyon_rmp_get_talkfx(priv->rmp[priv->actual_profile_index]) == 
TYON_PROFILE_SETTINGS_TALKFX_ON;
+}
+
 static gboolean set_led_rgb(TyonEventhandler *eventhandler, guint32 effect, 
guint32 ambient_color, guint32 event_color) {
        TyonEventhandlerPrivate *priv = eventhandler->priv;
        GError *error = NULL;
-       gboolean retval = FALSE;
+       gboolean retval;
 
-       if (priv->device_set_up) {
-               retval = tyon_talkfx(priv->device, effect, ambient_color, 
event_color, &error);
-               if (error) {
-                       g_warning("Error issuing talkfx: %s", error->message);
-                       g_clear_error(&error);
-               }
+       if (!should_execute_fx(eventhandler))
+               return FALSE;
+
+       if (!priv->device_set_up)
+               return FALSE;
+
+       retval = tyon_talkfx(priv->device, effect, ambient_color, event_color, 
&error);
+       if (error) {
+               g_warning("Error issuing talkfx: %s", error->message);
+               g_clear_error(&error);
        }
 
        return retval;
@@ -218,14 +227,18 @@
 static gboolean restore_led_rgb(TyonEventhandler *eventhandler) {
        TyonEventhandlerPrivate *priv = eventhandler->priv;
        GError *error = NULL;
-       gboolean retval = FALSE;
+       gboolean retval;
 
-       if (priv->device_set_up) {
-               retval = tyon_talkfx_off(priv->device, &error);
-               if (error) {
-                       g_warning("Error issuing talkfx_off: %s", 
error->message);
-                       g_clear_error(&error);
-               }
+       if (!should_execute_fx(eventhandler))
+               return FALSE;
+
+       if (!priv->device_set_up)
+               return FALSE;
+
+       retval = tyon_talkfx_off(priv->device, &error);
+       if (error) {
+               g_warning("Error issuing talkfx_off: %s", error->message);
+               g_clear_error(&error);
        }
 
        return retval;
@@ -394,8 +407,6 @@
                priv->active_talk_type = macro_key_info->type;
                priv->active_talk_device = 
tyon_rmp_macro_key_info_get_talk_device(macro_key_info);
                tyon_rmp_macro_key_info_free(macro_key_info);
-       } else {
-               priv->active_talk_type = TYON_BUTTON_TYPE_DISABLED;
        }
 
        switch (priv->active_talk_type) {
@@ -420,8 +431,11 @@
                }
                break;
        default:
-               g_debug("unknown talk event of type 0x%2x", 
priv->active_talk_type);
+               g_debug("unknown talk event of type 0x%02x", 
priv->active_talk_type);
        }
+
+       if (event == TYON_EVENT_ACTION_RELEASE)
+               priv->active_talk_type = TYON_BUTTON_TYPE_DISABLED;
 }
 
 static void timer_start_cb(TyonEventhandlerChannel *channel, guchar key_index, 
gpointer user_data) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/roccat-tools-2.3.0/tyon/libtyoneventhandler/tyon_eventhandler_channel.c 
new/roccat-tools-2.4.0/tyon/libtyoneventhandler/tyon_eventhandler_channel.c
--- old/roccat-tools-2.3.0/tyon/libtyoneventhandler/tyon_eventhandler_channel.c 
2015-01-10 20:10:13.000000000 +0100
+++ new/roccat-tools-2.4.0/tyon/libtyoneventhandler/tyon_eventhandler_channel.c 
2015-01-25 17:36:09.000000000 +0100
@@ -105,9 +105,9 @@
                break;
        case TYON_EVENT_TYPE_MULTIMEDIA:
                break;
-//     case TYON_EVENT_TYPE_TALK:
-//             g_signal_emit((gpointer)eventhandler_channel, signals[TALK], 0, 
event->data - 1, event->action); // FIXME check
-//             break;
+       case TYON_EVENT_TYPE_TALK:
+               g_signal_emit((gpointer)eventhandler_channel, signals[TALK], 0, 
event->data - 1, event->action);
+               break;
        default:
                string = roccat_data_to_string((guchar const *)event, 
sizeof(TyonEvent));
                g_debug("unknown event = %s", string);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/roccat-tools-2.3.0/tyon/tyonconfig/tyon_profile_page.c 
new/roccat-tools-2.4.0/tyon/tyonconfig/tyon_profile_page.c
--- old/roccat-tools-2.3.0/tyon/tyonconfig/tyon_profile_page.c  2015-01-10 
20:10:13.000000000 +0100
+++ new/roccat-tools-2.4.0/tyon/tyonconfig/tyon_profile_page.c  2015-01-25 
17:36:09.000000000 +0100
@@ -23,6 +23,7 @@
 #include "tyon_color_frame.h"
 #include "tyon_cpi_selector.h"
 #include "roccat_gamefile_selector.h"
+#include "roccat_talkfx_selector.h"
 
 #define TYON_PROFILE_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), 
TYON_PROFILE_PAGE_TYPE, TyonProfilePageClass))
 #define IS_TYON_PROFILE_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), 
TYON_PROFILE_PAGE_TYPE))
@@ -49,6 +50,7 @@
        TyonSensitivitySelector *sensitivity;
        TyonLightEffectsFrame *light_effects;
        TyonColorFrame *colors;
+       RoccatTalkFXSelector *talkfx;
 };
 
 G_DEFINE_TYPE(TyonProfilePage, tyon_profile_page, ROCCAT_PROFILE_PAGE_TYPE);
@@ -75,6 +77,7 @@
        tyon_color_frame_set_from_rmp(priv->colors, priv->rmp);
        tyon_cpi_selector_set_from_rmp(priv->cpi, priv->rmp);
        tyon_polling_rate_selector_set_value(priv->polling_rate, 
tyon_rmp_get_polling_rate(priv->rmp));
+       roccat_talkfx_selector_set_active(priv->talkfx, 
tyon_rmp_get_talkfx(priv->rmp) == TYON_PROFILE_SETTINGS_TALKFX_ON ? TRUE : 
FALSE);
 
        for (i = 0; i < TYON_GAMEFILE_NUM; ++i)
                roccat_gamefile_selector_set_text(priv->gamefiles, i, 
tyon_rmp_get_game_file_name(priv->rmp, i));
@@ -95,6 +98,7 @@
        tyon_color_frame_update_rmp(priv->colors, rmp);
        tyon_cpi_selector_update_rmp(priv->cpi, rmp);
        tyon_rmp_set_polling_rate(rmp, 
tyon_polling_rate_selector_get_value(priv->polling_rate));
+       tyon_rmp_set_talkfx(rmp, 
roccat_talkfx_selector_get_active(priv->talkfx) ? 
TYON_PROFILE_SETTINGS_TALKFX_ON : TYON_PROFILE_SETTINGS_TALKFX_OFF);
 
        for (i = 0; i < TYON_GAMEFILE_NUM; ++i)
                tyon_rmp_set_game_file_name(rmp, i, 
roccat_gamefile_selector_get_text(priv->gamefiles, i));
@@ -126,6 +130,7 @@
        priv->sensitivity = 
TYON_SENSITIVITY_SELECTOR(tyon_sensitivity_selector_new());
        priv->light_effects = 
TYON_LIGHT_EFFECTS_FRAME(tyon_light_effects_frame_new());
        priv->colors = TYON_COLOR_FRAME(tyon_color_frame_new());
+       priv->talkfx = ROCCAT_TALKFX_SELECTOR(roccat_talkfx_selector_new());
 
        gtk_box_pack_start(GTK_BOX(light), GTK_WIDGET(priv->colors), TRUE, 
TRUE, 0);
        gtk_box_pack_start(GTK_BOX(light), GTK_WIDGET(priv->light_effects), 
TRUE, TRUE, 0);
@@ -134,6 +139,7 @@
        gtk_box_pack_start(GTK_BOX(right), GTK_WIDGET(priv->polling_rate), 
TRUE, TRUE, 0);
        gtk_box_pack_start(GTK_BOX(right), GTK_WIDGET(priv->gamefiles), TRUE, 
TRUE, 0);
        gtk_box_pack_start(GTK_BOX(left), light, TRUE, TRUE, 0);
+       gtk_box_pack_start(GTK_BOX(left), GTK_WIDGET(priv->talkfx), FALSE, 
FALSE, 0);
        gtk_box_pack_start(GTK_BOX(left), GTK_WIDGET(priv->cpi), TRUE, TRUE, 0);
 
        gtk_container_add(GTK_CONTAINER(sense_frame), 
GTK_WIDGET(priv->sensitivity));

-- 
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to