Rev 3602 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3602 | Rev 3742 | ||
---|---|---|---|
Line 84... | Line 84... | ||
84 | static keyfield_t *interbuffer = NULL; /**< Pointer to memory shared |
84 | static keyfield_t *interbuffer = NULL; /**< Pointer to memory shared |
85 | * with framebufer used for |
85 | * with framebufer used for |
86 | * faster virtual console |
86 | * faster virtual console |
87 | * switching */ |
87 | * switching */ |
88 | 88 | ||
89 | static int kernel_pixmap = -1; /**< Number of fb pixmap, where kernel |
- | |
90 | * console is stored */ |
- | |
91 | - | ||
92 | 89 | ||
93 | /** Find unused virtual console. |
90 | /** Find unused virtual console. |
94 | * |
91 | * |
95 | */ |
92 | */ |
96 | static int find_free_connection(void) |
93 | static int find_free_connection(void) |
Line 185... | Line 182... | ||
185 | if (console == active_console) |
182 | if (console == active_console) |
186 | curs_goto(scr->position_y, scr->position_x); |
183 | curs_goto(scr->position_y, scr->position_x); |
187 | 184 | ||
188 | } |
185 | } |
189 | 186 | ||
190 | /** Save current screen to pixmap, draw old pixmap |
- | |
191 | * |
- | |
192 | * @param oldpixmap Old pixmap |
- | |
193 | * @return ID of pixmap of current screen |
- | |
194 | */ |
- | |
195 | static int switch_screens(int oldpixmap) |
- | |
196 | { |
- | |
197 | int newpmap; |
- | |
198 | - | ||
199 | /* Save screen */ |
- | |
200 | newpmap = async_req_0_0(fb_info.phone, FB_VP2PIXMAP); |
- | |
201 | if (newpmap < 0) |
- | |
202 | return -1; |
- | |
203 | - | ||
204 | if (oldpixmap != -1) { |
- | |
205 | /* Show old screen */ |
- | |
206 | async_msg_2(fb_info.phone, FB_VP_DRAW_PIXMAP, 0, oldpixmap); |
- | |
207 | /* Drop old pixmap */ |
- | |
208 | async_msg_1(fb_info.phone, FB_DROP_PIXMAP, oldpixmap); |
- | |
209 | } |
- | |
210 | - | ||
211 | return newpmap; |
- | |
212 | } |
- | |
213 | - | ||
214 | /** Switch to new console */ |
187 | /** Switch to new console */ |
215 | static void change_console(int newcons) |
188 | static void change_console(int newcons) |
216 | { |
189 | { |
217 | connection_t *conn; |
190 | connection_t *conn; |
218 | static int console_pixmap = -1; |
- | |
219 | int i, j, rc; |
191 | int i, j, rc; |
220 | keyfield_t *field; |
192 | keyfield_t *field; |
221 | style_t *style; |
193 | style_t *style; |
222 | 194 | ||
223 | if (newcons == active_console) |
195 | if (newcons == active_console) |
224 | return; |
196 | return; |
225 | 197 | ||
226 | if (newcons == KERNEL_CONSOLE) { |
198 | if (newcons == KERNEL_CONSOLE) { |
227 | if (active_console == KERNEL_CONSOLE) |
- | |
228 | return; |
- | |
229 | active_console = KERNEL_CONSOLE; |
- | |
230 | curs_visibility(0); |
- | |
231 | - | ||
232 | async_serialize_start(); |
199 | async_serialize_start(); |
233 | if (kernel_pixmap == -1) { |
- | |
234 | /* store/restore unsupported */ |
- | |
235 | set_style_col(DEFAULT_FOREGROUND, DEFAULT_BACKGROUND); |
- | |
236 | clrscr(); |
200 | curs_visibility(0); |
237 | } else { |
- | |
238 | gcons_in_kernel(); |
201 | gcons_in_kernel(); |
239 | console_pixmap = switch_screens(kernel_pixmap); |
- | |
240 | kernel_pixmap = -1; |
- | |
241 | } |
- | |
242 | async_serialize_end(); |
202 | async_serialize_end(); |
243 | 203 | ||
244 | __SYSCALL0(SYS_DEBUG_ENABLE_CONSOLE); |
204 | if (__SYSCALL0(SYS_DEBUG_ENABLE_CONSOLE)) |
245 | return; |
- | |
246 | } |
- | |
247 | - | ||
248 | async_serialize_start(); |
- | |
249 | - | ||
250 | if (console_pixmap != -1) { |
205 | active_console = KERNEL_CONSOLE; |
251 | kernel_pixmap = switch_screens(console_pixmap); |
- | |
252 | console_pixmap = -1; |
- | |
253 | } |
206 | else |
254 | active_console = newcons; |
- | |
255 | gcons_change_console(newcons); |
- | |
256 | conn = &connections[active_console]; |
207 | newcons == active_console; |
257 | - | ||
258 | set_style(&conn->screenbuffer.style); |
- | |
259 | curs_visibility(0); |
- | |
260 | if (interbuffer) { |
- | |
261 | for (i = 0; i < conn->screenbuffer.size_x; i++) |
- | |
262 | for (j = 0; j < conn->screenbuffer.size_y; j++) { |
- | |
263 | unsigned int size_x; |
- | |
264 | - | ||
265 | size_x = conn->screenbuffer.size_x; |
- | |
266 | interbuffer[i + j * size_x] = |
- | |
267 | *get_field_at(&conn->screenbuffer, i, j); |
- | |
268 | } |
- | |
269 | /* This call can preempt, but we are already at the end */ |
- | |
270 | rc = async_req_0_0(fb_info.phone, FB_DRAW_TEXT_DATA); |
- | |
271 | } |
208 | } |
272 | 209 | ||
273 | if ((!interbuffer) || (rc != 0)) { |
210 | if (newcons != KERNEL_CONSOLE) { |
- | 211 | async_serialize_start(); |
|
- | 212 | ||
- | 213 | if (active_console == KERNEL_CONSOLE) |
|
- | 214 | gcons_redraw_console(); |
|
- | 215 | ||
- | 216 | active_console = newcons; |
|
- | 217 | gcons_change_console(newcons); |
|
- | 218 | conn = &connections[active_console]; |
|
- | 219 | ||
274 | set_style(&conn->screenbuffer.style); |
220 | set_style(&conn->screenbuffer.style); |
- | 221 | curs_visibility(0); |
|
- | 222 | if (interbuffer) { |
|
- | 223 | for (i = 0; i < conn->screenbuffer.size_x; i++) |
|
- | 224 | for (j = 0; j < conn->screenbuffer.size_y; j++) { |
|
- | 225 | unsigned int size_x; |
|
- | 226 | ||
- | 227 | size_x = conn->screenbuffer.size_x; |
|
- | 228 | interbuffer[i + j * size_x] = |
|
- | 229 | *get_field_at(&conn->screenbuffer, i, j); |
|
- | 230 | } |
|
- | 231 | /* This call can preempt, but we are already at the end */ |
|
- | 232 | rc = async_req_0_0(fb_info.phone, FB_DRAW_TEXT_DATA); |
|
- | 233 | } |
|
- | 234 | ||
- | 235 | if ((!interbuffer) || (rc != 0)) { |
|
- | 236 | set_style(&conn->screenbuffer.style); |
|
275 | clrscr(); |
237 | clrscr(); |
276 | style = &conn->screenbuffer.style; |
238 | style = &conn->screenbuffer.style; |
277 | 239 | ||
278 | for (j = 0; j < conn->screenbuffer.size_y; j++) |
240 | for (j = 0; j < conn->screenbuffer.size_y; j++) |
279 | for (i = 0; i < conn->screenbuffer.size_x; i++) { |
241 | for (i = 0; i < conn->screenbuffer.size_x; i++) { |
280 | field = get_field_at(&conn->screenbuffer, i, j); |
242 | field = get_field_at(&conn->screenbuffer, i, j); |
281 | if (!style_same(*style, field->style)) |
243 | if (!style_same(*style, field->style)) |
282 | set_style(&field->style); |
244 | set_style(&field->style); |
283 | style = &field->style; |
245 | style = &field->style; |
284 | if ((field->character == ' ') && |
246 | if ((field->character == ' ') && |
285 | (style_same(field->style, |
247 | (style_same(field->style, |
286 | conn->screenbuffer.style))) |
248 | conn->screenbuffer.style))) |
287 | continue; |
249 | continue; |
288 | 250 | ||
289 | prtchr(field->character, j, i); |
251 | prtchr(field->character, j, i); |
290 | } |
252 | } |
- | 253 | } |
|
- | 254 | ||
- | 255 | curs_goto(conn->screenbuffer.position_y, |
|
- | 256 | conn->screenbuffer.position_x); |
|
- | 257 | curs_visibility(conn->screenbuffer.is_cursor_visible); |
|
- | 258 | ||
- | 259 | async_serialize_end(); |
|
291 | } |
260 | } |
292 | - | ||
293 | curs_goto(conn->screenbuffer.position_y, |
- | |
294 | conn->screenbuffer.position_x); |
- | |
295 | curs_visibility(conn->screenbuffer.is_cursor_visible); |
- | |
296 | - | ||
297 | async_serialize_end(); |
- | |
298 | } |
261 | } |
299 | 262 | ||
300 | /** Handler for keyboard */ |
263 | /** Handler for keyboard */ |
301 | static void keyboard_events(ipc_callid_t iid, ipc_call_t *icall) |
264 | static void keyboard_events(ipc_callid_t iid, ipc_call_t *icall) |
302 | { |
265 | { |
Line 495... | Line 458... | ||
495 | if (ipc_connect_to_me(kbd_phone, SERVICE_CONSOLE, 0, 0, &phonehash) != 0) |
458 | if (ipc_connect_to_me(kbd_phone, SERVICE_CONSOLE, 0, 0, &phonehash) != 0) |
496 | return -1; |
459 | return -1; |
497 | async_new_connection(phonehash, 0, NULL, keyboard_events); |
460 | async_new_connection(phonehash, 0, NULL, keyboard_events); |
498 | 461 | ||
499 | /* Connect to framebuffer driver */ |
462 | /* Connect to framebuffer driver */ |
500 | - | ||
501 | fb_info.phone = ipc_connect_me_to(PHONE_NS, SERVICE_VIDEO, 0, 0); |
463 | fb_info.phone = ipc_connect_me_to(PHONE_NS, SERVICE_VIDEO, 0, 0); |
502 | while (fb_info.phone < 0) { |
464 | while (fb_info.phone < 0) { |
503 | usleep(10000); |
465 | usleep(10000); |
504 | fb_info.phone = ipc_connect_me_to(PHONE_NS, SERVICE_VIDEO, 0, 0); |
466 | fb_info.phone = ipc_connect_me_to(PHONE_NS, SERVICE_VIDEO, 0, 0); |
505 | } |
467 | } |
506 | 468 | ||
507 | /* Save old kernel screen */ |
- | |
508 | kernel_pixmap = switch_screens(-1); |
- | |
509 | - | ||
510 | /* Initialize gcons */ |
469 | /* Initialize gcons */ |
511 | gcons_init(fb_info.phone); |
470 | gcons_init(fb_info.phone); |
512 | /* Synchronize, the gcons can have something in queue */ |
471 | /* Synchronize, the gcons can have something in queue */ |
513 | async_req_0_0(fb_info.phone, FB_FLUSH); |
472 | async_req_0_0(fb_info.phone, FB_FLUSH); |
514 | /* Enable double buffering */ |
- | |
515 | async_msg_2(fb_info.phone, FB_VIEWPORT_DB, (sysarg_t) -1, 1); |
- | |
516 | 473 | ||
517 | async_req_0_2(fb_info.phone, FB_GET_CSIZE, &fb_info.rows, |
474 | async_req_0_2(fb_info.phone, FB_GET_CSIZE, &fb_info.rows, |
518 | &fb_info.cols); |
475 | &fb_info.cols); |
519 | set_style_col(DEFAULT_FOREGROUND, DEFAULT_BACKGROUND); |
476 | set_style_col(DEFAULT_FOREGROUND, DEFAULT_BACKGROUND); |
520 | clrscr(); |
477 | clrscr(); |