X-Git-Url: http://www.lcore.org/git/lcore.git/blobdiff_plain/f04d9ac0ffbe96ead372b84dad0786daba7f5ed7..4eb91688c3bbc5eaf93c101b984f486dd42de9bc:/lmessages.pas?ds=inline

diff --git a/lmessages.pas b/lmessages.pas
index db26b38..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,unixutil;//,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;