# -*- python-mode -*-

## Copyright (C) 2012-2013  Daniel Pavel
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License along
## with this program; if not, write to the Free Software Foundation, Inc.,
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

# Reprogrammable keys information
# Mostly from Logitech documentation, but with some edits for better Lunix compatability

from .common import NamedInts as _NamedInts
from .common import UnsortedNamedInts as _UnsortedNamedInts

# <controls.xml awk -F\" '/<Control /{sub(/^LD_FINFO_(CTRLID_)?/, "", $2);printf("\t%s=0x%04X,\n", $2, $4)}' | sort -t= -k2
CONTROL = _NamedInts(
    Volume_Up=0x0001,
    Volume_Down=0x0002,
    Mute=0x0003,
    Play__Pause=0x0004,
    Next=0x0005,
    Previous=0x0006,
    Stop=0x0007,
    Application_Switcher=0x0008,
    Burn=0x0009,
    Calculator=0x000A,  # Craft Keyboard top 4th from right
    Calendar=0x000B,
    Close=0x000C,
    Eject=0x000D,
    Mail=0x000E,
    Help_As_HID=0x000F,
    Help_As_F1=0x0010,
    Launch_Word_Proc=0x0011,
    Launch_Spreadsheet=0x0012,
    Launch_Presentation=0x0013,
    Undo_As_Ctrl_Z=0x0014,
    Undo_As_HID=0x0015,
    Redo_As_Ctrl_Y=0x0016,
    Redo_As_HID=0x0017,
    Print_As_Ctrl_P=0x0018,
    Print_As_HID=0x0019,
    Save_As_Ctrl_S=0x001A,
    Save_As_HID=0x001B,
    Preset_A=0x001C,
    Preset_B=0x001D,
    Preset_C=0x001E,
    Preset_D=0x001F,
    Favorites=0x0020,
    Gadgets=0x0021,
    My_Home=0x0022,
    Gadgets_As_Win_G=0x0023,
    Maximize_As_HID=0x0024,
    Maximize_As_Win_Shift_M=0x0025,
    Minimize_As_HID=0x0026,
    Minimize_As_Win_M=0x0027,
    Media_Player=0x0028,
    Media_Center_Logi=0x0029,
    Media_Center_Msft=0x002A,  # Should not be used as it is not reprogrammable under Windows
    Custom_Menu=0x002B,
    Messenger=0x002C,
    My_Documents=0x002D,
    My_Music=0x002E,
    Webcam=0x002F,
    My_Pictures=0x0030,
    My_Videos=0x0031,
    My_Computer_As_HID=0x0032,
    My_Computer_As_Win_E=0x0033,
    FN_Key=0x0034,
    Launch_Picture_Viewer=0x0035,
    One_Touch_Search=0x0036,
    Preset_1=0x0037,
    Preset_2=0x0038,
    Preset_3=0x0039,
    Preset_4=0x003A,
    Record=0x003B,
    Internet_Refresh=0x003C,
    Search=0x003E,  # SEARCH
    Shuffle=0x003F,
    Sleep=0x0040,
    Internet_Stop=0x0041,
    Synchronize=0x0042,
    Zoom=0x0043,
    Zoom_In_As_HID=0x0044,
    Zoom_In_As_Ctrl_Wheel=0x0045,
    Zoom_In_As_Cltr_Plus=0x0046,
    Zoom_Out_As_HID=0x0047,
    Zoom_Out_As_Ctrl_Wheel=0x0048,
    Zoom_Out_As_Ctrl_Minus=0x0049,
    Zoom_Reset=0x004A,
    Zoom_Full_Screen=0x004B,
    Print_Screen=0x004C,
    Pause_Break=0x004D,
    Scroll_Lock=0x004E,
    Contextual_Menu=0x004F,
    Left_Button=0x0050,  # LEFT_CLICK
    Right_Button=0x0051,  # RIGHT_CLICK
    Middle_Button=0x0052,  # MIDDLE_BUTTON
    Back_Button=0x0053,  # from M510v2 was BACK_AS_BUTTON_4
    Back=0x0054,  # BACK_AS_HID
    Back_As_Alt_Win_Arrow=0x0055,
    Forward_Button=0x0056,  # from M510v2 was FORWARD_AS_BUTTON_5
    Forward_As_HID=0x0057,
    Forward_As_Alt_Win_Arrow=0x0058,
    Button_6=0x0059,
    Left_Scroll_As_Button_7=0x005A,
    Left_Tilt=0x005B,  # from M510v2 was LEFT_SCROLL_AS_AC_PAN
    Right_Scroll_As_Button_8=0x005C,
    Right_Tilt=0x005D,  # from M510v2 was RIGHT_SCROLL_AS_AC_PAN
    Button_9=0x005E,
    Button_10=0x005F,
    Button_11=0x0060,
    Button_12=0x0061,
    Button_13=0x0062,
    Button_14=0x0063,
    Button_15=0x0064,
    Button_16=0x0065,
    Button_17=0x0066,
    Button_18=0x0067,
    Button_19=0x0068,
    Button_20=0x0069,
    Button_21=0x006A,
    Button_22=0x006B,
    Button_23=0x006C,
    Button_24=0x006D,
    Show_Desktop=0x006E,  # Craft Keyboard Fn F5
    Lock_PC=0x006F,  # Craft Keyboard top 1st from right
    Fn_F1=0x0070,
    Fn_F2=0x0071,
    Fn_F3=0x0072,
    Fn_F4=0x0073,
    Fn_F5=0x0074,
    Fn_F6=0x0075,
    Fn_F7=0x0076,
    Fn_F8=0x0077,
    Fn_F9=0x0078,
    Fn_F10=0x0079,
    Fn_F11=0x007A,
    Fn_F12=0x007B,
    Fn_F13=0x007C,
    Fn_F14=0x007D,
    Fn_F15=0x007E,
    Fn_F16=0x007F,
    Fn_F17=0x0080,
    Fn_F18=0x0081,
    Fn_F19=0x0082,
    IOS_Home=0x0083,
    Android_Home=0x0084,
    Android_Menu=0x0085,
    Android_Search=0x0086,
    Android_Back=0x0087,
    Home_Combo=0x0088,
    Lock_Combo=0x0089,
    IOS_Virtual_Keyboard=0x008A,
    IOS_Language_Switch=0x008B,
    Mac_Expose=0x008C,
    Mac_Dashboard=0x008D,
    Win7_Snap_Left=0x008E,
    Win7_Snap_Right=0x008F,
    Minimize_Window=0x0090,  # WIN7_MINIMIZE_AS_WIN_ARROW
    Maximize_Window=0x0091,  # WIN7_MAXIMIZE_AS_WIN_ARROW
    Win7_Stretch_Up=0x0092,
    Win7_Monitor_Switch_As_Win_Shift_LeftArrow=0x0093,
    Win7_Monitor_Switch_As_Win_Shift_RightArrow=0x0094,
    Switch_Screen=0x0095,  # WIN7_SHOW_PRESENTATION_MODE
    Win7_Show_Mobility_Center=0x0096,
    Analog_HScroll=0x0097,
    Metro_Appswitch=0x009F,
    Metro_Appbar=0x00A0,
    Metro_Charms=0x00A1,
    Calc_Vkeyboard=0x00A2,
    Metro_Search=0x00A3,
    Combo_Sleep=0x00A4,
    Metro_Share=0x00A5,
    Metro_Settings=0x00A6,
    Metro_Devices=0x00A7,
    Metro_Start_Screen=0x00A9,
    Zoomin=0x00AA,
    Zoomout=0x00AB,
    Back_Hscroll=0x00AC,
    Show_Desktop_HPP=0x00AE,
    Fn_Left_Click=0x00B7,  # from K400 Plus
    # https://docs.google.com/document/u/0/d/1YvXICgSe8BcBAuMr4Xu_TutvAxaa-RnGfyPFWBWzhkc/export?format=docx
    # Extract to csv.  Eliminate extra linefeeds and spaces.
    # awk -F, '/0x/{gsub(" \\+ ","_",$2); gsub("/","__",$2); gsub(" -","_Down",$2);
    # gsub(" \\+","_Up",$2); gsub("[()\"-]","",$2); gsub(" ","_",$2); printf("\t%s=0x%04X,\n", $2, $1)}' < controls.cvs
    Second_Left_Click=0x00B8,  # Second_LClick / on K400 Plus
    Fn_Second_Left_Click=0x00B9,  # Fn_Second_LClick
    Multiplatform_App_Switch=0x00BA,
    Multiplatform_Home=0x00BB,
    Multiplatform_Menu=0x00BC,
    Multiplatform_Back=0x00BD,
    Multiplatform_Insert=0x00BE,
    Screen_Capture__Print_Screen=0x00BF,  # Craft Keyboard top 3rd from right
    Fn_Down=0x00C0,
    Fn_Up=0x00C1,
    Multiplatform_Lock=0x00C2,
    Mouse_Gesture_Button=0x00C3,  # Thumb_Button on MX Master - Logitech name App_Switch_Gesture
    Smart_Shift=0x00C4,  # Top_Button on MX Master
    Microphone=0x00C5,
    Wifi=0x00C6,
    Brightness_Down=0x00C7,  # Craft Keyboard Fn F1
    Brightness_Up=0x00C8,  # Craft Keyboard Fn F2
    Display_Out__Project_Screen_=0x00C9,
    View_Open_Apps=0x00CA,
    View_All_Apps=0x00CB,
    Switch_App=0x00CC,
    Fn_Inversion_Change=0x00CD,
    MultiPlatform_Back=0x00CE,
    MultiPlatform_Forward=0x00CF,
    MultiPlatform_Gesture_Button=0x00D0,
    Host_Switch_Channel_1=0x00D1,  # Craft Keyboard
    Host_Switch_Channel_2=0x00D2,  # Craft Keyboard
    Host_Switch_Channel_3=0x00D3,  # Craft Keyboard
    MultiPlatform_Search=0x00D4,
    MultiPlatform_Home__Mission_Control=0x00D5,
    MultiPlatform_Menu__Show__Hide_Virtual_Keyboard__Launchpad=0x00D6,
    Virtual_Gesture_Button=0x00D7,
    Cursor_Button_Long_Press=0x00D8,
    Next_Button_Shortpress=0x00D9,  # Next_Button
    Next_Button_Long_Press=0x00DA,
    Back_Button_Short_Press=0x00DB,  # Back
    Back_Button_Long_Press=0x00DC,
    Multi_Platform_Language_Switch=0x00DD,
    F_Lock=0x00DE,
    Switch_Highlight=0x00DF,
    Mission_Control__Task_View=0x00E0,  # Craft Keyboard Fn F3 Switch_Workspace
    Dashboard_Launchpad__Action_Center=0x00E1,  # Craft Keyboard Fn F4 Application_Launcher
    Backlight_Down=0x00E2,  # Craft Keyboard Fn F6
    Backlight_Up=0x00E3,  # Craft Keyboard Fn F7
    Previous_Fn=0x00E4,  # Craft Keyboard Fn F8 Previous_Track
    Play__Pause_Fn=0x00E5,  # Craft Keyboard Fn F9 Play__Pause
    Next_Fn=0x00E6,  # Craft Keyboard Fn F10 Next_Track
    Mute_Fn=0x00E7,  # Craft Keyboard Fn F11 Mute
    Volume_Down_Fn=0x00E8,  # Craft Keyboard Fn F12 Volume_Down
    Volume_Up_Fn=0x00E9,  # Craft Keyboard next to F12 Volume_Down
    App_Contextual_Menu__Right_Click=0x00EA,  # Craft Keyboard top 2nd from right
    Right_Arrow=0x00EB,
    Left_Arrow=0x00EC,
    DPI_Change=0x00ED,
    New_Tab=0x00EE,
    F2=0x00EF,
    F3=0x00F0,
    F4=0x00F1,
    F5=0x00F2,
    F6=0x00F3,
    F7=0x00F4,
    F8=0x00F5,
    F1=0x00F6,
    Next_Color_Effect=0x00F7,
    Increase_Color_Effect_Speed=0x00F8,
    Decrease_Color_Effect_Speed=0x00F9,
    Load_Lighting_Custom_Profile=0x00FA,
    Laser_Button_Short_Press=0x00FB,
    Laser_Button_Long_Press=0x00FC,
    DPI_Switch=0x00FD,
    Multiplatform_Home__Show_Desktop=0x00FE,
    Multiplatform_App_Switch__Show_Dashboard=0x00FF,
    Multiplatform_App_Switch_2=0x0100,  # Multiplatform_App_Switch
    Fn_Inversion__Hot_Key=0x0101,
    LeftAndRightClick=0x0102,
    Voice_Dictation=0x0103,  # MX Keys for Business Fn F5 ; MX Mini Fn F6 Dictation
    Emoji_Smiley_Heart_Eyes=0x0104,
    Emoji_Crying_Face=0x0105,
    Emoji_Smiley=0x0106,
    Emoji_Smilie_With_Tears=0x0107,
    Open_Emoji_Panel=0x0108,  # MX Keys for Business Fn F6 ; MX Mini Fn F7 Emoji
    Multiplatform_App_Switch__Launchpad=0x0109,
    Snipping_Tool=0x010A,  # MX Keys for Business top 3rd from right; MX Mini Fn F8 Screenshot
    Grave_Accent=0x010B,
    Tab_Key=0x010C,
    Caps_Lock=0x010D,
    Left_Shift=0x010E,
    Left_Control=0x010F,
    Left_Option__Start=0x0110,
    Left_Command__Alt=0x0111,
    Right_Command__Alt=0x0112,
    Right_Option__Start=0x0113,
    Right_Control=0x0114,
    Right_Shift=0x0115,
    Insert=0x0116,
    Delete=0x0117,  # MX Mini Lock (on delete key in function row)
    Home=0x118,
    End=0x119,
    Page_Up=0x11A,
    Page_Down=0x11B,
    Mute_Microphone=0x11C,  # MX Keys for Business Fn F7 ; MX Mini Fn F9 Microphone Mute
    Do_Not_Disturb=0x11D,
    Backslash=0x11E,
    Refresh=0x11F,
    Close_Tab=0x120,
    Lang_Switch=0x121,
    Standard_Key_A=0x122,
    Standard_Key_B=0x123,
    Standard_Key_C=0x124,  # There are lots more of these
)

for i in range(1, 33):  # add in G keys - these are not really Logitech Controls
    CONTROL[0x1000 + i] = 'G' + str(i)
for i in range(1, 9):  # add in M keys - these are not really Logitech Controls
    CONTROL[0x1100 + i] = 'M' + str(i)
CONTROL[0x1200] = 'MR'  # add in MR key - this is not really a Logitech Control

CONTROL._fallback = lambda x: 'unknown:%04X' % x

# <tasks.xml awk -F\" '/<Task /{gsub(/ /, "_", $6); printf("\t%s=0x%04X,\n", $6, $4)}'
TASK = _NamedInts(
    Volume_Up=0x0001,
    Volume_Down=0x0002,
    Mute=0x0003,
    # Multimedia tasks:
    Play__Pause=0x0004,
    Next=0x0005,
    Previous=0x0006,
    Stop=0x0007,
    Application_Switcher=0x0008,
    BurnMediaPlayer=0x0009,
    Calculator=0x000A,
    Calendar=0x000B,
    Close_Application=0x000C,
    Eject=0x000D,
    Email=0x000E,
    Help=0x000F,
    OffDocument=0x0010,
    OffSpreadsheet=0x0011,
    OffPowerpnt=0x0012,
    Undo=0x0013,
    Redo=0x0014,
    Print=0x0015,
    Save=0x0016,
    SmartKeySet=0x0017,
    Favorites=0x0018,
    GadgetsSet=0x0019,
    HomePage=0x001A,
    WindowsRestore=0x001B,
    WindowsMinimize=0x001C,
    Music=0x001D,  # also known as MediaPlayer
    # Both 0x001E and 0x001F are known as MediaCenterSet
    Media_Center_Logitech=0x001E,
    Media_Center_Microsoft=0x001F,
    UserMenu=0x0020,
    Messenger=0x0021,
    PersonalFolders=0x0022,
    MyMusic=0x0023,
    Webcam=0x0024,
    PicturesFolder=0x0025,
    MyVideos=0x0026,
    My_Computer=0x0027,
    PictureAppSet=0x0028,
    Search=0x0029,  # also known as AdvSmartSearch
    RecordMediaPlayer=0x002A,
    BrowserRefresh=0x002B,
    RotateRight=0x002C,
    Search_Files=0x002D,  # SearchForFiles
    MM_SHUFFLE=0x002E,
    Sleep=0x002F,  # also known as StandBySet
    BrowserStop=0x0030,
    OneTouchSync=0x0031,
    ZoomSet=0x0032,
    ZoomBtnInSet2=0x0033,
    ZoomBtnInSet=0x0034,
    ZoomBtnOutSet2=0x0035,
    ZoomBtnOutSet=0x0036,
    ZoomBtnResetSet=0x0037,
    Left_Click=0x0038,  # LeftClick
    Right_Click=0x0039,  # RightClick
    Mouse_Middle_Button=0x003A,  # from M510v2 was MiddleMouseButton
    Back=0x003B,
    Mouse_Back_Button=0x003C,  # from M510v2 was BackEx
    BrowserForward=0x003D,
    Mouse_Forward_Button=0x003E,  # from M510v2 was BrowserForwardEx
    Mouse_Scroll_Left_Button_=0x003F,  # from M510v2 was HorzScrollLeftSet
    Mouse_Scroll_Right_Button=0x0040,  # from M510v2 was HorzScrollRightSet
    QuickSwitch=0x0041,
    BatteryStatus=0x0042,
    Show_Desktop=0x0043,  # ShowDesktop
    WindowsLock=0x0044,
    FileLauncher=0x0045,
    FolderLauncher=0x0046,
    GotoWebAddress=0x0047,
    GenericMouseButton=0x0048,
    KeystrokeAssignment=0x0049,
    LaunchProgram=0x004A,
    MinMaxWindow=0x004B,
    VOLUMEMUTE_NoOSD=0x004C,
    New=0x004D,
    Copy=0x004E,
    CruiseDown=0x004F,
    CruiseUp=0x0050,
    Cut=0x0051,
    Do_Nothing=0x0052,
    PageDown=0x0053,
    PageUp=0x0054,
    Paste=0x0055,
    SearchPicture=0x0056,
    Reply=0x0057,
    PhotoGallerySet=0x0058,
    MM_REWIND=0x0059,
    MM_FASTFORWARD=0x005A,
    Send=0x005B,
    ControlPanel=0x005C,
    UniversalScroll=0x005D,
    AutoScroll=0x005E,
    GenericButton=0x005F,
    MM_NEXT=0x0060,
    MM_PREVIOUS=0x0061,
    Do_Nothing_One=0x0062,  # also known as Do_Nothing
    SnapLeft=0x0063,
    SnapRight=0x0064,
    WinMinRestore=0x0065,
    WinMaxRestore=0x0066,
    WinStretch=0x0067,
    SwitchMonitorLeft=0x0068,
    SwitchMonitorRight=0x0069,
    ShowPresentation=0x006A,
    ShowMobilityCenter=0x006B,
    HorzScrollNoRepeatSet=0x006C,
    TouchBackForwardHorzScroll=0x0077,
    MetroAppSwitch=0x0078,
    MetroAppBar=0x0079,
    MetroCharms=0x007A,
    Calculator_VKEY=0x007B,  # also known as Calculator
    MetroSearch=0x007C,
    MetroStartScreen=0x0080,
    MetroShare=0x007D,
    MetroSettings=0x007E,
    MetroDevices=0x007F,
    MetroBackLeftHorz=0x0082,
    MetroForwRightHorz=0x0083,
    Win8_Back=0x0084,  # also known as MetroCharms
    Win8_Forward=0x0085,  # also known as AppSwitchBar
    Win8Charm_Appswitch_GifAnimation=0x0086,
    Win8BackHorzLeft=0x008B,  # also known as Back
    Win8ForwardHorzRight=0x008C,  # also known as BrowserForward
    MetroSearch2=0x0087,
    MetroShare2=0x0088,
    MetroSettings2=0x008A,
    MetroDevices2=0x0089,
    Win8MetroWin7Forward=0x008D,  # also known as MetroStartScreen
    Win8ShowDesktopWin7Back=0x008E,  # also known as ShowDesktop
    MetroApplicationSwitch=0x0090,  # also known as MetroStartScreen
    ShowUI=0x0092,
    # https://docs.google.com/document/d/1Dpx_nWRQAZox_zpZ8SNc9nOkSDE9svjkghOCbzopabc/edit
    # Extract to csv.  Eliminate extra linefeeds and spaces. Turn / into __ and space into _
    # awk -F, '/0x/{gsub(" \\+ ","_",$2);  gsub("_-","_Down",$2); gsub("_\\+","_Up",$2);
    # gsub("[()\"-]","",$2); gsub(" ","_",$2); printf("\t%s=0x%04X,\n", $2, $1)}' < tasks.csv > tasks.py
    Switch_Presentation__Switch_Screen=0x0093,  # on K400 Plus
    Minimize_Window=0x0094,
    Maximize_Window=0x0095,  # on K400 Plus
    MultiPlatform_App_Switch=0x0096,
    MultiPlatform_Home=0x0097,
    MultiPlatform_Menu=0x0098,
    MultiPlatform_Back=0x0099,
    Switch_Language=0x009A,  # Mac_switch_language
    Screen_Capture=0x009B,  # Mac_screen_Capture, on Craft Keyboard
    Gesture_Button=0x009C,
    Smart_Shift=0x009D,
    AppExpose=0x009E,
    Smart_Zoom=0x009F,
    Lookup=0x00A0,
    Microphone_on__off=0x00A1,
    Wifi_on__off=0x00A2,
    Brightness_Down=0x00A3,
    Brightness_Up=0x00A4,
    Display_Out=0x00A5,
    View_Open_Apps=0x00A6,
    View_All_Open_Apps=0x00A7,
    AppSwitch=0x00A8,
    Gesture_Button_Navigation=0x00A9,  # Mouse_Thumb_Button on MX Master
    Fn_inversion=0x00AA,
    Multiplatform_Back=0x00AB,
    Multiplatform_Forward=0x00AC,
    Multiplatform_Gesture_Button=0x00AD,
    HostSwitch_Channel_1=0x00AE,
    HostSwitch_Channel_2=0x00AF,
    HostSwitch_Channel_3=0x00B0,
    Multiplatform_Search=0x00B1,
    Multiplatform_Home__Mission_Control=0x00B2,
    Multiplatform_Menu__Launchpad=0x00B3,
    Virtual_Gesture_Button=0x00B4,
    Cursor=0x00B5,
    Keyboard_Right_Arrow=0x00B6,
    SW_Custom_Highlight=0x00B7,
    Keyboard_Left_Arrow=0x00B8,
    TBD=0x00B9,
    Multiplatform_Language_Switch=0x00BA,
    SW_Custom_Highlight_2=0x00BB,
    Fast_Forward=0x00BC,
    Fast_Backward=0x00BD,
    Switch_Highlighting=0x00BE,
    Mission_Control__Task_View=0x00BF,  # Switch_Workspace on Craft Keyboard
    Dashboard_Launchpad__Action_Center=0x00C0,  # Application_Launcher on Craft Keyboard
    Backlight_Down=0x00C1,  # Backlight_Down_FW_internal_function
    Backlight_Up=0x00C2,  # Backlight_Up_FW_internal_function
    Right_Click__App_Contextual_Menu=0x00C3,  # Context_Menu on Craft Keyboard
    DPI_Change=0x00C4,
    New_Tab=0x00C5,
    F2=0x00C6,
    F3=0x00C7,
    F4=0x00C8,
    F5=0x00C9,
    F6=0x00CA,
    F7=0x00CB,
    F8=0x00CC,
    F1=0x00CD,
    Laser_Button=0x00CE,
    Laser_Button_Long_Press=0x00CF,
    Start_Presentation=0x00D0,
    Blank_Screen=0x00D1,
    DPI_Switch=0x00D2,  # AdjustDPI on MX Vertical
    Home__Show_Desktop=0x00D3,
    App_Switch__Dashboard=0x00D4,
    App_Switch=0x00D5,
    Fn_Inversion=0x00D6,
    LeftAndRightClick=0x00D7,
    Voice_Dictation=0x00D8,
    Emoji_Smiling_Face_With_Heart_Shaped_Eyes=0x00D9,
    Emoji_Loudly_Crying_Face=0x00DA,
    Emoji_Smiley=0x00DB,
    Emoji_Smiley_With_Tears=0x00DC,
    Open_Emoji_Panel=0x00DD,
    Multiplatform_App_Switch__Launchpad=0x00DE,
    Snipping_Tool=0x00DF,
    Grave_Accent=0x00E0,
    Standard_Tab_Key=0x00E1,
    Caps_Lock=0x00E2,
    Left_Shift=0x00E3,
    Left_Control=0x00E4,
    Left_Option__Start=0x00E5,
    Left_Command__Alt=0x00E6,
    Right_Command__Alt=0x00E7,
    Right_Option__Start=0x00E8,
    Right_Control=0x00E9,
    Right_Shift=0x0EA,
    Insert=0x00EB,
    Delete=0x00EC,
    Home=0x00ED,
    End=0x00EE,
    Page_Up=0x00EF,
    Page_Down=0x00F0,
    Mute_Microphone=0x00F1,
    Do_Not_Disturb=0x00F2,
    Backslash=0x00F3,
    Refresh=0x00F4,
    Close_Tab=0x00F5,
    Lang_Switch=0x00F6,
    Standard_Alphabetical_Key=0x00F7,
    Right_Option__Start__2=0x00F8,
    Left_Option=0x00F9,
    Right_Option=0x00FA,
    Left_Cmd=0x00FB,
    Right_Cmd=0x00FC,
)
TASK._fallback = lambda x: 'unknown:%04X' % x
# Capabilities and desired software handling for a control
# Ref: https://drive.google.com/file/d/10imcbmoxTJ1N510poGdsviEhoFfB_Ua4/view
# We treat bytes 4 and 8 of `getCidInfo` as a single bitfield
KEY_FLAG = _NamedInts(
    analytics_key_events=0x400,
    force_raw_XY=0x200,
    raw_XY=0x100,
    virtual=0x80,
    persistently_divertable=0x40,
    divertable=0x20,
    reprogrammable=0x10,
    FN_sensitive=0x08,
    nonstandard=0x04,
    is_FN=0x02,
    mse=0x01
)
# Flags describing the reporting method of a control
# We treat bytes 2 and 5 of `get/setCidReporting` as a single bitfield
MAPPING_FLAG = _NamedInts(
    analytics_key_events_reporting=0x100,
    force_raw_XY_diverted=0x40,
    raw_XY_diverted=0x10,
    persistently_diverted=0x04,
    diverted=0x01
)
CID_GROUP_BIT = _NamedInts(g8=0x80, g7=0x40, g6=0x20, g5=0x10, g4=0x08, g3=0x04, g2=0x02, g1=0x01)
CID_GROUP = _NamedInts(g8=8, g7=7, g6=6, g5=5, g4=4, g3=3, g2=2, g1=1)
DISABLE = _NamedInts(
    Caps_Lock=0x01,
    Num_Lock=0x02,
    Scroll_Lock=0x04,
    Insert=0x08,
    Win=0x10,  # aka Super
)
DISABLE._fallback = lambda x: 'unknown:%02X' % x

# HID USB Keycodes from https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf
# Modified by information from Linux HID driver linux/drivers/hid/hid-input.c
USB_HID_KEYCODES = _NamedInts(
    A=0x04,
    B=0x05,
    C=0x06,
    D=0x07,
    E=0x08,
    F=0x09,
    G=0x0a,
    H=0x0b,
    I=0x0c,
    J=0x0d,
    K=0x0e,
    L=0x0f,
    M=0x10,
    N=0x11,
    O=0x12,
    P=0x13,
    Q=0x14,
    R=0x15,
    S=0x16,
    T=0x17,
    U=0x18,
    V=0x19,
    W=0x1a,
    X=0x1b,
    Y=0x1c,
    Z=0x1d,
    ENTER=0x28,
    ESC=0x29,
    BACKSPACE=0x2a,
    TAB=0x2b,
    SPACE=0x2c,
    MINUS=0x2d,
    EQUAL=0x2e,
    LEFTBRACE=0x2f,
    RIGHTBRACE=0x30,
    BACKSLASH=0x31,
    HASHTILDE=0x32,
    SEMICOLON=0x33,
    APOSTROPHE=0x34,
    GRAVE=0x35,
    COMMA=0x36,
    DOT=0x37,
    SLASH=0x38,
    CAPSLOCK=0x39,
    F1=0x3a,
    F2=0x3b,
    F3=0x3c,
    F4=0x3d,
    F5=0x3e,
    F6=0x3f,
    F7=0x40,
    F8=0x41,
    F9=0x42,
    F10=0x43,
    F11=0x44,
    F12=0x45,
    SYSRQ=0x46,
    SCROLLLOCK=0x47,
    PAUSE=0x48,
    INSERT=0x49,
    HOME=0x4a,
    PAGEUP=0x4b,
    DELETE=0x4c,
    END=0x4d,
    PAGEDOWN=0x4e,
    RIGHT=0x4f,
    LEFT=0x50,
    DOWN=0x51,
    UP=0x52,
    NUMLOCK=0x53,
    KPSLASH=0x54,
    KPASTERISK=0x55,
    KPMINUS=0x56,
    KPPLUS=0x57,
    KPENTER=0x58,
    KP1=0x59,
    KP2=0x5a,
    KP3=0x5b,
    KP4=0x5c,
    KP5=0x5d,
    KP6=0x5e,
    KP7=0x5f,
    KP8=0x60,
    KP9=0x61,
    KP0=0x62,
    KPDOT=0x63,
    COMPOSE=0x65,
    POWER=0x66,
    KPEQUAL=0x67,
    F13=0x68,
    F14=0x69,
    F15=0x6a,
    F16=0x6b,
    F17=0x6c,
    F18=0x6d,
    F19=0x6e,
    F20=0x6f,
    F21=0x70,
    F22=0x71,
    F23=0x72,
    F24=0x73,
    OPEN=0x74,
    HELP=0x75,
    PROPS=0x76,
    FRONT=0x77,
    STOP=0x78,
    AGAIN=0x79,
    UNDO=0x7a,
    CUT=0x7b,
    COPY=0x7c,
    PASTE=0x7d,
    FIND=0x7e,
    MUTE=0x7f,
    VOLUMEUP=0x80,
    VOLUMEDOWN=0x81,
    KPCOMMA=0x85,
    RO=0x87,
    KATAKANAHIRAGANA=0x88,
    YEN=0x89,
    HENKAN=0x8a,
    MUHENKAN=0x8b,
    KPJPCOMMA=0x8c,
    HANGEUL=0x90,
    HANJA=0x91,
    KATAKANA=0x92,
    HIRAGANA=0x93,
    ZENKAKUHANKAKU=0x94,
    KPLEFTPAREN=0xb6,
    KPRIGHTPAREN=0xb7,
    LEFTCTRL=0xe0,
    LEFTSHIFT=0xe1,
    LEFTALT=0xe2,
    LEFTWINDOWS=0xe3,
    RIGHTCTRL=0xe4,
    RIGHTSHIFT=0xe5,
    RIGHTALT=0xe6,
    RIGHTMETA=0xe7,
    MEDIA_PLAYPAUSE=0xe8,
    MEDIA_STOPCD=0xe9,
    MEDIA_PREVIOUSSONG=0xea,
    MEDIA_NEXTSONG=0xeb,
    MEDIA_EJECTCD=0xec,
    MEDIA_VOLUMEUP=0xed,
    MEDIA_VOLUMEDOWN=0xee,
    MEDIA_MUTE=0xef,
    MEDIA_WWW=0xf0,
    MEDIA_BACK=0xf1,
    MEDIA_FORWARD=0xf2,
    MEDIA_STOP=0xf3,
    MEDIA_FIND=0xf4,
    MEDIA_SCROLLUP=0xf5,
    MEDIA_SCROLLDOWN=0xf6,
    MEDIA_EDIT=0xf7,
    MEDIA_SLEEP=0xf8,
    MEDIA_COFFEE=0xf9,
    MEDIA_REFRESH=0xfa,
    MEDIA_CALC=0xfb,
)
USB_HID_KEYCODES[0x1e] = '1'
USB_HID_KEYCODES[0x1f] = '2'
USB_HID_KEYCODES[0x20] = '3'
USB_HID_KEYCODES[0x21] = '4'
USB_HID_KEYCODES[0x22] = '5'
USB_HID_KEYCODES[0x23] = '6'
USB_HID_KEYCODES[0x24] = '7'
USB_HID_KEYCODES[0x25] = '8'
USB_HID_KEYCODES[0x26] = '9'
USB_HID_KEYCODES[0x27] = '0'
USB_HID_KEYCODES[0x64] = '102ND'

HID_CONSUMERCODES = _NamedInts(
    #    Unassigned=0x00,
    #    Consumer_Control=0x01,
    #    Numeric_Key_Pad=0x02,
    #    Programmable_Buttons=0x03,
    #    Microphone=0x04,
    #    Headphone=0x05,
    #    Graphic_Equalizer=0x06,
    #    AM__PM=0x22,
    Power=0x30,
    Reset=0x31,
    Sleep=0x32,
    Sleep_After=0x33,
    Sleep_Mode=0x34,
    Illumination=0x35,
    Function_Buttons=0x36,
    Menu=0x40,
    Menu__Pick=0x41,
    Menu_Up=0x42,
    Menu_Down=0x43,
    Menu_Left=0x44,
    Menu_Right=0x45,
    Menu_Escape=0x46,
    Menu_Value_Increase=0x47,
    Menu_Value_Decrease=0x48,
    Data_On_Screen=0x60,
    Closed_Caption=0x61,
    #    Closed_Caption_Select=0x62,
    VCR__TV=0x63,
    #    Broadcast_Mode=0x64,
    Snapshot=0x65,
    #    Still=0x66,
    Red=0x69,
    Green=0x6A,
    Blue=0x6B,
    Yellow=0x6C,
    Aspect_Ratio=0x6D,
    Brightness_Up=0x6F,
    Brightness_Down=0x70,
    Brightness_Toggle=0x72,
    Brightness_Min=0x73,
    Brightness_Max=0x74,
    Brightness_Auto=0x75,
    Keyboard_Illumination_Up=0x79,
    Keyboard_Illumination_Down=0x7A,
    Keyboard_Illumination_Toggle=0x7C,
    #    Selection=0x80,
    #    Assign_Selection=0x81,
    Mode_Step=0x82,
    Recall_Last=0x83,
    Enter_Channel=0x84,
    #    Order_Movie=0x85,
    #    Channel=0x86,
    #    Media_Selection=0x87,
    Media_Select_Computer=0x88,
    Media_Select_TV=0x89,
    Media_Select_WWW=0x8A,
    Media_Select_DVD=0x8B,
    Media_Select_Telephone=0x8C,
    Media_Select_Program_Guide=0x8D,
    Media_Select_Video_Phone=0x8E,
    Media_Select_Games=0x8F,
    Media_Select_Messages=0x90,
    Media_Select_CD=0x91,
    Media_Select_VCR=0x92,
    Media_Select_Tuner=0x93,
    Quit=0x94,
    Help=0x95,
    Media_Select_Tape=0x96,
    Media_Select_Cable=0x97,
    Media_Select_Satellite=0x98,
    Media_Select_Security=0x99,
    Media_Select_Home=0x9A,
    #    Media_Select_Call=0x9B,
    Channel_Increment=0x9C,
    Channel_Decrement=0x9D,
    #    Media_Select_SAP=0x9E,
    VCR_Plus=0xA0,
    #    Once=0xA1,
    #    Daily=0xA2,
    #    Weekly=0xA3,
    #    Monthly=0xA4,
    Play=0xB0,
    Pause=0xB1,
    Record=0xB2,
    Fast_Forward=0xB3,
    Rewind=0xB4,
    Scan_Next_Track=0xB5,
    Scan_Previous_Track=0xB6,
    Stop=0xB7,
    Eject=0xB8,
    Random_Play=0xB9,
    Select_DisC=0xBA,
    Enter_Disc=0xBB,
    Repeat=0xBC,
    Tracking=0xBD,
    Track_Normal=0xBE,
    Slow_Tracking=0xBF,
    #    Frame_Forward=0xC0,
    #    Frame_Back=0xC1,
    #    Mark=0xC2,
    #    Clear_Mark=0xC3,
    #    Repeat_From_Mark=0xC4,
    #    Return_To_Mark=0xC5,
    #    Search_Mark_Forward=0xC6,
    #    Search_Mark_Backwards=0xC7,
    #    Counter_Reset=0xC8,
    #    Show_Counter=0xC9,
    #    Tracking_Increment=0xCA,
    #    Tracking_Decrement=0xCB,
    #    Stop__Eject=0xCC,
    Play__Pause=0xCD,
    #    Play__Skip=0xCE,
    Volume=0xE0,
    #    Balance=0xE1,
    Mute=0xE2,
    #    Bass=0xE3,
    #    Treble=0xE4,
    Bass_Boost=0xE5,
    #    Surround_Mode=0xE6,
    #    Loudness=0xE7,
    #    MPX=0xE8,
    Volume_Up=0xE9,
    Volume_Down=0xEA,
    #    Speed_Select=0xF0,
    #    Playback_Speed=0xF1,
    #    Standard_Play=0xF2,
    #    Long_Play=0xF3,
    #    Extended_Play=0xF4,
    Slow=0xF5,
    Fan_Enable=0x100,
    Fan_Speed=0x101,
    Light=0x102,
    Light_Illumination_Level=0x103,
    Climate_Control_Enable=0x104,
    Room_Temperature=0x105,
    Security_Enable=0x106,
    Fire_Alarm=0x107,
    Police_Alarm=0x108,
    Proximity=0x109,
    Motion=0x10A,
    Duress_Alarm=0x10B,
    Holdup_Alarm=0x10C,
    Medical_Alarm=0x10D,
    Balance_Right=0x150,
    Balance_Left=0x151,
    Bass_Increment=0x152,
    Bass_Decrement=0x153,
    Treble_Increment=0x154,
    Treble_Decrement=0x155,
    Speaker_System=0x160,
    Channel_Left=0x161,
    Channel_Right=0x162,
    Channel_Center=0x163,
    Channel_Front=0x164,
    Channel_Center_Front=0x165,
    Channel_Side=0x166,
    Channel_Surround=0x167,
    Channel_Low_Frequency_Enhancement=0x168,
    Channel_Top=0x169,
    Channel_Unknown=0x16A,
    Subchannel=0x170,
    Subchannel_Increment=0x171,
    Subchannel_Decrement=0x172,
    Alternate_Audio_Increment=0x173,
    Alternate_Audio_Decrement=0x174,
    Application_Launch_Buttons=0x180,
    AL_Launch_Button_Configuration_Tool=0x181,
    AL_Programmable_Button_Configuration=0x182,
    AL_Consumer_Control_Configuration=0x183,
    AL_Word_Processor=0x184,
    AL_Text_Editor=0x185,
    AL_Spreadsheet=0x186,
    AL_Graphics_Editor=0x187,
    AL_Presentation_App=0x188,
    AL_Database_App=0x189,
    AL_Email_Reader=0x18A,
    AL_Newsreader=0x18B,
    AL_Voicemail=0x18C,
    AL_Contacts__Address_Book=0x18D,
    AL_Calendar__Schedule=0x18E,
    AL_Task__Project_Manager=0x18F,
    AL_Log__Journal__Timecard=0x190,
    AL_Checkbook__Finance=0x191,
    AL_Calculator=0x192,
    AL_A__V_Capture__Playback=0x193,
    AL_Local_Machine_Browser=0x194,
    AL_LAN__WAN_Browser=0x195,
    AL_Internet_Browser=0x196,
    AL_Remote_Networking__ISP_Connect=0x197,
    AL_Network_Conference=0x198,
    AL_Network_Chat=0x199,
    AL_Telephony__Dialer=0x19A,
    AL_Logon=0x19B,
    AL_Logoff=0x19C,
    AL_Logon__Logoff=0x19D,
    AL_Terminal_Lock__Screensaver=0x19E,
    AL_Control_Panel=0x19F,
    AL_Command_Line_Processor__Run=0x1A0,
    AL_Process__Task_Manager=0x1A1,
    AL_Select_Tast__Application=0x1A2,
    AL_Next_Task__Application=0x1A3,
    AL_Previous_Task__Application=0x1A4,
    AL_Preemptive_Halt_Task__Application=0x1A5,
    AL_Integrated_Help_Center=0x1A6,
    AL_Documents=0x1A7,
    AL_Thesaurus=0x1A8,
    AL_Dictionary=0x1A9,
    AL_Desktop=0x1AA,
    AL_Spell_Check=0x1AB,
    AL_Grammar_Check=0x1AC,
    AL_Wireless_Status=0x1AD,
    AL_Keyboard_Layout=0x1AE,
    AL_Virus_Protection=0x1AF,
    AL_Encryption=0x1B0,
    AL_Screen_Saver=0x1B1,
    AL_Alarms=0x1B2,
    AL_Clock=0x1B3,
    AL_File_Browser=0x1B4,
    AL_Power_Status=0x1B5,
    AL_Image_Browser=0x1B6,
    AL_Audio_Browser=0x1B7,
    AL_Movie_Browser=0x1B8,
    AL_Digital_Rights_Manager=0x1B9,
    AL_Digital_Wallet=0x1BA,
    AL_Instant_Messaging=0x1BC,
    AL_OEM_Features___Tips__Tutorial_Browser=0x1BD,
    AL_OEM_Help=0x1BE,
    AL_Online_Community=0x1BF,
    AL_Entertainment_Content_Browser=0x1C0,
    AL_Online_Shopping_Browser=0x1C1,
    AL_SmartCard_Information__Help=0x1C2,
    AL_Market_Monitor__Finance_Browser=0x1C3,
    AL_Customized_Corporate_News_Browser=0x1C4,
    AL_Online_Activity_Browser=0x1C5,
    AL_Research__Search_Browser=0x1C6,
    AL_Audio_Player=0x1C7,
    Generic_GUI_Application_Controls=0x200,
    AC_New=0x201,
    AC_Open=0x202,
    AC_Close=0x203,
    AC_Exit=0x204,
    AC_Maximize=0x205,
    AC_Minimize=0x206,
    AC_Save=0x207,
    AC_Print=0x208,
    AC_Properties=0x209,
    AC_Undo=0x21A,
    AC_Copy=0x21B,
    AC_Cut=0x21C,
    AC_Paste=0x21D,
    AC_Select_All=0x21E,
    AC_Find=0x21F,
    AC_Find_and_Replace=0x220,
    AC_Search=0x221,
    AC_Go_To=0x222,
    AC_Home=0x223,
    AC_Back=0x224,
    AC_Forward=0x225,
    AC_Stop=0x226,
    AC_Refresh=0x227,
    AC_Previous_Link=0x228,
    AC_Next_Link=0x229,
    AC_Bookmarks=0x22A,
    AC_History=0x22B,
    AC_Subscriptions=0x22C,
    AC_Zoom_In=0x22D,
    AC_Zoom_Out=0x22E,
    AC_Zoom=0x22F,
    AC_Full_Screen_View=0x230,
    AC_Normal_View=0x231,
    AC_View_Toggle=0x232,
    AC_Scroll_Up=0x233,
    AC_Scroll_Down=0x234,
    AC_Scroll=0x235,
    AC_Pan_Left=0x236,
    AC_Pan_Right=0x237,
    AC_Pan=0x238,
    AC_New_Window=0x239,
    AC_Tile_Horizontally=0x23A,
    AC_Tile_Vertically=0x23B,
    AC_Format=0x23C,
    AC_Edit=0x23D,
    AC_Bold=0x23E,
    AC_Italics=0x23F,
    AC_Underline=0x240,
    AC_Strikethrough=0x241,
    AC_Subscript=0x242,
    AC_Superscript=0x243,
    AC_All_Caps=0x244,
    AC_Rotate=0x245,
    AC_Resize=0x246,
    AC_Flip_horizontal=0x247,
    AC_Flip_Vertical=0x248,
    AC_Mirror_Horizontal=0x249,
    AC_Mirror_Vertical=0x24A,
    AC_Font_Select=0x24B,
    AC_Font_Color=0x24C,
    AC_Font_Size=0x24D,
    AC_Justify_Left=0x24E,
    AC_Justify_Center_H=0x24F,
    AC_Justify_Right=0x250,
    AC_Justify_Block_H=0x251,
    AC_Justify_Top=0x252,
    AC_Justify_Center_V=0x253,
    AC_Justify_Bottom=0x254,
    AC_Justify_Block_V=0x255,
    AC_Indent_Decrease=0x256,
    AC_Indent_Increase=0x257,
    AC_Numbered_List=0x258,
    AC_Restart_Numbering=0x259,
    AC_Bulleted_List=0x25A,
    AC_Promote=0x25B,
    AC_Demote=0x25C,
    AC_Yes=0x25D,
    AC_No=0x25E,
    AC_Cancel=0x25F,
    AC_Catalog=0x260,
    AC_Buy__Checkout=0x261,
    AC_Add_to_Cart=0x262,
    AC_Expand=0x263,
    AC_Expand_All=0x264,
    AC_Collapse=0x265,
    AC_Collapse_All=0x266,
    AC_Print_Preview=0x267,
    AC_Paste_Special=0x268,
    AC_Insert_Mode=0x269,
    AC_Delete=0x26A,
    AC_Lock=0x26B,
    AC_Unlock=0x26C,
    AC_Protect=0x26D,
    AC_Unprotect=0x26E,
    AC_Attach_Comment=0x26F,
    AC_Delete_Comment=0x270,
    AC_View_Comment=0x271,
    AC_Select_Word=0x272,
    AC_Select_Sentence=0x273,
    AC_Select_Paragraph=0x274,
    AC_Select_Column=0x275,
    AC_Select_Row=0x276,
    AC_Select_Table=0x277,
    AC_Select_Object=0x278,
    AC_Redo__Repeat=0x279,
    AC_Sort=0x27A,
    AC_Sort_Ascending=0x27B,
    AC_Sort_Descending=0x27C,
    AC_Filter=0x27D,
    AC_Set_Clock=0x27E,
    AC_View_Clock=0x27F,
    AC_Select_Time_Zone=0x280,
    AC_Edit_Time_Zones=0x281,
    AC_Set_Alarm=0x282,
    AC_Clear_Alarm=0x283,
    AC_Snooze_Alarm=0x284,
    AC_Reset_Alarm=0x285,
    AC_Synchronize=0x286,
    AC_Send__Receive=0x287,
    AC_Send_To=0x288,
    AC_Reply=0x289,
    AC_Reply_All=0x28A,
    AC_Forward_Msg=0x28B,
    AC_Send=0x28C,
    AC_Attach_File=0x28D,
    AC_Upload=0x28E,
    AC_Download_Save_Target_As=0x28F,
    AC_Set_Borders=0x290,
    AC_Insert_Row=0x291,
    AC_Insert_Column=0x292,
    AC_Insert_File=0x293,
    AC_Insert_Picture=0x294,
    AC_Insert_Object=0x295,
    AC_Insert_Symbol=0x296,
    AC_Save_and_Close=0x297,
    AC_Rename=0x298,
    AC_Merge=0x299,
    AC_Split=0x29A,
    AC_Distribute_Horizontally=0x29B,
    AC_Distribute_Vertically=0x29C,
)
HID_CONSUMERCODES[0x20] = '+10'
HID_CONSUMERCODES[0x21] = '+100'
HID_CONSUMERCODES._fallback = lambda x: 'unknown:%04X' % x

## Information for x1c00 Persistent from https://drive.google.com/drive/folders/0BxbRzx7vEV7eWmgwazJ3NUFfQ28

KEYMOD = _NamedInts(CTRL=0x01, SHIFT=0x02, ALT=0x04, META=0x08, RCTRL=0x10, RSHIFT=0x20, RALT=0x40, RMETA=0x80)

ACTIONID = _NamedInts(
    Empty=0x00,
    Key=0x01,
    Mouse=0x02,
    Xdisp=0x03,
    Ydisp=0x04,
    Vscroll=0x05,
    Hscroll=0x06,
    Consumer=0x07,
    Internal=0x08,
    Power=0x09
)

MOUSE_BUTTONS = _NamedInts(
    Mouse_Button_Left=0x0001,
    Mouse_Button_Right=0x0002,
    Mouse_Button_Middle=0x0004,
    Mouse_Button_Back=0x0008,
    Mouse_Button_Forward=0x0010,
)
MOUSE_BUTTONS._fallback = lambda x: 'unknown mouse button:%04X' % x

HORIZONTAL_SCROLL = _NamedInts(
    Horizontal_Scroll_Left=0x4000,
    Horizontal_Scroll_Right=0x8000,
)
HORIZONTAL_SCROLL._fallback = lambda x: 'unknown horizontal scroll:%04X' % x

# Construct universe for Persistent Remappable Keys setting (only for supported values)
KEYS = _UnsortedNamedInts()
KEYS_Default = 0x7FFFFFFF  # Special value to reset key to default - has to be different from all others
KEYS[KEYS_Default] = 'Default'  # Value to reset to default
KEYS[0] = 'None'  # Value for no output

# Add HID keys plus modifiers
modifiers = {
    0x00: '',
    0x01: 'Cntrl+',
    0x02: 'Shift+',
    0x04: 'Alt+',
    0x08: 'Meta+',
    0x03: 'Cntrl+Shift+',
    0x05: 'Alt+Cntrl+',
    0x09: 'Meta+Cntrl+',
    0x06: 'Alt+Shift+',
    0x0A: 'Meta+Shift+',
    0x0C: 'Meta+Alt+'
}
for val, name in modifiers.items():
    for key in USB_HID_KEYCODES:
        KEYS[(ACTIONID.Key << 24) + (int(key) << 8) + val] = name + str(key)

# Add HID Consumer Codes
for code in HID_CONSUMERCODES:
    KEYS[(ACTIONID.Consumer << 24) + (int(code) << 8)] = str(code)

# Add Mouse Buttons
for code in MOUSE_BUTTONS:
    KEYS[(ACTIONID.Mouse << 24) + (int(code) << 8)] = str(code)

# Add Horizontal Scroll
for code in HORIZONTAL_SCROLL:
    KEYS[(ACTIONID.Hscroll << 24) + (int(code) << 8)] = str(code)


# Construct subsets for known devices
def persistent_keys(action_ids):
    keys = _UnsortedNamedInts()
    keys[KEYS_Default] = 'Default'  # Value to reset to default
    keys[0] = 'None'  # Value for no output
    for key in KEYS:
        if (int(key) >> 24) in action_ids:
            keys[int(key)] = str(key)
    return keys


KEYS_KEYS_CONSUMER = persistent_keys([ACTIONID.Key, ACTIONID.Consumer])
KEYS_KEYS_MOUSE_HSCROLL = persistent_keys([ACTIONID.Key, ACTIONID.Mouse, ACTIONID.Hscroll])
