func (t *tbfe) key(w http.ResponseWriter, req *http.Request) { log4go.Debug("key: %s", req) kc := req.FormValue("keyCode") var kp backend.KeyPress v, _ := strconv.ParseInt(kc, 10, 32) if req.FormValue("altKey") == "true" { kp.Alt = true } if req.FormValue("ctrlKey") == "true" { kp.Ctrl = true } if req.FormValue("metaKey") == "true" { kp.Super = true } if req.FormValue("shiftKey") == "true" { kp.Shift = true } if !kp.Shift { v = int64(unicode.ToLower(rune(v))) } kp.Key = backend.Key(v) backend.GetEditor().HandleInput(kp) }
func (t *tbfe) loop() { var ( ed = t.setupEditor() c = ed.Console() w = ed.NewWindow() v = createNewView("main.go", w) sel = v.Sel() ) t.settings = getSettings(v) c.Buffer().AddCallback(t.scroll) t.setupCallbacks(v) loadTextMateScheme() setColorMode() setSchemeSettings() sel.Clear() sel.Add(Region{0, 0}) evchan := make(chan termbox.Event, 32) defer func() { close(evchan) fmt.Println(util.Prof) }() go func() { for { evchan <- termbox.PollEvent() } }() { w, h := termbox.Size() t.lock.Lock() t.layout[v] = layout{0, 0, w, h - console_height - 1, Region{}, 0} t.layout[c] = layout{0, h - console_height + 1, w, console_height - 5, Region{}, 0} t.lock.Unlock() t.Show(v, Region{1, 1}) } t.Show(v, Region{100, 100}) t.Show(v, Region{1, 1}) go func() { ed.Init() sublime.Init() }() for { p := util.Prof.Enter("mainloop") blink_phase := time.Second if p, ok := ed.Settings().Get("caret_blink_phase", 1.0).(float64); ok { blink_phase = time.Duration(float64(time.Second) * p) } // Divided by two since we're only doing a simple toggle blink timer := time.NewTimer(blink_phase / 2) select { case ev := <-evchan: mp := util.Prof.Enter("evchan") limit := 3 loop: switch ev.Type { case termbox.EventError: log4go.Debug("error occured") return case termbox.EventKey: var kp backend.KeyPress if ev.Ch != 0 { kp.Key = backend.Key(ev.Ch) } else if v2, ok := lut[ev.Key]; ok { kp = v2 } else { break } if ev.Key == termbox.KeyCtrlQ { return } ed.HandleInput(kp) blink = false } if len(evchan) > 0 { limit-- ev = <-evchan goto loop } mp.Exit() case <-timer.C: // TODO(q): Shouldn't redraw if blink is disabled... blink = !blink t.render() } timer.Stop() p.Exit() } }
func (t *tbfe) loop() { var ( ed = t.setupEditor() c = ed.Console() w = ed.NewWindow() v *backend.View ) // Assuming that all extra arguments are files if files := flag.Args(); len(files) > 0 { for _, file := range files { v = createNewView(file, w) } } else { v = w.NewFile() } c.Buffer().AddCallback(t.scroll) t.setupCallbacks(v) path := "../../3rdparty/bundles/TextMate-Themes/Monokai.tmTheme" if sc, err := textmate.LoadTheme(path); err != nil { log4go.Error(err) return } else { scheme = sc } setColorMode() setSchemeSettings() // We start the renderThread here, after we have done our setup of termbox. // That way, we do not clash with our output. go t.renderthread() evchan := make(chan termbox.Event, 32) defer func() { close(evchan) }() go func() { for { evchan <- termbox.PollEvent() } }() { w, h := termbox.Size() t.lock.Lock() if *showConsole { t.layout[v] = layout{0, 0, w, h - *consoleHeight - 4, Region{}, 0} t.layout[c] = layout{0, h - *consoleHeight - 2, w, *consoleHeight - 1, Region{}, 0} } else { t.layout[v] = layout{0, 0, w, h - 3, Region{}, 0} } t.lock.Unlock() t.Show(v, Region{1, 1}) } t.Show(v, Region{100, 100}) t.Show(v, Region{1, 1}) go func() { ed.Init() sublime.Init() }() for { p := util.Prof.Enter("mainloop") blink_phase := time.Second if p, ok := ed.Settings().Get("caret_blink_phase", 1.0).(float64); ok { blink_phase = time.Duration(float64(time.Second) * p) } // Divided by two since we're only doing a simple toggle blink timer := time.NewTimer(blink_phase / 2) select { case ev := <-evchan: mp := util.Prof.Enter("evchan") limit := 3 loop: switch ev.Type { case termbox.EventError: log4go.Debug("error occured") return case termbox.EventResize: // We have to resize our layouts... // There is currently duplicate code for calculating the layout: // during initialization (above), and here. Not nice if *showConsole { view_layout := t.layout[v] view_layout.height = ev.Height - *consoleHeight - 4 view_layout.width = ev.Width console_layout := t.layout[c] console_layout.y = ev.Height - *consoleHeight - 2 console_layout.width = ev.Width t.layout[v] = view_layout t.layout[c] = console_layout } else { view_layout := t.layout[v] view_layout.height = ev.Height - 3 view_layout.width = ev.Width t.layout[v] = view_layout } // Ensure that the new visible region is recalculated t.Show(v, t.VisibleRegion(v)) case termbox.EventKey: var kp backend.KeyPress if ev.Ch != 0 { kp.Key = backend.Key(ev.Ch) } else if v2, ok := lut[ev.Key]; ok { kp = v2 } else { break } if ev.Key == termbox.KeyCtrlQ { return } ed.HandleInput(kp) blink = false } if len(evchan) > 0 { limit-- ev = <-evchan goto loop } mp.Exit() case <-timer.C: // TODO(q): Shouldn't redraw if blink is disabled... blink = !blink t.render() } timer.Stop() p.Exit() } }
func (t *tbfe) loop() { var ( ed = t.setupEditor() c = ed.Console() w = ed.NewWindow() v *backend.View ) // Assuming that all extra arguments are files if files := flag.Args(); len(files) > 0 { for _, file := range files { v = createNewView(file, w) } } else { v = w.NewFile() } t.settings = getSettings(v) c.Buffer().AddCallback(t.scroll) t.setupCallbacks(v) path := "../../3rdparty/bundles/TextMate-Themes/GlitterBomb.tmTheme" if sc, err := textmate.LoadTheme(path); err != nil { log4go.Error(err) return } else { scheme = sc } setColorMode() setSchemeSettings() evchan := make(chan termbox.Event, 32) defer func() { close(evchan) fmt.Println(util.Prof) }() go func() { for { evchan <- termbox.PollEvent() } }() { w, h := termbox.Size() t.lock.Lock() if *showConsole { t.layout[v] = layout{0, 0, w, h - *consoleHeight - 4, Region{}, 0} t.layout[c] = layout{0, h - *consoleHeight - 2, w, *consoleHeight - 1, Region{}, 0} } else { t.layout[v] = layout{0, 0, w, h - 3, Region{}, 0} } t.lock.Unlock() t.Show(v, Region{1, 1}) } t.Show(v, Region{100, 100}) t.Show(v, Region{1, 1}) go func() { ed.Init() sublime.Init() }() for { p := util.Prof.Enter("mainloop") blink_phase := time.Second if p, ok := ed.Settings().Get("caret_blink_phase", 1.0).(float64); ok { blink_phase = time.Duration(float64(time.Second) * p) } // Divided by two since we're only doing a simple toggle blink timer := time.NewTimer(blink_phase / 2) select { case ev := <-evchan: mp := util.Prof.Enter("evchan") limit := 3 loop: switch ev.Type { case termbox.EventError: log4go.Debug("error occured") return case termbox.EventKey: var kp backend.KeyPress if ev.Ch != 0 { kp.Key = backend.Key(ev.Ch) } else if v2, ok := lut[ev.Key]; ok { kp = v2 } else { break } if ev.Key == termbox.KeyCtrlQ { return } ed.HandleInput(kp) blink = false } if len(evchan) > 0 { limit-- ev = <-evchan goto loop } mp.Exit() case <-timer.C: // TODO(q): Shouldn't redraw if blink is disabled... blink = !blink t.render() } timer.Stop() p.Exit() } }