spierce7
07/17/2018, 5:28 AMCGWindowListCopyWindowInfo()
returns an Array of Maps. When I bridge the result with CFBridgingRelease()
, the result is an NSArray of Kotlin maps. Why can't it be a kotlin Array of Kotlin maps? Is there a way for me to manually bridge an NSArray to a Kotlin Array?spierce7
07/17/2018, 5:31 AMimport platform.CoreGraphics.*
import platform.Foundation.*
import platform.CoreFoundation.*
fun main(args: Array<String>) {
val windowInfo: NSArray = CGWindowListCopyWindowInfo(kCGWindowListOptionAll, kCGNullWindowID)!!.bridgingRelease()
println("Size: " + windowInfo.count)
val map = windowInfo.objectAtIndex(0) as Map<String, Any>
println("Type: ${map::class.simpleName}")
for ((key, value) in map) {
println("Key: $key, Value: ${value::class.qualifiedName} $value")
}
}
@Suppress("UNCHECKED_CAST")
fun CFArrayRef.bridgingRelease(): NSArray {
val releasedItem = CFBridgingRelease(this as CFTypeRef)!!
return releasedItem as NSArray
}
Here is the output:
Size: 112
Type: NSDictionaryAsKMap
Key: kotlin.String kCGWindowLayer, Value: kotlin.Long 102
Key: kotlin.String kCGWindowAlpha, Value: kotlin.Double 1.0
Key: kotlin.String kCGWindowMemoryUsage, Value: kotlin.Long 5384
Key: kotlin.String kCGWindowSharingState, Value: kotlin.Long 1
Key: kotlin.String kCGWindowOwnerPID, Value: kotlin.Long 33792
Key: kotlin.String kCGWindowNumber, Value: kotlin.Long 4074
Key: kotlin.String kCGWindowOwnerName, Value: kotlin.String AppCode
Key: kotlin.String kCGWindowStoreType, Value: kotlin.Long 2
Key: kotlin.String kCGWindowBounds, Value: konan.internal.NSDictionaryAsKMap {X=100.0, Height=1.0, Y=100.0, Width=1.0}
Key: kotlin.String kCGWindowName, Value: kotlin.String Focus Proxy
svyatoslav.scherbina
07/24/2018, 7:13 AMWhy can’t it be a kotlin Array of Kotlin maps? Is there a way for me to manually bridge an NSArray to a Kotlin Array?
NSArray
is mapped to Kotlin List
. You can cast releasedItem
to Kotlin list of Kotlin maps:
return releasedItem as List<Map<String, Any>>
spierce7
07/25/2018, 3:03 PM