ruby-glfw 0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (206) hide show
  1. data/README +1 -0
  2. data/README.API +73 -0
  3. data/Rakefile +120 -0
  4. data/examples/boing.rb +519 -0
  5. data/examples/gears.rb +327 -0
  6. data/examples/keytest.rb +117 -0
  7. data/examples/listmodes.rb +20 -0
  8. data/examples/mipmaps.rb +104 -0
  9. data/examples/mipmaps.tga +0 -0
  10. data/examples/particles.rb +837 -0
  11. data/examples/pong3d.rb +741 -0
  12. data/examples/pong3d_field.tga +0 -0
  13. data/examples/pong3d_instr.tga +0 -0
  14. data/examples/pong3d_menu.tga +0 -0
  15. data/examples/pong3d_title.tga +0 -0
  16. data/examples/pong3d_winner1.tga +0 -0
  17. data/examples/pong3d_winner2.tga +0 -0
  18. data/examples/splitview.rb +432 -0
  19. data/examples/triangle.rb +89 -0
  20. data/examples/wave.rb +294 -0
  21. data/ext/glfw/glfw.c +1094 -0
  22. data/ext/glfw/mkrf_conf.rb +70 -0
  23. data/glfw-src/Makefile +220 -0
  24. data/glfw-src/compile.ami +61 -0
  25. data/glfw-src/compile.bat +217 -0
  26. data/glfw-src/compile.sh +607 -0
  27. data/glfw-src/docs/Makefile +57 -0
  28. data/glfw-src/docs/Reference.pdf +0 -0
  29. data/glfw-src/docs/UsersGuide.pdf +0 -0
  30. data/glfw-src/docs/cleanup.bat +22 -0
  31. data/glfw-src/docs/glfwdoc.sty +80 -0
  32. data/glfw-src/docs/glfwrm.tex +3034 -0
  33. data/glfw-src/docs/glfwug.tex +2024 -0
  34. data/glfw-src/docs/readme.txt +80 -0
  35. data/glfw-src/examples/Makefile.amigaos.gcc +70 -0
  36. data/glfw-src/examples/Makefile.amigaos.vbcc +70 -0
  37. data/glfw-src/examples/Makefile.dos.djgpp +71 -0
  38. data/glfw-src/examples/Makefile.macosx.gcc +96 -0
  39. data/glfw-src/examples/Makefile.win32.bcc +75 -0
  40. data/glfw-src/examples/Makefile.win32.cross-mgw +79 -0
  41. data/glfw-src/examples/Makefile.win32.cygwin +79 -0
  42. data/glfw-src/examples/Makefile.win32.lcc +74 -0
  43. data/glfw-src/examples/Makefile.win32.mgw +75 -0
  44. data/glfw-src/examples/Makefile.win32.msvc +74 -0
  45. data/glfw-src/examples/Makefile.win32.ow +74 -0
  46. data/glfw-src/examples/Makefile.win32.pellesc +74 -0
  47. data/glfw-src/examples/Makefile.x11.in +54 -0
  48. data/glfw-src/examples/boing.c +606 -0
  49. data/glfw-src/examples/bundle.sh +46 -0
  50. data/glfw-src/examples/gears.c +382 -0
  51. data/glfw-src/examples/keytest.c +264 -0
  52. data/glfw-src/examples/listmodes.c +48 -0
  53. data/glfw-src/examples/mipmaps.c +126 -0
  54. data/glfw-src/examples/mipmaps.tga +0 -0
  55. data/glfw-src/examples/mtbench.c +301 -0
  56. data/glfw-src/examples/mthello.c +48 -0
  57. data/glfw-src/examples/particles.c +1148 -0
  58. data/glfw-src/examples/pong3d.c +839 -0
  59. data/glfw-src/examples/pong3d_field.tga +0 -0
  60. data/glfw-src/examples/pong3d_instr.tga +0 -0
  61. data/glfw-src/examples/pong3d_menu.tga +0 -0
  62. data/glfw-src/examples/pong3d_title.tga +0 -0
  63. data/glfw-src/examples/pong3d_winner1.tga +0 -0
  64. data/glfw-src/examples/pong3d_winner2.tga +0 -0
  65. data/glfw-src/examples/splitview.c +506 -0
  66. data/glfw-src/examples/triangle.c +108 -0
  67. data/glfw-src/examples/wave.c +397 -0
  68. data/glfw-src/images/opengl.gif +0 -0
  69. data/glfw-src/images/osicert.gif +0 -0
  70. data/glfw-src/include/GL/glfw.h +486 -0
  71. data/glfw-src/lib/amigaos/Makefile.amigaos.gcc +128 -0
  72. data/glfw-src/lib/amigaos/Makefile.amigaos.vbcc +128 -0
  73. data/glfw-src/lib/amigaos/SDI_compiler.h +94 -0
  74. data/glfw-src/lib/amigaos/amigaos_enable.c +51 -0
  75. data/glfw-src/lib/amigaos/amigaos_fullscreen.c +319 -0
  76. data/glfw-src/lib/amigaos/amigaos_glext.c +61 -0
  77. data/glfw-src/lib/amigaos/amigaos_init.c +284 -0
  78. data/glfw-src/lib/amigaos/amigaos_joystick.c +359 -0
  79. data/glfw-src/lib/amigaos/amigaos_thread.c +494 -0
  80. data/glfw-src/lib/amigaos/amigaos_time.c +206 -0
  81. data/glfw-src/lib/amigaos/amigaos_window.c +830 -0
  82. data/glfw-src/lib/amigaos/platform.h +337 -0
  83. data/glfw-src/lib/dos/Makefile.dos.djgpp +146 -0
  84. data/glfw-src/lib/dos/dos_enable.c +51 -0
  85. data/glfw-src/lib/dos/dos_events.c +173 -0
  86. data/glfw-src/lib/dos/dos_fullscreen.c +101 -0
  87. data/glfw-src/lib/dos/dos_glext.c +59 -0
  88. data/glfw-src/lib/dos/dos_init.c +105 -0
  89. data/glfw-src/lib/dos/dos_irq.s +246 -0
  90. data/glfw-src/lib/dos/dos_joystick.c +94 -0
  91. data/glfw-src/lib/dos/dos_keyboard.c +694 -0
  92. data/glfw-src/lib/dos/dos_mouse.c +337 -0
  93. data/glfw-src/lib/dos/dos_thread.c +267 -0
  94. data/glfw-src/lib/dos/dos_time.c +309 -0
  95. data/glfw-src/lib/dos/dos_window.c +563 -0
  96. data/glfw-src/lib/dos/platform.h +341 -0
  97. data/glfw-src/lib/enable.c +295 -0
  98. data/glfw-src/lib/fullscreen.c +95 -0
  99. data/glfw-src/lib/glext.c +201 -0
  100. data/glfw-src/lib/image.c +629 -0
  101. data/glfw-src/lib/init.c +108 -0
  102. data/glfw-src/lib/input.c +280 -0
  103. data/glfw-src/lib/internal.h +210 -0
  104. data/glfw-src/lib/joystick.c +101 -0
  105. data/glfw-src/lib/macosx/Makefile.macosx.gcc +172 -0
  106. data/glfw-src/lib/macosx/Makefile.macosx.gcc.universal +166 -0
  107. data/glfw-src/lib/macosx/libglfw.pc.in +11 -0
  108. data/glfw-src/lib/macosx/macosx_enable.c +42 -0
  109. data/glfw-src/lib/macosx/macosx_fullscreen.c +126 -0
  110. data/glfw-src/lib/macosx/macosx_glext.c +52 -0
  111. data/glfw-src/lib/macosx/macosx_init.c +194 -0
  112. data/glfw-src/lib/macosx/macosx_joystick.c +50 -0
  113. data/glfw-src/lib/macosx/macosx_thread.c +414 -0
  114. data/glfw-src/lib/macosx/macosx_time.c +112 -0
  115. data/glfw-src/lib/macosx/macosx_window.c +1279 -0
  116. data/glfw-src/lib/macosx/platform.h +349 -0
  117. data/glfw-src/lib/stream.c +194 -0
  118. data/glfw-src/lib/tga.c +405 -0
  119. data/glfw-src/lib/thread.c +340 -0
  120. data/glfw-src/lib/time.c +83 -0
  121. data/glfw-src/lib/win32/Makefile.win32.bcc +265 -0
  122. data/glfw-src/lib/win32/Makefile.win32.cross-mgw +274 -0
  123. data/glfw-src/lib/win32/Makefile.win32.cygwin +279 -0
  124. data/glfw-src/lib/win32/Makefile.win32.lcc +246 -0
  125. data/glfw-src/lib/win32/Makefile.win32.mgw +243 -0
  126. data/glfw-src/lib/win32/Makefile.win32.msvc +242 -0
  127. data/glfw-src/lib/win32/Makefile.win32.ow +242 -0
  128. data/glfw-src/lib/win32/Makefile.win32.pellesc +242 -0
  129. data/glfw-src/lib/win32/glfwdll.def +67 -0
  130. data/glfw-src/lib/win32/glfwdll_mgw1.def +67 -0
  131. data/glfw-src/lib/win32/glfwdll_mgw2.def +67 -0
  132. data/glfw-src/lib/win32/glfwdll_pellesc.def +65 -0
  133. data/glfw-src/lib/win32/libglfw.pc.in +11 -0
  134. data/glfw-src/lib/win32/platform.h +474 -0
  135. data/glfw-src/lib/win32/win32_dllmain.c +60 -0
  136. data/glfw-src/lib/win32/win32_enable.c +155 -0
  137. data/glfw-src/lib/win32/win32_fullscreen.c +317 -0
  138. data/glfw-src/lib/win32/win32_glext.c +85 -0
  139. data/glfw-src/lib/win32/win32_init.c +356 -0
  140. data/glfw-src/lib/win32/win32_joystick.c +234 -0
  141. data/glfw-src/lib/win32/win32_thread.c +511 -0
  142. data/glfw-src/lib/win32/win32_time.c +146 -0
  143. data/glfw-src/lib/win32/win32_window.c +1714 -0
  144. data/glfw-src/lib/window.c +727 -0
  145. data/glfw-src/lib/x11/Makefile.x11.in +243 -0
  146. data/glfw-src/lib/x11/platform.h +415 -0
  147. data/glfw-src/lib/x11/x11_enable.c +51 -0
  148. data/glfw-src/lib/x11/x11_fullscreen.c +524 -0
  149. data/glfw-src/lib/x11/x11_glext.c +69 -0
  150. data/glfw-src/lib/x11/x11_init.c +275 -0
  151. data/glfw-src/lib/x11/x11_joystick.c +371 -0
  152. data/glfw-src/lib/x11/x11_keysym2unicode.c +902 -0
  153. data/glfw-src/lib/x11/x11_thread.c +507 -0
  154. data/glfw-src/lib/x11/x11_time.c +154 -0
  155. data/glfw-src/lib/x11/x11_window.c +1746 -0
  156. data/glfw-src/license.txt +21 -0
  157. data/glfw-src/readme.html +927 -0
  158. data/glfw-src/support/d/examples/Makefile +59 -0
  159. data/glfw-src/support/d/examples/boing.d +610 -0
  160. data/glfw-src/support/d/examples/gears.d +379 -0
  161. data/glfw-src/support/d/examples/keytest.d +272 -0
  162. data/glfw-src/support/d/examples/listmodes.d +48 -0
  163. data/glfw-src/support/d/examples/mipmaps.d +126 -0
  164. data/glfw-src/support/d/examples/mtbench.d +304 -0
  165. data/glfw-src/support/d/examples/mthello.d +54 -0
  166. data/glfw-src/support/d/examples/particles.d +1150 -0
  167. data/glfw-src/support/d/examples/pong3d.d +840 -0
  168. data/glfw-src/support/d/examples/splitview.d +486 -0
  169. data/glfw-src/support/d/examples/triangle.d +108 -0
  170. data/glfw-src/support/d/examples/wave.d +400 -0
  171. data/glfw-src/support/d/imports/gl.d +4539 -0
  172. data/glfw-src/support/d/imports/glfw.d +349 -0
  173. data/glfw-src/support/d/imports/glu.d +328 -0
  174. data/glfw-src/support/d/lib/glfwdll.def +64 -0
  175. data/glfw-src/support/d/lib/glu32.def +56 -0
  176. data/glfw-src/support/d/lib/makefile +12 -0
  177. data/glfw-src/support/d/lib/opengl32.def +372 -0
  178. data/glfw-src/support/d/readme.html +83 -0
  179. data/glfw-src/support/delphi/examples/Triangle.dpr +105 -0
  180. data/glfw-src/support/delphi/lib/glfw.pas +437 -0
  181. data/glfw-src/support/delphi/readme.html +97 -0
  182. data/glfw-src/support/lua/examples/gears.lua +383 -0
  183. data/glfw-src/support/lua/examples/test1.lua +68 -0
  184. data/glfw-src/support/lua/readme.html +128 -0
  185. data/glfw-src/support/lua/src/luaglfw.c +1179 -0
  186. data/glfw-src/support/lua/src/luaglfw.h +48 -0
  187. data/glfw-src/support/lua/src/runlua.c +82 -0
  188. data/glfw-src/support/masm/examples/fpc.mac +47 -0
  189. data/glfw-src/support/masm/examples/makeit.bat +66 -0
  190. data/glfw-src/support/masm/examples/triangle.asm +232 -0
  191. data/glfw-src/support/masm/include/glfw.inc +326 -0
  192. data/glfw-src/support/masm/include/glu32.inc +55 -0
  193. data/glfw-src/support/masm/include/opengl32.inc +372 -0
  194. data/glfw-src/support/masm/lib/glfwdll.lib +0 -0
  195. data/glfw-src/support/masm/readme.html +170 -0
  196. data/glfw-src/support/msvc80/GLFW.sln +26 -0
  197. data/glfw-src/support/msvc80/GLFW.vcproj +257 -0
  198. data/glfw-src/support/msvc80/GLFWDLL.vcproj +287 -0
  199. data/glfw-src/support/visualbasic/bindings/glfw.bas +320 -0
  200. data/glfw-src/support/visualbasic/bindings/glu32.bas +284 -0
  201. data/glfw-src/support/visualbasic/bindings/opengl32.bas +999 -0
  202. data/glfw-src/support/visualbasic/examples/Triangle.bas +101 -0
  203. data/glfw-src/support/visualbasic/readme.html +164 -0
  204. data/website/index.html +84 -0
  205. data/website/style.css +110 -0
  206. metadata +301 -0
@@ -0,0 +1,1279 @@
1
+ //========================================================================
2
+ // GLFW - An OpenGL framework
3
+ // File: macosx_window.c
4
+ // Platform: Mac OS X
5
+ // API Version: 2.6
6
+ // WWW: http://glfw.sourceforge.net
7
+ //------------------------------------------------------------------------
8
+ // Copyright (c) 2002-2006 Camilla Berglund
9
+ //
10
+ // This software is provided 'as-is', without any express or implied
11
+ // warranty. In no event will the authors be held liable for any damages
12
+ // arising from the use of this software.
13
+ //
14
+ // Permission is granted to anyone to use this software for any purpose,
15
+ // including commercial applications, and to alter it and redistribute it
16
+ // freely, subject to the following restrictions:
17
+ //
18
+ // 1. The origin of this software must not be misrepresented; you must not
19
+ // claim that you wrote the original software. If you use this software
20
+ // in a product, an acknowledgment in the product documentation would
21
+ // be appreciated but is not required.
22
+ //
23
+ // 2. Altered source versions must be plainly marked as such, and must not
24
+ // be misrepresented as being the original software.
25
+ //
26
+ // 3. This notice may not be removed or altered from any source
27
+ // distribution.
28
+ //
29
+ //========================================================================
30
+
31
+ #include "internal.h"
32
+
33
+ static _GLFWmacwindowfunctions _glfwMacFSWindowFunctions =
34
+ {
35
+ _glfwMacFSOpenWindow,
36
+ _glfwMacFSCloseWindow,
37
+ _glfwMacFSSetWindowTitle,
38
+ _glfwMacFSSetWindowSize,
39
+ _glfwMacFSSetWindowPos,
40
+ _glfwMacFSIconifyWindow,
41
+ _glfwMacFSRestoreWindow,
42
+ _glfwMacFSRefreshWindowParams,
43
+ _glfwMacFSSetMouseCursorPos
44
+ };
45
+
46
+ static _GLFWmacwindowfunctions _glfwMacDWWindowFunctions =
47
+ {
48
+ _glfwMacDWOpenWindow,
49
+ _glfwMacDWCloseWindow,
50
+ _glfwMacDWSetWindowTitle,
51
+ _glfwMacDWSetWindowSize,
52
+ _glfwMacDWSetWindowPos,
53
+ _glfwMacDWIconifyWindow,
54
+ _glfwMacDWRestoreWindow,
55
+ _glfwMacDWRefreshWindowParams,
56
+ _glfwMacDWSetMouseCursorPos
57
+ };
58
+
59
+ #define _glfwTestModifier( modifierMask, glfwKey ) \
60
+ if ( changed & modifierMask ) \
61
+ { \
62
+ _glfwInputKey( glfwKey, (modifiers & modifierMask ? GLFW_PRESS : GLFW_RELEASE) ); \
63
+ }
64
+
65
+ void _glfwHandleMacModifierChange( UInt32 modifiers )
66
+ {
67
+ UInt32 changed = modifiers ^ _glfwInput.Modifiers;
68
+
69
+ _glfwTestModifier( shiftKey, GLFW_KEY_LSHIFT );
70
+ _glfwTestModifier( rightShiftKey, GLFW_KEY_RSHIFT );
71
+ _glfwTestModifier( controlKey, GLFW_KEY_LCTRL );
72
+ _glfwTestModifier( rightControlKey, GLFW_KEY_RCTRL );
73
+ _glfwTestModifier( optionKey, GLFW_KEY_LALT );
74
+ _glfwTestModifier( rightOptionKey, GLFW_KEY_RALT );
75
+
76
+ _glfwInput.Modifiers = modifiers;
77
+ }
78
+
79
+ void _glfwHandleMacKeyChange( UInt32 keyCode, int action )
80
+ {
81
+ switch ( keyCode )
82
+ {
83
+ case MAC_KEY_ENTER: _glfwInputKey( GLFW_KEY_ENTER, action); break;
84
+ case MAC_KEY_RETURN: _glfwInputKey( GLFW_KEY_KP_ENTER, action); break;
85
+ case MAC_KEY_ESC: _glfwInputKey( GLFW_KEY_ESC, action); break;
86
+ case MAC_KEY_F1: _glfwInputKey( GLFW_KEY_F1, action); break;
87
+ case MAC_KEY_F2: _glfwInputKey( GLFW_KEY_F2, action); break;
88
+ case MAC_KEY_F3: _glfwInputKey( GLFW_KEY_F3, action); break;
89
+ case MAC_KEY_F4: _glfwInputKey( GLFW_KEY_F4, action); break;
90
+ case MAC_KEY_F5: _glfwInputKey( GLFW_KEY_F5, action); break;
91
+ case MAC_KEY_F6: _glfwInputKey( GLFW_KEY_F6, action); break;
92
+ case MAC_KEY_F7: _glfwInputKey( GLFW_KEY_F7, action); break;
93
+ case MAC_KEY_F8: _glfwInputKey( GLFW_KEY_F8, action); break;
94
+ case MAC_KEY_F9: _glfwInputKey( GLFW_KEY_F9, action); break;
95
+ case MAC_KEY_F10: _glfwInputKey( GLFW_KEY_F10, action); break;
96
+ case MAC_KEY_F11: _glfwInputKey( GLFW_KEY_F11, action); break;
97
+ case MAC_KEY_F12: _glfwInputKey( GLFW_KEY_F12, action); break;
98
+ case MAC_KEY_F13: _glfwInputKey( GLFW_KEY_F13, action); break;
99
+ case MAC_KEY_F14: _glfwInputKey( GLFW_KEY_F14, action); break;
100
+ case MAC_KEY_F15: _glfwInputKey( GLFW_KEY_F15, action); break;
101
+ case MAC_KEY_UP: _glfwInputKey( GLFW_KEY_UP, action); break;
102
+ case MAC_KEY_DOWN: _glfwInputKey( GLFW_KEY_DOWN, action); break;
103
+ case MAC_KEY_LEFT: _glfwInputKey( GLFW_KEY_LEFT, action); break;
104
+ case MAC_KEY_RIGHT: _glfwInputKey( GLFW_KEY_RIGHT, action); break;
105
+ case MAC_KEY_TAB: _glfwInputKey( GLFW_KEY_TAB, action); break;
106
+ case MAC_KEY_BACKSPACE: _glfwInputKey( GLFW_KEY_BACKSPACE, action); break;
107
+ case MAC_KEY_HELP: _glfwInputKey( GLFW_KEY_INSERT, action); break;
108
+ case MAC_KEY_DEL: _glfwInputKey( GLFW_KEY_DEL, action); break;
109
+ case MAC_KEY_PAGEUP: _glfwInputKey( GLFW_KEY_PAGEUP, action); break;
110
+ case MAC_KEY_PAGEDOWN: _glfwInputKey( GLFW_KEY_PAGEDOWN, action); break;
111
+ case MAC_KEY_HOME: _glfwInputKey( GLFW_KEY_HOME, action); break;
112
+ case MAC_KEY_END: _glfwInputKey( GLFW_KEY_END, action); break;
113
+ case MAC_KEY_KP_0: _glfwInputKey( GLFW_KEY_KP_0, action); break;
114
+ case MAC_KEY_KP_1: _glfwInputKey( GLFW_KEY_KP_1, action); break;
115
+ case MAC_KEY_KP_2: _glfwInputKey( GLFW_KEY_KP_2, action); break;
116
+ case MAC_KEY_KP_3: _glfwInputKey( GLFW_KEY_KP_3, action); break;
117
+ case MAC_KEY_KP_4: _glfwInputKey( GLFW_KEY_KP_4, action); break;
118
+ case MAC_KEY_KP_5: _glfwInputKey( GLFW_KEY_KP_5, action); break;
119
+ case MAC_KEY_KP_6: _glfwInputKey( GLFW_KEY_KP_6, action); break;
120
+ case MAC_KEY_KP_7: _glfwInputKey( GLFW_KEY_KP_7, action); break;
121
+ case MAC_KEY_KP_8: _glfwInputKey( GLFW_KEY_KP_8, action); break;
122
+ case MAC_KEY_KP_9: _glfwInputKey( GLFW_KEY_KP_9, action); break;
123
+ case MAC_KEY_KP_DIVIDE: _glfwInputKey( GLFW_KEY_KP_DIVIDE, action); break;
124
+ case MAC_KEY_KP_MULTIPLY: _glfwInputKey( GLFW_KEY_KP_MULTIPLY, action); break;
125
+ case MAC_KEY_KP_SUBTRACT: _glfwInputKey( GLFW_KEY_KP_SUBTRACT, action); break;
126
+ case MAC_KEY_KP_ADD: _glfwInputKey( GLFW_KEY_KP_ADD, action); break;
127
+ case MAC_KEY_KP_DECIMAL: _glfwInputKey( GLFW_KEY_KP_DECIMAL, action); break;
128
+ case MAC_KEY_KP_EQUAL: _glfwInputKey( GLFW_KEY_KP_EQUAL, action); break;
129
+ case MAC_KEY_KP_ENTER: _glfwInputKey( GLFW_KEY_KP_ENTER, action); break;
130
+ default:
131
+ {
132
+ extern void *KCHRPtr;
133
+ UInt32 state = 0;
134
+ char charCode = (char)KeyTranslate( KCHRPtr, keyCode, &state );
135
+ UppercaseText( &charCode, 1, smSystemScript );
136
+ _glfwInputKey( (unsigned char)charCode, action );
137
+ }
138
+ break;
139
+ }
140
+ }
141
+
142
+ EventTypeSpec GLFW_KEY_EVENT_TYPES[] =
143
+ {
144
+ { kEventClassKeyboard, kEventRawKeyDown },
145
+ { kEventClassKeyboard, kEventRawKeyUp },
146
+ { kEventClassKeyboard, kEventRawKeyModifiersChanged }
147
+ };
148
+
149
+ OSStatus _glfwKeyEventHandler( EventHandlerCallRef handlerCallRef,
150
+ EventRef event,
151
+ void *userData )
152
+ {
153
+ UInt32 keyCode;
154
+ short int keyChar;
155
+ UInt32 modifiers;
156
+
157
+ switch( GetEventKind( event ) )
158
+ {
159
+ case kEventRawKeyDown:
160
+ {
161
+ if( GetEventParameter( event,
162
+ kEventParamKeyCode,
163
+ typeUInt32,
164
+ NULL,
165
+ sizeof( UInt32 ),
166
+ NULL,
167
+ &keyCode ) == noErr )
168
+ {
169
+ _glfwHandleMacKeyChange( keyCode, GLFW_PRESS );
170
+ }
171
+ if( GetEventParameter( event,
172
+ kEventParamKeyUnicodes,
173
+ typeUnicodeText,
174
+ NULL,
175
+ sizeof(keyChar),
176
+ NULL,
177
+ &keyChar) == noErr )
178
+ {
179
+ _glfwInputChar( keyChar, GLFW_PRESS );
180
+ }
181
+ return noErr;
182
+ }
183
+
184
+ case kEventRawKeyUp:
185
+ {
186
+ if( GetEventParameter( event,
187
+ kEventParamKeyCode,
188
+ typeUInt32,
189
+ NULL,
190
+ sizeof( UInt32 ),
191
+ NULL,
192
+ &keyCode ) == noErr )
193
+ {
194
+ _glfwHandleMacKeyChange( keyCode, GLFW_RELEASE );
195
+ }
196
+ if( GetEventParameter( event,
197
+ kEventParamKeyUnicodes,
198
+ typeUnicodeText,
199
+ NULL,
200
+ sizeof(keyChar),
201
+ NULL,
202
+ &keyChar) == noErr )
203
+ {
204
+ _glfwInputChar( keyChar, GLFW_RELEASE );
205
+ }
206
+ return noErr;
207
+ }
208
+
209
+ case kEventRawKeyModifiersChanged:
210
+ {
211
+ if( GetEventParameter( event,
212
+ kEventParamKeyModifiers,
213
+ typeUInt32,
214
+ NULL,
215
+ sizeof( UInt32 ),
216
+ NULL,
217
+ &modifiers ) == noErr )
218
+ {
219
+ _glfwHandleMacModifierChange( modifiers );
220
+ return noErr;
221
+ }
222
+ }
223
+ break;
224
+ }
225
+
226
+ return eventNotHandledErr;
227
+ }
228
+
229
+ EventTypeSpec GLFW_MOUSE_EVENT_TYPES[] =
230
+ {
231
+ { kEventClassMouse, kEventMouseDown },
232
+ { kEventClassMouse, kEventMouseUp },
233
+ { kEventClassMouse, kEventMouseMoved },
234
+ { kEventClassMouse, kEventMouseDragged },
235
+ { kEventClassMouse, kEventMouseWheelMoved },
236
+ };
237
+
238
+ OSStatus _glfwMouseEventHandler( EventHandlerCallRef handlerCallRef,
239
+ EventRef event,
240
+ void *userData )
241
+ {
242
+ switch( GetEventKind( event ) )
243
+ {
244
+ case kEventMouseDown:
245
+ {
246
+ WindowRef window;
247
+ EventRecord oldStyleMacEvent;
248
+ ConvertEventRefToEventRecord( event, &oldStyleMacEvent );
249
+ if( FindWindow ( oldStyleMacEvent.where, &window ) == inMenuBar )
250
+ {
251
+ MenuSelect( oldStyleMacEvent.where );
252
+ HiliteMenu(0);
253
+ return noErr;
254
+ }
255
+ else
256
+ {
257
+ EventMouseButton button;
258
+ if( GetEventParameter( event,
259
+ kEventParamMouseButton,
260
+ typeMouseButton,
261
+ NULL,
262
+ sizeof( EventMouseButton ),
263
+ NULL,
264
+ &button ) == noErr )
265
+ {
266
+ button -= kEventMouseButtonPrimary;
267
+ if( button <= GLFW_MOUSE_BUTTON_LAST )
268
+ {
269
+ _glfwInputMouseClick( button
270
+ + GLFW_MOUSE_BUTTON_LEFT,
271
+ GLFW_PRESS );
272
+ }
273
+ return noErr;
274
+ }
275
+ }
276
+ break;
277
+ }
278
+
279
+ case kEventMouseUp:
280
+ {
281
+ EventMouseButton button;
282
+ if( GetEventParameter( event,
283
+ kEventParamMouseButton,
284
+ typeMouseButton,
285
+ NULL,
286
+ sizeof( EventMouseButton ),
287
+ NULL,
288
+ &button ) == noErr )
289
+ {
290
+ button -= kEventMouseButtonPrimary;
291
+ if( button <= GLFW_MOUSE_BUTTON_LAST )
292
+ {
293
+ _glfwInputMouseClick( button
294
+ + GLFW_MOUSE_BUTTON_LEFT,
295
+ GLFW_RELEASE );
296
+ }
297
+ return noErr;
298
+ }
299
+ break;
300
+ }
301
+
302
+ case kEventMouseMoved:
303
+ case kEventMouseDragged:
304
+ {
305
+ HIPoint mouseLocation;
306
+ if( _glfwWin.MouseLock )
307
+ {
308
+ if( GetEventParameter( event,
309
+ kEventParamMouseDelta,
310
+ typeHIPoint,
311
+ NULL,
312
+ sizeof( HIPoint ),
313
+ NULL,
314
+ &mouseLocation ) != noErr )
315
+ {
316
+ break;
317
+ }
318
+
319
+ _glfwInput.MousePosX += mouseLocation.x;
320
+ _glfwInput.MousePosY += mouseLocation.y;
321
+ }
322
+ else
323
+ {
324
+ if( GetEventParameter( event,
325
+ kEventParamMouseLocation,
326
+ typeHIPoint,
327
+ NULL,
328
+ sizeof( HIPoint ),
329
+ NULL,
330
+ &mouseLocation ) != noErr )
331
+ {
332
+ break;
333
+ }
334
+
335
+ _glfwInput.MousePosX = mouseLocation.x;
336
+ _glfwInput.MousePosY = mouseLocation.y;
337
+
338
+ if( !_glfwWin.Fullscreen )
339
+ {
340
+ Rect content;
341
+ GetWindowBounds( _glfwWin.MacWindow,
342
+ kWindowContentRgn,
343
+ &content );
344
+
345
+ _glfwInput.MousePosX -= content.left;
346
+ _glfwInput.MousePosY -= content.top;
347
+ }
348
+ }
349
+
350
+ if( _glfwWin.MousePosCallback )
351
+ {
352
+ _glfwWin.MousePosCallback( _glfwInput.MousePosX,
353
+ _glfwInput.MousePosY );
354
+ }
355
+
356
+ break;
357
+ }
358
+
359
+ case kEventMouseWheelMoved:
360
+ {
361
+ EventMouseWheelAxis axis;
362
+ if( GetEventParameter( event,
363
+ kEventParamMouseWheelAxis,
364
+ typeMouseWheelAxis,
365
+ NULL,
366
+ sizeof( EventMouseWheelAxis ),
367
+ NULL,
368
+ &axis) == noErr )
369
+ {
370
+ long wheelDelta;
371
+ if( axis == kEventMouseWheelAxisY &&
372
+ GetEventParameter( event,
373
+ kEventParamMouseWheelDelta,
374
+ typeLongInteger,
375
+ NULL,
376
+ sizeof( long ),
377
+ NULL,
378
+ &wheelDelta ) == noErr )
379
+ {
380
+ _glfwInput.WheelPos += wheelDelta;
381
+ if( _glfwWin.MouseWheelCallback )
382
+ {
383
+ _glfwWin.MouseWheelCallback( _glfwInput.WheelPos );
384
+ }
385
+ return noErr;
386
+ }
387
+ }
388
+ break;
389
+ }
390
+ }
391
+
392
+ return eventNotHandledErr;
393
+ }
394
+
395
+ EventTypeSpec GLFW_COMMAND_EVENT_TYPES[] =
396
+ {
397
+ { kEventClassCommand, kEventCommandProcess }
398
+ };
399
+
400
+ OSStatus _glfwCommandHandler( EventHandlerCallRef handlerCallRef,
401
+ EventRef event,
402
+ void *userData )
403
+ {
404
+ if( _glfwWin.SysKeysDisabled )
405
+ {
406
+ // TO DO: give adequate UI feedback that this is the case
407
+ return eventNotHandledErr;
408
+ }
409
+
410
+ HICommand command;
411
+ if( GetEventParameter( event,
412
+ kEventParamDirectObject,
413
+ typeHICommand,
414
+ NULL,
415
+ sizeof( HICommand ),
416
+ NULL,
417
+ &command ) == noErr )
418
+ {
419
+ switch( command.commandID )
420
+ {
421
+ case kHICommandClose:
422
+ case kHICommandQuit:
423
+ {
424
+ // Check if the program wants us to close the window
425
+ if( _glfwWin.WindowCloseCallback )
426
+ {
427
+ if( _glfwWin.WindowCloseCallback() )
428
+ {
429
+ glfwCloseWindow();
430
+ }
431
+ }
432
+ else
433
+ {
434
+ glfwCloseWindow();
435
+ }
436
+ return noErr;
437
+ }
438
+ }
439
+ }
440
+
441
+ return eventNotHandledErr;
442
+ }
443
+
444
+ EventTypeSpec GLFW_WINDOW_EVENT_TYPES[] =
445
+ {
446
+ { kEventClassWindow, kEventWindowBoundsChanged },
447
+ { kEventClassWindow, kEventWindowClose },
448
+ { kEventClassWindow, kEventWindowDrawContent },
449
+ { kEventClassWindow, kEventWindowActivated },
450
+ { kEventClassWindow, kEventWindowDeactivated },
451
+ };
452
+
453
+ OSStatus _glfwWindowEventHandler( EventHandlerCallRef handlerCallRef,
454
+ EventRef event,
455
+ void *userData )
456
+ {
457
+ switch( GetEventKind(event) )
458
+ {
459
+ case kEventWindowBoundsChanged:
460
+ {
461
+ WindowRef window;
462
+ GetEventParameter( event, kEventParamDirectObject, typeWindowRef, NULL,
463
+ sizeof(WindowRef), NULL, &window );
464
+
465
+ Rect rect;
466
+ GetWindowPortBounds( window, &rect );
467
+
468
+ if( _glfwWin.Width != rect.right ||
469
+ _glfwWin.Height != rect.bottom )
470
+ {
471
+ aglUpdateContext(_glfwWin.AGLContext);
472
+
473
+ _glfwWin.Width = rect.right;
474
+ _glfwWin.Height = rect.bottom;
475
+ if( _glfwWin.WindowSizeCallback )
476
+ {
477
+ _glfwWin.WindowSizeCallback( _glfwWin.Width,
478
+ _glfwWin.Height );
479
+ }
480
+ // Emulate (force) content invalidation
481
+ if( _glfwWin.WindowRefreshCallback )
482
+ {
483
+ _glfwWin.WindowRefreshCallback();
484
+ }
485
+ }
486
+ break;
487
+ }
488
+
489
+ case kEventWindowClose:
490
+ {
491
+ // Check if the program wants us to close the window
492
+ if( _glfwWin.WindowCloseCallback )
493
+ {
494
+ if( _glfwWin.WindowCloseCallback() )
495
+ {
496
+ glfwCloseWindow();
497
+ }
498
+ }
499
+ else
500
+ {
501
+ glfwCloseWindow();
502
+ }
503
+ return noErr;
504
+ }
505
+
506
+ case kEventWindowDrawContent:
507
+ {
508
+ // Call user callback function
509
+ if( _glfwWin.WindowRefreshCallback )
510
+ {
511
+ _glfwWin.WindowRefreshCallback();
512
+ }
513
+ break;
514
+ }
515
+
516
+ case kEventWindowActivated:
517
+ {
518
+ _glfwWin.Active = GL_TRUE;
519
+ break;
520
+ }
521
+
522
+ case kEventWindowDeactivated:
523
+ {
524
+ _glfwWin.Active = GL_FALSE;
525
+ _glfwInputDeactivation();
526
+ break;
527
+ }
528
+ }
529
+
530
+ return eventNotHandledErr;
531
+ }
532
+
533
+ int _glfwInstallEventHandlers( void )
534
+ {
535
+ OSStatus error;
536
+
537
+ _glfwWin.MouseUPP = NewEventHandlerUPP( _glfwMouseEventHandler );
538
+
539
+ error = InstallEventHandler( GetApplicationEventTarget(),
540
+ _glfwWin.MouseUPP,
541
+ GetEventTypeCount( GLFW_MOUSE_EVENT_TYPES ),
542
+ GLFW_MOUSE_EVENT_TYPES,
543
+ NULL,
544
+ NULL );
545
+ if( error != noErr )
546
+ {
547
+ fprintf( stderr, "glfwOpenWindow failing because it can't install mouse event handler\n" );
548
+ return GL_FALSE;
549
+ }
550
+
551
+ _glfwWin.CommandUPP = NewEventHandlerUPP( _glfwCommandHandler );
552
+
553
+ error = InstallEventHandler( GetApplicationEventTarget(),
554
+ _glfwWin.CommandUPP,
555
+ GetEventTypeCount( GLFW_COMMAND_EVENT_TYPES ),
556
+ GLFW_COMMAND_EVENT_TYPES,
557
+ NULL,
558
+ NULL );
559
+ if( error != noErr )
560
+ {
561
+ fprintf( stderr, "glfwOpenWindow failing because it can't install command event handler\n" );
562
+ return GL_FALSE;
563
+ }
564
+
565
+ _glfwWin.KeyboardUPP = NewEventHandlerUPP( _glfwKeyEventHandler );
566
+
567
+ error = InstallEventHandler( GetApplicationEventTarget(),
568
+ _glfwWin.KeyboardUPP,
569
+ GetEventTypeCount( GLFW_KEY_EVENT_TYPES ),
570
+ GLFW_KEY_EVENT_TYPES,
571
+ NULL,
572
+ NULL );
573
+ if( error != noErr )
574
+ {
575
+ fprintf( stderr, "glfwOpenWindow failing because it can't install key event handler\n" );
576
+ return GL_FALSE;
577
+ }
578
+
579
+ return GL_TRUE;
580
+ }
581
+
582
+ #define _setAGLAttribute( aglAttributeName, AGLparameter ) \
583
+ if ( AGLparameter != 0 ) \
584
+ { \
585
+ AGLpixelFormatAttributes[numAGLAttrs++] = aglAttributeName; \
586
+ AGLpixelFormatAttributes[numAGLAttrs++] = AGLparameter; \
587
+ }
588
+
589
+ #define _getAGLAttribute( aglAttributeName, variableName ) \
590
+ { \
591
+ GLint aglValue; \
592
+ (void)aglDescribePixelFormat( pixelFormat, aglAttributeName, &aglValue ); \
593
+ variableName = aglValue; \
594
+ }
595
+
596
+ #define _setCGLAttribute( cglAttributeName, CGLparameter ) \
597
+ if ( CGLparameter != 0 ) \
598
+ { \
599
+ CGLpixelFormatAttributes[ numCGLAttrs++ ] = cglAttributeName; \
600
+ CGLpixelFormatAttributes[ numCGLAttrs++ ] = CGLparameter; \
601
+ }
602
+
603
+ #define _getCGLAttribute( cglAttributeName, variableName ) \
604
+ { \
605
+ long cglValue; \
606
+ (void)CGLDescribePixelFormat( CGLpfObj, 0, cglAttributeName, &cglValue ); \
607
+ variableName = cglValue; \
608
+ }
609
+
610
+ int _glfwPlatformOpenWindow( int width,
611
+ int height,
612
+ int redbits,
613
+ int greenbits,
614
+ int bluebits,
615
+ int alphabits,
616
+ int depthbits,
617
+ int stencilbits,
618
+ int mode,
619
+ _GLFWhints* hints )
620
+ {
621
+ OSStatus error;
622
+ ProcessSerialNumber psn;
623
+
624
+ unsigned int windowAttributes;
625
+
626
+ // TO DO: Refactor this function!
627
+ _glfwWin.WindowFunctions = ( _glfwWin.Fullscreen ?
628
+ &_glfwMacFSWindowFunctions :
629
+ &_glfwMacDWWindowFunctions );
630
+
631
+ // Windowed or fullscreen; AGL or CGL? Quite the mess...
632
+ // AGL appears to be the only choice for attaching OpenGL contexts to
633
+ // Carbon windows, but it leaves the user no control over fullscreen
634
+ // mode stretching. Solution: AGL for windowed, CGL for fullscreen.
635
+ if( !_glfwWin.Fullscreen )
636
+ {
637
+ // create AGL pixel format attribute list
638
+ GLint AGLpixelFormatAttributes[256];
639
+ int numAGLAttrs = 0;
640
+
641
+ AGLpixelFormatAttributes[numAGLAttrs++] = AGL_RGBA;
642
+ AGLpixelFormatAttributes[numAGLAttrs++] = AGL_DOUBLEBUFFER;
643
+
644
+ if( hints->Stereo )
645
+ {
646
+ AGLpixelFormatAttributes[numAGLAttrs++] = AGL_STEREO;
647
+ }
648
+
649
+ _setAGLAttribute( AGL_AUX_BUFFERS, hints->AuxBuffers);
650
+ _setAGLAttribute( AGL_RED_SIZE, redbits );
651
+ _setAGLAttribute( AGL_GREEN_SIZE, greenbits );
652
+ _setAGLAttribute( AGL_BLUE_SIZE, bluebits );
653
+ _setAGLAttribute( AGL_ALPHA_SIZE, alphabits );
654
+ _setAGLAttribute( AGL_DEPTH_SIZE, depthbits );
655
+ _setAGLAttribute( AGL_STENCIL_SIZE, stencilbits );
656
+ _setAGLAttribute( AGL_ACCUM_RED_SIZE, hints->AccumRedBits );
657
+ _setAGLAttribute( AGL_ACCUM_GREEN_SIZE, hints->AccumGreenBits );
658
+ _setAGLAttribute( AGL_ACCUM_BLUE_SIZE, hints->AccumBlueBits );
659
+ _setAGLAttribute( AGL_ACCUM_ALPHA_SIZE, hints->AccumAlphaBits );
660
+
661
+ if( hints->Samples > 1 )
662
+ {
663
+ _setAGLAttribute( AGL_SAMPLE_BUFFERS_ARB, 1 );
664
+ _setAGLAttribute( AGL_SAMPLES_ARB, hints->Samples );
665
+ AGLpixelFormatAttributes[numAGLAttrs++] = AGL_NO_RECOVERY;
666
+ }
667
+
668
+ AGLpixelFormatAttributes[numAGLAttrs++] = AGL_NONE;
669
+
670
+ // create pixel format descriptor
671
+ AGLDevice mainMonitor = GetMainDevice();
672
+ AGLPixelFormat pixelFormat = aglChoosePixelFormat( &mainMonitor,
673
+ 1,
674
+ AGLpixelFormatAttributes );
675
+ if( pixelFormat == NULL )
676
+ {
677
+ fprintf( stderr, "glfwOpenWindow failing because it can't create a pixel format\n" );
678
+ return GL_FALSE;
679
+ }
680
+
681
+ // store pixel format's values for _glfwPlatformGetWindowParam's use
682
+ _getAGLAttribute( AGL_ACCELERATED, _glfwWin.Accelerated );
683
+ _getAGLAttribute( AGL_RED_SIZE, _glfwWin.RedBits );
684
+ _getAGLAttribute( AGL_GREEN_SIZE, _glfwWin.GreenBits );
685
+ _getAGLAttribute( AGL_BLUE_SIZE, _glfwWin.BlueBits );
686
+ _getAGLAttribute( AGL_ALPHA_SIZE, _glfwWin.AlphaBits );
687
+ _getAGLAttribute( AGL_DEPTH_SIZE, _glfwWin.DepthBits );
688
+ _getAGLAttribute( AGL_STENCIL_SIZE, _glfwWin.StencilBits );
689
+ _getAGLAttribute( AGL_ACCUM_RED_SIZE, _glfwWin.AccumRedBits );
690
+ _getAGLAttribute( AGL_ACCUM_GREEN_SIZE, _glfwWin.AccumGreenBits );
691
+ _getAGLAttribute( AGL_ACCUM_BLUE_SIZE, _glfwWin.AccumBlueBits );
692
+ _getAGLAttribute( AGL_ACCUM_ALPHA_SIZE, _glfwWin.AccumAlphaBits );
693
+ _getAGLAttribute( AGL_AUX_BUFFERS, _glfwWin.AuxBuffers );
694
+ _getAGLAttribute( AGL_STEREO, _glfwWin.Stereo );
695
+ _getAGLAttribute( AGL_SAMPLES_ARB, _glfwWin.Samples );
696
+ _glfwWin.RefreshRate = hints->RefreshRate;
697
+
698
+ // create AGL context
699
+ _glfwWin.AGLContext = aglCreateContext( pixelFormat, NULL );
700
+
701
+ aglDestroyPixelFormat( pixelFormat );
702
+
703
+ if( _glfwWin.AGLContext == NULL )
704
+ {
705
+ fprintf( stderr, "glfwOpenWindow failing because it can't create an OpenGL context\n" );
706
+ _glfwPlatformCloseWindow();
707
+ return GL_FALSE;
708
+ }
709
+
710
+ if (_glfwLibrary.Unbundled)
711
+ {
712
+ if( GetCurrentProcess( &psn ) != noErr )
713
+ {
714
+ fprintf( stderr, "glfwOpenWindow failing because it can't get its PSN\n" );
715
+ _glfwPlatformCloseWindow();
716
+ return GL_FALSE;
717
+ }
718
+
719
+ if( TransformProcessType( &psn, kProcessTransformToForegroundApplication ) != noErr )
720
+ {
721
+ fprintf( stderr, "glfwOpenWindow failing because it can't become a foreground application\n" );
722
+ _glfwPlatformCloseWindow();
723
+ return GL_FALSE;
724
+ }
725
+
726
+ /* Keith Bauer 2007-07-12 - I don't believe this is desirable
727
+ if( SetFrontProcess( &psn ) != noErr )
728
+ {
729
+ fprintf( stderr, "glfwOpenWindow failing because it can't become the front process\n" );
730
+ _glfwPlatformCloseWindow();
731
+ return GL_FALSE;
732
+ }
733
+ */
734
+ }
735
+
736
+ // create window
737
+ Rect windowContentBounds;
738
+ windowContentBounds.left = 0;
739
+ windowContentBounds.top = 0;
740
+ windowContentBounds.right = width;
741
+ windowContentBounds.bottom = height;
742
+
743
+ windowAttributes = ( kWindowCloseBoxAttribute \
744
+ | kWindowCollapseBoxAttribute \
745
+ | kWindowStandardHandlerAttribute );
746
+
747
+ if( hints->WindowNoResize )
748
+ {
749
+ windowAttributes |= kWindowLiveResizeAttribute;
750
+ }
751
+ else
752
+ {
753
+ windowAttributes |= ( kWindowFullZoomAttribute | kWindowResizableAttribute );
754
+ }
755
+
756
+ error = CreateNewWindow( kDocumentWindowClass,
757
+ windowAttributes,
758
+ &windowContentBounds,
759
+ &( _glfwWin.MacWindow ) );
760
+ if( ( error != noErr ) || ( _glfwWin.MacWindow == NULL ) )
761
+ {
762
+ fprintf( stderr, "glfwOpenWindow failing because it can't create a window\n" );
763
+ _glfwPlatformCloseWindow();
764
+ return GL_FALSE;
765
+ }
766
+
767
+ _glfwWin.WindowUPP = NewEventHandlerUPP( _glfwWindowEventHandler );
768
+
769
+ error = InstallWindowEventHandler( _glfwWin.MacWindow,
770
+ _glfwWin.WindowUPP,
771
+ GetEventTypeCount( GLFW_WINDOW_EVENT_TYPES ),
772
+ GLFW_WINDOW_EVENT_TYPES,
773
+ NULL,
774
+ NULL );
775
+ if( error != noErr )
776
+ {
777
+ fprintf( stderr, "glfwOpenWindow failing because it can't install window event handlers\n" );
778
+ _glfwPlatformCloseWindow();
779
+ return GL_FALSE;
780
+ }
781
+
782
+ // Don't care if we fail here
783
+ (void)SetWindowTitleWithCFString( _glfwWin.MacWindow, CFSTR( "GLFW Window" ) );
784
+ (void)RepositionWindow( _glfwWin.MacWindow,
785
+ NULL,
786
+ kWindowCenterOnMainScreen );
787
+
788
+ if( !aglSetDrawable( _glfwWin.AGLContext,
789
+ GetWindowPort( _glfwWin.MacWindow ) ) )
790
+ {
791
+ fprintf( stderr, "glfwOpenWindow failing because it can't draw to the window\n" );
792
+ _glfwPlatformCloseWindow();
793
+ return GL_FALSE;
794
+ }
795
+
796
+ // Make OpenGL context current
797
+ if( !aglSetCurrentContext( _glfwWin.AGLContext ) )
798
+ {
799
+ fprintf( stderr, "glfwOpenWindow failing because it can't make the OpenGL context current\n" );
800
+ _glfwPlatformCloseWindow();
801
+ return GL_FALSE;
802
+ }
803
+
804
+ // show window
805
+ ShowWindow( _glfwWin.MacWindow );
806
+
807
+ return GL_TRUE;
808
+ }
809
+ else
810
+ {
811
+ CGDisplayErr cgErr;
812
+ CGLError cglErr;
813
+
814
+ CFDictionaryRef optimalMode;
815
+
816
+ CGLPixelFormatObj CGLpfObj;
817
+ long numCGLvs = 0;
818
+
819
+ CGLPixelFormatAttribute CGLpixelFormatAttributes[64];
820
+ int numCGLAttrs = 0;
821
+
822
+ // variables for enumerating color depths
823
+ long rgbColorDepth;
824
+ long rgbaAccumDepth = 0;
825
+ int rgbChannelDepth = 0;
826
+
827
+ // CGL pixel format attributes
828
+ _setCGLAttribute( kCGLPFADisplayMask,
829
+ CGDisplayIDToOpenGLDisplayMask( kCGDirectMainDisplay ) );
830
+
831
+ if( hints->Stereo )
832
+ {
833
+ CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFAStereo;
834
+ }
835
+
836
+ if( hints->Samples > 1 )
837
+ {
838
+ _setCGLAttribute( kCGLPFASamples, (CGLPixelFormatAttribute)hints->Samples );
839
+ _setCGLAttribute( kCGLPFASampleBuffers, (CGLPixelFormatAttribute)1 );
840
+ CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFANoRecovery;
841
+ }
842
+
843
+ CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFAFullScreen;
844
+ CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFADoubleBuffer;
845
+ CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFAAccelerated;
846
+ CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFANoRecovery;
847
+ CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFAMinimumPolicy;
848
+
849
+ _setCGLAttribute( kCGLPFAAccumSize,
850
+ (CGLPixelFormatAttribute)( hints->AccumRedBits \
851
+ + hints->AccumGreenBits \
852
+ + hints->AccumBlueBits \
853
+ + hints->AccumAlphaBits ) );
854
+
855
+ _setCGLAttribute( kCGLPFAAlphaSize, (CGLPixelFormatAttribute)alphabits );
856
+ _setCGLAttribute( kCGLPFADepthSize, (CGLPixelFormatAttribute)depthbits );
857
+ _setCGLAttribute( kCGLPFAStencilSize, (CGLPixelFormatAttribute)stencilbits );
858
+ _setCGLAttribute( kCGLPFAAuxBuffers, (CGLPixelFormatAttribute)hints->AuxBuffers );
859
+
860
+ CGLpixelFormatAttributes[ numCGLAttrs++ ] = (CGLPixelFormatAttribute)NULL;
861
+
862
+ // create a suitable pixel format with above attributes..
863
+ cglErr = CGLChoosePixelFormat( CGLpixelFormatAttributes,
864
+ &CGLpfObj,
865
+ &numCGLvs );
866
+ if( cglErr != kCGLNoError )
867
+ {
868
+ return GL_FALSE;
869
+ }
870
+
871
+ // ..and create a rendering context using that pixel format
872
+ cglErr = CGLCreateContext( CGLpfObj, NULL, &_glfwWin.CGLContext );
873
+ if( cglErr != kCGLNoError )
874
+ {
875
+ return GL_FALSE;
876
+ }
877
+
878
+ // enumerate depth of RGB channels - unlike AGL, CGL works with
879
+ // a single parameter reflecting the full depth of the frame buffer
880
+ (void)CGLDescribePixelFormat( CGLpfObj, 0, kCGLPFAColorSize, &rgbColorDepth );
881
+ if( rgbColorDepth == 24 || rgbColorDepth == 32 )
882
+ {
883
+ rgbChannelDepth = 8;
884
+ }
885
+ if( rgbColorDepth == 16 )
886
+ {
887
+ rgbChannelDepth = 5;
888
+ }
889
+
890
+ // get pixel depth of accumulator - I haven't got the slightest idea
891
+ // how this number conforms to any other channel depth than 8 bits,
892
+ // so this might end up giving completely knackered results...
893
+ (void)CGLDescribePixelFormat( CGLpfObj, 0, kCGLPFAAccumSize, &rgbaAccumDepth );
894
+ if( rgbaAccumDepth == 32 )
895
+ {
896
+ rgbaAccumDepth = 8;
897
+ }
898
+
899
+ // store values of pixel format for _glfwPlatformGetWindowParam's use
900
+ _getCGLAttribute( kCGLPFAAccelerated, _glfwWin.Accelerated );
901
+ _getCGLAttribute( rgbChannelDepth, _glfwWin.RedBits );
902
+ _getCGLAttribute( rgbChannelDepth, _glfwWin.GreenBits );
903
+ _getCGLAttribute( rgbChannelDepth, _glfwWin.BlueBits );
904
+ _getCGLAttribute( kCGLPFAAlphaSize, _glfwWin.AlphaBits );
905
+ _getCGLAttribute( kCGLPFADepthSize, _glfwWin.DepthBits );
906
+ _getCGLAttribute( kCGLPFAStencilSize, _glfwWin.StencilBits );
907
+ _getCGLAttribute( rgbaAccumDepth, _glfwWin.AccumRedBits );
908
+ _getCGLAttribute( rgbaAccumDepth, _glfwWin.AccumGreenBits );
909
+ _getCGLAttribute( rgbaAccumDepth, _glfwWin.AccumBlueBits );
910
+ _getCGLAttribute( rgbaAccumDepth, _glfwWin.AccumAlphaBits );
911
+ _getCGLAttribute( kCGLPFAAuxBuffers, _glfwWin.AuxBuffers );
912
+ _getCGLAttribute( kCGLPFAStereo, _glfwWin.Stereo );
913
+ _glfwWin.RefreshRate = hints->RefreshRate;
914
+
915
+ // destroy our pixel format
916
+ (void)CGLDestroyPixelFormat( CGLpfObj );
917
+
918
+ // capture the display for our application
919
+ cgErr = CGCaptureAllDisplays();
920
+ if( cgErr != kCGErrorSuccess )
921
+ {
922
+ return GL_FALSE;
923
+ }
924
+
925
+ // find closest matching NON-STRETCHED display mode..
926
+ optimalMode = CGDisplayBestModeForParametersAndRefreshRateWithProperty( kCGDirectMainDisplay,
927
+ rgbColorDepth,
928
+ width,
929
+ /* Check further to the right -> */ height,
930
+ hints->RefreshRate,
931
+ NULL,
932
+ NULL );
933
+ if( optimalMode == NULL )
934
+ {
935
+ return GL_FALSE;
936
+ }
937
+
938
+ // ..and switch to that mode
939
+ cgErr = CGDisplaySwitchToMode( kCGDirectMainDisplay, optimalMode );
940
+ if( cgErr != kCGErrorSuccess )
941
+ {
942
+ return GL_FALSE;
943
+ }
944
+
945
+ // switch to our OpenGL context, and bring it up fullscreen
946
+ cglErr = CGLSetCurrentContext( _glfwWin.CGLContext );
947
+ if( cglErr != kCGLNoError )
948
+ {
949
+ return GL_FALSE;
950
+ }
951
+
952
+ cglErr = CGLSetFullScreen( _glfwWin.CGLContext );
953
+ if( cglErr != kCGLNoError )
954
+ {
955
+ return GL_FALSE;
956
+ }
957
+
958
+ return GL_TRUE;
959
+ }
960
+ }
961
+
962
+ void _glfwPlatformCloseWindow( void )
963
+ {
964
+ if( _glfwWin.WindowFunctions != NULL )
965
+ {
966
+ if( _glfwWin.WindowUPP != NULL )
967
+ {
968
+ DisposeEventHandlerUPP( _glfwWin.WindowUPP );
969
+ _glfwWin.WindowUPP = NULL;
970
+ }
971
+
972
+ _glfwWin.WindowFunctions->CloseWindow();
973
+
974
+ if( !_glfwWin.Fullscreen && _glfwWin.AGLContext != NULL )
975
+ {
976
+ aglSetCurrentContext( NULL );
977
+ aglSetDrawable( _glfwWin.AGLContext, NULL );
978
+ aglDestroyContext( _glfwWin.AGLContext );
979
+ _glfwWin.AGLContext = NULL;
980
+ }
981
+
982
+ if( _glfwWin.Fullscreen && _glfwWin.CGLContext != NULL )
983
+ {
984
+ CGLSetCurrentContext( NULL );
985
+ CGLClearDrawable( _glfwWin.CGLContext );
986
+ CGLDestroyContext( _glfwWin.CGLContext );
987
+ CGReleaseAllDisplays();
988
+ _glfwWin.CGLContext = NULL;
989
+ }
990
+
991
+ if( _glfwWin.MacWindow != NULL )
992
+ {
993
+ ReleaseWindow( _glfwWin.MacWindow );
994
+ _glfwWin.MacWindow = NULL;
995
+ }
996
+
997
+ _glfwWin.WindowFunctions = NULL;
998
+ }
999
+ }
1000
+
1001
+ void _glfwPlatformSetWindowTitle( const char *title )
1002
+ {
1003
+ _glfwWin.WindowFunctions->SetWindowTitle( title );
1004
+ }
1005
+
1006
+ void _glfwPlatformSetWindowSize( int width, int height )
1007
+ {
1008
+ _glfwWin.WindowFunctions->SetWindowSize( width, height );
1009
+ }
1010
+
1011
+ void _glfwPlatformSetWindowPos( int x, int y )
1012
+ {
1013
+ _glfwWin.WindowFunctions->SetWindowPos( x, y );
1014
+ }
1015
+
1016
+ void _glfwPlatformIconifyWindow( void )
1017
+ {
1018
+ _glfwWin.WindowFunctions->IconifyWindow();
1019
+ }
1020
+
1021
+ void _glfwPlatformRestoreWindow( void )
1022
+ {
1023
+ _glfwWin.WindowFunctions->RestoreWindow();
1024
+ }
1025
+
1026
+ void _glfwPlatformSwapBuffers( void )
1027
+ {
1028
+ if( !_glfwWin.Fullscreen )
1029
+ {
1030
+ aglSwapBuffers( _glfwWin.AGLContext );
1031
+ }
1032
+ else
1033
+ {
1034
+ CGLFlushDrawable( _glfwWin.CGLContext );
1035
+ }
1036
+ }
1037
+
1038
+ void _glfwPlatformSwapInterval( int interval )
1039
+ {
1040
+ GLint AGLparameter = interval;
1041
+
1042
+ // CGL doesn't seem to like intervals other than 0 (vsync off) or 1 (vsync on)
1043
+ long CGLparameter = ( interval == 0 ? 0 : 1 );
1044
+
1045
+ if( !_glfwWin.Fullscreen )
1046
+ {
1047
+ // Don't care if we fail here..
1048
+ (void)aglSetInteger( _glfwWin.AGLContext,
1049
+ AGL_SWAP_INTERVAL,
1050
+ &AGLparameter );
1051
+ }
1052
+ else
1053
+ {
1054
+ // ..or here
1055
+ (void)CGLSetParameter( _glfwWin.CGLContext,
1056
+ kCGLCPSwapInterval,
1057
+ &CGLparameter );
1058
+ }
1059
+ }
1060
+
1061
+ void _glfwPlatformRefreshWindowParams( void )
1062
+ {
1063
+ _glfwWin.WindowFunctions->RefreshWindowParams();
1064
+ }
1065
+
1066
+ int _glfwPlatformGetWindowParam( int param )
1067
+ {
1068
+ switch ( param )
1069
+ {
1070
+ case GLFW_ACCELERATED: return _glfwWin.Accelerated; break;
1071
+ case GLFW_RED_BITS: return _glfwWin.RedBits; break;
1072
+ case GLFW_GREEN_BITS: return _glfwWin.GreenBits; break;
1073
+ case GLFW_BLUE_BITS: return _glfwWin.BlueBits; break;
1074
+ case GLFW_ALPHA_BITS: return _glfwWin.AlphaBits; break;
1075
+ case GLFW_DEPTH_BITS: return _glfwWin.DepthBits; break;
1076
+ case GLFW_STENCIL_BITS: return _glfwWin.StencilBits; break;
1077
+ case GLFW_ACCUM_RED_BITS: return _glfwWin.AccumRedBits; break;
1078
+ case GLFW_ACCUM_GREEN_BITS: return _glfwWin.AccumGreenBits; break;
1079
+ case GLFW_ACCUM_BLUE_BITS: return _glfwWin.AccumBlueBits; break;
1080
+ case GLFW_ACCUM_ALPHA_BITS: return _glfwWin.AccumAlphaBits; break;
1081
+ case GLFW_AUX_BUFFERS: return _glfwWin.AuxBuffers; break;
1082
+ case GLFW_STEREO: return _glfwWin.Stereo; break;
1083
+ case GLFW_REFRESH_RATE: return _glfwWin.RefreshRate; break;
1084
+ default: return GL_FALSE;
1085
+ }
1086
+ }
1087
+
1088
+ void _glfwPlatformPollEvents( void )
1089
+ {
1090
+ EventRef event;
1091
+ EventTargetRef eventDispatcher = GetEventDispatcherTarget();
1092
+
1093
+ while ( ReceiveNextEvent( 0, NULL, 0.0, TRUE, &event ) == noErr )
1094
+ {
1095
+ SendEventToEventTarget( event, eventDispatcher );
1096
+ ReleaseEvent( event );
1097
+ }
1098
+ }
1099
+
1100
+ void _glfwPlatformWaitEvents( void )
1101
+ {
1102
+ EventRef event;
1103
+
1104
+ // Wait for new events
1105
+ ReceiveNextEvent( 0, NULL, kEventDurationForever, FALSE, &event );
1106
+
1107
+ // Poll new events
1108
+ _glfwPlatformPollEvents();
1109
+ }
1110
+
1111
+ void _glfwPlatformHideMouseCursor( void )
1112
+ {
1113
+ // TO DO: What if we fail here?
1114
+ CGDisplayHideCursor( kCGDirectMainDisplay );
1115
+ CGAssociateMouseAndMouseCursorPosition( false );
1116
+ }
1117
+
1118
+ void _glfwPlatformShowMouseCursor( void )
1119
+ {
1120
+ // TO DO: What if we fail here?
1121
+ CGDisplayShowCursor( kCGDirectMainDisplay );
1122
+ CGAssociateMouseAndMouseCursorPosition( true );
1123
+ }
1124
+
1125
+ void _glfwPlatformSetMouseCursorPos( int x, int y )
1126
+ {
1127
+ _glfwWin.WindowFunctions->SetMouseCursorPos( x, y );
1128
+ }
1129
+
1130
+ int _glfwMacFSOpenWindow( int width,
1131
+ int height,
1132
+ int redbits,
1133
+ int greenbits,
1134
+ int bluebits,
1135
+ int alphabits,
1136
+ int depthbits,
1137
+ int stencilbits,
1138
+ int accumredbits,
1139
+ int accumgreenbits,
1140
+ int accumbluebits,
1141
+ int accumalphabits,
1142
+ int auxbuffers,
1143
+ int stereo,
1144
+ int refreshrate )
1145
+ {
1146
+ return GL_FALSE;
1147
+ }
1148
+
1149
+ void _glfwMacFSCloseWindow( void )
1150
+ {
1151
+ // TO DO: un-capture displays, &c.
1152
+ }
1153
+
1154
+ void _glfwMacFSSetWindowTitle( const char *title )
1155
+ {
1156
+ // no-op really, change "fake" mini-window title
1157
+ _glfwMacDWSetWindowTitle( title );
1158
+ }
1159
+
1160
+ void _glfwMacFSSetWindowSize( int width, int height )
1161
+ {
1162
+ // TO DO: something funky for full-screen
1163
+ _glfwMacDWSetWindowSize( width, height );
1164
+ }
1165
+
1166
+ void _glfwMacFSSetWindowPos( int x, int y )
1167
+ {
1168
+ // no-op really, change "fake" mini-window position
1169
+ _glfwMacDWSetWindowPos( x, y );
1170
+ }
1171
+
1172
+ void _glfwMacFSIconifyWindow( void )
1173
+ {
1174
+ // TO DO: Something funky for full-screen
1175
+ _glfwMacDWIconifyWindow();
1176
+ }
1177
+
1178
+ void _glfwMacFSRestoreWindow( void )
1179
+ {
1180
+ _glfwMacDWRestoreWindow();
1181
+ // TO DO: Something funky for full-screen
1182
+ }
1183
+
1184
+ void _glfwMacFSRefreshWindowParams( void )
1185
+ {
1186
+ // TO DO: implement this!
1187
+ }
1188
+
1189
+ void _glfwMacFSSetMouseCursorPos( int x, int y )
1190
+ {
1191
+ // TO DO: what if we fail here?
1192
+ CGDisplayMoveCursorToPoint( kCGDirectMainDisplay,
1193
+ CGPointMake( x, y ) );
1194
+ }
1195
+
1196
+ int _glfwMacDWOpenWindow( int width,
1197
+ int height,
1198
+ int redbits,
1199
+ int greenbits,
1200
+ int bluebits,
1201
+ int alphabits,
1202
+ int depthbits,
1203
+ int stencilbits,
1204
+ int accumredbits,
1205
+ int accumgreenbits,
1206
+ int accumbluebits,
1207
+ int accumalphabits,
1208
+ int auxbuffers,
1209
+ int stereo,
1210
+ int refreshrate )
1211
+ {
1212
+ return GL_FALSE;
1213
+ }
1214
+
1215
+ void _glfwMacDWCloseWindow( void )
1216
+ {
1217
+ }
1218
+
1219
+ void _glfwMacDWSetWindowTitle( const char *title )
1220
+ {
1221
+ CFStringRef windowTitle = CFStringCreateWithCString( kCFAllocatorDefault,
1222
+ title,
1223
+ kCFStringEncodingISOLatin1 );
1224
+
1225
+ // Don't care if we fail
1226
+ (void)SetWindowTitleWithCFString( _glfwWin.MacWindow, windowTitle );
1227
+
1228
+ CFRelease( windowTitle );
1229
+ }
1230
+
1231
+ void _glfwMacDWSetWindowSize( int width, int height )
1232
+ {
1233
+ SizeWindow( _glfwWin.MacWindow,
1234
+ width,
1235
+ height,
1236
+ TRUE );
1237
+ }
1238
+
1239
+ void _glfwMacDWSetWindowPos( int x, int y )
1240
+ {
1241
+ // TO DO: take main monitor bounds into account
1242
+ MoveWindow( _glfwWin.MacWindow,
1243
+ x,
1244
+ y,
1245
+ FALSE );
1246
+ }
1247
+
1248
+ void _glfwMacDWIconifyWindow( void )
1249
+ {
1250
+ // TO DO: What if we fail here?
1251
+ (void)CollapseWindow( _glfwWin.MacWindow,
1252
+ TRUE );
1253
+ }
1254
+
1255
+ void _glfwMacDWRestoreWindow( void )
1256
+ {
1257
+ // TO DO: What if we fail here?
1258
+ (void)CollapseWindow( _glfwWin.MacWindow,
1259
+ FALSE );
1260
+ }
1261
+
1262
+ void _glfwMacDWRefreshWindowParams( void )
1263
+ {
1264
+ // TO DO: implement this!
1265
+ }
1266
+
1267
+ void _glfwMacDWSetMouseCursorPos( int x, int y )
1268
+ {
1269
+ Rect content;
1270
+ GetWindowBounds(_glfwWin.MacWindow, kWindowContentRgn, &content);
1271
+
1272
+ _glfwInput.MousePosX = x + content.left;
1273
+ _glfwInput.MousePosY = y + content.top;
1274
+
1275
+ CGDisplayMoveCursorToPoint( kCGDirectMainDisplay,
1276
+ CGPointMake( _glfwInput.MousePosX,
1277
+ _glfwInput.MousePosY ) );
1278
+ }
1279
+