home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / pocketbk / developmen / ctrlhe / CTRLHELP.DOC next >
Text File  |  1992-07-07  |  3KB  |  69 lines

  1. CTRLHELP.OPL and DOHELP.OPL
  2. ===========================
  3.  
  4. These programs show how you can handle the HELP key while in a dialog
  5. or menu in an Opl program.  The main program is of course deaf until
  6. the menu or dialog terminates, and is not informed when HELP is
  7. pressed, but you can arrange a background process to capture this
  8. key and to present the Help information.
  9.  
  10. The tricky part is to make sure the subprocess only captures the HELP
  11. key while the associated main program is in foreground.  The
  12. subprocess arranges that this is the case by repeatedly calling
  13. wGetProcessList (CALL($d98d,...)) to see what the current foreground
  14. application is.
  15.  
  16. The subprocess needs to know what the PID (process identifier) of the
  17. main program is.  One way to arrange this is for the main program to
  18. inter-process copy its PID into the dataspace of the subprocess in
  19. between creating the subprocess (CALL($0187)) and resuming it
  20. (CALL($0688)).  (All processes are created in an initially suspended
  21. state.)  I chose offset $28 in the dataspace as a safe "postbox".  In
  22. general, the seven words from $28 to $34 in the dataspace of an Opl
  23. program are guaranteed never to be altered by any system code, and
  24. are available for use as postboxes in this way.
  25.  
  26. Picking up the termination of the main program
  27. ----------------------------------------------
  28. At the same time as the subprocess DoHelp checks to see what the
  29. current foreground process is, it also checks whether the owning
  30. process still exists.  If not, the subprocess also terminates.
  31.  
  32. One way to check if a process with a given PID still exists is to
  33. call wClientInfo (CALL($8c8d)), which will return a negative value if
  34. the process no longer exists.  (This only works for processes that
  35. are clients of the Window Server.)
  36.  
  37. Checking for coming into foreground unexpectedly
  38. ------------------------------------------------
  39. The subprocess ought only to come into foreground when it decides to
  40. do so.  Ie the user shouldn't be able to task it into foreground
  41. "accidentally" (especially since it presents a worryingly blank
  42. screen to the outside world).
  43.  
  44. Various approaches are possible here.  First, if you give the
  45. subprocess a name starting with SYS$, it will never be listed in the
  46. top-level lists in the System Screen (but the user can still see it
  47. by pressing TAB).
  48.  
  49. Second, the call wSystemModal can be used (in the routine LOCKBACK:)
  50. to prevent the process being cycled into foreground, eg by
  51. Shift+System or Shift+Control+Prog.  Finally, the main loop checks to
  52. see if the subprocess is unexpectedly in foreground, and if so, calls
  53. LOCKBACK: again.
  54.  
  55. If you need more information
  56. ----------------------------
  57. There are several aspects of CTRLHELP.OPL and DOHELP.OPL that are not
  58. explained fully in this document.  I have touched on similar points
  59. in various comments here and there on CIX, but please feel free to
  60. raise any questions you like about these more advanced uses of Opl,
  61. eg in the main PSION SERIES3 conference.  I won't mind repeating
  62. myself (though I may take a few days or even weeks to get round to
  63. answering your question), and it may be that I can give a clearer
  64. answer the second time than the first time.  As I said, even though
  65. the information you need may already be available, it's not always
  66. that accessible.
  67.  
  68. DavidW
  69.