interface.swift
  1  
  2  import Cocoa
  3  
  4  import mlx_window
  5  import mlx_image
  6  import mlx_init
  7  
  8  
  9  
 10  func _mlx_bridge<T : AnyObject>(obj : T) -> UnsafeRawPointer {
 11      return UnsafeRawPointer(Unmanaged.passUnretained(obj).toOpaque())
 12  }
 13  
 14  func _mlx_bridge_retained<T : AnyObject>(obj : T) -> UnsafeRawPointer {
 15      return UnsafeRawPointer(Unmanaged.passRetained(obj).toOpaque())
 16  }
 17  
 18  func _mlx_bridge<T : AnyObject>(ptr : UnsafeRawPointer) -> T {
 19      return Unmanaged<T>.fromOpaque(ptr).takeUnretainedValue()
 20  }
 21  
 22  func _mlx_bridge_transfer<T : AnyObject>(ptr : UnsafeRawPointer) -> T {
 23      return Unmanaged<T>.fromOpaque(ptr).takeRetainedValue()
 24  }
 25  
 26  
 27  let MLX_SYNC_IMAGE_WRITABLE = Int32(1)
 28  let MLX_SYNC_WIN_FLUSH_CMD = Int32(2)
 29  let MLX_SYNC_WIN_CMD_COMPLETED = Int32(3)
 30  
 31  
 32  
 33  /// C decl
 34  
 35  
 36  @_cdecl("mlx_init")
 37  public func mlx_init_swift() -> UnsafeRawPointer
 38  {
 39  	let mm = MlxMain()	
 40  	return (_mlx_bridge_retained(obj:mm))
 41  }
 42  
 43  
 44  @_cdecl("mlx_loop")
 45  public func mlx_loop_swift(_ mlxptr:UnsafeRawPointer)
 46  {
 47  	let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
 48  	mlx.inLoop = true
 49          NSApp.run()
 50  }
 51  
 52  
 53  @_cdecl("mlx_new_window")
 54  public func mlx_new_window_swift(_ mlxptr:UnsafeRawPointer, Width w:UInt32, Height h:UInt32, Title t:UnsafePointer<CChar>) -> UnsafeRawPointer
 55  {
 56  		let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
 57  		let mw = MlxWin(device: mlx.device, width: Int(w), height: Int(h), title: String(cString: t))
 58  		mw.setNotifs()
 59  		mw.initMetal()
 60  		mlx.addWinToList(mw)
 61  		return (_mlx_bridge_retained(obj:mw))
 62  }
 63  
 64  
 65  
 66  @_cdecl("mlx_key_hook")
 67  public func mlx_key_hook_swift(_ winptr:UnsafeRawPointer, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32
 68  {
 69  	let win:MlxWin = _mlx_bridge(ptr:winptr)
 70  	win.addHook(index: 3, fct: fctptr, param: paramptr)
 71  	return (Int32(0));
 72  }
 73  
 74  
 75  @_cdecl("mlx_mouse_hook")
 76  public func mlx_mouse_hook_swift(_ winptr:UnsafeRawPointer, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32
 77  {
 78          let win:MlxWin = _mlx_bridge(ptr:winptr)
 79          win.addHook(index: 4, fct: fctptr, param: paramptr)
 80          return (Int32(0));
 81  }
 82  
 83  
 84  @_cdecl("mlx_hook")
 85  public func mlx_hook_swift(_ winptr:UnsafeRawPointer, _ xevent:Int32, _ xmask:Int32, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32
 86  {
 87          let win:MlxWin = _mlx_bridge(ptr:winptr)
 88          win.addHook(index: Int(xevent), fct: fctptr, param: paramptr)
 89          return (Int32(0));
 90  }
 91  
 92  
 93  @_cdecl("mlx_expose_hook")
 94  public func mlx_expose_hook_swift(_ winptr:UnsafeRawPointer, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32
 95  {
 96          let win:MlxWin = _mlx_bridge(ptr:winptr)
 97          win.addHook(index: 12, fct: fctptr, param: paramptr)
 98          return (Int32(0));
 99  }
100  
101  @_cdecl("mlx_loop_hook")
102  public func mlx_loop_hook_swift(_ mlxptr:UnsafeRawPointer, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32
103  {
104  	let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
105  	mlx.addLoopHook(fctptr, paramptr)
106          return (Int32(0));
107  }
108  
109  
110  @_cdecl("mlx_do_key_autorepeatoff")
111  public func mlx_do_key_autorepeatoff_swift(_ mlxptr:UnsafeRawPointer)
112  {
113  	let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
114  	mlx.winList.forEach{ $0.setKeyRepeat(0) }
115  }
116  
117  
118  @_cdecl("mlx_do_key_autorepeaton")
119  public func mlx_do_key_autorepeatoon_swift(_ mlxptr:UnsafeRawPointer)
120  {
121  	let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
122  	mlx.winList.forEach{ $0.setKeyRepeat(1) }
123  }
124  
125  
126  @_cdecl("mlx_clear_window")
127  public func mlx_clear_window_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer)
128  {
129  	let win:MlxWin = _mlx_bridge(ptr:winptr)
130  	win.clearWin()
131  }
132  
133  
134  @_cdecl("mlx_pixel_put")
135  public func mlx_pixel_put_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer, _ x:Int32, _ y:Int32, _ color:UInt32)
136  {
137  	let win:MlxWin = _mlx_bridge(ptr:winptr)
138  	win.pixelPut(x, y, color)
139  }
140  
141  
142  @_cdecl("mlx_get_color_value")
143  public func mlx_get_color_value(_ mlxptr:UnsafeRawPointer, _ color:UInt32) -> UInt32
144  {
145      return color
146  }
147  
148  
149  @_cdecl("mlx_new_image")
150  public func mlx_new_image(_ mlxptr:UnsafeRawPointer, _ width:Int32, _ height:Int32) -> UnsafeRawPointer
151  {
152  	let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
153  	let img = MlxImg(d:mlx.device, w:Int(width), h:Int(height))
154  	mlx.addImgToList(img)
155  ///	print(CFGetRetainCount(img))
156  	return (_mlx_bridge_retained(obj:img))
157  
158  }
159  
160  @_cdecl("mlx_get_data_addr")
161  public func mlx_get_data_addr_swift(_ imgptr:UnsafeRawPointer, _ bpp:UnsafeMutablePointer<Int32>, _ sizeline:UnsafeMutablePointer<Int32>, _ endian:UnsafeMutablePointer<Int32>) -> UnsafeMutablePointer<UInt32>
162  {
163  	let img:MlxImg = _mlx_bridge(ptr:imgptr)
164  	bpp.pointee = 32
165  	sizeline.pointee = Int32(img.texture_sizeline)
166  	endian.pointee = Int32(0)
167  	return img.texture_data
168  }
169  
170  @_cdecl("mlx_put_image_to_window")
171  public func mlx_put_image_to_window_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer, _ imgptr:UnsafeRawPointer, _ x:Int32, _ y:Int32) -> Int32
172  {
173  	let win:MlxWin = _mlx_bridge(ptr:winptr)
174  	let img:MlxImg = _mlx_bridge(ptr:imgptr)
175  	win.putImage(image:img, x:x, y:y)
176  	return Int32(0)
177  }
178  
179  @_cdecl("mlx_put_image_to_window_scale")
180  public func mlx_put_image_to_window_scale_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer, _ imgptr:UnsafeRawPointer, _ sx:Int32, _ sy:Int32, _ sw:Int32, _ sh:Int32, _ dx:Int32, _ dy:Int32, _ dw:Int32, _ dh:Int32, _ color:UInt32) -> Int32
181  {
182  	let win:MlxWin = _mlx_bridge(ptr:winptr)
183  	let img:MlxImg = _mlx_bridge(ptr:imgptr)
184  	win.putImageScale(image:img, sx:sx, sy:sy, sw:sw, sh:sh, dx:dx, dy:dy, dw:dw, dh:dh, c:color)
185  	return Int32(0)
186  }
187  
188  @_cdecl("mlx_do_sync")
189  public func mlx_do_sync_swift(_ mlxptr:UnsafeRawPointer) -> Int32
190  {
191  	let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
192  	mlx.winList.forEach { $0.flushImages() }
193  	mlx.winList.forEach { $0.waitForGPU() }
194  	return Int32(0)
195  }
196  
197  @_cdecl("mlx_sync")
198  public func mlx_sync_swift(_ what:Int32, _ param:UnsafeRawPointer) -> Int32
199  {
200      switch what
201      {
202  	case MLX_SYNC_IMAGE_WRITABLE:
203  		let img:MlxImg = _mlx_bridge(ptr:param); while img.onGPU > 0 {} 
204  	case MLX_SYNC_WIN_FLUSH_CMD:
205  		let win:MlxWin = _mlx_bridge(ptr:param); win.flushImages()
206  	case MLX_SYNC_WIN_CMD_COMPLETED:
207  	        let win:MlxWin = _mlx_bridge(ptr:param); win.flushImages(); win.waitForGPU()
208  	default:
209  		break
210      }
211      return Int32(0)
212  }
213  
214  @_cdecl("mlx_destroy_window")
215  public func mlx_destroy_window_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer) -> Int32
216  {
217  	let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
218  	/// bridge_transfer to get the retain, at end of this func should release the MlxWin object, because no ref anymore.
219  	let win:MlxWin = _mlx_bridge_transfer(ptr:winptr)
220  	win.delNotifs()
221  	win.flushImages()
222  	win.waitForGPU()
223  	win.destroyWinE()
224  	mlx.winList.removeAll(where: { $0 === win} )
225  	return Int32(0)
226  }
227  
228  @_cdecl("mlx_destroy_image")
229  public func mlx_destroy_image_swift(_ mlxptr:UnsafeRawPointer, _ imgptr:UnsafeRawPointer) -> Int32
230  {
231  	let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
232  	/// bridge_transfer to get the retain, at end of this func should release the MlxImg object, because no ref anymore.
233  	let img:MlxImg = _mlx_bridge_transfer(ptr:imgptr)
234  	mlx.winList.forEach { $0.flushImages() }
235  	while img.onGPU > 0 {}
236  	mlx.imgList.removeAll(where: { $0 === img} )
237  	return Int32(0)
238  }
239  
240  
241  @_cdecl("mlx_get_screen_size")
242  public func mlx_get_screen_size_swift(_ mlxptr:UnsafeRawPointer, _ sizex:UnsafeMutablePointer<Int32>, _ sizey:UnsafeMutablePointer<Int32>) -> Int32
243  {
244  	/// let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
245  	sizex.pointee = Int32(NSScreen.main!.frame.size.width)
246  	sizey.pointee = Int32(NSScreen.main!.frame.size.height)
247  	return Int32(0)
248  }
249  
250  
251  @_cdecl("mlx_mouse_hide")
252  public func mlx_mouse_hide_swift() -> Int32
253  {
254    NSCursor.hide()
255    return Int32(0)
256  }
257  
258  @_cdecl("mlx_mouse_show")
259  public func mlx_mouse_show_swift() -> Int32
260  {
261    NSCursor.unhide()
262    return Int32(0)
263  }
264  
265  
266  @_cdecl("mlx_mouse_move")
267  public func mlx_mouse_move_swift(_ winptr:UnsafeRawPointer, _ x:Int32, _ y:Int32) -> Int32
268  {
269  	let win:MlxWin = _mlx_bridge(ptr:winptr)
270  	var pt = CGPoint(x:CGFloat(x), y:CGFloat(y))
271  	pt = win.convertToDisplay(pt)
272  	CGWarpMouseCursorPosition(pt)
273          //CGAssociateMouseAndMouseCursorPosition(UInt32(1))
274          CGAssociateMouseAndMouseCursorPosition(1)
275  	return Int32(0);
276  }
277  
278  
279  
280  @_cdecl("mlx_mouse_get_pos")
281  public func mlx_mouse_get_pos_swift(_ winptr:UnsafeRawPointer, _ x:UnsafeMutablePointer<Int32>, _ y:UnsafeMutablePointer<Int32>) -> Int32
282  {
283  	let win:MlxWin = _mlx_bridge(ptr:winptr)
284  	let point = win.getMouseLoc()
285  	x.pointee = Int32(point.x)
286  	y.pointee = Int32(point.y)
287  	return Int32(0)
288  }