about summary refs log tree commit diff stats
path: root/kernel.soso/keyboard.h
blob: 0f28e9e3b1e4efeb7b6904a86ed4d5f269d8f08a (plain) (blame)
1
2
3
4
5
6
#ifndef KEYBOARD_H
#define KEYBOARD_H

void initializeKeyboard();

#endif // KEYBOARD_H
*/ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
#include "screen.h"
#include "common.h"
#include "serial.h"

#define SCREEN_LINE_COUNT 25
#define SCREEN_COLUMN_COUNT 80

static unsigned char *videoStart = (unsigned char*)0xB8000;

static uint16 gCurrentLine = 0;
static uint16 gCurrentColumn = 0;
static uint8 gColor = 0x0A;

void Screen_FlushFromTty(Tty* tty) {
    memcpy(videoStart, tty->buffer, SCREEN_LINE_COUNT * SCREEN_COLUMN_COUNT * 2);

    Screen_MoveCursor(tty->currentLine, tty->currentColumn);
}

void Screen_Print(int row, int column, const char* text) {
    unsigned char * video = videoStart;
    
    video += (row * SCREEN_COLUMN_COUNT + column) * 2;
    while(*text != 0) {
        *video++ = *text++;
        *video++ = gColor;
    }
}

void Screen_SetActiveColor(uint8 color) {
    gColor = color;
}

void Screen_ApplyColor(uint8 color) {
    gColor = color;

    unsigned char * video = videoStart;
    int i = 0;

    for (i = 0; i < SCREEN_LINE_COUNT * SCREEN_COLUMN_COUNT; ++i) {
        video++;
        *video++ = gColor;
    }
}

void Screen_Clear() {
	unsigned char * video = videoStart;
	int i = 0;
    
    for (i = 0; i < SCREEN_LINE_COUNT * SCREEN_COLUMN_COUNT; ++i) {
        *video++ = 0;
        *video++ = gColor;
    }
    
    gCurrentLine = 0;
    gCurrentColumn = 0;
}

void Screen_MoveCursor(uint16 line, uint16 column) {
   // The screen is 80 characters wide...
   uint16 cursorLocation = line * SCREEN_COLUMN_COUNT + column;
   outb(0x3D4, 14);                  // Tell the VGA board we are setting the high cursor byte.
   outb(0x3D5, cursorLocation >> 8); // Send the high cursor byte.
   outb(0x3D4, 15);                  // Tell the VGA board we are setting the low cursor byte.
   outb(0x3D5, cursorLocation);      // Send the low cursor byte.

   gCurrentColumn = column;
   gCurrentLine = line;
}

void Screen_SetCursorVisible(BOOL visible) {
    uint8 cursor = inb(0x3d5);

    if (visible) {
        cursor &= ~0x20;//5th bit cleared when cursor visible
    }
    else {
        cursor |= 0x20;//5th bit set when cursor invisible
    }
    outb(0x3D5, cursor);
}

void Screen_GetCursor(uint16* line, uint16* column) {
    *line = gCurrentLine;
    *column = gCurrentColumn;
}
/commit/ui/exline.go?h=0.1.4&id=661e3ec2a4dd97d4a8a8eab4f281b088770a6af2'>661e3ec ^
80e891a ^
661e3ec ^



80e891a ^
384fe0d ^
661e3ec ^


80e891a ^
661e3ec ^

80e891a ^
384fe0d ^
661e3ec ^
80e891a ^
661e3ec ^
80e891a ^
24dfc47 ^


a073d76 ^
80e891a ^
24dfc47 ^


a073d76 ^
8d20e92 ^

661e3ec ^



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
               

        
                                  
                                       

                                          



                       


                    
                      
                                
                           
                      
                   
                    


                   
                                        

 
                                                                

                                
                            


                                  

 
                                                                  








                                      
                                         
                             

                                                                          
                                                                     


                                         

 







                                                                             
                                   


                                                                  





                                      
                                 


                         
                                 


                           
                                         


                             
                                                                       




                                

                                                                                      




                               

                                                                                      




                               




                                                             
                                      
                                                     
                                       
                                                   



                                               
                                                    
                                                       


                                               
                                                   

                                       
                                                  
                                                  
                                       
                                    
                                       
                                    


                                                   
                                                     
                                                  


                                                   
                                   

                                               



                   
package widgets

import (
	"github.com/gdamore/tcell"
	"github.com/mattn/go-runewidth"

	"git.sr.ht/~sircmpwn/aerc2/lib/ui"
)

// TODO: history
// TODO: tab completion
// TODO: scrolling

type ExLine struct {
	command []rune
	commit  func(cmd string)
	ctx     *ui.Context
	cancel  func()
	cells   int
	focus   bool
	index   int
	scroll  int

	onInvalidate func(d ui.Drawable)
}

func NewExLine(commit func(cmd string), cancel func()) *ExLine {
	return &ExLine{
		cancel:  cancel,
		cells:   -1,
		commit:  commit,
		command: []rune{},
	}
}

func (ex *ExLine) OnInvalidate(onInvalidate func(d ui.Drawable)) {
	ex.onInvalidate = onInvalidate
}

func (ex *ExLine) Invalidate() {
	if ex.onInvalidate != nil {
		ex.onInvalidate(ex)
	}
}

func (ex *ExLine) Draw(ctx *ui.Context) {
	ex.ctx = ctx // gross
	ctx.Fill(0, 0, ctx.Width(), ctx.Height(), ' ', tcell.StyleDefault)
	ctx.Printf(0, 0, tcell.StyleDefault, ":%s", string(ex.command))
	cells := runewidth.StringWidth(string(ex.command[:ex.index]))
	if cells != ex.cells {
		ctx.SetCursor(cells+1, 0)
	}
}

func (ex *ExLine) Focus(focus bool) {
	ex.focus = focus
	if focus && ex.ctx != nil {
		cells := runewidth.StringWidth(string(ex.command[:ex.index]))
		ex.ctx.SetCursor(cells+1, 0)
	}
}

func (ex *ExLine) insert(ch rune) {
	left := ex.command[:ex.index]
	right := ex.command[ex.index:]
	ex.command = append(left, append([]rune{ch}, right...)...)
	ex.index++
	ex.Invalidate()
}

func (ex *ExLine) deleteWord() {
	// TODO: Break on any of / " '
	if len(ex.command) == 0 {
		return
	}
	i := ex.index - 1
	if ex.command[i] == ' ' {
		i--
	}
	for ; i >= 0; i-- {
		if ex.command[i] == ' ' {
			break
		}
	}
	ex.command = append(ex.command[:i+1], ex.command[ex.index:]...)
	ex.index = i + 1
	ex.Invalidate()
}

func (ex *ExLine) deleteChar() {
	if len(ex.command) > 0 && ex.index != len(ex.command) {
		ex.command = append(ex.command[:ex.index], ex.command[ex.index+1:]...)
		ex.Invalidate()
	}
}

func (ex *ExLine) backspace() {
	if len(ex.command) > 0 && ex.index != 0 {
		ex.command = append(ex.command[:ex.index-1], ex.command[ex.index:]...)
		ex.index--
		ex.Invalidate()
	}
}

func (ex *ExLine) Event(event tcell.Event) bool {
	switch event := event.(type) {
	case *tcell.EventKey:
		switch event.Key() {
		case tcell.KeyBackspace, tcell.KeyBackspace2:
			ex.backspace()
		case tcell.KeyCtrlD, tcell.KeyDelete:
			ex.deleteChar()
		case tcell.KeyCtrlB, tcell.KeyLeft:
			if ex.index > 0 {
				ex.index--
				ex.Invalidate()
			}
		case tcell.KeyCtrlF, tcell.KeyRight:
			if ex.index < len(ex.command) {
				ex.index++
				ex.Invalidate()
			}
		case tcell.KeyCtrlA, tcell.KeyHome:
			ex.index = 0
			ex.Invalidate()
		case tcell.KeyCtrlE, tcell.KeyEnd:
			ex.index = len(ex.command)
			ex.Invalidate()
		case tcell.KeyCtrlW:
			ex.deleteWord()
		case tcell.KeyEnter:
			if ex.ctx != nil {
				ex.ctx.HideCursor()
			}
			ex.commit(string(ex.command))
		case tcell.KeyEsc, tcell.KeyCtrlC:
			if ex.ctx != nil {
				ex.ctx.HideCursor()
			}
			ex.cancel()
		case tcell.KeyRune:
			ex.insert(event.Rune())
		}
	}
	return true
}