9fans.net/go@v0.0.7/cmd/devdraw/drawclient.go (about)

     1  // +build ignore
     2  
     3  // #include <u.h>
     4  // #include <libc.h>
     5  // #include <bio.h>
     6  // #include <draw.h>
     7  // #include <mouse.h>
     8  // #include <cursor.h>
     9  // #include <drawfcall.h>
    10  
    11  package main
    12  
    13  type Cmd struct {
    14  	cmd *C.char
    15  	fn  func(int, **C.char)
    16  }
    17  
    18  var b Biobuf
    19  var fd int
    20  var buf [64 * 1024]uint8
    21  
    22  func startsrv() {
    23  	var p [2]int
    24  	if pipe(p) < 0 {
    25  		sysfatal("pipe")
    26  	}
    27  	pid := fork()
    28  	if pid < 0 {
    29  		sysfatal("fork")
    30  	}
    31  	if pid == 0 {
    32  		close(p[0])
    33  		dup(p[1], 0)
    34  		dup(p[1], 1)
    35  		execl("./o.devdraw", "o.devdraw", "-D", nil)
    36  		sysfatal("exec: %r")
    37  	}
    38  	close(p[1])
    39  	fd = p[0]
    40  }
    41  
    42  func domsg(m *Wsysmsg) int {
    43  	n := convW2M(m, buf, sizeof(buf))
    44  	fprint(2, "write %d to %d\n", n, fd)
    45  	write(fd, buf, n)
    46  	n = readwsysmsg(fd, buf, sizeof(buf))
    47  	nn := convM2W(buf, n, m)
    48  	assert(nn == n)
    49  	if m.type_ == Rerror {
    50  		return -1
    51  	}
    52  	return 0
    53  }
    54  
    55  func cmdinit(argc int, argv **C.char) {
    56  	var m Wsysmsg
    57  	memset(&m, 0, sizeof(m))
    58  	m.type_ = Tinit
    59  	m.winsize = "100x100"
    60  	m.label = "label"
    61  	if domsg(&m) < 0 {
    62  		sysfatal("domsg")
    63  	}
    64  }
    65  
    66  func cmdmouse(argc int, argv **C.char) {
    67  	var m Wsysmsg
    68  	memset(&m, 0, sizeof(m))
    69  	m.type_ = Trdmouse
    70  	if domsg(&m) < 0 {
    71  		sysfatal("domsg")
    72  	}
    73  	var tmp1 unknown
    74  	if m.resized != 0 {
    75  		tmp1 = 'r'
    76  	} else {
    77  		tmp1 = 'm'
    78  	}
    79  	print("%c %d %d %d\n", tmp1, m.mouse.xy.x, m.mouse.xy.y, m.mouse.buttons)
    80  }
    81  
    82  func cmdkbd(argc int, argv **C.char) {
    83  	var m Wsysmsg
    84  	memset(&m, 0, sizeof(m))
    85  	m.type_ = Trdkbd
    86  	if domsg(&m) < 0 {
    87  		sysfatal("domsg")
    88  	}
    89  	print("%d\n", m.rune_)
    90  }
    91  
    92  var cmdtab = [3]Cmd{
    93  	Cmd{"init", cmdinit},
    94  	Cmd{"mouse", cmdmouse},
    95  	Cmd{"kbd", cmdkbd},
    96  }
    97  
    98  func main(argc int, argv **C.char) {
    99  	startsrv()
   100  
   101  	fprint(2, "started...\n")
   102  	Binit(&b, 0, OREAD)
   103  	for {
   104  		p := Brdstr(&b, '\n', 1)
   105  		if p == nil {
   106  			break
   107  		}
   108  		fprint(2, "%s...\n", p)
   109  		var f [20]*C.char
   110  		nf := tokenize(p, f, len(f))
   111  		var i int
   112  		for i = 0; i < len(cmdtab); i++ {
   113  			if strcmp(cmdtab[i].cmd, f[0]) == 0 {
   114  				cmdtab[i].fn(nf, f)
   115  				break
   116  			}
   117  		}
   118  		if i == len(cmdtab) {
   119  			print("! unrecognized command %s\n", f[0])
   120  		}
   121  		free(p)
   122  	}
   123  	exits(0)
   124  }