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  }