You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
267 lines
6.4 KiB
267 lines
6.4 KiB
--- a/pty.C
|
|
+++ b/pty.C
|
|
@@ -4,9 +4,18 @@
|
|
int Pty::child = 0;
|
|
struct termios Pty::tt;
|
|
int Pty::wfd = 0;
|
|
+char Pty::buf[] = "";
|
|
+char Pty::funcstr[] = "";
|
|
int Pty::hs = 0;
|
|
+char* Pty::so = 0;
|
|
+char* Pty::se = 0;
|
|
+char* Pty::us = 0;
|
|
+char* Pty::ue = 0;
|
|
+char* Pty::sc = 0;
|
|
+char* Pty::rc = 0;
|
|
char* Pty::ce = 0;
|
|
char* Pty::ts = 0;
|
|
+char* Pty::fs = 0;
|
|
char* Pty::ds = 0;
|
|
char Pty::endstr[] = "";
|
|
char Pty::endmsg[] = "";
|
|
@@ -14,88 +23,7 @@
|
|
// コンストラクタだよん
|
|
Pty::Pty(int ac, char** av, char* amsg, char* emsg)
|
|
{
|
|
- // 環境変数 TERM のエントリを取得
|
|
- char buff[BUFSIZ];
|
|
- char* term = getenv("TERM");
|
|
- if (!term)
|
|
- term = "vt100";
|
|
- int ret = tgetent(buff, term);
|
|
- if (ret != 1) {
|
|
- tgetent(buff, "vt100");
|
|
- putenv("TERM=vt100");
|
|
- }
|
|
-
|
|
- // termcap から装飾用のエントリを取ってくる
|
|
- char funcstr[BUFSIZ];
|
|
- char* pt = funcstr;
|
|
-
|
|
- // スタンドアウト (反転)
|
|
- so = tgetstr("so", &pt);
|
|
- adjstr(so);
|
|
- se = tgetstr("se", &pt);
|
|
- adjstr(se);
|
|
-
|
|
- // アンダーライン (下線)
|
|
- us = tgetstr("us", &pt);
|
|
- adjstr(us);
|
|
- ue = tgetstr("ue", &pt);
|
|
- adjstr(ue);
|
|
-
|
|
- // カーソル位置の保存,保存した位置への復帰
|
|
- sc = tgetstr("sc", &pt);
|
|
- adjstr(sc);
|
|
- rc = tgetstr("rc", &pt);
|
|
- adjstr(rc);
|
|
-
|
|
- // カーソル位置から行の最後までを削除する
|
|
- ce = tgetstr("ce", &pt);
|
|
- adjstr(ce);
|
|
-
|
|
- // ステータスラインを持っているかどうか
|
|
- hs = tgetflag("hs");
|
|
-
|
|
- // kon と jfbterm ではステータスラインを使わない
|
|
- if (strcmp(term, "kon") == 0)
|
|
- hs = 0;
|
|
- if (strcmp(term, "jfbterm") == 0)
|
|
- hs = 0;
|
|
-
|
|
- // ステータスラインへ移動,戻る
|
|
- if (hs) {
|
|
- ts = tgoto(tgetstr("ts", &pt), 0, 0);
|
|
- adjstr(ts);
|
|
- fs = tgetstr("fs", &pt);
|
|
- adjstr(fs);
|
|
- ds = tgetstr("ds", &pt);
|
|
- adjstr(ds);
|
|
- if (ds) {
|
|
- strcat(endstr, ds);
|
|
- strcat(endstr, ce);
|
|
- }
|
|
- }
|
|
- else {
|
|
- char* cs = tgoto(tgetstr("cs", &pt), tgetnum("li") - 2, 0);
|
|
- adjstr(cs);
|
|
- if (cs) {
|
|
- write(1, ce, strlen(ce));
|
|
- write(1, cs, strlen(cs));
|
|
- }
|
|
- char* cl = tgetstr("cl", &pt);
|
|
- adjstr(cl);
|
|
- if (cl) {
|
|
- write(1, cl, strlen(cl));
|
|
- strcat(endstr, cl);
|
|
- }
|
|
- ds = tgoto(tgetstr("cs", &pt), tgetnum("li") - 1, 0);
|
|
- adjstr(ds);
|
|
- if (ds) {
|
|
- strcat(endstr, ds);
|
|
- strcat(endstr, ce);
|
|
- }
|
|
- ts = tgoto(tgetstr("cm", &pt), 0, tgetnum("li") - 1);
|
|
- adjstr(ts);
|
|
- fs = rc;
|
|
- }
|
|
+ gettermcap();
|
|
|
|
// 開始と終了のメッセージ
|
|
if (amsg && ac == 1)
|
|
@@ -209,21 +137,75 @@
|
|
done();
|
|
}
|
|
|
|
-// termcap エントリからパディングを削除する
|
|
void
|
|
-Pty::adjstr(char* str)
|
|
+Pty::gettermcap()
|
|
{
|
|
- char* sp = strdup(str);
|
|
- char* p = sp;
|
|
- while (*p != '\0') {
|
|
- if (strncmp(p, "$<", 2) == 0) {
|
|
- while (*p != '>')
|
|
- p++;
|
|
- *p = '\0';
|
|
+ // 環境変数 TERM のエントリを取得
|
|
+ char* term = getenv("TERM");
|
|
+ if (!term)
|
|
+ term = "vt100";
|
|
+ int ret = tgetent(buf, term);
|
|
+ if (ret != 1) {
|
|
+ tgetent(buf, "vt100");
|
|
+ putenv("TERM=vt100");
|
|
+ }
|
|
+
|
|
+ // termcap から装飾用のエントリを取ってくる
|
|
+ char* pt = funcstr;
|
|
+
|
|
+ // スタンドアウト (反転)
|
|
+ so = tgetstr("so", &pt);
|
|
+ se = tgetstr("se", &pt);
|
|
+
|
|
+ // アンダーライン (下線)
|
|
+ us = tgetstr("us", &pt);
|
|
+ ue = tgetstr("ue", &pt);
|
|
+
|
|
+ // カーソル位置の保存,保存した位置への復帰
|
|
+ sc = tgetstr("sc", &pt);
|
|
+ rc = tgetstr("rc", &pt);
|
|
+
|
|
+ // カーソル位置から行の最後までを削除する
|
|
+ ce = tgetstr("ce", &pt);
|
|
+
|
|
+ // ステータスラインを持っているかどうか
|
|
+ hs = tgetflag("hs");
|
|
+
|
|
+ // kon と jfbterm ではステータスラインを使わない
|
|
+ if (strcmp(term, "kon") == 0)
|
|
+ hs = 0;
|
|
+ if (strcmp(term, "jfbterm") == 0)
|
|
+ hs = 0;
|
|
+
|
|
+ // ステータスラインへ移動,戻る
|
|
+ if (hs) {
|
|
+ ts = tgoto(tgetstr("ts", &pt), 0, 0);
|
|
+ fs = tgetstr("fs", &pt);
|
|
+ ds = tgetstr("ds", &pt);
|
|
+ if (ds) {
|
|
+ strcat(endstr, ds);
|
|
+ strcat(endstr, ce);
|
|
}
|
|
- *str++ = *p++;
|
|
}
|
|
- free(sp);
|
|
+ else {
|
|
+ char* cs = tgoto(tgetstr("cs", &pt), tgetnum("li") - 2, 0);
|
|
+ if (cs) {
|
|
+ write(1, ce, strlen(ce));
|
|
+ write(1, cs, strlen(cs));
|
|
+ }
|
|
+ char* cl = tgetstr("cl", &pt);
|
|
+ if (cl) {
|
|
+ write(1, cl, strlen(cl));
|
|
+ strcat(endstr, cl);
|
|
+ }
|
|
+ ds = tgoto(tgetstr("cs", &pt), tgetnum("li") - 1, 0);
|
|
+ if (ds) {
|
|
+ strcat(endstr, ds);
|
|
+ strcat(endstr, ce);
|
|
+ }
|
|
+ ts = tgoto(tgetstr("cm", &pt), 0, tgetnum("li") - 1);
|
|
+ fs = rc;
|
|
+ }
|
|
}
|
|
|
|
// マスタデバイスを取る
|
|
@@ -327,34 +309,7 @@
|
|
{
|
|
signal(SIGWINCH, SIG_IGN);
|
|
|
|
- // ステータスラインが使えない場合は cs/ds/ts を取り直す
|
|
- if (!hs) {
|
|
- char buff[BUFSIZ];
|
|
- char* term = getenv("TERM");
|
|
- tgetent(buff, term);
|
|
- char funcstr[BUFSIZ];
|
|
- char* pt = funcstr;
|
|
- char* cs = tgoto(tgetstr("cs", &pt), tgetnum("li") - 2, 0);
|
|
- adjstr(cs);
|
|
- if (cs) {
|
|
- write(1, ce, strlen(ce));
|
|
- write(1, cs, strlen(cs));
|
|
- }
|
|
- char* cl = tgetstr("cl", &pt);
|
|
- adjstr(cl);
|
|
- if (cl) {
|
|
- write(1, cl, strlen(cl));
|
|
- strcpy(endstr, cl);
|
|
- }
|
|
- ds = tgoto(tgetstr("cs", &pt), tgetnum("li") - 1, 0);
|
|
- adjstr(ds);
|
|
- if (ds) {
|
|
- strcat(endstr, ds);
|
|
- strcat(endstr, ce);
|
|
- }
|
|
- ts = tgoto(tgetstr("cm", &pt), 0, tgetnum("li") - 1);
|
|
- adjstr(ts);
|
|
- }
|
|
+ gettermcap();
|
|
|
|
// ウィンドウのサイズを設定し直す (stty -a の 行数/桁数 等)
|
|
struct winsize win;
|
|
--- a/pty.H
|
|
+++ b/pty.H
|
|
@@ -50,18 +50,21 @@
|
|
int rfd;
|
|
static int wfd;
|
|
private:
|
|
- static void adjstr(char* str);
|
|
+ static char buf[BUFSIZ];
|
|
+ static char funcstr[BUFSIZ];
|
|
+private:
|
|
+ static void gettermcap();
|
|
protected:
|
|
static int hs;
|
|
- char* so;
|
|
- char* se;
|
|
- char* us;
|
|
- char* ue;
|
|
- char* sc;
|
|
- char* rc;
|
|
+ static char* so;
|
|
+ static char* se;
|
|
+ static char* us;
|
|
+ static char* ue;
|
|
+ static char* sc;
|
|
+ static char* rc;
|
|
static char* ce;
|
|
static char* ts;
|
|
- char* fs;
|
|
+ static char* fs;
|
|
static char* ds;
|
|
private:
|
|
static void finish();
|