mirror of
https://github.com/ksherlock/TwoTerm.git
synced 2024-06-01 21:41:37 +00:00
Compare commits
12 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
43cb3c9e4f | ||
|
6cb2b91ac0 | ||
|
8a5f5a9e61 | ||
|
b1340d2a56 | ||
|
5a971ac08c | ||
|
254dfd548e | ||
|
bd6d13e51b | ||
|
54335e2e3b | ||
|
98dc438fa5 | ||
|
ceb1349199 | ||
|
22266914ed | ||
|
542dddd335 |
21
.github/workflows/xcodebuild.yml
vendored
Normal file
21
.github/workflows/xcodebuild.yml
vendored
Normal file
|
@ -0,0 +1,21 @@
|
|||
name: xcodebuild
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: macos-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: true
|
||||
- name: brew
|
||||
run: brew install ragel
|
||||
- name: xcodebuild
|
||||
run: xcodebuild -target TwoTerm | xcpretty
|
33
Emulators/Apple3.h
Normal file
33
Emulators/Apple3.h
Normal file
|
@ -0,0 +1,33 @@
|
|||
//
|
||||
// Apple3.h
|
||||
// 2Term
|
||||
//
|
||||
// Created by Kelvin Sherlock on 12/24/2018.
|
||||
// Copyright 2018 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
#import "Emulator.h"
|
||||
#include "iGeometry.h"
|
||||
#include "Screen.h"
|
||||
|
||||
|
||||
struct iii_context : public context {
|
||||
unsigned cursor_control = 0b1101;
|
||||
unsigned fg_color = 0;
|
||||
unsigned bg_color = 0;
|
||||
unsigned mode = 2;
|
||||
};
|
||||
|
||||
@interface Apple3 : NSObject <Emulator>
|
||||
{
|
||||
unsigned cs;
|
||||
iii_context _context;
|
||||
iii_context _saved_context;
|
||||
Screen::CursorType _cursorType;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@end
|
466
Emulators/Apple3.mm.ragel
Normal file
466
Emulators/Apple3.mm.ragel
Normal file
|
@ -0,0 +1,466 @@
|
|||
//
|
||||
// Apple3.mm
|
||||
// 2Term
|
||||
//
|
||||
// Created by Kelvin Sherlock on 12/24/2018.
|
||||
// Copyright 2010 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
/*
|
||||
* See Apple III Standard Device Drivers Manual (ch 3, The Console Driver)
|
||||
* Also implemented via AppleWorks (which started life as III EZ Pieces)
|
||||
*
|
||||
* Apple III console can be 24 x 40 (BW), 24 x 40 (16 color), or 24 x 80 (BW).
|
||||
*
|
||||
*/
|
||||
|
||||
#import "Apple3.h"
|
||||
|
||||
#include <sys/ttydefaults.h>
|
||||
|
||||
#include "OutputChannel.h"
|
||||
#include "Screen.h"
|
||||
#include "algorithm.h"
|
||||
|
||||
#import "CharacterGenerator.h"
|
||||
|
||||
enum {
|
||||
kAdvance = 1 << 0,
|
||||
kLineFeed = 1 << 1,
|
||||
kWrap = 1 << 2,
|
||||
kScroll = 1 << 3,
|
||||
};
|
||||
|
||||
%%{
|
||||
machine console;
|
||||
alphtype unsigned int;
|
||||
|
||||
action nop {}
|
||||
|
||||
action advance {
|
||||
// advance cursor
|
||||
if (_context.cursor_control & kAdvance) {
|
||||
|
||||
|
||||
switch (_context.cursor_control & (kWrap | kScroll)) {
|
||||
default:
|
||||
if (cursor.x < window.maxX() - 1) ++cursor.x;
|
||||
break;
|
||||
case kWrap:
|
||||
if (cursor.x < window.maxX() - 1) ++cursor.x;
|
||||
else {
|
||||
cursor.x = window.minX();
|
||||
if (cursor.y < window.maxY() - 1) ++cursor.y;
|
||||
}
|
||||
break;
|
||||
case kWrap | kScroll:
|
||||
if (cursor.x < window.maxX() - 1) ++cursor.x;
|
||||
else {
|
||||
cursor.x = window.minX();
|
||||
if (cursor.y < window.maxY() - 1) ++cursor.y;
|
||||
else screen->scrollUp(window);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
action setx {
|
||||
/* horizontal position */
|
||||
int x = (unsigned)fc;
|
||||
x += window.minX();
|
||||
cursor.x = std::min(x, window.maxX() - 1);
|
||||
}
|
||||
|
||||
action sety {
|
||||
/* vertical position */
|
||||
int y = (unsigned)fc;
|
||||
y += window.minY();
|
||||
cursor.y = std::min(y, window.maxY() - 1);
|
||||
}
|
||||
|
||||
# arg1 = any ${ _scratch[0] = fc; };
|
||||
# arg2 = any ${ _scratch[1] = fc; };
|
||||
|
||||
|
||||
|
||||
|
||||
main := (
|
||||
0x00 $nop
|
||||
| 0x01 ${
|
||||
/* save viewport and reset */
|
||||
_saved_context = _context;
|
||||
window = iRect(0, 0, 80, 24);
|
||||
/* currently ignores mode */
|
||||
}
|
||||
| 0x02 ${
|
||||
/* set viewport top */
|
||||
iPoint tl = cursor;
|
||||
iPoint br = window.bottomRight();
|
||||
_context.window = iRect(tl, br);
|
||||
}
|
||||
| 0x03 ${
|
||||
/* set viewport bottom */
|
||||
iPoint tl = _context.window.topLeft();
|
||||
iPoint br = _context.cursor.offset(1,1);
|
||||
_context.window = iRect(tl, br);
|
||||
}
|
||||
| 0x04 ${
|
||||
/* restore viewport */
|
||||
_context = _saved_context;
|
||||
}
|
||||
|
||||
| 0x05 ${
|
||||
/* E - $05 - Turns cursor on (enables cursor display) */
|
||||
screen->setCursorType(Screen::CursorTypeUnderscore);
|
||||
}
|
||||
|
||||
| 0x06 ${
|
||||
/* F - $06 - Turns cursor off (disables cursor display) */
|
||||
screen->setCursorType(Screen::CursorTypeNone);
|
||||
}
|
||||
|
||||
| 0x07 ${
|
||||
/* Beep */
|
||||
NSBeep();
|
||||
}
|
||||
|
||||
| 0x08 ${
|
||||
/* Moves cursor left */
|
||||
|
||||
if (cursor.x > window.minX()) --cursor.x;
|
||||
else if (_context.cursor_control & kWrap) {
|
||||
cursor.x = window.maxX() - 1;
|
||||
|
||||
if (cursor.y > window.minY()) --cursor.y;
|
||||
else if (_context.cursor_control & kScroll) {
|
||||
screen->scrollDown(window);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
| 0x09 ${
|
||||
/* move cursor right */
|
||||
|
||||
if (cursor.x < window.maxX()-1) ++cursor.x;
|
||||
else if (_context.cursor_control & kWrap) {
|
||||
cursor.x = window.minX();
|
||||
|
||||
if (cursor.y < window.maxY()-1) ++cursor.y;
|
||||
else if (_context.cursor_control & kScroll) {
|
||||
screen->scrollUp(window);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
| 0x0a ${
|
||||
/* move cursor down */
|
||||
if (cursor.y < window.maxY() - 1) ++cursor.y;
|
||||
else if (_context.cursor_control & kScroll) {
|
||||
screen->scrollUp(window);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
| 0x0b ${
|
||||
/* move cursor up */
|
||||
if (cursor.y > window.minY()) --cursor.y;
|
||||
else if (_context.cursor_control & kScroll) {
|
||||
screen->scrollDown(window);
|
||||
}
|
||||
}
|
||||
|
||||
| 0x0c ${
|
||||
/* home */
|
||||
cursor = iPoint(window.topLeft());
|
||||
}
|
||||
|
||||
| 0x0d ${
|
||||
/* carriage return */
|
||||
/* also LF depending on cursor motion */
|
||||
cursor.x = window.minX();
|
||||
if (_context.cursor_control & kLineFeed) {
|
||||
|
||||
if (cursor.y < window.maxY() - 1) ++cursor.y;
|
||||
else if (_context.cursor_control & kScroll) {
|
||||
screen->scrollUp(window);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
| 0x0e ${
|
||||
/* turn screen off ... */
|
||||
}
|
||||
|
||||
| 0x0f ${
|
||||
/* turn screen on ... */
|
||||
}
|
||||
|
||||
| 0x10 any ${
|
||||
/* set text mode (40 vs 80, color vs bw) */
|
||||
_context.mode = fc & 0x03;
|
||||
}
|
||||
|
||||
| 0x11 ${
|
||||
/* normal text */
|
||||
_context.clearFlagBit(Screen::FlagInverse);
|
||||
}
|
||||
| 0x12 ${
|
||||
/* invert text */
|
||||
_context.setFlagBit(Screen::FlagInverse);
|
||||
}
|
||||
|
||||
| 0x13 any ${
|
||||
/* set foreground text color */
|
||||
_context.fg_color = fc & 0x0f;
|
||||
}
|
||||
|
||||
| 0x14 any ${
|
||||
/* set background text color */
|
||||
_context.bg_color = fc & 0x0f;
|
||||
}
|
||||
|
||||
| 0x15 any ${
|
||||
/* set cursor motion control */
|
||||
_context.cursor_control = fc & 0x0f;
|
||||
}
|
||||
|
||||
# sync
|
||||
| 0x16 $nop
|
||||
|
||||
| 0x17 any ${
|
||||
/* horizontal shift */
|
||||
int count = (int8_t)fc;
|
||||
/* if > 0, shift right */
|
||||
if (count > 0) screen->scrollRight(window, count);
|
||||
/* if < 0, shift left */
|
||||
if (count < 0) screen->scrollLeft(window, -count);
|
||||
}
|
||||
|
||||
# horizontal position
|
||||
| 0x18 any $setx
|
||||
# vertical position
|
||||
| 0x19 any $sety
|
||||
# horizontal + vertical position
|
||||
| 0x1a any $setx any $sety
|
||||
|
||||
# esc - reserved
|
||||
| 0x1b $nop
|
||||
|
||||
| 0x1c ${
|
||||
/* HOME + clear viewport */
|
||||
cursor = window.topLeft();
|
||||
screen->eraseRect(window);
|
||||
}
|
||||
|
||||
| 0x1d ${
|
||||
/* clear to end of viewport */
|
||||
iRect r(cursor, window.bottomRight());
|
||||
r.size.height = 1;
|
||||
screen->eraseRect(r);
|
||||
|
||||
r = iRect(window.minX(), cursor.y + 1, window.width(), window.maxY() - cursor.y - 1);
|
||||
screen->eraseRect(r);
|
||||
}
|
||||
|
||||
| 0x1e ${
|
||||
/* move to left edge of viewport, clear line */
|
||||
cursor.y = window.minY();
|
||||
iRect r(cursor, window.bottomRight());
|
||||
r.size.height = 1;
|
||||
screen->eraseRect(r);
|
||||
}
|
||||
|
||||
| 0x1f ${
|
||||
/* clear to end of line */
|
||||
iRect r(cursor, window.bottomRight());
|
||||
r.size.height = 1;
|
||||
screen->eraseRect(r);
|
||||
|
||||
}
|
||||
|
||||
| 0x20 .. 0x7f ${
|
||||
screen->putc(fc, _context);
|
||||
} $advance
|
||||
|
||||
| 0x80 .. 0x9f ${
|
||||
/* display control char? */
|
||||
}
|
||||
| 0xa0 .. 0xff ${
|
||||
screen->putc(fc & 0x7f, _context);
|
||||
} $advance
|
||||
|
||||
|
||||
)* $err{ fgoto main; };
|
||||
|
||||
write data;
|
||||
}%%
|
||||
|
||||
@implementation Apple3
|
||||
|
||||
+(void)load {
|
||||
[EmulatorManager registerClass: self];
|
||||
}
|
||||
|
||||
- (NSString *)name {
|
||||
return @"Apple III";
|
||||
}
|
||||
|
||||
|
||||
+ (NSString *)name {
|
||||
return @"Apple III";
|
||||
|
||||
}
|
||||
|
||||
|
||||
- (const char *)termName {
|
||||
return "appleIII";
|
||||
}
|
||||
|
||||
|
||||
-(void)reset: (BOOL)hard
|
||||
{
|
||||
|
||||
%%write init;
|
||||
_context.flags = 0;
|
||||
_cursorType = Screen::CursorTypeUnderscore;
|
||||
|
||||
_context.fg_color = 15; /* white */
|
||||
_context.bg_color = 0; /* black */
|
||||
_context.cursor_control = kScroll | kWrap | kAdvance;
|
||||
|
||||
if (hard) {
|
||||
_context.window = iRect(0, 0, 80, 24);
|
||||
_context.cursor = iPoint(0,0);
|
||||
_context.mode = 2;
|
||||
|
||||
_saved_context = iii_context();
|
||||
}
|
||||
}
|
||||
|
||||
-(BOOL)resizable
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
|
||||
-(struct winsize)defaultSize
|
||||
{
|
||||
struct winsize ws = { 24, 80, 0, 0 };
|
||||
|
||||
return ws;
|
||||
}
|
||||
|
||||
-(void)initTerm: (struct termios *)term
|
||||
{
|
||||
// Control-U is used by the up-arrow key.
|
||||
term->c_cc[VKILL] = CTRL('X');
|
||||
// tab is right arrow, so expand to spaces.
|
||||
term->c_oflag |= OXTABS;
|
||||
}
|
||||
|
||||
-(id)init
|
||||
{
|
||||
if ((self = [super init]))
|
||||
{
|
||||
[self reset: YES];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
-(void)processData:(uint8_t *)data length: (size_t)length screen:(Screen *)screen output:(OutputChannel *)output
|
||||
{
|
||||
|
||||
const uint8_t *eof = nullptr;
|
||||
const uint8_t *p = data;
|
||||
const uint8_t *pe = data + length;
|
||||
|
||||
auto &cursor = _context.cursor;
|
||||
auto &window = _context.window;
|
||||
auto &cursor_control = _context.cursor_control;
|
||||
|
||||
%%write exec;
|
||||
|
||||
screen->setCursor(cursor);
|
||||
|
||||
}
|
||||
|
||||
|
||||
-(void)keyDown:(NSEvent *)event screen:(Screen *)screen output:(OutputChannel *)output
|
||||
{
|
||||
NSEventModifierFlags flags = [event modifierFlags];
|
||||
NSString *chars = [event charactersIgnoringModifiers];
|
||||
|
||||
NSUInteger length = [chars length];
|
||||
|
||||
for (unsigned i = 0; i < length; ++i)
|
||||
{
|
||||
unichar uc = [chars characterAtIndex: i];
|
||||
|
||||
switch (uc)
|
||||
{
|
||||
case NSEnterCharacter:
|
||||
output->write(CTRL('M'));
|
||||
break;
|
||||
/*
|
||||
case NSDeleteCharacter:
|
||||
output->write(0x7f);
|
||||
break;
|
||||
*/
|
||||
|
||||
|
||||
// the Apple II keyboard had a delete where the backspace key was.
|
||||
// it functions as a backspace key.
|
||||
case NSBackspaceCharacter:
|
||||
output->write(0x7f);
|
||||
break;
|
||||
|
||||
case NSLeftArrowFunctionKey:
|
||||
output->write(CTRL('H'));
|
||||
break;
|
||||
|
||||
case NSRightArrowFunctionKey:
|
||||
output->write(CTRL('U'));
|
||||
break;
|
||||
|
||||
case NSUpArrowFunctionKey:
|
||||
output->write(CTRL('K'));
|
||||
break;
|
||||
|
||||
case NSDownArrowFunctionKey:
|
||||
output->write(CTRL('J'));
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
if (uc <= 0x7f)
|
||||
{
|
||||
char c = uc;
|
||||
|
||||
//NSLog(@"%@", event);
|
||||
|
||||
if (flags & NSAlphaShiftKeyMask)
|
||||
{
|
||||
c = flags & NSShiftKeyMask ? tolower(c) : toupper(c);
|
||||
}
|
||||
|
||||
if (flags & NSControlKeyMask)
|
||||
c = CTRL(c);
|
||||
|
||||
output->write(c);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
|
|
@ -34,7 +34,7 @@
|
|||
}
|
||||
|
||||
action answerback {
|
||||
output->write(ESC "[?1;0c");
|
||||
/* no answerback string */
|
||||
}
|
||||
|
||||
|
||||
|
@ -84,7 +84,7 @@
|
|||
#
|
||||
action cursor_up {
|
||||
/* cursor up */
|
||||
unsigned count = _flags.DECANM ? std::min(1u, _args.front()) : 1;
|
||||
unsigned count = _flags.DECANM ? std::max(1u, _args.front()) : 1;
|
||||
|
||||
if (cursor_in_region()) {
|
||||
cursor.y = clamp(cursor.y - count, region_y.first, region_y.second);
|
||||
|
@ -94,7 +94,7 @@
|
|||
}
|
||||
action cursor_down {
|
||||
/* cursor down */
|
||||
unsigned count = _flags.DECANM ? std::min(1u, _args.front()) : 1;
|
||||
unsigned count = _flags.DECANM ? std::max(1u, _args.front()) : 1;
|
||||
|
||||
if (cursor_in_region()) {
|
||||
cursor.y = clamp(cursor.y + count, region_y.first, region_y.second);
|
||||
|
@ -105,13 +105,13 @@
|
|||
|
||||
action cursor_left {
|
||||
/* cursor left */
|
||||
unsigned count = _flags.DECANM ? std::min(1u, _args.front()) : 1;
|
||||
unsigned count = _flags.DECANM ? std::max(1u, _args.front()) : 1;
|
||||
cursor.x = clamp(cursor.x - count, window_x.first, window_x.second);
|
||||
}
|
||||
|
||||
action cursor_right {
|
||||
/* cursor right */
|
||||
unsigned count = _flags.DECANM ? std::min(1u, _args.front()) : 1;
|
||||
unsigned count = _flags.DECANM ? std::max(1u, _args.front()) : 1;
|
||||
cursor.x = clamp(cursor.x + count, window_x.first, window_x.second);
|
||||
}
|
||||
|
||||
|
@ -297,6 +297,7 @@
|
|||
|
||||
iRect tmp(0, cursor.y + 1, 80, 24 - cursor.y - 1);
|
||||
screen->eraseRect(tmp);
|
||||
break;
|
||||
}
|
||||
case 1: {
|
||||
// 0 ... x
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
B69E32A920221C9E0086D7B1 /* ChildMonitor.mm in Sources */ = {isa = PBXBuildFile; fileRef = B69E32A820221C9E0086D7B1 /* ChildMonitor.mm */; };
|
||||
B6ACA2AD1E614E38000E774B /* VT52.mm in Sources */ = {isa = PBXBuildFile; fileRef = B612F46312DD5DF1005D1B77 /* VT52.mm */; };
|
||||
B6ACA2AF1E635CEC000E774B /* vt52-charset.png in Resources */ = {isa = PBXBuildFile; fileRef = B6ACA2AE1E635CEC000E774B /* vt52-charset.png */; };
|
||||
B6C0909021D292E20067F7A4 /* Apple3.mm.ragel in Sources */ = {isa = PBXBuildFile; fileRef = B6C0908D21D1BBE70067F7A4 /* Apple3.mm.ragel */; };
|
||||
B6C21CCE2033382B00671774 /* TabClose_Busy.tiff in Resources */ = {isa = PBXBuildFile; fileRef = B6C21CC82033382A00671774 /* TabClose_Busy.tiff */; };
|
||||
B6C21CCF2033382B00671774 /* TabClose_Busy_Pressed.tiff in Resources */ = {isa = PBXBuildFile; fileRef = B6C21CC92033382A00671774 /* TabClose_Busy_Pressed.tiff */; };
|
||||
B6C21CD02033382B00671774 /* TabClose.tiff in Resources */ = {isa = PBXBuildFile; fileRef = B6C21CCA2033382A00671774 /* TabClose.tiff */; };
|
||||
|
@ -77,6 +78,8 @@
|
|||
isa = PBXBuildRule;
|
||||
compilerSpec = "com.apple.build-tasks.copy-strings-file";
|
||||
fileType = sourcecode.glsl;
|
||||
inputFiles = (
|
||||
);
|
||||
isEditable = 1;
|
||||
outputFiles = (
|
||||
);
|
||||
|
@ -87,6 +90,8 @@
|
|||
compilerSpec = com.apple.compilers.proxy.script;
|
||||
filePatterns = "*.mm.ragel";
|
||||
fileType = pattern.proxy;
|
||||
inputFiles = (
|
||||
);
|
||||
isEditable = 1;
|
||||
outputFiles = (
|
||||
"$(DERIVED_SOURCES_DIR)/$(INPUT_FILE_BASE)",
|
||||
|
@ -108,10 +113,8 @@
|
|||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
|
||||
13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; };
|
||||
1DDD58150DA1D0A300B32029 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = "<group>"; };
|
||||
256AC3D80F4B6AC300CF3369 /* TwoTermAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TwoTermAppDelegate.h; sourceTree = "<group>"; };
|
||||
256AC3D90F4B6AC300CF3369 /* TwoTermAppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = TwoTermAppDelegate.mm; sourceTree = "<group>"; };
|
||||
256AC3F00F4B6AF500CF3369 /* TwoTerm_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TwoTerm_Prefix.pch; sourceTree = "<group>"; };
|
||||
|
@ -163,10 +166,8 @@
|
|||
B61D0D68125B8E06001C713B /* Defaults.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Defaults.m; sourceTree = "<group>"; };
|
||||
B61EF7C31481561E008C1891 /* titlebar-corner.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "titlebar-corner.png"; sourceTree = "<group>"; };
|
||||
B61EF7C41481561E008C1891 /* titlebar-middle.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "titlebar-middle.png"; sourceTree = "<group>"; };
|
||||
B61EF7C814815AF8008C1891 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/NewTerminal.xib; sourceTree = "<group>"; };
|
||||
B61EF7CA14815E07008C1891 /* TitleBarView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TitleBarView.h; sourceTree = "<group>"; };
|
||||
B61EF7CB14815E07008C1891 /* TitleBarView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TitleBarView.m; sourceTree = "<group>"; };
|
||||
B61EF7CE148163E7008C1891 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/TitleBarView.xib; sourceTree = "<group>"; };
|
||||
B61EF7D41482FB6D008C1891 /* titlebar-center.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "titlebar-center.png"; sourceTree = "<group>"; };
|
||||
B61EF7D51482FB6D008C1891 /* titlebar-left.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "titlebar-left.png"; sourceTree = "<group>"; };
|
||||
B61EF7D61482FB6D008C1891 /* titlebar-right.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "titlebar-right.png"; sourceTree = "<group>"; };
|
||||
|
@ -176,20 +177,27 @@
|
|||
B66412381480A070003BC8D3 /* EmulatorWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EmulatorWindow.m; sourceTree = "<group>"; };
|
||||
B676063911DEAD3500D6B66C /* TermWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TermWindowController.h; sourceTree = "<group>"; };
|
||||
B676063A11DEAD3500D6B66C /* TermWindowController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = TermWindowController.mm; sourceTree = "<group>"; };
|
||||
B676064D11DEBAE300D6B66C /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/TermWindow.xib; sourceTree = "<group>"; };
|
||||
B67B3CE312B6FA040033AE07 /* a2-charset-40.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "a2-charset-40.png"; sourceTree = "<group>"; };
|
||||
B67B3CE412B6FA040033AE07 /* a2-charset-80.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "a2-charset-80.png"; sourceTree = "<group>"; };
|
||||
B6801BD812EB549300B22E9E /* vt100-charset.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "vt100-charset.png"; sourceTree = "<group>"; };
|
||||
B683F70E2049E7B000470B99 /* VT50.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VT50.h; sourceTree = "<group>"; };
|
||||
B683F70F2049E7B000470B99 /* VT50.mm.ragel */ = {isa = PBXFileReference; lastKnownFileType = text; path = VT50.mm.ragel; sourceTree = "<group>"; };
|
||||
B683F711204AE32900470B99 /* VT05.mm.ragel */ = {isa = PBXFileReference; lastKnownFileType = text; path = VT05.mm.ragel; sourceTree = "<group>"; };
|
||||
B6887810235CD76A00407374 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
|
||||
B6887811235CD76A00407374 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/TermWindow.xib; sourceTree = "<group>"; };
|
||||
B6887812235CD76A00407374 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/NewTerminal.xib; sourceTree = "<group>"; };
|
||||
B6887813235CD76B00407374 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/TermConfig.xib; sourceTree = "<group>"; };
|
||||
B6887814235CD76B00407374 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/TitleBarView.xib; sourceTree = "<group>"; };
|
||||
B6887815235CD77600407374 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
B68A37D621A9D45A004CBDE4 /* TwoTerm.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = TwoTerm.entitlements; path = TwoTerm/TwoTerm.entitlements; sourceTree = "<group>"; };
|
||||
B68E632812FF909C00EAFF5F /* ExampleView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExampleView.h; sourceTree = "<group>"; };
|
||||
B68E632912FF909C00EAFF5F /* ExampleView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ExampleView.m; sourceTree = "<group>"; };
|
||||
B69D0FB9202799B10073CCB7 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/TermConfig.xib; sourceTree = "<group>"; };
|
||||
B69E32A820221C9E0086D7B1 /* ChildMonitor.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = ChildMonitor.mm; sourceTree = "<group>"; };
|
||||
B69E32AA20221CCA0086D7B1 /* ChildMonitor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ChildMonitor.h; sourceTree = "<group>"; };
|
||||
B6ACA2AB1E5C8BEC000E774B /* GNOConsole.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GNOConsole.mm; sourceTree = "<group>"; };
|
||||
B6ACA2AE1E635CEC000E774B /* vt52-charset.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "vt52-charset.png"; sourceTree = "<group>"; };
|
||||
B6C0908D21D1BBE70067F7A4 /* Apple3.mm.ragel */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Apple3.mm.ragel; sourceTree = "<group>"; };
|
||||
B6C0908F21D1D2070067F7A4 /* Apple3.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Apple3.h; sourceTree = "<group>"; };
|
||||
B6C173901D31D2B80024E360 /* GSOSConsole.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GSOSConsole.h; sourceTree = "<group>"; };
|
||||
B6C173911D31D2B80024E360 /* GSOSConsole.mm.ragel */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = GSOSConsole.mm.ragel; sourceTree = "<group>"; };
|
||||
B6C173941D35546A0024E360 /* algorithm.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = algorithm.h; sourceTree = "<group>"; };
|
||||
|
@ -279,6 +287,7 @@
|
|||
29B97314FDCFA39411CA2CEA /* 2Term */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B68A37D621A9D45A004CBDE4 /* TwoTerm.entitlements */,
|
||||
B612F46B12DD5E02005D1B77 /* Views */,
|
||||
B612F45512DD5DF1005D1B77 /* Emulators */,
|
||||
B612F44612DD5DAD005D1B77 /* cpp */,
|
||||
|
@ -365,7 +374,9 @@
|
|||
B612F45912DD5DF1005D1B77 /* EmulatorManager.mm */,
|
||||
B612F45612DD5DF1005D1B77 /* Apple80.h */,
|
||||
B612F45712DD5DF1005D1B77 /* Apple80.mm.ragel */,
|
||||
B6C0908D21D1BBE70067F7A4 /* Apple3.mm.ragel */,
|
||||
B612F45A12DD5DF1005D1B77 /* GNOConsole.h */,
|
||||
B6C0908F21D1D2070067F7A4 /* Apple3.h */,
|
||||
B612F45B12DD5DF1005D1B77 /* GNOConsole.mm.ragel */,
|
||||
B6ACA2AB1E5C8BEC000E774B /* GNOConsole.mm */,
|
||||
B6C173901D31D2B80024E360 /* GSOSConsole.h */,
|
||||
|
@ -471,15 +482,25 @@
|
|||
29B97313FDCFA39411CA2CEA /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastUpgradeCheck = 0930;
|
||||
LastUpgradeCheck = 1110;
|
||||
TargetAttributes = {
|
||||
8D1107260486CEB800E47090 = {
|
||||
ProvisioningStyle = Automatic;
|
||||
SystemCapabilities = {
|
||||
com.apple.HardenedRuntime = {
|
||||
enabled = 1;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "TwoTerm" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
developmentRegion = English;
|
||||
developmentRegion = en;
|
||||
hasScannedForEncodings = 1;
|
||||
knownRegions = (
|
||||
en,
|
||||
English,
|
||||
Base,
|
||||
);
|
||||
mainGroup = 29B97314FDCFA39411CA2CEA /* 2Term */;
|
||||
projectDirPath = "";
|
||||
|
@ -553,6 +574,7 @@
|
|||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
B675F4A91E561D20004B0D9C /* Apple80.mm.ragel in Sources */,
|
||||
B6C0909021D292E20067F7A4 /* Apple3.mm.ragel in Sources */,
|
||||
B675F4AC1E56A7F2004B0D9C /* GSOSConsole.mm.ragel in Sources */,
|
||||
B6D1CD071E577E7D00C4A6BC /* PTSE.mm.ragel in Sources */,
|
||||
B683F7102049E7B000470B99 /* VT50.mm.ragel in Sources */,
|
||||
|
@ -591,7 +613,7 @@
|
|||
089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
089C165DFE840E0CC02AAC07 /* English */,
|
||||
B6887815235CD77600407374 /* en */,
|
||||
);
|
||||
name = InfoPlist.strings;
|
||||
sourceTree = "<group>";
|
||||
|
@ -599,7 +621,7 @@
|
|||
1DDD58140DA1D0A300B32029 /* MainMenu.xib */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
1DDD58150DA1D0A300B32029 /* English */,
|
||||
B6887810235CD76A00407374 /* Base */,
|
||||
);
|
||||
name = MainMenu.xib;
|
||||
sourceTree = "<group>";
|
||||
|
@ -607,7 +629,7 @@
|
|||
B61EF7C714815AF8008C1891 /* NewTerminal.xib */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
B61EF7C814815AF8008C1891 /* English */,
|
||||
B6887812235CD76A00407374 /* Base */,
|
||||
);
|
||||
name = NewTerminal.xib;
|
||||
sourceTree = "<group>";
|
||||
|
@ -615,7 +637,7 @@
|
|||
B61EF7CD148163E7008C1891 /* TitleBarView.xib */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
B61EF7CE148163E7008C1891 /* English */,
|
||||
B6887814235CD76B00407374 /* Base */,
|
||||
);
|
||||
name = TitleBarView.xib;
|
||||
sourceTree = "<group>";
|
||||
|
@ -623,7 +645,7 @@
|
|||
B676065011DEBAE900D6B66C /* TermWindow.xib */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
B676064D11DEBAE300D6B66C /* English */,
|
||||
B6887811235CD76A00407374 /* Base */,
|
||||
);
|
||||
name = TermWindow.xib;
|
||||
sourceTree = "<group>";
|
||||
|
@ -631,7 +653,7 @@
|
|||
B69D0FB8202799B10073CCB7 /* TermConfig.xib */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
B69D0FB9202799B10073CCB7 /* English */,
|
||||
B6887813235CD76B00407374 /* Base */,
|
||||
);
|
||||
name = TermConfig.xib;
|
||||
sourceTree = "<group>";
|
||||
|
@ -645,8 +667,12 @@
|
|||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CODE_SIGN_IDENTITY = "-";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_MODEL_TUNING = G5;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
|
@ -656,6 +682,7 @@
|
|||
INSTALL_PATH = "$(HOME)/Applications";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.ksherlock.${PRODUCT_NAME:rfc1034identifier}";
|
||||
PRODUCT_NAME = TwoTerm;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
|
@ -665,8 +692,11 @@
|
|||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CODE_SIGN_IDENTITY = "-";
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
DEVELOPMENT_TEAM = "";
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
GCC_MODEL_TUNING = G5;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = TwoTerm_Prefix.pch;
|
||||
|
|
5
TwoTerm/TwoTerm.entitlements
Normal file
5
TwoTerm/TwoTerm.entitlements
Normal file
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict/>
|
||||
</plist>
|
|
@ -343,9 +343,9 @@
|
|||
{
|
||||
|
||||
// mouse text actually requires mouse text and inverse to be on.
|
||||
if (flag & Screen::FlagMouseText)
|
||||
if ((flag & Screen::FlagMouseText) && c >= '@' && c <= '_')
|
||||
{
|
||||
if (c >= '@' && c <= '_') c |= 0x80;
|
||||
c |= 0x80;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit b91763ed705d32ec0fc7cbdca84f9d597696b050
|
||||
Subproject commit c7b95dda17a1239b303d01eeca8c8f9fba3d2131
|
Loading…
Reference in New Issue
Block a user