好吧,這是我正在做的一些小背景。我正在開發一個小文件系統的操作系統。它是部分彙編器和C部分編寫的。我試圖實現熱鍵以使系統循環遍歷顏色,交換前景和背景顏色,完全清除屏幕等。這裏是我正在使用的功能在C中獲取操作系統的默認顏色
PRIVATE void my_toy_shell(u16_t key) {
u32_t color = 0;
char fg_color, bg_color, newcolor;
// Colors
newcolor = 0x2a;
fg_color = 0x0E;
bg_color = 0x10;
switch(key) {
case C('D'): /* ctrl-d set default color */
newcolor = 0x1E;
color = newcolor;
__clr_screen(color,_NO_FILL);
break;
case C('S'): /* ctrl-s swap bg and fg color */
bg_color = color & 0xF0;
fg_color = color & 0x0F;
newcolor = fg_color | bg_color;
color = newcolor;
__clr_screen(color,_NO_FILL);
break;
case C('F'): /* ctrl-f cycle fg color */
if(fg_color == 0x0F)
fg_color = 0x00;
else
fg_color<<;
color = bg_color | fg_color;
__clr_screen(color, _NO_FILL);
break;
case C('G'): /* ctrl-g cycle bg color */
/*if(bg_color == 0x70)*/
break;
case C('Q'): /* ctrl-q reset */
/*Clears screen*/
__clr_screen(_IOTA_TTY_COLOR,_FILL_BLANK);
_display_welcome();
break;
}
}
現在只是爲了驗證這些函數是否正常工作,我已經硬編碼了「newcolor」,「fg_color」和「bg_color」。 CTRL-D是正確的功能,以及CTRL-Q。 CTRL-S應該交換前景色和背景色。 這是我變得困惑的地方。爲了在屏幕上交換當前顏色,我被告知顏色爲0x0F或0xF0,這取決於我想要爲fg或bg獲取哪個值。但是我不確定如何獲取當前顯示在屏幕上的顏色。藍色默認爲黃色(0x1E)。我還發現,當我嘗試其他顏色時,任何高於十六進制值8的顏色都會給我0-7的顏色,但會導致屏幕閃爍。使用按位「&」和「|」應該讓我得到我需要交換的相應值。不過,我的問題是獲得屏幕上的當前顏色。我不確定這是否需要嘗試在其他位置的文件中找到,或者是否有內置於C的內容,我可以使用這些值來獲取這些值。
編輯:我想通了。原來我在另一個文件中有一個屬性被導入到名爲_color_attr
的包含當前顏色的文件中。
'__clr_screen'是一個函數,它需要兩個參數,一個顏色,並且它出現一個字的屬性。當使用「_FILL_BLANK」時,它將清除屏幕上的所有內容,使用「_NO_FILL」時,屏幕上的所有內容都不會被修改。這是另一個文件中的用戶定義的函數,它被導入到這個文件中。我基本上是使用這個函數來在需要時將所有內容保留在屏幕上,並且在需要時清除屏幕,就像按CTRL-Q時一樣。 – kszalai 2015-04-05 16:44:21