# -*- 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 compatibility from .common import NamedInts as _NamedInts from .common import UnsortedNamedInts as _UnsortedNamedInts # 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[0] = 'No Output' 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_Button_6=0x0020, Mouse_Button_Scroll_Left=0x0040, Mouse_Button_Scroll_Right=0x0080, Mouse_Button_9=0x0100, Mouse_Button_10=0x0200, Mouse_Button_11=0x0400, Mouse_Button_12=0x0800, Mouse_Button_13=0x1000, Mouse_Button_DPI=0x2000, Mouse_Button_15=0x4000, Mouse_Button_16=0x8000, ) 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] = 'No Output (only as default)' 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])