keys: fix signed overflow
[vlc.git] / src / config / keys.c
index 7fcbc37..b247a57 100644 (file)
@@ -108,6 +108,8 @@ static const struct key_descriptor_s vlc_keys[] =
     { N_("Mouse Wheel Up"),    KEY_MOUSEWHEELUP      },
     { N_("Page Down"),         KEY_PAGEDOWN          },
     { N_("Page Up"),           KEY_PAGEUP            },
+    { N_("Pause"),             KEY_PAUSE             },
+    { N_("Print"),             KEY_PRINT             },
     { N_("Right"),             KEY_RIGHT             },
     { N_("Space"),             ' '                   },
     { N_("Tab"),               KEY_TAB               },
@@ -351,6 +353,7 @@ static const struct action actions[] =
     { "subsync-markaudio", ACTIONID_SUBSYNC_MARKAUDIO, },
     { "subsync-marksub", ACTIONID_SUBSYNC_MARKSUB, },
     { "subsync-reset", ACTIONID_SUBSYNC_RESET, },
+    { "subtitle-toggle", ACTIONID_SUBTITLE_TOGGLE, },
     { "subtitle-track", ACTIONID_SUBTITLE_TRACK, },
     { "title-next", ACTIONID_TITLE_NEXT, },
     { "title-prev", ACTIONID_TITLE_PREV, },
@@ -383,18 +386,14 @@ static int keycmp (const void *a, const void *b)
 {
     const struct mapping *ka = a, *kb = b;
 
-#if (INT_MAX >= 0x7fffffff)
-    return ka->key - kb->key;
-#else
     return (ka->key < kb->key) ? -1 : (ka->key > kb->key) ? +1 : 0;
-#endif
 }
 
 struct vlc_actions
 {
     void *map; /* Key map */
     void *global_map; /* Grabbed/global key map */
-    struct hotkey keys[0];
+    struct hotkey keys[1];
 };
 
 static int vlc_key_to_action (vlc_object_t *obj, const char *varname,
@@ -435,6 +434,34 @@ static int vlc_AddMapping (void **map, uint32_t keycode, vlc_action_t action)
     return 0;
 }
 
+static void vlc_AddWheelMapping (void **map, uint32_t kmore, uint32_t kless,
+                                 int mode)
+{
+    vlc_action_t amore = ACTIONID_NONE, aless = ACTIONID_NONE;
+
+    switch (mode)
+    {
+        case 0: /* volume up/down */
+            amore = ACTIONID_VOL_UP;
+            aless = ACTIONID_VOL_DOWN;
+            break;
+        case 2: /* position latter/earlier */
+            amore = ACTIONID_JUMP_FORWARD_EXTRASHORT;
+            aless = ACTIONID_JUMP_BACKWARD_EXTRASHORT;
+            break;
+        case 3: /* position earlier/latter */
+            amore = ACTIONID_JUMP_BACKWARD_EXTRASHORT;
+            aless = ACTIONID_JUMP_FORWARD_EXTRASHORT;
+            break;
+    }
+
+    if (amore != ACTIONID_NONE)
+        vlc_AddMapping (map, kmore, amore);
+    if (aless != ACTIONID_NONE)
+        vlc_AddMapping (map, kless, aless);
+}
+
+
 /**
  * Sets up all key mappings for a given action.
  * \param map tree (of struct mapping entries) to write mappings to
@@ -472,7 +499,7 @@ struct vlc_actions *vlc_InitActions (libvlc_int_t *libvlc)
 {
     vlc_object_t *obj = VLC_OBJECT(libvlc);
     struct hotkey *keys;
-    struct vlc_actions *as = malloc (sizeof (*as) + (ACTIONS_COUNT + 1) * sizeof (*keys));
+    struct vlc_actions *as = malloc (sizeof (*as) + ACTIONS_COUNT * sizeof (*keys));
 
     if (unlikely(as == NULL))
         return NULL;
@@ -508,23 +535,10 @@ struct vlc_actions *vlc_InitActions (libvlc_int_t *libvlc)
     keys->psz_action = NULL;
 
     /* Initialize mouse wheel events */
-    int mousemode = var_InheritInteger (obj, "hotkeys-mousewheel-mode");
-    if (mousemode < 2)
-    {
-        vlc_AddMapping (&as->map,
-                        mousemode ? KEY_MOUSEWHEELRIGHT : KEY_MOUSEWHEELUP,
-                        ACTIONID_VOL_UP);
-        vlc_AddMapping (&as->map,
-                        mousemode ? KEY_MOUSEWHEELLEFT : KEY_MOUSEWHEELDOWN,
-                        ACTIONID_VOL_DOWN);
-        vlc_AddMapping (&as->map,
-                        mousemode ? KEY_MOUSEWHEELUP : KEY_MOUSEWHEELRIGHT,
-                        ACTIONID_JUMP_FORWARD_EXTRASHORT);
-        vlc_AddMapping (&as->map,
-                        mousemode ? KEY_MOUSEWHEELDOWN : KEY_MOUSEWHEELLEFT,
-                        ACTIONID_JUMP_BACKWARD_EXTRASHORT);
-    }
-
+    vlc_AddWheelMapping (&as->map, KEY_MOUSEWHEELRIGHT, KEY_MOUSEWHEELLEFT,
+                         var_InheritInteger (obj, "hotkeys-x-wheel-mode"));
+    vlc_AddWheelMapping (&as->map, KEY_MOUSEWHEELUP, KEY_MOUSEWHEELDOWN,
+                         var_InheritInteger (obj, "hotkeys-y-wheel-mode"));
 
     libvlc->p_hotkeys = as->keys;
     var_AddCallback (obj, "key-pressed", vlc_key_to_action, &as->map);