rc/tk?
最近、WindowsのPowerShellを少しさわってみた。一見、パイプだけど、バイトストリームではなくて.NETオブジェクト間の通信になっていたりと、Windowsらしい作りで面白い。.NETオブジェクトにアクセスできるので、WinFormsを使ったGUIスクリプティングも可能だ。
rcでもGUIプログラミングできないかなと考えてみる。基本的にはデバイスファイルを読み書きすればいけるはずだし。
rioをmountすると、新規にウィンドウが作られる。通常、window(1)コマンドでウィンドウを作ると、ウィンドウ内でrcシェルが起動されるが、この場合は、空のウィンドウができる。
term% mount $wsys /n/rio new term% bind -b /n/rio /dev
そして、/n/rioを/devにbindすることで、/dev/wsysや/dev/consといったファイルは新しく作ったウィンドウに対応づけられる。つまり、
term% echo "Hello, world!" > /dev/cons
は、先ほど作ったウィンドウに表示される。
ウィンドウの最小化(hide)やリサイズなどのウィンドウに対するコントロールは/dev/wsysに書き込めばよい。
term% echo hide > /dev/wsys
ウィンドウを閉じるには、unmountすればよい。
term% unmount /n/rio /dev term% unmount /n/rio
言葉だけだとわかりにくいけど、実際に試してみればすぐにわかると思う。こんな感じでTcl/Tkのwishシェルみたいなものができないだろうか?
ちなみに、ウィンドウ生成に関する部分をCで書くと、こんな感じ。
#include <u.h> #include <libc.h> #include <draw.h> void main(int argc, char **argv) { int fd, cc; char *wsys; char buf[32]; wsys = getenv("wsys"); if (wsys == nil) exits("cannot get the environment variable $wsys."); fd = open(wsys, ORDWR); if (fd < 0) sysfatal("open"); rfork(RFNAMEG); strcpy(buf, "new"); cc = mount(fd, -1, "/dev", MBEFORE, buf); if (cc < 0) sysfatal("mount"); /*exits(nil);*/ while (1) sleep(10); }
続きがあるかは不明。