#lang scribble/manual
@(require (for-label racket))

@title{Modifier Keys}
 macOS Modifier key reference@section{categories}
  GUI, Platform>macOS (OS X)

@section{note}
  This document might be outdated.. ::

An integer bit field indicating the modifier keys in effect. You can examine individual flag settings using the C bitwise AND operator.

@section{table}
 
## 65536 NSAlphaShiftKeyMask || Set if Caps Lock key is pressed.

## 131072 NSShiftKeyMask || Set if Shift key is pressed.

## 262144 NSControlKeyMask || Set if Control key is pressed.

## 524288 NSAlternateKeyMask || Set if Option or Alternate key is pressed.

## 1048576 NSCommandKeyMask || Set if Command key is pressed.

## 2097152 NSNumericPadKeyMask || Set if any key in the numeric keypad is pressed. The numeric keypad is generally on the right side of the keyboard.

## 4194304 NSHelpKeyMask || Set if the Help key is pressed.

## 8388608 NSFunctionKeyMask || Set if any function key is pressed. The function keys include the F keys at the top of most keyboards (F1, F2, and so on) and the navigation keys in the center of most keyboards (Help, Forward Delete, Home, End, Page Up, Page Down, and the arrow keys).

## Arrow keys || Arrow keys have an extra modifier value of 10485760 so for a shift arrow key do a bitwise 'or' with the shift mask: 
@racketblock[10485760 | 131072 = 10616832 // this is the mask for shift arrow key::
::

Three usage examples, direct and with helper methods ]

@racketblock[isCaps::, ]

@racketblock[isShift::, ]

@racketblock[isCtrl::, ]

@racketblock[isAlt::, ]

@racketblock[isCmd::, ]

@racketblock[isNumPad::, ]

@racketblock[isHelp::, ]

@racketblock[isFun:::

]

@racketblock[
(
w = Window.new.front; w.addFlowLayout;

	// direct, using bit field
Button(w, Rect(0,0,390,50)).states_([["hold shift/alt keys and click"]])
	.action_ { |but, mod|
		if (mod & 131072 == 131072) { "shift key was pressed.".postln; };
		if (mod & 524288 == 524288) { "alt key was pressed.".postln; };
	};

	// using helper methods
Button(w, Rect(0,0,390,50)).states_([["hold any mod keys and click"]])
	.action_ { |but, mod|
		if(mod.isCaps) { "mod pressed: Caps.".postln };
		if(mod.isShift) { "mod pressed: Shift.".postln };
		if(mod.isCtrl) { "mod pressed: Ctrl.".postln };
		if(mod.isAlt) { "mod pressed: Alt.".postln };
		if(mod.isNumPad) { "mod pressed: NumPad.".postln };
		if(mod.isHelp) { "mod pressed: Help.".postln };
		if(mod.isFun) { "mod pressed: Fun.".postln };
	};

	// collecting all modifiers
Button(w, Rect(0,0,390,50)).states_([["hold any mod keys and click"]])
	.action_ { |but, mod|
		var pressed;
		#[\isCaps, \isShift, \isCtrl, \isAlt, \isCmd, \isNumPad, \isHelp, \isFun].do { |x|
			if(mod.perform(x)) { pressed = pressed.add(x) }
		};
		pressed.postln;
	};
)
::
]


