get_modifiers.cpp 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #include "get_modifiers.h"
  2. /* glutGetModifiers return mask. */
  3. #ifndef GLUT_ACTIVE_SHIFT
  4. # define GLUT_ACTIVE_SHIFT 1
  5. #endif
  6. #ifndef GLUT_ACTIVE_CTRL
  7. # define GLUT_ACTIVE_CTRL 2
  8. #endif
  9. #ifndef GLUT_ACTIVE_ALT
  10. # define GLUT_ACTIVE_ALT 4
  11. #endif
  12. #ifndef GLUT_ACTIVE_COMMAND
  13. # define GLUT_ACTIVE_COMMAND 8
  14. #endif
  15. #ifdef __APPLE__
  16. //#include <Carbon/HIToolbox/Events.h>
  17. #include <Carbon/Carbon.h>
  18. #endif
  19. // FORCED INLINE
  20. inline int igl::get_modifiers()
  21. {
  22. int mod = 0;
  23. #ifdef __APPLE__
  24. // http://stackoverflow.com/a/18082326/148668
  25. KeyMap keyStates;
  26. const auto & carbon_is_keydown = [&keyStates]( uint16_t vKey )->bool
  27. {
  28. uint8_t index = vKey / 32 ;
  29. uint8_t shift = vKey % 32 ;
  30. return keyStates[index].bigEndianValue & (1 << shift) ;
  31. };
  32. GetKeys(keyStates) ;
  33. mod |= (carbon_is_keydown(kVK_Command)?GLUT_ACTIVE_COMMAND:0);
  34. mod |= (carbon_is_keydown(kVK_Shift)?GLUT_ACTIVE_SHIFT:0);
  35. mod |= (carbon_is_keydown(kVK_Option)?GLUT_ACTIVE_ALT:0);
  36. mod |= (carbon_is_keydown(kVK_Control)?GLUT_ACTIVE_CTRL:0);
  37. #else
  38. # warning "igl::get_modifiers not supported on your OS, some demos may not work correctly."
  39. #endif
  40. return mod;
  41. }