This is Controller.m in view mode; [Download] [Up]
/* * Puppeteer 1.1 * * Copyright (c) 1994 Primitive Software Ltd. All rights reserved. * * Author: Dave Griffiths <dave@prim.demon.co.uk> */ #import "Controller.h" #import "Puppeteer.h" #import "WindowInfo.h" #import "RemoteView.h" id puppet; // Puppet on a string BOOL bufferKeystrokes; // YES if key strokes are buffered until flushed int selectedWindow; // The currently selected window @implementation Controller unsigned short PVEditorFilter(unsigned short theChar, int flags, unsigned short charSet) /* * This filter is called for each character that is typed. If keyboard buffering is * turned off (default), send keydown and keyup events for each character. */ { if (!bufferKeystrokes) { if (flags & NX_COMMANDMASK) /* * If it's a command key, make the application active. This * has the effect of enabling menu items that depend on the * key window. */ [puppet postActivate:YES]; [puppet postKeyboardEvent:NX_KEYDOWN window:selectedWindow flags:flags charCode:theChar]; [puppet postKeyboardEvent:NX_KEYUP window:selectedWindow flags:flags charCode:theChar]; if (flags & NX_COMMANDMASK) [puppet postActivate:NO]; } return NXEditorFilter(theChar, flags, charSet); } - appDidInit:sender { selectedWindow = NX_KEYWINDOW; [textObject setCharFilter:PVEditorFilter]; [mainWindow makeKeyAndOrderFront:self]; return self; } - appWillTerminate:sender { [puppet releaseStrings]; return self; } - reloadPopupList /* * Refresh the popupList with the current window list. */ { id winList, popupList, win, matrix; int i, count, localWindowNumber; NXRect frame; char title[256]; /* * First remove all except the first three items. */ popupList = [chooseWindowButton target]; matrix = [popupList itemList]; count = [popupList count]; for (i=3; i<count; i++) [popupList removeItemAt:i]; /* * Now load the new list. The local window number is stored as the tag * to identify the selected window. */ winList = [puppet windowList]; count = [winList count]; for (i=0; i<count; i++) { win = [winList objectAt:i]; localWindowNumber = [win localWindowNumber]; [win getFrame:&frame]; sprintf(title, "%d (%.0f x %.0f)", localWindowNumber, frame.size.width, frame.size.height); [popupList addItem:title]; [matrix setTag:localWindowNumber at:i+3:0]; } [popupList setTarget:self]; [popupList setAction:@selector(chooseWindow:)]; return self; } - attachStrings:sender { if (puppet) { [puppet releaseStrings]; [puppet free]; puppet = nil; } else { puppet = [Puppeteer connectToApp:[appNameField stringValueAt:0] launch:NO]; if (!puppet) { NXRunAlertPanel(0, "Could not connect to %s", 0, 0, 0, [appNameField stringValueAt:0]); return self; } [puppet attachStrings]; [remoteView setWindow:[puppet mainWindow]]; [self reloadPopupList]; } return self; } - flushKeyboardBuffer:sender /* * Flush the text in the text object as if it were a sequence of keystrokes. */ { int i, textLength = [textObject textLength]; char *text; text = (char *)malloc(textLength+1); [textObject getSubstring:text start:0 length:textLength]; for (i=0; i<textLength; i++) { [puppet postKeyboardEvent:NX_KEYDOWN window:selectedWindow flags:0 charCode:text[i]]; [puppet postKeyboardEvent:NX_KEYUP window:selectedWindow flags:0 charCode:text[i]]; } return self; } - bufferOn:sender /* * Turn on keyboard buffering. Keystrokes are only sent when the "Flush" button is * pressed. */ { bufferKeystrokes = YES; return self; } - bufferOff:sender /* * Turn off keyboard buffering. Keystrokes are sent as they arrive. */ { bufferKeystrokes = NO; return self; } - chooseWindow:sender { id winList, win; int i, count, localWindowNumber; selectedWindow = [[sender selectedCell] tag]; switch (selectedWindow) { case NX_KEYWINDOW: [remoteView setWindow:[puppet keyWindow]]; break; case NX_MAINWINDOW: [remoteView setWindow:[puppet mainWindow]]; break; case NX_MAINMENU: [remoteView setWindow:[puppet mainMenu]]; break; default: winList = [puppet windowList]; count = [winList count]; for (i=0; i<count; i++) { win = [winList objectAt:i]; localWindowNumber = [win localWindowNumber]; if (localWindowNumber == selectedWindow) { [remoteView setWindow:win]; break; } } break; } return self; } - (int)selectedWindow { return selectedWindow; } - (BOOL)printMouseClicks { return printMouseClicks; } - printMouseClicks:sender { printMouseClicks = !printMouseClicks; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.