4 Commits
r0 ... r1

Author SHA1 Message Date
Kelvin Sherlock
38dad13969 dispatch_io_create() is supposed to be the correct way to read from a stream. However, it doesn't seem to work and I believe it's due to poll() not working with pseudo terminals in OS X.
Leaving the code in just for fun.

Underlying issue - when the pty closes, the block doesn't always get notified so the fd doesn't close until the window closes.
2018-01-27 08:59:40 -05:00
Kelvin Sherlock
a6408fc242 in high sierra, estimated read size always seems to be 0. handle that situation. 2018-01-18 15:43:13 -05:00
Kelvin Sherlock
de8810b8e2 name edits. 2017-11-30 14:43:04 -05:00
Kelvin Sherlock
57021b2cba project update. 2017-11-30 14:42:48 -05:00
3 changed files with 43 additions and 13 deletions

View File

@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11762" systemVersion="16C67" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="13529" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11762"/>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="13529"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
@@ -10,13 +11,13 @@
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<menu title="AMainMenu" systemMenu="main" id="29">
<items>
<menuItem title="2Term" id="56">
<menu key="submenu" title="2Term" systemMenu="apple" id="57">
<menuItem title="TwoTerm" id="56" userLabel="TwoTerm">
<menu key="submenu" title="TwoTerm" systemMenu="apple" id="57">
<items>
<menuItem title="About 2Term" id="58">
<menuItem title="About TwoTerm" id="58">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontStandardAboutPanel:" target="-2" id="142"/>
@@ -35,7 +36,7 @@
<menuItem isSeparatorItem="YES" id="144">
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem>
<menuItem title="Hide 2Term" keyEquivalent="h" id="134">
<menuItem title="Hide TwoTerm" keyEquivalent="h" id="134">
<connections>
<action selector="hide:" target="-1" id="367"/>
</connections>
@@ -54,7 +55,7 @@
<menuItem isSeparatorItem="YES" id="149">
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem>
<menuItem title="Quit 2Term" keyEquivalent="q" id="136">
<menuItem title="Quit TwoTerm" keyEquivalent="q" id="136">
<connections>
<action selector="terminate:" target="-3" id="449"/>
</connections>
@@ -648,7 +649,7 @@
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Help" systemMenu="help" id="491">
<items>
<menuItem title="2Term Help" keyEquivalent="?" id="492">
<menuItem title="TwoTerm Help" keyEquivalent="?" id="492">
<connections>
<action selector="showHelp:" target="-1" id="493"/>
</connections>

View File

@@ -107,7 +107,7 @@
std::string s;
s.append("TERM_PROGRAM=2Term");
s.append("TERM_PROGRAM=TwoTerm");
s.append(1, (char)0);
s.append("LANG=C");
@@ -226,7 +226,33 @@
dispatch_resume(_wait_source);
}
#if 0
dispatch_io_t io = dispatch_io_create(DISPATCH_IO_STREAM, fd, queue, ^(int error){
close(fd);
NSLog(@"dispatch_io_create: %d", error);
});
dispatch_io_read(io, 0, SIZE_MAX, queue, ^(bool done, dispatch_data_t data, int error){
if (error) {
NSLog(@"dispatch_io_read: %d", error);
dispatch_io_close(io, DISPATCH_IO_STOP);
return;
}
dispatch_data_apply(data, ^(dispatch_data_t, size_t, const void *buffer, size_t size){
[_emulatorView processData: (uint8_t *)buffer size: size];
return true;
} );
if (done) {
NSLog(@"closing fd");
dispatch_io_close(io, DISPATCH_IO_STOP);
return;
}
});
#else
_read_source = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ,
fd, 0, queue);
if (_read_source)
@@ -236,7 +262,7 @@
static uint8_t sbuffer[1024];
size_t estimated = dispatch_source_get_data(_read_source);
estimated = std::max(estimated, sizeof(sbuffer));
uint8_t *buffer = estimated > sizeof(sbuffer) ? (uint8_t *)malloc(estimated) : sbuffer;
if (buffer)
@@ -244,7 +270,8 @@
ssize_t actual;
for (;;) {
actual = read(fd, buffer, (estimated));
actual = read(fd, buffer, estimated);
//fprintf(stderr, "read: %ld\n", actual);
if (actual < 0) {
if (errno == EINTR) continue;
@@ -266,7 +293,6 @@
if (buffer != sbuffer) free(buffer);
if (actual == 0) {
NSLog(@"closing fd");
dispatch_source_cancel(_read_source);
dispatch_release(_read_source);
_read_source = nullptr;
@@ -276,6 +302,7 @@
dispatch_source_set_cancel_handler(_read_source, ^{
NSLog(@"closing fd");
_fd = -1;
[_emulatorView setFd: -1];
close(fd);
@@ -283,6 +310,7 @@
dispatch_resume(_read_source);
}
#endif
}
#pragma mark -

View File

@@ -62,6 +62,7 @@
isEditable = 1;
outputFiles = (
);
script = "";
};
B6C173931D32A8840024E360 /* PBXBuildRule */ = {
isa = PBXBuildRule;