@@ -104,39 +104,69 @@ extern "x86-interrupt" fn keyboard_interrupt_handler(_stack_frame: InterruptStac
104
104
// backspace
105
105
unsafe {
106
106
if BUFFER_INDEX > 0 {
107
+ for i in BUFFER_INDEX ..BUFFER_SIZE {
108
+ BUFFER [ i - 1 ] = BUFFER [ i] ;
109
+ }
110
+ BUFFER [ BUFFER_SIZE - 1 ] = 0 as char ;
107
111
BUFFER_INDEX -= 1 ;
112
+
108
113
WRITER . lock ( ) . decrement_column_position ( ) ;
109
114
print ! ( " " ) ;
110
115
WRITER . lock ( ) . decrement_column_position ( ) ;
116
+
117
+ let pos = WRITER . lock ( ) . get_column_position ( ) ;
118
+ for i in BUFFER_INDEX ..BUFFER_SIZE {
119
+ if BUFFER [ i] != 0 as char {
120
+ print ! ( "{}" , BUFFER [ i] ) ;
121
+ }
122
+ }
123
+ print ! ( " " ) ;
124
+
125
+ let new_pos = WRITER . lock ( ) . get_column_position ( ) ;
126
+ for _ in pos..new_pos {
127
+ WRITER . lock ( ) . decrement_column_position ( ) ;
128
+ }
111
129
}
112
130
}
113
131
} else {
114
132
unsafe {
115
- BUFFER [ BUFFER_INDEX ] = character;
116
- BUFFER_INDEX += 1 ;
133
+ if BUFFER_INDEX < BUFFER_SIZE {
134
+ for i in ( BUFFER_INDEX ..BUFFER_SIZE - 1 ) . rev ( ) {
135
+ BUFFER [ i + 1 ] = BUFFER [ i] ;
136
+ }
137
+ BUFFER [ BUFFER_INDEX ] = character;
138
+
139
+ let pos = WRITER . lock ( ) . get_column_position ( ) ;
140
+ for i in BUFFER_INDEX ..BUFFER_SIZE {
141
+ if BUFFER [ i] != 0 as char {
142
+ print ! ( "{}" , BUFFER [ i] ) ;
143
+ }
144
+ }
145
+
146
+ BUFFER_INDEX += 1 ;
147
+ let new_pos = WRITER . lock ( ) . get_column_position ( ) ;
148
+ for _ in pos + 1 ..new_pos {
149
+ WRITER . lock ( ) . decrement_column_position ( ) ;
150
+ }
151
+ }
117
152
}
118
- print ! ( "{}" , character) ;
119
153
}
120
154
}
121
155
122
156
DecodedKey :: RawKey ( key) => match key {
123
- KeyCode :: ArrowLeft => {
124
- if unsafe { BUFFER_INDEX } > 0 {
157
+ KeyCode :: ArrowLeft => unsafe {
158
+ if BUFFER_INDEX > 0 {
159
+ BUFFER_INDEX -= 1 ;
125
160
WRITER . lock ( ) . decrement_column_position ( ) ;
126
- unsafe {
127
- BUFFER_INDEX -= 1 ;
128
- }
129
161
}
130
- }
162
+ } ,
131
163
132
- KeyCode :: ArrowRight => {
133
- if unsafe { BUFFER_INDEX } < BUFFER_SIZE {
164
+ KeyCode :: ArrowRight => unsafe {
165
+ if BUFFER_INDEX < BUFFER_SIZE && BUFFER [ BUFFER_INDEX ] != 0 as char {
166
+ BUFFER_INDEX += 1 ;
134
167
WRITER . lock ( ) . increment_column_position ( ) ;
135
- unsafe {
136
- BUFFER_INDEX += 1 ;
137
- }
138
168
}
139
- }
169
+ } ,
140
170
141
171
KeyCode :: F1 => {
142
172
if unsafe { BUFFER_INDEX } > 0 {
0 commit comments