Skip to content

Commit 9a7c3ac

Browse files
author
nnyyxxxx
committed
make chars move with deleted chars
1 parent a20603c commit 9a7c3ac

File tree

1 file changed

+45
-15
lines changed

1 file changed

+45
-15
lines changed

kernel/src/interrupts.rs

Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -104,39 +104,69 @@ extern "x86-interrupt" fn keyboard_interrupt_handler(_stack_frame: InterruptStac
104104
// backspace
105105
unsafe {
106106
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;
107111
BUFFER_INDEX -= 1;
112+
108113
WRITER.lock().decrement_column_position();
109114
print!(" ");
110115
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+
}
111129
}
112130
}
113131
} else {
114132
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+
}
117152
}
118-
print!("{}", character);
119153
}
120154
}
121155

122156
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;
125160
WRITER.lock().decrement_column_position();
126-
unsafe {
127-
BUFFER_INDEX -= 1;
128-
}
129161
}
130-
}
162+
},
131163

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;
134167
WRITER.lock().increment_column_position();
135-
unsafe {
136-
BUFFER_INDEX += 1;
137-
}
138168
}
139-
}
169+
},
140170

141171
KeyCode::F1 => {
142172
if unsafe { BUFFER_INDEX } > 0 {

0 commit comments

Comments
 (0)