Line data Source code
1 0 : /* 2 : 3 : OOJSGuiScreenKeyDefinition.m 4 : 5 : 6 : Oolite 7 : Copyright (C) 2004-2013 Giles C Williams and contributors 8 : 9 : This program is free software; you can redistribute it and/or 10 : modify it under the terms of the GNU General Public License 11 : as published by the Free Software Foundation; either version 2 12 : of the License, or (at your option) any later version. 13 : 14 : This program is distributed in the hope that it will be useful, 15 : but WITHOUT ANY WARRANTY; without even the implied warranty of 16 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 : GNU General Public License for more details. 18 : 19 : You should have received a copy of the GNU General Public License 20 : along with this program; if not, write to the Free Software 21 : Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 22 : MA 02110-1301, USA. 23 : 24 : */ 25 : 26 : #import "OOJSGuiScreenKeyDefinition.h" 27 : //#import "OOJavaScriptEngine.h" 28 : 29 : 30 : @implementation OOJSGuiScreenKeyDefinition 31 : 32 0 : - (id) init { 33 : self = [super init]; 34 : _callback = JSVAL_VOID; 35 : _callbackThis = NULL; 36 : 37 : _owningScript = [[OOJSScript currentlyRunningScript] weakRetain]; 38 : 39 : [[NSNotificationCenter defaultCenter] addObserver:self 40 : selector:@selector(deleteJSPointers) 41 : name:kOOJavaScriptEngineWillResetNotification 42 : object:[OOJavaScriptEngine sharedEngine]]; 43 : 44 : return self; 45 : } 46 : 47 0 : - (void) deleteJSPointers 48 : { 49 : 50 : JSContext *context = OOJSAcquireContext(); 51 : _callback = JSVAL_VOID; 52 : _callbackThis = NULL; 53 : JS_RemoveValueRoot(context, &_callback); 54 : JS_RemoveObjectRoot(context, &_callbackThis); 55 : 56 : OOJSRelinquishContext(context); 57 : 58 : [[NSNotificationCenter defaultCenter] removeObserver:self 59 : name:kOOJavaScriptEngineWillResetNotification 60 : object:[OOJavaScriptEngine sharedEngine]]; 61 : 62 : } 63 : 64 0 : - (void) dealloc 65 : { 66 : [_owningScript release]; 67 : 68 : [self deleteJSPointers]; 69 : 70 : [super dealloc]; 71 : } 72 : 73 : - (NSString *)name 74 : { 75 : return _name; 76 : } 77 : 78 : 79 : - (void)setName:(NSString *)name 80 : { 81 : [_name autorelease]; 82 : _name = [name retain]; 83 : } 84 : 85 : 86 : - (NSDictionary *)registerKeys 87 : { 88 : return _registerKeys; 89 : } 90 : 91 : 92 : - (void)setRegisterKeys:(NSDictionary *)registerKeys 93 : { 94 : [_registerKeys release]; 95 : _registerKeys = [registerKeys copy]; 96 : } 97 : 98 : 99 : - (jsval)callback 100 : { 101 : return _callback; 102 : } 103 : 104 : 105 : - (void)setCallback:(jsval)callback 106 : { 107 : JSContext *context = OOJSAcquireContext(); 108 : JS_RemoveValueRoot(context, &_callback); 109 : _callback = callback; 110 : OOJSAddGCValueRoot(context, &_callback, "OOJSGuiScreenKeyDefinition callback function"); 111 : OOJSRelinquishContext(context); 112 : } 113 : 114 : 115 : - (JSObject *)callbackThis 116 : { 117 : return _callbackThis; 118 : } 119 : 120 : 121 : - (void)setCallbackThis:(JSObject *)callbackThis 122 : { 123 : JSContext *context = OOJSAcquireContext(); 124 : JS_RemoveObjectRoot(context, &_callbackThis); 125 : _callbackThis = callbackThis; 126 : OOJSAddGCObjectRoot(context, &_callbackThis, "OOJSGuiScreenKeyDefinition callback this"); 127 : OOJSRelinquishContext(context); 128 : } 129 : 130 : 131 : - (void)runCallback:(NSString *)key 132 : { 133 : OOJavaScriptEngine *engine = [OOJavaScriptEngine sharedEngine]; 134 : JSContext *context = OOJSAcquireContext(); 135 : jsval rval = JSVAL_VOID; 136 : 137 : jsval cKey = OOJSValueFromNativeObject(context, key); 138 : 139 : OOJSScript *owner = [_owningScript retain]; // local copy needed 140 : [OOJSScript pushScript:owner]; 141 : 142 : [engine callJSFunction:_callback 143 : forObject:_callbackThis 144 : argc:1 145 : argv:&cKey 146 : result:&rval]; 147 : 148 : [OOJSScript popScript:owner]; 149 : [owner release]; 150 : 151 : OOJSRelinquishContext(context); 152 : } 153 : 154 : 155 : - (NSComparisonResult)interfaceCompare:(OOJSGuiScreenKeyDefinition *)other 156 : { 157 : return [_name caseInsensitiveCompare:[other name]]; 158 : } 159 : 160 : @end