# -*- 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 # 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_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] = '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])