We've Moved - Again! -------------------- In case you haven't heard yet, we have moved our office and now have new phone numbers: Tel: (413) 532-2434 Fax: (413) 532-2540 Our address remains the same. Updating to Geneva release 004 ------------------------------ To update to the new version, follow these steps: 1. If you intend to keep the old version around for some reason, be sure to make a backup of all files. 2. Make a backup of your original Geneva disk! 3. Format a blank, double-sided floppy disk (at least 80 tracks, 9 sectors/track). This will be your new Geneva Extras Disk. 4. Run the enclosed patch program, PATCH004.PRG. The Master disk will be modified. Go get a cup of coffee; this takes about 4 minutes. IMPORTANT: After the first disk has been patched, the system bell will ring and you will be prompted to insert the blank disk you formatted in Step 3. If you insert a disk that already has files on it, you will be warned, and if you continue all of the existing files will be DELETED in order to make room for the new Geneva files. Go get another cup of coffee. It takes about 5 minutes to write the extire Extras disk. 5. After the patch has successfully completed, run the INSTALL.PRG on the modified disk. It will re-install all of the new files. If you get an error message saying that an old file already exists, just let the program overwrite the old file. Any custom flags you have set in your GENEVA.CNF file will, unfortunately, be lost. If you have problems with the patch ----------------------------------- If, for some reason, the patch program does not run properly you can send your original Geneva disk back to us along with a blank disk and a check for $5 + $2 to cover return shipping. We will rewrite the disks with the most recent version and return them to you by mail. Send to: Gribnif Software P.O. Box 779 Northampton, MA 01061 If you purchased the patch program on a disk directly from us, then just include the $2 for shipping, and both disks. Compatibility Notes ------------------- o Calligrapher cannot always cut/paste when run in multitasking mode due to an error in the program. To work around this, you can either always make sure there is something in the clipboard, or you can run Calligrapher in single-tasking mode. o Calligrapher intentionally does not display a CapsLock indicator when run in multitasking mode. o If you use Calamus SL, you should not delete the PKS Write module from memory. When this happens, it performs a system call that it should not. Even without Geneva, any windows open by other programs will cease to work properly if you do this. With Geneva, your document window will also get closed. o To use Geneva with Multi Viewer Graphica (MVG), you need to turn pulldown menus off in the Task Manager's Misc. Options dialog. o Prior versions of INSTALL.PRG would create a GEM.CNF file that has a line like this in it: setenv PATH=.,C:\GENEVA The problem is that when some programs see the leading '.', they do not treat it correctly (GEMINI, TWDTP). The period can be removed, and the path will mean the same thing to Geneva. This would make the example above: setenv PATH=,C:\GENEVA Changes in INSTALL ------------------ The Installation prorgam can now correctly install Geneva's files to any drive, not just the boot drive. A copy of GEM.CNF is always placed in a GENEVA folder on the boot disk. Changes in TASKMAN ------------------ When the Task Manager first opens, you will probably notice that the window is wider than you had expected. This is because there is now a third pulldown menu, for Settings. The way that editing flags works has changed: o The "Temporary" option is only available when the name of a task has been selected in the main list. Changes made in this mode are only valid until the task terminates; they cannot be saved permanently. o The "Permanent" option changes the flags for any new instances of the task whose name matches the chosen name. It will NOT change the flags for a task that is already running. If you start by selecting a task's name from the main list and then choose this option, then the permanent flags that Geneva would use for that application are displayed by default. Of course, you can still use the "Prev" and "Next" buttons to scroll through the list of flags. There is a "?" button in the Permanent Execution Flags dialog. It gives you an item selector which allows you to locate the exact filename of the application. Since Geneva does not keep track of the full path of the application, only its name, you will have to manually go to the path of the application each time this option is used. A new "Optimize window redraws" flag has been added. See the "Features in the Main Program" section, below. By default this flag is off for all applications. The "Keyboard" dialog has been renamed to "Keyboard Equivs" and can now control three new keyboard equivalents, which are not immediately apparent: o Iconify, the delta gadget to the left of the Cycle gadget. o Iconify All, chosen by holding the Control key while clicking on the Iconify gadget. o Cycle app's windows, chosen by holding either Shift key while clicking on the Cycle window gadget. The old "Windows" dialog has been renamed to "Window/Menu Bar". This dialog has a new option, "Menu separator style", which allows you to change how the separator lines in menus appear. Note that the style only applies to menus at the top of the screen or in windows that were created by programs which are Geneva-aware. A program which implements its own menus in windows will not get the new style. Popup menus and submenus do not get the new style, either. The first option in this popup gives no change; the second uses a solid gray line, and the remaining styles are solid, colored lines. These latter styles are only used when the video display can show at least 16 colors at once. Any disabled (normally gray) menu entries will also have the color you choose here. A new "Window Colors" dialog has been added. Geneva provides more window gadgets than GEM normally does, so this dialog gives you control over the colors and fill patterns of all of them. To select a gadget to modify, click on the gadget with the mouse. An outline will appear around the gadget you have chosen. Its attributes can then be changed. The normal options for text, border, and fill color are here. You also have a few more choices: o The 3D button turns on/off the raised appearance of the gadget. o The Shadowed button in the Text section turns on or off a new effect: text with a shadow behind it. The shadow's color is the text color chosen below. The text itself is always drawn in either black or white. o The Topped button will toggle between editing the attributes for a window which is on top or elsewhere in the stack. Note that the Shadowed and 3D buttons affect the window gadget for both its topped and untopped appearance. To copy one gadget's attributes to another, click and hold the mouse button down on a gadget and drag the resulting gray outline to another gadget in the window. Clicking on the mover bar of this window will only select that gadget or copy its attributes to another gadget. However, the window can be moved by clicking on any of the white areas within the window. This window's appearance does not change when you make another window topmost. The text attributes of the menu bar cannot be changed. Menu text is always black and transparent. When Geneva's settings are saved, the window colors are also saved. If you still use another program like WCOLORS.CPX, then the settings in that program will override the ones you have set in the Task Manager. The "Dialogs" dialog has been renamed to "Dialog Colors". It provides some new options: o The border can be "AES 4 3D" style. This is slightly different from the way Geneva draws its 3D buttons, most notably in the fact that the color is controlled in a different manner (you have to use the BCOLORS.CPX to change this.) Choosing this 3D method will deselect the Geneva-style 3D button, and vice-versa. If you want to get a 3D effect for the background object when using the AES 4 3D method, you need to also set the Outline attribute. You will probably also want to turn off the Rounded attribute. o The Shadowed button in the Text section turns on or off a new effect: text with a shadow behind it. The shadow's color is the text color chosen below. The text itself is always drawn in either black or white. o Text can also be bold. This can even be combined with the Shadowed effect. The "Misc. Options" dialog has several new choices: o "Preserve system colors" prevents applications which alter the color palette from affecting other applications. As you switch out of an application which changed the colors, they will be reset to what they were the last time the new application had control. Many paint programs will benefit from this option. Also, any time an alert or Geneva's item selector is opened, the system colors are returned to those of the Geneva Manager menu. This gives a more readable item selector in programs like Calamus SL which change the system color palette. Note that it if you have this option set, you cannot change the colors for all applications by using things like a control panel! As soon as you change to another application, the colors will revert to what they were previously. You should turn this option off before using the control panel. Furthermore, in order for the system colors that are used by default to be changed, Geneva essentially ignores this flag until all desk accessories are loaded. This way, if one of them (like a control panel) changes the settings, all applications will get the new colors by default. Once all of the desk accessories have loaded, "Preserve system colors" takes effect. o "Preserve mouse on/off" keeps track of how many times a program makes the mouse pointer visible/invisible, and automatically restores the mouse to the correct state when you switch between applications, similar to the way to the "Preserve system colors" option works. o Any dialog without editable fields can respond to just the keyboard equivalents, without Alternate being held. The "Not in window" option affects this feature for dialogs and alerts that are not contained in a window. The "In window" option affects this feature for for dialogs that are drawn by Geneva and appear in a moveable window, like all of the Task Manager's dialogs. Some programs generate their own windowed dialogs and will not be affected by this option. By default, this option is turned off for dialogs in windows. The positions of the main Tasks window and all dialogs in the Task Manager can be saved by using the "Save Positions" option. You can now click on a name in the main list a second time in order to de-select it. Iconifying the main window and then running an application in single-tasking mode will no longer cause the Task Manager window to re-open incorrectly. The Full gadget now alternates between full and the previous location. The window's height will not get stuck vertically, preventing it from becoming taller once a new app has been added to the list. Names in the list of applications can be selected all the way across the width of the window. The gadget border sample sizes in the Windows dialog now match what Geneva will actually use. Changes in GNVA_TOS ------------------- GNVA_TOS and GNVAHELP now both use the same font selection dialog. It is one which shows all applicable fonts, not just the first 16. If you select the Quit menu entry or close the window while a TOS program is running, you will be given the opportunity to just terminate the TOS program or terminate it and quit Geneva TOS. You can now access windows/menu bars whenever a TOS program run by GNVA_TOS is waiting for *any* type of keyboard input, not just some types. If GNVA_TOS is passed commandline parameters in order to run a TOS program, then: o The parameters are now the default in the Parameters dialog. o The name and path of the executed program are the defaults in the Open item selector. o The commandline can include the redirection operators > (copy output to a file), >> (append output to a file) and < (take input from a file). IMPORTANT: If you are running the program from NeoDesk, then you must put the redirectors in single quotes to prevent NeoDesk from trying to do the redirection, like: arc.ttp x archive.arc '> out.txt' The Parameters dialog uses wrap-around editing. It can also take more parameters than before if the "Use extended argument passing" option is on. The program can now be iconified. Output will continue to go into the window while it is iconified. The Misc. Options dialog now contains an option called "Pause when TOS program exits". If this option is checked, Geneva TOS will display a message prompting you to press any key. If this option is not checked, Geneva TOS will close as soon as the TOS program terminates. In order to be able to examine a program's output after it has terminated, you need to have this option checked. GNVA_TOS now uses a MiNT pipe for i/o redirection, when MiNT is running. Fixed a bug in the Fforce() and Fdup() functions that would always cause a crash whenever these functions were used by a TOS program (or whenever any TOS program was run on a Falcon.) GNVA_TOS can now use non-Speedo fonts with Speedo GDOS 5. The scrollback buffer works much better, in general, once it has reached the end. Fixed a cosmetic bug in erasing parts of the current line, specifically the sequences [Esc]J, K, d, and o. Output of certain types of text has been sped up. It is no longer possible to enter a number of columns < 80 or a number of rows < 24 into the scrollback buffer dialog. You can no longer have a window which is too tall or wide to fit on the screen. Terminating a program with ^C and then running a second one now works. Changes in GNVAHELP ------------------- GNVA_TOS and GNVAHELP now both use the same font selection dialog. It is one which shows all applicable fonts, not just the first 16. The minimum font size is now 2 points. When going backward to the previous screen, the window is returned to the slider positions it previously had in that location. The window can now be iconified. The main window can be scrolled with the keyboard by using the arrow keys, with or without [Shift]. Underlined keywords are now drawn in a different color. A number of graphics functions have been added to MAKEHELP and GNVAHELP. See the files MAKEHELP.HLP and GRAPHICS.* for more information. (MAKEHELP.TXT has been replaced by the HLP file.) The MAKEHLP.TTP program now has a new option, -s, to generate automatic cross-references. See the file MAKEHELP.HLP for more information. Changes in Geneva ----------------- Item Selector ------------- You can now hold the Control key while clicking on the name of a file or folder in order to Show Info on the item. If a file is read-only, a checkmark will appear in front of its name in the item selector. This only applies to 1 column mode. The "Info" dialog now has a read-only button, so that the read-only attribute of a file can be changed. The "EXT" list includes a new entry, "Start". When this extension is chosen, the template is changed back to the value it originally had when the item selector first opened. Sort by Date now sorts files that were created on the same day, but at different times, correctly. The item selector will now preserve the date and time of a file that is copied or moved. The item selector can now deal with an Atari-style background for all of its dialogs. Also fixed a problem with clicking on the 1/2 COL button in some places. New Features in the Main Program -------------------------------- MiNT is now supported. See the file MINT.TXT for more info. Text in buttons can now have a "shadowed" effect. This makes the window gadget text much more readable in monochrome. This option can be changed for window gadgets and dialog buttons in the Task Manager. Dialog buttons can now have the Atari AES 4 style of 3D appearance. See the Task Manager for more details. The colors of all window gadgets can now be set individually by using the Task Manager. If you still use another program like WCOLORS.CPX, some of the gadget colors will be inherited from other gadgets, like the Cycle gadget which gets the color of the Full gadget. When Geneva's settings are saved, the window colors are also saved. A new program flag has been added, Optimize Window Redraws. Because many programs will experience redraw problems when this option is on (even NeoDesk 4 release 001), this option can be set individually for any program by using the Task Manager. It makes these changes: o Moving a window will try to blit as much of the window as possible, even if the window is partway off screen or covered by another window. o Resizing a window so that it is larger will only cause the previously invisible part to be redrawn, rather than redrawing the whole window. o Topping a window will not always redraw the entire window. o This method takes slightly more memory because Geneva hold onto information about what windows overlap a given window so that it does not have to spend time regenerating the information as often. Note that even when a program responds correctly to this method, it is still possible for there to be cosmetic redraw errors because of the way GEM works. For instance, if you move a window that is off the right edge of the screen 3 pixels to the left, the area that is redrawn will be in the correct pattern, but it will not match up with the rest of the window. The effect of this can be decreased by not using patterns in window gadgets. Window redraws are faster in general, even without the Optimize option. There are now keyboard equivalents for: o The mouse pointer can be reset to being turned on once by pressing Control-Shift-Alternate [keypad period]. This also clears any mouse button presses that may be queued in memory. o Iconify (Alternate [`], by default) o Iconify All (Control-Alternate [`], by default) o Cycle only the windows belonging to the current application (Shift-Alternate-Backspace, by default). This can also be done with the mouse by holding either Shift key while clicking on the Cycle window gadget. o Dialog buttons containing the up/down arrow characters can be activated by using the window up/down line keyboard equivalents. (Control [keypad 8] for up, Control [keypad 2] for down, by default) o When a dialog has an edit cursor, these options will cut/paste to the Atari clipboard: Cut: Shift-Alternate [X] Copy: Shift-Alternate [C] Paste: Shift-Alternate [V] If an untopped window is clicked on while either Shift key is held, all windows belonging to that application will be moved to the top of the stack. This provides an easy way to get all of an application's windows back to the top. Any dialog without editable fields can respond to just the keyboard equivalents, without Alternate being held. This is controlled by options in the Task Manager. When you click with the mouse on a character in the ASCII Table window, that character's ASCII value will be displayed in the mover bar of the window until the mouse button is released. Some applications which previously would not work in multitasking mode because they displayed a dialog without locking the menu bar first may now work. This is because when Geneva sees that an application uses form_dial(FMD_START), it prevents other applications from getting control until there has been a form_dial(FMD_FINISH) call. A new command has been added to the GEM.CNF file, "runacc". It allows a desk accessory to be loaded but not opened. Its syntax is identical to "run". A "Preserve system colors" option has been added. This can be controlled in the Task Manager. It prevents applications which alter the color palette from affecting other applications. A "Preserve mouse on/off" option has been added. It keeps track of how many times a program makes the mouse pointer visible/invisible, and automatically restores the mouse to the correct state when you switch between applications, similar to the way to the "Preserve system colors" option works. This option can be controlled in the Task Manager. When Geneva rewrites its settings to disk, the entire list of program flags is sorted alphabetically. This means that the next time you look at the list in the Task Manager, it will be easier to find a particular program. When a window gets iconified, Geneva will tell the next uniconified window in the stack (from the top) to become topped. Switching to an application which has a tear-away menu on top of its other open windows will put one of the other open windows on top, instead of the tear-away. The way that popup menus work has changed. If the mouse button is not pressed when the popup is started, keyboard mode is no longer the default. You can enter keyboard mode at any time by pressing a key like the up or down arrow. Therefore, programs like STraight Fax (as a desk accessory) which use popup menus will work more intuitively. If you are in keyboard mode and the mouse is moved on top of a menu entry, keyboard mode will exit. This means that you cannot enter keyboard mode when the mouse is over a menu entry. Other Changes in the Main Program --------------------------------- It is now impossible to end up with the 10 point font in a vertical resolution of 200 pixels. (Geneva actually checks the number of rows of text and makes the system font it would use to draw dialogs and menus smaller if this is less than 25 rows.) This avoids the problem of having a huge font in some resolutions on the Falcon or Crazy Dots. The last line of a GEM.CNF or GENEVA.CNF file will not be ignored if it does not end with a CR/LF. The code which uses the 200 Hz interrupt is less likely to cause keyboard overruns now. Awakening a program which already has a window open will no longer send an AC_OPEN message. Selecting multiple files in UIS III now works correctly. evnt_multi() no longer sometimes returns the CapsLock state (UIS). Closing an open DA window when the program that owns the menu bar has no windows now restores the mouse shape to that of the program. The underlines for keyboard equivalents have been moved down. Check marks are now to the left and down one pixel. Menu titles are now up one pixel. Changing the menu start key now works properly. Having a single-tasking app run from GEM.CNF will not lock up when changing resolution. If more than one automatic directory window update message is sent to the shell before it has a chance to read them, they are now all passed to the shell. Previously, only the first one would go through. If a section of GENEVA.CNF ends before it should, the file is closed properly. Tear-away menus can now produce submenus. The shape of the thick cross mouse pointer is now correct. Radio/check buttons are now centered vertically in the object. This helps make the buttons line up with the text when an alternate font is being used. Switching between single-tasking applications will no longer sometimes result in a blank menu bar. Turning the "Redraw on exit" flag off now works much better. Putting the last application which owns the desktop to sleep will now always redraw the desktop. Menu keyboard equivalents now work when a tearaway menu is topmost and the equivalent for a menu entry in a different pulldown menu is selected. Atari-style 3D buttons now display much more like they should. Putting the topmost application to sleep will always return to its parent, not the next open application. Switching applications from the Applications tear-away menu should no longer mess up the locations of menu bars. Memory allocation is now more efficient. If Warp 9 version 3.81 or older is used, Geneva will force Warp 9's Zoom Boxes option to be on. This avoids a conflict in the way Warp 9 handles this function. You can turn the zoom boxes off by using the "Grow/shrink boxes" option in the Task Manager's "Misc. Options" dialog. The _IDT cookie is now set correctly for Sweden and other countries. If more than one application has the exact same name in the Desk menu, the names are sorted by application ID. Using a True Type font with NVDI 3 will now give the correct characters for regular text. Special Atari-specific characters, like arrows will not be correct because there is no way to remap these accurately when a True Type font is being used. When several programs write into the GENEVA.CNF file, there is no longer the chance that the file will end up with lots of extra carriage returns in it. If all applications except for the current one are asleep, then quitting it will no longer cause a lockup. If Geneva is run from the AUTO folder, then the "Quit Geneva" menu entry is not available. Running a single-tasking app from GEM.CNF with the "runsleep" command now works correctly. Geneva now maintains several of the system vectors on a per-process basis. This means that if a program like Calamus, which has its own bomb trap, is running and another program crashes, this will not confuse Calamus into thinking that Calamus crashed. This also helps in the case of any program written with the High Speed Pascal compiler. Using a Falcon with a non-VGA monitor (like the SC1224) reboots into the correct resolution now. The appearance of radio and check boxes in a 4-color video mode with the 8 x 16 font is now correct (like in 4-color, interlace mode on the Falcon.) If you press Alt-Space to start the main menu in keyboard mode and then click with the mouse anywhere else to close it, the keyboard equivalents for menu titles are undrawn correctly. More esoteric changes... ------------------------ There has been a major change in the way events get blocked. When the menu bar is being used, MU_TIMER and MU_Mx messages continue to occur now. Also, the behavior of wind_update(BEG_UPDATE) has been changed to be more compatible with Atari's AES. The module icons in Calamus and Calamus SL work right. The "Keyboard Equivalents" dialog in the Task Manager can now be moved if Limit Window Handles is on. (X_WM_SELECTED messages) Programs which have Geneva draw menu bars in their windows will work right if the Limit Window Handles option is on. (X_MN_SELECTED) appl_write() works properly when the Limit Handles flag is on. menu_tnormal() works when the item is not a menu title (CAL.PRG Alt-M) It should no longer be possible to confuse NeoDesk's window redraws by closing lots of windows very quickly. A program which uses an MU_BUTTON event to wait for the mouse buttons to be released will work properly even if the program has no windows open and does not own the desktop. (INSHAPE) Quitting a program which is run by Pexec from another program will not cause a crash if the child left one or more VDI workstations open (INSHAPE) The unused portions of a WM_ARROWED message are now zeroed-out. (STGUIDE) appl_read(-1) returns the correct value. It also treats WM_REDRAW messages correctly. (KOBOLD) appl_exit() won't delete windows which are not open (DEVPACST) appl_getinfo(0) and (1) now return the correct font height (EGEM and many other German programs) appl_getinfo(10) now reports the correct shel_write() bits. When x_form_filename() is used with the to_from parameter == 0, only the first 8 characters of a filename are copied if the filename is not in 8.3 format (Geneva's item selector when called by CALAMUS SL) Programs which modify Geneva's VDI workstation attributes are less likely to cause redraw problems (menu titles in TW3) The evnt_multi() mode which deals with right mouse clicks now works much better (TW3, Papyrus, many others) The Alt-Backspace keyboard equivalent will only work on windows which have a Cycle gadget. It never tells a window without one that it should be on top (TW3) The default value for scrp_read() is an empty string. Also, if scrp_read() is an empty string, the return value is 0. (PAPYRUS) G_TITLE objects are no longer clipped within their object box. Geneva now handles the case where a program has a menu bar with the title objects out of sequence. If a MU_MESAG event occurs during the same evnt_multi() as an MU_TIMER event, only the MU_MESAG is reported (LC5xxED). Window pulldown menus are now snapped to 8-pixel bounds. This makes them draw more quickly. There are fewer mouse on/off calls when redrawing menus and gadgets. Geneva is now compatible with non-Speedo fonts when using Speedo 5. If you hold the mouse on an active window menu title and then move to a disabled title, this no longer partially draws the menu. An application which understands AP_TERM will not be thrown out of memory after 2 seconds during a resolution change. Desk accessories continue to be terminated automatically, even if they say they understand AP_TERM. (PAPYRUS, XCONTROL) objc_draw() and objc_find() now work when told to work on the root object with a depth of zero, and bad ob_head and ob_tail pointers (PAPYRUS) Programs which rely on the method for getting the status of both mouse buttons now get the correct return value if the mouse is pressed and then released before the double-click interval expires. (PAPYRUS, LANDMINE, others.) Fixed objc_sysvar() with bad values during inquire (TRUIMAG) Fixed graf_mouse( number|0x8000... The Gnva and _IDT cookies are installed during the AUTO folder load sequence, not just before the desktop is first drawn. An appl_write() to ID #0 will send the message to the topmost application if the source application is a desk accessory (TWRITE3) If a desk accessory is already open and its entry is chosen from the Desk menu, an AC_OPEN message is now sent. Popup menu entries do not need to be sorted from top to bottom. (SAMCNFG) Topping a dialog in a window when the mouse is over the dialog's edit cursor now redraws correctly. Fixed objc_edit() to work properly when it processes a key contained in the editable field's template which appears after the cursor and after the last editable character. The Clr and ^Clr keyboard equivalents now work in menu entries. shel_write() now returns the application ID of the new task, if the new task is multitasking. When shel_envrn() fails it returns 0L, not a pointer to an empty string. Programs which use the exec_os vector and follow the XBRA protocol can now be worked around correctly by Geneva. (CyRel's VDI drivers) RSC files containing CICONs can now use a pointer to another string instead of only the text in the CICONBLK. Using wind_get( WF_CURRXYWH ) on a closed window now returns all 0's (CONVECT) Pressing a key in windowed dialog that does not contain an editable field will not sometimes crash. If an application quits, its parent now gets any AP_TERM messages and gets control of the menu bar when a child of the first program quits. (The first program's parent is now the parent of children of the program that terminated.) There are no longer sometimes spurious MU_BUTTON events for windows with a dialog objc_find() will work correctly with buttons which use Atari-style 3D. The case where the default path passed to shel_write() does not end with a \ is now handled correctly. (GEMINI) The shel_find() function will no longer return a path beginning with ".\" if the PATH variable begins with ".,". (GEMINI, TWDTP) When automatic keyboard equivalents are generated for an object tree with a large number of objects, they now get redrawn correctly when the dialog finishes. (TCACHE) A dialog object that is hidden can now be edited. (TCACHE) Clicking on a gadget in a window with the X_WTFL_CLICKS flag turned off no longer causes the gadget to become selected (TM's Window Colors) Clipboard path handling is more robust now. The x_scrp_get() function works much better, so all of the Geneva programs that deal with the clipboard should also read the existing clipboard path correctly now. When an application either changes its menu bar or turns it off, any associated tear-aways are closed. Changing a window menu title with menu_tnormal() should no longer update the title if the window is closed but not deleted. If you use SUBMENU.CPX and tell it to use a popup height that is taller than the desktop area, it will instead be limited to that size. If a DA registers its name in the Desk menu and it already has a name stored at the same location in memory, the Desk list is merely updated. A new entry in the Desk menu is not created. If a button is SELECTED, !SELECTABLE, EXIT && !TOUCHEXIT, it now acts like a touchexit button (VMG-4000). Using the Desk menu in keyboard mode works correctly when the menu is scrollable. Changed some code in TASKMAN and other programs which access fonts in order to avoid a bug in NVDI 3's handling of vqt_fontinfo() for system fonts. Quitting a program which intercepts trap #2 and then restores it will no longer result in Geneva trying to close a VDI workstation which is already closed. (This can cause an AES recursive message if you are using NVDI and try to quit something like PD.PRG or PROFILER.PRG.) The default value for the _IDT cookie in the USA now has the separator '/'. Previously, it was $0, which means the same thing. The item selector now rechecks the _IDT cookie every time it is reopened. This means that setting the date/time format in a CPX will now work. wind_set( handle, X_WF_DFLTDESK...) will always work. Previously, it would only work when "handle" was a valid window handle > 0. When two windows use the same menu bar, they both get updated properly when menus are used. (GNVA_MAC) The correct window handle is now always returned in word 7 of an X_MN_SELECTED message. wind_get(WF_TOP) now always returns the correct value in the third word (the handle of the window underneath the topmost). The About Geneva dialog looks correct when the outer box is not white. When a window is iconified, the initial position of the icon window is now calculated correctly. The way appl_tplay and appl_trecord work has changed so that they work better. The new functions x_appl_trecord/play have been added. The messages for iconification now work properly if the Limit Window Handles option is on. Geneva now maintains several of the system vectors on a per-process basis. This means that if a program like Calamus, which has its own bomb trap, is running and another program crashes, this will not confuse Calamus into thinking that Calamus crashed. This also helps in the case of any program written with the High Speed Pascal compiler. An MU_MESAG event now returns the correct shift key state (STFAX) Fixed up a few places that did not consider the INDIRECT ob_flag. If a program increases the size of the keyboard buffer, Geneva will no longer eventually crash. Programming Changes ------------------- The file new_aes.h now defines the constant SMALLER correctly, and Geneva 004 understands this value. x_appl_sleep() in the manual is wrong: bit 1, if set, means the application is multitasking. When it is clear, the application is single-tasking. Page 114 of the manual has an error. The X_WM_SELECTED message looks like this: word 0: 0xE100 word 3: The handle of the window containing the gadget word 4: The object index of the window tree object the user clicked on Object Trees ------------ ob_state attributes: Bit 11 X_SHADOWTEXT Draw the object's text with a shadow Extended editing: If an editable field's TEDINFO te_tmplen is X_LONGEDIT (-71), then this means that it and the following editable field (which must be the next object in the tree) can use extended editing. When the edit cursor is at the end of a line, pressing another key will cause the cursor to automatically jump to the start of the next line. Other keys like the arrows, Delete, and Backspace work in a similar way, but only if a given line of text stretches the entire width of the editable field. A line can be broken at any point by pressing Control-Return. The last editable field in the list must NOT have the X_LONGEDIT set. The G_COOKIE structure ---------------------- vectors: Points to a G_VECTORS structure The G_VECTORS structure ----------------------- used: A bitmap of which vectors in the rest of the structure are used by this version of Geneva. Currently this is 7, to indicate that the first 3 vectors are used. keypress: This function is called whenever Geneva receives a key from the keyboard. The A0 register points to a longword containing the keycode of the key which was pressed: bits 31-24 23-16 15-8 7-0 shift scan code unused ASCII This is just like the result of Bconin(2) with the result of Kbshift(-1) stored in the high byte. If the "keypress" function changes this longword to 0L, then the keypress will be ignored. If the longword is changed to some other value, then the new value will be processed. If the "keypress" function returns a value >= 0, then the application with that ID will receive a X_WM_VECKEY message during its next event loop. app_switch: This function is called whenever the user performs some action that causes the topmost application to change, like selecting a name from the Desk menu or topping another application's window. When called, the A0 register points to a string in appl_find() format which is the name of the process that was switched to. The D0 register contains the application ID of the process. Under some circumstances, this function may be called even though the "new" application is already the topmost one. It is also possible for the "apid" in D0 to be -1, if Geneva is in the process of shutting down. If the "app_switch" function returns a value >= 0, then the application with that ID will receive a X_WM_VECSW message during its next event loop. gen_event: This function is called continually by Geneva. It provides a way for an application to have Geneva poll a certain condition and generate an event if something occurs. This can take the place of using evnt_multi() with small timer values in order to poll a condition, and is much more efficient. It can be used in things like a corner clock to see when the time has changed to a new minute. If the "gen_event" function returns a value >= 0, then the application with that ID will receive a X_WM_VECEVNT message during its next event loop. Notes about using vectors: o A vector routine can change registers D0-D2/A0-A1. All others must be preserved. o No vector routine can call the AES. The keypress and app_switch vectors must not call GEMDOS functions. All other TOS services can be used. o If a vector does not wish to generate an event, then it must return a negative number, like -1. o A vector MUST follow the XBRA protocol. The only exception to this is Geneva itself, which installs default vectors that do nothing but return -1. o An application is responsible for removing itself from the vector chain when it terminates. Failure to do so will most likely cause a crash in the future. An application should use shel_write() mode 9 to tell Geneva that it knows about the AP_TERM message and respond to that message by removing itself from the list before quitting. o If your vector routine does not wish to generate an event, then it should pass control through to the previous routine in the XBRA chain. o If Geneva is running without MiNT, then the vector routines are always called in supervisor mode. If running with MiNT, then the CPU is in user mode. When MiNT is in memory protection mode, an application which uses vectors must at least be in Readable mode, and should most likely in Global mode. See the files VECTEST.C and VECTESTS.S for an example. The OB_PREFER structure ----------------------- atari_3D: Display the object using Atari AES 4 style 3D shadow_text: Draw the text with a shadow underneath it bold_shadow: Text is bold (can be combined with shadow_text) The SETTINGS structure ---------------------- flags: no_alt_modal_equiv: Kbd equivs in modal dialogs do not require Alt no_alt_modeless_eq: Kbd equivs in windowed dialogs do not require Alt preserve_palette: Set color palette when switching applications mouse_on_off: Maintain mouse on/off calls when switching apps cycle_in_app: Kbd equiv for cycling windows belonging to current app iconify: Iconify the current window alliconify: Iconify all windows belonging to the app The APFLG structure ------------------- optim_redraws: Optimize window redraws shel_write() ------------ New "sw_doex" modes: XSHW_RUNANY (0xE0): run an application, letting Geneva determine the type. This is identical to mode 0, except that the XSHD_FLAGS bit of "sw_doex" can also be set (see below). XSHW_RUNAPP (0xE1): run an application. This is identical to mode 1, except that the XSHD_FLAGS bit of "sw_doex" can also be set. XSHW_RUNACC (0xE3): run a desk accessory. This is identical to mode 3, except that the XSHD_FLAGS bit of "sw_doex" can also be set. When XSHD_FLAGS (1<<15) is added to the "sw_doex", this means that the last longword of the SHWRCMD passed in the "sw_cmd" parameter contains the Geneva program flags to use when executing the application. It is strongly recommended that a program using XSHD_FLAGS inquire the current flags for the application and only change the ones it needs to change, rather than making most of the flags zero or some other random value. See the x_appl_flags() section, below, for an example. wind_get(), wind_set() mode X_WF_DCOLSTAT (0x2100) -------------------------------------------------- This mode gets or sets a window gadget's default colors and ob_state value. Unlike WF_DCOLOR, this option gives full control over all of Geneva's extended window gadgets. For wind_set(), the "wi_sw1" parameter contains the index of the window gadget to change, taken from the list of WGCLOSE through WGSIZE, as outlined in xwind.h. "wi_sw2" contains the color for the gadget when the window is on top, "wi_sw3" is for an untopped window. "wi_sw4" contains the ob_state word of the object. If any of these values is set to -1, then no change occurs. For wind_get(), the "wi_sw1" parameter must be a pointer to a word containing the index of the gadget being inquired about, the same way WF_COLOR and WFDCOLOR work. Example: Turn the 3D attribute on for the mover bar int top, untop, state, gadget; gadget = WGMOVE; wind_get( 0, X_WF_DCOLSTAT, &gadget, &top, &untop, &state ); state |= X_MAGIC|X_DRAW3D; wind_set( 0, X_WF_DCOLSTAT, gadget, -1, -1, state ); wind_get(), wind_set() mode X_WF_DIALFLGS (0xE100) -------------------------------------------------- X_WD_KEYS (bit 2): When set, any keypresses that would otherwise be processed as part of the dialog are instead passed through to the application. An example is when NeoDesk is run with the desktop in a window. Normally, things like Shift-C would be treated like a keypress in a dialog without any editable field and ignored. When this bit is set, the keypress will instead go to the application. x_appl_flags() mode 5 (X_APF_SEARCH) ------------------------------------ Use the APPFLAGS "name" element to search for the set of flags that would be used by Geneva were it to run the application with that name. Note that the "name" element is overwritten in the process. The "index" parameter is not used. Example: Get the flags for FOO.PRG and force it to run in single-tasking mode APPFLAGS a; SHWRCMD shwrcmd; strcpy( a.name, "FOO.PRG" ); x_appl_flags( X_APF_SEARCH, 0, &a ); a.flags.s.multitask = 0; shwrcmd.name = "FOO.PRG"; shwrcmd.app_flags = a.flags.l; shel_write( XSHD_FLAGS|XSHW_RUNANY, 0, 0, (char *)&shwrcmd, "" ); void x_malloc( void **addr, long size ) --------------------------------------- Allocate memory from Geneva. control[0] = $7186 control[1] = 2 control[2] = 0 control[3] = 1 control[4] = 0 intin[0-1] = size intin[0]: MSW of the size intin[1]: LSW of the size (lower 16 bits) addrin[0] = addr pointer to a pointer which receives the address of an allocated block, or 0L This function allocates memory, much in the same way Malloc() or malloc() does. The only major difference is that it comes without the extra overhead of malloc(). Since Geneva takes this memory from the same pool as the rest of its memory, it is also not as likely to cause memory fragmentation if the application allocates lots of small blocks using this call as it is when doing so with Malloc(). If no memory could be allocated, the "addr" is set to NULL (0L). Unlike the GEMDOS Malloc() function, this function does not accept the "size" -1L. xmf_return = x_mfree( void *addr ) ---------------------------------- Free memory allocated with x_malloc(). control[0] = $7187 control[1] = 0 control[2] = 1 control[3] = 1 control[4] = 0 addrin[0] = addr pointer to a memory block previously allocated with x_malloc() intout[0] = xmf_return 0: Success other: Failure This function frees a block of memory previously allocated with the x_malloc() function. xms_return = x_mshrink( void *addr, long newsize ) -------------------------------------------------- Shrink a memory block allocated with x_malloc(). control[0] = $7188 control[1] = 2 control[2] = 1 control[3] = 1 control[4] = 0 intin[0-1] = newsize intin[0]: MSW of the size intin[1]: LSW of the size (lower 16 bits) addrin[0] = addr pointer to a memory block previously allocated with x_malloc() intout[0] = xms_return 0: Success other: Failure This function shrinks (decreases the size of) a block of memory previously allocated with the x_malloc() function. The "newsize" must be less than the original size, or Failure will be returned. xmr_return = x_realloc( void **addr, long newsize ) --------------------------------------------------- Change the size of memory allocated with x_malloc(), potentially moving it to another location. control[0] = $7189 control[1] = 2 control[2] = 1 control[3] = 1 control[4] = 0 intin[0-1] = newsize intin[0]: MSW of the size intin[1]: LSW of the size (lower 16 bits) addrin[0] = addr pointer to a memory block previously allocated with x_malloc() intout[0] = xmr_return 0: Success other: Failure This function changes the size of a block of memory previously allocated with the x_malloc() function. If "newsize" is greater than the block's original size, it may be necessary for Geneva to move the block to a new location. If there is insufficient free memory to increase the size of the block, the "old" block continues to reside where it was and an error code is returned. xsg_return = x_scrp_get( char *path, int delete ) ------------------------------------------------ Obtain the correct path of a clipboard (SCRAP) file. control[0] = $7160 control[1] = 1 control[2] = 1 control[3] = 1 control[4] = 0 intin[0] = delete If set, remove all files in the clipboard that match "SCRAP.*". intout[0] = xsg_return 0: Failure 1: Success addrin[0] = path Pointer to a string which will receive the complete path of the clipboard folder, with a \ at the end. This function does the chore of determining where the clipboard directory is and, optionally, removing any SCRAP files that are already there. If the clipboard directory is either unset or points to a bad location, then "path" will be set to either C:\CLIPBRD\ or, if there is no C: drive, A:\CLIPBRD\. If no CLIPBRD folder exists, then it is created by the function. Example: int fhand; char path[120], text[]="Hi there!"; if( x_scrp_get( path, 1 ) ) { strcat( path, "SCRAP.TXT" ); if( (fhand = Fcreate( path, 0 )) > 0 ) { Fwrite( fhand, sizeof(text), text ); Fclose(fhand); } } void x_graf_rast2rez( unsigned int *src_data, long plane_len, int old_planes, MFDB *mfdb, int devspef ); ------------------------------------------------------------- Convert a bit image (raster form) so that it can be properly displayed with the VDI function vro_cpyfm() at the current screen resolution. control[0] = $7132 control[1] = 4 control[2] = 0 control[3] = 2 control[4] = 0 intin[0-1] = plane_len Size of one bitplane of data, in the dest. image, in bytes intin[2] = old_planes Number of bitplanes in the source data intin[3] = devspef If non-zero, the dest. image is in device- specific format. Otherwise, it is in VDI format. addrin[0] = src_data Pointer to the location of the source image's data. addrin[1] = mfdb Pointer to the MFDB describing the dest. image. All values must be correct, including the fd_addr. This function will convert an image (in either VDI or device-specific format) to a format which can be displayed in the current video mode. This includes things like transforming a color image of fewer bitplanes than the current video mode into an image that can be displayed using vro_cpyfm(). If the source is a monochrome image, it is much faster to simply use vrt_cpyfm() to display it and avoid x_graf_rast2rez() completely. All values in "mfdb" describe the destination image, except for fd_stand, which describes the source image. Example: Take the image described by "source", convert it to the current video mode, and display it. MFDB source, /* assume this is already filled-in */ dest, screen; long dest_size; dest = source; /* most values are the same to start */ dest.fd_nplanes = current_video_planes; dest_size = (long)dest.fd_nplanes * dest.fd_wdwidth*2 * dest.fd_h; dest.fd_addr = Malloc(dest_size); x_graf_rast2rez( source.fd_addr, (long)source.fd_wdwidth*2 * source.fd_h, source.fd_nplanes, &dest, 1 ); screen.fd_addr = 0L; vro_cpyfm( vdi_handle, MD_REPLACE, array, &dest, &screen );