This is XTAction.m in view mode; [Download] [Up]
#import "XTAction.h" #import "XText.h" #import "ErrorStream.h" #import <appkit/Application.h> #import <stdio.h> #import <string.h> #import <appkit/NXCType.h> @implementation XTAction static id undefined_action = 0; + undefinedAction { if (!undefined_action) undefined_action = [[XTAction allocFromZone:[NXApp zone]] init]; return undefined_action; } - applyTo:xtext event:(NXEvent *)event { [xtext unboundKey]; return self; } @end @implementation XTMsg0Action - initSel:(SEL)sel { [super init]; action_sel = sel; return self; } - applyTo:xtext event:(NXEvent *)event { return [xtext perform:action_sel]; } @end @implementation XTMsg1Action - initSel:(SEL)sel arg:(int)arg { [super init]; action_sel = sel; action_arg = arg; return self; } - applyTo: xtext event:(NXEvent *)event { return [xtext perform:action_sel with:(id)action_arg]; } @end @implementation XTMsg2Action - initSel:(SEL)sel arg:(int)arg1 arg:(int)arg2 { [super init]; action_sel = sel; action_arg1 = arg1; action_arg2 = arg2; return self; } - applyTo: xtext event:(NXEvent *)event { return [xtext perform:action_sel with:(id)action_arg1 with:(id)action_arg2]; } @end @implementation XTDispatchAction - init { charCode k; [super init]; for (k=0; k<CHAR_CODES; ++k) actions[k] = nil; return self; } // provided for backward compatability - initBase:(const char *)base estream:errs { charCode k; [super init]; for (k=0; k<CHAR_CODES; ++k) actions[k] = nil; if (!strcmp(base,"none")) {} // else if (!strcmp(base,"other_base")) // initbase_other_base(actions) else {} return self; } // a convenience method to loading keybindings - loadFromFile:(char *)fullName estream:errs { FILE *fp; int i; char line[256]; fp = fopen(fullName, "r"); if(!fp){ char msg[100]; sprintf(msg,"Cannot read %s", fullName); [(errs ? errs : [ErrorStream default]) report:msg]; return self; } while(fgets(line, 256, fp) != NULL){ if(line[0] == '#' ){} // a comment else{ for(i=0;i<strlen(line);i++){ if(line[i] == '\n' || line[i] == '\t') line[i] = ' '; } [self addBindings:line estream:errs]; } } return self; } - bindKey:(charCode)key toAction:action estream:errs { if ((key < 0) || (key >= CHAR_CODES)) { char msg[40]; sprintf(msg, "Invalid key code: %d", key); [(errs ? errs : [ErrorStream default]) report:msg]; } else actions[key] = action; return self; } - applyTo:xtext event:(NXEvent *)event { charCode k = event->data.key.charCode << NUM_MASKS; id action; if ((k >= 0) && (k < CHAR_CODES)) { if (event->flags & NX_ALPHASHIFTMASK) k += 1; if (event->flags & NX_SHIFTMASK) k += 2; if (event->flags & NX_CONTROLMASK) k += 4; if (event->flags & NX_ALTERNATEMASK) k += 8; if (event->flags & NX_COMMANDMASK) k += 16; if (event->flags & NX_NUMERICPADMASK) k += 32; if (event->flags & NX_HELPMASK) k += 64; action = actions[k]; if (action) return [action applyTo:xtext event:event]; /* also try action without the caps lock bit on */ if(event->flags & NX_ALPHASHIFTMASK){ k-=1; action = actions[k]; if (action) return [action applyTo:xtext event:event]; } } return nil; } @end @implementation XTEventMsgAction - initSel:(SEL)sel { [super init]; action_sel = sel; return self; } - applyTo:xtext event:(NXEvent *)event { return [xtext perform:action_sel with:(id)event]; } @end @implementation XTSeqAction - initLength:(int)len actions:(XTAction **)acts { [super init]; length = len; actions = acts; return self; } - applyTo:xtext event:(NXEvent *)event { int i; for (i=0; i<length; ++i) [actions[i] applyTo:xtext event:event]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.