diff options
Diffstat (limited to 'packages/ptc/src/win32/directx/hook.inc')
-rw-r--r-- | packages/ptc/src/win32/directx/hook.inc | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/packages/ptc/src/win32/directx/hook.inc b/packages/ptc/src/win32/directx/hook.inc new file mode 100644 index 0000000000..d5ee8cfe79 --- /dev/null +++ b/packages/ptc/src/win32/directx/hook.inc @@ -0,0 +1,206 @@ +{ + Free Pascal port of the OpenPTC C++ library. + Copyright (C) 2001-2003 Nikolay Nikolov (nickysn@users.sourceforge.net) + Original C++ version by Glenn Fiedler (ptc@gaffer.org) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +} + +Constructor TDirectXHook.Create(console : Pointer; window : HWND; thread : DWord; _cursor, managed, fullscreen : Boolean); + +Begin + m_console := console; + + m_cursor := _cursor; + m_managed := managed; + m_fullscreen := fullscreen; + + LOG('creating window hook'); + + Inherited Create(window, thread); +End; + +Destructor TDirectXHook.Destroy; + +Begin + LOG('destroying window hook'); + Inherited Destroy; +End; + +Procedure TDirectXHook.cursor(flag : Boolean); + +Begin + m_cursor := flag; +End; + +Function TDirectXHook.WndProc(hWnd : HWND; message : DWord; wParam : WPARAM; lParam : LPARAM) : LRESULT; + +Var + active : Boolean; + thread : DWord; + placement : WINDOWPLACEMENT; + console : TDirectXConsole; + +Begin + Case message Of + WM_PAINT : Begin + LOG('TDirectXHook WM_PAINT'); + + { paint console } + TDirectXConsole(m_console).paint; + End; + WM_ACTIVATEAPP : Begin + LOG('TDirectXHook WM_ACTIVATEAPP'); + + { get window message data } + active := Boolean(wParam); + thread := lParam; + + { check active flag } + If active = False Then + Begin + { deactivate } + deactivate; + + { check cursor and fullscreen } + If (Not m_cursor) And m_fullscreen Then + { show cursor } + Win32Cursor_resurrect; + End + Else + Begin + { check cursor and fullscreen } + If (Not m_cursor) And m_fullscreen Then + Begin + { get window placement for active app } + If Not GetWindowPlacement(hWnd, placement) Then + { on failure set to normal show } + placement.showCmd := SW_SHOWNORMAL; + + { check show command is not minimize } + If placement.showCmd <> SW_SHOWMINIMIZED Then + {hide cursor} + Win32Cursor_kill; + End; + + { activate } + activate; + End; + + { handled } + WndProc := 1; + Exit; + End; + WM_SETCURSOR : Begin + { check cursor } + If Not m_cursor Then + { hide cursor } + SetCursor(12); + + { handled } + WndProc := 1; + Exit; + End; + WM_CLOSE : Begin + LOG('TDirectXHook WM_CLOSE'); + + If m_managed Then + Begin + console := TDirectXConsole(m_console); + + { close console } + console.close; + + { note: at this point the hook object has been destroyed by the console! } + + { internal console shutdown } + console.internal_shutdown; + + { halt } + Halt(0); + End; + + { handled } + WndProc := 1; + Exit; + End; + End; + + { unhandled } + WndProc := 0; +End; + +Procedure TDirectXHook.activate; + +Var + console : TDirectXConsole; + display : TDirectXDisplay; + primary : TDirectXPrimary; + +Begin + console := TDirectXConsole(m_console); + { check if open } + If console.m_open Then + Begin + LOG('activate'); + + { get console object references } + display := console.m_display; + primary := console.m_primary; + + { check if primary is not active } + If Not primary.active Then + Begin + { save display } + display.save; + + { activate primary } + primary.activate; + End; + End; +End; + +Procedure TDirectXHook.deactivate; + +Var + console : TDirectXConsole; + display : TDirectXDisplay; + primary : TDirectXPrimary; + +Begin + console := TDirectXConsole(m_console); + { check if open } + If console.m_open Then + Begin + LOG('deactivate'); + + { get console object references } + display := console.m_display; + primary := console.m_primary; + + { check if primary is not active } + If primary.active Then + Begin + { save primary } + primary.save; + + { deactivate primary } + primary.deactivate; + + { restore display } + display.restore; + End; + End; +End; |