Replace .qtz about window view with .ca view

Replaces the Quartz Composer-backed about window animation with a recreation using a Core Animation Bundle
This commit is contained in:
SoCuul 2026-03-29 05:37:11 -07:00
parent 59725539a0
commit 499e0c5919
No known key found for this signature in database
12 changed files with 298 additions and 33 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 778 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 241 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

View file

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>assetManifest</key>
<string>assetManifest.caml</string>
<key>documentHeight</key>
<real>286</real>
<key>documentResizesToView</key>
<false/>
<key>documentWidth</key>
<real>262</real>
<key>dynamicGuidesEnabled</key>
<true/>
<key>geometryFlipped</key>
<false/>
<key>guidesEnabled</key>
<true/>
<key>interactiveMouseEventsEnabled</key>
<true/>
<key>interactiveShowsCursor</key>
<true/>
<key>interactiveTouchEventsEnabled</key>
<false/>
<key>loopEnd</key>
<real>+infinity</real>
<key>loopStart</key>
<real>0.0</real>
<key>loopingEnabled</key>
<false/>
<key>multitouchDisablesMouse</key>
<false/>
<key>multitouchEnabled</key>
<false/>
<key>presentationMouseEventsEnabled</key>
<true/>
<key>presentationShowsCursor</key>
<true/>
<key>presentationTouchEventsEnabled</key>
<false/>
<key>rootDocument</key>
<string>main.caml</string>
<key>savesWindowFrame</key>
<false/>
<key>scalesToFitInPlayer</key>
<false/>
<key>showsTouches</key>
<true/>
<key>snappingEnabled</key>
<true/>
<key>timelineMarkers</key>
<string>[(null)]</string>
<key>touchesColor</key>
<string>1 1 0 0.8</string>
<key>unitsInPixelsInPlayer</key>
<true/>
</dict>
</plist>

123
keycastr/About.ca/main.caml Normal file
View file

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="UTF-8"?>
<caml xmlns="http://www.apple.com/CoreAnimation/1.0">
<CALayer allowsEdgeAntialiasing="1" allowsGroupOpacity="1" bounds="0 0 262 286" contentsFormat="RGBA8" cornerCurve="circular" name="Root Layer" position="131 143">
<sublayers>
<CALayer allowsEdgeAntialiasing="1" allowsGroupOpacity="1" backgroundColor="0.9468 0.9468 0.9468" beginTime="-0.433333" bounds="0 0 262 286" contentsFormat="RGBA8" cornerCurve="circular" hidden="0" name="Background" position="131 143"/>
<CALayer allowsEdgeAntialiasing="1" allowsGroupOpacity="1" bounds="0 0 170.86902 36.993" contentsFormat="RGBA8" cornerCurve="circular" name="KeyCastr" position="170.6861 255.2845" transform="translate(-39.6861, -52.1182, 0) scale(1.08785, 1.08785, 1)">
<sublayers>
<CAShapeLayer fillColor="0.2902 0.6275 0.8784" path="0 28.798 m 5.991 28.798 l 5.991 14.38 l 4.329 14.96 l 15.848 28.798 l 23.347 28.798 l 11.944 15.037 l 12.292 19.289 l 23.579 0 l 16.583 0 l 9.547 12.177 l 5.991 7.886 l 5.991 0 l 0 0 l 0 28.798 l h" allowsEdgeAntialiasing="1" allowsGroupOpacity="1" bounds="0 0 23.579 28.798" contentsFormat="RGBA8" cornerCurve="circular" name="path" position="11.7895 22.13">
<strokeColor opacity="0" value="0 0 0"/>
</CAShapeLayer>
<CAShapeLayer fillColor="0.2902 0.6275 0.8784" path="11.016 0 m 8.852 0 6.932 0.489 5.257 1.468 c 3.582 2.448 2.287 3.781 1.372 5.469 c 0.457 7.157 0 9.019 0 11.055 c 0 13.116 0.464 14.985 1.391 16.66 c 2.319 18.335 3.595 19.649 5.218 20.603 c 6.842 21.556 8.646 22.033 10.63 22.033 c 12.794 22.033 14.663 21.582 16.235 20.68 c 17.807 19.778 19.005 18.535 19.83 16.95 c 20.654 15.365 21.067 13.593 21.067 11.635 c 21.067 10.681 20.976 9.934 20.796 9.393 c 4.986 9.393 l 4.986 13.645 l 17.51 13.645 l 14.766 11.635 l 15.024 12.717 15.011 13.696 14.727 14.572 c 14.444 15.449 13.941 16.138 13.22 16.64 c 12.498 17.143 11.635 17.394 10.63 17.394 c 9.625 17.394 8.755 17.143 8.021 16.64 c 7.286 16.138 6.745 15.41 6.397 14.456 c 6.049 13.503 5.914 12.356 5.991 11.016 c 5.888 9.831 6.03 8.787 6.416 7.885 c 6.803 6.983 7.402 6.281 8.214 5.778 c 9.026 5.276 9.986 5.025 11.094 5.025 c 12.099 5.025 12.975 5.231 13.722 5.643 c 14.47 6.055 15.049 6.622 15.462 7.344 c 20.1 5.141 l 19.456 3.594 18.316 2.351 16.679 1.41 c 15.043 0.47 13.155 0 11.016 0 c h" allowsEdgeAntialiasing="1" allowsGroupOpacity="1" bounds="0 0 21.067 22.033" contentsFormat="RGBA8" cornerCurve="circular" name="path" position="35.0405 18.2845">
<strokeColor opacity="0" value="0 0 0"/>
</CAShapeLayer>
<CAShapeLayer fillColor="0.2902 0.6275 0.8784" path="8.968 10.128 m 9.277 5.296 l 0 28.837 l 6.224 28.837 l 12.37 12.099 l 10.05 12.099 l 16.197 28.837 l 22.42 28.837 l 11.133 0 l 4.948 0 l 8.968 10.128 l h" allowsEdgeAntialiasing="1" allowsGroupOpacity="1" bounds="0 0 22.42 28.837" contentsFormat="RGBA8" cornerCurve="circular" name="path" position="58.484 14.4185">
<strokeColor opacity="0" value="0 0 0"/>
</CAShapeLayer>
<CAShapeLayer fillColor="0.2902 0.6275 0.8784" path="14.534 0 m 11.802 0 9.328 0.644 7.112 1.932 c 4.896 3.221 3.156 4.999 1.894 7.267 c 0.631 9.534 0 12.073 0 14.882 c 0 17.691 0.631 20.229 1.894 22.497 c 3.156 24.764 4.889 26.536 7.093 27.812 c 9.296 29.087 11.776 29.725 14.534 29.725 c 16.544 29.725 18.393 29.384 20.081 28.701 c 21.769 28.018 23.192 27.097 24.352 25.937 c 25.512 24.777 26.349 23.476 26.865 22.033 c 21.569 19.482 l 21.054 20.925 20.177 22.091 18.94 22.98 c 17.703 23.869 16.235 24.313 14.534 24.313 c 12.859 24.313 11.37 23.92 10.069 23.134 c 8.768 22.348 7.763 21.24 7.054 19.81 c 6.345 18.38 5.991 16.737 5.991 14.882 c 5.991 13.026 6.345 11.383 7.054 9.953 c 7.763 8.523 8.768 7.408 10.069 6.61 c 11.37 5.811 12.859 5.411 14.534 5.411 c 16.235 5.411 17.703 5.856 18.94 6.745 c 20.177 7.634 21.054 8.8 21.569 10.243 c 26.865 7.692 l 26.349 6.249 25.512 4.947 24.352 3.788 c 23.192 2.628 21.769 1.707 20.081 1.024 c 18.393 0.341 16.544 0 14.534 0 c h" allowsEdgeAntialiasing="1" allowsGroupOpacity="1" bounds="0 0 26.865 29.725" contentsFormat="RGBA8" cornerCurve="circular" name="path" position="85.2525 22.1305">
<strokeColor opacity="0" value="0 0 0"/>
</CAShapeLayer>
<CAShapeLayer fillColor="0.2902 0.6275 0.8784" path="7.383 0 m 5.862 0 4.548 0.244 3.44 0.734 c 2.332 1.224 1.482 1.926 0.889 2.841 c 0.296 3.756 0 4.844 0 6.107 c 0 7.911 0.625 9.386 1.875 10.533 c 3.124 11.68 4.999 12.459 7.499 12.872 c 13.954 13.915 l 13.954 9.663 l 8.543 8.697 l 7.692 8.542 7.054 8.272 6.629 7.885 c 6.204 7.499 5.991 6.97 5.991 6.3 c 5.991 5.656 6.23 5.154 6.706 4.793 c 7.183 4.432 7.795 4.252 8.543 4.252 c 9.47 4.252 10.301 4.458 11.036 4.87 c 11.77 5.282 12.337 5.843 12.737 6.552 c 13.136 7.26 13.336 8.04 13.336 8.89 c 13.336 14.379 l 13.336 15.178 13.014 15.848 12.369 16.389 c 11.725 16.93 10.875 17.201 9.818 17.201 c 8.787 17.201 7.879 16.924 7.093 16.37 c 6.307 15.816 5.734 15.062 5.373 14.109 c 0.734 16.312 l 1.353 18.064 2.506 19.456 4.194 20.487 c 5.882 21.517 7.847 22.033 10.089 22.033 c 11.841 22.033 13.407 21.711 14.785 21.066 c 16.164 20.422 17.233 19.52 17.994 18.361 c 18.754 17.201 19.134 15.874 19.134 14.379 c 19.134 0.463 l 13.722 0.463 l 13.722 3.865 l 15.037 4.097 l 14.109 2.68 13.027 1.642 11.79 0.985 c 10.553 0.328 9.084 0 7.383 0 c h" allowsEdgeAntialiasing="1" allowsGroupOpacity="1" bounds="0 0 19.134 22.033" contentsFormat="RGBA8" cornerCurve="circular" name="path" position="110.416 18.2845">
<strokeColor opacity="0" value="0 0 0"/>
</CAShapeLayer>
<CAShapeLayer fillColor="0.2902 0.6275 0.8784" path="9.741 0.077 m 7.422 0 5.386 0.477 3.634 1.507 c 1.882 2.538 0.67 3.968 0 5.798 c 4.175 7.963 l 4.768 6.829 5.534 5.966 6.475 5.373 c 7.416 4.78 8.453 4.497 9.587 4.523 c 10.386 4.548 11.004 4.735 11.442 5.083 c 11.88 5.431 12.086 5.901 12.061 6.494 c 12.035 6.958 11.842 7.344 11.481 7.654 c 11.12 7.963 10.592 8.182 9.896 8.311 c 6.301 9.006 l 4.575 9.419 3.222 10.179 2.242 11.287 c 1.263 12.395 0.748 13.709 0.696 15.23 c 0.67 16.518 0.973 17.672 1.605 18.69 c 2.236 19.707 3.144 20.513 4.33 21.105 c 5.515 21.698 6.894 22.02 8.466 22.072 c 10.527 22.149 12.351 21.73 13.935 20.816 c 15.52 19.901 16.673 18.58 17.395 16.853 c 13.182 14.689 l 12.821 15.539 12.228 16.216 11.404 16.718 c 10.579 17.221 9.651 17.459 8.62 17.433 c 7.873 17.407 7.293 17.234 6.881 16.911 c 6.469 16.589 6.275 16.158 6.301 15.616 c 6.327 15.178 6.527 14.811 6.9 14.515 c 7.274 14.218 7.86 13.967 8.659 13.761 c 12.022 13.065 l 13.8 12.601 15.172 11.841 16.139 10.785 c 17.105 9.728 17.614 8.44 17.666 6.919 c 17.691 5.605 17.389 4.445 16.757 3.44 c 16.126 2.435 15.205 1.636 13.993 1.044 c 12.782 0.451 11.365 0.129 9.741 0.077 c h" allowsEdgeAntialiasing="1" allowsGroupOpacity="1" bounds="0 0 17.691 22.149" contentsFormat="RGBA8" cornerCurve="circular" name="path" position="131.9975 18.3035">
<strokeColor opacity="0" value="0 0 0"/>
</CAShapeLayer>
<CAShapeLayer fillColor="0.2902 0.6275 0.8784" path="11.596 0 m 9.045 0 7.067 0.496 5.663 1.875 c 4.258 3.253 3.556 5.18 3.556 7.653 c 3.556 16.119 l 0 16.119 l 0 21.144 l 0.193 21.144 l 1.275 21.144 2.106 21.415 2.686 21.956 c 3.266 22.497 3.556 23.309 3.556 24.391 c 3.556 26.71 l 9.354 26.71 l 9.354 21.144 l 13.549 21.144 l 13.549 16.119 l 9.354 16.119 l 9.354 8.04 l 9.354 6.958 9.65 6.152 10.243 5.624 c 10.836 5.096 11.738 4.832 12.949 4.832 c 15.787 4.832 l 15.787 0 l 11.596 0 l h" allowsEdgeAntialiasing="1" allowsGroupOpacity="1" bounds="0 0 15.787 26.71" contentsFormat="RGBA8" cornerCurve="circular" name="path" position="150.6055 21.048">
<strokeColor opacity="0" value="0 0 0"/>
</CAShapeLayer>
<CALayer allowsEdgeAntialiasing="1" allowsGroupOpacity="1" bounds="0 0 12.37 21.376" contentsFormat="RGBA8" cornerCurve="circular" name="Group" position="166.6 18.613" transform="translate(-1.91598, 0.231929, 0)">
<sublayers>
<CAShapeLayer fillColor="1 0.3804 0.702" path="0 21.144 m 5.412 21.144 l 5.412 16.08 l 5.025 16.815 l 5.463 18.49 6.191 19.669 7.209 20.351 c 8.227 21.034 9.535 21.376 11.133 21.376 c 12.37 21.376 l 12.37 16.351 l 10.553 16.351 l 9.11 16.351 7.957 15.913 7.093 15.036 c 6.23 14.16 5.798 12.949 5.798 11.403 c 5.798 0 l 0 0 l 0 21.144 l h" allowsEdgeAntialiasing="1" allowsGroupOpacity="1" bounds="0 0 12.369995117187 21.719284057617" contentsFormat="RGBA8" cornerCurve="circular" name="path" position="6.184997558594 10.516357421875">
<strokeColor opacity="0" value="0 0 0"/>
</CAShapeLayer>
</sublayers>
</CALayer>
</sublayers>
</CALayer>
<CAEmitterLayer emitterSize="112.859573364258 111.08317565918" renderMode="oldestLast" allowsEdgeAntialiasing="1" allowsGroupOpacity="1" beginTime="-0.2" bounds="0 0 56.4298 55.5416" contentsFormat="RGBA8" cornerCurve="circular" hidden="0" name="Emitter Layer" position="159.1338 113.6972" shouldRasterize="0" speed="0.75">
<emitterCells>
<CAEmitterCell beginTime="0" birthRate="2.80791" contentsFrameCount="0" contentsFrameMode="single" contentsFramesPerRow="0" contentsFramesPerSecond="0" contentsScale="1" duration="inf" emissionLatitude="0" emissionRange="0" lifetime="0.75" lifetimeRange="0" name="Cell" particleType="plane" repeatCount="0" repeatDuration="0" scale="0" scaleRange="0" scaleSpeed="0" spin="0" xAcceleration="0">
<contents type="CGImage" src="assets/KeyCastrWave.png"/>
<emitterBehaviors>
<CAEmitterBehavior behavior="valueOverLife" name="valueOverLife" keyPath="scale" additive="0">
<values>
<real value="0.4"/>
<real value="1.5"/>
</values>
</CAEmitterBehavior>
<CAEmitterBehavior behavior="valueOverLife" name="valueOverLife 2" keyPath="color.alpha" additive="0">
<values>
<integer value="1"/>
<real value="0.3"/>
<integer value="0"/>
</values>
</CAEmitterBehavior>
</emitterBehaviors>
</CAEmitterCell>
</emitterCells>
<animations>
<animation type="CAKeyframeAnimation" keyPath="emitterCells.Cell.birthRate" beginTime="1e-100" duration="2" enabled="1" fillMode="both" removedOnCompletion="0" repeatCount="inf">
<keyTimes>
<real value="0.2"/>
<real value="0.4"/>
<real value="0.4"/>
<real value="0.6"/>
<real value="0.8"/>
<integer value="1"/>
</keyTimes>
<values>
<integer value="1"/>
<integer value="10"/>
<integer value="2"/>
<real value="1.5"/>
<integer value="5"/>
<integer value="1"/>
</values>
</animation>
</animations>
</CAEmitterLayer>
<CALayer allowsEdgeAntialiasing="1" allowsGroupBlending="0" allowsGroupOpacity="0" bounds="0 0 116.20865 116.2087" contentsFormat="RGBA8" cornerCurve="circular" name="App Icon" position="131 71">
<sublayers>
<CALayer allowsEdgeAntialiasing="1" allowsGroupOpacity="1" bounds="0 0 116.2087 116.2087" contentsFormat="RGBA8" cornerCurve="circular" hidden="0" name="Normal" position="58.1044 58.1044">
<contents type="CGImage" src="assets/KeyCastrInactive.png"/>
</CALayer>
<CALayer allowsEdgeAntialiasing="1" allowsGroupOpacity="1" bounds="0 0 116.2087 116.2087" contentsFormat="RGBA8" cornerCurve="circular" hidden="0" name="Glow" position="58.104325 58.1044">
<contents type="CGImage" src="assets/KeyCastr.png"/>
<animations>
<p key="animation-1" type="CAKeyframeAnimation" calculationMode="linear" keyPath="opacity" autoreverses="0" beginTime="1e-100" duration="3" enabled="1" fillMode="removed" removedOnCompletion="0" repeatCount="inf" timingFunction="easeInEaseOut">
<keyTimes>
<integer value="0"/>
<real value="0.5"/>
<integer value="1"/>
</keyTimes>
<values>
<integer value="0"/>
<integer value="1"/>
<integer value="0"/>
</values>
</p>
</animations>
</CALayer>
</sublayers>
<animations>
<animation type="CAKeyframeAnimation" calculationMode="linear" keyPath="transform.scale.xy" autoreverses="0" beginTime="1e-100" duration="0.75" enabled="0" fillMode="removed" removedOnCompletion="0" repeatCount="inf" timingFunction="0.092546 0.67152 0.37163 0.96675">
<keyTimes>
<integer value="0"/>
<real value="0.5"/>
<integer value="1"/>
</keyTimes>
<values>
<integer value="1"/>
<real value="0.9"/>
<integer value="1"/>
</values>
</animation>
</animations>
</CALayer>
</sublayers>
<states/>
<stateTransitions/>
</CALayer>
</caml>

View file

@ -3,7 +3,6 @@
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="24506"/>
<plugIn identifier="com.apple.QuartzComposerIBPlugin" version="24506"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
@ -17,7 +16,6 @@
</customObject>
<customObject id="375" customClass="KCAppController">
<connections>
<outlet property="aboutQCView" destination="386" id="ppu-GG-BnQ"/>
<outlet property="aboutWindow" destination="384" id="395"/>
<outlet property="dockShortcutItem" destination="516" id="521"/>
<outlet property="preferencesWindow" destination="371" id="394"/>
@ -162,7 +160,7 @@
<rect key="contentRect" x="335" y="390" width="471" height="466"/>
<rect key="screenRect" x="0.0" y="0.0" width="1512" height="944"/>
<view key="contentView" misplaced="YES" id="372">
<rect key="frame" x="0.0" y="0.0" width="473" height="466"/>
<rect key="frame" x="0.0" y="0.0" width="471" height="466"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tabView translatesAutoresizingMaskIntoConstraints="NO" id="402">
@ -506,7 +504,7 @@
</connections>
<point key="canvasLocation" x="-262.5" y="-49"/>
</window>
<window allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="384" userLabel="About">
<window allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" titlebarAppearsTransparent="YES" id="384" userLabel="About">
<windowStyleMask key="styleMask" titled="YES" closable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="196" y="194" width="256" height="337"/>
@ -519,8 +517,8 @@
<rect key="frame" x="0.0" y="78" width="258" height="5"/>
</box>
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="388">
<rect key="frame" x="18" y="56" width="83" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Version 0.8.0" id="389">
<rect key="frame" x="18" y="56" width="110" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Version Unknown" id="389">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
@ -531,23 +529,20 @@
<textFieldCell key="cell" controlSize="small" allowsUndo="NO" sendsActionOnEndEditing="YES" alignment="left" id="393">
<font key="font" metaFont="smallSystem"/>
<string key="title" base64-UTF8="YES">
Q29weXJpZ2h0IAPCqSAyMDA5LTIwMjUgU3RlcGhlbiBEZWtlbiwgQW5kcmV3IEtpdGNoZW4sIGFuZCBj
Q29weXJpZ2h0IAPCqSAyMDA5LTIwMjYgU3RlcGhlbiBEZWtlbiwgQW5kcmV3IEtpdGNoZW4sIGFuZCBj
b250cmlidXRvcnM
</string>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<qcView autostartsRendering="YES" translatesAutoresizingMaskIntoConstraints="NO" id="386">
<rect key="frame" x="0.0" y="81" width="256" height="256"/>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="JQ3-ee-HvC" customClass="KCAboutView">
<rect key="frame" x="-3" y="80" width="262" height="286"/>
<constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="256" id="Ava-98-nwW"/>
<constraint firstAttribute="height" constant="256" id="hLn-Dy-hdQ"/>
<constraint firstAttribute="width" constant="256" id="tOE-mZ-U4T"/>
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="256" id="vIp-Xy-p2X"/>
<constraint firstAttribute="width" constant="262" id="5Ao-DA-8wY"/>
<constraint firstAttribute="height" constant="286" id="g5L-tN-WBF"/>
</constraints>
<color key="eraseColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</qcView>
</customView>
</subviews>
<constraints>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="388" secondAttribute="trailing" constant="20" symbolic="YES" id="248-AJ-Ggs"/>
@ -556,16 +551,15 @@ b250cmlidXRvcnM
<constraint firstAttribute="trailing" secondItem="392" secondAttribute="trailing" constant="18" id="AvG-ah-dWf"/>
<constraint firstAttribute="trailing" secondItem="387" secondAttribute="trailing" constant="-2" id="D0c-GO-EmZ"/>
<constraint firstItem="392" firstAttribute="leading" secondItem="385" secondAttribute="leading" constant="20" symbolic="YES" id="E6j-q0-oTt"/>
<constraint firstAttribute="trailing" secondItem="JQ3-ee-HvC" secondAttribute="trailing" constant="-3" id="GEb-2i-anc"/>
<constraint firstAttribute="bottom" secondItem="392" secondAttribute="bottom" constant="20" symbolic="YES" id="HXc-z2-vge"/>
<constraint firstItem="386" firstAttribute="top" secondItem="385" secondAttribute="top" id="Jj4-dI-NKr"/>
<constraint firstItem="387" firstAttribute="top" secondItem="386" secondAttribute="bottom" id="MEY-n5-Y4k"/>
<constraint firstItem="386" firstAttribute="leading" secondItem="385" secondAttribute="leading" id="UQw-nQ-vWY"/>
<constraint firstItem="392" firstAttribute="leading" secondItem="388" secondAttribute="leading" id="YcI-9r-inR"/>
<constraint firstItem="388" firstAttribute="top" secondItem="387" secondAttribute="bottom" constant="8" symbolic="YES" id="myd-3l-Exp"/>
<constraint firstAttribute="trailing" secondItem="386" secondAttribute="trailing" id="rmf-TA-eIa"/>
<constraint firstItem="JQ3-ee-HvC" firstAttribute="top" secondItem="385" secondAttribute="top" constant="-29" id="pSj-pl-vkG"/>
<constraint firstItem="JQ3-ee-HvC" firstAttribute="leading" secondItem="385" secondAttribute="leading" constant="-3" id="uG1-65-Esu"/>
</constraints>
</view>
<point key="canvasLocation" x="-763" y="16"/>
<point key="canvasLocation" x="-763" y="15.5"/>
</window>
<userDefaultsController representsSharedInstance="YES" id="462"/>
</objects>

57
keycastr/KCAboutView.m Normal file
View file

@ -0,0 +1,57 @@
// Copyright (c) 2026 Daniel Costa
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither the name KeyCastr nor the names of its contributors may be used to
// endorse or promote products derived from this software without specific
// prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#import "QuartzCorePrivate.h"
@interface KCAboutView : NSView
@end
@implementation KCAboutView
- (void)awakeFromNib {
[super awakeFromNib];
NSURL *url = [[NSBundle mainBundle] URLForResource:@"About" withExtension:@"ca"];
NSError *outError;
CAPackage *package = [CAPackage packageWithContentsOfURL:url type:kCAPackageTypeCAMLBundle options:nil error:&outError];
if (outError) {
NSLog(@"%@", [outError description]);
}
else {
self.wantsLayer = YES;
self.layer = package.rootLayer;
}
}
@end
@implementation KCAboutView (Window)
- (BOOL)mouseDownCanMoveWindow {
return YES;
}
@end

View file

@ -62,7 +62,6 @@ static NSInteger kKCPrefDisplayIconInDock = 0x02;
@property (nonatomic, assign) IBOutlet NSMenu *statusMenu;
@property (nonatomic, strong) IBOutlet NSWindow *aboutWindow;
@property (nonatomic, strong) IBOutlet QCView *aboutQCView;
@property (nonatomic, assign) IBOutlet NSWindow *preferencesWindow;
@property (nonatomic, assign) IBOutlet KCPrefsWindowController *prefsWindowController;
@property (nonatomic, assign) IBOutlet SRRecorderControl *shortcutRecorder;
@ -78,7 +77,7 @@ static NSInteger kKCPrefDisplayIconInDock = 0x02;
BOOL _isCapturing;
}
@synthesize eventTap, statusItem, statusMenu, aboutWindow, aboutQCView, preferencesWindow, prefsWindowController, shortcutRecorder, dockShortcutItem, statusShortcutItem, mouseEventVisualizer, currentVisualizer;
@synthesize eventTap, statusItem, statusMenu, aboutWindow, preferencesWindow, prefsWindowController, shortcutRecorder, dockShortcutItem, statusShortcutItem, mouseEventVisualizer, currentVisualizer;
@synthesize toggleCastingShortcut = _toggleCastingShortcut;
#pragma mark -
@ -324,20 +323,15 @@ static NSInteger kKCPrefDisplayIconInDock = 0x02;
}
}
}
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"KeyCastrAbout" ofType:@"qtz"];
[aboutQCView loadCompositionFromFile:filePath];
}
-(void) orderFrontKeyCastrAboutPanel:(id)sender
{
aboutWindow.movableByWindowBackground = YES;
[aboutWindow center];
[aboutWindow makeKeyAndOrderFront:sender];
if (!aboutQCView.isRendering) {
[aboutQCView startRendering];
}
[NSApp activateIgnoringOtherApps:YES];
}

View file

@ -38,6 +38,8 @@
6529BAE22F78EAF800379188 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6529BAE02F78EAF800379188 /* MainMenu.xib */; };
6529BAE62F78EBB300379188 /* Svelte.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6529BAE52F78EBB300379188 /* Svelte.xib */; };
6529BAEB2F78EBCA00379188 /* KCDefaultVisualizer.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6529BAEA2F78EBCA00379188 /* KCDefaultVisualizer.xib */; };
6529BBC02F78FF2800379188 /* KCAboutView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6529BBBF2F78FF2800379188 /* KCAboutView.m */; };
6529BBD92F79332800379188 /* About.ca in Resources */ = {isa = PBXBuildFile; fileRef = 6529BBD82F79332800379188 /* About.ca */; };
8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; };
8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
@ -51,7 +53,6 @@
AF5457292C0CDB2E00064C82 /* KCColorValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = AF5457282C0CDB2E00064C82 /* KCColorValueTransformer.m */; };
AF54572A2C0CDB2E00064C82 /* KCColorValueTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = AF5457272C0CDB2E00064C82 /* KCColorValueTransformer.h */; };
AF546FAC272DFFBE00EA6AFD /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF546FAB272DFFBE00EA6AFD /* Carbon.framework */; };
AF6B80EB25AA7ACE00C6FA9D /* KeyCastrAbout.qtz in Resources */ = {isa = PBXBuildFile; fileRef = AF6B80D925AA7ACE00C6FA9D /* KeyCastrAbout.qtz */; };
AF7B1CF32C22376100C8C145 /* NSUserDefaults+Utility.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D3F56CA0F337533001C7272 /* NSUserDefaults+Utility.m */; };
AF7C0341271F694500CE1F8D /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF7C0340271F694500CE1F8D /* QuartzCore.framework */; };
AFAA2BB82A991B39007C7BAA /* KCMouseEventVisualizerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = AFAA2BB72A991B39007C7BAA /* KCMouseEventVisualizerTests.m */; };
@ -364,6 +365,9 @@
6529BAE12F78EAF800379188 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
6529BAE52F78EBB300379188 /* Svelte.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = Svelte.xib; sourceTree = "<group>"; };
6529BAEA2F78EBCA00379188 /* KCDefaultVisualizer.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KCDefaultVisualizer.xib; sourceTree = "<group>"; };
6529BBBF2F78FF2800379188 /* KCAboutView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KCAboutView.m; sourceTree = "<group>"; };
6529BBD72F7931D300379188 /* QuartzCorePrivate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = QuartzCorePrivate.h; sourceTree = "<group>"; };
6529BBD82F79332800379188 /* About.ca */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = About.ca; sourceTree = "<group>"; };
8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
8D1107320486CEB800E47090 /* KeyCastr.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = KeyCastr.app; sourceTree = BUILT_PRODUCTS_DIR; };
AF20BE722C1E21B3008B758E /* KCDefaultVisualizerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KCDefaultVisualizerTests.m; sourceTree = "<group>"; };
@ -371,7 +375,6 @@
AF5457282C0CDB2E00064C82 /* KCColorValueTransformer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KCColorValueTransformer.m; sourceTree = "<group>"; };
AF5457412C0CE25700064C82 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
AF546FAB272DFFBE00EA6AFD /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
AF6B80D925AA7ACE00C6FA9D /* KeyCastrAbout.qtz */ = {isa = PBXFileReference; lastKnownFileType = "video.quartz-composer"; path = KeyCastrAbout.qtz; sourceTree = "<group>"; };
AF6DD3FC2586E03A00EDC9D4 /* ShortcutRecorder.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ShortcutRecorder.xcodeproj; path = ShortcutRecorder/ShortcutRecorder.xcodeproj; sourceTree = "<group>"; };
AF6DD4082586E04C00EDC9D4 /* Sparkle.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Sparkle.xcodeproj; path = Sparkle/Sparkle.xcodeproj; sourceTree = "<group>"; };
AF7C0340271F694500CE1F8D /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
@ -439,6 +442,7 @@
children = (
3D1648930F43DE7A00CA65AD /* Headers */,
3D3F52550F300389001C7272 /* KCAppController.m */,
6529BBBF2F78FF2800379188 /* KCAboutView.m */,
3D3F540B0F30E8E7001C7272 /* KCEventTap.m */,
3D3F52EA0F30CB13001C7272 /* KCPrefsWindowController.m */,
29B97316FDCFA39411CA2CEA /* main.m */,
@ -478,7 +482,7 @@
isa = PBXGroup;
children = (
6529B9FA2F78D64E00379188 /* Assets.xcassets */,
AF6B80D925AA7ACE00C6FA9D /* KeyCastrAbout.qtz */,
6529BBD82F79332800379188 /* About.ca */,
3D3F52A60F30BF1E001C7272 /* KeyCastr.icns */,
3D16405F0F3BCEC900CA65AD /* KeyCastrInactive.icns */,
8D1107310486CEB800E47090 /* Info.plist */,
@ -564,6 +568,7 @@
3D3F540A0F30E8E7001C7272 /* KCEventTap.h */,
3D3F52E90F30CB13001C7272 /* KCPrefsWindowController.h */,
32CA4F630368D1EE00C91783 /* KeyCastr_Prefix.pch */,
6529BBD72F7931D300379188 /* QuartzCorePrivate.h */,
);
name = Headers;
sourceTree = "<group>";
@ -979,12 +984,12 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
AF6B80EB25AA7ACE00C6FA9D /* KeyCastrAbout.qtz in Resources */,
8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */,
3D3F52A70F30BF1E001C7272 /* KeyCastr.icns in Resources */,
3D1640600F3BCEC900CA65AD /* KeyCastrInactive.icns in Resources */,
6529B9FB2F78D64E00379188 /* Assets.xcassets in Resources */,
6529BAE22F78EAF800379188 /* MainMenu.xib in Resources */,
6529BBD92F79332800379188 /* About.ca in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -1035,6 +1040,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
6529BBC02F78FF2800379188 /* KCAboutView.m in Sources */,
8D11072D0486CEB800E47090 /* main.m in Sources */,
3D3F52EB0F30CB13001C7272 /* KCPrefsWindowController.m in Sources */,
3D3F540C0F30E8E7001C7272 /* KCEventTap.m in Sources */,

Binary file not shown.

16
keycastr/KeyCastrLogo.svg Normal file
View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 228 50" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g transform="matrix(1.32891,0,0,1.32891,-39.6861,-52.1182)">
<path d="M29.864,39.683L35.855,39.683L35.855,54.101L34.193,53.521L45.712,39.683L53.211,39.683L41.808,53.444L42.156,49.192L53.443,68.481L46.447,68.481L39.411,56.304L35.855,60.595L35.855,68.481L29.864,68.481L29.864,39.683Z" style="fill:rgb(74,160,224);fill-rule:nonzero;"/>
<path d="M65.387,68.944C63.223,68.944 61.303,68.455 59.628,67.476C57.953,66.496 56.658,65.163 55.743,63.475C54.828,61.787 54.371,59.925 54.371,57.889C54.371,55.828 54.835,53.959 55.762,52.284C56.69,50.609 57.966,49.295 59.589,48.341C61.213,47.388 63.017,46.911 65.001,46.911C67.165,46.911 69.034,47.362 70.606,48.264C72.178,49.166 73.376,50.409 74.201,51.994C75.025,53.579 75.438,55.351 75.438,57.309C75.438,58.263 75.347,59.01 75.167,59.551L59.357,59.551L59.357,55.299L71.881,55.299L69.137,57.309C69.395,56.227 69.382,55.248 69.098,54.372C68.815,53.495 68.312,52.806 67.591,52.304C66.869,51.801 66.006,51.55 65.001,51.55C63.996,51.55 63.126,51.801 62.392,52.304C61.657,52.806 61.116,53.534 60.768,54.488C60.42,55.441 60.285,56.588 60.362,57.928C60.259,59.113 60.401,60.157 60.787,61.059C61.174,61.961 61.773,62.663 62.585,63.166C63.397,63.668 64.357,63.919 65.465,63.919C66.47,63.919 67.346,63.713 68.093,63.301C68.841,62.889 69.42,62.322 69.833,61.6L74.471,63.803C73.827,65.35 72.687,66.593 71.05,67.534C69.414,68.474 67.526,68.944 65.387,68.944Z" style="fill:rgb(74,160,224);fill-rule:nonzero;"/>
<path d="M86.106,66.084L86.415,70.916L77.138,47.375L83.362,47.375L89.508,64.113L87.188,64.113L93.335,47.375L99.558,47.375L88.271,76.212L82.086,76.212L86.106,66.084Z" style="fill:rgb(74,160,224);fill-rule:nonzero;"/>
<path d="M116.218,68.944C113.486,68.944 111.012,68.3 108.796,67.012C106.58,65.723 104.84,63.945 103.578,61.677C102.315,59.41 101.684,56.871 101.684,54.062C101.684,51.253 102.315,48.715 103.578,46.447C104.84,44.18 106.573,42.408 108.777,41.132C110.98,39.857 113.46,39.219 116.218,39.219C118.228,39.219 120.077,39.56 121.765,40.243C123.453,40.926 124.876,41.847 126.036,43.007C127.196,44.167 128.033,45.468 128.549,46.911L123.253,49.462C122.738,48.019 121.861,46.853 120.624,45.964C119.387,45.075 117.919,44.631 116.218,44.631C114.543,44.631 113.054,45.024 111.753,45.81C110.452,46.596 109.447,47.704 108.738,49.134C108.029,50.564 107.675,52.207 107.675,54.062C107.675,55.918 108.029,57.561 108.738,58.991C109.447,60.421 110.452,61.536 111.753,62.334C113.054,63.133 114.543,63.533 116.218,63.533C117.919,63.533 119.387,63.088 120.624,62.199C121.861,61.31 122.738,60.144 123.253,58.701L128.549,61.252C128.033,62.695 127.196,63.997 126.036,65.156C124.876,66.316 123.453,67.237 121.765,67.92C120.077,68.603 118.228,68.944 116.218,68.944Z" style="fill:rgb(74,160,224);fill-rule:nonzero;"/>
<path d="M138.096,68.944C136.575,68.944 135.261,68.7 134.153,68.21C133.045,67.72 132.195,67.018 131.602,66.103C131.009,65.188 130.713,64.1 130.713,62.837C130.713,61.033 131.338,59.558 132.588,58.411C133.837,57.264 135.712,56.485 138.212,56.072L144.667,55.029L144.667,59.281L139.256,60.247C138.405,60.402 137.767,60.672 137.342,61.059C136.917,61.445 136.704,61.974 136.704,62.644C136.704,63.288 136.943,63.79 137.419,64.151C137.896,64.512 138.508,64.692 139.256,64.692C140.183,64.692 141.014,64.486 141.749,64.074C142.483,63.662 143.05,63.101 143.45,62.392C143.849,61.684 144.049,60.904 144.049,60.054L144.049,54.565C144.049,53.766 143.727,53.096 143.082,52.555C142.438,52.014 141.588,51.743 140.531,51.743C139.5,51.743 138.592,52.02 137.806,52.574C137.02,53.128 136.447,53.882 136.086,54.835L131.447,52.632C132.066,50.88 133.219,49.488 134.907,48.457C136.595,47.427 138.56,46.911 140.802,46.911C142.554,46.911 144.12,47.233 145.498,47.878C146.877,48.522 147.946,49.424 148.707,50.583C149.467,51.743 149.847,53.07 149.847,54.565L149.847,68.481L144.435,68.481L144.435,65.079L145.75,64.847C144.822,66.264 143.74,67.302 142.503,67.959C141.266,68.616 139.797,68.944 138.096,68.944Z" style="fill:rgb(74,160,224);fill-rule:nonzero;"/>
<path d="M162.757,68.906C160.438,68.983 158.402,68.506 156.65,67.476C154.898,66.445 153.686,65.015 153.016,63.185L157.191,61.02C157.784,62.154 158.55,63.017 159.491,63.61C160.432,64.203 161.469,64.486 162.603,64.46C163.402,64.435 164.02,64.248 164.458,63.9C164.896,63.552 165.102,63.082 165.077,62.489C165.051,62.025 164.858,61.639 164.497,61.329C164.136,61.02 163.608,60.801 162.912,60.672L159.317,59.977C157.591,59.564 156.238,58.804 155.258,57.696C154.279,56.588 153.764,55.274 153.712,53.753C153.686,52.465 153.989,51.311 154.621,50.293C155.252,49.276 156.16,48.47 157.346,47.878C158.531,47.285 159.91,46.963 161.482,46.911C163.543,46.834 165.367,47.253 166.951,48.167C168.536,49.082 169.689,50.403 170.411,52.13L166.198,54.294C165.837,53.444 165.244,52.767 164.42,52.265C163.595,51.762 162.667,51.524 161.636,51.55C160.889,51.576 160.309,51.749 159.897,52.072C159.485,52.394 159.291,52.825 159.317,53.367C159.343,53.805 159.543,54.172 159.916,54.468C160.29,54.765 160.876,55.016 161.675,55.222L165.038,55.918C166.816,56.382 168.188,57.142 169.155,58.198C170.121,59.255 170.63,60.543 170.682,62.064C170.707,63.378 170.405,64.538 169.773,65.543C169.142,66.548 168.221,67.347 167.009,67.939C165.798,68.532 164.381,68.854 162.757,68.906Z" style="fill:rgb(74,160,224);fill-rule:nonzero;"/>
<path d="M184.172,68.519C181.621,68.519 179.643,68.023 178.239,66.644C176.834,65.266 176.132,63.339 176.132,60.866L176.132,52.4L172.576,52.4L172.576,47.375L172.769,47.375C173.851,47.375 174.682,47.104 175.262,46.563C175.842,46.022 176.132,45.21 176.132,44.128L176.132,41.809L181.93,41.809L181.93,47.375L186.125,47.375L186.125,52.4L181.93,52.4L181.93,60.479C181.93,61.561 182.226,62.367 182.819,62.895C183.412,63.423 184.314,63.687 185.525,63.687L188.363,63.687L188.363,68.519L184.172,68.519Z" style="fill:rgb(74,160,224);fill-rule:nonzero;"/>
<g transform="matrix(1,0,0,1,-1.91598,0.231929)">
<path d="M190.279,47.143L195.691,47.143L195.691,52.207L195.304,51.472C195.742,49.797 196.47,48.618 197.488,47.936C198.506,47.253 199.814,46.911 201.412,46.911L202.649,46.911L202.649,51.936L200.832,51.936C199.389,51.936 198.236,52.374 197.372,53.251C196.509,54.127 196.077,55.338 196.077,56.884L196.077,68.287L190.279,68.287L190.279,47.143Z" style="fill:rgb(255,97,179);fill-rule:nonzero;"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

View file

@ -0,0 +1,17 @@
#import <Quartz/Quartz.h>
#import <QuartzCore/QuartzCore.h>
extern NSString *kCAPackageTypeArchive;
extern NSString *kCAPackageTypeCAMLBundle;
@interface CAPackage : NSObject
+ (id)packageWithData:(NSData *)data type:(NSString *)type options:(id)opts error:(NSError **)outError;
+ (id)packageWithContentsOfURL:(NSURL *)url type:(NSString *)type options:(id)opts error:(NSError **)outError;
- (NSArray <NSString *> *)publishedObjectNames;
@property(readonly, getter=isGeometryFlipped) BOOL geometryFlipped;
@property(readonly) CALayer *rootLayer;
@end