home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 4 / DATAFILE_PDCD4.iso / utilities / utilsp / pca / Docs / Msg_Spec < prev    next >
Encoding:
Text File  |  1996-08-28  |  28.4 KB  |  724 lines

  1. Plug In Compliant Application protocol
  2. ======================================
  3.  
  4.  
  5. Plug In Compliant Application Message specification
  6. ===================================================
  7.  
  8.  
  9. Author : Rob Davison (rdavison@xtra.co.nz)
  10. Date : 28/08/96 Status : Release 1
  11.  
  12. Notes: Filetype is divided into two fields with this format: 
  13.  
  14.  
  15.            b 0-12 RISC OS filetype
  16.            b13-31 reserved - zero.
  17.   
  18. On reading, please mask bits 13-31 out before checking the filetype.
  19.  
  20. Strings are null terminated but supporting applications should accept Ctrl.
  21. terminated (ASCII 0-31).
  22.  
  23. 'Address of base' is the beginning of the data structure which contains the
  24. object.
  25.  
  26. 'Offset to object' is the offset from the Address of base to the
  27. object-of-interest
  28.  
  29. For example, the 'Offset to object' of a sprite is the offset to the sprite
  30. itself (base!8 for the first sprite in a sprite area). The 'Address of base'
  31. is the address of the sprite area in which the sprite resides. For objects
  32. where the offset has no meaning the offset to the object must be zero.
  33.  
  34. The PCA references objects using 'tags'. Each tag is usually 16 bytes in
  35. length and its format is defined thus: 
  36.  
  37. tag+0  = Address of base. (anchor)
  38. tag+4  = Offset to object from base.
  39. tag+8  = Length of object. (if applicable - see note below)
  40. tag+12 = Extension size and flags
  41.                b0-15 These bits are to provide for expansion of the size of a
  42.                tag by up to 65532 bytes. Typically, this is for app. or object
  43.                specific data. This document specifies two extensions to show
  44.                you how it's done. Details below.
  45.  
  46.                b16-31 (reserved, set to zero)
  47.  
  48. The first two values in a tag are most important as they are pointers to the
  49. address of the object and the base of the data structure containing it.
  50. Remote tasks must *always* reference an object by reading these values.
  51. Generally speaking, Remote tasks can usually trust the address and offset
  52. until the next Wimp_Poll but if in doubt, re-read it from the tag. The Local
  53. task has the responsibility of creating the object's tag when the object
  54. joins the PCA system, updating the relevant fields in the tag if the object
  55. is moved or resized and discarding the tag when it is sure it is no longer
  56. needed. Tags must themselves be in a common memory area and they must not
  57. move during the lifetime of the object in the PCA system. Clares provide a
  58. small module called 'PCASupport' which may be freely distributed by
  59. registered PCA developers to facilitate the creation of PCA tags for
  60. applications which do not want to create tags themselves.
  61.  
  62. Notes:
  63.  
  64. Many objects store their length within the object data structure itself and
  65. in that case you must use the value stored within the object's data instead
  66. of relying on the length field in the tag. It is intended for object types
  67. which include no record of their size (text for example).
  68.  
  69. Tag extensions must adhere to the following standard: 
  70.  
  71. tag+12.b0-15   = (bytes required+4). Multiples of 4 bytes only.
  72. tag+16           extension id. Types 0-&fff are reserved for Clares PCA.
  73.                  Other values are allocated in line with SWI/Message
  74.                  chunk numbers for application developers.
  75. (extended data dependant on tag id) 
  76.  
  77. To give an example of a tag extension we define two tag extensions which may
  78. be used with PCA text objects. 
  79.  
  80.  
  81. Simple text object
  82. ------------------
  83.  
  84. tag+12 8
  85. tag+16 &FFF
  86. tag+20 length of buffer allocated to object
  87.        (ie the remote task can extend the size of the text (as given at tag+8)
  88.        until its size reaches tag+20 bytes before calling Message_Resize.
  89.  
  90. Edited text object
  91. ------------------
  92.  
  93. tag+12 16
  94. tag+16 &FFE
  95. tag+20 length of buffer for first chunk
  96. tag+24 offset to rest of text from object base
  97. tag+28 length of rest of text 
  98.  
  99. Edited text objects are split into two separate parts, the pointer to base
  100. at the beginning of the tag, points to the start of the first chunk of text,
  101. the offset to object points to the end of this chunk of text (= the caret
  102. position) while the values at tag+24 and tag+28 point to the rest of the
  103. text. Suitable manipulation of these values should allow a text editor to
  104. work with PCA. Note: this has not been tested with any code - any comments
  105. please contact the author of PCA.
  106.  
  107. The tag extension system is potentially very powerful but please do not
  108. abuse it. If everyone who ever writes a PCA program creates a tag extension
  109. for their own object format then chaos will reign and the PCA system will
  110. become useless. (Anyone questioning this is invited to use the specification
  111. document for the TIFF file format as bedside reading - a perfect example of
  112. a tagged file format gone wrong). In general, the basic tag structure or the
  113. 'pca text' extension defined above will do for most data types. If you
  114. really feel you have to create your own extension then please double check
  115. with Clares that a suitable extension does not already exist. The extension
  116. should then be defined in the format given above and the information sent to
  117. Clares for distribution to the PCA community.
  118.  
  119. On receipt of a PCA message you should decide if the message refers to one
  120. of your objects (either a local one you created yourself or a remote object
  121. which you are editing). You do this by comparing the object's tag address,
  122. passed in the message, with a local array of tags that you know about. Get
  123. into the habit of doing it this way (rather than comparing the tag's address
  124. fields with your own data structures) as one message, Message_Deselect may
  125. pass a tag address which no longer actually contains valid data (the object
  126. itself having been deleted). See its entry for details.
  127.  
  128. In the following documentation ' Local ' is the 'owning task' being the task
  129. to which the object is 'local'. This task created the object and its PCA
  130. tag. It knows how to resize and how to delete the object.
  131.  
  132. ' Remote ' is the 'utility' task - the one which modifies an object for the
  133. 'local' or owning task.
  134.  
  135. Please note which messages are to be broadcast and which are sent
  136. task-to-task. The correct functioning of the system depends on the correct
  137. usage.
  138.  
  139.  
  140. PCA Message Summary
  141. ===================
  142.  
  143. This is intended to give the programmer an overview of what goes on in a
  144. typical PCA session. It ignores many of the finer points of the protocol.
  145.  
  146. 1. Local task broadcasts Message_WhosAbout for a selected object.
  147.  
  148. 2. Remote tasks examine message data and respond with Message_ImHere.
  149.  
  150. 3. Local task, in response to users choice of Remote sends
  151.    Message_DoYourStuff.
  152.  
  153. 4. (if doing inplace editing) Remote task, on receipt of DoYourStuff sends
  154.    Message_HookMe.
  155.  
  156. 5. (repeated) Remote and Local tasks broadcast Message_UpdateArea if the
  157.    user changes the object.
  158.  
  159. 6. Remote task sends Message_Unhook when user closes window/toolbar onto
  160.    object.
  161.  
  162. 7. Local task broadcasts Message_Deselect if user deletes object/quits
  163.    program.
  164.  
  165. The variable names used in the example BASIC program are included after the
  166. message number. 
  167.  
  168. Message_WhosAbout(&83484) (Msg_Whos%)
  169. -------------------------------------
  170.  
  171. Broadcast by Local task when opening Utility sub-menu/popup (see the section
  172. on user interface).
  173.  
  174. The block pointed to by R1 contains: 
  175.  
  176. R1+20   filetype of object
  177. R1+24   address of object tag
  178. R1+28   reserved - 0 
  179.  
  180. Receiving remote tasks should respond with Message_ImHere as defined below
  181. if the filetype is 'interesting'. You can examine the data in the tag at
  182. R1+24 if the filetype alone does not suffice (for example, a program which
  183. can only edit 32bpp sprites should examine the sprite type word at
  184. !(R1+24)+(R1+24)!4) +40 (ie tag address field+offset to object field)+40
  185. before sending Message_ImHere ). 
  186.  
  187. Message_ImHere(&83485) (Msg_Im%)
  188. -------------------------------- 
  189.  
  190. Sent by Remote task to Local task. Local records the data passed for later
  191. use in creating a dialogue box or menu.
  192.  
  193. The block pointed to by R1 contains: 
  194.  
  195. R1+20
  196.         bits 0-7 flags:
  197.                 b0 Spritename supplied
  198.                 b1 Info available
  199.                 b2 Reserved - 0
  200.                 b3 Tool wants to 'own' the object
  201.                 b4 Tool wants In place editing
  202.                 b5-7 Reserved - 0
  203.                 b8-31 Reserved - 0
  204.  
  205. R1+24           Tool id.
  206. R1+28           String. Menu entry/Function name (eg. Contrast...).
  207.                 Length limited to 31chars+terminator.
  208. R1+60           String. Name of sprite in wimp sprite pool
  209.                 (if b0 of R1+20 is set)
  210.  
  211.  
  212.   
  213. The tool id is intended for remote tasks which provide more than one
  214. utility. It is returned to the task with Message_DoYourStuff . 
  215.  
  216. Flags: 
  217.  
  218. b0      indicates to the recipient that there is a sprite name at R1+60
  219.         - the sprite is stored in the Wimp sprite pool and should be
  220.         used when rendering the popup dialogue box.
  221.  
  222.  
  223. b1      indicates that the tool can provide a response
  224.         to  Message_Info .
  225.  
  226. b2      Reserved - 0
  227.  
  228. b3      indicates that the tool wants to 'own' the object.
  229.         Local task should send Msg_Deselect for the object
  230.         before sending  Message_DoYourStuff  if this bit is
  231.         set. Do not set this bit unless you have to as it
  232.         will prevent other remote tasks from sharing the
  233.         object at the same time. It should only be set when
  234.         the remote task wants to 'take over' the object completely.
  235.  
  236.         - such as Composition taking over a 32bpp sprite
  237.         for use as a canvas.
  238.  
  239. b4      This bit is designed to allow for real 'in place editing'
  240.         operations. Because of the amount of code necessary
  241.         at the local end to handle this it has been defined
  242.         as an optional part of the standard. 
  243.  
  244. Local applications which do not support in place editing should clear bit 4
  245. of the flags word and send that with DoYourStuff. On receipt, the remote
  246. application should check if bit 4 is still set and if not open a remote
  247. window onto the object.
  248.  
  249. Notes: In early versions of this standard bits 28-31 of the flags word had
  250. another use. This data has been moved to Message_HookMe. Please see below. 
  251.  
  252. Message_DoYourStuff(&83486) (Msg_Do%) 
  253. -------------------------------------
  254.  
  255. The block pointed to by R1 contains: 
  256.  
  257. R1+20   Filetype of object
  258. R1+24   Address of object tag
  259. R1+28   reserved - 0
  260. R1+32   Tool id
  261. R1+36   Tool flags word
  262. R1+40   String. Name of object or null (&0) 
  263.  
  264. Sent by Local task to remote task depending on entry selected in Utilities
  265. sub-menu/dialogue. Remote task should record the tag address and open its
  266. window (or just its toolbar if bit 4 of the flags word is set). 
  267.  
  268. Notes: 
  269.  
  270. If the Remote task set bit 4 of the flags word in Message_ImHere when
  271. replying to  Message_WhosAbout it should check that this bit is still set
  272. now. If it has been cleared then the Local task cannot handle remote
  273. messaging and the Remote task must open a separate window onto the object.
  274.  
  275. If bit 4 is still set it means that the local task is willing to participate
  276. in an in-place editing session. In this case the Remote task should simply
  277. open its toolbar and send Message_HookMe to the Local task to ask it to
  278. intercept mouse button and other Wimp events. Receipt of this message will
  279. also cause the Local task to send Message_ObjectPosition to move the remote
  280. tasks toolbar to the correct position.
  281.  
  282. Nothing about the standard prevents the object changing type (eg from sprite
  283. to Drawfile) between  Message_WhosAbout and this message. On receipt of this
  284. message the Remote task must therefore check the filetype field and as much
  285. of the object's data structure as necessary to ensure that it can edit the
  286. object and delink/ignore the message quietly if the type is not to its
  287. liking. This allows the Local task to 'move' a remote task to different
  288. objects cleanly.
  289.  
  290. Before sending Message_DoYourStuff with bit 4 set the local task should
  291. broadcast  Message_UnhookMe to prevent more than one remote task attempting
  292. to do in-place editing at once.
  293.  
  294. Before sending Message_DoYourStuff with bit 3 set the local task should
  295. broadcast  Message_Deselect as the remote task in question wants to 'own'
  296. the object. 
  297.  
  298. Message_Deselect(&83487) (Msg_Desel%) 
  299. -------------------------------------
  300.  
  301. Broadcast by Local task when the object has been deleted.
  302.  
  303. The block pointed to by R1 contains: 
  304.  
  305. R1+20   Filetype of object.
  306. R1+24   Address of object tag 
  307.  
  308. All Tasks interested in the object should close their window/abandon their
  309. operations as the object in question has been removed from the PCA system
  310. (usually because it has been deleted). Local tasks  must generate this
  311. message when deleting an object, quitting etc. or remote tasks using the
  312. object will crash. If the Local task is using PCASupport for tag generation
  313. it should call SWI PCA_DeleteAndKill which will delete the tag and send this
  314. message in one operation but only when the object really is being deleted.
  315.  
  316. Note: This implies that the remote task, on receipt of this message cannot
  317. rely on more than the tag address as a key to the object. It _cannot_ access
  318. the object data via the tag passed as SWI PCA_DeleteTag has already been
  319. called (the address fields within the tag will contain -1 and the object
  320. data itself may well have been discarded). This is unavoidable without a two
  321. message (Message/Ack) deselection system which would be more difficuilt for
  322. tasks to handle. Especially (as is often the case) if the local task is
  323. about to quit. 
  324.  
  325. Message_DoneMyStuff(&83488) (Msg_Done%) 
  326. ---------------------------------------
  327.  
  328. Broadcast by a task when it has modified the object. All tasks accessing the
  329. object other than the originator of the message should recognise this
  330. message and redraw the object.
  331.  
  332. The block pointed to by R1 contains: 
  333.  
  334. R1+20   0
  335. R1+24   Address of object tag
  336.   
  337. Use this message for 'whole object changed' operations which do not involve
  338. changes to the object's basic structure (Eg. image filter of sprite).
  339.  
  340. Note: Receipt of this message by the Local task should not be taken as an
  341. indication that the remote task is no longer interested in it. That is what
  342. Message_UnhookMe is for. 
  343.  
  344. Message_Changed(&8348A) (Msg_Changed%) 
  345. --------------------------------------
  346.  
  347. Broadcast by Local or Remote task when the object has changed (either in
  348. size or its details). Task should act as if it had got a new DoYourStuff
  349. message.
  350.  
  351. Broadcast by Remote task after it has changed the object's size. Local and
  352. other interested Remote tasks will re-read the object's details and redraw
  353. the object.
  354.  
  355. The block pointed to by R1 contains: 
  356.  
  357. R1+20   Filetype of object
  358. R1+24   Address of object tag
  359. R1+28   reserved - 0
  360. R1+32   String. New name of object or zero for no change.
  361.   
  362. Note: Nothing about the standard prevents the object changing type (eg from
  363. sprite to Drawfile). On receipt of this message please check the filetype
  364. field as well as all necessary aspects of the object's data structure. If
  365. the object is not to a Remote task's liking it should send Message_UnHook
  366. and delink quietly. 
  367.  
  368. Message_ResizeRequest(&8348B) (Msg_Resize%) 
  369. -------------------------------------------
  370.  
  371. Sent by Remote task to Local (task handle in R1+4 of DoYourStuff message).
  372. If the Local task fails to deal successfully it will claim the message.
  373.  
  374. The block pointed to by R1 contains: 
  375.  
  376. R1+20   0
  377. R1+24   Address of object tag
  378. R1+28   reserved - 0
  379. R1+32   New size. Total size of object structure
  380.         (including header, offset to base etc.) if flags b1
  381.         clear otherwise new size of object itself.
  382. R1+36   Flags
  383.                b0 set 'Resize associated objects as well'
  384.                b1 set 'New Size is for object alone - does not include header.' 
  385.  
  386. If the Local task succeeds then it will send Message_ResizeAck (basically,
  387. copy R1+8 to R1+12, put Message ResizeAck into R1+16, update R1+32 and
  388. return to sender). On receipt of ResizeAck message the sender of
  389. ResizeRequest should modify the object appropriately (for example, adding
  390. rows/columns to a sprite). 
  391.  
  392. Notes:
  393.  
  394. You must be prepared for the resize request to fail in which case it is the
  395. responsibility of the Local task to report to the user and the Remote task
  396. to continue safely.
  397.  
  398. If the ResizeAck message returns to a Remote task you must check that the
  399. field in R1+12 is equal to the MyRef generated by the Resize message you
  400. sent to ensure that the ResizeAck is for the object you have requested be
  401. resized. If it is, ensure that the object is in a renderable state before
  402. the next Wimp_Poll by updating the relevant parts of the object's internal
  403. data structure.
  404.  
  405. The local task's only modification to the data after a Resize is to write
  406. new size fields where appropriate and to update the object's tag address
  407. fields if the object moves. For sprites the new total area size should be
  408. written into 'Base of data'+0 - it does not know what the Remote task is
  409. going to do with the sprite and therefore cannot make any other
  410. modifications to the data.
  411.  
  412. For data types which do not store size within their data structure then the
  413. length field of the tag should also be modified (along with the address
  414. fields if the object has to be moved).
  415.  
  416. After modifying the object the Remote task must broadcast Message_Changed . 
  417. Composition will read bit zero of the flags word. If this bit is set, it
  418. will resize masks associated with the sprite in question as well. The amount
  419. by which masks will be resized is calculated from the resize-request for the
  420. sprite itself. Other applications can ignore or act on this bit as they
  421. wish. The task which requested the resize must be able to handle either
  422. action.
  423.  
  424. Bit one of the flags word is intended to facilitate the resizing of paths in
  425. Drawfiles and similar data structures under the PCA though no code has been
  426. written to do this yet.
  427.  
  428.  
  429. Resize Summary
  430. ==============
  431.  
  432. This is what you do to change the size of an object you are editing: 
  433.  
  434. From a Remote task's point of view: 
  435. -----------------------------------
  436.  
  437. Send Message_ResizeRequest and keep myref generated from the message. On
  438. receipt of ResizeAck check myref, modify object data and broadcast
  439. Message_Changed .  
  440.  
  441. From the Local task's point of view: 
  442. ------------------------------------
  443.  
  444. On receipt of Message_ResizeRequest resize object if possible, update the
  445. objects tag anchors and send ResizeAck otherwise claim the message and
  446. report an error to user. 
  447.  
  448. Both Remote and Local tasks:
  449. ---------------------------- 
  450.  
  451. On receipt of Message_Changed re-read the object header as if it was newly
  452. created and redraw the entire object. (You may need to regenerate an area of
  453. your window the size of the old object - remember the new object may occupy
  454. less screen area). 
  455.  
  456. Resize speed issues 
  457. -------------------
  458.  
  459. When the object being resized is very large, VM (Virtual Memory)is being
  460. used, or the resize requests are frequent, there may be a performance issue.
  461. In such situations the Local task should consider moving the object to the
  462. top of its data storage area to prevent repeated memory moving operations.
  463. In applications where many small resize requests are likely then consider
  464. employing a tag extension system similar to the one defined above for text
  465. files to reduce the frequency of the resize requests. 
  466.  
  467. Message_UpdateArea(&8348C) (Msg_Uparea%) 
  468. ----------------------------------------
  469.  
  470. Broadcast by task when it has modified part of an object. Apps interested in
  471. the object should redraw the appropriate area of the object as quickly as
  472. possible if they have a window onto the object open.
  473.  
  474. The block pointed to by R1 contains: 
  475.  
  476. R1+20   Format of subsequent data (0)
  477. R1+24   Address of object tag
  478. R1+28   Xlow  (OS units at 1:1 scale)
  479. R1+32   Ylow  (OS units at 1:1 scale)
  480. R1+36   Xhi   (OS units at 1:1 scale)
  481. R1+40   Yhi   (OS units at 1:1 scale) 
  482.  
  483. where coordinates are relative to the bottom left of the object.
  484.  
  485. Currently this is the only format supported by code (working with bitmap
  486. sprites).
  487.  
  488. Other proposed formats are as follows: 
  489.  
  490. R1+20   Format of subsequent data (1)
  491. R1+24   Address of object tag
  492. R1+28   Xlow (Draw units = OS units <<8)
  493. R1+32   Ylow (Draw units = OS units <<8)
  494. R1+36   Xhi  (Draw units = OS units <<8)
  495. R1+40   Yhi  (Draw units = OS units <<8) 
  496.  
  497. where coordinates are relative to the bottom left of the object. 
  498.  
  499. R1+20   Format of subsequent data (2)
  500. R1+24   Address of object tag
  501. R1+28   Xlow (Draw units = OS units <<8)
  502. R1+32   Ylow (Draw units = OS units <<8)
  503. R1+36   Xhi  (Draw units = OS units <<8)
  504. R1+40   Yhi  (Draw units = OS units <<8) 
  505.  
  506. where coordinates are relative to the top left of the object.
  507.  
  508. If you have anyother suggestions please contact Clares or the author. 
  509.  
  510. Message_ResizeAck(&8348D) (Msg_ResizeAck%) 
  511. ------------------------------------------
  512.  
  513. Sent by Local task when a resize request has succeeded. On receipt by a
  514. Remote task, check that R1+12 is the myref generated from
  515. Message_ResizeRequest before modifying the object data structure and
  516. broadcasting Message_Changed . 
  517.  
  518. The block pointed to by R1 contains: 
  519.  
  520. R1+20   reserved - 0
  521. R1+24   Address of object tag
  522. R1+28   reserved - 0
  523. R1+32   New size allocated to object
  524. R1+36   Flags
  525.   
  526. Message_MiscOp(&8348E) (Msg_Misc%) 
  527. ----------------------------------
  528.  
  529. This message is designed to provide a private interface option for PCA
  530. programs without them having to request other message allocations from
  531. Acorn.
  532.  
  533. The block pointed to by R1 contains: 
  534.  
  535. R1+20   Sub-reason code 
  536. - other data dependant on sub-reason code.
  537.  
  538. The sub-reason codes available to application developers are allocated in
  539. line with SWI and Message blocks - if you have one of these then those
  540. values may be used by your programs. Where appropriate, please make details
  541. of your messages available to the PCA community by sending them to Clares
  542. for distribution.
  543.  
  544. Currently, only two sub-reasons are defined for use with Composition. The
  545. current format of these is given below but is subject to change. Please
  546. contact Clares before releasing programs which rely on it: 
  547.  
  548. SubReason_GiveAssociatedData (&83480) 
  549. -------------------------------------
  550.  
  551. Broadcast by remote plug-in when it would like to know more about the
  552. object.
  553.  
  554. The block pointed to by R1 contains: 
  555.  
  556.         R1+24   Address of object tag 
  557.  
  558. SubReason_AssociatedDataCompo (&83481) 
  559.  
  560. Sent by Compo to Remote which broadcast GiveAssociatedData containing a tag
  561. pointing to a Compo object.
  562.  
  563. The block pointed to by R1 contains: 
  564.  
  565.         R1+24   Address of object tag
  566.         R1+28   reserved - 0
  567.         R1+32   two eight bit and one sixteen bit fields
  568.                 bits 0-7     Masks in use by object
  569.                 bits 8-15    Format of subsequent data (zero)
  570.                 bits 16-31   Reserved
  571.         R1+36   Reserved (0)
  572.         R1+40   Blend mask address or zero    = no Blend mask
  573.         R1+44   Tint mask address or zero     = no Tint mask
  574.         R1+48   Curve mask address or zero    = no Curve mask
  575.         R1+52   Displace mask address or zero = no Displace mask
  576.         R1+56   Shadow mask address or zero   = no Shadow mask
  577.         R1+60   Reserved
  578.         R1+64   Reserved
  579.         R1+68   Opacity of object (65536=solid 0=transparent)
  580.         R1+72   Math type in use for object
  581.   
  582. Notes: The 'mask address' passed is the address of the base of a sprite area
  583. containing one eight bit greyscale sprite (at address+address!8). The size
  584. of a mask should not be assumed to be the same as that of the object - read
  585. it from the mask sprite data or use OS_SpriteOp to extract it.
  586.  
  587. The data returned by this message is fragile - re-read whenever you want to
  588. make use of it. 
  589.  
  590. Message_Info(&8348F) (Msg_Info%) 
  591. --------------------------------
  592.  
  593. Sent by Local to Remote application when the info button in the pop-up is
  594. clicked.
  595.  
  596. The block pointed to by R1 contains: 
  597.  
  598. R1+20   0 
  599.  
  600. Remote application should write a suitable info string into +20, change the
  601. message size and return the message to the sender.
  602.  
  603. Example info strings:
  604.  
  605. "Image Filter. No image linked at the moment."
  606.  
  607. "Image Filter. Image 'Face' linked at the moment." 
  608.  
  609.  
  610. Message_ObjectPosition(&83490) (Msg_ObjPos%) 
  611. --------------------------------------------
  612.  
  613. This message is generated by the Local application after receipt of
  614. Message_HookMe , object repositioning operations and window open operations,
  615. if the Local application supports 'Inplace editing'.
  616.  
  617. The block pointed to by R1 contains: 
  618.  
  619. R1+20   0
  620. R1+24   Address of object tag
  621. R1+28   Y scale of object in Local window (65536=1:1 or 100%)
  622. R1+32   Xlow of object on screen in 'Local' window.
  623. R1+36   Ylow of object on screen in 'Local' window.
  624. R1+40   Handle of 'Local' window.
  625. R1+44   Handle of Local windows toolbar window (or -1 if no toolbar)
  626. R1+48   X scale factor of object in Local window (16.16 format eg 65536=1:1 or 100%)
  627. R1+52   Xlow of object on screen in Local window. (unlimited)
  628. R1+56   Ylow of object on screen in Local window. (unlimited)
  629.   
  630. On receipt, the Remote task should open its toolbar/infobar relative to the
  631. positions in R1+32 and R1+36 behind the window handle at R1+44. The
  632. coordinates passed in R1+32 and R1+36 should be limited to the windows
  633. visible area (by the Local task) while those at +52 and +56 should not. 
  634.  
  635. The information at R1+28 and R1+48 onwards is for use by the Remote task
  636. during mouse click operations on the object. To convert mouse coordinates
  637. read directly it should subtract the values at R1+52,R1+56 from the raw
  638. mousex and mousey coordinates, and then scale according to the value in
  639. R1+48. 
  640.  
  641. The X and Y scale factors are in 16.16 format. To convert a scale factor
  642. into this format, multiply by 1 << 16. For example, 100% = a scale factor of
  643. one and is therefore (1 << 16) * 1 which is 65536 or &10000. 150% = a scale
  644. factor of 1.5 and is therefore (1 << 16) * 1.5 which is 98304 or &18000.
  645.  
  646. See the remote painting code (DEFPROCremote_win) in !Spaint for a practical
  647. example of what you should do. 
  648.  
  649. Message_HookMe(&83491) (Msg_Hook%) 
  650. ----------------------------------
  651.  
  652. This message is sent by the Remote task to the Local task. It indicates to
  653. the Local task that it should begin intercepting mouse button and other Wimp
  654. events to the object and send them to the Remote task. On receipt, the Local
  655. task should create a trap icon over the object (using the button type in
  656. r1+28) and send Message_ObjectPosition.
  657.  
  658. The block pointed to by R1 contains: 
  659.  
  660. R1+20   0
  661. R1+24   Address of object tag
  662. R1+28   bits 0-27 Flags - reserved and set to zero.
  663.         bits 28-31 Window 'work area' button type to use for trap icon.
  664. R1+32   Window handle
  665. R1+36   String. indirection string for icon or Null (&0) 
  666.  
  667. To make life easier for the remote task the Local task should also take note
  668. of the window handle at R1+32 and insert that value into the window handle
  669. field when passing on Wimp messages. This allows the remote task to use much
  670. of the same code to deal with remotely generated messages and messages to
  671. their own window.
  672.  
  673. The optional indirection string at R1+36 is intended to allow for adding a
  674. mouse pointer change when entering in-place edited objects. Take care with
  675. this string as certain settings can disrupt the Local task's message
  676. trapping. This extension is optional. Some local tasks may not support it so
  677. do not rely on it.
  678.  
  679. If the remote task is already editing an object in-place (and it is going to
  680. replace it) then it should send Message_Unhook to the local task previously
  681. being worked with so that it deletes its trap icon.
  682.  
  683. Please see the section below on In-place editing for details of the best
  684. method of trapping messages and the alterations which should be made before
  685. forwarding them. 
  686.  
  687. Message_UnhookMe(&83492) (Msg_Unhook%) 
  688. --------------------------------------
  689.  
  690. This message is sent by a remote task to the Local task (or local to remote)
  691. when it wants to 'unhook' from the object.
  692.  
  693. The block pointed to by R1 contains: 
  694.  
  695. R1+20   0
  696. R1+24   Address of object tag
  697. R1+28   reserved  - 0
  698. R1+32   Window handle
  699. R1+36   Unhook 'type'
  700.   
  701. This message should be used by a Remote task to indicate its lack of
  702. interest in an object. After sending this message the Remote task should
  703. forget any references to the object and close its toolbar and/or window.
  704.  
  705. Little action need be taken at the Local end on receipt of this message
  706. unless 'Inplace editing' is going on between the tasks in which case it
  707. should remove the traps on Button click messages etc for the object. If the
  708. Local task wishes to be efficient in its generation of PCA messages then it
  709. should keep a counter for each object in the PCA system, increase the
  710. counter on each call to Message_DoYourStuff and decrease it on each receipt
  711. of Message_UnHook. Then PCA messages need only be generated in response to
  712. changes made by the Local task if the objects counter is greater than zero.
  713. When the counter reaches zero the Local task should broadcast
  714. Message_Deselect as a saftey measure to ensure that all Remote tasks stop
  715. using the object.
  716.  
  717. The 'unhook type' at R1+36 currently has two defined values: 
  718.  
  719. R1+36   0 'Unhook' is temporary
  720.           (used by Compo to support the 'Track selected'
  721.           preference option)
  722. R1+36   1 'Unhook' is permanent - forget about this PCA. 
  723.  
  724. All values other than zero should currently be treated as 'permanent'.