implementation module clCrossCall_12 import StdBool, StdClass, StdInt, StdMisc, StdString, StdTuple import ostoolbox import code from //"cAcceleratorTable_121.o", "cCCallWindows_121.o", "cCCallSystem_121.o", "cCrossCall_121.o", //"cCrossCallCursor_121.o", "cCrossCallProcedureTable_121.o", "cCrossCallWindows_121.o" /* import code from library "advapi32_library", library "comctl32_library", library "kernel32_library", library "ole32_library", library "shell32_library", library "winmm_library", library "winspool_library", // library "wsock_library", // PA: should not be necessary library "kernelExt_library", library "gdiExt_library", library "userExt_library" */ //import StdDebug, tracetypes //----------------------------------------------// // Crosscall infrastructure // //----------------------------------------------// // CrossCallInfo is the basic record that is passed between the Clean thread and the OS thread: :: CrossCallInfo = { ccMsg :: !Int // The message nr: Clean->OS use CcRq...; OS->Clean use CcWm... , p1 :: !Int , p2 :: !Int , p3 :: !Int , p4 :: !Int , p5 :: !Int , p6 :: !Int } // PA: restructured issueCleanRequest for readability. // 2 versions: first without Iprint statements, second with Iprint statements. // In both cases the Bool result has also been eliminated as it is never used. issueCleanRequest :: !(CrossCallInfo -> .(.s -> .(*OSToolbox -> *(.CrossCallInfo,.s,*OSToolbox)))) !.CrossCallInfo !.s !*OSToolbox -> (!CrossCallInfo,!.s,!*OSToolbox) issueCleanRequest callback cci s tb // # tb = trace_n ("issueCleanRequest :"+++toOSCrossCallInfoString cci) tb # (reply,tb) = winKickOsThread cci tb = handleCallBacks callback reply s tb where handleCallBacks :: !(CrossCallInfo -> .(.s -> .(*OSToolbox -> *(.CrossCallInfo,.s,*OSToolbox)))) !CrossCallInfo !.s !*OSToolbox -> (!CrossCallInfo,!.s,!*OSToolbox) handleCallBacks callback cci=:{ccMsg} s tb | ccMsg>2000 = abort ("handleCallBacks "+++toString ccMsg) // # tb = trace_n ("issueCleanRequest <-- "+++toCleanCrossCallInfoString cci) tb | isReturnOrQuitCci ccMsg // # tb = trace_n "issueCleanRequest." tb = (cci,s,tb) | otherwise # (returnCci,s,tb) = callback cci s tb // # tb = trace_n ("issueCleanRequest --> "+++toOSCrossCallInfoString returnCci) tb # (replyCci,tb) = winKickOsThread returnCci tb = handleCallBacks callback replyCci s tb /* PA: version of issueCleanRequest that has no state parameter. */ issueCleanRequest2 :: !(CrossCallInfo -> .(*OSToolbox -> *(.CrossCallInfo,*OSToolbox))) !.CrossCallInfo !*OSToolbox -> (!CrossCallInfo,!*OSToolbox) issueCleanRequest2 callback cci tb // # tb = trace_n ("issueCleanRequest2 :"+++toOSCrossCallInfoString cci) tb # (reply,tb) = winKickOsThread cci tb = handleCallBacks callback reply tb where handleCallBacks :: !(CrossCallInfo -> .(*OSToolbox -> *(.CrossCallInfo,*OSToolbox))) !CrossCallInfo !*OSToolbox -> (!CrossCallInfo,!*OSToolbox) handleCallBacks callback cci=:{ccMsg} tb | ccMsg>2000 = abort ("HandleCallBacks "+++toString ccMsg) // # tb = trace_n ("issueCleanRequest2 <-- "+++toCleanCrossCallInfoString cci) tb | isReturnOrQuitCci ccMsg // # tb = trace_n "issueCleanRequest2." tb = (cci,tb) | otherwise # (returnCci,tb) = callback cci tb // # tb = trace_n ("issueCleanRequest2 --> "+++toOSCrossCallInfoString returnCci) tb # (replyCci, tb) = winKickOsThread returnCci tb = handleCallBacks callback replyCci tb // PA: macros for returning proper number of arguments within a CrossCallInfo. Rq0Cci msg :== {ccMsg=msg,p1=0, p2=0, p3=0, p4=0, p5=0, p6=0 } Rq1Cci msg v1 :== {ccMsg=msg,p1=v1,p2=0, p3=0, p4=0, p5=0, p6=0 } Rq2Cci msg v1 v2 :== {ccMsg=msg,p1=v1,p2=v2,p3=0, p4=0, p5=0, p6=0 } Rq3Cci msg v1 v2 v3 :== {ccMsg=msg,p1=v1,p2=v2,p3=v3,p4=0, p5=0, p6=0 } Rq4Cci msg v1 v2 v3 v4 :== {ccMsg=msg,p1=v1,p2=v2,p3=v3,p4=v4,p5=0, p6=0 } Rq5Cci msg v1 v2 v3 v4 v5 :== {ccMsg=msg,p1=v1,p2=v2,p3=v3,p4=v4,p5=v5,p6=0 } Rq6Cci msg v1 v2 v3 v4 v5 v6 :== {ccMsg=msg,p1=v1,p2=v2,p3=v3,p4=v4,p5=v5,p6=v6} return0Cci :: CrossCallInfo return0Cci = Rq0Cci CcRETURN0 return1Cci :: !Int -> CrossCallInfo return1Cci v = Rq1Cci CcRETURN1 v return2Cci :: !Int !Int -> CrossCallInfo return2Cci v1 v2 = Rq2Cci CcRETURN2 v1 v2 return3Cci :: !Int !Int !Int -> CrossCallInfo return3Cci v1 v2 v3 = Rq3Cci CcRETURN3 v1 v2 v3 return4Cci :: !Int !Int !Int !Int -> CrossCallInfo return4Cci v1 v2 v3 v4 = Rq4Cci CcRETURN4 v1 v2 v3 v4 return5Cci :: !Int !Int !Int !Int !Int -> CrossCallInfo return5Cci v1 v2 v3 v4 v5 = Rq5Cci CcRETURN5 v1 v2 v3 v4 v5 return6Cci :: !Int !Int !Int !Int !Int !Int -> CrossCallInfo return6Cci v1 v2 v3 v4 v5 v6 = Rq6Cci CcRETURN6 v1 v2 v3 v4 v5 v6 isReturnOrQuitCci :: !Int -> Bool isReturnOrQuitCci mess = mess==CcWASQUIT || (mess<=CcRETURNmax && mess>=CcRETURNmin) instance toInt Bool where toInt :: !Bool -> Int toInt True = -1 toInt _ = 0 errorCallback :: !String !CrossCallInfo !.s !*OSToolbox -> (!CrossCallInfo, !.s, !*OSToolbox) errorCallback source cci s tb = (return0Cci, s, iprint msgtext tb) where msgtext = " *** [" +++ source +++ "] did not expect a callback: " +++ toString cci.ccMsg // PA: version of errorCallback without state parameter (use with IssueCleanRequest2). errorCallback2 :: !String !CrossCallInfo !*OSToolbox -> (!CrossCallInfo,!*OSToolbox) errorCallback2 source cci tb = (return0Cci,iprint msgtext tb) where msgtext = " *** [" +++ source +++ "] did not expect a callback: " +++ toString cci.ccMsg iprint :: !String !.a -> .a iprint s a | not (printresult == 0) = a = abort ("Print failed: " +++ s) where printresult = consolePrint ("## " +++ s +++ "\n") 999 iprint` :: !String !.a -> .a iprint` s a | not (printresult == 0) = a = abort ("Print failed: " +++ s) where printresult = consolePrint s 999 consolePrint :: !{#Char} !*OSToolbox -> *OSToolbox consolePrint _ _ = code { .inline ConsolePrint ccall ConsolePrint "SI-I" .end } //---------------------------------------------------------------------// // Synchronisation operations between the Clean thread and OS thread // //---------------------------------------------------------------------// winKickOsThread :: !CrossCallInfo !*OSToolbox -> ( !CrossCallInfo, !*OSToolbox) winKickOsThread _ _ = code { .inline WinKickOsThread ccall WinKickOsThread "pppppppp-pppppppp" .end } winKillOsThread :: !*OSToolbox -> *OSToolbox winKillOsThread _ = code { .inline WinKillOsThread ccall WinKillOsThread "I-I" .end } winStartOsThread :: !*OSToolbox -> *OSToolbox winStartOsThread _ = code { .inline WinStartOsThread ccall WinStartOsThread "I-I" .end } winCloseOs :: !*OSToolbox -> Bool winCloseOs _ = code { .inline WinCloseOs ccall WinCloseOs "I-I" .end } winInitOs :: ( !Bool, !*OSToolbox) winInitOs = code { .inline WinInitOs ccall WinInitOs "-II" .end } //------------------------------------------------------------------------// // The message numbers for communication from Clean to OS (ccMsg field) // //------------------------------------------------------------------------// // Mike // CcRqUSERGAMEEVENT :== 1905 CcRqCREATEGAMEOBJECT :== 1904 CcRqPLAYSOUNDSAMPLE :== 1903 CcRqRUNGAME :== 1901 CcRqCREATEGAMEWINDOW :== 1900 /// // MW... CcRqDO_PRINT_SETUP :== 1828 // MW11++ CcRqDO_HTML_HELP :== 1827 CcRqGET_PRINTER_DC :== 1824 CcRqDISPATCH_MESSAGES_WHILE_PRINTING :== 1823 CcRqENDDOC :== 1822 CcRqSTARTDOC :== 1821 // ... MW CcRqCREATETCPWINDOW :== 1820 /* create TCP window */ CcRqDESTROYMDIDOCWINDOW :== 1817 // PA: added to destroy MDI document window CcRqCREATESDIDOCWINDOW :== 1816 // PA: added to create SDI document window CcRqCREATEMDIDOCWINDOW :== 1815 // PA: added to create MDI document window CcRqCREATEMDIFRAMEWINDOW :== 1814 // PA: added to create MDI frame window CcRqCREATESDIFRAMEWINDOW :== 1813 // PA: added to create SDI frame window CcRqCLIPBOARDHASTEXT :== 1812 CcRqGETCLIPBOARDTEXT :== 1811 CcRqSETCLIPBOARDTEXT :== 1810 CcRqGETCLIPBOARDCOUNT :== 1809 /* PA: added to retrieve clipboard count. */ CcRqDIRECTORYDIALOG :== 1802 /* PA: added to create directory selector dialog. */ CcRqFILESAVEDIALOG :== 1801 CcRqFILEOPENDIALOG :== 1800 CcRqSHOWCONTROL :== 1755 /* PA: added */ CcRqSELECTPOPUPITEM :== 1754 CcRqENABLEPOPUPITEM :== 1753 CcRqADDTOPOPUP :== 1752 CcRqSETITEMCHECK :== 1751 CcRqENABLECONTROL :== 1750 CcRqCREATECOMPOUND :== 1729 /* PA: added */ CcRqCREATESCROLLBAR :== 1728 /* PA: added */ CcRqCREATECUSTOM :== 1727 CcRqCREATEICONBUT :== 1726 CcRqCREATEPOPUP :== 1725 CcRqCREATECHECKBOX :== 1724 CcRqCREATERADIOBUT :== 1723 CcRqCREATEEDITTXT :== 1722 CcRqCREATESTATICTXT :== 1721 CcRqCREATEBUTTON :== 1720 CcRqCREATEMODALDIALOG :== 1701 /* PA: added to create modal dialog. */ CcRqCREATEDIALOG :== 1700 CcRqCREATETOOLBARSEPARATOR :== 1603 /* PA: added to create a toolbar separator item. */ CcRqCREATETOOLBARITEM :== 1602 /* PA: added to create a toolbar bitmap item. */ CcRqCREATEMDITOOLBAR :== 1601 /* PA: added to create a toolbar for a MDI process. */ CcRqCREATESDITOOLBAR :== 1600 /* PA: added to create a toolbar. */ CcCbFONTSIZE :== 1530 CcCbFONTNAME :== 1520 CcRqGETFONTSIZES :== 1510 CcRqGETFONTNAMES :== 1500 CcRqSETCLIENTSIZE :== 1438 /* PA: added to set client size. */ CcRqDELCONTROLTIP :== 1437 /* PA: added to remove controls from tooltip areas. */ CcRqADDCONTROLTIP :== 1436 /* PA: added to add controls to tooltip areas. */ CcRqGETWINDOWSIZE :== 1435 /* PA: added to retrieve bounding size of windows. */ CcRqRESTACKWINDOW :== 1434 /* PA: added to restack windows. */ CcRqSHOWWINDOW :== 1433 /* PA: added to (hide/show) windows. */ CcRqSETWINDOWSIZE :== 1432 /* PA: added to resize windows/controls. */ CcRqSETSELECTWINDOW :== 1431 /* PA: added to (en/dis)able windows. */ CcRqSETWINDOWPOS :== 1430 /* PA: added to move windows/controls. */ CcRqSETEDITSELECTION :== 1428 /* PA: added for handling edit control selections. */ CcRqSETSCROLLSIZE :== 1427 /* PA: added for setting thumb size of scrollbar. */ CcRqSETSCROLLPOS :== 1426 /* PA: added for setting thumb of scrollbar. */ CcRqSETSCROLLRANGE :== 1425 /* PA: added for setting range of scrollbar. */ CcRqRESETCURSOR :== 1424 CcRqSETGLOBALCURSOR :== 1423 CcRqOBSCURECURSOR :== 1422 CcRqCHANGEWINDOWCURSOR :== 1421 CcRqACTIVATEWINDOW :== 1420 /* PA: added for activating window. */ CcRqACTIVATECONTROL :== 1419 /* PA: added for activating controls. */ CcRqGETWINDOWPOS :== 1416 CcRqGETCLIENTSIZE :== 1415 CcRqUPDATEWINDOWRECT :== 1412 /* PA: added for updating rect part of a window/control. */ CcRqGETWINDOWTEXT :== 1411 CcRqSETWINDOWTITLE :== 1410 CcRqFAKEPAINT :== 1405 /* PA: added combination of BeginPaint; EndPaint; InvalidateRect; */ CcRqENDPAINT :== 1404 CcRqBEGINPAINT :== 1403 CcRqDESTROYWINDOW :== 1402 CcRqDESTROYMODALDIALOG :== 1401 /* PA: added to destroy modal dialog. */ CcRqDRAWMBAR :== 1265 CcRqTRACKPOPMENU :== 1256 /* PA: added for handling pop up menu. */ CcRqCREATEPOPMENU :== 1255 CcRqINSERTSEPARATOR :== 1245 CcRqMENUENABLE :== 1235 CcRqMODIFYMENU :== 1230 CcRqINSERTMENU :== 1226 // PA: new constant for inserting a new menu into the menu bar CcRqITEMENABLE :== 1220 CcRqREMOVEMENUSHORTKEY :== 1217 // PA: new constant for removing a shortkey of a menu item CcRqADDMENUSHORTKEY :== 1216 // PA: new constant for adding a shortkey of a menu item CcRqMODIFYMENUITEM :== 1215 CcRqDESTROYMENU :== 1214 // PA: new constant for destroying a menu 'physically' CcRqDELETEMENU :== 1213 // PA: new constant for deleting a menu logically CcRqREMOVEMENUITEM :== 1212 CcRqCHECKMENUITEM :== 1210 CcRqINSERTMENUITEM :== 1205 CcRqDOMESSAGE :== 1100 //------------------------------------------------------------------------// // The message numbers for communication from OS to Clean (CcMsg field) // //------------------------------------------------------------------------// CcWINMESSmax :== 999 // Mike: Convention for OS to Clean requests: 500-599 // CcWmCHECKQUIT :== 513 /* Mike: check user's quit function */ CcWmUSEREVENT :== 512 /* Mike: user defined event */ CcWmSTATISTICS :== 511 /* Mike: request for statistics */ CcWmOBJECTKEYUP :== 510 /* Mike: key released */ CcWmOBJECTKEYDOWN :== 509 /* Mike: key pressed for object */ CcWmOBJECTTIMER :== 508 /* Mike: framecounter reached 0 */ CcWmANIMATION :== 507 /* Mike: animation sequence ended */ CcWmCOLLISION :== 506 /* Mike: collision of two objects */ CcWmTOUCHBOUND :== 505 /* Mike: object touches bound or code */ CcWmOBJECTDONE :== 504 /* Mike: object is destroyed */ CcWmMOVEOBJECT :== 503 /* Mike: move object */ CcWmINITOBJECT :== 502 /* Mike: initialize new object */ CcWmSCROLL :== 501 /* Mike: calculate layer position */ CcWmGAMEKEYBOARD :== 500 /* Mike: keyboard input for game */ /// CcWmINETEVENT :== 140 /* MW11 */ CcWmZEROTIMER :== 136 /* PA: new constant for sequence of zero timer events (generated only by Clean). */ CcWmLOSTKEY :== 135 /* PA: new constant for loosing keyboard input (generated only by Clean). */ CcWmLOSTMOUSE :== 134 /* PA: new constant for loosing mouse input (generated only by Clean). */ CcWmSPECIALBUTTON :== 133 /* PA: new constant for info about OK/CANCEL button selected. */ CcWmPROCESSDROPFILES :== 132 /* PA: new constant for requesting opening of files. */ CcWmGETTOOLBARTIPTEXT :== 131 /* PA: new constant for getting tooltip text. */ CcWmSETFOCUS :== 130 /* PA: new constant for notifying obtaining keyboard input focus. */ CcWmKILLFOCUS :== 129 /* PA: new constant for notifying loss of keyboard input focus. */ CcWmPROCESSCLOSE :== 127 /* PA: new constant for requesting closing of process. */ CcWmDRAWCLIPBOARD :== 126 /* PA: new constant for clipboard handling. Copied from Ronny. */ CcWmGETSCROLLBARINFO :== 125 /* PA: new constant for info about scrollbars. */ CcWmSCROLLBARACTION :== 124 /* PA: new constant for scrollbar handling. */ CcWmDDEEXECUTE :== 123 CcWmIDLEDIALOG :== 121 /* PA: old constant reused for initialising modal dialogues. */ CcWmDRAWCONTROL :== 120 CcWmCOMBOSELECT :== 119 CcWmBUTTONCLICKED :== 118 CcWmINITDIALOG :== 117 CcWmIDLETIMER :== 116 CcWmTIMER :== 115 CcWmNEWVTHUMB :== 114 CcWmNEWHTHUMB :== 113 CcWmGETVSCROLLVAL :== 112 CcWmGETHSCROLLVAL :== 111 CcWmSIZE :== 110 /* PA: old constant reused for passing resize information. */ CcWmMOUSE :== 109 CcWmKEYBOARD :== 108 CcWmDEACTIVATE :== 107 CcWmACTIVATE :== 106 CcWmCLOSE :== 105 CcWmCOMMAND :== 103 CcWmCHAR :== 102 CcWmCREATE :== 101 CcWmPAINT :== 100 CcWINMESSmin :== 100 CcWmNOTIFY :== 78 CcRETURNmax :== 19 CcRETURN6 :== 16 CcRETURN5 :== 15 CcRETURN4 :== 14 CcRETURN3 :== 13 CcRETURN2 :== 12 CcRETURN1 :== 11 CcRETURN0 :== 10 CcRETURNmin :== 10 CcWASQUIT :== 1