git-svn-id: https://spexeah.com:8443/svn/Asuro@631 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c
This commit is contained in:
		
							
								
								
									
										170
									
								
								src/console.pas
									
									
									
									
									
								
							
							
						
						
									
										170
									
								
								src/console.pas
									
									
									
									
									
								
							| @@ -248,16 +248,16 @@ type | |||||||
|     TLoseFocusHook  = procedure(); |     TLoseFocusHook  = procedure(); | ||||||
|  |  | ||||||
|     THooks = record |     THooks = record | ||||||
|         OnDraw       : TDrawHook; |         OnDraw       : TDrawHook;       //Implemented | ||||||
|         OnMouseClick : TMouseClickHook; |         OnMouseClick : TMouseClickHook;  | ||||||
|         OnMouseMove  : TMouseMoveHook; |         OnMouseMove  : TMouseMoveHook;   | ||||||
|         OnMouseDown  : TMouseDownHook; |         OnMouseDown  : TMouseDownHook;   | ||||||
|         OnMouseUp    : TMouseUpHook; |         OnMouseUp    : TMouseUpHook;     | ||||||
|         OnKeyPressed : TKeyPressedHook; |         OnKeyPressed : TKeyPressedHook;  | ||||||
|         OnClose      : TCloseHook; |         OnClose      : TCloseHook;     //Implemented | ||||||
|         OnMinimize   : TMinimizeHook; |         OnMinimize   : TMinimizeHook;   | ||||||
|         OnFocus      : TFocusHook; |         OnFocus      : TFocusHook;     //Implemented | ||||||
|         OnLoseFocus  : TLoseFocusHook; |         OnLoseFocus  : TLoseFocusHook; //Implemented | ||||||
|     end; |     end; | ||||||
|  |  | ||||||
|     TWindow = record |     TWindow = record | ||||||
| @@ -278,9 +278,11 @@ type | |||||||
|     PWindow = ^TWindow; |     PWindow = ^TWindow; | ||||||
|  |  | ||||||
|     TWindows = Array[0..MAX_WINDOWS-1] of PWindow; |     TWindows = Array[0..MAX_WINDOWS-1] of PWindow; | ||||||
|  |     TZOrder  = Array[0..MAX_WINDOWS-1] of uint32; | ||||||
|  |  | ||||||
|     TWindowManager = record |     TWindowManager = record | ||||||
|         Windows     : TWindows; |         Windows     : TWindows; | ||||||
|  |         Z_Order     : TZOrder; | ||||||
|         MousePos    : TMouseCoord; |         MousePos    : TMouseCoord; | ||||||
|         MousePrev   : TMouseCoord; |         MousePrev   : TMouseCoord; | ||||||
|     end; |     end; | ||||||
| @@ -303,9 +305,12 @@ var | |||||||
|    Default_Char       : TCharacter; |    Default_Char       : TCharacter; | ||||||
|    WindowTitleMask    : TMask; |    WindowTitleMask    : TMask; | ||||||
|    WindowMask         : TMask; |    WindowMask         : TMask; | ||||||
|  |    ExitMask           : TMask; | ||||||
|    MouseDown          : Boolean; |    MouseDown          : Boolean; | ||||||
|    WindowMovePos      : TMouseCoord; |    WindowMovePos      : TMouseCoord; | ||||||
|    MovingWindow       : uint32; |    MovingWindow       : uint32; | ||||||
|  |    UnhandledClick     : Boolean = false; | ||||||
|  |    UnhandledClickLeft : Boolean = false; | ||||||
|  |  | ||||||
|  |  | ||||||
| procedure _MouseDown(); | procedure _MouseDown(); | ||||||
| @@ -320,7 +325,80 @@ end; | |||||||
|  |  | ||||||
| procedure _MouseClick(left : boolean); | procedure _MouseClick(left : boolean); | ||||||
| begin | begin | ||||||
|  |     if not UnhandledClick then begin | ||||||
|  |         UnhandledClick:= true; | ||||||
|  |         UnhandledClickLeft:= left; | ||||||
|  |     end; | ||||||
|  | end; | ||||||
|  |  | ||||||
|  | procedure AddToZOrder(WND : HWND); | ||||||
|  | var | ||||||
|  |     idx : uint32; | ||||||
|  |     i : uint32; | ||||||
|  |     Window : PWindow; | ||||||
|  |  | ||||||
|  | begin | ||||||
|  |     idx:= MAX_WINDOWS; | ||||||
|  |     for i:=0 to MAX_WINDOWS-1 do begin | ||||||
|  |         if WindowManager.Z_Order[i] = WND then begin | ||||||
|  |             break; | ||||||
|  |         end; | ||||||
|  |         if WindowManager.Z_Order[i] = MAX_WINDOWS then begin | ||||||
|  |             idx:= i; | ||||||
|  |             break; | ||||||
|  |         end; | ||||||
|  |     end; | ||||||
|  |     if idx <> MAX_WINDOWS then begin | ||||||
|  |         WindowManager.Z_Order[idx]:= WND; | ||||||
|  |     end; | ||||||
|  | end; | ||||||
|  |  | ||||||
|  | procedure RemoveFromZOrder(WND : HWND); | ||||||
|  | var | ||||||
|  |     i : uint32; | ||||||
|  |  | ||||||
|  | begin | ||||||
|  |     for i:=0 to MAX_WINDOWS-1 do begin | ||||||
|  |         if WindowManager.Z_Order[i] = WND then begin | ||||||
|  |             WindowManager.Z_Order[i]:= MAX_WINDOWS; | ||||||
|  |             break; | ||||||
|  |         end; | ||||||
|  |     end; | ||||||
|  | end; | ||||||
|  |  | ||||||
|  | procedure FocusZOrder(WND : HWND); | ||||||
|  | var | ||||||
|  |     i : uint32; | ||||||
|  |     idx : uint32; | ||||||
|  |     old, new : HWND; | ||||||
|  |     wold, wnew : PWindow; | ||||||
|  |  | ||||||
|  | begin | ||||||
|  |     idx:= MAX_WINDOWS; | ||||||
|  |     for i:=0 to MAX_WINDOWS-1 do begin | ||||||
|  |         if WindowManager.Z_Order[i] = WND then begin | ||||||
|  |             idx:= i; | ||||||
|  |             break; | ||||||
|  |         end; | ||||||
|  |     end; | ||||||
|  |     if idx <> MAX_WINDOWS then begin | ||||||
|  |         old:= WindowManager.Z_Order[0]; | ||||||
|  |         new:= WND; | ||||||
|  |         for i:=idx downto 1 do begin | ||||||
|  |             WindowManager.Z_Order[i]:= WindowManager.Z_Order[i-1]; | ||||||
|  |         end; | ||||||
|  |         WindowManager.Z_Order[0]:= WND; | ||||||
|  |         if old <> new then begin | ||||||
|  |             wold:= WindowManager.Windows[old]; | ||||||
|  |             wnew:= WindowManager.Windows[new]; | ||||||
|  |             if wold <> nil then begin | ||||||
|  |                 if wold^.Hooks.OnLoseFocus <> nil then wold^.Hooks.OnLoseFocus(); | ||||||
|  |             end; | ||||||
|  |             if wnew <> nil then begin | ||||||
|  |                 if wnew^.Hooks.OnFocus <> nil then wnew^.Hooks.OnFocus(); | ||||||
|  |             end; | ||||||
|  |         end; | ||||||
|  |     end; | ||||||
| end; | end; | ||||||
|  |  | ||||||
| function getWindowName(WND : HWND) : pchar; | function getWindowName(WND : HWND) : pchar; | ||||||
| @@ -466,6 +544,8 @@ begin | |||||||
|         WND^.Hooks.OnFocus      := nil; |         WND^.Hooks.OnFocus      := nil; | ||||||
|         WND^.Hooks.OnLoseFocus  := nil; |         WND^.Hooks.OnLoseFocus  := nil; | ||||||
|         WindowManager.Windows[newWindow]:= WND; |         WindowManager.Windows[newWindow]:= WND; | ||||||
|  |         AddToZOrder(newWindow); | ||||||
|  |         FocusZOrder(newWindow); | ||||||
|     end; |     end; | ||||||
| end; | end; | ||||||
|  |  | ||||||
| @@ -494,6 +574,7 @@ begin | |||||||
|     if WindowManager.Windows[WND] <> nil then begin |     if WindowManager.Windows[WND] <> nil then begin | ||||||
|         WNDCopy:= WindowManager.Windows[WND]; |         WNDCopy:= WindowManager.Windows[WND]; | ||||||
|         WindowManager.Windows[WND]:= nil; |         WindowManager.Windows[WND]:= nil; | ||||||
|  |         RemoveFromZOrder(WND); | ||||||
|         if WNDCopy^.Hooks.OnClose <> nil then WNDCopy^.Hooks.OnClose(); |         if WNDCopy^.Hooks.OnClose <> nil then WNDCopy^.Hooks.OnClose(); | ||||||
|         kfree(void(WNDCopy^.WND_NAME)); |         kfree(void(WNDCopy^.WND_NAME)); | ||||||
|         kfree(void(WNDCopy)); |         kfree(void(WNDCopy)); | ||||||
| @@ -602,6 +683,7 @@ var | |||||||
|     STRC : uint32; |     STRC : uint32; | ||||||
|     MIDP, STARTP : uint32; |     MIDP, STARTP : uint32; | ||||||
|     deltax, deltay : sint32; |     deltax, deltay : sint32; | ||||||
|  |     SelectedWindow : uint32; | ||||||
|  |  | ||||||
| begin | begin | ||||||
|     for y:=0 to 63 do begin |     for y:=0 to 63 do begin | ||||||
| @@ -615,33 +697,52 @@ begin | |||||||
|             if MovingWindow <> 0 then begin |             if MovingWindow <> 0 then begin | ||||||
|                 WindowMovePos.x:= MouseXToTile(WindowManager.MousePrev.X); |                 WindowMovePos.x:= MouseXToTile(WindowManager.MousePrev.X); | ||||||
|                 WindowMovePos.y:= MouseYToTile(WindowManager.MousePrev.Y); |                 WindowMovePos.y:= MouseYToTile(WindowManager.MousePrev.Y); | ||||||
|  |             end else begin | ||||||
|  |                 MovingWindow:= MAX_WINDOWS; | ||||||
|             end; |             end; | ||||||
|         end; |         end; | ||||||
|         if MovingWindow <> 0 then begin |         if MovingWindow <> MAX_WINDOWS then begin | ||||||
|             if WindowManager.Windows[MovingWindow] <> nil then begin |             if WindowManager.Windows[MovingWindow] <> nil then begin | ||||||
|                 deltax:= WindowMovePos.x - MouseXToTile(WindowManager.MousePrev.X); |                 deltax:= WindowMovePos.x - MouseXToTile(WindowManager.MousePrev.X); | ||||||
|                 deltay:= WindowMovePos.y - MouseYToTile(WindowManager.MousePrev.Y); |                 deltay:= WindowMovePos.y - MouseYToTile(WindowManager.MousePrev.Y); | ||||||
|                 WindowMovePos.x:= MouseXToTile(WindowManager.MousePrev.X); |                 WindowMovePos.x:= MouseXToTile(WindowManager.MousePrev.X); | ||||||
|                 WindowMovePos.y:= MouseYToTile(WindowManager.MousePrev.Y); |                 WindowMovePos.y:= MouseYToTile(WindowManager.MousePrev.Y); | ||||||
|                 setWindowPosition(MovingWindow, WindowManager.Windows[MovingWindow]^.WND_X - deltax, WindowManager.Windows[MovingWindow]^.WND_Y - deltay); |                 setWindowPosition(MovingWindow, WindowManager.Windows[MovingWindow]^.WND_X - deltax, WindowManager.Windows[MovingWindow]^.WND_Y - deltay); | ||||||
|                 //WindowManager.Windows[MovingWindow]^.WND_X:= WindowManager.Windows[MovingWindow]^.WND_X - deltax; |                 FocusZOrder(MovingWindow); | ||||||
|                 //WindowManager.Windows[MovingWindow]^.WND_Y:= WindowManager.Windows[MovingWindow]^.WND_Y - deltay; |  | ||||||
|             end; |             end; | ||||||
|         end; |         end; | ||||||
|     end else begin |     end else begin | ||||||
|         MovingWindow:= 0; |         MovingWindow:= 0; | ||||||
|     end; |     end; | ||||||
|     for w:=0 to MAX_WINDOWS-1 do begin |     if UnhandledClick then begin | ||||||
|         if WindowManager.Windows[w] <> nil then begin |         if UnhandledClickLeft then begin | ||||||
|             if w <> 0 then begin |             SelectedWindow:= WindowTitleMask[MouseYToTile(WindowManager.MousePrev.Y)][MouseXToTile(WindowManager.MousePrev.X)]; | ||||||
|                 if WindowManager.Windows[w]^.Hooks.OnDraw <> nil then WindowManager.Windows[w]^.Hooks.OnDraw(); |             if SelectedWindow = 0 then SelectedWindow:= WindowMask[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; |             end; | ||||||
|             If WindowManager.Windows[w]^.visible then begin |             SelectedWindow:= ExitMask[MouseYToTile(WindowManager.MousePrev.Y)][MouseXToTile(WindowManager.MousePrev.X)]; | ||||||
|                 if WindowManager.Windows[w]^.Border then begin |             if SelectedWindow <> 0 then begin | ||||||
|                     WXL:= WindowManager.Windows[w]^.WND_X - 1; |                 closeWindow(SelectedWindow); | ||||||
|                     WYL:= WindowManager.Windows[w]^.WND_Y - 1; |             end; | ||||||
|                     WXR:= WindowManager.Windows[w]^.WND_X + WindowManager.Windows[w]^.WND_W + 1; |         end; | ||||||
|                     WYR:= WindowManager.Windows[w]^.WND_Y + WindowManager.Windows[w]^.WND_H + 1; |         if not UnhandledClickLeft then begin | ||||||
|  |  | ||||||
|  |         end; | ||||||
|  |         UnhandledClick:= false; | ||||||
|  |     end; | ||||||
|  |     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 | ||||||
|  |             if WindowManager.Windows[WindowManager.Z_Order[w]]^.Hooks.OnDraw <> nil then WindowManager.Windows[WindowManager.Z_Order[w]]^.Hooks.OnDraw(); | ||||||
|  |             If WindowManager.Windows[WindowManager.Z_Order[w]]^.visible then begin | ||||||
|  |                 if WindowManager.Windows[WindowManager.Z_Order[w]]^.Border then begin | ||||||
|  |                     WXL:= WindowManager.Windows[WindowManager.Z_Order[w]]^.WND_X - 1; | ||||||
|  |                     WYL:= WindowManager.Windows[WindowManager.Z_Order[w]]^.WND_Y - 1; | ||||||
|  |                     WXR:= WindowManager.Windows[WindowManager.Z_Order[w]]^.WND_X + WindowManager.Windows[WindowManager.Z_Order[w]]^.WND_W + 1; | ||||||
|  |                     WYR:= WindowManager.Windows[WindowManager.Z_Order[w]]^.WND_Y + WindowManager.Windows[WindowManager.Z_Order[w]]^.WND_H + 1; | ||||||
|                     for y:=WYL to WYR do begin |                     for y:=WYL to WYR do begin | ||||||
|                         Console_Matrix[y][WXL]:= Window_Border; |                         Console_Matrix[y][WXL]:= Window_Border; | ||||||
|                         Console_Matrix[y][WXL-1]:= Window_Border; |                         Console_Matrix[y][WXL-1]:= Window_Border; | ||||||
| @@ -654,33 +755,35 @@ begin | |||||||
|                     end; |                     end; | ||||||
|                     STRC:= 0; |                     STRC:= 0; | ||||||
|                     MIDP:= (WXR + WXL) div 2; |                     MIDP:= (WXR + WXL) div 2; | ||||||
|                     STARTP:= MIDP - (StringSize(WindowManager.Windows[w]^.WND_NAME) div 2) - 1; |                     STARTP:= MIDP - (StringSize(WindowManager.Windows[WindowManager.Z_Order[w]]^.WND_NAME) div 2) - 1; | ||||||
|                     for x:=WXL to WXR do begin |                     for x:=WXL to WXR do begin | ||||||
|                         Console_Matrix[WYL][x]:= Window_Border; |                         Console_Matrix[WYL][x]:= Window_Border; | ||||||
|                         WindowTitleMask[WYL][x]:= w; |                         WindowTitleMask[WYL][x]:= WindowManager.Z_Order[w]; | ||||||
|                         if (x >= STARTP) and (STRC < StringSize(WindowManager.Windows[w]^.WND_NAME)) then begin |                         if (x >= STARTP) and (STRC < StringSize(WindowManager.Windows[WindowManager.Z_Order[w]]^.WND_NAME)) then begin | ||||||
|                             Console_Matrix[WYL][x].character:= WindowManager.Windows[w]^.WND_NAME[STRC]; |                             Console_Matrix[WYL][x].character:= WindowManager.Windows[WindowManager.Z_Order[w]]^.WND_NAME[STRC]; | ||||||
|                             inc(STRC); |                             inc(STRC); | ||||||
|                         end; |                         end; | ||||||
|                         if x = WXR then begin |                         if x = WXR then begin | ||||||
|                             Console_Matrix[WYL][x].character:= 'x'; |                             Console_Matrix[WYL][x].character:= 'x'; | ||||||
|  |                             ExitMask[WYL][x]:= WindowManager.Z_Order[w]; | ||||||
|                         end; |                         end; | ||||||
|                         Console_Matrix[WYR][x]:= Window_Border; |                         Console_Matrix[WYR][x]:= Window_Border; | ||||||
|                         Console_Real[WYL][x].Character:= char(3); |                         Console_Real[WYL][x].Character:= char(3); | ||||||
|                         Console_Real[WYR][x].Character:= char(3); |                         Console_Real[WYR][x].Character:= char(3); | ||||||
|                     end; |                     end; | ||||||
|                 end; |                 end; | ||||||
|                 for y:=WindowManager.Windows[w]^.WND_Y to WindowManager.Windows[w]^.WND_Y + WindowManager.Windows[w]^.WND_H do begin |                 for y:=WindowManager.Windows[WindowManager.Z_Order[w]]^.WND_Y to WindowManager.Windows[WindowManager.Z_Order[w]]^.WND_Y + WindowManager.Windows[WindowManager.Z_Order[w]]^.WND_H do begin | ||||||
|                     if y > 63 then break; |                     if y > 63 then break; | ||||||
|                     for x:=WindowManager.Windows[w]^.WND_X to WindowManager.Windows[w]^.WND_X + WindowManager.Windows[w]^.WND_W do begin |                     for x:=WindowManager.Windows[WindowManager.Z_Order[w]]^.WND_X to WindowManager.Windows[WindowManager.Z_Order[w]]^.WND_X + WindowManager.Windows[WindowManager.Z_Order[w]]^.WND_W do begin | ||||||
|                         if x > 159 then break; |                         if x > 159 then break; | ||||||
|                         Console_Matrix[y][x]:= WindowManager.Windows[w]^.buffer[y - WindowManager.Windows[w]^.WND_Y][x - WindowManager.Windows[w]^.WND_X]; |                         Console_Matrix[y][x]:= WindowManager.Windows[WindowManager.Z_Order[w]]^.buffer[y - WindowManager.Windows[WindowManager.Z_Order[w]]^.WND_Y][x - WindowManager.Windows[WindowManager.Z_Order[w]]^.WND_X]; | ||||||
|                         WindowTitleMask[y][x]:= 0; |                         WindowTitleMask[y][x]:= 0; | ||||||
|                         WindowMask[y][x]:= w; |                         WindowMask[y][x]:= WindowManager.Z_Order[w]; | ||||||
|  |                         ExitMask[y][x]:= 0; | ||||||
|                     end; |                     end; | ||||||
|                 end; |                 end; | ||||||
|             end; |             end; | ||||||
|             if WindowManager.Windows[w]^.Closed then _closeWindow(w); |             if WindowManager.Windows[WindowManager.Z_Order[w]]^.Closed then _closeWindow(WindowManager.Z_Order[w]); | ||||||
|         end; |         end; | ||||||
|     end; |     end; | ||||||
|     redrawMatrix; |     redrawMatrix; | ||||||
| @@ -702,6 +805,7 @@ begin | |||||||
|  |  | ||||||
|     For w:=0 to MAX_WINDOWS-1 do begin |     For w:=0 to MAX_WINDOWS-1 do begin | ||||||
|         WindowManager.Windows[w]:= nil; |         WindowManager.Windows[w]:= nil; | ||||||
|  |         WindowManager.Z_Order[w]:= MAX_WINDOWS; | ||||||
|     end; |     end; | ||||||
|  |  | ||||||
|     WND:= PWindow(kalloc(sizeof(TWindow))); |     WND:= PWindow(kalloc(sizeof(TWindow))); | ||||||
| @@ -717,6 +821,8 @@ begin | |||||||
|     WND^.Border:= false; |     WND^.Border:= false; | ||||||
|     WND^.ShellWND:= false; |     WND^.ShellWND:= false; | ||||||
|     WindowManager.Windows[0]:= WND; |     WindowManager.Windows[0]:= WND; | ||||||
|  |     AddToZOrder(0); | ||||||
|  |     FocusZOrder(0); | ||||||
| end; | end; | ||||||
|  |  | ||||||
| function getPixel(x : uint32; y : uint32) : uint16; | function getPixel(x : uint32; y : uint32) : uint16; | ||||||
|   | |||||||
| @@ -3,11 +3,11 @@ unit asuro; | |||||||
| interface | interface | ||||||
|   |   | ||||||
| const | const | ||||||
|      VERSION       = '1.0.0-622a'; |      VERSION       = '1.0.0-625a'; | ||||||
|      VERSION_MAJOR = '1'; |      VERSION_MAJOR = '1'; | ||||||
|      VERSION_MINOR = '0'; |      VERSION_MINOR = '0'; | ||||||
|      VERSION_SUB   = '0'; |      VERSION_SUB   = '0'; | ||||||
|      REVISION      = '622'; |      REVISION      = '625'; | ||||||
|      RELEASE       = 'a'; |      RELEASE       = 'a'; | ||||||
|   |   | ||||||
| implementation | implementation | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 kieron
					kieron