listening for media keyboards, saving text and position show what you're reading

This commit is contained in:
Jeena Paradies 2010-11-18 07:47:04 +01:00
parent 925bd4a7a2
commit 277b97d7a7
9 changed files with 311 additions and 437 deletions

BIN
Icon.icns

Binary file not shown.

View file

@ -27,6 +27,6 @@
<key>NSMainNibFile</key>
<string>MainMenu</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<string>SpeakerApplication</string>
</dict>
</plist>

View file

@ -264,19 +264,20 @@
<array>
<string>29B97314FDCFA39411CA2CEA</string>
<string>080E96DDFE201D6D7F000001</string>
<string>29B97315FDCFA39411CA2CEA</string>
<string>29B97317FDCFA39411CA2CEA</string>
<string>1C37FABC05509CD000000102</string>
</array>
<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
<array>
<array>
<integer>8</integer>
<integer>5</integer>
<integer>3</integer>
<integer>1</integer>
<integer>0</integer>
</array>
</array>
<key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>
<string>{{0, 0}, {186, 544}}</string>
<string>{{0, 0}, {186, 854}}</string>
</dict>
<key>PBXTopSmartGroupGIDs</key>
<array/>
@ -288,14 +289,14 @@
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{0, 0}, {203, 562}}</string>
<string>{{0, 0}, {203, 872}}</string>
<key>GroupTreeTableConfiguration</key>
<array>
<string>MainColumn</string>
<real>186</real>
</array>
<key>RubberWindowFrame</key>
<string>277 575 787 603 0 0 1920 1178 </string>
<string>78 186 1101 913 0 0 1920 1178 </string>
</dict>
<key>Module</key>
<string>PBXSmartGroupTreeModule</string>
@ -306,12 +307,14 @@
<key>Dock</key>
<array>
<dict>
<key>BecomeActive</key>
<true/>
<key>ContentConfiguration</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>1CE0B20306471E060097A5F4</string>
<key>PBXProjectModuleLabel</key>
<string>Speaker-Info.plist</string>
<string>SpeakerAppDelegate.m</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict>
<key>Split0</key>
@ -319,18 +322,22 @@
<key>PBXProjectModuleGUID</key>
<string>1CE0B20406471E060097A5F4</string>
<key>PBXProjectModuleLabel</key>
<string>Speaker-Info.plist</string>
<string>SpeakerAppDelegate.m</string>
<key>_historyCapacity</key>
<integer>0</integer>
<key>bookmark</key>
<string>1FA38CDC124D437D004B8852</string>
<string>1FF67C6B1294AEA400CA07A3</string>
<key>history</key>
<array>
<string>1FA38C5E124D2CD6004B8852</string>
<string>1FA38C98124D341C004B8852</string>
<string>1FA38CD9124D437D004B8852</string>
<string>1FA38CDA124D437D004B8852</string>
<string>1FA38CDB124D437D004B8852</string>
<string>1FF67B481294919400CA07A3</string>
<string>1FF67B491294919400CA07A3</string>
<string>1FF67B4A1294919400CA07A3</string>
<string>1FF67B4B1294919400CA07A3</string>
<string>1FF67BEC1294A39500CA07A3</string>
<string>1FF67C0B1294A9BE00CA07A3</string>
<string>1FF67C0C1294A9BE00CA07A3</string>
</array>
</dict>
<key>SplitCount</key>
@ -342,14 +349,14 @@
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{0, 0}, {579, 557}}</string>
<string>{{0, 0}, {893, 867}}</string>
<key>RubberWindowFrame</key>
<string>277 575 787 603 0 0 1920 1178 </string>
<string>78 186 1101 913 0 0 1920 1178 </string>
</dict>
<key>Module</key>
<string>PBXNavigatorGroup</string>
<key>Proportion</key>
<string>557pt</string>
<string>867pt</string>
</dict>
<dict>
<key>ContentConfiguration</key>
@ -362,9 +369,9 @@
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{0, 562}, {579, 0}}</string>
<string>{{0, 872}, {893, 0}}</string>
<key>RubberWindowFrame</key>
<string>277 575 787 603 0 0 1920 1178 </string>
<string>78 186 1101 913 0 0 1920 1178 </string>
</dict>
<key>Module</key>
<string>XCDetailModule</string>
@ -373,7 +380,7 @@
</dict>
</array>
<key>Proportion</key>
<string>579pt</string>
<string>893pt</string>
</dict>
</array>
<key>Name</key>
@ -388,9 +395,9 @@
</array>
<key>TableOfContents</key>
<array>
<string>1FA38C32124D2426004B8852</string>
<string>1FF67B3012948CE400CA07A3</string>
<string>1CE0B1FE06471DED0097A5F4</string>
<string>1FA38C33124D2426004B8852</string>
<string>1FF67B3112948CE400CA07A3</string>
<string>1CE0B20306471E060097A5F4</string>
<string>1CE0B20506471E060097A5F4</string>
</array>
@ -528,15 +535,15 @@
<integer>5</integer>
<key>WindowOrderList</key>
<array>
<string>1FA38C63124D2CD6004B8852</string>
<string>1FA38C64124D2CD6004B8852</string>
<string>1C78EAAD065D492600B07095</string>
<string>1FF67B551294919400CA07A3</string>
<string>1FF67B561294919400CA07A3</string>
<string>1CD10A99069EF8BA00B06720</string>
<string>1FA38C35124D2426004B8852</string>
<string>1C78EAAD065D492600B07095</string>
<string>/Users/jeena/Projects/Speaker/Speaker.xcodeproj</string>
</array>
<key>WindowString</key>
<string>277 575 787 603 0 0 1920 1178 </string>
<string>78 186 1101 913 0 0 1920 1178 </string>
<key>WindowToolsV3</key>
<array>
<dict>
@ -557,7 +564,7 @@
<key>PBXProjectModuleGUID</key>
<string>1CD0528F0623707200166675</string>
<key>PBXProjectModuleLabel</key>
<string>SpeakerAppDelegate.m</string>
<string></string>
<key>StatusBarVisibility</key>
<true/>
</dict>
@ -574,8 +581,6 @@
<string>218pt</string>
</dict>
<dict>
<key>BecomeActive</key>
<true/>
<key>ContentConfiguration</key>
<dict>
<key>PBXProjectModuleGUID</key>
@ -615,7 +620,7 @@
<key>TableOfContents</key>
<array>
<string>1FA38C35124D2426004B8852</string>
<string>1FA38C36124D2426004B8852</string>
<string>1FF67B3212948CE400CA07A3</string>
<string>1CD0528F0623707200166675</string>
<string>XCMainBuildResultsModuleGUID</string>
</array>
@ -659,8 +664,8 @@
<string>yes</string>
<key>sizes</key>
<array>
<string>{{0, 0}, {316, 185}}</string>
<string>{{316, 0}, {378, 185}}</string>
<string>{{0, 0}, {316, 198}}</string>
<string>{{316, 0}, {378, 198}}</string>
</array>
</dict>
<key>VerticalSplitView</key>
@ -675,8 +680,8 @@
<string>yes</string>
<key>sizes</key>
<array>
<string>{{0, 0}, {694, 185}}</string>
<string>{{0, 185}, {694, 196}}</string>
<string>{{0, 0}, {694, 198}}</string>
<string>{{0, 198}, {694, 183}}</string>
</array>
</dict>
</dict>
@ -709,7 +714,7 @@
<real>148</real>
</array>
<key>Frame</key>
<string>{{316, 0}, {378, 185}}</string>
<string>{{316, 0}, {378, 198}}</string>
<key>RubberWindowFrame</key>
<string>298 733 694 422 0 0 1920 1178 </string>
</dict>
@ -737,13 +742,13 @@
<key>TableOfContents</key>
<array>
<string>1CD10A99069EF8BA00B06720</string>
<string>1FA38C41124D2756004B8852</string>
<string>1FF67B4E1294919400CA07A3</string>
<string>1C162984064C10D400B95A72</string>
<string>1FA38C42124D2756004B8852</string>
<string>1FA38C43124D2756004B8852</string>
<string>1FA38C44124D2756004B8852</string>
<string>1FA38C45124D2756004B8852</string>
<string>1FA38C46124D2756004B8852</string>
<string>1FF67B4F1294919400CA07A3</string>
<string>1FF67B501294919400CA07A3</string>
<string>1FF67B511294919400CA07A3</string>
<string>1FF67B521294919400CA07A3</string>
<string>1FF67B531294919400CA07A3</string>
</array>
<key>ToolbarConfiguration</key>
<string>xcode.toolbar.config.debugV3</string>
@ -884,7 +889,7 @@
<key>Frame</key>
<string>{{0, 0}, {650, 209}}</string>
<key>RubberWindowFrame</key>
<string>191 248 650 250 0 0 1920 1178 </string>
<string>1276 76 650 250 0 0 1920 1178 </string>
</dict>
<key>Module</key>
<string>PBXDebugCLIModule</string>
@ -907,17 +912,17 @@
<key>TableOfContents</key>
<array>
<string>1C78EAAD065D492600B07095</string>
<string>1FA38C47124D2756004B8852</string>
<string>1FF67B541294919400CA07A3</string>
<string>1C78EAAC065D492600B07095</string>
</array>
<key>ToolbarConfiguration</key>
<string>xcode.toolbar.config.consoleV3</string>
<key>WindowString</key>
<string>191 248 650 250 0 0 1920 1178 </string>
<string>1276 76 650 250 0 0 1920 1178 </string>
<key>WindowToolGUID</key>
<string>1C78EAAD065D492600B07095</string>
<key>WindowToolIsVisible</key>
<false/>
<true/>
</dict>
<dict>
<key>Identifier</key>

View file

@ -51,348 +51,10 @@
isa = PBXCodeSenseManager;
indexTemplatePath = "";
};
1FA38C56124D2CA0004B8852 /* XCBuildMessageTextBookmark */ = {
isa = PBXTextBookmark;
comments = "Invalid initializer";
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
fallbackIsa = XCBuildMessageTextBookmark;
rLen = 1;
rLoc = 21;
rType = 1;
};
1FA38C57124D2CA0004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 20";
rLen = 0;
rLoc = 481;
rType = 0;
vrLen = 382;
vrLoc = 139;
};
1FA38C5E124D2CD6004B8852 /* PBXBookmark */ = {
isa = PBXBookmark;
fRef = 1FA38C48124D27C8004B8852 /* play-icon.png */;
};
1FA38C5F124D2CD6004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D80F4B6AC300CF3369 /* SpeakerAppDelegate.h */;
name = "SpeakerAppDelegate.h: 13";
rLen = 10;
rLoc = 255;
rType = 0;
vrLen = 380;
vrLoc = 43;
};
1FA38C60124D2CD6004B8852 /* XCBuildMessageTextBookmark */ = {
isa = PBXTextBookmark;
comments = "Invalid initializer";
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
fallbackIsa = XCBuildMessageTextBookmark;
rLen = 1;
rLoc = 21;
rType = 1;
};
1FA38C61124D2CD6004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 32";
rLen = 0;
rLoc = 1342;
rType = 0;
vrLen = 779;
vrLoc = 77;
};
1FA38C6D124D2D0C004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 20";
rLen = 0;
rLoc = 481;
rType = 0;
vrLen = 779;
vrLoc = 77;
};
1FA38C71124D2D1E004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 20";
rLen = 0;
rLoc = 481;
rType = 0;
vrLen = 779;
vrLoc = 77;
};
1FA38C75124D2D34004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 20";
rLen = 0;
rLoc = 481;
rType = 0;
vrLen = 797;
vrLoc = 77;
};
1FA38C77124D2D5A004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 20";
rLen = 0;
rLoc = 481;
rType = 0;
vrLen = 779;
vrLoc = 77;
};
1FA38C7A124D2DA5004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 20";
rLen = 0;
rLoc = 481;
rType = 0;
vrLen = 760;
vrLoc = 77;
};
1FA38C7F124D2DBB004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 20";
rLen = 0;
rLoc = 481;
rType = 0;
vrLen = 708;
vrLoc = 0;
};
1FA38C84124D2DCA004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 20";
rLen = 0;
rLoc = 481;
rType = 0;
vrLen = 708;
vrLoc = 0;
};
1FA38C88124D2DE9004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 20";
rLen = 0;
rLoc = 481;
rType = 0;
vrLen = 700;
vrLoc = 77;
};
1FA38C8F124D3162004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D80F4B6AC300CF3369 /* SpeakerAppDelegate.h */;
name = "SpeakerAppDelegate.h: 14";
rLen = 0;
rLoc = 324;
rType = 0;
vrLen = 458;
vrLoc = 0;
};
1FA38C90124D3162004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 20";
rLen = 0;
rLoc = 481;
rType = 0;
vrLen = 695;
vrLoc = 77;
};
1FA38C91124D3162004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 32";
rLen = 0;
rLoc = 1342;
rType = 0;
vrLen = 711;
vrLoc = 140;
};
1FA38C95124D31AD004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 34";
rLen = 0;
rLoc = 1339;
rType = 0;
vrLen = 706;
vrLoc = 208;
};
1FA38C98124D341C004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D80F4B6AC300CF3369 /* SpeakerAppDelegate.h */;
name = "SpeakerAppDelegate.h: 15";
rLen = 0;
rLoc = 324;
rType = 0;
vrLen = 477;
vrLoc = 0;
};
1FA38C99124D341C004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 24";
rLen = 0;
rLoc = 571;
rType = 0;
vrLen = 701;
vrLoc = 208;
};
1FA38C9A124D341C004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 39";
rLen = 0;
rLoc = 1339;
rType = 0;
vrLen = 620;
vrLoc = 409;
};
1FA38C9B124D34F4004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 41";
rLen = 0;
rLoc = 1312;
rType = 0;
vrLen = 655;
vrLoc = 409;
};
1FA38C9E124D3516004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 46";
rLen = 0;
rLoc = 1334;
rType = 0;
vrLen = 662;
vrLoc = 449;
};
1FA38CA8124D3666004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 30";
rLen = 0;
rLoc = 818;
rType = 0;
vrLen = 961;
vrLoc = 208;
};
1FA38CAB124D3695004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 28";
rLen = 0;
rLoc = 625;
rType = 0;
vrLen = 1023;
vrLoc = 207;
};
1FA38CAF124D36B6004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 33";
rLen = 0;
rLoc = 823;
rType = 0;
vrLen = 1079;
vrLoc = 207;
};
1FA38CB3124D3718004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 18";
rLen = 0;
rLoc = 441;
rType = 0;
vrLen = 1108;
vrLoc = 207;
};
1FA38CB5124D3736004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 33";
rLen = 0;
rLoc = 823;
rType = 0;
vrLen = 959;
vrLoc = 207;
};
1FA38CB8124D3793004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 32";
rLen = 0;
rLoc = 818;
rType = 0;
vrLen = 1018;
vrLoc = 207;
};
1FA38CBB124D37B2004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 32";
rLen = 0;
rLoc = 762;
rType = 0;
vrLen = 1029;
vrLoc = 207;
};
1FA38CBE124D3887004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 32";
rLen = 0;
rLoc = 762;
rType = 0;
vrLen = 1029;
vrLoc = 207;
};
1FA38CBF124D3897004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 32";
rLen = 0;
rLoc = 762;
rType = 0;
vrLen = 1004;
vrLoc = 207;
};
1FA38CC1124D38C2004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 33";
rLen = 0;
rLoc = 818;
rType = 0;
vrLen = 1020;
vrLoc = 207;
};
1FA38CD8124D437C004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 23";
rLen = 0;
rLoc = 482;
rType = 0;
vrLen = 360;
vrLoc = 208;
};
1FA38CD9124D437D004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 30";
rLen = 0;
rLoc = 662;
rType = 0;
vrLen = 1061;
vrLoc = 207;
};
1FA38CDA124D437D004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 089C165DFE840E0CC02AAC07 /* English */;
@ -403,38 +65,125 @@
vrLen = 45;
vrLoc = 0;
};
1FA38CDB124D437D004B8852 /* PBXBookmark */ = {
isa = PBXBookmark;
fRef = 8D1107310486CEB800E47090 /* Speaker-Info.plist */;
1FF67B3C12948FDE00CA07A3 /* SpeakerApplication.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {832, 812}}";
sepNavSelRange = "{267, 0}";
sepNavVisRange = "{0, 274}";
};
};
1FA38CDC124D437D004B8852 /* PlistBookmark */ = {
1FF67B3D12948FDE00CA07A3 /* SpeakerApplication.m */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {832, 915}}";
sepNavSelRange = "{1382, 8}";
sepNavVisRange = "{43, 1388}";
};
};
1FF67B481294919400CA07A3 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3F00F4B6AF500CF3369 /* Speaker_Prefix.pch */;
name = "Speaker_Prefix.pch: 1";
rLen = 0;
rLoc = 0;
rType = 0;
vrLen = 145;
vrLoc = 0;
};
1FF67B491294919400CA07A3 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 29B97316FDCFA39411CA2CEA /* main.m */;
name = "main.m: 1";
rLen = 0;
rLoc = 0;
rType = 0;
vrLen = 247;
vrLoc = 0;
};
1FF67B4A1294919400CA07A3 /* PlistBookmark */ = {
isa = PlistBookmark;
fRef = 8D1107310486CEB800E47090 /* Speaker-Info.plist */;
fallbackIsa = PBXBookmark;
isK = 0;
kPath = (
CFBundleIdentifier,
NSPrincipalClass,
);
name = "/Users/jeena/Projects/Speaker/Speaker-Info.plist";
rLen = 0;
rLoc = 9223372036854775807;
};
1FF67B4B1294919400CA07A3 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 1FF67B3C12948FDE00CA07A3 /* SpeakerApplication.h */;
name = "SpeakerApplication.h: 16";
rLen = 0;
rLoc = 267;
rType = 0;
vrLen = 274;
vrLoc = 0;
};
1FF67BEC1294A39500CA07A3 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 1FF67B3D12948FDE00CA07A3 /* SpeakerApplication.m */;
name = "SpeakerApplication.m: 55";
rLen = 8;
rLoc = 1382;
rType = 0;
vrLen = 1388;
vrLoc = 43;
};
1FF67C0B1294A9BE00CA07A3 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D80F4B6AC300CF3369 /* SpeakerAppDelegate.h */;
name = "SpeakerAppDelegate.h: 16";
rLen = 0;
rLoc = 374;
rType = 0;
vrLen = 594;
vrLoc = 0;
};
1FF67C0C1294A9BE00CA07A3 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 58";
rLen = 13;
rLoc = 1816;
rType = 0;
vrLen = 1672;
vrLoc = 1375;
};
1FF67C6B1294AEA400CA07A3 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
name = "SpeakerAppDelegate.m: 98";
rLen = 0;
rLoc = 2838;
rType = 0;
vrLen = 1528;
vrLoc = 1736;
};
256AC3D80F4B6AC300CF3369 /* SpeakerAppDelegate.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {519, 403}}";
sepNavSelRange = "{324, 0}";
sepNavVisRange = "{0, 477}";
sepNavIntBoundsRect = "{{0, 0}, {832, 812}}";
sepNavSelRange = "{374, 0}";
sepNavVisRange = "{0, 594}";
};
};
256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {509, 930}}";
sepNavSelRange = "{482, 0}";
sepNavVisRange = "{208, 360}";
sepNavIntBoundsRect = "{{0, 0}, {1160, 1710}}";
sepNavSelRange = "{2838, 0}";
sepNavVisRange = "{1736, 1528}";
};
};
256AC3F00F4B6AF500CF3369 /* Speaker_Prefix.pch */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {832, 835}}";
sepNavSelRange = "{0, 0}";
sepNavVisRange = "{0, 145}";
};
};
29B97313FDCFA39411CA2CEA /* Project object */ = {
activeBuildConfigurationName = Debug;
activeBuildConfigurationName = Release;
activeExecutable = 1FA38C25124D2411004B8852 /* Speaker */;
activeTarget = 8D1107260486CEB800E47090 /* Speaker */;
addToTargets = (
@ -450,9 +199,9 @@
PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
PBXFileTableDataSourceColumnWidthsKey = (
20,
340,
654,
20,
48.16259765625,
48,
43,
43,
20,
@ -467,53 +216,32 @@
PBXFileDataSource_Target_ColumnID,
);
};
PBXPerProjectTemplateStateSaveDate = 307045393;
PBXWorkspaceStateSaveDate = 307045393;
PBXPerProjectTemplateStateSaveDate = 311725270;
PBXWorkspaceStateSaveDate = 311725270;
};
perUserProjectItems = {
1FA38C56124D2CA0004B8852 /* XCBuildMessageTextBookmark */ = 1FA38C56124D2CA0004B8852 /* XCBuildMessageTextBookmark */;
1FA38C57124D2CA0004B8852 /* PBXTextBookmark */ = 1FA38C57124D2CA0004B8852 /* PBXTextBookmark */;
1FA38C5E124D2CD6004B8852 /* PBXBookmark */ = 1FA38C5E124D2CD6004B8852 /* PBXBookmark */;
1FA38C5F124D2CD6004B8852 /* PBXTextBookmark */ = 1FA38C5F124D2CD6004B8852 /* PBXTextBookmark */;
1FA38C60124D2CD6004B8852 /* XCBuildMessageTextBookmark */ = 1FA38C60124D2CD6004B8852 /* XCBuildMessageTextBookmark */;
1FA38C61124D2CD6004B8852 /* PBXTextBookmark */ = 1FA38C61124D2CD6004B8852 /* PBXTextBookmark */;
1FA38C6D124D2D0C004B8852 /* PBXTextBookmark */ = 1FA38C6D124D2D0C004B8852 /* PBXTextBookmark */;
1FA38C71124D2D1E004B8852 /* PBXTextBookmark */ = 1FA38C71124D2D1E004B8852 /* PBXTextBookmark */;
1FA38C75124D2D34004B8852 /* PBXTextBookmark */ = 1FA38C75124D2D34004B8852 /* PBXTextBookmark */;
1FA38C77124D2D5A004B8852 /* PBXTextBookmark */ = 1FA38C77124D2D5A004B8852 /* PBXTextBookmark */;
1FA38C7A124D2DA5004B8852 /* PBXTextBookmark */ = 1FA38C7A124D2DA5004B8852 /* PBXTextBookmark */;
1FA38C7F124D2DBB004B8852 /* PBXTextBookmark */ = 1FA38C7F124D2DBB004B8852 /* PBXTextBookmark */;
1FA38C84124D2DCA004B8852 /* PBXTextBookmark */ = 1FA38C84124D2DCA004B8852 /* PBXTextBookmark */;
1FA38C88124D2DE9004B8852 /* PBXTextBookmark */ = 1FA38C88124D2DE9004B8852 /* PBXTextBookmark */;
1FA38C8F124D3162004B8852 /* PBXTextBookmark */ = 1FA38C8F124D3162004B8852 /* PBXTextBookmark */;
1FA38C90124D3162004B8852 /* PBXTextBookmark */ = 1FA38C90124D3162004B8852 /* PBXTextBookmark */;
1FA38C91124D3162004B8852 /* PBXTextBookmark */ = 1FA38C91124D3162004B8852 /* PBXTextBookmark */;
1FA38C95124D31AD004B8852 /* PBXTextBookmark */ = 1FA38C95124D31AD004B8852 /* PBXTextBookmark */;
1FA38C98124D341C004B8852 /* PBXTextBookmark */ = 1FA38C98124D341C004B8852 /* PBXTextBookmark */;
1FA38C99124D341C004B8852 /* PBXTextBookmark */ = 1FA38C99124D341C004B8852 /* PBXTextBookmark */;
1FA38C9A124D341C004B8852 /* PBXTextBookmark */ = 1FA38C9A124D341C004B8852 /* PBXTextBookmark */;
1FA38C9B124D34F4004B8852 /* PBXTextBookmark */ = 1FA38C9B124D34F4004B8852 /* PBXTextBookmark */;
1FA38C9E124D3516004B8852 /* PBXTextBookmark */ = 1FA38C9E124D3516004B8852 /* PBXTextBookmark */;
1FA38CA8124D3666004B8852 /* PBXTextBookmark */ = 1FA38CA8124D3666004B8852 /* PBXTextBookmark */;
1FA38CAB124D3695004B8852 /* PBXTextBookmark */ = 1FA38CAB124D3695004B8852 /* PBXTextBookmark */;
1FA38CAF124D36B6004B8852 /* PBXTextBookmark */ = 1FA38CAF124D36B6004B8852 /* PBXTextBookmark */;
1FA38CB3124D3718004B8852 /* PBXTextBookmark */ = 1FA38CB3124D3718004B8852 /* PBXTextBookmark */;
1FA38CB5124D3736004B8852 /* PBXTextBookmark */ = 1FA38CB5124D3736004B8852 /* PBXTextBookmark */;
1FA38CB8124D3793004B8852 /* PBXTextBookmark */ = 1FA38CB8124D3793004B8852 /* PBXTextBookmark */;
1FA38CBB124D37B2004B8852 /* PBXTextBookmark */ = 1FA38CBB124D37B2004B8852 /* PBXTextBookmark */;
1FA38CBE124D3887004B8852 /* PBXTextBookmark */ = 1FA38CBE124D3887004B8852 /* PBXTextBookmark */;
1FA38CBF124D3897004B8852 /* PBXTextBookmark */ = 1FA38CBF124D3897004B8852 /* PBXTextBookmark */;
1FA38CC1124D38C2004B8852 /* PBXTextBookmark */ = 1FA38CC1124D38C2004B8852 /* PBXTextBookmark */;
1FA38CD8124D437C004B8852 /* PBXTextBookmark */ = 1FA38CD8124D437C004B8852 /* PBXTextBookmark */;
1FA38CD9124D437D004B8852 /* PBXTextBookmark */ = 1FA38CD9124D437D004B8852 /* PBXTextBookmark */;
1FA38CDA124D437D004B8852 /* PBXTextBookmark */ = 1FA38CDA124D437D004B8852 /* PBXTextBookmark */;
1FA38CDB124D437D004B8852 /* PBXBookmark */ = 1FA38CDB124D437D004B8852 /* PBXBookmark */;
1FA38CDC124D437D004B8852 /* PlistBookmark */ = 1FA38CDC124D437D004B8852 /* PlistBookmark */;
1FF67B481294919400CA07A3 /* PBXTextBookmark */ = 1FF67B481294919400CA07A3 /* PBXTextBookmark */;
1FF67B491294919400CA07A3 /* PBXTextBookmark */ = 1FF67B491294919400CA07A3 /* PBXTextBookmark */;
1FF67B4A1294919400CA07A3 /* PlistBookmark */ = 1FF67B4A1294919400CA07A3 /* PlistBookmark */;
1FF67B4B1294919400CA07A3 /* PBXTextBookmark */ = 1FF67B4B1294919400CA07A3 /* PBXTextBookmark */;
1FF67BEC1294A39500CA07A3 /* PBXTextBookmark */ = 1FF67BEC1294A39500CA07A3 /* PBXTextBookmark */;
1FF67C0B1294A9BE00CA07A3 /* PBXTextBookmark */ = 1FF67C0B1294A9BE00CA07A3 /* PBXTextBookmark */;
1FF67C0C1294A9BE00CA07A3 /* PBXTextBookmark */ = 1FF67C0C1294A9BE00CA07A3 /* PBXTextBookmark */;
1FF67C6B1294AEA400CA07A3 /* PBXTextBookmark */ = 1FF67C6B1294AEA400CA07A3 /* PBXTextBookmark */;
};
sourceControlManager = 1FA38C37124D2426004B8852 /* Source Control */;
userBuildSettings = {
};
};
29B97316FDCFA39411CA2CEA /* main.m */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {832, 835}}";
sepNavSelRange = "{0, 0}";
sepNavVisRange = "{0, 247}";
};
};
8D1107260486CEB800E47090 /* Speaker */ = {
activeExec = 0;
executables = (

View file

@ -10,6 +10,7 @@
1DDD58160DA1D0A300B32029 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1DDD58140DA1D0A300B32029 /* MainMenu.xib */; };
1FA38C49124D27C8004B8852 /* play-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FA38C48124D27C8004B8852 /* play-icon.png */; };
1FA38CD3124D4349004B8852 /* Icon.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1FA38CD2124D4349004B8852 /* Icon.icns */; };
1FF67B3E12948FDE00CA07A3 /* SpeakerApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FF67B3D12948FDE00CA07A3 /* SpeakerApplication.m */; };
256AC3DA0F4B6AC300CF3369 /* SpeakerAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */; };
8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; };
8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
@ -23,6 +24,8 @@
1DDD58150DA1D0A300B32029 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = "<group>"; };
1FA38C48124D27C8004B8852 /* play-icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "play-icon.png"; sourceTree = "<group>"; };
1FA38CD2124D4349004B8852 /* Icon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = Icon.icns; sourceTree = "<group>"; };
1FF67B3C12948FDE00CA07A3 /* SpeakerApplication.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpeakerApplication.h; sourceTree = "<group>"; };
1FF67B3D12948FDE00CA07A3 /* SpeakerApplication.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SpeakerApplication.m; sourceTree = "<group>"; };
256AC3D80F4B6AC300CF3369 /* SpeakerAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpeakerAppDelegate.h; sourceTree = "<group>"; };
256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SpeakerAppDelegate.m; sourceTree = "<group>"; };
256AC3F00F4B6AF500CF3369 /* Speaker_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Speaker_Prefix.pch; sourceTree = "<group>"; };
@ -50,6 +53,8 @@
children = (
256AC3D80F4B6AC300CF3369 /* SpeakerAppDelegate.h */,
256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */,
1FF67B3C12948FDE00CA07A3 /* SpeakerApplication.h */,
1FF67B3D12948FDE00CA07A3 /* SpeakerApplication.m */,
);
name = Classes;
sourceTree = "<group>";
@ -188,6 +193,7 @@
files = (
8D11072D0486CEB800E47090 /* main.m in Sources */,
256AC3DA0F4B6AC300CF3369 /* SpeakerAppDelegate.m in Sources */,
1FF67B3E12948FDE00CA07A3 /* SpeakerApplication.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

View file

@ -8,16 +8,19 @@
#import <Cocoa/Cocoa.h>
@interface SpeakerAppDelegate : NSObject <NSApplicationDelegate> {
@interface SpeakerAppDelegate : NSObject <NSApplicationDelegate, NSSpeechSynthesizerDelegate> {
NSWindow *window;
NSTextView *textView;
NSSpeechSynthesizer *synth;
NSRange oldRange;
BOOL isNewLocation;
}
@property (assign) IBOutlet NSWindow *window;
@property (retain, nonatomic) IBOutlet NSTextView *textView;
-(IBAction)speakAction:(id)sender;
-(IBAction)seekForward:(id)sender;
-(IBAction)seekBack:(id)sender;
@end

View file

@ -15,16 +15,39 @@
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
// Insert code here to initialize your application
synth = [[NSSpeechSynthesizer alloc] init];
synth.delegate = self;
oldRange = NSMakeRange(-1, -1);
isNewLocation = YES;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *string = [defaults objectForKey:@"text"];
if (string) {
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:string];
[[textView textStorage] setAttributedString:attributedString];
[attributedString release];
NSRange aRange = NSMakeRange([defaults integerForKey:@"startLocation"], 0);
[textView setSelectedRange:aRange];
[textView scrollRangeToVisible:aRange];
}
}
- (void)applicationWillTerminate:(NSNotification *)aNotification {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setInteger:[textView selectedRange].location forKey:@"startLocation"];
[defaults setObject:[[textView textStorage] string] forKey:@"text"];
[defaults synchronize];
}
-(IBAction)speakAction:(id)sender {
if ([synth isSpeaking]) {
[synth pauseSpeakingAtBoundary:NSSpeechWordBoundary];
[textView setEditable:YES];
} else {
[textView setEditable:NO];
NSRange range = [textView selectedRange];
if (range.location == [[[textView textStorage] string] length]) {
@ -33,7 +56,8 @@
[textView scrollRangeToVisible:NSMakeRange(0,0)];
}
if (range.length != oldRange.length || range.location != oldRange.location) {
if (range.length != oldRange.length || range.location != oldRange.location || isNewLocation) {
isNewLocation = NO;
NSString *wholeText = [[textView textStorage] string];
NSString *text = nil;
@ -56,4 +80,34 @@
}
-(IBAction)seekForward:(id)sender {
// not working yet
/*
[self speakAction:self];
NSRange selected = [textView selectedRange];
NSString *wholeText = [[textView textStorage] string];
NSRange position = [wholeText rangeOfString:@". " options:NSLiteralSearch range:NSMakeRange(selected.location + 1, [wholeText length] - selected.location - 1)];
[textView setSelectedRange:NSMakeRange(position.location + 2, 0)];
isNewLocation = YES;
NSLog(@"sp %i", [synth isSpeaking]);
[self speakAction:self];
*/
}
-(IBAction)seekBack:(id)sender {
}
- (void)speechSynthesizer:(NSSpeechSynthesizer *)sender willSpeakWord:(NSRange)wordToSpeak ofString:(NSString *)text {
NSRange range = NSMakeRange(oldRange.location + wordToSpeak.location, wordToSpeak.length);
[textView scrollRangeToVisible:range];
[textView setSelectedRange:NSMakeRange(range.location, 0)];
[textView showFindIndicatorForRange:range];
}
- (void)dealloc {
[synth release];
[super dealloc];
}
@end

18
SpeakerApplication.h Normal file
View file

@ -0,0 +1,18 @@
//
// SpeakerApplication.h
// Speaker
//
// Created by Jeena on 17.11.10.
// Copyright 2010 __MyCompanyName__. All rights reserved.
//
#import <Cocoa/Cocoa.h>
@interface SpeakerApplication : NSApplication {
}
- (void)mediaKeyEvent:(int)key state:(BOOL)state;
@end

60
SpeakerApplication.m Normal file
View file

@ -0,0 +1,60 @@
//
// SpeakerApplication.m
// Speaker
//
// Created by Jeena on 17.11.10.
// Copyright 2010 __MyCompanyName__. All rights reserved.
//
// from http://www.rogueamoeba.com/utm/2007/09/29/
#import "SpeakerApplication.h"
#import <IOKit/hidsystem/ev_keymap.h>
#import "SpeakerAppDelegate.h"
@implementation SpeakerApplication
- (void)sendEvent:(NSEvent *)event
{
// Catch media key events
if ([event type] == NSSystemDefined && [event subtype] == 8)
{
int keyCode = (([event data1] & 0xFFFF0000) >> 16);
int keyFlags = ([event data1] & 0x0000FFFF);
int keyState = (((keyFlags & 0xFF00) >> 8)) == 0xA;
// Process the media key event and return
[self mediaKeyEvent:keyCode state:keyState];
return;
}
// Continue on to super
[super sendEvent:event];
}
- (void)mediaKeyEvent:(int)key state:(BOOL)state
{
switch (key)
{
// Play pressed
case NX_KEYTYPE_PLAY:
if (state == NO)
[(SpeakerAppDelegate *)[self delegate] speakAction:self];
break;
// Rewind
case NX_KEYTYPE_FAST:
if (state == YES)
[(SpeakerAppDelegate *)[self delegate] seekForward:self];
break;
// Previous
case NX_KEYTYPE_REWIND:
if (state == YES)
[(SpeakerAppDelegate *)[self delegate] seekBack:self];
break;
}
}
@end