|
- /*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2013 - Raw Material Software Ltd.
-
- Permission is granted to use this software under the terms of either:
- a) the GPL v2 (or any later version)
- b) the Affero GPL v3
-
- Details of these licenses can be found at: www.gnu.org/licenses
-
- JUCE 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.
-
- ------------------------------------------------------------------------------
-
- To release a closed-source product which uses JUCE, commercial licenses are
- available: visit www.juce.com for more information.
-
- ==============================================================================
- */
-
- #ifndef JUCE_MODIFIERKEYS_H_INCLUDED
- #define JUCE_MODIFIERKEYS_H_INCLUDED
-
-
- //==============================================================================
- /**
- Represents the state of the mouse buttons and modifier keys.
-
- This is used both by mouse events and by KeyPress objects to describe
- the state of keys such as shift, control, alt, etc.
-
- @see KeyPress, MouseEvent::mods
- */
- class JUCE_API ModifierKeys
- {
- public:
- //==============================================================================
- /** Creates a ModifierKeys object with no flags set. */
- ModifierKeys() noexcept;
-
- /** Creates a ModifierKeys object from a raw set of flags.
-
- @param flags to represent the keys that are down
- @see shiftModifier, ctrlModifier, altModifier, leftButtonModifier,
- rightButtonModifier, commandModifier, popupMenuClickModifier
- */
- ModifierKeys (int flags) noexcept;
-
- /** Creates a copy of another object. */
- ModifierKeys (const ModifierKeys& other) noexcept;
-
- /** Copies this object from another one. */
- ModifierKeys& operator= (const ModifierKeys other) noexcept;
-
- //==============================================================================
- /** Checks whether the 'command' key flag is set (or 'ctrl' on Windows/Linux).
-
- This is a platform-agnostic way of checking for the operating system's
- preferred command-key modifier - so on the Mac it tests for the Apple key, on
- Windows/Linux, it's actually checking for the CTRL key.
- */
- inline bool isCommandDown() const noexcept { return testFlags (commandModifier); }
-
- /** Checks whether the user is trying to launch a pop-up menu.
-
- This checks for platform-specific modifiers that might indicate that the user
- is following the operating system's normal method of showing a pop-up menu.
-
- So on Windows/Linux, this method is really testing for a right-click.
- On the Mac, it tests for either the CTRL key being down, or a right-click.
- */
- inline bool isPopupMenu() const noexcept { return testFlags (popupMenuClickModifier); }
-
- /** Checks whether the flag is set for the left mouse-button. */
- inline bool isLeftButtonDown() const noexcept { return testFlags (leftButtonModifier); }
-
- /** Checks whether the flag is set for the right mouse-button.
-
- Note that for detecting popup-menu clicks, you should be using isPopupMenu() instead, as
- this is platform-independent (and makes your code more explanatory too).
- */
- inline bool isRightButtonDown() const noexcept { return testFlags (rightButtonModifier); }
-
- inline bool isMiddleButtonDown() const noexcept { return testFlags (middleButtonModifier); }
-
- /** Tests for any of the mouse-button flags. */
- inline bool isAnyMouseButtonDown() const noexcept { return testFlags (allMouseButtonModifiers); }
-
- /** Tests for any of the modifier key flags. */
- inline bool isAnyModifierKeyDown() const noexcept { return testFlags ((shiftModifier | ctrlModifier | altModifier | commandModifier)); }
-
- /** Checks whether the shift key's flag is set. */
- inline bool isShiftDown() const noexcept { return testFlags (shiftModifier); }
-
- /** Checks whether the CTRL key's flag is set.
-
- Remember that it's better to use the platform-agnostic routines to test for command-key and
- popup-menu modifiers.
-
- @see isCommandDown, isPopupMenu
- */
- inline bool isCtrlDown() const noexcept { return testFlags (ctrlModifier); }
-
- /** Checks whether the ALT key's flag is set. */
- inline bool isAltDown() const noexcept { return testFlags (altModifier); }
-
- //==============================================================================
- /** Flags that represent the different keys. */
- enum Flags
- {
- /** Indicates no modifier keys. */
- noModifiers = 0,
-
- /** Shift key flag. */
- shiftModifier = 1,
-
- /** CTRL key flag. */
- ctrlModifier = 2,
-
- /** ALT key flag. */
- altModifier = 4,
-
- /** Left mouse button flag. */
- leftButtonModifier = 16,
-
- /** Right mouse button flag. */
- rightButtonModifier = 32,
-
- /** Middle mouse button flag. */
- middleButtonModifier = 64,
-
- #if JUCE_MAC
- /** Command key flag - on windows this is the same as the CTRL key flag. */
- commandModifier = 8,
-
- /** Popup menu flag - on windows this is the same as rightButtonModifier, on the
- Mac it's the same as (rightButtonModifier | ctrlModifier). */
- popupMenuClickModifier = rightButtonModifier | ctrlModifier,
- #else
- /** Command key flag - on windows this is the same as the CTRL key flag. */
- commandModifier = ctrlModifier,
-
- /** Popup menu flag - on windows this is the same as rightButtonModifier, on the
- Mac it's the same as (rightButtonModifier | ctrlModifier). */
- popupMenuClickModifier = rightButtonModifier,
- #endif
-
- /** Represents a combination of all the shift, alt, ctrl and command key modifiers. */
- allKeyboardModifiers = shiftModifier | ctrlModifier | altModifier | commandModifier,
-
- /** Represents a combination of all the mouse buttons at once. */
- allMouseButtonModifiers = leftButtonModifier | rightButtonModifier | middleButtonModifier,
-
- /** Represents a combination of all the alt, ctrl and command key modifiers. */
- ctrlAltCommandModifiers = ctrlModifier | altModifier | commandModifier
- };
-
- //==============================================================================
- /** Returns a copy of only the mouse-button flags */
- ModifierKeys withOnlyMouseButtons() const noexcept { return ModifierKeys (flags & allMouseButtonModifiers); }
-
- /** Returns a copy of only the non-mouse flags */
- ModifierKeys withoutMouseButtons() const noexcept { return ModifierKeys (flags & ~allMouseButtonModifiers); }
-
- bool operator== (const ModifierKeys other) const noexcept { return flags == other.flags; }
- bool operator!= (const ModifierKeys other) const noexcept { return flags != other.flags; }
-
- //==============================================================================
- /** Returns the raw flags for direct testing. */
- inline int getRawFlags() const noexcept { return flags; }
-
- ModifierKeys withoutFlags (int rawFlagsToClear) const noexcept { return ModifierKeys (flags & ~rawFlagsToClear); }
- ModifierKeys withFlags (int rawFlagsToSet) const noexcept { return ModifierKeys (flags | rawFlagsToSet); }
-
- /** Tests a combination of flags and returns true if any of them are set. */
- bool testFlags (int flagsToTest) const noexcept { return (flags & flagsToTest) != 0; }
-
- /** Returns the total number of mouse buttons that are down. */
- int getNumMouseButtonsDown() const noexcept;
-
- //==============================================================================
- /** Creates a ModifierKeys object to represent the last-known state of the
- keyboard and mouse buttons.
-
- @see getCurrentModifiersRealtime
- */
- static ModifierKeys getCurrentModifiers() noexcept;
-
- /** Creates a ModifierKeys object to represent the current state of the
- keyboard and mouse buttons.
-
- This isn't often needed and isn't recommended, but will actively check all the
- mouse and key states rather than just returning their last-known state like
- getCurrentModifiers() does.
-
- This is only needed in special circumstances for up-to-date modifier information
- at times when the app's event loop isn't running normally.
-
- Another reason to avoid this method is that it's not stateless, and calling it may
- update the value returned by getCurrentModifiers(), which could cause subtle changes
- in the behaviour of some components.
- */
- static ModifierKeys getCurrentModifiersRealtime() noexcept;
-
-
- private:
- //==============================================================================
- int flags;
-
- friend class ComponentPeer;
- friend class MouseInputSource;
- friend class MouseInputSourceInternal;
-
- static ModifierKeys currentModifiers;
- static void updateCurrentModifiers() noexcept;
- };
-
-
- #endif // JUCE_MODIFIERKEYS_H_INCLUDED
|