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 }