keys: fix signed overflow
[vlc.git] / src / config / keys.c
index 24c3061..b247a57 100644 (file)
@@ -38,6 +38,7 @@
 #ifdef HAVE_SEARCH_H
 # include <search.h>
 #endif
+#include <errno.h>
 
 #include <vlc_common.h>
 #include <vlc_keys.h>
@@ -53,6 +54,8 @@ typedef struct key_descriptor_s
 static const struct key_descriptor_s vlc_keys[] =
 {   /* Alphabetical order */
     { N_("Backspace"),         KEY_BACKSPACE         },
+    { N_("Brightness Down"),   KEY_BRIGHTNESS_DOWN   },
+    { N_("Brightness Up"),     KEY_BRIGHTNESS_UP     },
     { N_("Browser Back"),      KEY_BROWSER_BACK      },
     { N_("Browser Favorites"), KEY_BROWSER_FAVORITES },
     { N_("Browser Forward"),   KEY_BROWSER_FORWARD   },
@@ -80,10 +83,24 @@ static const struct key_descriptor_s vlc_keys[] =
     { N_("Home"),              KEY_HOME              },
     { N_("Insert"),            KEY_INSERT            },
     { N_("Left"),              KEY_LEFT              },
+    { N_("Media Angle"),       KEY_MEDIA_ANGLE       },
+    { N_("Media Audio Track"), KEY_MEDIA_AUDIO       },
+    { N_("Media Forward"),     KEY_MEDIA_FORWARD     },
+    { N_("Media Menu"),        KEY_MEDIA_MENU        },
+    { N_("Media Next Frame"),  KEY_MEDIA_FRAME_NEXT  },
     { N_("Media Next Track"),  KEY_MEDIA_NEXT_TRACK  },
     { N_("Media Play Pause"),  KEY_MEDIA_PLAY_PAUSE  },
+    { N_("Media Prev Frame"),  KEY_MEDIA_FRAME_PREV  },
     { N_("Media Prev Track"),  KEY_MEDIA_PREV_TRACK  },
+    { N_("Media Record"),      KEY_MEDIA_RECORD      },
+    { N_("Media Repeat"),      KEY_MEDIA_REPEAT      },
+    { N_("Media Rewind"),      KEY_MEDIA_REWIND      },
+    { N_("Media Select"),      KEY_MEDIA_SELECT      },
+    { N_("Media Shuffle"),     KEY_MEDIA_SHUFFLE     },
     { N_("Media Stop"),        KEY_MEDIA_STOP        },
+    { N_("Media Subtitle"),    KEY_MEDIA_SUBTITLE    },
+    { N_("Media Time"),        KEY_MEDIA_TIME        },
+    { N_("Media View"),        KEY_MEDIA_VIEW        },
     { N_("Menu"),              KEY_MENU              },
     { N_("Mouse Wheel Down"),  KEY_MOUSEWHEELDOWN    },
     { N_("Mouse Wheel Left"),  KEY_MOUSEWHEELLEFT    },
@@ -91,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               },
@@ -99,6 +118,8 @@ static const struct key_descriptor_s vlc_keys[] =
     { N_("Volume Down"),       KEY_VOLUME_DOWN       },
     { N_("Volume Mute"),       KEY_VOLUME_MUTE       },
     { N_("Volume Up"),         KEY_VOLUME_UP         },
+    { N_("Zoom In"),           KEY_ZOOM_IN           },
+    { N_("Zoom Out"),          KEY_ZOOM_OUT          },
 };
 #define KEYS_COUNT (sizeof(vlc_keys)/sizeof(vlc_keys[0]))
 
@@ -256,6 +277,7 @@ static const struct action actions[] =
     { "audiodevice-cycle", ACTIONID_AUDIODEVICE_CYCLE, },
     { "chapter-next", ACTIONID_CHAPTER_NEXT, },
     { "chapter-prev", ACTIONID_CHAPTER_PREV, },
+    { "clear-playlist", ACTIONID_PLAY_CLEAR, },
     { "crop", ACTIONID_CROP, },
     { "crop-bottom", ACTIONID_CROP_BOTTOM, },
     { "crop-left", ACTIONID_CROP_LEFT, },
@@ -263,11 +285,13 @@ static const struct action actions[] =
     { "crop-top", ACTIONID_CROP_TOP, },
     { "decr-scalefactor", ACTIONID_SCALE_DOWN, },
     { "deinterlace", ACTIONID_DEINTERLACE, },
+    { "deinterlace-mode", ACTIONID_DEINTERLACE_MODE, },
     { "disc-menu", ACTIONID_DISC_MENU, },
     { "faster", ACTIONID_FASTER, },
     { "frame-next", ACTIONID_FRAME_NEXT, },
     { "incr-scalefactor", ACTIONID_SCALE_UP, },
     { "intf-boss", ACTIONID_INTF_BOSS, },
+    { "intf-popup-menu", ACTIONID_INTF_POPUP_MENU, },
     { "intf-show", ACTIONID_INTF_TOGGLE_FSC, },
     { "jump+extrashort", ACTIONID_JUMP_FORWARD_EXTRASHORT, },
     { "jump+long", ACTIONID_JUMP_FORWARD_LONG, },
@@ -279,13 +303,6 @@ static const struct action actions[] =
     { "jump-short", ACTIONID_JUMP_BACKWARD_SHORT, },
     { "leave-fullscreen", ACTIONID_LEAVE_FULLSCREEN, },
     { "loop", ACTIONID_LOOP, },
-    { "menu-down", ACTIONID_MENU_DOWN, },
-    { "menu-left", ACTIONID_MENU_LEFT, },
-    { "menu-off", ACTIONID_MENU_OFF, },
-    { "menu-on", ACTIONID_MENU_ON, },
-    { "menu-right", ACTIONID_MENU_RIGHT, },
-    { "menu-select", ACTIONID_MENU_SELECT, },
-    { "menu-up", ACTIONID_MENU_UP, },
     { "nav-activate", ACTIONID_NAV_ACTIVATE, },
     { "nav-down", ACTIONID_NAV_DOWN, },
     { "nav-left", ACTIONID_NAV_LEFT, },
@@ -307,6 +324,8 @@ static const struct action actions[] =
     { "play-pause", ACTIONID_PLAY_PAUSE, },
     { "position", ACTIONID_POSITION, },
     { "prev", ACTIONID_PREV, },
+    { "program-sid-next", ACTIONID_PROGRAM_SID_NEXT, },
+    { "program-sid-prev", ACTIONID_PROGRAM_SID_PREV, },
     { "quit", ACTIONID_QUIT, },
     { "random", ACTIONID_RANDOM, },
     { "rate-faster-fine", ACTIONID_RATE_FASTER_FINE, },
@@ -330,6 +349,11 @@ static const struct action actions[] =
     { "subdelay-up", ACTIONID_SUBDELAY_UP, },
     { "subpos-down", ACTIONID_SUBPOS_DOWN, },
     { "subpos-up", ACTIONID_SUBPOS_UP, },
+    { "subsync-apply", ACTIONID_SUBSYNC_APPLY, },
+    { "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, },
@@ -362,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,
@@ -392,14 +412,64 @@ static int vlc_key_to_action (vlc_object_t *obj, const char *varname,
     return var_SetInteger (obj, "key-action", (*pent)->action);
 }
 
+/**
+ * Adds a mapping from a certain key code to a certain action.
+ */
+static int vlc_AddMapping (void **map, uint32_t keycode, vlc_action_t action)
+{
+    struct mapping *entry = malloc (sizeof (*entry));
+    if (entry == NULL)
+        return ENOMEM;
+    entry->key = keycode;
+    entry->action = action;
+
+    struct mapping **pent = tsearch (entry, map, keycmp);
+    if (unlikely(pent == NULL))
+        return ENOMEM;
+    if (*pent != entry)
+    {
+        free (entry);
+        return EEXIST;
+    }
+    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
  * \param confname VLC configuration item to read mappings from
  * \param action action ID
  */
-static void vlc_MapAction (vlc_object_t *obj, void **map,
-                           const char *confname, vlc_action_t action)
+static void vlc_InitAction (vlc_object_t *obj, void **map,
+                            const char *confname, vlc_action_t action)
 {
     char *keys = var_InheritString (obj, confname);
     if (keys == NULL)
@@ -416,25 +486,12 @@ static void vlc_MapAction (vlc_object_t *obj, void **map,
             continue;
         }
 
-        struct mapping *entry = malloc (sizeof (*entry));
-        if (entry == NULL)
-            continue;
-        entry->key = code;
-        entry->action = action;
-
-        struct mapping **pent = tsearch (entry, map, keycmp);
-        if (unlikely(pent == NULL))
-            continue;
-        if (*pent != entry)
-        {
-            free (entry);
+        if (vlc_AddMapping (map, code, action) == EEXIST)
             msg_Warn (obj, "Key \"%s\" bound to multiple actions", key);
-        }
     }
     free (keys);
 }
 
-
 /**
  * Initializes the key map from configuration.
  */
@@ -442,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;
@@ -472,12 +529,17 @@ struct vlc_actions *vlc_InitActions (libvlc_int_t *libvlc)
         char name[12 + MAXACTION];
 
         snprintf (name, sizeof (name), "global-key-%s", actions[i].name);
-        vlc_MapAction (obj, &as->map, name + 7, actions[i].value);
-        vlc_MapAction (obj, &as->global_map, name, actions[i].value);
+        vlc_InitAction (obj, &as->map, name + 7, actions[i].value);
+        vlc_InitAction (obj, &as->global_map, name, actions[i].value);
     }
-
     keys->psz_action = NULL;
 
+    /* Initialize mouse wheel events */
+    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);
     var_AddCallback (obj, "global-key-pressed", vlc_key_to_action,