Как мы можем читать/принуждать значения CFArray и CFString и т. д. из OS X JXA?

Если вы поэкспериментируете с чтением/настройкой языка ввода OSX через мост ObjC, напишите такие фрагменты, как:

(function () {
    'use strict';

    ObjC.import('Carbon');
    ObjC.import('stdio');

    var sourceList = $.TISCreateInputSourceList(null, false);

    var current_source = $.TISCopyCurrentKeyboardInputSource();

    var cfs = $.TISGetInputSourceProperty(current_source, $.kTISPropertyInputSourceID);
    var cfn = $.TISGetInputSourceProperty(current_source, $.kTISPropertyLocalizedName)

    var sourceCount = $.CFArrayGetCount(sourceList)

    return $.CFArrayGetValueAtIndex(sourceList, 0)

})();

вскоре мы получим возвращаемые значения ссылок obj типов CF. В самом ObjC они могут быть приведены к значениям NS. Есть ли смысл в том, как этого можно достичь в JavaScript для приложений?

(Я получаю возвращаемые значения ссылки на объект CF, из которых мне не удалось извлечь строку или другие примитивные значения)


person houthakker    schedule 27.11.2015    source источник


Ответы (1)


Вы можете привести тип CF к типу NS, сначала повторно привязав функцию CFMakeCollectable так, чтобы она принимала void * и возвращала id, а затем использовала эту функцию для выполнения приведения:

ObjC.bindFunction('CFMakeCollectable', [ 'id', [ 'void *' ] ]);

var cfString = $.CFStringCreateWithCString(0, "foo", 0); // => [object Ref]
var nsString = $.CFMakeCollectable(cfString);            // => $("foo")

Чтобы упростить использование в коде, вы можете определить функцию .toNS() в прототипе Ref:

Ref.prototype.toNS = function () { return $.CFMakeCollectable(this); }

Вот как можно использовать эту новую функцию с функциями TIS*:

ObjC.import('Carbon');

var current_source = $.TISCopyCurrentKeyboardInputSource();
var cfs = $.TISGetInputSourceProperty(current_source, $.kTISPropertyInputSourceID);

cfs.toNS() // => $("com.apple.keylayout.US")
person bacongravy    schedule 26.01.2016