rc/tk?

最近、WindowsPowerShellを少しさわってみた。一見、パイプだけど、バイトストリームではなくて.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);
}

続きがあるかは不明。