diff --git a/Asuro.iso b/Asuro.iso index c134dd80..937dfa22 100644 Binary files a/Asuro.iso and b/Asuro.iso differ diff --git a/bin/kernel.bin b/bin/kernel.bin index a6b12364..111ef5ca 100755 Binary files a/bin/kernel.bin and b/bin/kernel.bin differ diff --git a/iso/boot/asuro.bin b/iso/boot/asuro.bin index a6b12364..111ef5ca 100755 Binary files a/iso/boot/asuro.bin and b/iso/boot/asuro.bin differ diff --git a/lib/asuro.ppu b/lib/asuro.ppu index 6389dcda..05f0bd67 100644 Binary files a/lib/asuro.ppu and b/lib/asuro.ppu differ diff --git a/lib/console.o b/lib/console.o index 96975d67..ac55a24e 100644 Binary files a/lib/console.o and b/lib/console.o differ diff --git a/lib/console.ppu b/lib/console.ppu index adc4b945..f075946a 100644 Binary files a/lib/console.ppu and b/lib/console.ppu differ diff --git a/lib/kernel.ppu b/lib/kernel.ppu index 5bf94bf0..66ea48be 100644 Binary files a/lib/kernel.ppu and b/lib/kernel.ppu differ diff --git a/lib/libpconsole.a b/lib/libpconsole.a index 14ef1d26..506ce25d 100644 Binary files a/lib/libpconsole.a and b/lib/libpconsole.a differ diff --git a/lib/libpmultiboot.a b/lib/libpmultiboot.a index 669537f2..353336a7 100644 Binary files a/lib/libpmultiboot.a and b/lib/libpmultiboot.a differ diff --git a/lib/libpsystem.a b/lib/libpsystem.a index b7c71457..e6177362 100644 Binary files a/lib/libpsystem.a and b/lib/libpsystem.a differ diff --git a/lib/shell.ppu b/lib/shell.ppu index 4a4294b6..339a44d6 100644 Binary files a/lib/shell.ppu and b/lib/shell.ppu differ diff --git a/lib/terminal.ppu b/lib/terminal.ppu index 2ef98d43..d9bc3092 100644 Binary files a/lib/terminal.ppu and b/lib/terminal.ppu differ diff --git a/src/console.pas b/src/console.pas index 8ac8571c..96e6115f 100644 --- a/src/console.pas +++ b/src/console.pas @@ -368,9 +368,10 @@ begin end; end; if idx <> MAX_WINDOWS then begin - for i:=idx to MAX_WINDOWS-1 do begin + for i:=idx to MAX_WINDOWS-2 do begin WindowManager.Z_Order[i]:= WindowManager.Z_Order[i+1]; end; + WindowManager.Z_Order[MAX_WINDOWS-1]:= MAX_WINDOWS; end; end; @@ -580,9 +581,9 @@ var begin if WindowManager.Windows[WND] <> nil then begin + RemoveFromZOrder(WND); WNDCopy:= WindowManager.Windows[WND]; WindowManager.Windows[WND]:= nil; - RemoveFromZOrder(WND); if WNDCopy^.Hooks.OnClose <> nil then WNDCopy^.Hooks.OnClose(); kfree(void(WNDCopy^.WND_NAME)); kfree(void(WNDCopy)); @@ -694,60 +695,14 @@ var SelectedWindow : uint32; begin + { Clear the Console_Matrix } for y:=0 to 63 do begin for x:=0 to 159 do begin Console_Matrix[y][x]:= Default_Char; end; end; - if MouseDown then begin - if MovingWindow = 0 then begin - MovingWindow:= WindowTitleMask[MouseYToTile(WindowManager.MousePrev.Y)][MouseXToTile(WindowManager.MousePrev.X)]; - if MovingWindow <> 0 then begin - WindowMovePos.x:= MouseXToTile(WindowManager.MousePrev.X); - WindowMovePos.y:= MouseYToTile(WindowManager.MousePrev.Y); - end else begin - MovingWindow:= MAX_WINDOWS; - end; - end; - if MovingWindow <> MAX_WINDOWS then begin - if WindowManager.Windows[MovingWindow] <> nil then begin - deltax:= WindowMovePos.x - MouseXToTile(WindowManager.MousePrev.X); - deltay:= WindowMovePos.y - MouseYToTile(WindowManager.MousePrev.Y); - WindowMovePos.x:= MouseXToTile(WindowManager.MousePrev.X); - WindowMovePos.y:= MouseYToTile(WindowManager.MousePrev.Y); - setWindowPosition(MovingWindow, WindowManager.Windows[MovingWindow]^.WND_X - deltax, WindowManager.Windows[MovingWindow]^.WND_Y - deltay); - FocusZOrder(MovingWindow); - end; - end; - end else begin - MovingWindow:= 0; - end; - if UnhandledClick then begin - if UnhandledClickLeft then begin - SelectedWindow:= WindowMask[MouseYToTile(WindowManager.MousePrev.Y)][MouseXToTile(WindowManager.MousePrev.X)]; - if (SelectedWindow <> 0) and (WindowManager.Windows[SelectedWindow] <> nil) and (WindowManager.Z_Order[0] = SelectedWindow) then begin - //OnClickHandler(Left) - end else begin - if SelectedWindow = 0 then SelectedWindow:= WindowTitleMask[MouseYToTile(WindowManager.MousePrev.Y)][MouseXToTile(WindowManager.MousePrev.X)]; - if SelectedWindow <> 0 then begin - if WindowManager.Windows[SelectedWindow] <> nil then begin - if WindowManager.Windows[SelectedWindow]^.ShellWND then FocusZOrder(SelectedWindow); - end; - end; - SelectedWindow:= ExitMask[MouseYToTile(WindowManager.MousePrev.Y)][MouseXToTile(WindowManager.MousePrev.X)]; - if SelectedWindow <> 0 then begin - closeWindow(SelectedWindow); - end; - end; - end; - if not UnhandledClickLeft then begin - SelectedWindow:= WindowMask[MouseYToTile(WindowManager.MousePrev.Y)][MouseXToTile(WindowManager.MousePrev.X)]; - if (SelectedWindow <> 0) and (WindowManager.Windows[SelectedWindow] <> nil) and (WindowManager.Z_Order[0] = SelectedWindow) then begin - //OnClickHandler(Right) - end; - end; - UnhandledClick:= false; - end; + + { Redraw all of the Windows to the Matrix taking into account Z_Order and borders } for w:=MAX_WINDOWS-1 downto 0 do begin if WindowManager.Z_Order[w] = MAX_WINDOWS then continue; if WindowManager.Windows[WindowManager.Z_Order[w]] <> nil then begin @@ -798,10 +753,88 @@ begin end; end; end; - if WindowManager.Windows[WindowManager.Z_Order[w]]^.Closed then _closeWindow(WindowManager.Z_Order[w]); end; end; + + { Handle any Clicks that have happened since last redraw } + if UnhandledClick then begin + if UnhandledClickLeft then begin + SelectedWindow:= WindowMask[MouseYToTile(WindowManager.MousePrev.Y)][MouseXToTile(WindowManager.MousePrev.X)]; + if (SelectedWindow <> 0) and (WindowManager.Windows[SelectedWindow] <> nil) then begin + //OnClickHandler(Left) + if (WindowManager.Z_Order[0] = SelectedWindow) or (WindowManager.Windows[SelectedWindow]^.ShellWND = false) then begin + if WindowManager.Windows[SelectedWindow]^.Hooks.OnMouseClick <> nil then begin + deltax:= MouseXToTile(WindowManager.MousePrev.X) - WindowManager.Windows[SelectedWindow]^.WND_X; + deltay:= MouseYToTile(WindowManager.MousePrev.Y) - WindowManager.Windows[SelectedWindow]^.WND_Y; + WindowManager.Windows[SelectedWindow]^.Hooks.OnMouseClick(deltax, deltay, true); + end; + end; + if (WindowManager.Z_Order[0] <> SelectedWindow) and (WindowManager.Windows[SelectedWindow]^.ShellWND) then begin + FocusZOrder(SelectedWindow); + end; + end else begin + if SelectedWindow = 0 then SelectedWindow:= WindowTitleMask[MouseYToTile(WindowManager.MousePrev.Y)][MouseXToTile(WindowManager.MousePrev.X)]; + if SelectedWindow <> 0 then begin + if WindowManager.Windows[SelectedWindow] <> nil then begin + if WindowManager.Windows[SelectedWindow]^.ShellWND then FocusZOrder(SelectedWindow); + end; + end; + SelectedWindow:= ExitMask[MouseYToTile(WindowManager.MousePrev.Y)][MouseXToTile(WindowManager.MousePrev.X)]; + if SelectedWindow <> 0 then begin + closeWindow(SelectedWindow); + end; + end; + end; + if not UnhandledClickLeft then begin + SelectedWindow:= WindowMask[MouseYToTile(WindowManager.MousePrev.Y)][MouseXToTile(WindowManager.MousePrev.X)]; + if (SelectedWindow <> 0) and (WindowManager.Windows[SelectedWindow] <> nil) then begin + //OnClickHandler(Right) + if (WindowManager.Z_Order[0] = SelectedWindow) or (WindowManager.Windows[SelectedWindow]^.ShellWND = false) then begin + if WindowManager.Windows[SelectedWindow]^.Hooks.OnMouseClick <> nil then begin + deltax:= MouseXToTile(WindowManager.MousePrev.X) - WindowManager.Windows[SelectedWindow]^.WND_X; + deltay:= MouseYToTile(WindowManager.MousePrev.Y) - WindowManager.Windows[SelectedWindow]^.WND_Y; + WindowManager.Windows[SelectedWindow]^.Hooks.OnMouseClick(deltax, deltay, false); + end; + end; + end; + end; + UnhandledClick:= false; + end; + + { Handle Moving Windows using MouseDown and Delta positions } + if MouseDown then begin + if MovingWindow = 0 then begin + MovingWindow:= WindowTitleMask[MouseYToTile(WindowManager.MousePrev.Y)][MouseXToTile(WindowManager.MousePrev.X)]; + if MovingWindow <> 0 then begin + WindowMovePos.x:= MouseXToTile(WindowManager.MousePrev.X); + WindowMovePos.y:= MouseYToTile(WindowManager.MousePrev.Y); + end else begin + MovingWindow:= MAX_WINDOWS; + end; + end; + if MovingWindow <> MAX_WINDOWS then begin + if WindowManager.Windows[MovingWindow] <> nil then begin + deltax:= WindowMovePos.x - MouseXToTile(WindowManager.MousePrev.X); + deltay:= WindowMovePos.y - MouseYToTile(WindowManager.MousePrev.Y); + WindowMovePos.x:= MouseXToTile(WindowManager.MousePrev.X); + WindowMovePos.y:= MouseYToTile(WindowManager.MousePrev.Y); + setWindowPosition(MovingWindow, WindowManager.Windows[MovingWindow]^.WND_X - deltax, WindowManager.Windows[MovingWindow]^.WND_Y - deltay); + FocusZOrder(MovingWindow); + end; + end; + end else begin + MovingWindow:= 0; + end; + + { Console_Matrix -> Actual Screen Buffer } redrawMatrix; + + { Handle any closed Windows ready for next redraw } + for w:=0 to MAX_WINDOWS-1 do begin + if WindowManager.Windows[w] <> nil then begin + if WindowManager.Windows[w]^.Closed then _closeWindow(w); + end; + end; end; procedure initWindows; @@ -996,6 +1029,15 @@ begin outb($3D5, $20); end; +procedure keyhook(key_info : TKeyInfo); +begin + if WindowManager.Z_Order[0] <> MAX_WINDOWS then begin + if WindowManager.Windows[WindowManager.Z_Order[0]] <> nil then begin + if WindowManager.Windows[WindowManager.Z_Order[0]]^.Hooks.OnKeyPressed <> nil then WindowManager.Windows[WindowManager.Z_Order[0]]^.Hooks.OnKeyPressed(key_info); + end; + end; +end; + procedure init(); [public, alias: 'console_init']; var fb: puint32; @@ -1003,6 +1045,7 @@ var Begin fb:= puint32(uint32(multibootinfo^.framebuffer_addr)); kpalloc(uint32(fb)); + keyboard.hook(@keyhook); initWindows; Console_Properties.Default_Attribute:= console.combinecolors($FFFF, $0000); console.clear(); diff --git a/src/include/asuro.pas b/src/include/asuro.pas index e8d85f11..b931fe7c 100644 --- a/src/include/asuro.pas +++ b/src/include/asuro.pas @@ -3,11 +3,11 @@ unit asuro; interface const - VERSION = '1.0.0-632a'; + VERSION = '1.0.0-634a'; VERSION_MAJOR = '1'; VERSION_MINOR = '0'; VERSION_SUB = '0'; - REVISION = '632'; + REVISION = '634'; RELEASE = 'a'; implementation diff --git a/src/kernel.pas b/src/kernel.pas index 8b08d285..8110fe58 100644 --- a/src/kernel.pas +++ b/src/kernel.pas @@ -208,19 +208,18 @@ begin console.setdefaultattribute(console.combinecolors($17E0, $0000)); console.writestringln('Asuro Booted Correctly!'); console.setdefaultattribute(console.combinecolors($FFFF, $0000)); - console.writestringln(''); - console.writestringln('Press any key to boot in to Asuro Terminal...'); - tracer.pop_trace; + //console.writestringln(''); + //console.writestringln('Press any key to boot in to Asuro Terminal...'); + //tracer.pop_trace; { Init Progs } shell.init(); memview.init(); - console.writehexln(uint32(multibootinfo^.framebuffer_addr)); - - tracer.push_trace('kmain.KEYHOOK'); - keyboard.hook(@temphook); - tracer.pop_trace; + //console.writehexln(uint32(multibootinfo^.framebuffer_addr)); + //tracer.push_trace('kmain.KEYHOOK'); + //keyboard.hook(@temphook); + //tracer.pop_trace; tracer.push_trace('kmain.END'); diff --git a/src/prog/shell.pas b/src/prog/shell.pas index de2d0578..9efd03e1 100644 --- a/src/prog/shell.pas +++ b/src/prog/shell.pas @@ -3,7 +3,7 @@ unit shell; interface uses - Console, RTC; + Console, RTC, terminal; procedure init(); @@ -49,6 +49,17 @@ begin writeIntExWND(DateTime.Seconds, Colors, Handle); end; +procedure OnMouseClick(x : uint32; y : uint32; left : boolean); +begin + //WriteIntLn(x); + //WriteIntLn(y); + if left then begin + if (y = 0) and (x < 10) then begin + terminal.run; + end; + end; +end; + procedure init(); begin colors:= console.combinecolors($0000, $FFFF); @@ -58,6 +69,7 @@ begin //console.clearWNDEx(Handle, colors); console.setShellWindow(Handle, false); console.registerEventHandler(Handle, EVENT_DRAW, void(@Draw)); + console.registerEventHandler(Handle, EVENT_MOUSE_CLICK, void(@OnMouseClick)); end; end. \ No newline at end of file diff --git a/src/terminal.pas b/src/terminal.pas index 4b2047c6..1c3af231 100644 --- a/src/terminal.pas +++ b/src/terminal.pas @@ -65,7 +65,7 @@ uses RTC; var - TERMINAL_HWND : HWND = 1; + TERMINAL_HWND : HWND = 0; function getTerminalHWND : uint32; begin @@ -340,23 +340,25 @@ end; procedure key_event(info : TKeyInfo); begin - if (info.key_code >= 32) and (info.key_code <= 126) then begin - if bIndex < 1024 then begin - buffer[bIndex]:= info.key_code; - inc(bIndex); - console.writecharWND(char(info.key_code), TERMINAL_HWND); + if TERMINAL_HWND <> 0 then begin + if (info.key_code >= 32) and (info.key_code <= 126) then begin + if bIndex < 1024 then begin + buffer[bIndex]:= info.key_code; + inc(bIndex); + console.writecharWND(char(info.key_code), TERMINAL_HWND); + end; + end; + if info.key_code = 8 then begin //backspace + if bIndex > 0 then begin + console.backspaceWND(TERMINAL_HWND); + dec(bIndex); + buffer[bIndex]:= 0; + end; end; - end; - if info.key_code = 8 then begin //backspace - if bIndex > 0 then begin - console.backspaceWND(TERMINAL_HWND); - dec(bIndex); - buffer[bIndex]:= 0; + if info.key_code = 13 then begin //return + process_command; end; end; - if info.key_code = 13 then begin //return - process_command; - end; end; procedure change_dir(Params : PParamList); @@ -366,11 +368,6 @@ begin end; end; -procedure ToggleWND1(Params : PParamList); -begin - console.toggleWNDVisible(1); -end; - procedure SendSerial(Params : PParamList); var success : boolean; @@ -409,22 +406,27 @@ begin registerCommand('TEST', @test, 'Command for testing.'); registerCommand('CD', @change_dir, 'Change Directory test.'); registerCommand('PATTERN', @cockwomble, 'Print an animated pattern to the screen.'); - registerCommand('TOGGLEWND1', @ToggleWND1, 'Toggle WND 1 Visibility.'); registerCommand('TIME', @printTime, 'Print the current time.'); registerCommand('SERIAL', @SendSerial, 'Send ''helloworld'' through COM1.'); console.writestringln('TERMINAL: INIT END.'); end; +procedure OnClose(); +begin + TERMINAL_HWND:= 0; +end; + procedure run; begin - TERMINAL_HWND:= newWindow(20, 10, 90, 20, 'ASURO TERMINAL'); - //newWindow(10, 10, 32, 32, 'MEMVIEW'); - keyboard.hook(@key_event); - console.clearWND(TERMINAL_HWND); - console.writestringWND('Asuro#', TERMINAL_HWND); - console.writestringWND(Working_Directory, TERMINAL_HWND); - console.writestringWND('> ', TERMINAL_HWND); - console.setWNDVisible(TERMINAL_HWND, true); + if TERMINAL_HWND = 0 then begin + TERMINAL_HWND:= newWindow(20, 10, 90, 20, 'ASURO TERMINAL'); + console.registerEventHandler(TERMINAL_HWND, EVENT_KEY_PRESSED, void(@key_event)); + console.registerEventHandler(TERMINAL_HWND, EVENT_CLOSE, void(@OnClose)); + console.clearWND(TERMINAL_HWND); + console.writestringWND('Asuro#', TERMINAL_HWND); + console.writestringWND(Working_Directory, TERMINAL_HWND); + console.writestringWND('> ', TERMINAL_HWND); + end; end; end. \ No newline at end of file