9fans.net/go@v0.0.7/cmd/acme/internal/ui/arg.go (about) 1 // #include <u.h> 2 // #include <libc.h> 3 // #include <bio.h> 4 // #include <draw.h> 5 // #include <thread.h> 6 // #include <cursor.h> 7 // #include <mouse.h> 8 // #include <keyboard.h> 9 // #include <frame.h> 10 // #include <fcall.h> 11 // #include <plumb.h> 12 // #include <libsec.h> 13 // #include <9pclient.h> 14 // #include "dat.h" 15 // #include "fns.h" 16 17 package ui 18 19 import ( 20 "fmt" 21 22 "9fans.net/go/cmd/acme/internal/adraw" 23 "9fans.net/go/cmd/acme/internal/runes" 24 "9fans.net/go/cmd/acme/internal/wind" 25 "9fans.net/go/draw" 26 "9fans.net/go/draw/frame" 27 ) 28 29 func Fontx(et, t, argt *wind.Text, _, _ bool, arg []rune) { 30 if et == nil || et.W == nil { 31 return 32 } 33 t = &et.W.Body 34 var flag []rune 35 var file []rune 36 // loop condition: *arg is not a blank 37 var r []rune 38 for { 39 a := runes.SkipNonBlank(arg) 40 if len(a) == len(arg) { 41 break 42 } 43 r = runes.Clone(arg[:len(arg)-len(a)]) 44 if runes.Equal(r, []rune("fix")) || runes.Equal(r, []rune("var")) { 45 flag = r 46 } else { 47 file = r 48 } 49 arg = runes.SkipBlank(a) 50 } 51 Getarg(argt, false, true, &r) 52 if r != nil { 53 if runes.Equal(r, []rune("fix")) || runes.Equal(r, []rune("var")) { 54 flag = r 55 } else { 56 file = r 57 } 58 } 59 fix := true 60 var newfont *adraw.RefFont 61 if flag != nil { 62 fix = runes.Equal(flag, []rune("fix")) 63 } else if file == nil { 64 newfont = adraw.FindFont(false, false, false, "") 65 if newfont != nil { 66 fix = newfont.F.Name == t.Fr.Font.Name 67 } 68 } 69 var aa string 70 if file != nil { 71 newfont = adraw.FindFont(fix, flag != nil, false, string(file)) 72 } else { 73 newfont = adraw.FindFont(fix, false, false, "") 74 } 75 if newfont != nil { 76 adraw.Display.ScreenImage.Draw(t.W.R, adraw.TextCols[frame.BACK], nil, draw.ZP) 77 adraw.CloseFont(t.Reffont) 78 t.Reffont = newfont 79 t.Fr.Font = newfont.F 80 t.Fr.InitTick() 81 if t.W.IsDir { 82 t.All.Min.X++ // force recolumnation; disgusting! 83 for i := 0; i < len(t.W.Dlp); i++ { 84 dp := t.W.Dlp[i] 85 aa = string(dp.R) 86 dp.Wid = newfont.F.StringWidth(aa) 87 } 88 } 89 // avoid shrinking of window due to quantization 90 wind.Colgrow(t.W.Col, t.W, -1) 91 } 92 } 93 94 func Getarg(argt *wind.Text, doaddr, dofile bool, rp *[]rune) *string { 95 *rp = nil 96 if argt == nil { 97 return nil 98 } 99 wind.Textcommit(argt, true) 100 var e Expand 101 var a *string 102 if Expand_(argt, argt.Q0, argt.Q1, &e) { 103 if len(e.Name) > 0 && dofile { 104 if doaddr { 105 a = Printarg(argt, e.Q0, e.Q1) 106 } 107 *rp = e.Name 108 return a 109 } 110 } else { 111 e.Q0 = argt.Q0 112 e.Q1 = argt.Q1 113 } 114 n := e.Q1 - e.Q0 115 *rp = make([]rune, n) 116 argt.File.Read(e.Q0, *rp) 117 if doaddr { 118 a = Printarg(argt, e.Q0, e.Q1) 119 } 120 return a 121 } 122 123 func Printarg(argt *wind.Text, q0 int, q1 int) *string { 124 if argt.What != wind.Body || argt.File.Name() == nil { 125 return nil 126 } 127 var buf string 128 if q0 == q1 { 129 buf = fmt.Sprintf("%s:#%d", string(argt.File.Name()), q0) 130 } else { 131 buf = fmt.Sprintf("%s:#%d,#%d", string(argt.File.Name()), q0, q1) 132 } 133 return &buf 134 }