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 }