更詳細的講解和代碼調試演示過程,請參看視頻 linux kernel Hacker, 從零構建自己的內核
在為我們的系統開發應用程序前,還需要完成最后一點掃尾工作,那就是處理回車鍵。要啟動應用程序,一種常用辦法是,在命令行控制臺中,鍵入要運行的程序名字,點擊回車,然后系統把應用程序加載起來,因此,響應回車鍵按下消息是系統必不可少的功能。
本節代碼完成后,我們的系統運行效果如下:
當我們把輸入焦點轉移到控制臺,然后按下回車,控制臺會啟動新的一行,此時如果點擊字母按鈕,那么字母會出現在新起的一行,同時光標會在新啟的一行閃爍。
系統能夠響應回車鍵的話,我們就可以實現從控制臺啟動應用程序,我們先看看本節的實現代碼,主要實現都在write_vga_desktop.c中:
#define KEY_RETURN 0x1Cvoid console_task(struct SHEET *sheet) { struct TIMER *timer; struct TASK *task = task_now(); int i, fifobuf[128], cursor_x = 16, cursor_c = COL8_000000; int cursor_y = 28; .... for(;;) { .... else if (i == KEY_RETURN) { if (cursor_y < 28 + 112) { set_cursor(shtctl, sheet, cursor_x, cursor_y, COL8_000000); cursor_y += 16; cursor_x = 16; showString(shtctl, sheet, 8, cursor_y, COL8_FFFFFF, ">"); } } else if (i == 0x0e && cursor_x > 8) { set_cursor(shtctl, sheet, cursor_x, cursor_y, COL8_000000); cursor_x -= 8; set_cursor(shtctl, sheet, cursor_x, cursor_y, COL8_000000); } else { char c = transferScanCode(i); if (cursor_x < 240 && c!=0 ) { set_cursor(shtctl, sheet, cursor_x, cursor_y,COL8_000000); char s[2] = {c, 0}; showString(shtctl, sheet, cursor_x, cursor_y, COL8_FFFFFF, s); cursor_x += 8; } } if (cursor_c >= 0) { set_cursor(shtctl, sheet, cursor_x, cursor_y, cursor_c); } .... }}void set_cursor(struct SHTCTL *shtctl, struct SHEET *sheet, int cursor_x, int cursor_y ,int cursor_c) { boxfill8(sheet->buf, sheet->bxsize, cursor_c, cursor_x, cursor_y, cursor_x + 7, cursor_y + 15); sheet_refresh(shtctl, sheet, cursor_x, cursor_y, cursor_x+8, cursor_y + 46);}我們對代碼做的改動有,先定義回車鍵掃描碼的數值0x1C, 當回車鍵按下后,主進程會把掃描碼發送給控制臺進程的主函數,在控制臺進程主函數中,一旦接受到回車鍵消息時,把cursor_y的值加上16,也就是一個字符的高度,cursor_y將作為新的顯示縱坐標,我們原來顯示字符時,縱坐標都是寫死的,為28,現在我們把縱坐標改為可變動的情況,一旦受到回車鍵,系統便知道需要在新的一行顯示信息,于是我們讓控制臺進程在窗口中另起一行,也就是將輸入坐標向下移動16個字符的距離,然后無論是字符還是光標,他們的顯示都在新坐標下進行。
set_cursor用來繪制光標,原先光標的縱坐標是定死為28的,現在我們把縱坐標當做一個參數來處理,每次窗口想要繪制光標時,需要把光標所在的縱坐標傳入。有了上面代碼后,我們每次在命令行窗口中點擊回車鍵時,命令行窗口會新起一行,字符和光標都會在新一行中顯示。
更詳細的代碼講解和調試請參看視頻。
更多技術信息,包括操作系統,編譯器,面試算法,機器學習,人工智能,請關照我的公眾號:
新聞熱點
疑難解答