home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 3 / goldfish_volume_3.bin / files / dev / e / amigae / rkrmsrc / intuition / windows / visiblewindow.e < prev    next >
Text File  |  1995-03-26  |  5KB  |  115 lines

  1. -> visiblewindow.e
  2. -> Open a window on the visible part of a screen, with the window as large as
  3. -> the visible part of the screen.  It is assumed that the visible part of the
  4. -> screen is OSCAN_TEXT, which how the user has set their preferences.
  5.  
  6. MODULE 'intuition/intuition', -> Intuition data structures and tags
  7.        'intuition/screens',   -> Screen data structures and tags
  8.        'graphics/gfx',        -> Graphics structures
  9.        'graphics/modeid'      -> Release 2 Amiga display mode ID's
  10.  
  11. ENUM ERR_NONE, ERR_WIN, ERR_PUB
  12.  
  13. RAISE ERR_WIN IF OpenWindowTagList()=NIL,
  14.       ERR_PUB IF LockPubScreen()=NIL
  15.  
  16. -> Minimum window width and height:  These values should really be calculated
  17. -> dynamically given the size of the font and the window borders.  Here, to
  18. -> keep the example simple they are hard-coded values.
  19. CONST MIN_WINDOW_WIDTH=100, MIN_WINDOW_HEIGHT=50
  20.  
  21. -> E-Note: minimum and maximum are built-in
  22.  
  23. PROC main()
  24.   -> These calls are only valid if we have version 37 or greater
  25.   -> E-Note: E automatically opens the Intuition and Graphics libraries
  26.   IF KickVersion(37)
  27.     fullScreen()
  28.   ELSE -> E-Note: we can print a minimal error
  29.     WriteF('Error: Needs Kickstart V37+\n')
  30.   ENDIF
  31. ENDPROC
  32.  
  33. -> Open a window on the default public screen, then leave it open until the
  34. -> user selects the close gadget. The window is full-sized, positioned in the
  35. -> currently visible OSCAN_TEXT area.
  36. PROC fullScreen() HANDLE
  37.   DEF test_window=NIL:PTR TO window, pub_screen=NIL:PTR TO screen,
  38.       rect:rectangle, screen_modeID,
  39.       -> Set some reasonable defaults for left, top, width and height
  40.       -> We'll pick up the real values with the call to QueryOverscan()
  41.       left=0, top=0, width=640, height=200
  42.  
  43.   -> Get a lock on the default public screen
  44.   -> E-Note: automatically error-checked (automatic exception)
  45.   pub_screen:=LockPubScreen(NIL)
  46.  
  47.   -> This technique returns the text overscan rectangle of the screen that we
  48.   -> are opening on.  If you really need the actual value set into the display
  49.   -> clip of the screen, use the VideoControl() command of the graphics library
  50.   -> to return a copy of the ViewPortExtra structure.  See the Graphics library
  51.   -> chapter and Autodocs for more details.
  52.   ->
  53.   -> GetVPModeID() is a graphics call...
  54.   IF (screen_modeID:=GetVPModeID(pub_screen.viewport))<>INVALID_ID
  55.     IF QueryOverscan(screen_modeID, rect, OSCAN_TEXT)
  56.       -> Make sure window coordinates are positive or zero
  57.       left := Max(0, -pub_screen.leftedge)
  58.       top  := Max(0, -pub_screen.topedge)
  59.  
  60.       -> Get width and height from size of display clip
  61.       width:=rect.maxx-rect.minx+1
  62.       height:=rect.maxy-rect.miny+1
  63.  
  64.       -> Adjust height for pulled-down screen (only show visible part)
  65.       IF pub_screen.topedge > 0
  66.         height:=height-pub_screen.topedge
  67.       ENDIF
  68.  
  69.       -> Ensure that window fits on screen
  70.       height:=Min(height,pub_screen.height)
  71.       width:=Min(width,pub_screen.width)
  72.  
  73.       -> Make sure window is at least minimum size
  74.       width:=Max(width,  MIN_WINDOW_WIDTH)
  75.       height:=Max(height, MIN_WINDOW_HEIGHT)
  76.     ENDIF
  77.   ENDIF
  78.  
  79.   -> Open the window on the public screen
  80.   -> E-Note: automatically error-checked (automatic exception)
  81.   test_window:=OpenWindowTagList(NIL,
  82.                                 [WA_LEFT, left, WA_WIDTH,  width,
  83.                                  WA_TOP,  top,  WA_HEIGHT, height,
  84.                                  WA_CLOSEGADGET, TRUE,
  85.                                  WA_IDCMP,       IDCMP_CLOSEWINDOW,
  86.                                  WA_PUBSCREEN,   pub_screen,
  87.                                  NIL])
  88.   -> Unlock the screen.  The window now acts as a lock on the screen, and we do
  89.   -> not need the screen after the window has been closed.
  90.   UnlockPubScreen(NIL, pub_screen)
  91.   -> E-Note: set it to NIL to help deal with errors
  92.   pub_screen:=NIL
  93.  
  94.   -> If we have a valid window open, run the rest of the program, then clean
  95.   -> up when done.
  96.   handle_window_events(test_window)
  97.  
  98.   -> E-Note: exit and clean up via handler
  99. EXCEPT DO
  100.   IF test_window THEN CloseWindow(test_window)
  101.   IF pub_screen THEN UnlockPubScreen(NIL, pub_screen)
  102.   -> E-Note: we can print a minimal error message
  103.   SELECT exception
  104.   CASE ERR_PUB; WriteF('Error: Could not lock public screen\n')
  105.   CASE ERR_WIN; WriteF('Error: Failed to open window\n')
  106.   ENDSELECT
  107. ENDPROC
  108.  
  109. -> Wait for the user to select the close gadget.
  110. PROC handle_window_events(win)
  111.   -> E-Note: we can use E's special message poller
  112.   REPEAT
  113.   UNTIL WaitIMessage(win)=IDCMP_CLOSEWINDOW
  114. ENDPROC
  115.