X-Git-Url: http://www.lcore.org/git/lcore.git/blobdiff_plain/4782a5c5afee47721cc617daa40dd29828342c2b..257fdc360d4c80e606358c108c890c5367436a12:/lmessages.pas?ds=inline diff --git a/lmessages.pas b/lmessages.pas index 7bb73fd..a7bd01e 100755 --- a/lmessages.pas +++ b/lmessages.pas @@ -1,9 +1,24 @@ +{ Copyright (C) 2005 Bas Steendijk and Peter Green + For conditions of distribution and use, see copyright notice in zlib_license.txt + which is included in the package + ----------------------------------------------------------------------------- } + +//this unit provides a rough approximation of windows messages on linux +//it is usefull for multithreaded applications on linux to communicate back to +//the main lcore thread +//This unit is *nix only, on windows you should use the real thing + unit lmessages; //windows messages like system based on lcore tasks interface uses pgtypes,sysutils,bsearchtree,strings,syncobjs; + +{$if (fpc_version < 2) or ((fpc_version=2) and ((fpc_release < 2) or ((fpc_release = 2) and (fpc_patch < 2)) ))} + {$error this code is only supported under fpc 2.2.2 and above due to bugs in the eventobject code in older versions} +{$endif} + type lparam=taddrint; wparam=taddrint; @@ -84,7 +99,7 @@ procedure init; implementation uses - baseunix,unix,lcore;//,safewriteln; + baseunix,unix,lcore,unixutil,ltimevalstuff,sockets;//,safewriteln; {$i unixstuff.inc} type @@ -120,7 +135,7 @@ var //than crash after over four billion //windows have been made ;) nextwindowhandle : qword = $100000000; -{$i ltimevalstuff.inc} + //findthreaddata should only be called while holding the structurelock function findthreaddata(threadid : integer) : tthreaddata; @@ -394,11 +409,15 @@ begin //we have to get the window procedure while the structurelock //is still held as the window could be destroyed from another thread //otherwise. - windowproc := window.windowproc; + if window <> nil then begin + windowproc := window.windowproc; + end else begin + windowproc := nil; + end; finally structurelock.release; end; - if window <> nil then begin + if assigned(windowproc) then begin result := windowproc(lpmsg.hwnd,lpmsg.message,lpmsg.wparam,lpmsg.lparam); end else begin result := -1; @@ -475,7 +494,7 @@ end; function PeekMessage(var lpMsg: TMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): WINBOOL; begin - result := getmessageinternal(lpmsg,hwnd,wmsgfiltermin,wmsgfiltermax,PM_REMOVE,true); + result := getmessageinternal(lpmsg,hwnd,wmsgfiltermin,wmsgfiltermax,wRemoveMsg,true); end; function SetEvent(hEvent:THevent):WINBOOL; @@ -653,4 +672,4 @@ begin end; end; -end. \ No newline at end of file +end.