4 uchar *ACPI_MemoryMap_Type[5] = {
\r
12 System_CommonData systemdata;
\r
18 UI_Sheet *taskbar, *desktop;
\r
23 Initialise_System(&systemdata);
\r
27 mytask = MultiTask_Get_NowTask();
\r
29 systemdata.keyctrltask = MultiTask_Task_Get("SysKeyCtrlTask");
\r
30 systemdata.keyctrltask->tss.ldtr = 0;
\r
31 systemdata.keyctrltask->tss.iomap = 0x4000;
\r
32 systemdata.keyctrltask->tss.eip = (uint)&CHNOS_KeyboardControlTask;
\r
33 systemdata.keyctrltask->tss.eflags = 0x00000202;
\r
34 systemdata.keyctrltask->tss.esp = (uint)MemoryBlock_Allocate_System(64 * 1024) + 64 * 1024;
\r
35 MemoryBlock_Write_Description((void *)(systemdata.keyctrltask->tss.esp - 64 * 1024), "SysKCT-Stack");
\r
36 systemdata.keyctrltask->tss.es = 1 * 8;
\r
37 systemdata.keyctrltask->tss.cs = 2 * 8;
\r
38 systemdata.keyctrltask->tss.ss = 1 * 8;
\r
39 systemdata.keyctrltask->tss.ds = 1 * 8;
\r
40 systemdata.keyctrltask->tss.fs = 1 * 8;
\r
41 systemdata.keyctrltask->tss.gs = 1 * 8;
\r
42 systemdata.keyctrltask->tss.cr3 = (uint)ADR_Paging_Directory;
\r
43 MultiTask_Task_Run(systemdata.keyctrltask);
\r
45 Mouse_Make_MouseCursor(&systemdata.mouse_cursor, 0, 0, systemdata.bootinfo->scrnx - 1, systemdata.bootinfo->scrny - 1, System_Sheet_Get_Top_Of_Height());
\r
46 Mouse_Move_Absolute(&systemdata.mouse_cursor, systemdata.bootinfo->scrnx >> 1, systemdata.bootinfo->scrny >> 1);
\r
48 systemdata.mousectrltask = MultiTask_Task_Get("MouseCtrlTask");
\r
49 systemdata.mousectrltask->tss.ldtr = 0;
\r
50 systemdata.mousectrltask->tss.iomap = 0x4000;
\r
51 systemdata.mousectrltask->tss.eip = (uint)&CHNOS_MouseControlTask;
\r
52 systemdata.mousectrltask->tss.eflags = 0x00000202;
\r
53 systemdata.mousectrltask->tss.esp = (uint)MemoryBlock_Allocate_System(64 * 1024) + 64 * 1024;
\r
54 MemoryBlock_Write_Description((void *)(systemdata.mousectrltask->tss.esp - 64 * 1024), "SysMCT-Stack");
\r
55 systemdata.mousectrltask->tss.es = 1 * 8;
\r
56 systemdata.mousectrltask->tss.cs = 2 * 8;
\r
57 systemdata.mousectrltask->tss.ss = 1 * 8;
\r
58 systemdata.mousectrltask->tss.ds = 1 * 8;
\r
59 systemdata.mousectrltask->tss.fs = 1 * 8;
\r
60 systemdata.mousectrltask->tss.gs = 1 * 8;
\r
61 systemdata.mousectrltask->tss.cr3 = (uint)ADR_Paging_Directory;
\r
62 MultiTask_Task_Run(systemdata.mousectrltask);
\r
64 desktop = System_Sheet_Get(systemdata.bootinfo->scrnx, systemdata.bootinfo->scrny, 0, 0);
\r
65 Sheet_Show(desktop, 0, 0, System_Sheet_Get_Top_Of_Height());
\r
66 Sheet_Draw_Fill_Rectangle(desktop, 0x66ff66, 0, 0, desktop->size.x - 1, desktop->size.y - 1);
\r
68 taskbar = System_Sheet_Get(systemdata.bootinfo->scrnx, 32, 0, 0);
\r
69 Sheet_Show(taskbar, 0, systemdata.bootinfo->scrny - 32, System_Sheet_Get_Top_Of_Height());
\r
70 Sheet_Draw_Fill_Rectangle_Gradation_Vertical(taskbar, 0xffffff, 0x6666ff, 0, 0, taskbar->size.x - 1, taskbar->size.y - 1);
\r
72 c_timer = Timer_Get(&systemdata.sysfifo, 5);
\r
73 Timer_Set(c_timer, 50, interval);
\r
76 FIFO32_Set_Task(&systemdata.sysfifo, mytask);
\r
78 Console_Create((systemdata.bootinfo->scrnx >> 4), (systemdata.bootinfo->scrny >> 5));
\r
81 if(FIFO32_Status(&systemdata.sysfifo) == 0){
\r
82 MultiTask_Task_Sleep(mytask);
\r
84 i = FIFO32_Get(&systemdata.sysfifo);
\r
94 void CHNOS_KeyboardControlTask(void)
\r
97 UI_Listener *next, **now, *send;
\r
102 mytask = MultiTask_Get_NowTask();
\r
104 systemdata.keycmd_wait = 0;
\r
106 FIFO32_Set_Task(&systemdata.keyboardfifo, mytask);
\r
109 if(FIFO32_Status(&systemdata.keycmdfifo) > 0 && systemdata.keycmd_wait < 0){
\r
110 systemdata.keycmd_wait = FIFO32_Get(&systemdata.keycmdfifo);
\r
111 Keyboard_Controller_Wait_SendReady();
\r
112 IO_Out8(KEYB_DATA, systemdata.keycmd_wait);
\r
114 if(FIFO32_Status(&systemdata.keyboardfifo) == 0){
\r
115 MultiTask_Task_Sleep(mytask);
\r
117 i = FIFO32_Get(&systemdata.keyboardfifo);
\r
118 if(i < DATA_BYTE){ /*
\83^
\83X
\83N
\82Ö
\82Ì
\83R
\83}
\83\93\83h*/
\r
119 if(i == 1){ /*
\83\8a\83X
\83i
\81[
\93o
\98^ FIFO32_Put_Arguments([fifo], 4, 0x01, [DATA_FIFO*], [flags], [offset]); ([0xFFFFFFFF])*/
\r
122 for(j = 1; j < 5; j++){
\r
123 buf[j] = FIFO32_Get(&systemdata.keyboardfifo);
\r
124 if(buf[j] == SIGNAL_ARGUMENTS_END){
\r
128 if(buf[4] == SIGNAL_ARGUMENTS_END){ /*
\82·
\82×
\82Ä
\90³
\8fí
\82É
\8eó
\90M
\82µ
\82½
\81B*/
\r
129 for(now = &next; *now != 0; now = &(*now)->next){
\r
132 *now = MemoryBlock_Allocate_System(sizeof(UI_Listener));
\r
133 MemoryBlock_Write_Description(*now, "UI_Listener");
\r
135 (*now)->fifo = (DATA_FIFO *)buf[1];
\r
136 (*now)->flags = buf[2];
\r
137 (*now)->offset = buf[3];
\r
140 } else if(DATA_BYTE <= i && i < (DATA_BYTE * 2)){ /*
\83L
\81[
\83{
\81[
\83h
\82©
\82ç
\82Ì
\8eó
\90M
\83f
\81[
\83^*/
\r
141 Keyboard_Decode(&kinfo, i - DATA_BYTE);
\r
143 if(kinfo.c != 0){ /*
\88ê
\94Ê
\95¶
\8e\9a*/
\r
144 for(send = next; send != 0; send = send->next){
\r
145 FIFO32_Put(send->fifo, kinfo.c + send->offset);
\r
147 if(systemdata.key_focus != 0 && systemdata.key_focus->fifo != 0){ /*
\83t
\83H
\81[
\83J
\83X
\82Í
\83L
\81[
\83f
\81[
\83^
\82Ì
\8eæ
\93¾
\82ð
\8aó
\96]
\82µ
\82Ä
\82¢
\82é*/
\r
148 FIFO32_Put(systemdata.key_focus->fifo, kinfo.c);
\r
150 } else{ /*
\93Á
\8eê
\95¶
\8e\9a*/
\r
159 void CHNOS_MouseControlTask(void)
\r
163 DATA_Position2D focus_moveorg;
\r
166 bool key_focus_changed;
\r
167 UI_Sheet *key_focus_before;
\r
169 UI_MouseEventArguments e;
\r
171 mytask = MultiTask_Get_NowTask();
\r
174 key_focus_changed = false;
\r
175 key_focus_before = 0;
\r
177 FIFO32_Set_Task(&systemdata.mousefifo, mytask);
\r
180 if(FIFO32_Status(&systemdata.mousefifo) == 0){
\r
182 Sheet_Slide(focus, focus->position.x + (systemdata.mouse_cursor.position.x - focus_moveorg.x), focus->position.y + (systemdata.mouse_cursor.position.y - focus_moveorg.y));
\r
183 focus_moveorg.x = systemdata.mouse_cursor.position.x;
\r
184 focus_moveorg.y = systemdata.mouse_cursor.position.y;
\r
186 MultiTask_Task_Sleep(mytask);
\r
188 i = FIFO32_Get(&systemdata.mousefifo);
\r
189 if(i < DATA_BYTE){ /*
\83^
\83X
\83N
\82Ö
\82Ì
\83R
\83}
\83\93\83h*/
\r
191 } else if(DATA_BYTE <= i && i < (DATA_BYTE * 2)){ /*
\83}
\83E
\83X
\82©
\82ç
\82Ì
\8eó
\90M
\83f
\81[
\83^*/
\r
192 if(Mouse_Decode(i - DATA_BYTE) != 0){
\r
193 Mouse_Move_Relative(&systemdata.mouse_cursor, systemdata.mousedecode.move.x, systemdata.mousedecode.move.y);
\r
195 if(systemdata.focus != Sheet_Get_From_Position(&sys_sheet_ctrl, systemdata.mouse_cursor.position.x, systemdata.mouse_cursor.position.y)){
\r
196 if(systemdata.focus != 0 && systemdata.focus->MouseEventProcedure != 0){
\r
197 e.focus = systemdata.focus;
\r
201 e.button_before = (uint)button_before;
\r
202 systemdata.focus->MouseEventProcedure(&e);
\r
205 systemdata.focus = Sheet_Get_From_Position(&sys_sheet_ctrl, systemdata.mouse_cursor.position.x, systemdata.mouse_cursor.position.y);
\r
207 if((systemdata.mousedecode.btn & MOUSE_BUTTON_L) != 0 && (button_before & MOUSE_BUTTON_L) == 0){ /*L down*/
\r
208 if(systemdata.key_focus != systemdata.focus){
\r
209 key_focus_changed = true;
\r
210 key_focus_before = systemdata.key_focus;
\r
212 systemdata.key_focus = systemdata.focus;
\r
213 focus = systemdata.focus;
\r
214 focus_moveorg.x = systemdata.mouse_cursor.position.x;
\r
215 focus_moveorg.y = systemdata.mouse_cursor.position.y;
\r
216 if(!focus->mouse_movable){ /*
\83}
\83E
\83X
\82É
\82æ
\82é
\88Ú
\93®
\95s
\89Â*/
\r
219 Sheet_UpDown(focus, System_Sheet_Get_Top_Of_Height());
\r
221 } else if((systemdata.mousedecode.btn & MOUSE_BUTTON_L) == 0 && (button_before & MOUSE_BUTTON_L) != 0){ /*L up*/
\r
224 if((systemdata.mousedecode.btn & MOUSE_BUTTON_R) != 0){ /*R*/
\r
227 if((systemdata.mousedecode.btn & MOUSE_BUTTON_C) != 0){ /*C*/
\r
230 if(key_focus_changed){
\r
231 if(key_focus_before != 0 && key_focus_before->fifo != 0 && (key_focus_before->ksignal_flags & SIGNAL_FLAGS_FOCUSINFO) != 0){
\r
232 FIFO32_Put_Arguments(key_focus_before->fifo, 2, SIGNAL_WINDOW_FOCUS_LOST, (uint)key_focus_before);
\r
234 if(systemdata.key_focus != 0 && systemdata.key_focus->fifo != 0 && (systemdata.key_focus->ksignal_flags & SIGNAL_FLAGS_FOCUSINFO) != 0){
\r
235 FIFO32_Put_Arguments(systemdata.key_focus->fifo, 2, SIGNAL_WINDOW_FOCUS_GET, (uint)systemdata.key_focus);
\r
237 key_focus_changed = false;
\r
239 if(systemdata.focus != 0 && systemdata.focus->MouseEventProcedure != 0){ /*
\83t
\83H
\81[
\83J
\83X
\82Í
\83V
\81[
\83g
\82Å
\81A
\83C
\83x
\83\93\83g
\82Ì
\8eæ
\93¾
\82ð
\8aó
\96]
\82µ
\82Ä
\82¢
\82é*/
\r
240 e.focus = systemdata.focus;
\r
241 e.move.x = systemdata.mousedecode.move.x;
\r
242 e.move.y = systemdata.mousedecode.move.y;
\r
243 e.position_local.x = systemdata.mouse_cursor.position.x - focus->position.x;
\r
244 e.position_local.y = systemdata.mouse_cursor.position.y - focus->position.y;
\r
245 e.button = (uint)systemdata.mousedecode.btn;
\r
246 e.button_before = (uint)button_before;
\r
247 systemdata.focus->MouseEventProcedure(&e);
\r
249 key_focus_before = systemdata.key_focus;
\r
250 button_before = systemdata.mousedecode.btn;
\r
257 void CHNOS_UI_KeyFocus_Change(UI_Sheet *focus_new)
\r
261 eflags = IO_Load_EFlags();
\r
264 if(systemdata.key_focus != 0 && systemdata.key_focus->fifo != 0 && (systemdata.key_focus->ksignal_flags & SIGNAL_FLAGS_FOCUSINFO) != 0){
\r
265 FIFO32_Put_Arguments(systemdata.key_focus->fifo, 2, SIGNAL_WINDOW_FOCUS_LOST, systemdata.key_focus);
\r
267 if(focus_new != 0 && focus_new->fifo != 0 && (focus_new->ksignal_flags & SIGNAL_FLAGS_FOCUSINFO) != 0){
\r
268 FIFO32_Put_Arguments(focus_new->fifo, 2, SIGNAL_WINDOW_FOCUS_GET, (uint)focus_new);
\r
270 systemdata.key_focus = focus_new;
\r
272 IO_Store_EFlags(eflags);
\r