├── example_project ├── Project.xcconfig ├── src │ ├── main.cpp │ ├── testApp.h │ └── testApp.cpp ├── .vcproj.user ├── openFrameworks-Info.plist ├── .sln ├── ofxTerminalExample.xcodeproj │ ├── WHG.pbxuser │ ├── project.pbxproj │ └── WHG.mode1v3 └── .vcproj ├── readme.md └── ofxTerminal.h /example_project/Project.xcconfig: -------------------------------------------------------------------------------- 1 | //THE PATH TO THE ROOT OF OUR OF PATH RELATIVE TO THIS PROJECT. 2 | //THIS NEEDS TO BE DEFINED BEFORE CoreOF.xcconfig IS INCLUDED 3 | OF_PATH = ../../.. 4 | 5 | //THIS HAS ALL THE HEADER AND LIBS FOR OF CORE 6 | #include "../../../libs/openFrameworksCompiled/project/osx/CoreOF.xcconfig" 7 | 8 | OTHER_LDFLAGS = $(OF_CORE_LIBS) 9 | HEADER_SEARCH_PATHS = $(OF_CORE_HEADERS) 10 | -------------------------------------------------------------------------------- /example_project/src/main.cpp: -------------------------------------------------------------------------------- 1 | #include "ofMain.h" 2 | #include "testApp.h" 3 | #include "ofAppGlutWindow.h" 4 | 5 | //======================================================================== 6 | int main( ){ 7 | 8 | ofAppGlutWindow window; 9 | ofSetupOpenGL(&window, 640, 480, OF_WINDOW); // <-------- setup the GL context 10 | 11 | // this kicks off the running of my app 12 | // can be OF_WINDOW or OF_FULLSCREEN 13 | // pass in width and height too: 14 | ofRunApp( new testApp()); 15 | 16 | } 17 | -------------------------------------------------------------------------------- /example_project/.vcproj.user: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | 15 | 16 | 19 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /example_project/openFrameworks-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | com.yourcompany.openFrameworks 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundlePackageType 14 | APPL 15 | CFBundleSignature 16 | ???? 17 | CFBundleVersion 18 | 1.0 19 | 20 | 21 | -------------------------------------------------------------------------------- /example_project/src/testApp.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "ofMain.h" 4 | #include "ofxTerminal.h" 5 | 6 | // usage: 7 | // you can call: 8 | // - amplitude 9 | // - frequency 10 | // - speed 11 | // - length 12 | // 13 | // with some kind of value 14 | 15 | 16 | class testApp : public ofBaseApp { 17 | 18 | public: 19 | void setup(); 20 | void update(); 21 | void draw(); 22 | 23 | void keyPressed(int key); 24 | 25 | ofxTerminal terminal; 26 | 27 | string setFrequency(vector args); 28 | string setAmplitude(vector args); 29 | string setLength(vector args); 30 | string setSpeed(vector args); 31 | 32 | string blink(vector args); 33 | string setPS1(vector args); 34 | 35 | float counter, speed; 36 | int length; 37 | float frequency, amplitude; 38 | 39 | }; 40 | -------------------------------------------------------------------------------- /example_project/.sln: -------------------------------------------------------------------------------- 1 | Microsoft Visual Studio Solution File, Format Version 10.00 2 | # Visual C++ Express 2008 3 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "emptyExample", "emptyExample.vcproj", "{7FD42DF7-442E-479A-BA76-D0022F99702A}" 4 | ProjectSection(ProjectDependencies) = postProject 5 | {5837595D-ACA9-485C-8E76-729040CE4B0B} = {5837595D-ACA9-485C-8E76-729040CE4B0B} 6 | EndProjectSection 7 | EndProject 8 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "openframeworksLib", "..\..\..\libs\openFrameworksCompiled\project\vs2008\openframeworksLib.vcproj", "{5837595D-ACA9-485C-8E76-729040CE4B0B}" 9 | EndProject 10 | Global 11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 12 | Debug|Win32 = Debug|Win32 13 | Release|Win32 = Release|Win32 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {7FD42DF7-442E-479A-BA76-D0022F99702A}.Debug|Win32.ActiveCfg = Debug|Win32 17 | {7FD42DF7-442E-479A-BA76-D0022F99702A}.Debug|Win32.Build.0 = Debug|Win32 18 | {7FD42DF7-442E-479A-BA76-D0022F99702A}.Release|Win32.ActiveCfg = Release|Win32 19 | {7FD42DF7-442E-479A-BA76-D0022F99702A}.Release|Win32.Build.0 = Release|Win32 20 | {5837595D-ACA9-485C-8E76-729040CE4B0B}.Debug|Win32.ActiveCfg = Debug|Win32 21 | {5837595D-ACA9-485C-8E76-729040CE4B0B}.Debug|Win32.Build.0 = Debug|Win32 22 | {5837595D-ACA9-485C-8E76-729040CE4B0B}.Release|Win32.ActiveCfg = Release|Win32 23 | {5837595D-ACA9-485C-8E76-729040CE4B0B}.Release|Win32.Build.0 = Release|Win32 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | EndGlobal 29 | -------------------------------------------------------------------------------- /example_project/src/testApp.cpp: -------------------------------------------------------------------------------- 1 | #include "testApp.h" 2 | 3 | void testApp::setup(){ 4 | 5 | ofSetFrameRate(30); 6 | counter = 0; 7 | frequency = 1; 8 | length = 360; 9 | amplitude = 50; 10 | speed = 0.1; 11 | 12 | terminal = ofxTerminal(this); 13 | 14 | terminal.addFunction("frequency", &testApp::setFrequency); 15 | terminal.addFunction("amplitude", &testApp::setAmplitude); 16 | terminal.addFunction("length", &testApp::setLength); 17 | terminal.addFunction("speed", &testApp::setSpeed); 18 | terminal.addFunction("blink", &testApp::blink); 19 | terminal.addFunction("ps1", &testApp::setPS1); 20 | 21 | } 22 | 23 | void testApp::update(){ 24 | 25 | } 26 | 27 | void testApp::draw(){ 28 | ofBackground(255, 255, 255); 29 | 30 | //we have to draw the terminal 31 | terminal.draw(0, 0); 32 | 33 | ofFill(); 34 | ofSetColor(0, 0, 0); 35 | 36 | 37 | //we are going to draw a sine wave, 38 | //the user can change the frequency, amplitude and length 39 | ofPushMatrix(); 40 | 41 | //translate to wave in in the center 42 | ofTranslate(ofGetWidth()*0.5-(length*0.5), ofGetHeight()*0.5); 43 | 44 | for (int i = 0; i < length; i++) { 45 | float y = sin((i+counter)/TWO_PI * frequency) * amplitude; 46 | ofCircle(i, y, 2); 47 | } 48 | counter+= speed; 49 | 50 | ofPopMatrix(); 51 | 52 | } 53 | 54 | void testApp::keyPressed(int key){ 55 | 56 | //pass the key to the terminal 57 | terminal.keyPressed(key); 58 | } 59 | 60 | string testApp::setFrequency(vector args) { 61 | 62 | if (args.size() < 1) { 63 | return "usage: frequency f"; 64 | } 65 | 66 | frequency = ofToFloat(args[0]); 67 | return ""; 68 | } 69 | 70 | // here we have an example where the user can reveive feedback based on the input 71 | string testApp::setAmplitude(vector args) { 72 | 73 | //ofToFloat returns 0 if something other than a number is passed to it, 74 | //so alert the user... 75 | if (!ofToFloat(args[0])) { 76 | return args[0] + " is not a number"; 77 | } 78 | 79 | amplitude = ofToFloat(args[0]); 80 | 81 | return ""; 82 | } 83 | 84 | string testApp::setLength(vector args) { 85 | 86 | length = ofToInt(args[0]); 87 | return ""; 88 | } 89 | 90 | string testApp::setSpeed(vector args) { 91 | 92 | speed = ofToFloat(args[0]); 93 | return ""; 94 | } 95 | 96 | string testApp::blink(vector args) { 97 | 98 | if (args.size() != 1) { 99 | return "usage: blink on|off"; 100 | } 101 | 102 | if (args[0] == "on") { 103 | terminal.setBlinkingCursor(true); 104 | } 105 | else if (args[0] == "off") { 106 | terminal.setBlinkingCursor(false); 107 | } 108 | else { 109 | return "don't understand " + args[0]; 110 | } 111 | 112 | return ""; 113 | } 114 | 115 | string testApp::setPS1(vector args) { 116 | 117 | terminal.setPS1(args[0]); 118 | return ""; 119 | } -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | ofxTerminal 2 | =========== 3 | 4 | ofxTerminal allows you to control your openFrameworks apps using a command line. Function pointers are passed to ofxTerminal, which binds them to specified words. ofxTerminal supports things like autocompletion via tab (works almost identically to sh/bash), command history via up and down keys and other thing you expect from a terminal such as a blinking cursor. 5 | 6 | Usage 7 | ----- 8 | 9 | Check out the example project if you are impatient, otherwise read on. 10 | 11 | To instantiate ofxTerminal you need a class and a pointer to an object of that class that the functions you want to use belongs to. For example, if the functions you want to call reside in testApp, you might want to do something like this in setup(): 12 | 13 | `terminal = ofxTerminal(this);` 14 | 15 | Functions can then be added to the object using the `addFunction()` member function, which takes a string as the first argument, which is what you want your function to be called and a reference to the callback for the second argument. So if you have a function called hello and you want to call it when you type hello, you would write something like: 16 | 17 | `terminal.addFunction("hello", &testApp::hello);` 18 | 19 | ofxTerminal can only handle one type of function signature, that looks like this: 20 | 21 | `string aFunction(vector args)` 22 | 23 | The argument passed to the function is a STL vector of the arguments passed to the function you specified, so for example, if in your app you write: 24 | 25 | `hello my name is dave` 26 | 27 | The vector passed to hello() will be ["my", "name", "is", "dave"]. Obviously, you can do what you want with these; convert to int, etc. 28 | 29 | Every function you write should return a string, this is used for errors/comments and the returned string will be printed under the current line, if you want the prompt to proceed as normal return an empty string. 30 | 31 | If you want to see the terminal you will need to call the `draw() member function at some point. Also, for ofxTerminal to receive the key commands, pass oF's keyPressed() argument to the `keyPressed()` member function of ofxTerminal. 32 | 33 | Reading files 34 | ------------- 35 | 36 | The one built in function in ofxTerminal is *read*. This reads files for you and executes the contents. You can supply read with a absolute file name (i.e. starting with a /) or you can set a custom directory for it to search yourself, this is done via `setPath()`, something like: 37 | 38 | `terminal.setPath("/Users/some_user/some_directory");` 39 | 40 | Controls 41 | -------- 42 | 43 | You can use a few control-key combos, it's the usual stuff like: 44 | 45 | * **C-e** : Move point to the end of the line. 46 | * **C-a** : Move point to the beginning of the line 47 | * **C-u** : clear current line 48 | * **C-k** : clear from point to end of the line 49 | * **C-h** : hide the whole thing 50 | * **C-c** : clear the screen (move everything up, like `clear` in UNIX) 51 | * **C-v** : clears screen and all settings, including command history 52 | 53 | 54 | Custom Settings 55 | --------------- 56 | 57 | Along with setPath(), there are a few other things you can do to customise ofxTerminal, these include: 58 | 59 | `setPS1(string s)` : This set the prompt, by default it's '? '. You will probably want to have a space at the end of your string so wrap your text in single quotes, double quotes won't work. If you want to use the single quote character as part of your prompt then you can escape it with \. 60 | 61 | `setBlinkingCursor(bool b, float freq)` : freq is an optional argument and the default it 0.5Hz 62 | 63 | `ofxTerminal(T *co, string fontpath, int fontsize)` : Along with the pointer, the constructor can has two optional arguments, these are the font path and the font size, by default these are: "/System/Library/Fonts/Menlo.ttc" and 11 respectively. If you change these you will probably want to use a monospaced font. 64 | 65 | `setFontColor(int r, int g, int b)` & `setPromptColor(int r, int g, int b)` : these should be fairly self explanatory. 66 | 67 | If you do decide to change the default text, you might need to use: 68 | 69 | `setCharacterOffset(float v)` or `setSpaceOffset(float v)` to fix the alignment of things. 70 | 71 | Sometimes you might have various words that you use a lot and would like to autocomplete them. To do this, you need to add the word into ofxTerminal's dictionary: 72 | 73 | `terminal.addToDictionary("straight");` 74 | 75 | Compatibility 76 | ------------- 77 | 78 | I have only tested this on a Mac, 10.6 & 10.7. 79 | 80 | Changelog 81 | --------- 82 | 83 | 21/3/12 84 | 85 | * revamped autocomplete so multiple possibilities get printed out if tab is pressed twice 86 | * added C-v & C-k 87 | * changed keys to OF_KEY constants for better compatibility 88 | 89 | 90 | 91 | email any questions to wgallia@gmail.com -------------------------------------------------------------------------------- /example_project/ofxTerminalExample.xcodeproj/WHG.pbxuser: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | E4B69B4C0A3A1720003C02F2 /* Project object */ = { 4 | activeBuildConfigurationName = Debug; 5 | activeExecutable = EE56152D14B9EE4F000DE70A /* ofxTerminalExample */; 6 | activeTarget = E4B69B5A0A3A1756003C02F2 /* ofxTerminalExample */; 7 | addToTargets = ( 8 | E4B69B5A0A3A1756003C02F2 /* ofxTerminalExample */, 9 | ); 10 | codeSenseManager = EE56155714B9EE79000DE70A /* Code sense */; 11 | executables = ( 12 | EE56152D14B9EE4F000DE70A /* ofxTerminalExample */, 13 | ); 14 | perUserDictionary = { 15 | PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { 16 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; 17 | PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; 18 | PBXFileTableDataSourceColumnWidthsKey = ( 19 | 20, 20 | 500, 21 | 20, 22 | 48, 23 | 43, 24 | 43, 25 | 20, 26 | ); 27 | PBXFileTableDataSourceColumnsKey = ( 28 | PBXFileDataSource_FiletypeID, 29 | PBXFileDataSource_Filename_ColumnID, 30 | PBXFileDataSource_Built_ColumnID, 31 | PBXFileDataSource_ObjectSize_ColumnID, 32 | PBXFileDataSource_Errors_ColumnID, 33 | PBXFileDataSource_Warnings_ColumnID, 34 | PBXFileDataSource_Target_ColumnID, 35 | ); 36 | }; 37 | PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = { 38 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; 39 | PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; 40 | PBXFileTableDataSourceColumnWidthsKey = ( 41 | 20, 42 | 460, 43 | 60, 44 | 20, 45 | 48.16259765625, 46 | 43, 47 | 43, 48 | ); 49 | PBXFileTableDataSourceColumnsKey = ( 50 | PBXFileDataSource_FiletypeID, 51 | PBXFileDataSource_Filename_ColumnID, 52 | PBXTargetDataSource_PrimaryAttribute, 53 | PBXFileDataSource_Built_ColumnID, 54 | PBXFileDataSource_ObjectSize_ColumnID, 55 | PBXFileDataSource_Errors_ColumnID, 56 | PBXFileDataSource_Warnings_ColumnID, 57 | ); 58 | }; 59 | PBXPerProjectTemplateStateSaveDate = 354026411; 60 | PBXWorkspaceStateSaveDate = 354026411; 61 | }; 62 | perUserProjectItems = { 63 | EE5615B714B9EFE6000DE70A = EE5615B714B9EFE6000DE70A /* PBXTextBookmark */; 64 | EE5615B814B9EFE6000DE70A = EE5615B814B9EFE6000DE70A /* PBXTextBookmark */; 65 | EE5615BA14B9EFE6000DE70A = EE5615BA14B9EFE6000DE70A /* PBXTextBookmark */; 66 | EE56166114BA6BC1000DE70A = EE56166114BA6BC1000DE70A /* PBXTextBookmark */; 67 | }; 68 | sourceControlManager = EE56155614B9EE79000DE70A /* Source Control */; 69 | userBuildSettings = { 70 | }; 71 | }; 72 | E4B69B5A0A3A1756003C02F2 /* ofxTerminalExample */ = { 73 | activeExec = 0; 74 | executables = ( 75 | EE56152D14B9EE4F000DE70A /* ofxTerminalExample */, 76 | ); 77 | }; 78 | E4B69E1D0A3A1BDC003C02F2 /* main.cpp */ = { 79 | uiCtxt = { 80 | sepNavIntBoundsRect = "{{0, 0}, {678, 468}}"; 81 | sepNavSelRange = "{0, 0}"; 82 | sepNavVisRange = "{0, 414}"; 83 | }; 84 | }; 85 | E4B69E1E0A3A1BDC003C02F2 /* testApp.cpp */ = { 86 | uiCtxt = { 87 | sepNavIntBoundsRect = "{{0, 0}, {678, 464}}"; 88 | sepNavSelRange = "{230, 0}"; 89 | sepNavVisRange = "{0, 237}"; 90 | }; 91 | }; 92 | E4B69E1F0A3A1BDC003C02F2 /* testApp.h */ = { 93 | uiCtxt = { 94 | sepNavIntBoundsRect = "{{0, 0}, {678, 520}}"; 95 | sepNavSelRange = "{229, 0}"; 96 | sepNavVisRange = "{0, 602}"; 97 | }; 98 | }; 99 | EE56152D14B9EE4F000DE70A /* ofxTerminalExample */ = { 100 | isa = PBXExecutable; 101 | activeArgIndices = ( 102 | ); 103 | argumentStrings = ( 104 | ); 105 | autoAttachOnCrash = 1; 106 | breakpointsEnabled = 0; 107 | configStateDict = { 108 | }; 109 | customDataFormattersEnabled = 1; 110 | dataTipCustomDataFormattersEnabled = 1; 111 | dataTipShowTypeColumn = 1; 112 | dataTipSortType = 0; 113 | debuggerPlugin = GDBDebugging; 114 | disassemblyDisplayState = 0; 115 | dylibVariantSuffix = ""; 116 | enableDebugStr = 1; 117 | environmentEntries = ( 118 | ); 119 | executableSystemSymbolLevel = 0; 120 | executableUserSymbolLevel = 0; 121 | libgmallocEnabled = 0; 122 | name = ofxTerminalExample; 123 | savedGlobals = { 124 | }; 125 | showTypeColumn = 0; 126 | sourceDirectories = ( 127 | ); 128 | }; 129 | EE56155614B9EE79000DE70A /* Source Control */ = { 130 | isa = PBXSourceControlManager; 131 | fallbackIsa = XCSourceControlManager; 132 | isSCMEnabled = 0; 133 | scmConfiguration = { 134 | repositoryNamesForRoots = { 135 | "" = ""; 136 | }; 137 | }; 138 | }; 139 | EE56155714B9EE79000DE70A /* Code sense */ = { 140 | isa = PBXCodeSenseManager; 141 | indexTemplatePath = ""; 142 | }; 143 | EE5615B714B9EFE6000DE70A /* PBXTextBookmark */ = { 144 | isa = PBXTextBookmark; 145 | fRef = E4B69E1D0A3A1BDC003C02F2 /* main.cpp */; 146 | name = "main.cpp: 1"; 147 | rLen = 0; 148 | rLoc = 0; 149 | rType = 0; 150 | vrLen = 414; 151 | vrLoc = 0; 152 | }; 153 | EE5615B814B9EFE6000DE70A /* PBXTextBookmark */ = { 154 | isa = PBXTextBookmark; 155 | fRef = E4B69E1E0A3A1BDC003C02F2 /* testApp.cpp */; 156 | name = "testApp.cpp: 22"; 157 | rLen = 0; 158 | rLoc = 230; 159 | rType = 0; 160 | vrLen = 237; 161 | vrLoc = 0; 162 | }; 163 | EE5615BA14B9EFE6000DE70A /* PBXTextBookmark */ = { 164 | isa = PBXTextBookmark; 165 | fRef = E4B69E1F0A3A1BDC003C02F2 /* testApp.h */; 166 | name = "testApp.h: 17"; 167 | rLen = 0; 168 | rLoc = 229; 169 | rType = 0; 170 | vrLen = 245; 171 | vrLoc = 0; 172 | }; 173 | EE56166114BA6BC1000DE70A /* PBXTextBookmark */ = { 174 | isa = PBXTextBookmark; 175 | fRef = E4B69E1F0A3A1BDC003C02F2 /* testApp.h */; 176 | name = "testApp.h: 19"; 177 | rLen = 0; 178 | rLoc = 229; 179 | rType = 0; 180 | vrLen = 602; 181 | vrLoc = 0; 182 | }; 183 | } 184 | -------------------------------------------------------------------------------- /example_project/.vcproj: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 15 | 16 | 17 | 18 | 19 | 26 | 29 | 32 | 35 | 38 | 41 | 54 | 57 | 60 | 63 | 78 | 81 | 84 | 87 | 90 | 93 | 96 | 101 | 102 | 110 | 113 | 116 | 119 | 122 | 125 | 136 | 139 | 142 | 145 | 160 | 163 | 166 | 169 | 172 | 175 | 178 | 183 | 184 | 185 | 186 | 187 | 188 | 193 | 196 | 197 | 200 | 201 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | -------------------------------------------------------------------------------- /ofxTerminal.h: -------------------------------------------------------------------------------- 1 | /* 2 | * ofxTerminal.h 3 | * 4 | * Copyright 2011 Will Gallia, wgallia.com 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy of 7 | * this software and associated documentation files (the "Software"), to deal in 8 | * the Software without restriction, including without limitation the rights to 9 | * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 10 | * of the Software, and to permit persons to whom the Software is furnished to do 11 | * so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | * 24 | */ 25 | 26 | 27 | #pragma once 28 | 29 | #include "ofMain.h" 30 | 31 | #include 32 | 33 | template 34 | class Function { 35 | public: 36 | Function(string n, string(T::*f)(vector args)) { 37 | name = n; 38 | func = f; 39 | }; 40 | 41 | string name; 42 | string(T::*func)(vector args); 43 | }; 44 | 45 | //this holds all the prompt data... 46 | typedef struct { 47 | int x, y, yOffset; 48 | int index; 49 | string PS1; 50 | unsigned char color[3]; 51 | } Prompt; 52 | 53 | 54 | template 55 | class ofxTerminal { 56 | 57 | private: 58 | Prompt prompt; 59 | 60 | ofTrueTypeFont font; 61 | int lineHeight; 62 | float characterWidth, spaceWidth; 63 | int screenYPos, prevCommand; 64 | string tempCommand; 65 | int cl; //current line 66 | bool blinkCursor, blinker; 67 | float blinkFrequency; 68 | int blinkCounter; 69 | unsigned char fontcolor[3]; 70 | bool ishidden; 71 | float characterOffset, spaceOffset; 72 | bool autocompleteflag; 73 | 74 | vector lines, results; 75 | vector dictionary; 76 | 77 | vector< Function > functions; 78 | 79 | string PATH; //this is where read finds files when the path doesn't begin with a '/' 80 | bool readFile(string path); 81 | 82 | int stringWidth(string s); 83 | 84 | void process(string command); 85 | void explode(string command, char sep, vector &tokens); 86 | string execute(string command); 87 | 88 | void println(string line); 89 | void incrementPrompt(); 90 | 91 | T *callingObj; 92 | 93 | public: 94 | ofxTerminal(); 95 | ofxTerminal(T *co, string fontpath="/System/Library/Fonts/Menlo.ttc", int fontsize=11); 96 | void setup(); 97 | 98 | void draw(int xOffset=0, int yOffset=-2); 99 | void keyPressed(int key); 100 | 101 | void addFunction(string name, string(T::*func)(vector args)); 102 | void addToDictionary(string word); 103 | 104 | void setPS1(string s); 105 | void setPath(string s); 106 | void setCharacterOffset(float v); 107 | void setSpaceOffset(float v); 108 | void setBlinkingCursor(bool b, float freq=0.5); 109 | void setFontColor(int r, int g, int b); 110 | void setPromptColor(int r, int g, int b); 111 | }; 112 | 113 | 114 | //////////////////////////////////////// 115 | /////////// IMPLEMENTATION ///////////// 116 | //////////////////////////////////////// 117 | 118 | template 119 | ofxTerminal::ofxTerminal(T *co, string fontpath, int fontsize) { 120 | 121 | callingObj = co; 122 | 123 | setup(); 124 | 125 | font.loadFont(fontpath, fontsize); 126 | //make this an int so we get rid of little errors 127 | lineHeight = (int) font.getLineHeight(); 128 | //this is a bit silly... but seems to work 129 | spaceWidth = font.stringWidth("a") + spaceOffset; 130 | characterWidth = font.stringWidth("a") + characterOffset; 131 | 132 | //add the only built in function 133 | addToDictionary("read"); 134 | setPS1("? "); //this is the default prompt 135 | 136 | ofEnableAlphaBlending(); 137 | } 138 | 139 | //empty default constructor, for when ofxTerminal is located on the stack 140 | //this should never be explicitly called. 141 | template ofxTerminal::ofxTerminal() {} 142 | 143 | template 144 | void ofxTerminal::setup() { 145 | 146 | lines.clear(); 147 | results.clear(); 148 | cl = 0; 149 | prompt.yOffset = 2; 150 | prompt.x = 0; 151 | prompt.y = prompt.yOffset; 152 | prompt.index = 0; 153 | lines.push_back(""); 154 | results.push_back(""); 155 | screenYPos = 0; 156 | prevCommand = 0; 157 | PATH = "/Users/WHG/Desktop/"; //hardcode your own path here... 158 | spaceOffset = 0; 159 | characterOffset = 2; 160 | blinkCursor = false; 161 | blinker = true; 162 | blinkFrequency = 0.5; 163 | blinkCounter = 0; 164 | fontcolor[0] = fontcolor[1] = fontcolor[2] = 10; 165 | prompt.color[0] = prompt.color[1] = prompt.color[2] = 50; 166 | ishidden = false; 167 | autocompleteflag = false; 168 | } 169 | 170 | 171 | template 172 | void ofxTerminal::draw(int xOffset, int yOffset) { 173 | 174 | if (ishidden) return; 175 | 176 | //check to see if we need to move everything up to fit the new line 177 | if (prompt.y+lineHeight > ofGetHeight() - screenYPos) { 178 | screenYPos-= lineHeight; 179 | } 180 | 181 | ofFill(); 182 | ofPushMatrix(); 183 | ofPushStyle(); 184 | ofTranslate(xOffset, screenYPos + yOffset); 185 | 186 | //this is where we draw all commands previous and present. 187 | //not future... yet 188 | int j = 0; 189 | for (int i = 0; i < results.size(); i++) { 190 | if (results[i] == "") { 191 | ofSetColor(fontcolor[0], fontcolor[1], fontcolor[2]); 192 | font.drawString(prompt.PS1 + lines[j++], 0, lineHeight*(i+1)); 193 | } 194 | //draw results/comments 195 | else { 196 | ofSetColor(fontcolor[0]*8, fontcolor[1]*8, fontcolor[2]*8); 197 | font.drawString(results[i], 0, lineHeight*(i+1)); 198 | } 199 | } 200 | 201 | //this is where we draw the prompt 202 | ofSetColor(prompt.color[0], prompt.color[1], prompt.color[2], blinker ? 100 : 0); //make the prompt a transparent grey 203 | ofRect(stringWidth(prompt.PS1) + prompt.x, prompt.y, characterWidth, lineHeight); 204 | 205 | ofPopStyle(); 206 | ofPopMatrix(); 207 | 208 | //we can't use a modulus for this because we might miss the timing because of 209 | //the framerate, so it's a little bit awkward, but i can't see how else to do it. 210 | //...unless the blink is defined in terms of frames... but i prefers seconds 211 | if (blinkCursor && ofGetElapsedTimeMillis() > blinkFrequency*1000+blinkCounter) { 212 | blinker = !blinker; 213 | blinkCounter+= blinkFrequency*1000; 214 | } 215 | } 216 | 217 | 218 | /* - - - KEY ACTIONS - - - - - - - - - 219 | 220 | this is where all the key presses are interpreted 221 | i am trying to copy the bash shell, so at the moment, 222 | we are implementing: 223 | 224 | - up and down for previous commands 225 | - left and right to move along the line 226 | - tab to autocomplete 227 | - backspace to delete characters 228 | - enter to process command 229 | 230 | - - - - - - - - - - - - - - - - - - - */ 231 | 232 | template 233 | void ofxTerminal::keyPressed(int key) { 234 | 235 | string::iterator it = lines[cl].begin(); 236 | int x; 237 | 238 | switch (key) { 239 | 240 | //space 241 | case ' ': 242 | lines[cl].insert(it+prompt.index, (char) key); 243 | prompt.x+= (spaceWidth); 244 | prompt.index++; 245 | break; 246 | 247 | // backspace 248 | case OF_KEY_BACKSPACE: 249 | if (prompt.x > 0) { 250 | if (lines[cl].at(prompt.index-1) == ' ') prompt.x -= spaceWidth; 251 | else prompt.x -= characterWidth; 252 | lines[cl].erase(it+prompt.index-1); 253 | prompt.index--; 254 | } 255 | break; 256 | 257 | // left arrow 258 | case OF_KEY_LEFT: 259 | if (prompt.x > 0) { // don't go too far... 260 | if (lines[cl].at(prompt.index-1) == ' ') prompt.x -= spaceWidth; 261 | else prompt.x -= characterWidth; 262 | prompt.index--; 263 | } 264 | break; 265 | 266 | // right arrow 267 | case OF_KEY_RIGHT: 268 | if (prompt.index < lines[cl].length()) { // can't go further than line 269 | if (lines[cl].at(prompt.index) == ' ') prompt.x += spaceWidth; 270 | else prompt.x += characterWidth; 271 | prompt.index++; 272 | } 273 | break; 274 | 275 | // up arrow - previous command 276 | case OF_KEY_UP: 277 | //save the current command 278 | if (prevCommand == 0) { 279 | tempCommand = lines[cl]; 280 | } 281 | //fetch previous commands 282 | if (prevCommand < cl) { 283 | prevCommand++; 284 | lines[cl] = lines[cl-prevCommand]; 285 | prompt.x = stringWidth(lines[cl]); //move the prompt 286 | prompt.index = lines[cl].length(); 287 | } 288 | break; 289 | 290 | // down arrow 291 | case OF_KEY_DOWN : 292 | if (prevCommand > 0) { 293 | prevCommand--; 294 | lines[cl] = lines[cl-prevCommand]; 295 | } 296 | //get the saved command 297 | if (prevCommand == 0) { 298 | lines[cl] = tempCommand; 299 | } 300 | prompt.x = stringWidth(lines[cl]); //move the prompt 301 | prompt.index = lines[cl].length(); 302 | break; 303 | 304 | // esc, do nothing 305 | case OF_KEY_ESC: 306 | break; 307 | 308 | //tab : autocomplete 309 | //note: there is no OF_KEY for tab so, can't guarantee 310 | //any kind of cross platform compatibility 311 | case 9: 312 | { 313 | //auto complete the word we are currently on, 314 | //from the cursor to the preceeding space 315 | string todo = lines[cl].substr(0, prompt.index); 316 | int lastspace = todo.find_last_of(' ') + 1; 317 | if (lastspace < 1) lastspace = 0; 318 | todo = todo.substr(lastspace); 319 | 320 | vector foundwords; 321 | 322 | //before any uber computer scientist has a go at me, 323 | //i don't think we are going to have a large dictionary so 324 | //i think a linear search is good enough... 325 | for (int i = 0; i < dictionary.size(); i++) { 326 | bool show = true; 327 | for (int j = 0; j < todo.length() && j < dictionary[i].length(); j++) { 328 | if (dictionary[i].at(j) != todo.at(j)) { 329 | show = false; 330 | break; 331 | } 332 | } 333 | if (show) { 334 | foundwords.push_back(dictionary[i]); 335 | } 336 | } 337 | 338 | //if there is only one possibility then change the current line 339 | if (foundwords.size() == 1) { 340 | //change the command 341 | string t = lines[cl].substr(0, lastspace) + foundwords[0]; 342 | 343 | //only add a space at the end if we are at the end of the line 344 | if (lines[cl].length() == prompt.index) { 345 | t+= " "; 346 | } 347 | 348 | //set the new line 349 | lines[cl] = t + lines[cl].substr(prompt.index); 350 | 351 | prompt.x = stringWidth(t);//move the prompt 352 | prompt.index = t.length(); 353 | } 354 | 355 | //if we have multiple possible commands print them out in a list 356 | //and then restore the prompt. 357 | else if (foundwords.size() > 1) { 358 | if (!autocompleteflag) { 359 | autocompleteflag = true; 360 | return; 361 | } 362 | stringstream ss; 363 | for (int i = 0; i < foundwords.size(); i++) { 364 | ss << foundwords[i] << " "; 365 | } 366 | 367 | //save the current line 368 | string templine = lines[cl]; 369 | int tempindex = prompt.index; 370 | int tempx = prompt.x; 371 | 372 | //print the commands 373 | println(ss.str()); 374 | 375 | //restore the line 376 | lines[cl] = templine; 377 | prompt.index = tempindex; 378 | prompt.x = tempx; 379 | 380 | autocompleteflag = false; 381 | } 382 | 383 | 384 | } 385 | break; 386 | 387 | //enter, do things with current line 388 | case OF_KEY_RETURN: 389 | //process the command 390 | process(lines[cl]); 391 | 392 | break; 393 | 394 | //- - - control commands - - - 395 | //no guarantee of cross platform compatibility, 396 | //though I am pretty sure these are standard to ASCII 397 | 398 | //control-c, clear the screen 399 | case 3: 400 | //clear screen... but in reality just move things up... similar to clear in UNIX 401 | screenYPos-= (screenYPos + prompt.y - prompt.yOffset); 402 | break; 403 | 404 | case 22: 405 | setup(); 406 | break; 407 | 408 | //control-a, beginning of line 409 | case 1: 410 | prompt.x = 0; 411 | prompt.index = 0; 412 | break; 413 | 414 | //control-e, end of line 415 | case 5: 416 | prompt.index = lines[cl].length(); 417 | prompt.x = stringWidth(lines[cl]) ; 418 | break; 419 | 420 | //control-u, clear the current line 421 | case 21: 422 | prompt.x = 0; 423 | prompt.index = 0; 424 | lines[cl] = ""; 425 | break; 426 | 427 | //control-k, clear from point to end of line 428 | case 11: 429 | lines[cl] = lines[cl].substr(0, prompt.index); 430 | break; 431 | 432 | //control-h, toggle ishidden, which hides everything 433 | case 8: 434 | ishidden = !ishidden; 435 | break; 436 | 437 | 438 | //all other keys... 439 | //hopefully ofTrueTypeFont can draw them... 440 | default: 441 | if (key < 31) return; 442 | 443 | lines[cl].insert(it+prompt.index, (char) key); 444 | prompt.x+= characterWidth; 445 | prompt.index++; 446 | break; 447 | 448 | } 449 | } 450 | 451 | 452 | //my own version of ofTTF stringWidth()... 453 | //seems to be bit more accurate as i've hardcoded the values (spaceWidth & characterWidth) 454 | template 455 | int ofxTerminal::stringWidth(string s) { 456 | int x = 0; 457 | for (int i = 0; i < s.length(); i++) { 458 | if (s.at(i) == ' ') x+= spaceWidth; 459 | else x+= characterWidth; 460 | } 461 | return x; 462 | } 463 | 464 | /* - - - PROCESS - - - - - - - - */ 465 | 466 | template 467 | void ofxTerminal::process(string command) { 468 | 469 | //don't try and process an empty line 470 | if (command != "") { 471 | 472 | //execute the command... 473 | //if your debugger brought you here, you need to return a string from your function 474 | string comment = execute(command); 475 | 476 | println(comment); 477 | return; 478 | } 479 | 480 | incrementPrompt(); 481 | 482 | 483 | } 484 | 485 | 486 | //this is done this way so we can optionally use the returned comment... 487 | template 488 | string ofxTerminal::execute(string command) { 489 | 490 | //split the line up into tokens 491 | vector tokens; 492 | explode(command, ' ', tokens); 493 | 494 | //if we have an empty line return nothing.. ie empty line 495 | //this is just a safety precaution, i don't think execute is ever passed an empty string 496 | if (!tokens.size()) { 497 | return ""; 498 | } 499 | 500 | //the one built in function we have is read. 501 | //this executes the contents of a specified file. 502 | else if (tokens[0] == "read" ) { 503 | if (tokens.size() != 2) { 504 | return "usage: read filename"; 505 | } 506 | if (readFile(tokens[1])) { 507 | return ""; 508 | } 509 | else { 510 | return tokens[1] + ": can't read file"; 511 | } 512 | } 513 | 514 | //now try and find a valid command... 515 | //... obviously there are much faster ways of doing this but 516 | //i don't think a user will have many functions, so i think it's ok 517 | for (int i = 0; i < functions.size(); i++) { 518 | if (tokens[0] == functions[i].name) { 519 | tokens.erase(tokens.begin()); 520 | return ((callingObj)->*(functions[i].func))(tokens); 521 | } 522 | } 523 | 524 | //if we get to this point, we haven't found the command... 525 | return tokens[0] + ": command not found"; 526 | } 527 | 528 | /* - - - PROMPT STUFF - - - */ 529 | //prints a results line if the argument is not and empty string 530 | //otherwise it just increments the prompt, ie incrementPrompt() 531 | 532 | template 533 | void ofxTerminal::println(string line) { 534 | //show the comment if there is one and increment prompt.y 535 | if (line != "") { 536 | results.push_back(line); 537 | //need an extra lineHeight added to prompt.y 538 | prompt.y+= lineHeight; 539 | 540 | } 541 | incrementPrompt(); 542 | } 543 | 544 | 545 | template 546 | void ofxTerminal::incrementPrompt() { 547 | //prepare for next line... 548 | lines.push_back(""); 549 | results.push_back(""); 550 | 551 | //now do the housework 552 | cl++; 553 | prompt.index = 0; 554 | prompt.x = 0; 555 | prompt.y+= lineHeight; 556 | prevCommand = 0; 557 | } 558 | 559 | 560 | /* - - - ADDING STUFF - - - */ 561 | 562 | template 563 | void ofxTerminal::addToDictionary(string word) { 564 | dictionary.push_back(word); 565 | } 566 | 567 | template 568 | void ofxTerminal::addFunction(string name, string (T::*func)(vector args)) { 569 | functions.push_back(Function(name, func)); 570 | addToDictionary(name); 571 | } 572 | 573 | //this is a helper method, inspired by PHP's explode 574 | //note: realised after doing this that there are methods in c++ to do this for you... stupid me... 575 | 576 | //it takes a string and splits the separate words into tokens, 577 | //extra white space is removed in the process 578 | //string are preserved if inside single quotes, ie ' 579 | //if you want to use a ' you have to escape it like \' 580 | 581 | template 582 | void ofxTerminal::explode(string command, char sep, vector &tokens) { 583 | tokens.clear(); 584 | bool inquotes = false; 585 | bool escape = false; 586 | 587 | string t = ""; 588 | for (int i = 0; i < command.length(); i++) { 589 | if (command[i] == '\\') { 590 | escape = true; 591 | continue; 592 | } 593 | if (command[i] != sep || inquotes) { 594 | if (command[i] == '\'' && !escape) { 595 | inquotes = !inquotes; 596 | } 597 | else { 598 | t+= command[i]; 599 | } 600 | } 601 | else if (!inquotes) { 602 | //don't add things starting with a space.. 603 | //or an empty string... 604 | if (t[0] != ' ' && t != "") { 605 | tokens.push_back(t); 606 | t = ""; 607 | } 608 | } 609 | escape = false; 610 | } 611 | 612 | // add the final one... 613 | // but don't add it if it's a space... or nothing 614 | if (t != " " && t != "") { 615 | tokens.push_back(t); 616 | } 617 | } 618 | 619 | /* - - - FILE HANDLING - - - */ 620 | 621 | //returns true if file could be read and executed, false otherwise 622 | template 623 | bool ofxTerminal::readFile(string path) { 624 | 625 | //set up stream 626 | ifstream file; 627 | 628 | if (path.at(0) == '/') { 629 | file.open(path.c_str()); 630 | } 631 | 632 | //if the path is not absolute look in specified directory 633 | else { 634 | string p = PATH + path; 635 | file.open(p.c_str()); 636 | } 637 | 638 | //check to see something is open 639 | if (file.is_open()) { 640 | 641 | while (file.good()) { 642 | string line; 643 | getline(file, line); 644 | 645 | //we execute here instead of process so we don't blank lines printed 646 | execute(line); 647 | } 648 | 649 | //and close... 650 | file.close(); 651 | 652 | return true; 653 | } 654 | 655 | return false; 656 | } 657 | 658 | /* - - - USER SETTINGS/SETTERS - - - */ 659 | 660 | template 661 | void ofxTerminal::setPS1(string s) { 662 | prompt.PS1 = s; 663 | } 664 | 665 | template 666 | void ofxTerminal::setPath(string s) { 667 | PATH = s; 668 | } 669 | 670 | template 671 | void ofxTerminal::setCharacterOffset(float v) { 672 | characterOffset = v; 673 | } 674 | 675 | template 676 | void ofxTerminal::setSpaceOffset(float v) { 677 | spaceOffset = v; 678 | } 679 | 680 | //default freq = 0.5 681 | template 682 | void ofxTerminal::setBlinkingCursor(bool b, float freq) { 683 | blinkCursor = b; 684 | blinkFrequency = freq; 685 | blinker = true; //setting this to true is quite important 686 | blinkCounter = ofGetElapsedTimeMillis(); 687 | } 688 | 689 | template 690 | void ofxTerminal::setFontColor(int r, int g, int b) { 691 | fontcolor[0] = r; 692 | fontcolor[1] = g; 693 | fontcolor[2] = b; 694 | } 695 | 696 | template 697 | void ofxTerminal::setPromptColor(int r, int g, int b) { 698 | prompt.color[0] = r; 699 | prompt.color[1] = g; 700 | prompt.color[2] = b; 701 | } 702 | -------------------------------------------------------------------------------- /example_project/ofxTerminalExample.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 42; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | BBAB23CB13894F3D00AA2426 /* GLUT.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = BBAB23BE13894E4700AA2426 /* GLUT.framework */; }; 11 | E4328149138ABC9F0047C5CB /* openFrameworksDebug.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E4328148138ABC890047C5CB /* openFrameworksDebug.a */; }; 12 | E45BE97B0E8CC7DD009D7055 /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9710E8CC7DD009D7055 /* AGL.framework */; }; 13 | E45BE97C0E8CC7DD009D7055 /* ApplicationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9720E8CC7DD009D7055 /* ApplicationServices.framework */; }; 14 | E45BE97D0E8CC7DD009D7055 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9730E8CC7DD009D7055 /* AudioToolbox.framework */; }; 15 | E45BE97E0E8CC7DD009D7055 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9740E8CC7DD009D7055 /* Carbon.framework */; }; 16 | E45BE97F0E8CC7DD009D7055 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9750E8CC7DD009D7055 /* CoreAudio.framework */; }; 17 | E45BE9800E8CC7DD009D7055 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9760E8CC7DD009D7055 /* CoreFoundation.framework */; }; 18 | E45BE9810E8CC7DD009D7055 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9770E8CC7DD009D7055 /* CoreServices.framework */; }; 19 | E45BE9830E8CC7DD009D7055 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9790E8CC7DD009D7055 /* OpenGL.framework */; }; 20 | E45BE9840E8CC7DD009D7055 /* QuickTime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE97A0E8CC7DD009D7055 /* QuickTime.framework */; }; 21 | E4B69E200A3A1BDC003C02F2 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4B69E1D0A3A1BDC003C02F2 /* main.cpp */; }; 22 | E4B69E210A3A1BDC003C02F2 /* testApp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4B69E1E0A3A1BDC003C02F2 /* testApp.cpp */; }; 23 | E4C2424710CC5A17004149E2 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2424410CC5A17004149E2 /* AppKit.framework */; }; 24 | E4C2424810CC5A17004149E2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2424510CC5A17004149E2 /* Cocoa.framework */; }; 25 | E4C2424910CC5A17004149E2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2424610CC5A17004149E2 /* IOKit.framework */; }; 26 | E4EB6799138ADC1D00A09F29 /* GLUT.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BBAB23BE13894E4700AA2426 /* GLUT.framework */; }; 27 | /* End PBXBuildFile section */ 28 | 29 | /* Begin PBXContainerItemProxy section */ 30 | E4328147138ABC890047C5CB /* PBXContainerItemProxy */ = { 31 | isa = PBXContainerItemProxy; 32 | containerPortal = E4328143138ABC890047C5CB /* openFrameworksLib.xcodeproj */; 33 | proxyType = 2; 34 | remoteGlobalIDString = E4B27C1510CBEB8E00536013; 35 | remoteInfo = openFrameworks; 36 | }; 37 | E4EEB9AB138B136A00A80321 /* PBXContainerItemProxy */ = { 38 | isa = PBXContainerItemProxy; 39 | containerPortal = E4328143138ABC890047C5CB /* openFrameworksLib.xcodeproj */; 40 | proxyType = 1; 41 | remoteGlobalIDString = E4B27C1410CBEB8E00536013; 42 | remoteInfo = openFrameworks; 43 | }; 44 | /* End PBXContainerItemProxy section */ 45 | 46 | /* Begin PBXCopyFilesBuildPhase section */ 47 | E4C2427710CC5ABF004149E2 /* CopyFiles */ = { 48 | isa = PBXCopyFilesBuildPhase; 49 | buildActionMask = 2147483647; 50 | dstPath = ""; 51 | dstSubfolderSpec = 10; 52 | files = ( 53 | BBAB23CB13894F3D00AA2426 /* GLUT.framework in CopyFiles */, 54 | ); 55 | runOnlyForDeploymentPostprocessing = 0; 56 | }; 57 | /* End PBXCopyFilesBuildPhase section */ 58 | 59 | /* Begin PBXFileReference section */ 60 | BBAB23BE13894E4700AA2426 /* GLUT.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLUT.framework; path = ../../../libs/glut/lib/osx/GLUT.framework; sourceTree = ""; }; 61 | E4328143138ABC890047C5CB /* openFrameworksLib.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = openFrameworksLib.xcodeproj; path = ../../../libs/openFrameworksCompiled/project/osx/openFrameworksLib.xcodeproj; sourceTree = SOURCE_ROOT; }; 62 | E45BE9710E8CC7DD009D7055 /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = /System/Library/Frameworks/AGL.framework; sourceTree = ""; }; 63 | E45BE9720E8CC7DD009D7055 /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = /System/Library/Frameworks/ApplicationServices.framework; sourceTree = ""; }; 64 | E45BE9730E8CC7DD009D7055 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = /System/Library/Frameworks/AudioToolbox.framework; sourceTree = ""; }; 65 | E45BE9740E8CC7DD009D7055 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = ""; }; 66 | E45BE9750E8CC7DD009D7055 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = /System/Library/Frameworks/CoreAudio.framework; sourceTree = ""; }; 67 | E45BE9760E8CC7DD009D7055 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = ""; }; 68 | E45BE9770E8CC7DD009D7055 /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = /System/Library/Frameworks/CoreServices.framework; sourceTree = ""; }; 69 | E45BE9790E8CC7DD009D7055 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = ""; }; 70 | E45BE97A0E8CC7DD009D7055 /* QuickTime.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = /System/Library/Frameworks/QuickTime.framework; sourceTree = ""; }; 71 | E4B69B5B0A3A1756003C02F2 /* ofxTerminalExampleDebug.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ofxTerminalExampleDebug.app; sourceTree = BUILT_PRODUCTS_DIR; }; 72 | E4B69E1D0A3A1BDC003C02F2 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = main.cpp; path = src/main.cpp; sourceTree = SOURCE_ROOT; }; 73 | E4B69E1E0A3A1BDC003C02F2 /* testApp.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 30; name = testApp.cpp; path = src/testApp.cpp; sourceTree = SOURCE_ROOT; }; 74 | E4B69E1F0A3A1BDC003C02F2 /* testApp.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = testApp.h; path = src/testApp.h; sourceTree = SOURCE_ROOT; }; 75 | E4B6FCAD0C3E899E008CF71C /* openFrameworks-Info.plist */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.plist.xml; path = "openFrameworks-Info.plist"; sourceTree = ""; }; 76 | E4C2424410CC5A17004149E2 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 77 | E4C2424510CC5A17004149E2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 78 | E4C2424610CC5A17004149E2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = ""; }; 79 | E4EB691F138AFCF100A09F29 /* CoreOF.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = CoreOF.xcconfig; path = ../../../libs/openFrameworksCompiled/project/osx/CoreOF.xcconfig; sourceTree = SOURCE_ROOT; }; 80 | E4EB6923138AFD0F00A09F29 /* Project.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Project.xcconfig; sourceTree = ""; }; 81 | EE5615B614B9EF24000DE70A /* ofxTerminal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ofxTerminal.h; path = ../ofxTerminal.h; sourceTree = SOURCE_ROOT; }; 82 | /* End PBXFileReference section */ 83 | 84 | /* Begin PBXFrameworksBuildPhase section */ 85 | E4B69B590A3A1756003C02F2 /* Frameworks */ = { 86 | isa = PBXFrameworksBuildPhase; 87 | buildActionMask = 2147483647; 88 | files = ( 89 | E4EB6799138ADC1D00A09F29 /* GLUT.framework in Frameworks */, 90 | E4328149138ABC9F0047C5CB /* openFrameworksDebug.a in Frameworks */, 91 | E45BE97B0E8CC7DD009D7055 /* AGL.framework in Frameworks */, 92 | E45BE97C0E8CC7DD009D7055 /* ApplicationServices.framework in Frameworks */, 93 | E45BE97D0E8CC7DD009D7055 /* AudioToolbox.framework in Frameworks */, 94 | E45BE97E0E8CC7DD009D7055 /* Carbon.framework in Frameworks */, 95 | E45BE97F0E8CC7DD009D7055 /* CoreAudio.framework in Frameworks */, 96 | E45BE9800E8CC7DD009D7055 /* CoreFoundation.framework in Frameworks */, 97 | E45BE9810E8CC7DD009D7055 /* CoreServices.framework in Frameworks */, 98 | E45BE9830E8CC7DD009D7055 /* OpenGL.framework in Frameworks */, 99 | E45BE9840E8CC7DD009D7055 /* QuickTime.framework in Frameworks */, 100 | E4C2424710CC5A17004149E2 /* AppKit.framework in Frameworks */, 101 | E4C2424810CC5A17004149E2 /* Cocoa.framework in Frameworks */, 102 | E4C2424910CC5A17004149E2 /* IOKit.framework in Frameworks */, 103 | ); 104 | runOnlyForDeploymentPostprocessing = 0; 105 | }; 106 | /* End PBXFrameworksBuildPhase section */ 107 | 108 | /* Begin PBXGroup section */ 109 | BB4B014C10F69532006C3DED /* addons */ = { 110 | isa = PBXGroup; 111 | children = ( 112 | EE5615B614B9EF24000DE70A /* ofxTerminal.h */, 113 | ); 114 | name = addons; 115 | sourceTree = ""; 116 | }; 117 | BBAB23C913894ECA00AA2426 /* system frameworks */ = { 118 | isa = PBXGroup; 119 | children = ( 120 | E4C2424410CC5A17004149E2 /* AppKit.framework */, 121 | E4C2424510CC5A17004149E2 /* Cocoa.framework */, 122 | E4C2424610CC5A17004149E2 /* IOKit.framework */, 123 | E45BE9710E8CC7DD009D7055 /* AGL.framework */, 124 | E45BE9720E8CC7DD009D7055 /* ApplicationServices.framework */, 125 | E45BE9730E8CC7DD009D7055 /* AudioToolbox.framework */, 126 | E45BE9740E8CC7DD009D7055 /* Carbon.framework */, 127 | E45BE9750E8CC7DD009D7055 /* CoreAudio.framework */, 128 | E45BE9760E8CC7DD009D7055 /* CoreFoundation.framework */, 129 | E45BE9770E8CC7DD009D7055 /* CoreServices.framework */, 130 | E45BE9790E8CC7DD009D7055 /* OpenGL.framework */, 131 | E45BE97A0E8CC7DD009D7055 /* QuickTime.framework */, 132 | ); 133 | name = "system frameworks"; 134 | sourceTree = ""; 135 | }; 136 | BBAB23CA13894EDB00AA2426 /* 3rd party frameworks */ = { 137 | isa = PBXGroup; 138 | children = ( 139 | BBAB23BE13894E4700AA2426 /* GLUT.framework */, 140 | ); 141 | name = "3rd party frameworks"; 142 | sourceTree = ""; 143 | }; 144 | E4328144138ABC890047C5CB /* Products */ = { 145 | isa = PBXGroup; 146 | children = ( 147 | E4328148138ABC890047C5CB /* openFrameworksDebug.a */, 148 | ); 149 | name = Products; 150 | sourceTree = ""; 151 | }; 152 | E45BE5980E8CC70C009D7055 /* frameworks */ = { 153 | isa = PBXGroup; 154 | children = ( 155 | BBAB23CA13894EDB00AA2426 /* 3rd party frameworks */, 156 | BBAB23C913894ECA00AA2426 /* system frameworks */, 157 | ); 158 | name = frameworks; 159 | sourceTree = ""; 160 | }; 161 | E4B69B4A0A3A1720003C02F2 = { 162 | isa = PBXGroup; 163 | children = ( 164 | E4B6FCAD0C3E899E008CF71C /* openFrameworks-Info.plist */, 165 | E4EB6923138AFD0F00A09F29 /* Project.xcconfig */, 166 | E4B69E1C0A3A1BDC003C02F2 /* src */, 167 | E4EEC9E9138DF44700A80321 /* openFrameworks */, 168 | BB4B014C10F69532006C3DED /* addons */, 169 | E45BE5980E8CC70C009D7055 /* frameworks */, 170 | E4B69B5B0A3A1756003C02F2 /* ofxTerminalExampleDebug.app */, 171 | ); 172 | sourceTree = ""; 173 | }; 174 | E4B69E1C0A3A1BDC003C02F2 /* src */ = { 175 | isa = PBXGroup; 176 | children = ( 177 | E4B69E1D0A3A1BDC003C02F2 /* main.cpp */, 178 | E4B69E1E0A3A1BDC003C02F2 /* testApp.cpp */, 179 | E4B69E1F0A3A1BDC003C02F2 /* testApp.h */, 180 | ); 181 | path = src; 182 | sourceTree = SOURCE_ROOT; 183 | }; 184 | E4EEC9E9138DF44700A80321 /* openFrameworks */ = { 185 | isa = PBXGroup; 186 | children = ( 187 | E4EB691F138AFCF100A09F29 /* CoreOF.xcconfig */, 188 | E4328143138ABC890047C5CB /* openFrameworksLib.xcodeproj */, 189 | ); 190 | name = openFrameworks; 191 | sourceTree = ""; 192 | }; 193 | /* End PBXGroup section */ 194 | 195 | /* Begin PBXNativeTarget section */ 196 | E4B69B5A0A3A1756003C02F2 /* ofxTerminalExample */ = { 197 | isa = PBXNativeTarget; 198 | buildConfigurationList = E4B69B5F0A3A1757003C02F2 /* Build configuration list for PBXNativeTarget "ofxTerminalExample" */; 199 | buildPhases = ( 200 | E4B69B580A3A1756003C02F2 /* Sources */, 201 | E4B69B590A3A1756003C02F2 /* Frameworks */, 202 | E4B6FFFD0C3F9AB9008CF71C /* ShellScript */, 203 | E4C2427710CC5ABF004149E2 /* CopyFiles */, 204 | ); 205 | buildRules = ( 206 | ); 207 | dependencies = ( 208 | E4EEB9AC138B136A00A80321 /* PBXTargetDependency */, 209 | ); 210 | name = ofxTerminalExample; 211 | productName = myOFApp; 212 | productReference = E4B69B5B0A3A1756003C02F2 /* ofxTerminalExampleDebug.app */; 213 | productType = "com.apple.product-type.application"; 214 | }; 215 | /* End PBXNativeTarget section */ 216 | 217 | /* Begin PBXProject section */ 218 | E4B69B4C0A3A1720003C02F2 /* Project object */ = { 219 | isa = PBXProject; 220 | buildConfigurationList = E4B69B4D0A3A1720003C02F2 /* Build configuration list for PBXProject "ofxTerminalExample" */; 221 | compatibilityVersion = "Xcode 2.4"; 222 | developmentRegion = English; 223 | hasScannedForEncodings = 0; 224 | knownRegions = ( 225 | English, 226 | Japanese, 227 | French, 228 | German, 229 | ); 230 | mainGroup = E4B69B4A0A3A1720003C02F2; 231 | productRefGroup = E4B69B4A0A3A1720003C02F2; 232 | projectDirPath = ""; 233 | projectReferences = ( 234 | { 235 | ProductGroup = E4328144138ABC890047C5CB /* Products */; 236 | ProjectRef = E4328143138ABC890047C5CB /* openFrameworksLib.xcodeproj */; 237 | }, 238 | ); 239 | projectRoot = ""; 240 | targets = ( 241 | E4B69B5A0A3A1756003C02F2 /* ofxTerminalExample */, 242 | ); 243 | }; 244 | /* End PBXProject section */ 245 | 246 | /* Begin PBXReferenceProxy section */ 247 | E4328148138ABC890047C5CB /* openFrameworksDebug.a */ = { 248 | isa = PBXReferenceProxy; 249 | fileType = archive.ar; 250 | path = openFrameworksDebug.a; 251 | remoteRef = E4328147138ABC890047C5CB /* PBXContainerItemProxy */; 252 | sourceTree = BUILT_PRODUCTS_DIR; 253 | }; 254 | /* End PBXReferenceProxy section */ 255 | 256 | /* Begin PBXShellScriptBuildPhase section */ 257 | E4B6FFFD0C3F9AB9008CF71C /* ShellScript */ = { 258 | isa = PBXShellScriptBuildPhase; 259 | buildActionMask = 2147483647; 260 | files = ( 261 | ); 262 | inputPaths = ( 263 | ); 264 | outputPaths = ( 265 | ); 266 | runOnlyForDeploymentPostprocessing = 0; 267 | shellPath = /bin/sh; 268 | shellScript = "cp -f ../../../libs/fmodex/lib/osx/libfmodex.dylib \"$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/MacOS/libfmodex.dylib\"; install_name_tool -change ./libfmodex.dylib @executable_path/libfmodex.dylib \"$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/MacOS/$PRODUCT_NAME\";"; 269 | }; 270 | /* End PBXShellScriptBuildPhase section */ 271 | 272 | /* Begin PBXSourcesBuildPhase section */ 273 | E4B69B580A3A1756003C02F2 /* Sources */ = { 274 | isa = PBXSourcesBuildPhase; 275 | buildActionMask = 2147483647; 276 | files = ( 277 | E4B69E200A3A1BDC003C02F2 /* main.cpp in Sources */, 278 | E4B69E210A3A1BDC003C02F2 /* testApp.cpp in Sources */, 279 | ); 280 | runOnlyForDeploymentPostprocessing = 0; 281 | }; 282 | /* End PBXSourcesBuildPhase section */ 283 | 284 | /* Begin PBXTargetDependency section */ 285 | E4EEB9AC138B136A00A80321 /* PBXTargetDependency */ = { 286 | isa = PBXTargetDependency; 287 | name = openFrameworks; 288 | targetProxy = E4EEB9AB138B136A00A80321 /* PBXContainerItemProxy */; 289 | }; 290 | /* End PBXTargetDependency section */ 291 | 292 | /* Begin XCBuildConfiguration section */ 293 | E4B69B4E0A3A1720003C02F2 /* Debug */ = { 294 | isa = XCBuildConfiguration; 295 | baseConfigurationReference = E4EB6923138AFD0F00A09F29 /* Project.xcconfig */; 296 | buildSettings = { 297 | ARCHS = "$(NATIVE_ARCH)"; 298 | CONFIGURATION_BUILD_DIR = "$(SRCROOT)/bin/"; 299 | COPY_PHASE_STRIP = NO; 300 | DEAD_CODE_STRIPPING = YES; 301 | GCC_AUTO_VECTORIZATION = YES; 302 | GCC_ENABLE_SSE3_EXTENSIONS = YES; 303 | GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS = YES; 304 | GCC_INLINES_ARE_PRIVATE_EXTERN = NO; 305 | GCC_MODEL_TUNING = G5; 306 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 307 | GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO; 308 | GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = NO; 309 | GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = NO; 310 | GCC_WARN_UNINITIALIZED_AUTOS = NO; 311 | GCC_WARN_UNUSED_VALUE = NO; 312 | GCC_WARN_UNUSED_VARIABLE = NO; 313 | OTHER_CPLUSPLUSFLAGS = ( 314 | "-D__MACOSX_CORE__", 315 | "-lpthread", 316 | ); 317 | }; 318 | name = Debug; 319 | }; 320 | E4B69B4F0A3A1720003C02F2 /* Release */ = { 321 | isa = XCBuildConfiguration; 322 | baseConfigurationReference = E4EB6923138AFD0F00A09F29 /* Project.xcconfig */; 323 | buildSettings = { 324 | ARCHS = "$(NATIVE_ARCH)"; 325 | CONFIGURATION_BUILD_DIR = "$(SRCROOT)/bin/"; 326 | COPY_PHASE_STRIP = YES; 327 | DEAD_CODE_STRIPPING = YES; 328 | GCC_AUTO_VECTORIZATION = YES; 329 | GCC_ENABLE_SSE3_EXTENSIONS = YES; 330 | GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS = YES; 331 | GCC_INLINES_ARE_PRIVATE_EXTERN = NO; 332 | GCC_MODEL_TUNING = G5; 333 | GCC_OPTIMIZATION_LEVEL = 3; 334 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 335 | GCC_UNROLL_LOOPS = YES; 336 | GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO; 337 | GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = NO; 338 | GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = NO; 339 | GCC_WARN_UNINITIALIZED_AUTOS = NO; 340 | GCC_WARN_UNUSED_VALUE = NO; 341 | GCC_WARN_UNUSED_VARIABLE = NO; 342 | OTHER_CPLUSPLUSFLAGS = ( 343 | "-D__MACOSX_CORE__", 344 | "-lpthread", 345 | ); 346 | }; 347 | name = Release; 348 | }; 349 | E4B69B600A3A1757003C02F2 /* Debug */ = { 350 | isa = XCBuildConfiguration; 351 | buildSettings = { 352 | COPY_PHASE_STRIP = NO; 353 | FRAMEWORK_SEARCH_PATHS = ( 354 | "$(inherited)", 355 | "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", 356 | ); 357 | FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../../libs/glut/lib/osx\""; 358 | GCC_DYNAMIC_NO_PIC = NO; 359 | GCC_ENABLE_FIX_AND_CONTINUE = YES; 360 | GCC_GENERATE_DEBUGGING_SYMBOLS = YES; 361 | GCC_MODEL_TUNING = G4; 362 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 363 | GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h"; 364 | INFOPLIST_FILE = "openFrameworks-Info.plist"; 365 | INSTALL_PATH = "$(HOME)/Applications"; 366 | LIBRARY_SEARCH_PATHS = ( 367 | "$(inherited)", 368 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", 369 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)", 370 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)", 371 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_4)", 372 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_5)", 373 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_6)", 374 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_7)", 375 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_8)", 376 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_9)", 377 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_10)", 378 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_11)", 379 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_12)", 380 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_13)", 381 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_14)", 382 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_15)", 383 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)", 384 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)", 385 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_7)", 386 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_8)", 387 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_9)", 388 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_10)", 389 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_11)", 390 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_12)", 391 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_13)", 392 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_16)", 393 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_17)", 394 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_18)", 395 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_19)", 396 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_20)", 397 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_21)", 398 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_22)", 399 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_23)", 400 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_24)", 401 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_25)", 402 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_26)", 403 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_27)", 404 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_28)", 405 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_29)", 406 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_30)", 407 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_31)", 408 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_32)", 409 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_33)", 410 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_34)", 411 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_35)", 412 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_36)", 413 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_37)", 414 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_38)", 415 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_39)", 416 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_40)", 417 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_41)", 418 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_42)", 419 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_43)", 420 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_44)", 421 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_45)", 422 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_46)", 423 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_47)", 424 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_48)", 425 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_49)", 426 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_50)", 427 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_51)", 428 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_52)", 429 | ); 430 | PREBINDING = NO; 431 | PRODUCT_NAME = "$(TARGET_NAME)Debug"; 432 | WRAPPER_EXTENSION = app; 433 | }; 434 | name = Debug; 435 | }; 436 | E4B69B610A3A1757003C02F2 /* Release */ = { 437 | isa = XCBuildConfiguration; 438 | buildSettings = { 439 | COPY_PHASE_STRIP = YES; 440 | FRAMEWORK_SEARCH_PATHS = ( 441 | "$(inherited)", 442 | "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", 443 | ); 444 | FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../../libs/glut/lib/osx\""; 445 | GCC_ENABLE_FIX_AND_CONTINUE = NO; 446 | GCC_GENERATE_DEBUGGING_SYMBOLS = NO; 447 | GCC_MODEL_TUNING = G4; 448 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 449 | GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h"; 450 | INFOPLIST_FILE = "openFrameworks-Info.plist"; 451 | INSTALL_PATH = "$(HOME)/Applications"; 452 | LIBRARY_SEARCH_PATHS = ( 453 | "$(inherited)", 454 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", 455 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)", 456 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)", 457 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_4)", 458 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_5)", 459 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_6)", 460 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_7)", 461 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_8)", 462 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_9)", 463 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_10)", 464 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_11)", 465 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_12)", 466 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_13)", 467 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_14)", 468 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_15)", 469 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)", 470 | "$(LIBRARY_SEARCH_PATHS_QUOTED_1)", 471 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)", 472 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_7)", 473 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_8)", 474 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_9)", 475 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_10)", 476 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_11)", 477 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_12)", 478 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_13)", 479 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_16)", 480 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_17)", 481 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_18)", 482 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_19)", 483 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_20)", 484 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_21)", 485 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_22)", 486 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_23)", 487 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_24)", 488 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_25)", 489 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_26)", 490 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_27)", 491 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_28)", 492 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_29)", 493 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_30)", 494 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_31)", 495 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_32)", 496 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_33)", 497 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_34)", 498 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_35)", 499 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_36)", 500 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_37)", 501 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_38)", 502 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_39)", 503 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_40)", 504 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_41)", 505 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_42)", 506 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_43)", 507 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_44)", 508 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_45)", 509 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_46)", 510 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_47)", 511 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_48)", 512 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_49)", 513 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_50)", 514 | "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_51)", 515 | ); 516 | PREBINDING = NO; 517 | PRODUCT_NAME = "$(TARGET_NAME)"; 518 | WRAPPER_EXTENSION = app; 519 | }; 520 | name = Release; 521 | }; 522 | /* End XCBuildConfiguration section */ 523 | 524 | /* Begin XCConfigurationList section */ 525 | E4B69B4D0A3A1720003C02F2 /* Build configuration list for PBXProject "ofxTerminalExample" */ = { 526 | isa = XCConfigurationList; 527 | buildConfigurations = ( 528 | E4B69B4E0A3A1720003C02F2 /* Debug */, 529 | E4B69B4F0A3A1720003C02F2 /* Release */, 530 | ); 531 | defaultConfigurationIsVisible = 0; 532 | defaultConfigurationName = Release; 533 | }; 534 | E4B69B5F0A3A1757003C02F2 /* Build configuration list for PBXNativeTarget "ofxTerminalExample" */ = { 535 | isa = XCConfigurationList; 536 | buildConfigurations = ( 537 | E4B69B600A3A1757003C02F2 /* Debug */, 538 | E4B69B610A3A1757003C02F2 /* Release */, 539 | ); 540 | defaultConfigurationIsVisible = 0; 541 | defaultConfigurationName = Release; 542 | }; 543 | /* End XCConfigurationList section */ 544 | }; 545 | rootObject = E4B69B4C0A3A1720003C02F2 /* Project object */; 546 | } 547 | -------------------------------------------------------------------------------- /example_project/ofxTerminalExample.xcodeproj/WHG.mode1v3: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ActivePerspectiveName 6 | Project 7 | AllowedModules 8 | 9 | 10 | BundleLoadPath 11 | 12 | MaxInstances 13 | n 14 | Module 15 | PBXSmartGroupTreeModule 16 | Name 17 | Groups and Files Outline View 18 | 19 | 20 | BundleLoadPath 21 | 22 | MaxInstances 23 | n 24 | Module 25 | PBXNavigatorGroup 26 | Name 27 | Editor 28 | 29 | 30 | BundleLoadPath 31 | 32 | MaxInstances 33 | n 34 | Module 35 | XCTaskListModule 36 | Name 37 | Task List 38 | 39 | 40 | BundleLoadPath 41 | 42 | MaxInstances 43 | n 44 | Module 45 | XCDetailModule 46 | Name 47 | File and Smart Group Detail Viewer 48 | 49 | 50 | BundleLoadPath 51 | 52 | MaxInstances 53 | 1 54 | Module 55 | PBXBuildResultsModule 56 | Name 57 | Detailed Build Results Viewer 58 | 59 | 60 | BundleLoadPath 61 | 62 | MaxInstances 63 | 1 64 | Module 65 | PBXProjectFindModule 66 | Name 67 | Project Batch Find Tool 68 | 69 | 70 | BundleLoadPath 71 | 72 | MaxInstances 73 | n 74 | Module 75 | XCProjectFormatConflictsModule 76 | Name 77 | Project Format Conflicts List 78 | 79 | 80 | BundleLoadPath 81 | 82 | MaxInstances 83 | n 84 | Module 85 | PBXBookmarksModule 86 | Name 87 | Bookmarks Tool 88 | 89 | 90 | BundleLoadPath 91 | 92 | MaxInstances 93 | n 94 | Module 95 | PBXClassBrowserModule 96 | Name 97 | Class Browser 98 | 99 | 100 | BundleLoadPath 101 | 102 | MaxInstances 103 | n 104 | Module 105 | PBXCVSModule 106 | Name 107 | Source Code Control Tool 108 | 109 | 110 | BundleLoadPath 111 | 112 | MaxInstances 113 | n 114 | Module 115 | PBXDebugBreakpointsModule 116 | Name 117 | Debug Breakpoints Tool 118 | 119 | 120 | BundleLoadPath 121 | 122 | MaxInstances 123 | n 124 | Module 125 | XCDockableInspector 126 | Name 127 | Inspector 128 | 129 | 130 | BundleLoadPath 131 | 132 | MaxInstances 133 | n 134 | Module 135 | PBXOpenQuicklyModule 136 | Name 137 | Open Quickly Tool 138 | 139 | 140 | BundleLoadPath 141 | 142 | MaxInstances 143 | 1 144 | Module 145 | PBXDebugSessionModule 146 | Name 147 | Debugger 148 | 149 | 150 | BundleLoadPath 151 | 152 | MaxInstances 153 | 1 154 | Module 155 | PBXDebugCLIModule 156 | Name 157 | Debug Console 158 | 159 | 160 | BundleLoadPath 161 | 162 | MaxInstances 163 | n 164 | Module 165 | XCSnapshotModule 166 | Name 167 | Snapshots Tool 168 | 169 | 170 | BundlePath 171 | /Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources 172 | Description 173 | DefaultDescriptionKey 174 | DockingSystemVisible 175 | 176 | Extension 177 | mode1v3 178 | FavBarConfig 179 | 180 | PBXProjectModuleGUID 181 | EE56155314B9EE79000DE70A 182 | XCBarModuleItemNames 183 | 184 | XCBarModuleItems 185 | 186 | 187 | FirstTimeWindowDisplayed 188 | 189 | Identifier 190 | com.apple.perspectives.project.mode1v3 191 | MajorVersion 192 | 33 193 | MinorVersion 194 | 0 195 | Name 196 | Default 197 | Notifications 198 | 199 | OpenEditors 200 | 201 | PerspectiveWidths 202 | 203 | -1 204 | -1 205 | 206 | Perspectives 207 | 208 | 209 | ChosenToolbarItems 210 | 211 | active-combo-popup 212 | action 213 | NSToolbarFlexibleSpaceItem 214 | debugger-enable-breakpoints 215 | clean 216 | go 217 | build-and-go 218 | com.apple.ide.PBXToolbarStopButton 219 | get-info 220 | NSToolbarFlexibleSpaceItem 221 | com.apple.pbx.toolbar.searchfield 222 | 223 | ControllerClassBaseName 224 | 225 | IconName 226 | WindowOfProjectWithEditor 227 | Identifier 228 | perspective.project 229 | IsVertical 230 | 231 | Layout 232 | 233 | 234 | ContentConfiguration 235 | 236 | PBXBottomSmartGroupGIDs 237 | 238 | 1C37FBAC04509CD000000102 239 | 1C37FAAC04509CD000000102 240 | 1C37FABC05509CD000000102 241 | 1C37FABC05539CD112110102 242 | E2644B35053B69B200211256 243 | 1C37FABC04509CD000100104 244 | 1CC0EA4004350EF90044410B 245 | 1CC0EA4004350EF90041110B 246 | 247 | PBXProjectModuleGUID 248 | 1CE0B1FE06471DED0097A5F4 249 | PBXProjectModuleLabel 250 | Files 251 | PBXProjectStructureProvided 252 | yes 253 | PBXSmartGroupTreeModuleColumnData 254 | 255 | PBXSmartGroupTreeModuleColumnWidthsKey 256 | 257 | 226 258 | 259 | PBXSmartGroupTreeModuleColumnsKey_v4 260 | 261 | MainColumn 262 | 263 | 264 | PBXSmartGroupTreeModuleOutlineStateKey_v7 265 | 266 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 267 | 268 | E4B69B4A0A3A1720003C02F2 269 | E4B69E1C0A3A1BDC003C02F2 270 | BB4B014C10F69532006C3DED 271 | 1C37FBAC04509CD000000102 272 | 1C37FABC05509CD000000102 273 | 274 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 275 | 276 | 277 | 5 278 | 3 279 | 0 280 | 281 | 282 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 283 | {{0, 0}, {226, 593}} 284 | 285 | PBXTopSmartGroupGIDs 286 | 287 | XCIncludePerspectivesSwitch 288 | 289 | XCSharingToken 290 | com.apple.Xcode.GFSharingToken 291 | 292 | GeometryConfiguration 293 | 294 | Frame 295 | {{0, 0}, {243, 611}} 296 | GroupTreeTableConfiguration 297 | 298 | MainColumn 299 | 226 300 | 301 | RubberWindowFrame 302 | 177 173 987 652 0 0 1440 878 303 | 304 | Module 305 | PBXSmartGroupTreeModule 306 | Proportion 307 | 243pt 308 | 309 | 310 | Dock 311 | 312 | 313 | BecomeActive 314 | 315 | ContentConfiguration 316 | 317 | PBXProjectModuleGUID 318 | 1CE0B20306471E060097A5F4 319 | PBXProjectModuleLabel 320 | testApp.h 321 | PBXSplitModuleInNavigatorKey 322 | 323 | Split0 324 | 325 | PBXProjectModuleGUID 326 | 1CE0B20406471E060097A5F4 327 | PBXProjectModuleLabel 328 | testApp.h 329 | _historyCapacity 330 | 0 331 | bookmark 332 | EE56166114BA6BC1000DE70A 333 | history 334 | 335 | EE5615B714B9EFE6000DE70A 336 | EE5615B814B9EFE6000DE70A 337 | EE5615BA14B9EFE6000DE70A 338 | 339 | 340 | SplitCount 341 | 1 342 | 343 | StatusBarVisibility 344 | 345 | 346 | GeometryConfiguration 347 | 348 | Frame 349 | {{0, 0}, {739, 496}} 350 | RubberWindowFrame 351 | 177 173 987 652 0 0 1440 878 352 | 353 | Module 354 | PBXNavigatorGroup 355 | Proportion 356 | 496pt 357 | 358 | 359 | ContentConfiguration 360 | 361 | PBXProjectModuleGUID 362 | 1CE0B20506471E060097A5F4 363 | PBXProjectModuleLabel 364 | Detail 365 | 366 | GeometryConfiguration 367 | 368 | Frame 369 | {{0, 501}, {739, 110}} 370 | RubberWindowFrame 371 | 177 173 987 652 0 0 1440 878 372 | 373 | Module 374 | XCDetailModule 375 | Proportion 376 | 110pt 377 | 378 | 379 | Proportion 380 | 739pt 381 | 382 | 383 | Name 384 | Project 385 | ServiceClasses 386 | 387 | XCModuleDock 388 | PBXSmartGroupTreeModule 389 | XCModuleDock 390 | PBXNavigatorGroup 391 | XCDetailModule 392 | 393 | TableOfContents 394 | 395 | EE56165E14BA6BC0000DE70A 396 | 1CE0B1FE06471DED0097A5F4 397 | EE56165F14BA6BC0000DE70A 398 | 1CE0B20306471E060097A5F4 399 | 1CE0B20506471E060097A5F4 400 | 401 | ToolbarConfigUserDefaultsMinorVersion 402 | 2 403 | ToolbarConfiguration 404 | xcode.toolbar.config.defaultV3 405 | 406 | 407 | ControllerClassBaseName 408 | 409 | IconName 410 | WindowOfProject 411 | Identifier 412 | perspective.morph 413 | IsVertical 414 | 0 415 | Layout 416 | 417 | 418 | BecomeActive 419 | 1 420 | ContentConfiguration 421 | 422 | PBXBottomSmartGroupGIDs 423 | 424 | 1C37FBAC04509CD000000102 425 | 1C37FAAC04509CD000000102 426 | 1C08E77C0454961000C914BD 427 | 1C37FABC05509CD000000102 428 | 1C37FABC05539CD112110102 429 | E2644B35053B69B200211256 430 | 1C37FABC04509CD000100104 431 | 1CC0EA4004350EF90044410B 432 | 1CC0EA4004350EF90041110B 433 | 434 | PBXProjectModuleGUID 435 | 11E0B1FE06471DED0097A5F4 436 | PBXProjectModuleLabel 437 | Files 438 | PBXProjectStructureProvided 439 | yes 440 | PBXSmartGroupTreeModuleColumnData 441 | 442 | PBXSmartGroupTreeModuleColumnWidthsKey 443 | 444 | 186 445 | 446 | PBXSmartGroupTreeModuleColumnsKey_v4 447 | 448 | MainColumn 449 | 450 | 451 | PBXSmartGroupTreeModuleOutlineStateKey_v7 452 | 453 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 454 | 455 | 29B97314FDCFA39411CA2CEA 456 | 1C37FABC05509CD000000102 457 | 458 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 459 | 460 | 461 | 0 462 | 463 | 464 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 465 | {{0, 0}, {186, 337}} 466 | 467 | PBXTopSmartGroupGIDs 468 | 469 | XCIncludePerspectivesSwitch 470 | 1 471 | XCSharingToken 472 | com.apple.Xcode.GFSharingToken 473 | 474 | GeometryConfiguration 475 | 476 | Frame 477 | {{0, 0}, {203, 355}} 478 | GroupTreeTableConfiguration 479 | 480 | MainColumn 481 | 186 482 | 483 | RubberWindowFrame 484 | 373 269 690 397 0 0 1440 878 485 | 486 | Module 487 | PBXSmartGroupTreeModule 488 | Proportion 489 | 100% 490 | 491 | 492 | Name 493 | Morph 494 | PreferredWidth 495 | 300 496 | ServiceClasses 497 | 498 | XCModuleDock 499 | PBXSmartGroupTreeModule 500 | 501 | TableOfContents 502 | 503 | 11E0B1FE06471DED0097A5F4 504 | 505 | ToolbarConfiguration 506 | xcode.toolbar.config.default.shortV3 507 | 508 | 509 | PerspectivesBarVisible 510 | 511 | ShelfIsVisible 512 | 513 | SourceDescription 514 | file at '/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources/XCPerspectivesSpecificationMode1.xcperspec' 515 | StatusbarIsVisible 516 | 517 | TimeStamp 518 | 0.0 519 | ToolbarConfigUserDefaultsMinorVersion 520 | 2 521 | ToolbarDisplayMode 522 | 1 523 | ToolbarIsVisible 524 | 525 | ToolbarSizeMode 526 | 1 527 | Type 528 | Perspectives 529 | UpdateMessage 530 | The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the "Metro-Morph" feature). You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature. Do you wish to update to the latest Workspace defaults for project '%@'? 531 | WindowJustification 532 | 5 533 | WindowOrderList 534 | 535 | EE56155414B9EE79000DE70A 536 | /Users/WHG/Code/of_preRelease_v007_osx/addons/ofxTerminal/example_project/ofxTerminalExample.xcodeproj 537 | 538 | WindowString 539 | 177 173 987 652 0 0 1440 878 540 | WindowToolsV3 541 | 542 | 543 | FirstTimeWindowDisplayed 544 | 545 | Identifier 546 | windowTool.build 547 | IsVertical 548 | 549 | Layout 550 | 551 | 552 | Dock 553 | 554 | 555 | ContentConfiguration 556 | 557 | PBXProjectModuleGUID 558 | 1CD0528F0623707200166675 559 | PBXProjectModuleLabel 560 | 561 | StatusBarVisibility 562 | 563 | 564 | GeometryConfiguration 565 | 566 | Frame 567 | {{0, 0}, {500, 218}} 568 | RubberWindowFrame 569 | 196 332 500 500 0 0 1440 878 570 | 571 | Module 572 | PBXNavigatorGroup 573 | Proportion 574 | 218pt 575 | 576 | 577 | ContentConfiguration 578 | 579 | PBXProjectModuleGUID 580 | XCMainBuildResultsModuleGUID 581 | PBXProjectModuleLabel 582 | Build Results 583 | XCBuildResultsTrigger_Collapse 584 | 1021 585 | XCBuildResultsTrigger_Open 586 | 1011 587 | 588 | GeometryConfiguration 589 | 590 | Frame 591 | {{0, 223}, {500, 236}} 592 | RubberWindowFrame 593 | 196 332 500 500 0 0 1440 878 594 | 595 | Module 596 | PBXBuildResultsModule 597 | Proportion 598 | 236pt 599 | 600 | 601 | Proportion 602 | 459pt 603 | 604 | 605 | Name 606 | Build Results 607 | ServiceClasses 608 | 609 | PBXBuildResultsModule 610 | 611 | StatusbarIsVisible 612 | 613 | TableOfContents 614 | 615 | EE56155414B9EE79000DE70A 616 | EE56166014BA6BC0000DE70A 617 | 1CD0528F0623707200166675 618 | XCMainBuildResultsModuleGUID 619 | 620 | ToolbarConfiguration 621 | xcode.toolbar.config.buildV3 622 | WindowContentMinSize 623 | 486 300 624 | WindowString 625 | 196 332 500 500 0 0 1440 878 626 | WindowToolGUID 627 | EE56155414B9EE79000DE70A 628 | WindowToolIsVisible 629 | 630 | 631 | 632 | FirstTimeWindowDisplayed 633 | 634 | Identifier 635 | windowTool.debugger 636 | IsVertical 637 | 638 | Layout 639 | 640 | 641 | Dock 642 | 643 | 644 | ContentConfiguration 645 | 646 | Debugger 647 | 648 | HorizontalSplitView 649 | 650 | _collapsingFrameDimension 651 | 0.0 652 | _indexOfCollapsedView 653 | 0 654 | _percentageOfCollapsedView 655 | 0.0 656 | isCollapsed 657 | yes 658 | sizes 659 | 660 | {{0, 0}, {316, 185}} 661 | {{316, 0}, {378, 185}} 662 | 663 | 664 | VerticalSplitView 665 | 666 | _collapsingFrameDimension 667 | 0.0 668 | _indexOfCollapsedView 669 | 0 670 | _percentageOfCollapsedView 671 | 0.0 672 | isCollapsed 673 | yes 674 | sizes 675 | 676 | {{0, 0}, {694, 185}} 677 | {{0, 185}, {694, 196}} 678 | 679 | 680 | 681 | LauncherConfigVersion 682 | 8 683 | PBXProjectModuleGUID 684 | 1C162984064C10D400B95A72 685 | PBXProjectModuleLabel 686 | Debug - GLUTExamples (Underwater) 687 | 688 | GeometryConfiguration 689 | 690 | DebugConsoleVisible 691 | None 692 | DebugConsoleWindowFrame 693 | {{200, 200}, {500, 300}} 694 | DebugSTDIOWindowFrame 695 | {{200, 200}, {500, 300}} 696 | Frame 697 | {{0, 0}, {694, 381}} 698 | PBXDebugSessionStackFrameViewKey 699 | 700 | DebugVariablesTableConfiguration 701 | 702 | Name 703 | 120 704 | Value 705 | 85 706 | Summary 707 | 148 708 | 709 | Frame 710 | {{316, 0}, {378, 185}} 711 | RubberWindowFrame 712 | 326 379 694 422 0 0 1440 878 713 | 714 | RubberWindowFrame 715 | 326 379 694 422 0 0 1440 878 716 | 717 | Module 718 | PBXDebugSessionModule 719 | Proportion 720 | 381pt 721 | 722 | 723 | Proportion 724 | 381pt 725 | 726 | 727 | Name 728 | Debugger 729 | ServiceClasses 730 | 731 | PBXDebugSessionModule 732 | 733 | StatusbarIsVisible 734 | 735 | TableOfContents 736 | 737 | 1CD10A99069EF8BA00B06720 738 | EE5615AB14B9EEF4000DE70A 739 | 1C162984064C10D400B95A72 740 | EE5615AC14B9EEF4000DE70A 741 | EE5615AD14B9EEF4000DE70A 742 | EE5615AE14B9EEF4000DE70A 743 | EE5615AF14B9EEF4000DE70A 744 | EE5615B014B9EEF4000DE70A 745 | 746 | ToolbarConfiguration 747 | xcode.toolbar.config.debugV3 748 | WindowString 749 | 326 379 694 422 0 0 1440 878 750 | WindowToolGUID 751 | 1CD10A99069EF8BA00B06720 752 | WindowToolIsVisible 753 | 754 | 755 | 756 | Identifier 757 | windowTool.find 758 | Layout 759 | 760 | 761 | Dock 762 | 763 | 764 | Dock 765 | 766 | 767 | ContentConfiguration 768 | 769 | PBXProjectModuleGUID 770 | 1CDD528C0622207200134675 771 | PBXProjectModuleLabel 772 | <No Editor> 773 | PBXSplitModuleInNavigatorKey 774 | 775 | Split0 776 | 777 | PBXProjectModuleGUID 778 | 1CD0528D0623707200166675 779 | 780 | SplitCount 781 | 1 782 | 783 | StatusBarVisibility 784 | 1 785 | 786 | GeometryConfiguration 787 | 788 | Frame 789 | {{0, 0}, {781, 167}} 790 | RubberWindowFrame 791 | 62 385 781 470 0 0 1440 878 792 | 793 | Module 794 | PBXNavigatorGroup 795 | Proportion 796 | 781pt 797 | 798 | 799 | Proportion 800 | 50% 801 | 802 | 803 | BecomeActive 804 | 1 805 | ContentConfiguration 806 | 807 | PBXProjectModuleGUID 808 | 1CD0528E0623707200166675 809 | PBXProjectModuleLabel 810 | Project Find 811 | 812 | GeometryConfiguration 813 | 814 | Frame 815 | {{8, 0}, {773, 254}} 816 | RubberWindowFrame 817 | 62 385 781 470 0 0 1440 878 818 | 819 | Module 820 | PBXProjectFindModule 821 | Proportion 822 | 50% 823 | 824 | 825 | Proportion 826 | 428pt 827 | 828 | 829 | Name 830 | Project Find 831 | ServiceClasses 832 | 833 | PBXProjectFindModule 834 | 835 | StatusbarIsVisible 836 | 1 837 | TableOfContents 838 | 839 | 1C530D57069F1CE1000CFCEE 840 | 1C530D58069F1CE1000CFCEE 841 | 1C530D59069F1CE1000CFCEE 842 | 1CDD528C0622207200134675 843 | 1C530D5A069F1CE1000CFCEE 844 | 1CE0B1FE06471DED0097A5F4 845 | 1CD0528E0623707200166675 846 | 847 | WindowString 848 | 62 385 781 470 0 0 1440 878 849 | WindowToolGUID 850 | 1C530D57069F1CE1000CFCEE 851 | WindowToolIsVisible 852 | 0 853 | 854 | 855 | Identifier 856 | MENUSEPARATOR 857 | 858 | 859 | FirstTimeWindowDisplayed 860 | 861 | Identifier 862 | windowTool.debuggerConsole 863 | IsVertical 864 | 865 | Layout 866 | 867 | 868 | Dock 869 | 870 | 871 | ContentConfiguration 872 | 873 | PBXProjectModuleGUID 874 | 1C78EAAC065D492600B07095 875 | PBXProjectModuleLabel 876 | Debugger Console 877 | 878 | GeometryConfiguration 879 | 880 | Frame 881 | {{0, 0}, {650, 209}} 882 | RubberWindowFrame 883 | 326 551 650 250 0 0 1440 878 884 | 885 | Module 886 | PBXDebugCLIModule 887 | Proportion 888 | 209pt 889 | 890 | 891 | Proportion 892 | 209pt 893 | 894 | 895 | Name 896 | Debugger Console 897 | ServiceClasses 898 | 899 | PBXDebugCLIModule 900 | 901 | StatusbarIsVisible 902 | 903 | TableOfContents 904 | 905 | 1C78EAAD065D492600B07095 906 | EE5615B114B9EEF4000DE70A 907 | 1C78EAAC065D492600B07095 908 | 909 | ToolbarConfiguration 910 | xcode.toolbar.config.consoleV3 911 | WindowString 912 | 326 551 650 250 0 0 1440 878 913 | WindowToolGUID 914 | 1C78EAAD065D492600B07095 915 | WindowToolIsVisible 916 | 917 | 918 | 919 | Identifier 920 | windowTool.snapshots 921 | Layout 922 | 923 | 924 | Dock 925 | 926 | 927 | Module 928 | XCSnapshotModule 929 | Proportion 930 | 100% 931 | 932 | 933 | Proportion 934 | 100% 935 | 936 | 937 | Name 938 | Snapshots 939 | ServiceClasses 940 | 941 | XCSnapshotModule 942 | 943 | StatusbarIsVisible 944 | Yes 945 | ToolbarConfiguration 946 | xcode.toolbar.config.snapshots 947 | WindowString 948 | 315 824 300 550 0 0 1440 878 949 | WindowToolIsVisible 950 | Yes 951 | 952 | 953 | Identifier 954 | windowTool.scm 955 | Layout 956 | 957 | 958 | Dock 959 | 960 | 961 | ContentConfiguration 962 | 963 | PBXProjectModuleGUID 964 | 1C78EAB2065D492600B07095 965 | PBXProjectModuleLabel 966 | <No Editor> 967 | PBXSplitModuleInNavigatorKey 968 | 969 | Split0 970 | 971 | PBXProjectModuleGUID 972 | 1C78EAB3065D492600B07095 973 | 974 | SplitCount 975 | 1 976 | 977 | StatusBarVisibility 978 | 1 979 | 980 | GeometryConfiguration 981 | 982 | Frame 983 | {{0, 0}, {452, 0}} 984 | RubberWindowFrame 985 | 743 379 452 308 0 0 1280 1002 986 | 987 | Module 988 | PBXNavigatorGroup 989 | Proportion 990 | 0pt 991 | 992 | 993 | BecomeActive 994 | 1 995 | ContentConfiguration 996 | 997 | PBXProjectModuleGUID 998 | 1CD052920623707200166675 999 | PBXProjectModuleLabel 1000 | SCM 1001 | 1002 | GeometryConfiguration 1003 | 1004 | ConsoleFrame 1005 | {{0, 259}, {452, 0}} 1006 | Frame 1007 | {{0, 7}, {452, 259}} 1008 | RubberWindowFrame 1009 | 743 379 452 308 0 0 1280 1002 1010 | TableConfiguration 1011 | 1012 | Status 1013 | 30 1014 | FileName 1015 | 199 1016 | Path 1017 | 197.0950012207031 1018 | 1019 | TableFrame 1020 | {{0, 0}, {452, 250}} 1021 | 1022 | Module 1023 | PBXCVSModule 1024 | Proportion 1025 | 262pt 1026 | 1027 | 1028 | Proportion 1029 | 266pt 1030 | 1031 | 1032 | Name 1033 | SCM 1034 | ServiceClasses 1035 | 1036 | PBXCVSModule 1037 | 1038 | StatusbarIsVisible 1039 | 1 1040 | TableOfContents 1041 | 1042 | 1C78EAB4065D492600B07095 1043 | 1C78EAB5065D492600B07095 1044 | 1C78EAB2065D492600B07095 1045 | 1CD052920623707200166675 1046 | 1047 | ToolbarConfiguration 1048 | xcode.toolbar.config.scm 1049 | WindowString 1050 | 743 379 452 308 0 0 1280 1002 1051 | 1052 | 1053 | Identifier 1054 | windowTool.breakpoints 1055 | IsVertical 1056 | 0 1057 | Layout 1058 | 1059 | 1060 | Dock 1061 | 1062 | 1063 | BecomeActive 1064 | 1 1065 | ContentConfiguration 1066 | 1067 | PBXBottomSmartGroupGIDs 1068 | 1069 | 1C77FABC04509CD000000102 1070 | 1071 | PBXProjectModuleGUID 1072 | 1CE0B1FE06471DED0097A5F4 1073 | PBXProjectModuleLabel 1074 | Files 1075 | PBXProjectStructureProvided 1076 | no 1077 | PBXSmartGroupTreeModuleColumnData 1078 | 1079 | PBXSmartGroupTreeModuleColumnWidthsKey 1080 | 1081 | 168 1082 | 1083 | PBXSmartGroupTreeModuleColumnsKey_v4 1084 | 1085 | MainColumn 1086 | 1087 | 1088 | PBXSmartGroupTreeModuleOutlineStateKey_v7 1089 | 1090 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 1091 | 1092 | 1C77FABC04509CD000000102 1093 | 1094 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 1095 | 1096 | 1097 | 0 1098 | 1099 | 1100 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 1101 | {{0, 0}, {168, 350}} 1102 | 1103 | PBXTopSmartGroupGIDs 1104 | 1105 | XCIncludePerspectivesSwitch 1106 | 0 1107 | 1108 | GeometryConfiguration 1109 | 1110 | Frame 1111 | {{0, 0}, {185, 368}} 1112 | GroupTreeTableConfiguration 1113 | 1114 | MainColumn 1115 | 168 1116 | 1117 | RubberWindowFrame 1118 | 315 424 744 409 0 0 1440 878 1119 | 1120 | Module 1121 | PBXSmartGroupTreeModule 1122 | Proportion 1123 | 185pt 1124 | 1125 | 1126 | ContentConfiguration 1127 | 1128 | PBXProjectModuleGUID 1129 | 1CA1AED706398EBD00589147 1130 | PBXProjectModuleLabel 1131 | Detail 1132 | 1133 | GeometryConfiguration 1134 | 1135 | Frame 1136 | {{190, 0}, {554, 368}} 1137 | RubberWindowFrame 1138 | 315 424 744 409 0 0 1440 878 1139 | 1140 | Module 1141 | XCDetailModule 1142 | Proportion 1143 | 554pt 1144 | 1145 | 1146 | Proportion 1147 | 368pt 1148 | 1149 | 1150 | MajorVersion 1151 | 3 1152 | MinorVersion 1153 | 0 1154 | Name 1155 | Breakpoints 1156 | ServiceClasses 1157 | 1158 | PBXSmartGroupTreeModule 1159 | XCDetailModule 1160 | 1161 | StatusbarIsVisible 1162 | 1 1163 | TableOfContents 1164 | 1165 | 1CDDB66807F98D9800BB5817 1166 | 1CDDB66907F98D9800BB5817 1167 | 1CE0B1FE06471DED0097A5F4 1168 | 1CA1AED706398EBD00589147 1169 | 1170 | ToolbarConfiguration 1171 | xcode.toolbar.config.breakpointsV3 1172 | WindowString 1173 | 315 424 744 409 0 0 1440 878 1174 | WindowToolGUID 1175 | 1CDDB66807F98D9800BB5817 1176 | WindowToolIsVisible 1177 | 1 1178 | 1179 | 1180 | Identifier 1181 | windowTool.debugAnimator 1182 | Layout 1183 | 1184 | 1185 | Dock 1186 | 1187 | 1188 | Module 1189 | PBXNavigatorGroup 1190 | Proportion 1191 | 100% 1192 | 1193 | 1194 | Proportion 1195 | 100% 1196 | 1197 | 1198 | Name 1199 | Debug Visualizer 1200 | ServiceClasses 1201 | 1202 | PBXNavigatorGroup 1203 | 1204 | StatusbarIsVisible 1205 | 1 1206 | ToolbarConfiguration 1207 | xcode.toolbar.config.debugAnimatorV3 1208 | WindowString 1209 | 100 100 700 500 0 0 1280 1002 1210 | 1211 | 1212 | Identifier 1213 | windowTool.bookmarks 1214 | Layout 1215 | 1216 | 1217 | Dock 1218 | 1219 | 1220 | Module 1221 | PBXBookmarksModule 1222 | Proportion 1223 | 100% 1224 | 1225 | 1226 | Proportion 1227 | 100% 1228 | 1229 | 1230 | Name 1231 | Bookmarks 1232 | ServiceClasses 1233 | 1234 | PBXBookmarksModule 1235 | 1236 | StatusbarIsVisible 1237 | 0 1238 | WindowString 1239 | 538 42 401 187 0 0 1280 1002 1240 | 1241 | 1242 | Identifier 1243 | windowTool.projectFormatConflicts 1244 | Layout 1245 | 1246 | 1247 | Dock 1248 | 1249 | 1250 | Module 1251 | XCProjectFormatConflictsModule 1252 | Proportion 1253 | 100% 1254 | 1255 | 1256 | Proportion 1257 | 100% 1258 | 1259 | 1260 | Name 1261 | Project Format Conflicts 1262 | ServiceClasses 1263 | 1264 | XCProjectFormatConflictsModule 1265 | 1266 | StatusbarIsVisible 1267 | 0 1268 | WindowContentMinSize 1269 | 450 300 1270 | WindowString 1271 | 50 850 472 307 0 0 1440 877 1272 | 1273 | 1274 | Identifier 1275 | windowTool.classBrowser 1276 | Layout 1277 | 1278 | 1279 | Dock 1280 | 1281 | 1282 | BecomeActive 1283 | 1 1284 | ContentConfiguration 1285 | 1286 | OptionsSetName 1287 | Hierarchy, all classes 1288 | PBXProjectModuleGUID 1289 | 1CA6456E063B45B4001379D8 1290 | PBXProjectModuleLabel 1291 | Class Browser - NSObject 1292 | 1293 | GeometryConfiguration 1294 | 1295 | ClassesFrame 1296 | {{0, 0}, {374, 96}} 1297 | ClassesTreeTableConfiguration 1298 | 1299 | PBXClassNameColumnIdentifier 1300 | 208 1301 | PBXClassBookColumnIdentifier 1302 | 22 1303 | 1304 | Frame 1305 | {{0, 0}, {630, 331}} 1306 | MembersFrame 1307 | {{0, 105}, {374, 395}} 1308 | MembersTreeTableConfiguration 1309 | 1310 | PBXMemberTypeIconColumnIdentifier 1311 | 22 1312 | PBXMemberNameColumnIdentifier 1313 | 216 1314 | PBXMemberTypeColumnIdentifier 1315 | 97 1316 | PBXMemberBookColumnIdentifier 1317 | 22 1318 | 1319 | PBXModuleWindowStatusBarHidden2 1320 | 1 1321 | RubberWindowFrame 1322 | 385 179 630 352 0 0 1440 878 1323 | 1324 | Module 1325 | PBXClassBrowserModule 1326 | Proportion 1327 | 332pt 1328 | 1329 | 1330 | Proportion 1331 | 332pt 1332 | 1333 | 1334 | Name 1335 | Class Browser 1336 | ServiceClasses 1337 | 1338 | PBXClassBrowserModule 1339 | 1340 | StatusbarIsVisible 1341 | 0 1342 | TableOfContents 1343 | 1344 | 1C0AD2AF069F1E9B00FABCE6 1345 | 1C0AD2B0069F1E9B00FABCE6 1346 | 1CA6456E063B45B4001379D8 1347 | 1348 | ToolbarConfiguration 1349 | xcode.toolbar.config.classbrowser 1350 | WindowString 1351 | 385 179 630 352 0 0 1440 878 1352 | WindowToolGUID 1353 | 1C0AD2AF069F1E9B00FABCE6 1354 | WindowToolIsVisible 1355 | 0 1356 | 1357 | 1358 | Identifier 1359 | windowTool.refactoring 1360 | IncludeInToolsMenu 1361 | 0 1362 | Layout 1363 | 1364 | 1365 | Dock 1366 | 1367 | 1368 | BecomeActive 1369 | 1 1370 | GeometryConfiguration 1371 | 1372 | Frame 1373 | {0, 0}, {500, 335} 1374 | RubberWindowFrame 1375 | {0, 0}, {500, 335} 1376 | 1377 | Module 1378 | XCRefactoringModule 1379 | Proportion 1380 | 100% 1381 | 1382 | 1383 | Proportion 1384 | 100% 1385 | 1386 | 1387 | Name 1388 | Refactoring 1389 | ServiceClasses 1390 | 1391 | XCRefactoringModule 1392 | 1393 | WindowString 1394 | 200 200 500 356 0 0 1920 1200 1395 | 1396 | 1397 | 1398 | 1399 | --------------------------------------------------------------------------------