No description
Find a file
2012-06-24 22:45:41 +09:00
fonts * 必要ないファイルを削除 2012-06-20 18:50:23 +09:00
img * スクリーンショットを修正 2012-06-20 01:50:12 +09:00
info * OSCの廃止やeat newline glitchの実装に伴う修正 2012-06-22 01:46:08 +09:00
license/shinonome * 必要ないファイルを削除 2012-06-20 18:50:23 +09:00
misc * ちょっと修正 2012-06-22 01:48:31 +09:00
ChangeLog * version 0.1.4の変更点 2012-06-22 01:56:23 +09:00
color.h * indentで書式が乱れてたので整形しなおした 2012-06-24 22:45:41 +09:00
common.h * 制御文字を定義した.その他色々? 2012-06-24 22:41:02 +09:00
conf.h * 色の指定方法が変わったのと,pathも~が使えないようになったので,それらに合わせて変更 2012-06-24 22:42:39 +09:00
framebuffer.h * 色の参照方法とBOLD/REVERSEの処理を変更 2012-06-24 22:44:04 +09:00
function.h * 色の参照方法が変わったのでset_attr()を書きかえた 2012-06-24 22:44:40 +09:00
LICENSE * 誤植の修正 2012-06-22 02:46:06 +09:00
load.h * gcc -std=c99に伴う修正 2012-06-22 01:43:10 +09:00
makefile * CFLAGSを変更 2012-06-22 01:44:33 +09:00
parse.h * OSCを廃止したので関数が減った 2012-06-22 01:41:44 +09:00
README.markdown * BOLD/REVERSEの処理を変更 2012-06-24 22:36:52 +09:00
terminal.h * addch()をちょっと修正.グリフの幅は完全にフォント依存にした(グリフがないと強制的に幅0) 2012-06-24 22:39:39 +09:00
util.h * swap()を追加した 2012-06-24 22:45:19 +09:00
yaft.c * gcc -std=c99に伴っていくつか関数が使えなくなったので置き換えた 2012-06-22 01:45:15 +09:00
yaft_wall * 背景画像表示用のshell script 2012-06-20 17:33:49 +09:00

yaft - yet another framebuffer terminal

framebufferを用いたターミナルエミュレータです

vt102系のエミュレータを参考に作っていますが
今のところは完全な互換性はありません.

詳細はinfo/yaft.srcや後述するcontrol sequence listを参照してください

yaft

download

feature

  • UTF-8対応
    というか他のエンコードが一切使えません

  • East Asian Width
    ビットマップの幅を参照するので端末が文字幅を誤認することはありません

  • 256色
    xtermと同様の256色指定のエスケープシーケンスに対応しています

  • 壁紙表示
    起動直前のframebufferの内容を壁紙として取り込みます

configuration

コンパイル前にconf.hを編集して適切な設定に書き換えてください

path and terminal name

  • static char *font_path = "~/.fonts/shnm.yaft";
    fontのpathを設定します

  • static char *fb_path = "/dev/fb0";
    framebuffer deviceのpathを設定します

  • static char *shell_cmd = "/bin/bash";
    端末から起動するshellを設定します

  • static char *term_name = "TERM=yaft-256color";
    環境変数TERMの値を設定します

pathは全て絶対pathで記述します
font_pathの指定では$HOMEのパスを省略して~と書くことができます.

color

色は0xFFFFFF形式(RGBの順で各8bitずつ)かcolor.hでdefineされている色の名前を使用できます

  • DEFAULT_FG = GRAY,
    デフォルトの前景色

  • DEFAULT_BG = BLACK,
    デフォルトの背景色

  • CURSOR_COLOR = GREEN,
    カーソルの色の設定

色の定義を変えたい場合はcolor.hを書き換えてください

misc

  • DUMP = false,
    端末に送られてきたデータを標準出力にdumpします(デバッグ用)

  • DEBUG = false,
    parseの結果を標準エラー出力に表示します(デバッグ用)

  • LAZYDRAW = true,
    描画をサボるかどうか.見かけ上の描画速度が向上します

  • WALLPAPER = false,
    直前のframebufferの内容を壁紙として取り込むかどうか

  • OFFSET_X = 0,
    画面内のどこに端末を表示するかのオフセット値

  • OFFSET_Y = 0,
    同上

  • TERM_WIDTH = 0,
    端末のサイズ0を指定すると画面のサイズを使用します

  • TERM_HEIGHT = 0,
    同上

  • TABSTOP = 8,
    ハードウェアタブの幅

  • INTERVAL = 1000000,
    pollingの間隔をマイクロ秒単位で設定できます

端末サイズやオフセットの値が不正だった場合,フルスクリーンでの起動を試みます

install

$ make
$ make install-font
$ sudo make install

make installを使わなくても構いません
その場合は手動でticコマンドでterminfoをinstallしてください
またフォントをconf.hで設定した場所に忘れずに移動させてください

sampleとしてshinonome fontを変換したyaft用のフォントを同封しています
shinonome fontのライセンスについてはlisence/shinonome/以下のファイルを参照してください.

usage

コマンドラインオプションは存在しません.

$ yaft

troubleshooting

フォントがない!

$ ./yaft
/path/to/shnm.yaft
fopen: No such file or directory

フォントが適切な場所にあるかを確認してください.

グリフがない!

fonts must have DEFAULT_CHAR(U+20)

フォントにU+20(SPACE)が存在しているか確認してください.
SPACEのグリフが端末のセルサイズとして使われているのでないと起動できません

ALL 0のビットマップで良いので以下のように手動でエントリを追加してみてください(8x16のフォントの場合)

20
8 16
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00

framebufferがない

/dev/fb*
open: No such file or directory

BSD系ではpathが違う場合があるようです
/dev/fb0がない場合Linuxではgrubのkernelオプションにvga=773等と書くと良いかもしれません

通常framebufferの書き込みにはvideo groupのメンバである必要があります
hogeというユーザをvideo groupに追加するには以下のようにします

$ sudo gpasswd -a hoge video

変更を反映させるには一度logoutをする必要があります

screen上で色がおかしい

TERMの値がrxvt/xtermでない場合にANSI8-16の色が正常に表示されない場合があります
例えばrxvt-256colorという名前のsymbolic linkでyaftのterminfoを指して
TERM=rxvt-256color screenと起動すれば上手く表示されるかもしれません

$ export TERMINFO="$HOME/.terminfo/"
$ tic info/yaft.src
$ mkdir -p ~/.terminfo/r
$ ln -s ~/.terminfo/y/yaft ~/.terminfo/r/rxvt-256color
$ TERM=rxvt-256color screen

font

BDFを簡略化したフォント形式を使っています
各グリフは以下の情報を持っており,それがグリフの数だけ並んでいます.

code
width height
bitmap...

codeはUCS2のコードを10進で表記したものです
widthとheightはフォントの横幅と高さです(pixel)

bitmapにはBDFと同様にグリフのビットマップ情報が列挙されます(16進)
BDFと異なり一行には1バイト分のビットマップ情報しか書けません
バイト境界に合わない場合はLSB側に0をパディングします

また,バウンディングボックスの指定がないので,
ビットマップ情報としては常にwidth * height分の情報を記述しないといけません

bdf2yaft

misc/bdf2yaft.cppというプログラムを用いると
等幅BDFをyaftで用いているフォント形式に変換できます

その際変換テーブルを指定するとUnicode以外のBDFも変換できます

$ cd misc
$ make
$ ./bdf2yaft TABLE BDF1 BDF2 ...

複数のフォントに同じグリフが存在する場合,
後ろで指定したフォントのものが使われます.

変換テーブルの形式は変換元と変換先の文字コードを16進で列挙したものです
以下のような書式になっています.

  • ペアの区切りはタブでなければいけません
  • 先頭が#の行はコメントと見なされます
  • 3つめ以降のフィールドは無視されます
0x00	0x0000  # NULL
0x01	0x0001  # START OF HEADING
0x02	0x0002  # START OF TEXT
0x03	0x0003  # END OF TEXT
0x04	0x0004  # END OF TRANSMISSION
0x05	0x0005  # ENQUIRY
...

以下のような使い方もできます.

$ bdf2yaft BDF
$ cat BDF1 BDF2 ... | ./bdf2yaft

1番目のようにテーブルを指定しないと既にUnicodeのBDFであると見なされます
(この場合複数のBDFを指定することはできません)
また2番目のように複数のUnicodeのBDFをcatしてからbdf2yaftに渡すと
複数のBDFをmergeして1つのフォントを生成することができます

yaftmerge

$ ./yaftmerge BDF1 BDF2 ...

yaftmergeは変換済みのフォントをmergeすることができます
bdf2yaftと同様に複数のフォントに同じグリフが存在する場合
後ろで指定したフォントのものが使われます.

wallpaper

背景画像を表示したい場合にはconf.hのWALLPAPERをtrueにしてコンパイルした上で
yaft_wallを以下のように実行してください

$ ./yaft_wall /path/to/wallpaper.jpg

yaftがpathの通っている場所にインストールされている必要があります
画像の表示にはfbvを利用しています.
framebuffer上で画像が表示できるプログラムなら他のものでも構いません

control sequence list

listにないコントロールシーケンスは無視されます
記載されているものでも,完全には対応していない場合があります.

control character

0x00 - 0x1Fの範囲の制御コード

  • 0x08 bs
  • 0x09 tab
  • 0x0A nl
  • 0x0B nl
  • 0x0C nl
  • 0x0D cr
  • 0x1B enter_esc

0x7FのDELも無視されます

escape sequence

ESC(0x1B)ではじまるシーケンスのうちCSIでもOSCでもないもの

ESC *
  • 7 save_state
  • 8 restore_state
  • D nl
  • E crnl
  • H set_tabstop
  • M reverse_nl
  • Z identify
  • [ enter_csi
  • ] enter_osc
  • c ris

csi sequence

ESC [ *
  • @ insert_blank
  • A curs_up
  • B curs_down
  • C curs_forward
  • D curs_back
  • E curs_nl
  • F curs_pl
  • G curs_col
  • H curs_pos
  • J erase_display
  • K erase_line
  • L insert_line
  • M delete_line
  • P delete_char
  • X erase_char
  • a curs_forward
  • c identify
  • d curs_line
  • e curs_down
  • f curs_pos
  • g clear_tabstop
  • h set_mode
  • l reset_mode
  • m set_attr
  • n status_report
  • r set_margin
  • s save_state
  • u restore_state
  • ` curs_col

TODO

  • 32bpp以外の環境でも動作するようにする
  • スクロールバックの実装
  • BDFを直接読めるようにする
  • control sequence listをもうちょっと真面目に書く

license

MIT Licenseです

Copyright (c) 2012 haru

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.