home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 137.lha / Virtual_Screen / vScreen.doc < prev    next >
Text File  |  1986-11-20  |  22KB  |  420 lines

  1.  
  2. OVERVIEW:
  3.  
  4. VSCREEN allows you to have screens that are larger than the actual display 
  5. area of your monitor.  These larger "virtual" screens scroll when you move the
  6. mouse off the edge of the visible section of the screen.  vScreen allows you
  7. to create a screen large enough for a full page of editing, for example.  Not
  8. all programs are set up to take advantage of vScreen, however, but most 
  9. programs that provide winodow-sizing gadgets can benefit from vScreen.
  10.  
  11. WARNING:  vScreen does devious and illegal things with the INTUITIONPRIVATE
  12. section of the IntuitionBase structure.  Use it at your own risk.  vScreen is
  13. likely to be incompatible with a future release of the system software.
  14.  
  15.  
  16. HOW TO USE VSCREEN:
  17.  
  18. You should place vScreen in your C: directory (or in your current PATH).  
  19. vScreen-Handler should be in the L: directory (or the current directory).  To
  20. start vScreen, issue the following command:
  21.  
  22.     1> VSCREEN width height ["screen-name"]
  23.  
  24. where  width  is the new width for the virtual screen,  height  is the new
  25. height, and  "screen-name"  is the name of the screen that you want to make
  26. larger.  If the screen name includes spaces or other special characters, you
  27. should enclose it in quotation marks.  If you do not supply a screen name, 
  28. vScreen will enlarge the active screen.  
  29.  
  30. The width and height should be at least as large as the current size of the
  31. screen, and width and height should not be larger than 1024 (see the section
  32. titled USAGE NOTES below).
  33.  
  34. For example, if you type
  35.  
  36.     1> VSCREEN 800 400
  37.  
  38. then the workbench screen will be enlarged to 800 by 400.
  39.  
  40. When you receive the "vScreen Installed" message, your screen will be a
  41. virtual screen of the size you specified.
  42.  
  43. To view other parts of the virtual screen, simply move the mouse off the edge
  44. of the visible portion of the screen so that it moves over the portion of the
  45. screen that you want to see.  For example, if the upper left-hand corner of
  46. the screen is showing, and you want to see the lower right-hand corner, just
  47. move the mouse off the lower right-hand edge of the display.  The screen will
  48. scroll to show you more of the screen in the direction that you moved the
  49. mouse. 
  50.  
  51. Note that the screen will scroll even when you are doing things that normally 
  52. "lock" the screen.  For example, if you are changing the size of a window or
  53. dragging a window, and you move the mouse off the edge of the displayed
  54. portion of the screen, the screen will still scroll.  The screen will not
  55. scroll if you are dragging the screen, however, or if the virtual screen is 
  56. not the active screen.
  57.  
  58. You can force the screen to scroll without moving the mouse to the edge of the
  59. screen by holding down the left-amiga key and moving the mouse.  This scrolls
  60. the virtual screen while keeping the mouse at the same location on the display.
  61.  
  62. Note:  you can only have one virtual screen at a time under the current
  63. release of vScreen (1.0.1).
  64.  
  65.  
  66. If you want to remove vScreen and restore the normal sized screen, simply call
  67. vScreen again:
  68.  
  69.     1> VSCREEN
  70.  
  71. You should receive a "vScreen removed" message.  vScreen will make sure that 
  72. all the windows currently open on the screen are moved and sized so that they 
  73. will fit on the normal sized screen.
  74.  
  75.  
  76. USAGE NOTES:
  77.  
  78. When you enlarge a window using vScreen, the entire new screen is stored in
  79. CHIP memory (not just the part that is currently showing).  For this reason,
  80. vScreen may use up large pieces of CHIP memory.  Don't specify a screen that
  81. is too large for the amount of memory that you have.  vScreen does not recover
  82. well from low-memory conditions.
  83.  
  84. Although vScreen will allow you to specify a screen wider than 1024, you
  85. should be aware that screens of this size can be a problem.  The blitter has a
  86. limitation on the size of a block that it will move.  The RKM puts this limit
  87. at 976 (see BltBitMap() in the autodocs), but empirical testing indicates that 
  88. values up to 1024 will work.  Above this size, blit operations fail to work
  89. properly, so in a screen larger than 1024, dragged window may not update
  90. correctly and the menu bar will not appear. 
  91.  
  92. Similarly, screens taller than 1024 lines also can cause update problems.
  93.  
  94. vScreen will allow you to specify dimentions that are SMALLER than the current
  95. screen, but this is not recommended.  vScreen will not function properly if a
  96. screen is reduced in size.  Unexpected display effects will occur when the
  97. screen is scrolled.
  98.  
  99. Due to the method used to display only a portion of the larger screen,
  100. dragging a screen may incur noticably more overhead than usual.  This occurs
  101. only when the virtual screen is the top-most screen and there is another
  102. screen visable.  See the section on HOW VSCREEN WORKS for more details.
  103.  
  104. vScreen inserts an input handler in the Input.Device input chain and uses the
  105. SetFunction() routine to replace Intuition and Graphics library routines.  For
  106. this reason, only one copy of vScreen should be running at one time.  This
  107. means that, under the current version of vScreen, you may only have one
  108. virtual screen at a time.  If there is popular demand, a future release will
  109. lift this restriction, and will provide a programmer's interface to vScreen.
  110.  
  111. If the virtual screen closes while vScreen is running, vScreen will become
  112. disabled, but will not actaully be removed from the input chain or the library
  113. vector tables (in order to keep the resident portion of vScreen as small as
  114. possible, these functions are performed by the loader).  In order to actually
  115. remove vScreen from the system, you must call vScreen a second time.  Note
  116. that if you have set the workbench screen as a virtual screen and an
  117. application calls CloseWorkBench() (and the screen actually closes), then when
  118. the workbench is opened again, it no longer will be a virtual screen:  it will
  119. have changed back to its original size.  You will have to remove the old copy
  120. of vScreen (by calling vScreen with no parameters), and then re-install it to
  121. make the workbench virtual again.
  122.  
  123. vScreen works with all view modes (lo-res, hi-res, interlace and HAM).  HAM
  124. screens, however, may have discoloration along the left border when the left
  125. edge is not showing.  This is due to the fact that the left edge of the
  126. display will be the background color rather than the color of the previous
  127. pixel that is not being displayed.
  128.  
  129. If the active screen is in front of the virtual screen and you move the mouse 
  130. so that it passes over the virtual screen, then the top window of the virtual 
  131. screen will become active (and the previous active screen will become 
  132. inactive).  See the section on HOW VSCREEN WORKS for more details on why
  133. this is necessary under the current release of Intuition.
  134.  
  135. The Intuition window structure includes fields for the maximum size that the
  136. window may have.  Most current programs that allow their windows to be
  137. sized specify that the windows can be made arbitrarily large.  Some older
  138. programs, however, specify maximum sizes equal to a standard sized screen 
  139. (e.g. 640 x 200).  These windows may not be able to grow as large as a virtual
  140. screen.  For this reason, vScreen comes with a number of utilities that help
  141. you to manipulate windows "by hand" (see OTHER UTILITIES below).
  142.  
  143.  
  144. OTHER UTILITIES:
  145.  
  146. vScreen comes with four utility programs to help you manipulate windows on
  147. virtual screens:  wSize wMove wMax and wList.
  148.  
  149. wSize allows you to change the size of any window, even if it does not have a
  150. window sizing gadget.  To use wSize, issue the command:
  151.  
  152.     1> wSize dx dy ["window" ["screen" [IGNOREMAX]]]
  153.  
  154. where  dx  and  dy  are the number of pixels that the window should grow by in
  155. the  x  and  y  directions (note that negative values are allowed).  "Window"
  156. is the name of the window that is to be changed (if the name includes spaces
  157. or other special characters it should be enclosed in quotation marks).  If no
  158. name is specified then the active window is changed.  "Screen" is the name of
  159. the screen where the window can be found (enclosed in quotation marks of the
  160. name includes spaces).  If no screen name is specified then the active screen
  161. is used.  The window will not shrink smaller than its minimum allowable size
  162. (as stored in its window structure), and it will not grow larger than the 
  163. size of the screen, nor larger than its maximum size (as stored in its window
  164. structure) unless IGNOREMAX is specified.
  165.  
  166. For example:
  167.  
  168.     1> wSize 50 25 "AmigaDOS"
  169.  
  170. will increase the size of the window named "AmgiaDOS" (on the current screen)
  171. by 50 pixels in the  x  direction and 25 in the  y  direction.
  172.  
  173. You can use wSize to enlarge backdrop windows on screens that have them. 
  174. This is useful, for instance, for paint programs that render your picture
  175. into a backdrop window without a sizing gadget.
  176.  
  177.  
  178. wMove is similar to wSize, except that it moves the window rather than change
  179. its size.  The parameters are the same (except there is no IGNOREMAX flag):
  180.  
  181.     1> wMove dx dy ["window" ["screen"]]
  182.  
  183. where  dx  and  dy  are the amounts by which to move the window, "window" is 
  184. the name of the window to move, and "screen" is the screen where that window 
  185. can be found.  The screen defaults to the current screen, and the window 
  186. defaults to the active window.  A window will not be moved off the edge of 
  187. the screen.
  188.  
  189.  
  190. wMax allows you to change the maximum size setting that is stored in the
  191. window's structure.  Call it with the following parameters:
  192.  
  193.     1> wMax x y ["window" ["screen"]] 
  194.  
  195. where  x  is the maximum size horizontally, y  is the maximum size vertically, 
  196. "window" is the name of the window to change, and "screen" is the name of the
  197. screen where that window can be found.  If the screen or window name contains 
  198. a space or special character, enclose the name in quotation marks.  If no
  199. screen is specified, the active screen is used.  If no window is specified,
  200. the active window is changed.  A size of -1 means that the window can be
  201. stretched to any size in that direction.
  202.  
  203. For example:
  204.  
  205.     1> wMax -1 -1
  206.  
  207. allows the active window to grow to any size.
  208.  
  209.  
  210. wList prints a list of all the windows on a specific screen, or all the
  211. screens:
  212.  
  213.     1> wList ["screen"]
  214.  
  215. where "screen" is the name of the screen whose windows will be listed.  If 
  216. the screen name includes spaces or special characters, then enclose it in
  217. quotation marks.  If no screen name is specified, then the names of all the 
  218. windows on all the screens are printed.
  219.  
  220. For example:
  221.  
  222.     1> wList "Workbench Screen"
  223.  
  224. will list the names of all the windows on the workbench.
  225.  
  226.  
  227. HOW VSCREEN WORKS:
  228.  
  229. The graphics library defines a structure called a View, which represents the
  230. entire visible area of the display.  The View is broken down into separate
  231. ViewPorts.  Each ViewPort can have its own view mode (hi-res, interlace, HAM,
  232. etc.), and each ViewPort can be a different size.
  233.  
  234. Intuition maintains a View (called the ViewLord), where each ViewPort
  235. corresponds to an Intuition Screen (that's how screens can be of different
  236. sizes and resolutions).  Windows within those screens have no direct analog
  237. in the Graphics library (they correspond to Layers in the Layers library).
  238.  
  239. Each ViewPort has a related RasInfo structure that includes a pointer to its
  240. bitmap.  When vScreen runs, it allocates new, larger bitplanes for the
  241. ViewPort, and copies the data from the old planes into the new ones.  This
  242. provides a larger bitmap for the corresponding screen.  Once this larger
  243. bitmap is in place, all graphics calls proceed normally, as the Graphics
  244. library handles the larger bitmap without trouble.
  245.  
  246. The RasInfo structure also includes two other fields:  RxOffset and RyOffset.
  247. These represent the upper, left-hand corner of the section of bitmap that will 
  248. appear within the ViewPort.  Translated into Intuition terms, this tells what 
  249. part of a Screen's larger bitmap will be showing.  vScreen uses these offsets 
  250. to allow you to scroll the virtual screen; no memory is copied, so the 
  251. scrolling is very fast.
  252.  
  253. Unfortunately, Intuition does not take these offsets into account when it
  254. figures the position of the mouse (when buttons are pressed, gadgets are
  255. clicked, etc.).  The bulk of the vScreen-Handler is devoted to tricking
  256. Intuition into handling these offset values correctly.
  257.  
  258. Initially, vScreen sets the screen width and height to the new size of the
  259. screen.  When MakeScreen() is called for the virtual screen, and the screen is
  260. the front screen, Intuition will set the ViewPort height to be the height of
  261. the screen.  This would cause the screen to become an "overscan" screen when 
  262. it's not supposed to be.  
  263.  
  264. Ideally, vScreen would trap the MakeScreen() call and change the value back.  
  265. Unfortunately, however, MakeScreen() is called by RethinkDisplay() and 
  266. RemakeDisplay(), which are both called by Intuition itself (when a new screen 
  267. is opened or moved, for example).  Since Intuition does not call its own jump 
  268. table vectors, we are not able to trap ALL the calls to MakeScreen(), so that 
  269. is not an effective method of fixing the problem.
  270.  
  271. Most often, after a MakeScreen() call, there will be calls to MrgCop() and
  272. LoadView() (this is what happens with RethinkDisplay() and RemakeDisplay()). 
  273. Since LoadView() is in the Graphics library, not the Intuition library,
  274. Intuition DOES call LoadView() through the graphics library vector table. 
  275. This provides a viable hook that we can use to fix the overscan problem. 
  276. Whenever LoadView() is called on the Intuition ViewLord, we check that the
  277. ViewPort for the virtual screen does not have a height that is too large.  If
  278. it does, we reduce the height and call MrgCop() again (this is what slows down
  279. dragging the virtual screen when it is on top).
  280.  
  281. This fix to LoadView() makes the larger virtual screens display properly for
  282. any given set of RxOffset and RyOffset.  The input handler is what changes
  283. these offsets.  The handler adds up all the mouse movements within the input
  284. event list, and adds them to the current Intuition MouseX and MouseY values. 
  285. If these would cause the mouse to move off the edge of the displayed area of
  286. the screen, then the handler sets the offsets so that the mouse stays on the
  287. screen.  The handler also checks for forced shifts (left amiga held down while 
  288. moving the mouse).
  289.  
  290. Once the screen is shifted, however, the mouse X and Y values can get very
  291. large.  When Intuition positions the sprite that represents the mouse pointer,
  292. it does not take RxOffset and RyOffset into account and hence can position
  293. the pointer off the edge of the display.  For this reason, vScreen traps the
  294. MoveSprite() graphics function, and when the virtual screen is active and
  295. sprite zero is positioned, vScreen compensates for the offsets itself.  This
  296. guarantees that the mouse pointer is positioned over the correct part of the
  297. shifted virtual screen.
  298.  
  299. Intuition uses the MaxDisplayRows and MaxDisplayWidth to calculate the range
  300. of X and Y values over which the mouse can travel (MinXMouse, MaxXMouse,
  301. MinYMouse, and MaxYMouse).  The min and max values are changed when you drag a
  302. window or screen, and when you change a window's size through its sizing
  303. gadget.  In order to make it possible to move windows over the entire area of
  304. the virtual screen, vScreen modifies the MaxDisplay values that Intuition uses.
  305.  
  306. At this point, the virtual screen works correctly; however, interactions
  307. between the virtual screen and other screens do not.  Intuition does not take
  308. into account the RasInfo offsets when it calculates the position of the top of
  309. the screen.  For example, if the virtual screen is shifted vertially so that 
  310. the top 20 lines are not showing, and another screen is visible behind the 
  311. virtual screen, and you click in that screen but within 20 lines of the top of
  312. the virtual screen, Intuition will think you clicked in the virtual screen
  313. itself (in the upper area that is not currently showing).  Worse yet, if you
  314. click higher up in the other screen (over 20 lines above the top of the
  315. virtual screen), Intuition will see that you hit the other screen, but will
  316. think the mouse is 20 lines lower than it is.  This is because the Intuition
  317. MouseY value is off by RyOffset pixels.
  318.  
  319. To avoid these problems, vScreen monitors the mouse movements to tell when the
  320. mouse changes from being over the virtual screen to being over some other
  321. screen.  When the pointer moves over some other screen, vScreen resets the
  322. MouseX and MouseY values to their normal positions.  That way, if a mouse
  323. click occurs in the other screen, it will occur at the proper place.  When the
  324. pointer moves back over the virtual screen, the MouseX and MouseY are returned
  325. to their positions relative to the virtual screen's RxOffset and RyOffset
  326. values.
  327.  
  328. This works fine whenever the virtual screen is the active screen and the
  329. pointer moves over another screen either in front of or behind the virtual
  330. screen.  It also works if a screen behind the virtual screen is active and
  331. the mouse moves over the virtual screen.  It does not work, however, if a
  332. screen in front of the virtual screen is active and the mouse moves over the
  333. virtual screen.  In this case, if the MouseY value were changed and the mouse
  334. button pressed, Intuition would incorrectly think the mouse was positioned 
  335. over the active screen.  For this reason, when a non-virtual screen is active
  336. and in front of the virtual screen, and the mouse moves over the virtual
  337. screen, the virtual screen is activated.  This is not consistant with normal
  338. Intuition actions, but does ensure that mouse clicks will be reported correctly.
  339.  
  340. Normally, you can move the mouse pointer past the top edge of a screen so that
  341. it is over another screen and the virtual screen will not scroll until the
  342. pointer hits the top of the physical display.  If you are dragging a window,
  343. however, or are holding down the menu button, or doing some other action that 
  344. locks the screen layers, then the screen will scroll when you move the pointer
  345. past the top of the screen (rather than waiting until it reaches the top of
  346. the display).  This makes it easier to select menus when the screen is
  347. scrolled vertically, for instance.
  348.  
  349. If an AutoRequest() occurs on the virtual screen, the screen will automatically
  350. shift so that the upper left-hand corner is showing (just like the screen
  351. where an AutoRequest occurs will be brought to the front).
  352.  
  353. If BuildSysRequest() is called on the virtual screen, then rather than shift 
  354. the screen, vScreen moves the request window so that it appears in the upper 
  355. left-hand corner of the displayed area of the screen.  Ideally, this is what 
  356. we should do for AutoRequest(), but since Intuition does not call its own 
  357. vector table, we can not trap the BuildSysRequest() call made by AutoRequest().
  358.  
  359. Finally, vScreen traps calls to CloseScreen() so that it can tell when the
  360. virtual screen is closed.  If the virtual screen closes, vScreen will cease
  361. all its functions, but will not actually restore the trapped vectors or remove
  362. the input handler or free its memory until you remove vScreen by calling
  363. vScreen a second time.
  364.  
  365. I do not recommend that you use this approach in your own programs. 
  366. Modifying, or even viewing, the INTUITIONPRIVATE data structure is frowned
  367. upon by Commodore-Amiga, and will make your programs unreliable in future
  368. versions of Intuition.  Furthermore, if more than one program uses this
  369. method, they will probably interact destructively.  If there is sufficient
  370. demand, and provided Commodore does not incorporate something like this in a
  371. future release of Intuition, I may be convinced to put this functionality
  372. into a library with a callable interface for programs to use.
  373.  
  374.  
  375. COMPILING VSCREEN:
  376.  
  377. vScreen was developed using the Lattice C compiler v4.0 on a 512K Amiga 1000.
  378. It probably will need to be changed in order to work with Manx Aztec C.  To
  379. compile and link vScreen use the following commands:
  380.  
  381.     1> lc -v -b0 vScreen vScreenSetup vScreen-Handler
  382.     1> asm vScreenStubs
  383.     1> blink with vScreen.lnk
  384.     1> blink with vScreen-Handler.lnk
  385.  
  386. I prefer not to use the Lattice function prototypes, but I like to use the
  387. direct-library-call preprocessor commands, therefore, I have modified my
  388. prototype include files to remove the function prototypes (via an #ifdef).
  389. If you compile the source files with the -dPROTO flag, then the Lattice proto
  390. include files will be used (there will be compile-time warnings), otherwise,
  391. they will not be included.
  392.  
  393.  
  394. AUTHOR:
  395.  
  396. vScreen and vScreen-Handler
  397. Copyright 1988 by Davide P. Cervone, All rights reserved.
  398.  
  399. You may distribute this program and source code for non-commercial purposes, 
  400. provided you include this documentation.  You may not ditribute this program 
  401. as part of a commercial product without the author's written permission.  
  402. You may not include this source code as part of your own programs.
  403.  
  404. (Sorry about the restrictions on the use of vScreen, but I think that using
  405. the INTUITIONPRIVATE stuff is a terrible thing to do, and I don't want it to
  406. appear in any commercial products.  I'm hoping that Commodore-Amiga will pick
  407. up on the idea and incorporate it into Intuition, where it belongs, and where
  408. it would be much easier to do.  If they don't, then I plan to do my own
  409. virtual screen library, and I don't want anyone else's programs to break, or
  410. to get in the way).
  411.  
  412. If you find an interesting use for vScreen, please drop me a note.
  413.  
  414.  
  415. Davide P. Cervone
  416. University or Rochester Computing Center            dpvc@tut.cc.rochester.edu
  417. Taylor Hall                                         dpvc@ur-tut.UUCP
  418. Rochester, New York  14627                          DPVC@UORDBV.BITNET
  419. (716) 275-2811
  420.