/* * CommandSet.h * ------------ * Purpose: Header file for custom key handling: List of supported keyboard shortcuts and class for them. * Notes : (currently none) * Authors: OpenMPT Devs * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. */ #pragma once #include "openmpt/all/BuildSettings.hpp" #include #include "openmpt/base/FlagSet.hpp" #include #include OPENMPT_NAMESPACE_BEGIN #define HOTKEYF_MIDI 0x10 // modifier mask for MIDI CCs #define HOTKEYF_RSHIFT 0x20 // modifier mask for right Shift key #define HOTKEYF_RCONTROL 0x40 // modifier mask for right Ctrl key #define HOTKEYF_RALT 0x80 // modifier mask for right Alt key enum InputTargetContext : int8 { kCtxUnknownContext = -1, kCtxAllContexts = 0, kCtxViewGeneral, kCtxViewPatterns, kCtxViewPatternsNote, kCtxViewPatternsIns, kCtxViewPatternsVol, kCtxViewPatternsFX, kCtxViewPatternsFXparam, kCtxViewSamples, kCtxViewInstruments, kCtxViewComments, kCtxViewTree, kCtxInsNoteMap, kCtxVSTGUI, kCtxCtrlGeneral, kCtxCtrlPatterns, kCtxCtrlSamples, kCtxCtrlInstruments, kCtxCtrlComments, kCtxCtrlOrderlist, kCtxChannelSettings, kCtxMaxInputContexts }; enum KeyEventType : int8 { kKeyEventNone = 0, kKeyEventDown = 1 << 0, kKeyEventUp = 1 << 1, kKeyEventRepeat = 1 << 2, kNumKeyEvents = 1 << 3 }; DECLARE_FLAGSET(KeyEventType) enum CommandID { kcCommandSetNumNotes = 33, // kcVPEndNotes - kcVPStartNotes kcNull = -1, kcFirst, //Global kcGlobalStart = kcFirst, kcStartFile = kcGlobalStart, kcFileNew = kcGlobalStart, kcFileOpen, kcFileAppend, kcFileClose, kcFileCloseAll, kcFileSave, kcFileSaveAs, kcFileSaveCopy, kcFileSaveTemplate, kcFileSaveAsWave, kcFileSaveAsMP3, kcFileSaveMidi, kcFileSaveOPL, kcFileExportCompat, kcPrevDocument, kcNextDocument, kcFileImportMidiLib, kcFileAddSoundBank, kcEndFile = kcFileAddSoundBank, kcStartPlayCommands, kcPlayPauseSong = kcStartPlayCommands, kcPauseSong, kcStopSong, kcPlaySongFromStart, kcPlaySongFromCursor, kcPlaySongFromPattern, kcPlayPatternFromStart, kcPlayPatternFromCursor, kcToggleLoopSong, kcPanic, kcEstimateSongLength, kcApproxRealBPM, kcMidiRecord, kcTempoIncrease, kcTempoDecrease, kcTempoIncreaseFine, kcTempoDecreaseFine, kcSpeedIncrease, kcSpeedDecrease, kcEndPlayCommands = kcSpeedDecrease, kcStartEditCommands, kcEditUndo = kcStartEditCommands, kcEditRedo, kcEditCut, kcEditCopy, kcEditPaste, kcEditMixPaste, kcEditMixPasteITStyle, kcEditPasteFlood, kcEditPushForwardPaste, kcEditSelectAll, kcEditFind, kcEditFindNext, kcEndEditCommands = kcEditFindNext, /* kcWindowNew, kcWindowCascade, kcWindowTileHorz, kcWindowTileVert, */ kcStartView, kcViewGeneral = kcStartView, kcViewPattern, kcViewSamples, kcViewInstruments, kcViewComments, kcViewGraph, kcViewMain, kcViewTree, kcViewOptions, kcViewChannelManager, kcViewAddPlugin, kcViewSongProperties, kcViewTempoSwing, kcShowMacroConfig, kcViewMIDImapping, kcViewEditHistory, kcViewToggle, kcSwitchToInstrLibrary, kcHelp, kcEndView = kcHelp, kcStartMisc, kcPrevInstrument = kcStartMisc, kcNextInstrument, kcPrevOctave, kcNextOctave, kcPrevOrder, kcNextOrder, kcEndMisc = kcNextOrder, kcDummyShortcut, kcGlobalEnd = kcDummyShortcut, //Pattern Navigation kcStartPatNavigation, kcStartJumpSnap = kcStartPatNavigation, kcPatternJumpDownh1 = kcStartJumpSnap, kcPatternJumpUph1, kcPatternJumpDownh2, kcPatternJumpUph2, kcPatternSnapDownh1, kcPatternSnapUph1, kcPatternSnapDownh2, kcPatternSnapUph2, kcPrevEntryInColumn, kcNextEntryInColumn, kcEndJumpSnap = kcNextEntryInColumn, kcStartPlainNavigate, kcNavigateDown = kcStartPlainNavigate, kcNavigateUp, kcNavigateDownBySpacing, kcNavigateUpBySpacing, kcNavigateLeft, kcNavigateRight, kcNavigateNextChan, kcNavigatePrevChan, kcEndPlainNavigate = kcNavigatePrevChan, kcStartHomeEnd, kcHomeHorizontal = kcStartHomeEnd, kcHomeVertical, kcHomeAbsolute, kcEndHorizontal, kcEndVertical, kcEndAbsolute, kcEndHomeEnd = kcEndAbsolute, kcEndPatNavigation = kcEndHomeEnd, // with select. Order must match above. kcStartPatNavigationSelect, kcPatternJumpDownh1Select = kcStartPatNavigationSelect, kcPatternJumpUph1Select, kcPatternJumpDownh2Select, kcPatternJumpUph2Select, kcPatternSnapDownh1Select, kcPatternSnapUph1Select, kcPatternSnapDownh2Select, kcPatternSnapUph2Select, kcPrevEntryInColumnSelect, kcNextEntryInColumnSelect, kcNavigateDownSelect, kcNavigateUpSelect, kcNavigateDownBySpacingSelect, kcNavigateUpBySpacingSelect, kcNavigateLeftSelect, kcNavigateRightSelect, kcNavigateNextChanSelect, kcNavigatePrevChanSelect, kcHomeHorizontalSelect, kcHomeVerticalSelect, kcHomeAbsoluteSelect, kcEndHorizontalSelect, kcEndVerticalSelect, kcEndAbsoluteSelect, kcEndPatNavigationSelect = kcEndAbsoluteSelect, //Pattern Editing kcStartPatternEditing, kcStartSelect = kcStartPatternEditing, kcSelect = kcStartSelect, kcSelectWithNav, kcSelectOff, kcSelectOffWithNav, kcSelectWithCopySelect, kcSelectOffWithCopySelect, kcCopySelect, kcCopySelectOff, kcCopySelectWithNav, kcCopySelectOffWithNav, kcCopySelectWithSelect, kcCopySelectOffWithSelect, kcSelectChannel, kcSelectColumn, kcSelectRow, kcSelectEvent, kcSelectBeat, kcSelectMeasure, kcLoseSelection, kcCopyAndLoseSelection, kcEndSelect = kcCopyAndLoseSelection, kcStartPatternClipboard, kcCutPatternChannel = kcStartPatternClipboard, kcCutPattern, kcCopyPatternChannel, kcCopyPattern, kcPastePatternChannel, kcPastePattern, kcToggleClipboardManager, kcClipboardPrev, kcClipboardNext, kcEndPatternClipboard = kcClipboardNext, kcStartPatternEditMisc, kcToggleFollowSong = kcStartPatternEditMisc, kcCursorCopy, kcCursorPaste, kcFindInstrument, kcPatternRecord, kcPatternPlayRow, kcSetSpacing, kcSetSpacing0, kcSetSpacing1, kcSetSpacing2, kcSetSpacing3, kcSetSpacing4, kcSetSpacing5, kcSetSpacing6, kcSetSpacing7, kcSetSpacing8, kcSetSpacing9, kcIncreaseSpacing, kcDecreaseSpacing, kcSwitchToOrderList, kcNewPattern, kcDuplicatePattern, kcSplitPattern, kcPatternEditPCNotePlugin, kcTogglePluginEditor, kcShowNoteProperties, kcShowPatternProperties, kcShowSplitKeyboardSettings, kcChordEditor, kcChangeLoopStatus, kcShowEditMenu, kcShowChannelCtxMenu, kcShowChannelPluginCtxMenu, kcTimeAtRow, kcLockPlaybackToRows, kcQuantizeSettings, kcTogglePatternPlayRow, kcToggleOverflowPaste, kcToggleNoteOffRecordPC, kcToggleNoteOffRecordMIDI, kcEndPatternEditMisc = kcToggleNoteOffRecordMIDI, kcStartChannelKeys, kcChannelMute = kcStartChannelKeys, kcChannelSolo, kcChannelUnmuteAll, kcToggleChanMuteOnPatTransition, kcUnmuteAllChnOnPatTransition, kcSoloChnOnPatTransition, kcChannelRecordSelect, kcChannelSplitRecordSelect, kcChannelReset, kcChannelTranspose, kcChannelDuplicate, kcChannelAddBefore, kcChannelAddAfter, kcChannelRemove, kcChannelMoveLeft, kcChannelMoveRight, kcChannelSettings, kcEndChannelKeys = kcChannelSettings, kcBeginTranspose, kcTransposeUp = kcBeginTranspose, kcTransposeDown, kcTransposeOctUp, kcTransposeOctDown, kcTransposeCustom, kcTransposeCustomQuick, kcDataEntryUp, kcDataEntryDown, kcDataEntryUpCoarse, kcDataEntryDownCoarse, kcEndTranspose = kcDataEntryDownCoarse, kcPatternAmplify, kcPatternInterpolateNote, kcPatternInterpolateInstr, kcPatternInterpolateVol, kcPatternInterpolateEffect, kcPatternVisualizeEffect, kcPatternOpenRandomizer, kcPatternGoto, kcPatternSetInstrument, kcPatternSetInstrumentNotEmpty, kcPatternGrowSelection, kcPatternShrinkSelection, // kcClearSelection, kcClearRow, kcClearField, kcClearFieldITStyle, kcClearRowStep, kcClearFieldStep, kcClearFieldStepITStyle, kcDeleteRow, kcDeleteWholeRow, kcDeleteRowGlobal, kcDeleteWholeRowGlobal, kcInsertRow, kcInsertWholeRow, kcInsertRowGlobal, kcInsertWholeRowGlobal, kcPrevPattern, kcNextPattern, kcPrevSequence, kcNextSequence, kcEndPatternEditing = kcNextSequence, //Notes kcVPStartNotes, kcVPNoteC_0 = kcVPStartNotes, kcVPNoteCS0, kcVPNoteD_0, kcVPNoteDS0, kcVPNoteE_0, kcVPNoteF_0, kcVPNoteFS0, kcVPNoteG_0, kcVPNoteGS0, kcVPNoteA_1, kcVPNoteAS1, kcVPNoteB_1, kcVPNoteC_1, kcVPNoteCS1, kcVPNoteD_1, kcVPNoteDS1, kcVPNoteE_1, kcVPNoteF_1, kcVPNoteFS1, kcVPNoteG_1, kcVPNoteGS1, kcVPNoteA_2, kcVPNoteAS2, kcVPNoteB_2, kcVPNoteC_2, kcVPNoteCS2, kcVPNoteD_2, kcVPNoteDS2, kcVPNoteE_2, kcVPNoteF_2, kcVPNoteFS2, kcVPNoteG_2, kcVPNoteGS2, kcVPNoteA_3, kcVPEndNotes = kcVPNoteA_3, //Note stops kcVPStartNoteStops, kcVPNoteStopC_0 = kcVPStartNoteStops, kcVPNoteStopCS0, kcVPNoteStopD_0, kcVPNoteStopDS0, kcVPNoteStopE_0, kcVPNoteStopF_0, kcVPNoteStopFS0, kcVPNoteStopG_0, kcVPNoteStopGS0, kcVPNoteStopA_1, kcVPNoteStopAS1, kcVPNoteStopB_1, kcVPNoteStopC_1, kcVPNoteStopCS1, kcVPNoteStopD_1, kcVPNoteStopDS1, kcVPNoteStopE_1, kcVPNoteStopF_1, kcVPNoteStopFS1, kcVPNoteStopG_1, kcVPNoteStopGS1, kcVPNoteStopA_2, kcVPNoteStopAS2, kcVPNoteStopB_2, kcVPNoteStopC_2, kcVPNoteStopCS2, kcVPNoteStopD_2, kcVPNoteStopDS2, kcVPNoteStopE_2, kcVPNoteStopF_2, kcVPNoteStopFS2, kcVPNoteStopG_2, kcVPNoteStopGS2, kcVPNoteStopA_3, kcVPEndNoteStops = kcVPNoteStopA_3, //Chords kcVPStartChords, kcVPChordC_0 = kcVPStartChords, kcVPChordCS0, kcVPChordD_0, kcVPChordDS0, kcVPChordE_0, kcVPChordF_0, kcVPChordFS0, kcVPChordG_0, kcVPChordGS0, kcVPChordA_1, kcVPChordAS1, kcVPChordB_1, kcVPChordC_1, kcVPChordCS1, kcVPChordD_1, kcVPChordDS1, kcVPChordE_1, kcVPChordF_1, kcVPChordFS1, kcVPChordG_1, kcVPChordGS1, kcVPChordA_2, kcVPChordAS2, kcVPChordB_2, kcVPChordC_2, kcVPChordCS2, kcVPChordD_2, kcVPChordDS2, kcVPChordE_2, kcVPChordF_2, kcVPChordFS2, kcVPChordG_2, kcVPChordGS2, kcVPChordA_3, kcVPEndChords = kcVPChordA_3, //Chord Stops kcVPStartChordStops, kcVPChordStopC_0 = kcVPStartChordStops, kcVPChordStopCS0, kcVPChordStopD_0, kcVPChordStopDS0, kcVPChordStopE_0, kcVPChordStopF_0, kcVPChordStopFS0, kcVPChordStopG_0, kcVPChordStopGS0, kcVPChordStopA_1, kcVPChordStopAS1, kcVPChordStopB_1, kcVPChordStopC_1, kcVPChordStopCS1, kcVPChordStopD_1, kcVPChordStopDS1, kcVPChordStopE_1, kcVPChordStopF_1, kcVPChordStopFS1, kcVPChordStopG_1, kcVPChordStopGS1, kcVPChordStopA_2, kcVPChordStopAS2, kcVPChordStopB_2, kcVPChordStopC_2, kcVPChordStopCS2, kcVPChordStopD_2, kcVPChordStopDS2, kcVPChordStopE_2, kcVPChordStopF_2, kcVPChordStopFS2, kcVPChordStopG_2, kcVPChordStopGS2, kcVPChordStopA_3, kcVPEndChordStops = kcVPChordStopA_3, //Set octave from note column kcSetOctave0, kcSetOctave1, kcSetOctave2, kcSetOctave3, kcSetOctave4, kcSetOctave5, kcSetOctave6, kcSetOctave7, kcSetOctave8, kcSetOctave9, // Release set octave key kcSetOctaveStop0, kcSetOctaveStop1, kcSetOctaveStop2, kcSetOctaveStop3, kcSetOctaveStop4, kcSetOctaveStop5, kcSetOctaveStop6, kcSetOctaveStop7, kcSetOctaveStop8, kcSetOctaveStop9, //Note Misc kcStartNoteMisc, kcChordModifier = kcStartNoteMisc, kcNoteCutOld, kcNoteOffOld, kcNoteFadeOld, kcNoteCut, kcNoteOff, kcNoteFade, kcNotePC, kcNotePCS, kcEndNoteMisc = kcNotePCS, //Set instruments kcSetIns0, kcSetIns1, kcSetIns2, kcSetIns3, kcSetIns4, kcSetIns5, kcSetIns6, kcSetIns7, kcSetIns8, kcSetIns9, //Volume stuff kcSetVolumeStart, kcSetVolume0 = kcSetVolumeStart, kcSetVolume1, kcSetVolume2, kcSetVolume3, kcSetVolume4, kcSetVolume5, kcSetVolume6, kcSetVolume7, kcSetVolume8, kcSetVolume9, kcSetVolumeVol, //v kcSetVolumePan, //p kcSetVolumeVolSlideUp, //c kcSetVolumeVolSlideDown, //d kcSetVolumeFineVolUp, //a kcSetVolumeFineVolDown, //b kcSetVolumeVibratoSpd, //u kcSetVolumeVibrato, //h kcSetVolumeXMPanLeft, //l kcSetVolumeXMPanRight, //r kcSetVolumePortamento, //g kcSetVolumeITPortaUp, //f kcSetVolumeITPortaDown, //e kcSetVolumeITUnused, //: kcSetVolumeITOffset, //o kcSetVolumeEnd = kcSetVolumeITOffset, //Effect params kcSetFXParam0, kcSetFXParam1, kcSetFXParam2, kcSetFXParam3, kcSetFXParam4, kcSetFXParam5, kcSetFXParam6, kcSetFXParam7, kcSetFXParam8, kcSetFXParam9, kcSetFXParamA, kcSetFXParamB, kcSetFXParamC, kcSetFXParamD, kcSetFXParamE, kcSetFXParamF, //Effect commands. ORDER IS CRUCIAL. kcSetFXStart, kcFixedFXStart = kcSetFXStart, kcSetFXarp = kcSetFXStart, //0,j kcSetFXportUp, //1,f kcSetFXportDown, //2,e kcSetFXport, //3,g kcSetFXvibrato, //4,h kcSetFXportSlide, //5,l kcSetFXvibSlide, //6,k kcSetFXtremolo, //7,r kcSetFXpan, //8,x kcSetFXoffset, //9,o kcSetFXvolSlide, //a,d kcSetFXgotoOrd, //b,b kcSetFXsetVol, //c,? kcSetFXgotoRow, //d,c kcSetFXretrig, //r,q kcSetFXspeed, //?,a kcSetFXtempo, //f,t kcSetFXtremor, //t,i kcSetFXextendedMOD, //e,? kcSetFXextendedS3M, //?,s kcSetFXchannelVol, //?,m kcSetFXchannelVols, //?,n kcSetFXglobalVol, //g,v kcSetFXglobalVols, //h,w kcSetFXkeyoff, //k,? kcSetFXfineVib, //?,u kcSetFXpanbrello, //y,y kcSetFXextendedXM, //x,? kcSetFXpanSlide, //p,p kcSetFXsetEnvPos, //l,? kcSetFXmacro, //z,z kcFixedFXend = kcSetFXmacro, kcSetFXmacroSlide, //?,\ , kcSetFXdelaycut, //?,: kcSetFXextension, //?,# kcSetFXFinetune, //?,+ kcSetFXFinetuneSmooth, //?,* kcSetFXEnd = kcSetFXFinetuneSmooth, kcStartInstrumentMisc, kcInstrumentLoad = kcStartInstrumentMisc, kcInstrumentSave, kcInstrumentNew, kcInstrumentEnvelopeLoad, kcInstrumentEnvelopeSave, kcInstrumentEnvelopeZoomIn, kcInstrumentEnvelopeZoomOut, kcInstrumentEnvelopeScale, kcInstrumentEnvelopeSwitchToVolume, kcInstrumentEnvelopeSwitchToPanning, kcInstrumentEnvelopeSwitchToPitch, kcInstrumentEnvelopeToggleVolume, kcInstrumentEnvelopeTogglePanning, kcInstrumentEnvelopeTogglePitch, kcInstrumentEnvelopeToggleFilter, kcInstrumentEnvelopeToggleLoop, kcInstrumentEnvelopeSelectLoopStart, kcInstrumentEnvelopeSelectLoopEnd, kcInstrumentEnvelopeToggleSustain, kcInstrumentEnvelopeSelectSustainStart, kcInstrumentEnvelopeSelectSustainEnd, kcInstrumentEnvelopeToggleCarry, kcInstrumentEnvelopePointPrev, kcInstrumentEnvelopePointNext, kcInstrumentEnvelopePointMoveLeft, kcInstrumentEnvelopePointMoveRight, kcInstrumentEnvelopePointMoveLeftCoarse, kcInstrumentEnvelopePointMoveRightCoarse, kcInstrumentEnvelopePointMoveUp, kcInstrumentEnvelopePointMoveUp8, kcInstrumentEnvelopePointMoveDown, kcInstrumentEnvelopePointMoveDown8, kcInstrumentEnvelopePointInsert, kcInstrumentEnvelopePointRemove, kcInstrumentEnvelopeSetLoopStart, kcInstrumentEnvelopeSetLoopEnd, kcInstrumentEnvelopeSetSustainLoopStart, kcInstrumentEnvelopeSetSustainLoopEnd, kcInstrumentEnvelopeToggleReleaseNode, kcEndInstrumentMisc = kcInstrumentEnvelopeToggleReleaseNode, kcStartInstrumentCtrlMisc, kcInstrumentCtrlLoad = kcStartInstrumentCtrlMisc, kcInstrumentCtrlSave, kcInstrumentCtrlNew, kcInstrumentCtrlDuplicate, kcInsNoteMapEditSampleMap, kcInsNoteMapEditSample, kcInsNoteMapCopyCurrentNote, kcInsNoteMapCopyCurrentSample, kcInsNoteMapReset, kcInsNoteMapTransposeSamples, kcInsNoteMapRemove, kcInsNoteMapTransposeUp, kcInsNoteMapTransposeDown, kcInsNoteMapTransposeOctUp, kcInsNoteMapTransposeOctDown, kcEndInstrumentCtrlMisc = kcInsNoteMapTransposeOctDown, kcStartSampleMisc, kcSampleLoad = kcStartSampleMisc, kcSampleLoadRaw, kcSampleSave, kcSampleNew, kcSampleDuplicate, kcSampleInitializeOPL, kcSampleTransposeUp, kcSampleTransposeDown, kcSampleTransposeOctUp, kcSampleTransposeOctDown, kcEndSampleMisc = kcSampleTransposeOctDown, kcStartSampleEditing, kcSampleTrim = kcStartSampleEditing, kcSampleTrimToLoopEnd, kcSampleSilence, kcSampleNormalize, kcSampleAmplify, kcSampleReverse, kcSampleDelete, kcSampleToggleDrawing, kcSampleResize, kcSampleGrid, kcSampleZoomUp, kcSampleZoomDown, kcSampleZoomSelection, kcSampleCenterSampleStart, kcSampleCenterSampleEnd, kcSampleCenterLoopStart, kcSampleCenterLoopEnd, kcSampleCenterSustainStart, kcSampleCenterSustainEnd, kcSampleConvertPingPongLoop, kcSampleConvertPingPongSustain, kcSample8Bit, kcSampleMonoMix, kcSampleMonoLeft, kcSampleMonoRight, kcSampleMonoSplit, kcSampleStereoSep, kcSampleUpsample, kcSampleDownsample, kcSampleResample, kcSampleInvert, kcSampleSignUnsign, kcSampleRemoveDCOffset, kcSampleQuickFade, kcSampleXFade, kcSampleAutotune, kcEndSampleEditing = kcSampleAutotune, kcStartSampleCues, kcEndSampleCues = kcStartSampleCues + 8, kcSampleSlice, kcEndSampleCueGroup = kcSampleSlice, kcSampStartNotes, kcSampEndNotes = kcSampStartNotes + kcCommandSetNumNotes, kcSampStartNoteStops, kcSampEndNoteStops = kcSampStartNoteStops + kcCommandSetNumNotes, kcInstrumentStartNotes, kcInstrumentEndNotes = kcInstrumentStartNotes + kcCommandSetNumNotes, kcInstrumentStartNoteStops, kcInstrumentEndNoteStops = kcInstrumentStartNoteStops + kcCommandSetNumNotes, kcTreeViewStartNotes, kcTreeViewEndNotes = kcTreeViewStartNotes + kcCommandSetNumNotes, kcTreeViewStartNoteStops, kcTreeViewEndNoteStops = kcTreeViewStartNoteStops + kcCommandSetNumNotes, kcInsNoteMapStartNotes, kcInsNoteMapEndNotes = kcInsNoteMapStartNotes + kcCommandSetNumNotes, kcInsNoteMapStartNoteStops, kcInsNoteMapEndNoteStops = kcInsNoteMapStartNoteStops + kcCommandSetNumNotes, kcVSTGUIStartNotes, kcVSTGUIEndNotes = kcVSTGUIStartNotes + kcCommandSetNumNotes, kcVSTGUIStartNoteStops, kcVSTGUIEndNoteStops = kcVSTGUIStartNoteStops + kcCommandSetNumNotes, kcCommentsStartNotes, kcCommentsEndNotes = kcCommentsStartNotes + kcCommandSetNumNotes, kcCommentsStartNoteStops, kcCommentsEndNoteStops = kcCommentsStartNoteStops + kcCommandSetNumNotes, kcTreeViewStopPreview, kcStartVSTGUICommands, kcVSTGUIPrevPreset = kcStartVSTGUICommands, kcVSTGUINextPreset, kcVSTGUIPrevPresetJump, kcVSTGUINextPresetJump, kcVSTGUIRandParams, kcVSTGUIToggleRecordParams, kcVSTGUIToggleRecordMIDIOut, kcVSTGUIToggleSendKeysToPlug, kcVSTGUIBypassPlug, kcEndVSTGUICommands = kcVSTGUIBypassPlug, kcStartOrderlistCommands, // Orderlist edit kcStartOrderlistEdit = kcStartOrderlistCommands, kcOrderlistEditDelete = kcStartOrderlistEdit, kcOrderlistEditInsert, kcOrderlistEditInsertSeparator, kcOrderlistEditCopyOrders, kcMergePatterns, kcOrderlistEditPattern, kcOrderlistSwitchToPatternView, kcEndOrderlistEdit = kcOrderlistSwitchToPatternView, // Orderlist navigation kcStartOrderlistNavigation, kcOrderlistNavigateLeft = kcStartOrderlistNavigation, kcOrderlistNavigateRight, kcOrderlistNavigateFirst, kcOrderlistNavigateLast, kcEndOrderlistNavigation = kcOrderlistNavigateLast, // with selection key(must match order above) kcStartOrderlistNavigationSelect, kcOrderlistNavigateLeftSelect = kcStartOrderlistNavigationSelect, kcOrderlistNavigateRightSelect, kcOrderlistNavigateFirstSelect, kcOrderlistNavigateLastSelect, kcEndOrderlistNavigationSelect = kcOrderlistNavigateLastSelect, // Orderlist pattern list edit kcStartOrderlistNum, kcOrderlistPat0 = kcStartOrderlistNum, kcOrderlistPat1, kcOrderlistPat2, kcOrderlistPat3, kcOrderlistPat4, kcOrderlistPat5, kcOrderlistPat6, kcOrderlistPat7, kcOrderlistPat8, kcOrderlistPat9, kcOrderlistPatPlus, kcOrderlistPatMinus, kcOrderlistPatIgnore, kcOrderlistPatInvalid, kcEndOrderlistNum = kcOrderlistPatInvalid, // Playback lock kcStartOrderlistLock, kcOrderlistLockPlayback = kcStartOrderlistLock, kcOrderlistUnlockPlayback, kcEndOrderlistLock = kcOrderlistUnlockPlayback, kcEndOrderlistCommands = kcEndOrderlistLock, kcStartChnSettingsCommands, kcChnSettingsPrev = kcStartChnSettingsCommands, kcChnSettingsNext, kcChnColorFromPrev, kcChnColorFromNext, kcChnSettingsClose, kcEndChnSettingsCommands = kcChnSettingsClose, kcStartCommentsCommands, kcToggleSmpInsList = kcStartCommentsCommands, kcExecuteSmpInsListItem, kcRenameSmpInsListItem, kcEndCommentsCommands = kcRenameSmpInsListItem, kcNumCommands, }; enum Modifiers : uint8 { ModNone = 0, ModShift = HOTKEYF_SHIFT, ModCtrl = HOTKEYF_CONTROL, ModAlt = HOTKEYF_ALT, ModWin = HOTKEYF_EXT, ModMidi = HOTKEYF_MIDI, ModRShift = HOTKEYF_RSHIFT, ModRCtrl = HOTKEYF_RCONTROL, ModRAlt = HOTKEYF_RALT, MaxMod = ModShift | ModCtrl | ModAlt | ModWin | ModMidi | ModRShift | ModRCtrl | ModRAlt, }; DECLARE_FLAGSET(Modifiers) struct KeyCombination { protected: InputTargetContext ctx; // TODO: This should probably rather be a member of CommandStruct and not of the individual key combinations for consistency's sake. FlagSet mod; uint8 code; FlagSet event; constexpr uint32 AsUint32() const { static_assert(sizeof(KeyCombination) == sizeof(uint32)); return (static_cast(ctx) << 0) | (static_cast(mod.GetRaw()) << 8) | (static_cast(code) << 16) | (static_cast(event.GetRaw()) << 24); } public: KeyCombination(InputTargetContext context = kCtxAllContexts, FlagSet modifier = ModNone, UINT key = 0, FlagSet type = kKeyEventNone) : ctx(context) , mod(modifier) , code(static_cast(key)) , event(type) { } constexpr bool operator==(const KeyCombination &other) const { return ctx == other.ctx && mod == other.mod && code == other.code && event == other.event; } constexpr bool operator<(const KeyCombination &kc) const { return AsUint32() < kc.AsUint32(); } // Getters / Setters void Context(InputTargetContext context) { ctx = context; } constexpr InputTargetContext Context() const { return ctx; } void Modifier(FlagSet modifier) { mod = modifier; } constexpr FlagSet Modifier() const { return mod; } void Modifier(const KeyCombination &other) { mod = other.mod; } void AddModifier(FlagSet modifier) { mod |= modifier; } void AddModifier(const KeyCombination &other) { mod |= other.mod; } void KeyCode(UINT key) { code = static_cast(key); } constexpr UINT KeyCode() const { return code; } void EventType(FlagSet type) { event = type; } constexpr FlagSet EventType() const { return event; } static KeyCombination FromLPARAM(LPARAM lParam) { return KeyCombination( static_cast((lParam >> 0) & 0xFF), static_cast((lParam >> 8) & 0xFF), static_cast((lParam >> 16) & 0xFF), static_cast((lParam >> 24) & 0xFF)); } LPARAM AsLPARAM() const { return AsUint32(); } // Key combination to string static CString GetContextText(InputTargetContext ctx); CString GetContextText() const { return GetContextText(Context()); } static CString GetModifierText(FlagSet mod); CString GetModifierText() const { return GetModifierText(Modifier()); } static CString GetKeyText(FlagSet mod, UINT code); CString GetKeyText() const { return GetKeyText(Modifier(), KeyCode()); } static CString GetKeyEventText(FlagSet event); CString GetKeyEventText() const { return GetKeyEventText(EventType()); } static bool IsExtended(UINT code); }; using KeyMap = std::multimap; using KeyMapRange = std::pair; //KeyMap struct KeyCommand { static constexpr uint32 Dummy = 1u << 31; static constexpr uint32 Hidden = 1u << 30; static constexpr uint32 UIDMask = Hidden - 1u; std::vector kcList; CString Message; protected: uint32 UID = 0; public: KeyCommand() = default; KeyCommand(uint32 uid, const TCHAR *message = _T(""), std::vector keys = {}); // Unique ID for on-disk keymap format. // Note that hidden commands do not have a unique ID, because they are never written to keymap files. uint32 ID() const noexcept { return UID & UIDMask; } // e.g. Chord modifier is a dummy command, which serves only to automatically // generate a set of key combinations for chords bool IsDummy() const noexcept { return (UID & Dummy) != 0; } // Hidden commands are not configurable by the user (e.g. derived from dummy commands or note entry keys duplicated into other contexts) bool IsHidden() const noexcept { return (UID & Hidden) != 0; } }; enum RuleID { krPreventDuplicate, krDeleteOldOnConflict, krAllowNavigationWithSelection, krAllowSelectionWithNavigation, krAutoSelectOff, krAllowSelectCopySelectCombos, krLockNotesToChords, krNoteOffOnKeyRelease, krPropagateNotes, krReassignDigitsToOctaves, krAutoSpacing, krCheckModifiers, krPropagateSampleManipulation, kNumRules }; struct CModSpecifications; class CCommandSet { protected: //util void SetupCommands(); void SetupContextHierarchy(); CString EnforceAll(KeyCombination kc, CommandID cmd, bool adding); CommandID FindCmd(uint32 uid) const; bool KeyCombinationConflict(KeyCombination kc1, KeyCombination kc2, bool checkEventConflict = true) const; const CModSpecifications *m_oldSpecs = nullptr; KeyCommand m_commands[kcNumCommands]; std::bitset m_isParentContext[kCtxMaxInputContexts]; std::bitset m_enforceRule; public: CCommandSet(); // Population CString Add(KeyCombination kc, CommandID cmd, bool overwrite, int pos = -1, bool checkEventConflict = true); CString Remove(KeyCombination kc, CommandID cmd); CString Remove(int pos, CommandID cmd); std::pair IsConflicting(KeyCombination kc, CommandID cmd, bool checkEventConflict = true) const; bool IsCrossContextConflict(KeyCombination kc1, KeyCombination kc2) const; // Tranformation bool QuickChange_SetEffects(const CModSpecifications &modSpecs); bool QuickChange_NotesRepeat(bool repeat); // Communication KeyCombination GetKey(CommandID cmd, UINT key) const { return m_commands[cmd].kcList[key]; } bool isHidden(UINT c) const { return m_commands[c].IsHidden(); } int GetKeyListSize(CommandID cmd) const { return (cmd != kcNull) ? static_cast(m_commands[cmd].kcList.size()) : 0; } CString GetCommandText(CommandID cmd) const { return m_commands[cmd].Message; } CString GetKeyTextFromCommand(CommandID c, UINT key) const; // Pululation ;) void Copy(const CCommandSet *source); // Copy the contents of a commandset into this command set void GenKeyMap(KeyMap &km); // Generate a keymap from this command set bool SaveFile(const mpt::PathString &filename); bool LoadFile(const mpt::PathString &filename); bool LoadFile(std::istream &iStrm, const mpt::ustring &filenameDescription, const bool fillExistingSet = false); bool LoadDefaultKeymap(); }; OPENMPT_NAMESPACE_END