Mojave で___がなくなって寂しい。個人的には Happy Mac がなくなったとき以来の寂しさだ1。なんだと思う?
正解は Grab。OS X 初期からいつだってユーティリティフォルダの中にいる。Mojave でついに Screenshot というアプリケーションに書き換えられてしまった。
え、そもそもキーボードショートカットを使うからどちらも必要ない? ...まあ自分もそうで起動することなんて滅多にないのだけど、当初から見た目も機能もほとんど変化していないこのアプリケーションには逆に貴重な歴史的遺産が含まれている。実のところ Grab は OS X 初期どころか NeXTSTEP 時代からの存在であり、その頃に描かれたアイコンをそのまま眺められる最後の生き残りだったのだ2。
例えばこのカメラアイコン:
今になって見ると色数が少なく HiDPI 非対応、光源が左上で明らかに異質なのだけど、当時のほかの OS のアイコンと比較すると輪郭線が目立たず階調を増やして立体的に表現されていて重みすら感じられる。のちに登場する Mac OS 8 のプラチナアピアランスのアイコンよりもむしろ Mac OS X のリアルなアイコンと方向性が近いのではないだろうか。
protocol KeyPathBasedBinding {}
extension KeyPathBasedBinding
{
/// When the returned object is deinited or invalidated, it will stop binding.
/// - Parameter targetKeyPath: The KeyPath for target property. Target property must be observable through KVO.
func bind<Value, Target>(_ keyPath: ReferenceWritableKeyPath<Self, Value>, to targetKeyPath: KeyPath<Target, Value>, of target: Target) -> NSKeyValueObservation where Self: AnyObject, Target: _KeyValueCodingAndObserving
{
return target.observe(targetKeyPath, options: [.initial, .new], changeHandler: { [weak self] (sender, change) in
self?[keyPath: keyPath] = target[keyPath: targetKeyPath]
})
}
/// When the returned object is deinited or invalidated, it will stop binding.
/// - Parameter targetKeyPath: The KeyPath for target property. Target property must be observable through KVO.
func bind<Value, Target>(_ keyPath: ReferenceWritableKeyPath<Self, Value>, to targetKeyPath: KeyPath<Target, Optional<Value>>, of target: Target, nullValue: Value) -> NSKeyValueObservation where Self: AnyObject, Target: _KeyValueCodingAndObserving
{
return target.observe(targetKeyPath, options: [.initial, .new], changeHandler: { [weak self] (sender, change) in
self?[keyPath: keyPath] = (target[keyPath: targetKeyPath] ?? nullValue)
})
}
}
extension NSObject: KeyPathBasedBinding {}