==================================================================== (C) 1990 by Atari Corporation, GEnie, and the Atari RoundTables. May be reprinted only with this notice intact. The Atari RoundTables on GEnie are the *official* information services of the Atari Corporation. To sign up for GEnie service, call (with modem in HALF DUPLEX) 800-638-8369. Upon connection, type HHH Wait for the U#= prompt. Type XJM11877,GENIE and hit RETURN. The system will now prompt you for your information. ==================================================================== ************ Topic 12 Wed Aug 27, 1986 S.FERNANDEZ at 21:58 EDT Sub: Questions about GEM This topic will serve to answer questions about GEM be it in programming or ussage. 193 message(s) total. ************ ------------ Category 3, Topic 12 Message 1 Fri May 26, 1989 B.DENHEYER1 [brian d] at 19:24 EDT I have a question about the use of the user-defined GEM objects. I have created a tree with user defined objects that incorporates my own objects which VDI draws for me. What I would like to know is what exactly happens with the parameter which is suppoedly passed to the routine ? In the MWC bindings it is ub_parm. I can't seem to get a hold of it, and it would be very useful for me if the custom routine could be passed a parameter. Any help or information on this subject will be greatly appreciated ! Brian Denheyer ------------ Category 3, Topic 12 Message 2 Fri May 26, 1989 C.DAYMON at 19:41 EDT Brian, I have created a few custom objects myself and there is information passed to the routine. I think it is a pointer to a 'parameter' block. The best source of info I found on these routines was in Tim Oren's "Professional GEM" series which you can find in the library. I think it consists of about 3 good sized archives, but is well worth the download. If I get a chance to look up the routines, I'll post the info. -Craig W. Daymon ------------ Category 3, Topic 12 Message 3 Fri May 26, 1989 A.HAMILTON1 [Alan H.] at 23:17 MDT When a user-defined object routine is called, it's passed a PARMBLK pointer. PARMBLK, defined in object.h, contains as one of its members pb_parm. When the routine is called, ub_parm is copied into it. / / * / Alan * * ------------ Category 3, Topic 12 Message 4 Fri Jun 02, 1989 B.DENHEYER1 [brian d] at 00:44 EDT Thanks you both for the information. I will indeed download the Professional GEM series as soon ass I find it. This place is great ! My questions always get answered ! Now if I could answer questions for someone else. Thanks again, I'm off to GEM land. Brian Denheyer ------------ Category 3, Topic 12 Message 5 Mon Jun 19, 1989 T.HALLIWELL at 23:21 PDT Help please!! I have just formatted my sh204 into 4 5meg partitions and installed timeworks word processor on one of the partitions. I am being told that I have run out of GEM windows to open. Does anyone have a clue as to what is going on. I have been using the hard disk for two years with other word processors and no problem. Thanks for any help. Terry. ------------ Category 3, Topic 12 Message 6 Tue Jun 20, 1989 STACE [Mark] at 02:32 EDT T.Halliwell, GEM only support a max of four (4) open windows at any given time. Before you load Word Writer, try closing some of the unused windows at the desktop. Mark ------------ Category 3, Topic 12 Message 7 Tue Jun 20, 1989 DANSCOTT [Atari Corp.] at 18:26 EDT No, GEM supports up to 8 (eight!) windows at a time, but the desktop can only handle 4 open at a time. This is due to the fact that the desktop must count on an ACC program opening a window of its own if the user calls on it. I don't know how many windows timeworks wants to open, but it must be more than one. Try closing any ACC that may be active (they should be good little ACC's and close themselves upon getting the message from the AES to do so, but....) or that 4th desktop window if you have it open. Dan ------------ Category 3, Topic 12 Message 8 Tue Jun 20, 1989 C.F.JOHNSON at 17:56 PDT Dan, Actually, accessories have very little choice in the matter. When someone runs a program, any open accessories have their windows closed _for them_ by the system. The AC_CLOSE message is saying "Hey, you. I just closed your window." NOT "Hey, would you please close your window?" The problem must be caused by something else, Terry. Sorry, I don't have any helpful suggestions...except to try the obvious, and boot without ANY AUTO folder programs and accessories and see if the same thing continues to happen. - Charles ------------ Category 3, Topic 12 Message 9 Tue Jun 20, 1989 TIMPURVES at 23:29 EDT It really pisses me off that GEM shuts down the ACC's just because I deside to load an application. Would be much nicer is it only shut them down on a TOS/TTP launch. In fact i wrote a "shell" that did just that.. The problem was that a lot of well know apps _assumed_ that the first window they opened was WINDOW ZERO!!!! Talk about morons! ------------ Category 3, Topic 12 Message 10 Thu Jun 22, 1989 TOWNS at 02:17 EDT Yep.. exactly. They are counting on things that might not be true. Also, when you do an appl_exit() call from an application it also sends the AC_CLOSE message to any open desk accessories. -- John ------------ Category 3, Topic 12 Message 11 Fri Jun 23, 1989 JLS [John STanley] at 02:11 CDT Charles, my understanding is that the windows are closed when you return to the desktop, not when a program is run. This means that running from a shell, if your accessory doesn't close its own windows you may run out of window handles. The accessory should close and free -everything- it has requested use of (files, windows, & memory) when it receives an AC_CLOSE message. The fact that many don't and manage to avoid screwing up is only because the desktop is doing illegal things to insure the resources get taken care of. Mind you, I'm not an accessory expert, this is just the impression I've gotten from all the problems I've had to deal with in writing command shells that allow using accessories. If Allan, Ken, or John Townsend are around, I'd appreceate any clarification on this that they can provide. John STanley ------------ Category 3, Topic 12 Message 12 Sat Jun 24, 1989 T.HALLIWELL at 17:55 PDT Thanks everybody for the suggestions and comments on my problem about the windows. I finally figured it out. I had made some adjustments in my desktop.inf and I left an @ at the beginning of my W and not at the end. I had a devil of a time as I couldn't get into my hard disk to get at my desktop.inf on my hard disk. I finally ran ahdi outside of the auto folder, and was able to access my hard disk without using the desktop.inf on my hard disk. I hope this is clear... or rather I hope one of you understands what I just said, in case someone else has a similar problem. Thanks again for the assistance and support. Terry. ------------ Category 3, Topic 12 Message 13 Mon Jun 26, 1989 S.JOHNS at 07:37 EDT Why would it be necessary for accessories to relinquish their memory on an AC_CLOSE? I thought that the whole point was for accessories to reserve all the memory they would ever need at initialization, and then never to ask for more. If you punted your memory on receipt of an AC_CLOSE then you would have to ask for it back again, or else be dead for good. I've got accessories that will all run with their own window on the screen simultaneously (top window active) and then all shut down gracefully and then revive later when a .PRG comes along to "clean house". The accessories all hold on to their memory and everything seems to work fine. Comments? ------------ Category 3, Topic 12 Message 14 Mon Jun 26, 1989 JLS [John STanley] at 22:37 CDT S.JOHNS, sorry if I was unclear. The comments I made about how ACCs should always free all resources allocated to them when they receive the AC_CLOSE message applies only to resources that are requested when the acc is called via the menubar. The specific thing that triggered my comment was someone talking about how they thought they shoudn't free their window handles when shutting down (which is wrong and causes many problems...). when those accessories are run from a shell program (that can't pull the illegal tricks to clean up that the desktop can...) ------------ Category 3, Topic 12 Message 15 Thu Jun 29, 1989 S.JOHNS at 07:17 EDT Do you mean, in other words, that if an accessory grabs memory at the time of its menubar invokation (which is what I understand it really shouldn't do) THEN it should free that memory on AC_CLOSE? If so, I agree. But, I've been told that to ask for memory at any time after initialization is asking for trouble. Others must know more about this than I do, but I avoid it on a tip and seem to have no problems. ------------ Category 3, Topic 12 Message 16 Thu Jun 29, 1989 C.F.JOHNSON at 08:30 PDT S.Johns, An accessory can safely grab memory at its startup time. And there is a technique that allows an accessory to allocate memory at other times too; although this technique will occasionally result in unavoidable memory fragmentation. The problem with accessories and Malloc is due to the fact that the system keeps a pointer to the basepage of the current application. Whenever a Malloc call comes through, the system assigns that allocated memory to the basepage of the current app. If an accessory does this while the GEM desktop is the current app, there won't be a problem because it's not possible to exit from the desktop. But when another application terminates, the system methodically frees up all allocated blocks assigned to its basepage. And since, when you open an accessory, the basepage pointer does NOT point to the acc's basepage, that means that any memory allocated while the accessory was active gets assigned to the current app, not to the acc. Hence, it gets freed along with everything else when the application terminates. The simple solution is to change the basepage pointer to point to the accessory's basepage when it needs to allocate memory, and replace the pointer after Malloc'ing. The Mega ROMs and TOS 1.4 now have a legal way to find this pointer...it's in the OS header at the beginning of ROM. For TOS 1.0, you'd have to use a hard address (which is OK, since it won't change). - Charles ------------ Category 3, Topic 12 Message 17 Fri Jun 30, 1989 JLS [John STanley] at 02:06 CDT S.JOHNS> Yes, that's exactly what I mean.... ------------ Category 3, Topic 12 Message 18 Sun Jul 30, 1989 J.H.CARROLL at 13:20 EDT Here's a short question : I just downloaded "PACKER" from the libraries... What is this program doing so that it can reduce the size of an executable program file by 50% ? Jon ------------ Category 3, Topic 12 Message 19 Tue Aug 01, 1989 W.V.FISHER at 20:33 CDT Jon - That is the question I wanted to ask! What is being compressed? ------------ Category 3, Topic 12 Message 20 Tue Aug 08, 1989 N.DAVIS1 at 20:50 EDT I have include raster images in forms by using a user-defined object which just calls some code, does a vroom-copy, and no problem. Why doesn't this work with a new desktop form? thanks, Neil ------------ Category 3, Topic 12 Message 21 Tue Aug 08, 1989 GRIBNIF at 21:32 EDT What happens when it doesn't work? Does it crash or just not do anything? If the latter is the case, then I might check the clipping rectangle to see that it is being set correctly. I had noticed that making an AES call during the drawing of the desktop user-defined object definitely causes a crash (because you are effectively calling the AES from within an AES call, which is a no-no) but doing a VDI call to blit something should work. If not, then you'll have to go to Line A. Dan ------------ Category 3, Topic 12 Message 22 Fri Aug 18, 1989 JLS [John STanley] at 05:25 CDT BTW, I still haven't seen an "official" response relating to my comments/questions in message #11. Do the folks at Atari read this topic? On an entirely different subject: I'm writing code to display a desktop- style screen just before invoking a GEM program via a Pexec call. I've got the code working to fill all but the top of the screen with the background color/gray. What I'm looking for is a code snippit that will draw the "blank menubar with filename in it" at the top of the screen. I'm trying to avoid having to use a resource with this so I want to avoid directly using anything that requires a resource. Suggestions anyone? ------------ Category 3, Topic 12 Message 23 Fri Aug 18, 1989 DARLAH [RT~SYSOP] at 08:16 EDT I will make John aware of this topic if he does not. ------------ Category 3, Topic 12 Message 24 Fri Aug 18, 1989 TOWNS at 15:41 EDT I am not sure on this. but here is what I believe to be true: 1. The desktop will internally close any windows and send AC_CLOSE messages to ANY open desk accessories. It's the responsibility of the desk accessory to respond to the AC_CLOSE message. Please note: The desktop doesn't actually show you closing the windows on the desktop, it does it internally. This means that you will never see the desktop physically close windows. 2. On an appl_exit() call.. The AES will close ANY open windows and send AC_CLOSE messages to any open desk accessories. Please note: It's bad programming practice to rely on the AES to close your windows for you. You should close them yourself before calling an appl_exit() at the end of your program. As for the other questions regarding the freeing on malloced memory for desk accessories and AC_CLOSE, I will get back to you.. -- John ------------ Category 3, Topic 12 Message 25 Mon Aug 21, 1989 C.F.JOHNSON at 10:56 PDT John, What about the problems with desk accessories that take over system vectors, when you change resolutions from the desktop? I really wish something had been done about this in TOS 1.4... it's a glaring shortcoming. (For anyone who doesn't know what I'm referring to....the desktop frees up all the desk accessories on a res change, but _doesn't_ tell them about it! So if any accessory has installed itself in interrupts or trap vectors, it will almost certainly cause a crash on a res change. The only solution [which I used in MultiDesk] is to use a complicated, kludgy, undocumented [although not strictly 'illegal'] method. I would dearly love for Atari to either have the desktop replace all interrupt and trap vectors on a res change, or failing that, to at _least_ document a method by which accessories can take care of the problem themselves.) - Charles ------------ Category 3, Topic 12 Message 26 Mon Aug 21, 1989 GRIBNIF at 20:19 EDT If the desktop were to replace all the trap vectors on a resolution change, then it would also have to reload everything from the AUTO folder (since this is more often the source of trap interception). Of course, some AUTO folder programs depend on GEM not being present at all, since it normally isn't when they are run. So, if you could basically force the rez change, punt the AES, reload the AUTO folder, and then re-initialize GEM in the correct rez (ignoring the one in DESKTOP.INF, of course) then all would be well. Have fun, Ken! Dan ------------ Category 3, Topic 12 Message 27 Mon Aug 21, 1989 C.F.JOHNSON at 19:00 PDT But by the time the desktop application is up and running, the AUTO folder programs have already been installed. It wouldn't be necessary to reload the AUTO stuff at all; all the desktop would need to do would be to take a 'snapshot' of the vectors at the time it runs, and replace them on a res change. The AUTO programs could remain in memory without any problems, since the desktop would be restoring the vectors to the state they were in _after_ the AUTO folder. - Charles ------------ Category 3, Topic 12 Message 28 Wed Aug 23, 1989 JLS [John STanley] at 01:18 CDT I just wish the accessories would be told about a rez change via the normal GEM message method. A well written accessory shoudln't have any trouble "adapting" to a new resolution if there was a standard for it. Reloading the accessorys is a kludge that shouldn't ever have been retained past TOS 1.0. Having to "semi-reboot" just to change resolutions is a throw-back to the 8- bit style game programs where you had to reboot the machine to exit some programs. This is something that has no place in a "professional" computer system. John Stanley ------------ Category 3, Topic 12 Message 29 Wed Aug 23, 1989 C.F.JOHNSON at 09:36 PDT I agree 100%, John. The problem with desk accessories and changing resolutions is a tremendous hassle. Personally, I don't care _what_ method Atari uses to solve it, as long as they do something. Document a method that accs can use, at the very least - it's too late to fix the problem in TOS 1.4, but I would think that, with the source code for TOS in hand, it wouldn't be too difficult to say to developers, "OK, do this, this, and this, and you'll survive a res change." Come on, Atari....talk to us. - Charles ------------ Category 3, Topic 12 Message 30 Wed Aug 23, 1989 TOWNS at 15:12 EDT HAve you guys thought about talking to someone from Atari about this? This area is not read by most of the Atari people and I can't do anything about this problem. Try contacting ATARIDEV (J. Patton) or K.BAD. ------------ Category 3, Topic 12 Message 31 Thu Aug 24, 1989 GRIBNIF at 00:31 EDT Actually, John, I don't know about a message being passed as the best method. Some desk accessories use different resource files for different resolutions and a desk accessory would either have to live with having the wrong one in memory or, if GEM cleared it out on the rez change (which, in itself, would probably create memory fragmentation because all the DA's are left in memory when the RSC's aren't) it would always have to reload the RSC, even if there wasn't a different one for the new resolution. Dan ------------ Category 3, Topic 12 Message 32 Thu Aug 24, 1989 TOWNS at 17:21 EDT A quick question.. why does it make a different if desk accessories and reloaded on a resolution change? ------------ Category 3, Topic 12 Message 33 Thu Aug 24, 1989 C.F.JOHNSON at 20:42 PDT John, It doesn't really make a difference if accessories are reloaded on a res change...._unless_ one of the accessories has grabbed any interrupt or trap vectors. On a res change, the accessories are freed, but they are not told about it. Consequently, when memory is cleared (when the first acc loads after the res change) these nice interrupt vectors are suddenly pointing at lovely zeroes, and the result is a system crash. In my opinion, the best way for the system to handle this would be to take a 'snapshot' of all pertinent vectors when the desktop first runs, and then replace this snapshot before freeing the accessories and performing the res change. A new "message" for accessories would not really solve the problem, unless it was guaranteed that the accs would get this message in the exact reverse order that they grabbed their vectors....which is impossible with the current ST event management system. - Charles ------------ Category 3, Topic 12 Message 34 Fri Aug 25, 1989 K.BAD [S/W Engine] at 04:21 EDT Okay, John Townsend has heard me say this before again and again, I guess it's time for me to say it here. Now, everybody repeat after me: A DESK ACCESSORY IS NOT A PROCESS. A DESK ACCESSORY IS NOT A PROCESS. A DESK ACCESSORY IS NOT A PROCESS. There, now that I've got that off my chest, let me get on with the topic at hand. Because, as we all know, a desk accessory is not a process, it does not have all the facilities available to it that processes do. Notably, it can not expect to keep files open and survive, and it can not Malloc memory from the system and expect that memory to always be available to it, and it should not intercept vectors that will cause problems later! I really hesitate to say all this, because the folks involved in this discussion here have "stretched" the definition of a desk accessory way beyond the original intent. A desk accessory should be, hmm... maybe Webster can help me on this one: ac-ces-so-ry n, a: a thing of secondary or subordinate importance : ADJUNCT b: an object or device not essential in itself but adding to the beauty, convenience, or effectiveness of something else What you seem to want is for desk accessories to be processes in their own right, and that just ain't the case. The solution, although it may seem inconvenient for users, is to team accessories with terminate and stay resident utilities so that you get the best of both worlds. The accessory becomes the front end of the utility that hangs out in memory, cleanly survives resolution changes, etc. The accessory adds to the beauty and convenience of the TSR. And anyone who complains about the AES effectively having to reboot on a resolution change is welcome to write a new AES that does not require that. Or you can send your resume to 1196 Borregas to the attention of Leonard Tramiel, with a note explaining that you would like to take over AES revision from Ken Badertscher. I would like nothing more ;-) TRUST ME when I say that it is NOT as easy as it sounds... ttfn... (*ken @ atari*) ------------ Category 3, Topic 12 Message 35 Fri Aug 25, 1989 K.BAD [S/W Engine] at 04:27 EDT One other thing... John is right - I don't get up here very often and when I do, it's "recreation time" ;-) My job is mostly concerned with system software development, not support, it's just that I'm a masochist and like to get online and take punishment. If you have serious problems or concerns, please raise them with the developer support folks at Atari, and/or leave a message in the ATARIDEV conference here on GEnie, that's what it's here for. Thanks for your consideration... (*ken @ atari*) ------------ Category 3, Topic 12 Message 36 Fri Aug 25, 1989 JLS [John STanley] at 06:19 CDT Ken, I know what you're saying, but your last msg could -easily- be read as "pay Atari for developer access to GEnie or leave me alone..."... Users of the ST/MEGA and non-"Atari developer" programmers shouldn't have their comments and concerns ignored just because they don't put their comments in the "right place" which people have to pay a significant ammount of money to access... ------------ Category 3, Topic 12 Message 37 Fri Aug 25, 1989 DARLAH [RT~SYSOP] at 08:49 EDT I have to admit, I have enjoyed the conversation in this area. I would hate to limit those that did not pay their $$. Those that have can get priviliged info but what is going on here should not be in that classification. <------ Just my 2 cents but I feel strongly on this one. Anyone ever noticed how much Category 3 has grown?? ------------ Category 3, Topic 12 Message 38 Fri Aug 25, 1989 D.FLORY [ALERT-syscop] at 15:02 EDT John, and anyone, if you want to get info to the people on the Developer area just send E-mail to TOWNS, ATARIDEV or K.BAD. John is the SYSOP there, ATARIDEV is J.Patton of developer support and we all know who the harried K.BAD is. ------------ Category 3, Topic 12 Message 39 Fri Aug 25, 1989 DARLAH [RT~SYSOP] at 18:47 EDT You can also leave message in the developers area if you are a registered developer. ------------ Category 3, Topic 12 Message 40 Fri Aug 25, 1989 C.F.JOHNSON at 16:34 PDT Ken, If you can tell me the page number in the Developer's Kit documentation where it says that desk accessories should not intercept vectors, I'd be very surprised. I've read all of that stuff from cover to cover, and I honestly don't remember seeing anything like that. Yes, I know about the problems with file handles and with Mallocs from accessories, but interrupt vectors? This is news to me. Frankly, something like MultiDesk would be _extremely_ difficult to implement with a TSR program/desk accessory combination. But if there were some official word from Atari saying, "This is the way it should be done" when I started working on it, that's what I would have done. (Probably.) It seems to me that it's a little late to be trying to put this particular cat back in the bag, when some of the most popular utilities for the ST are in the form of desk accessories that take over interrupt vectors. The purpose of this whole discussion (at least _my_ purpose anyway) is to try to find a way that "pseudo-processes" like desk accessories can somehow legally survive a resolution change. Most professional developers have worked out some sort of scheme for doing this, but none of them are totally reliable. And the hackers and hobbyists are more in need of information like this than anyone. Most of the tech support calls we get relate to this or that public domain/shareware program that always ends up doing something really dumb; but you know, I can't blame people for trying some of this stuff when I realize that most of the time, they're operating in a complete vacuum, as far as hard info about handling interrupts and trap vectors goes. - Charles ------------ Category 3, Topic 12 Message 41 Sat Aug 26, 1989 K.BAD [S/W Engine] at 00:14 EDT John S. & Darlah: TANSTAAFL. (There Ain't No Such Thing As A Free Lunch.) I agree with you in spirit, though, that's why I log in here in the "free support" category and answer questions! I apologise if my response seemed a bit knee-jerky, but I've been getting quite a bit of flak lately (not all of it from here) for the fact that Atari doesn't provide support freely to all. For my part, though, I'll do my best to continue to ladel out the soup here in the soup kitchen of programming information. But the people that want an all- you-can-eat brunch are encouraged to dress up and head on out to the nicer dining establishments. But don't expect Duck L'Orange for a dime... Charles: You have struck to the heart of the problem. There ISN'T anywhere in the documentation that discusses what DA's should and should not do. There's precious little discussion of what DA's are in the first place! I am reminded, though, of the old joke: Patient: "Doc, it hurts when I do this!" Doctor: "Well, then don't do that!" In message #34 I didn't say that DA's shouldn't take vectors, I said that they shouldn't take vectors which would cause problems later. That's just common sense. But you're looking for a way for DA's to communicate more easily with TSR's... Here's an idea (completely off the top of my head, and I have NO idea how well it would work in implementation, but...): Make the DA a front end only. Have all the vector-grabbing "guts" of the application live in the TSR. When the DA is first loaded (or reloaded on a res change) have it communicate to the TSR that it's time to grab vectors again, or do whatever else is needed because the AES has yanked the floor out from under the DA. Implement some kind of message passing (via trap calls, shared memory, whatever) that enables the DA to transfer control to the TSR code at the appropriate times. Recently, we have come up with something called the "cookie jar" which should help a situation like this IMMENSELY. As soon as I have leave to do so, I'll post the cookie jar specification PUBLICLY so that everyone can see how it works. Basically it is a system-level supported means for TSR's to register their existence so that other programs can find, via a simple table look up, whether a particular extension or TSR service is available. It's simple, straightforward, and I wish someone had come up with it years ago, because it would have solved a LOT of compatibility problems that have cropped up in the TSR arena (for example, the Diablo emulator's less-than-ideal method for determining whether or not it was installed). Forgive the length of this message... I hope we can come up with some solid solutions, though! ttfn... (*ken @ atari*) ------------ Category 3, Topic 12 Message 42 Fri Aug 25, 1989 C.F.JOHNSON at 22:58 PDT "Cookie jar," eh? Now that's the kind of thing I've been talking about. I guess I'll have to wait for more details about it, but that sounds a damn sight better than what we had before, which is nada, nil, zilch, a free-for- all. (Actually, that should read "what we have now" above.) Thanks for the response; if I was starting to sound a little frustrated there, it's because I _have_ talked to various people at Atari about this res change problem several times over the course of the last three years, with no result. - Charles ------------ Category 3, Topic 12 Message 43 Sat Aug 26, 1989 DOUG.W at 07:09 EDT I'm currently using a scheme similar to what Ken suggests, and have an AUTO program which intercepts the vectors (in my case, TRAP #13 & #14), and an ACC which makes certain TRAP #13 or #14 calls which my interceptor picks up and handles as appropriate. The only thing you have to be careful of is that your "key" TRAPs are unique. I am using legal call with illegal (but specific) parameters, such as a buffer address of $100, which will obviously cause an error if the AUTO program hadn't been run, but which the AUTO program can easily recognize and deal with. --Doug ------------ Category 3, Topic 12 Message 44 Sat Aug 26, 1989 C.F.JOHNSON at 10:17 PDT Unfortunately, there are several aspects of MultiDesk's operation that make it _extremely_ difficult to code in this way. (As I said before...and being any more specific would reveal trade secrets.) It wouldn't be impossible, but at this point in it's development (we're at version 1.82), I'm not very open to the idea of a radical restructuring like that. The other point that should be made is that this TSR/ACC approach makes things exactly _twice_ as complicated as before for the user. (Not to mention how it complicates the programmer's job, maintaining and updating two separate programs.) Yes, it is an idea, and it's a way to circumvent the res change problems with accs .... but it's _far_ from ideal, in my opinion. - Charles ------------ Category 3, Topic 12 Message 45 Sun Aug 27, 1989 K.BAD [S/W Engine] at 03:50 EDT Charles, believe me, I know *exactly* what you mean when you talk about radical restructuring being a major pain. The way the AES is put together would make it incredibly difficult to pull off a res change without rebooting the AES. Res dependencies are not encapsulated in any way. They're scattered all over the code, and it would take a long time (development wise) to rat them all out. I agree, the TSR/DA approach is not ideal, but I've used it successfully in a couple of applications I wrote for my own use, so I know it can be done without too much difficulty (if you start with that approach in mind!). The problem with other methods that have been discussed here (having the AES send a unique message at res change time) is that they won't work in existing ST's, and we're trying to come up with a solution that will work now, n'est ce pas? I'm open to suggestinos... ttfn... (*ken @ atari*) ------------ Category 3, Topic 12 Message 46 Tue Aug 29, 1989 JLS [John STanley] at 20:02 CDT Ken, first off, thanks for the support you have been giving out soup-kitchen style. I'm a registered developer, but I firmly believe that Atari's best interests (and mine) are served when more programmers (developer and non) know more about "the right way" to do STuff. About the "Cookie Jar". I'll be looking forward to seeing more on this soon. One thing I've considered that this may be able to help with (if it's not cast in stone yet) is allowing TSR's to share info about who's resident, what resources (hotkeys, interrupt vectors and subfunctions) are being used to avoid or deal with possible conflicts. Is this out in left field, or will the CJ be able to help with this? Last, on the rez-change acc vector-intercept (RAVI?) problem. If, along with all the other vectors an accessory traps, it also traps the vector at $46e (swv_vec in "Internals"), the accessory will be able to momentarily gain control just before the reset takes place. When the system jumps thru this vector, the rez-change code in the accessory can replace the original vectors which will effectively un-install the accessory from that trap. As long as the original hooking of the vectors takes place with no gem calls interspersed, this should unstack the accessories in the same order they were installed in. When finished un-instaling, then the rez-change code just jumps thru the original swv_vec pointer to the next routine in the chain and finaly to the system reset vector... I came up with this idea when I first heard about accessories being installed on vectors, but I haven't done that much with accessories (TSR's are easier for me :^) and kept wondering why people didn't use this method to prevent accessories from crashing the system on a rez change if they install themselves on permanent vectors... I've yet to hear anyone mention this method and don't know why... This avoids the problems with the dual TSR/DA and the only possible problem is if the user loaded a TSR program from the desktop or a shell. If that happend, the accessory would have to unhook the late-loading TSR from the vector to avoid a crash and it would be up to the user to reload the TSR again after the rez-change... Anyone see any problems with this method? ------------ Category 3, Topic 12 Message 47 Tue Aug 29, 1989 C.F.JOHNSON at 18:19 PDT John, There's just one problem with using the vector at $46E to catch a resolution change from the desktop...it doesn't work. That's one of the first things I tried. (Always go with the documented stuff first...) If that vector _were_ actually used during a resolution change from the desktop, it would work just fine...but noooo. - Charles ------------ Category 3, Topic 12 Message 48 Tue Aug 29, 1989 JLS [John STanley] at 22:11 CDT Oh... I see now, thanks Charles. The $46e vector is only used on monitor-change, not on all resolution changes... ... Back to the drawing board. What method does the desktop use to trigger the reset for the resolution change? (If it's YAIDT (yet another illegal desktop-only trick) I'm probably going to scream...) ...? ;^) Ken, desktop internals question. I've got a hunch that the desktop punches the new res value into the word at $44a and then does some black magic to trigger the accessory+GEM special reset. Is there -any- system call between the point when the new value is placed there and when the psudo-reset takes place? Something that could be used to monitor for a new value? ------------ Category 3, Topic 12 Message 49 Wed Aug 30, 1989 GRIBNIF at 21:24 EDT John, Just because only the desktop can do it, it's not illegal . Dan ------------ Category 3, Topic 12 Message 50 Fri Sep 01, 1989 K.BAD at 01:38 EDT Why do you people keep insisting that the Desktop is not part of the system? Why, why, why??? I can understand you wishing that it wasn't (especially Gribnif ;-) but it just isn't the case! The desktop is an integral part of the AES, in all of the current TOS implementations. The resolution change that takes place when the user selects a different resolution from the Set Preferences dialog is yet another example proving this. The desktop shares a variable with the AES, telling the AES whether or not it's time to reboot the AES and change resolution. And no, Atari can't publish that address, because it is different in each and every TOS ROM version. I looked for a special routine which might be used to signal a res change to a desk accessory, but couldn't find one in a quick glance at the boot/reschange sequence. Here is an oversimplified pseudo-C version of the AES/desktop: aes_desktop() { for(;;) { initialize(); load_accessories(); if( first_boot && autoboot_app_exists ) shel_write( autoboot_app ); aes_shell(); free_accessories(); } } aes_shell() { do { if( something_shel_written ) run_program(); else desktop(); } while (!res_change); } Maybe, if you were hooking traps, you could hook trap 1 and look for an Mfree call with your basepage as the argument? I don't know. I much prefer the TSR/DA combo, since it's cleaner and more flexible. ttfn... (*ken @ atari*) ------------ Category 3, Topic 12 Message 51 Sun Sep 03, 1989 PSINC at 11:06 EDT I'll add my two cents worth. Being a primarily hardware developer, I'm unbiased. Ken is right, DA's shouldn't do anything that will "cause problems later". However, since Atari has done very little to tell us what's naughty and what's nice regarding DA's, I can't see how we are supposed to know what will "cause problems later". We don't have a real good guide book to go by (ala "Inside Macintosh' etc.). Therefore, I think that since it's Atari's responsibility to make the developers aware of what is correct and what isn't regarding programming, if Atari fails to do so they should do all they can to help the developers make the existing programs compatible (Charles idea) and not simply say "ah, you probably shouldn't have done that" after someone has coded a program for a year! Hmm, that was the my longest sentence ever! Mark ------------ Category 3, Topic 12 Message 52 Sun Sep 03, 1989 C.F.JOHNSON at 09:48 PDT Mark, Amen! That's my point exactly. All of a sudden, we're being told that DAs shouldn't do things (like steal vectors) that will "cause problems later". I've been a registered developer for _years_ and this is the first time I've heard this policy...if simple guidelines had been laid out in the developer's documentation a long time ago, the problems with desk accessories and res changes would not exist today. I sincerely doubt that any user is going to want to give up Turbo ST, or MultiDesk, or Thunder, or any of the myriad other DAs that take over interrupt/trap vectors. I know I wouldn't. And it's a bit much to expect the developers of these programs to go back and start from scratch again, with the TSR/ACC combination that Ken suggested. I have absolutely no plans to do this with MultiDesk -- I've got much more important things to do with my time. Ken, What about my idea of a "vector snapshot" TSR program that saves all the important stuff at exec_os time? I'd be happy to write a program like this, if I had a foolproof documented way to detect a resolution change. (I left a message to this effect before, but I think it got wiped out in the GEnie crash.) The "snapshot" approach is the only reliable way to solve this problem, as far as I can see. - Charles ------------ Category 3, Topic 12 Message 53 Mon Sep 04, 1989 K.BAD [s/w engine] at 04:50 EDT Detecting the resolution change is still the problem, Charles. Have you tried making the DA watch for an Mfree with its own basepage as the argument? As far as I know, the only time the DA's TPA should be freed is by the AES on a resolution change. If you see the Mfree call, unhook all your vectors, then let the Mfree fall through. Lemme know how that works... ttfn... (*ken*) ------------ Category 3, Topic 12 Message 54 Mon Sep 04, 1989 C.F.JOHNSON at 09:53 PDT Ken, I'll try that approach; sounds like it might be possible. Thanks for the suggestion. - Charles ------------ Category 3, Topic 12 Message 55 Tue Sep 05, 1989 PSINC at 10:43 EDT Yep Charles, since Atari didn't make any guidelines to start with I think they should help to solve the problem with the knowledge they have on the AES. I don't think making rules up midstream is the answer. To be honest, at first I thought ' I bet Apple wouldn't let Mac devs steal vectors in this way", but then I thought "wait a minute - they have stated what is correct, and what isn't, from the beginning.". All of us agree that we have to follow the rules. But we have to know what they are! Mark ------------ Category 3, Topic 12 Message 56 Thu Sep 07, 1989 JLS [John STanley] at 19:57 CDT Ken, first off, I haven't seen anyone say anything about not wanting the desktop to be part of the system. What I've seen time and time again, however, is that developers think that anything the system can do should be trappable (is that a word?) and useable thru an applications program. I see no reason that the desktop-style resolution change shouldn't have always been avalable as a legal system call. Nothing you've said has changed my opinion on that. (This is especialy true since you also keep insisting that shell programs, not gemdos are responsible for intercepting and processing shel_write calls. If something that inherent to the proper functioning of interlocked gem programs is a function that an independant shell has to process, then I see no reason to keep any aspect of the desktop from being included in a secondary shell-type program.) Re the ACC+TSR vs ACC question. I agree that the ACC+TSR is -technicaly- simpler. Unfortunately, using that method is more complex for the user. Any time you have more than one file necessary for a program to run correctly, you increase the probability of confusing and frustrating the user by the square of the number of files. Any time I can create a single program that (correctly) accomplishes what my competitor needs two to accomplish, I have an edge and the user will perceive my product as being easier to use. I agree with the others who've essentialy said "Atari should have produced and -freely- distributed guidelines for all these concerns over 5 years ago". Since they haven't, simply saying "you shouldn't have done that" without providing a "legal" alternate method is simply bad business for Atari and isn't playing fair with the developers. ------------ Category 3, Topic 12 Message 57 Fri Sep 08, 1989 SANDY.W at 10:30 EDT I have to agree about the increased confusion that would result from having to keep track of, and possibly modify, two different files. Especially for new users. Some people have enough problem just understand the basic desktop, seriously. The more possibilities you give the computer phobic, the more ways they will find to break things, and incrase the probability they will not try again. ------------ Category 3, Topic 12 Message 58 Tue Sep 26, 1989 J.IRVIN1 at 21:18 PDT I have noticed a problem with TOS 1.0 mouse button response (using evnt_multi()) after calling form_alert(). The response time is usually on the order of 1/100 sec.; after form_alert() it slows to 1/5 sec and can only be fixed by rebooting. TOS 1.4 doesn't have this problem. I wrote a program to benchmark button clicks and uploaded it along with the source (MWC) as file #12259, BTNTIME.ARC (beware of file #12257; it's a botched upload). I figure other people must have tread this same ground long ago, does anyone have a fix for this? Thanks, Jarrell Irvin ------------ Category 3, Topic 12 Message 59 Sat Oct 14, 1989 D.HURSEY at 15:02 PDT Is it possible to get the metafile function bindings and escape codes as well as any changes in old bindings in rainbow tos--without paying for the developer's kit? dvh ------------ Category 3, Topic 12 Message 60 Mon Oct 30, 1989 C.HARVEY at 23:06 EST OK all you GEMophiles, tell me if you've heard of this before: I have programmed a text editor as an accessory (named DIARY), and all was fine until I added some embedded resource stuff (3 simple dialog boxes). Now when I boot up, my acc does not show up in the menu of acc's. However, if I then run any other program, or even SHOW a text file from the desktop, my acc starts showing up in the menu as it's supposed to. I've played around with where I put the menu_register command with no change. The program itself runs fine once you can get to it, and it loads/runs fine from Multi-desk. Craig Harvey (c.harvey) ------------ Category 3, Topic 12 Message 61 Tue Oct 31, 1989 A.HAMILTON1 [Alan H.] at 04:43 MST Perhaps if you uploaded some code fragments, we could see what's going on. Are you making *any* GEM calls before you call menu_register()? If you are, that might cause the problem you describe. / / * / Alan * * ------------ Category 3, Topic 12 Message 62 Tue Oct 31, 1989 E.ROSENQUIST at 09:05 EST Craig: see my reply in the text editor topic (cat 2, topic 37). Eric ------------ Category 3, Topic 12 Message 63 Tue Oct 31, 1989 C.HARVEY at 23:34 EST The only earlier GEM call is the appl_init, which I believe is necessary to get the appl ID for the menu_register call. ------------ Category 3, Topic 12 Message 64 Wed Nov 01, 1989 A.HAMILTON1 [Alan H.] at 04:47 MST Right, you have to do appl_init() before you do any GEM calls. You should have something like this: extern int gl_apid; main() { appl_init(); menu_register(gl_apid, " Title for ACC menu"); /* Other initialization code here */ event = evnt_multi(..... /* Or use evnt_mesag() */ Is this close to what you have? / / * / Alan * * ------------ Category 3, Topic 12 Message 65 Mon Nov 06, 1989 C.HARVEY at 21:18 EST That's it exactly, except in Modula-2 the menu_register call takes a string variable (rather than a constant) so there is a line after the appl_init to assign the menu title to the string variable. ------------ Category 3, Topic 12 Message 66 Wed Nov 15, 1989 D.LEMAY2 [Darby] at 01:04 PST HELP!!!!! I am currently writing a inventory control prg and have come across a problem with displaying dialogs. The dialog is fairly basic: a parent box with a child box containing editable boxes for input. In the parent box are the exit buttons. When I try to display the dialog, only one or two of the buttons or text editable boxes are displayed, not the parent box. I'm using Laser C with the Laser Resource prg. Sometimes just the child box with the editable boxes are displayed. Everything works- the text cursor moves to all the boxes (even the undisplayed ones) and the buttons work (if I can find them on the screen). I have checked the header file, all and have sorted it everyway possible. I have traced the address of the tree to see if has been corrupted-nope. At one time I got it to display properly, but when I added a second dialog box to the rsc file, both wouldn't display properly. Can any body tell me what's happening? I thought this would be an easy part of the program, but so far it has been totally frustrating. I even wrote a little prg to test dialogs- thinking maybe my code was screwing it up- but it still does the same thing. Please reply soon- my forhead is getting sore and holes are appearing in the wall!!! Thanx D.LeMay ------------ Category 3, Topic 12 Message 67 Wed Nov 15, 1989 E.ROSENQUIST [Strata] at 12:59 EST Check the parameters you're passing to objc_draw() - it sounds like the starting object index and/or drawing depth is not correct. You want 0 (or ROOT) for the starting object and MAXDEPTH for the drawing depth. Eric ------------ Category 3, Topic 12 Message 68 Thu Nov 16, 1989 A.HAMILTON1 [Alan H.] at 03:10 MST Also be sure that the clipping rectangle passed to objc_draw() is large enough to contain the entire dialog. Making it the same dimesions as what's passed back from form_center() is what you normally want. / / * / Alan * * ------------ Category 3, Topic 12 Message 69 Wed Nov 22, 1989 D.LEMAY2 [Darby] at 00:39 PST Alan and Eric: Thanx for the reply. The two ideas you have mentioned I have already thoroughly checked. Here is the exact code I'm using: (The example dialogue is a box with one exit button in it) OBJECT *box_addr; int xbox, ybox, wbox, hbox, smally, smallx, smallw, smallh, exit_obj; rsrc_gaddr(0, ABOX, &box_addr); form_center(box_addr, &xbox, &ybox, &wbox, &hbox); smallx = xbox + (wbox/2); smally = ybox + (hbox/2); smallw = 0; smallh = 0; form_dial(FMD_START, smallx, smally, smallw, smallh, xbox, ybox, wbox, hbox); form_dial(FMD_GROW, smallx, smally, smallw, smallh, xbox, ybox, wbox, hbox); objc_draw(box_addr, ABOX, 10, xbox, ybox, wbox, hbox); exit_obj = form_do(box_addr, -1); form_dial(FMD_SHRINK, smallx, smally, smallw, smallh, xbox, ybox, wbox, hbox); form_dial(FMD_FINISH, smallx, smally, smallw, smallh, xbox, ybox, wbox, hbox); box_addr[exit_obj].ob_state = NORMAL; / I cannot find any error in this code. In further experimentation, I have found that the first dialogue created in a rsc file displays fine, but when I add another dialogue, the second one screws up in the manner I have described. Also any others I add don't display properly. I have tryed both LASER CFG.PRG and another called KRESOURC. Same thing happens with both, so I don't think it's a problem with the program Any other ideas? Darwin ------------ Category 3, Topic 12 Message 70 Wed Nov 22, 1989 A.HAMILTON1 [Alan H.] at 05:42 MST The problem is with the objc_draw() call. Change it to read: objc_draw(box_addr, ROOT, MAX_DEPTH, xbox, ybox, wbox, hbox); If your header doesn't define ROOT and MAX_DEPTH, they are 0 and 8 respectively. The second argument to objc_draw() is the number of the object within the tree to start drawing at. Normally, you want to start at the "bottom" part, the root, object #0. You put ABOX, which just indicates where your dialog is in the .RSC file. That's what's making your dialog screw up when you add another to the .RSC file. ABOX changes, making objc_draw() start at a different level. The third parameter indicates how many children of the starting object are to be drawn. Zero will make it draw only the object specified in the second parameter. One through seven will make it draw one to seven levels below the starting object. Eight is a special number that indicates you want to draw all objects below the starting object. Ten, which you put, isn't valid. / / * / Alan * * ------------ Category 3, Topic 12 Message 71 Wed Nov 22, 1989 DOUG.W at 12:11 EST In the Depth field, the value 8 has no significance. Any value greater than the number of levels results in all levels being drawn. I suspect DRI picked 8 as a reasonable, but arbitrary value. --Doug ------------ Category 3, Topic 12 Message 72 Thu Nov 23, 1989 D.LEMAY2 [Darby] at 01:04 PST THANX A WHOLE LOT ALAN!!!!!!! I was going by the example program in the ATARI ST Application Programming book by DATATECH PUB. They don't tell you that information, and since your only working with one dialogue, it works fine. They say use 10 as the depth field to cover most circumstances. I'll check and see if MAX_DEPTH is defined. Well, now I can get on with the program! Sure was frustrating, having such a simple seeming code continually screw up. Thanx again, and thanx for the quick reply!! ***Darwin*** ------------ Category 3, Topic 12 Message 73 Sat Nov 25, 1989 L.WEINHEIMER at 13:30 PST Is it possible, and if so how, to change the text in the menu for a desk accessory, once it has been loaded. Calling the registration a second time does not work, so I was wondering how it might be done. This would be great for DAs to signal status or availability. Larry ------------ Category 3, Topic 12 Message 74 Mon Nov 27, 1989 J.ALLEN27 at 00:12 EST Yah that would be nice. ------------ Category 3, Topic 12 Message 75 Mon Nov 27, 1989 C.DAYMON at 20:00 EST I've noticed several programs that make the desk accessories unavailable when they are running. One is the game, Drachen, from Germany. Is there a GEM call that I don't remember that was used to achieve this? (Actually, I can't think when I would use it, but I'd like to know.) -Craig W. Daymon ------------ Category 3, Topic 12 Message 76 Mon Nov 27, 1989 E.ROSENQUIST [Strata] at 21:08 EST I think that all they do is make the menu entries DISABLED, either by accessing the object in their menu tree directly or by calling menu_ienable(). Eric ------------ Category 3, Topic 12 Message 77 Mon Nov 27, 1989 GRIBNIF at 21:59 EST I doubt that changing the text of the menu entries for DA's could be done legally. I believe that they are part of the resource (in memory) for the GEM desktop, even when another program is running. Dan ------------ Category 3, Topic 12 Message 78 Mon Nov 27, 1989 A.HAMILTON1 [Alan H.] at 21:19 MST Yep, it's possible. Menu_register does not make a copy of the menu name; it only keeps a pointer to the name that's in your code. By changing what the pointer you passed to menu_register() points to, you can change the Desk menu title. The following code is an accessory that changes its name every time you select it. #include char name1[] = " Original name"; char name2[] = " New name"; main() { extern int gl_apid; char namebuffer[32]; int msgbuffer[8]; int toggle = 0; appl_init(); strcpy(namebuffer, name1); menu_register(gl_apid, namebuffer); for (;;) { /* For-ever */ evnt_mesag(msgbuffer); strcpy(namebuffer, (toggle != 0) ? name1 : name2); toggle ^= 1; } } / / * / Alan * * ------------ Category 3, Topic 12 Message 79 Tue Nov 28, 1989 CBARRON at 03:47 EST /* code to kill acc access from a gem menu given the menu address and index of the about... item. */ void kill_accs(menu_ptr,aboutidx)long menu_ptr;int aboutidx; { int k; for(k=aboutidx+2;k ) Thanks for the correction. ------------ Category 3, Topic 12 Message 99 Tue Dec 05, 1989 L.WEINHEIMER at 22:39 PST Dan: Sorry, the program that I am writing the Accessory for is a comercial product (not mine). Larry ------------ Category 3, Topic 12 Message 100 Fri Dec 08, 1989 C.HARVEY at 20:12 EST Is there possibly an "easy" way to allow window slider scrolling ? I understand TOS 1.4 has this built in, but it seems that there should be a way to have sliders continue to slide by holding down the mouse button on the earlier TOS's. I figure when you do a window_create call, TOS/GEM must (?) create the objects somewhere in memory just as if you programmed in all the window pieces as resource objects. This would mean that there's a "Touch Exit" bit associated with the arrow buttons and if that bit were set, the arrow button would repeat with the mouse button depressed. Am I nuts? Is this already an old/proven idea? or should I start figuring out how to find that little BIT? ------------ Category 3, Topic 12 Message 101 Sat Dec 09, 1989 DOUG.W at 02:11 EST Interesting idea... I don't think anyone has discussed how windows are represented internally. --Doug ------------ Category 3, Topic 12 Message 102 Sat Dec 09, 1989 TOWNS at 03:53 EST This is a nice idea, but there are applications that depend on the way it works now. This is something that the application should take care of. For example, if you hold down the Left Mouse Button on a window "arrow" in DeskSet II, it will continue to scroll until the end of the window. To install code in the OS that would make it continue automatically would probably break DeskSet II and other applications. I think the solution would be to write an application library that handles this for you. Most of the commercial software developers usually write their own interfaces that sit on top of the AES. Remember that the AES is nothing more than a set of User Interface tools. How you take advantage of them is your choice. This is obvious from the fact that there are good user interfaces and bad ones :-) -- John ------------ Category 3, Topic 12 Message 103 Sun Dec 10, 1989 J.ALLEN27 at 02:17 EST The mechanism Deskset uses would determine if it would break or not. Does Deskset do this on TOS 1.0,1.2? Wouldn't this be breaking the rules? And most important...how many people will ever have DesksetII? ------------ Category 3, Topic 12 Message 104 Sun Dec 10, 1989 DARLAH [RT~SYSOP] at 14:52 EST Jim: I hear that the laser/dtp bundling deal is coming in with DeskSet. You may see people with this product due to that fact. Whether they stick with it might be another thing. I was not impressed and perhaps it will be another dust collecter. Time will tell.......now won't it. ------------ Category 3, Topic 12 Message 105 Sun Dec 10, 1989 C.HARVEY at 20:24 EST I don't think the idea I had in mind could possibly affect any program other than the one doing it. I'm not talking about redirecting any interrupt vectors or anything. I guess my question is simply, does GEM deal with window pieces (namely arrow buttons) created from the built-in functions the same as if the programmer created them as AES objects. ------------ Category 3, Topic 12 Message 106 Wed Dec 20, 1989 J.MCCRACKEN at 18:21 PST Does anyone know if there is a way to hide a folder temporarily. I am having some friends over to play with the computer, and there are certain folders I would rather not have them see. Thanks in advance for your help. John ------------ Category 3, Topic 12 Message 107 Wed Dec 20, 1989 JLS [John STanley] at 22:56 CST That's not a GEM question John, so I suspect the topic politzi will be moving your question soon, but... Assuming the folders you want to hide are in the root directory you can temporarily hide them using a sector editor. If you change the first character in the root directory entry describing a folder into an ascii 229 (hex E5) character, gemdos will think it's been deleted, but the sectors used will still be marked in-use so you can later recover the folder by changing the 229 back into whatever character you had there before. BTW, because gemdos does cache some of the directory info, you should hide or restore the directorys using the sector editor, save the changes, exit the editor, and then reboot your machine to make sure gemdos recognises the changes both times. BTW2, You can easily screw-up your disk using a sector editor if you edit things other than the folder names without knowing what you are doing. I therefore take no responibility for any damage you may do to your directory information if you don't make the right changes. I just know what I told you does work because I've occasionaly had relatives over myself... If you need a good sector editor, Memfile (in the library here on GEnie) works well... ------------ Category 3, Topic 12 Message 108 Thu Dec 21, 1989 ISD2 [Julius] at 21:49 EST Changing the first character of the folder name is dangerous. What if a new folder is created or a file is created? GEMDOS will look for empty slots with E5 in them. Zowie...yer folder really disappeared. Best way I've found is to keep 'goodies' on the last partition and just remove that icon and save the desktop. ------------ Category 3, Topic 12 Message 109 Thu Dec 21, 1989 C.F.JOHNSON at 19:50 PST Yep, Julius....I agree. Just remove the icon for the drive that contains the "sensitive" files from the DESKTOP.INF file. (Of course, this may involve some reorganizing of the data on the drives in question...) - Charles ------------ Category 3, Topic 12 Message 110 Fri Dec 22, 1989 JJKENNEDY [RT*SysOp] at 01:27 EST If you use UIS, you might want to disable it also. UIS will show the partition with the icon present or not. --John ------------ Category 3, Topic 12 Message 111 Fri Dec 22, 1989 JLS [John STanley] at 00:39 CST Hmm.. Julius is right. I didn't use the drive in question to save anything to the root while the folders were "hidden" so I didn't run into that problem. Sorry, I should have mentioned this. . . Julius, thanks for the 'save'... And JJKennedy is correct that just removing the icons isn't a solution if you use any programs that use the gem file-selector and you have UIS, Little- Green Selector, or tos 1.4 installed... Humma... Looks like it's time to write a folder-hideing prg..? ------------ Category 3, Topic 12 Message 112 Fri Dec 22, 1989 J.EIDSVOOG1 at 17:56 PST All this talk got me curious so I used a disk editor to set one of my folders to 'hidden' (kids, don't try this at home). Voila, it disappeared but will not be destroyed by writing new files to the disk. Of course, MaxiFile will show it if you use 'SHOW HIDDEN FILES', and you can still open it and use it. For the brave, simply change the attribute byte (the byte after the folder name) from a $10 to a $12, but don't blame me for any misuse of this information. John ------------ Category 3, Topic 12 Message 113 Fri Dec 22, 1989 J.HARRIS32 at 18:52 PST I am trying to get both mouse and keyboard input at the same time, but having intermittant results. I am using the AES call graf_mkstate to get the mouse position and button status. Then, if there are no mouse buttons pressed, I use the GEMDOS call Cconis ($0b) to check for key presses. The process repeats until there is either mouse button or keyboard input. The problem I am having, is that key presses are occasionally skipped. I hear the audible keyclick sound from the monitor, but the program does not detect the key press. (Happens approx 1 out of 5 times). What is causing the missed keys? Is there a better way to get the inputs I need? Thanks - John Harris ------------ Category 3, Topic 12 Message 114 Fri Dec 22, 1989 ISD2 [Julius] at 23:07 EST You can't mix GEM AES and GEMDOS calls... Any problem using evnt_multi()? Ask for mouse and keyboard events then use graf_mkstate() right after the evnt_multi() call to get the ALT, CTRL, and SHIFT key states... ------------ Category 3, Topic 12 Message 115 Sat Dec 23, 1989 TOWNS at 00:46 EST Julius is right. You should use Evnt_multi() to handle the inputs. Why poll something you don't have to? Let the AES do it for you! That's what it's there for! :-) -- John ------------ Category 3, Topic 12 Message 116 Sun Dec 24, 1989 J.HARRIS32 at 01:05 PST Charles, this is what I know so far about the LZH header. Byte Offset Contents ------ -------- 0-1 The first two bytes are a mystery still. 2-6 5 bytes ASCII, either '-lh0-' or '-lh1-' identifying whether compression is off (i.e. stored file), or on. 7-$a Size of compressed data, byte reversed format. (Low byte first) (P.S. It's wonderful converting from Intel processors isn't it...) $b- $e Size of original data, low byte first. $f-$14 Must be the Date-Time info, but I haven't checked the format yet. $15 Size of the filename. $16- xx Filename, up to the length specified in $15. No padded spaces. The file's CRC value comes right after the filename, followed by the compressed data. Each file in the archive has this header+data format. There is nothing special at the front, and each segment simply follows the previous one. That should be enough, and if you have any questions, let me know. John ------------ Category 3, Topic 12 Message 117 Sun Dec 24, 1989 C.F.JOHNSON at 09:46 PST Thanks, John. Unfortunately, GEnie's editor managed to make hash out of your message, but I think I can decipher what I need to know. - Charles ------------ Category 3, Topic 12 Message 118 Sun Dec 24, 1989 J.HARRIS32 at 23:50 PST Thank you for the quick responses. I don't think evnt_multi will work in my application. I have put up a screen full of filenames, and when you click and drag the mouse, it selects files as the mouse is passing over them. All I was checking the keyboard for, was the Return key to work with the default button object. If I could poll the mouse buttons and the keyboard at the same time, then after detecting a button press I could use graf_mkstate the whole time the button was held, to do all the file selecting. The main reason I didn't want to use evnt_multi to do the initial detection, is because of the delay between when you press the button, and when the AES gives you the message. If the mouse is being moved during that time, the starting point is missed. I realize this has been improved in the 1.4 ROMs, but there are still a lot of non-upgraded machines. The graf_mkstate call is fast enough so that no matter how fast the mouse is moved, no files get skipped. The bottom line, I'd like to have the Return key feature, but I don't want to compromise any performance to get it. Is there another way to grab the mouse button and keyboard state? Can you check the hardware without interference? John Harris ------------ Category 3, Topic 12 Message 119 Mon Dec 25, 1989 A.HAMILTON1 [Alan H.] at 07:19 MST You can get the information returned by graf_mkstate() by reading some of the line A variables. Call linea0() and use what's returned in D0 as the base for the following offsets: -602 Mouse x position -600 Mouse y position -596 Mouse buttons (bit 0 = right button, bit 1 = left) I think if you read these variables directly, you can use the BIOS routines to read the keyboard. Since you won't be calling GEM, it won't get a chance to "eat" keystrokes. / / * / Alan * * ------------ Category 3, Topic 12 Message 120 Mon Dec 25, 1989 J.HARRIS32 at 15:27 PST Thank you Alan, it worked great. I still had the old line-a document. You know, the one that taunts you about all the things that are supposed to be described *below*... I'll have to get the salad file again. (Lost it in a system crash before I got a chance to read it). It probably contains answers to lots of other questions as well. John ------------ Category 3, Topic 12 Message 121 Tue Dec 26, 1989 J.EIDSVOOG1 at 18:10 PST But if you read the mouse directly, you'll have to try and figure out how to eliminate mouse button 'fall-through' when you quit your program, bring up a file selector or an alert box. Fun stuff. ------------ Category 3, Topic 12 Message 122 Tue Dec 26, 1989 J.HARRIS32 at 23:08 PST Thanks Alan, it worked great. I still had the old line-a document. You know, the one that taunts you about all the things that are supposed to be described *below*... I'll have to get the salad file again. (Lost it in a system crash before I got a chance to read it). It probably contains answers to lots of other questions as well. And thank you John for the warning. Fortunately, I end up in a dialog box before exiting. John Harris ------------ Category 3, Topic 12 Message 123 Sun Dec 31, 1989 J.HARRIS32 at 15:39 PST Is there a way to tell the difference between whether an application was called from a command line, or called by double-clicking with an installed application? (Where the filename is put in the command line buffer). Thanks - John ------------ Category 3, Topic 12 Message 124 Tue Jan 02, 1990 J.HARRIS32 at 19:34 PST Charles, I still need to rephrase my command line question. Does GEM give any special identifiers to let you know that your program was called as an installed application? In other words, when your program is called as an application, it has the filename that was 'clicked on' in the command line buffer. If you type 'UNLZH FILE' from a CLI, you will also have the file- name in the input buffer. I want to be able to distiguish between those two events, as the program needs to respond differently in each situation. My earlier comment about the spaces was related to this task. The filename from an application call always starts in the first character of the buffer. I was wondering if the data from a command line call would start with the 'space' character in between UNLZH and the Filename. If that were true, it would be a way to distinguish command lines from application calls. I suspect though, some CLI's probably remove the leading space or spaces. If they did, the command line buffer would look identical to an application call. That's the problem. I want to know how the program was called. Is there a way to find out? Thanks. John ------------ Category 3, Topic 12 Message 125 Tue Jan 02, 1990 DOUG.W at 23:33 EST On the ST, the "command line" passed to an application is actually a "command tail" and doesn't contain the name of the application itself. --Doug ------------ Category 3, Topic 12 Message 126 Tue Jan 02, 1990 C.F.JOHNSON at 22:05 PST John, OK, I think I understand what you're asking. Unfortunately, the answer is probably "no". I don't think there's any way to tell if a command line has been set up by 'Install Application', or typed into a CLI. In either case, the first byte in the command line buffer (at the basepage+129 ... basepage+128 has the length of the command line) will be the first byte of the filename. To make things even worse, you should also be prepared to handle the command line whether it has a full pathname (e.g. C:\UTILITY\LZH\STUFF.LZH), or whether it just has the filename alone (e.g. STUFF.LZH). - Charles ------------ Category 3, Topic 12 Message 127 Wed Jan 03, 1990 JLS [John STanley] at 01:17 CST John, mind telling me why you need to handle it differently? Seems to me that it's important to have it work the same no matter which way you call the program with a parameter... If you can give a better explanation of why you think you need to recognise the difference, perhaps one of us can suggest an alternate method of accomplishing the same type of operation... ------------ Category 3, Topic 12 Message 128 Wed Jan 03, 1990 TOWNS at 02:44 EST I think there is a way to see if you are being run from the desktop or from a shell. I think you can look into the BasePage for information like this. I am just guessing and may be totally wrong, but I will ask around and see what I can find out. -- John ------------ Category 3, Topic 12 Message 129 Wed Jan 03, 1990 J.HARRIS32 at 03:21 PST The situation is in the UNLZH program. When called from a CLI, it needs to bypass the GEM dialog box, and go straight to extraction. When you double-click an LZH file from the desktop, it puts up the dialog box so you can select the different functions. This is not inconsistant. Running an installed application is a mouse/GEM operation. Typing into a CLI is not. It's the difference between running the program in GEM mode or TOS mode. It should respond differently. What I have done in 1.2 is to make you have to type something in front of the filename. Like an 'X' as in ARC.TTP. It will then search past it for the filename. It grabs full paths, like 1.1 was supposed to do also, but alas, didn't. John Harris ------------ Category 3, Topic 12 Message 130 Wed Jan 03, 1990 TOWNS at 12:22 EST You could account for each situation like this: 1. Check for a command line. If there is a 'FULL' command line with our options present, then excute the program as a TOS program (as if you were being run from a shell..) 2. If you have a command line WITHOUT your options and it just contains the .LZH filename that was passed as an installed application, then you run the program as a GEM program and get the options from the user. 3. If you don't have a command line, then run as a normal GEM program. 4. If you have a command line that doesn't look like that of your normal command line or that of an Installed Application, then print a usage message. I hope this helps. -- John ------------ Category 3, Topic 12 Message 131 Wed Jan 03, 1990 J.HARRIS32 at 23:34 PST Thanks John, This is basically the approach I used in 1.2, although the program does not actually do anything with command line options. It just uses them to put UNLZH in TOS mode. ------------ Category 3, Topic 12 Message 132 Thu Jan 04, 1990 J.HARRIS32 at 00:04 PST I have a question regarding the new FSEL routine that allows a title string. If you make the call on a machine that doesn't support it, do you get an error back in INT_OUT? Or do you need to determine that the routine doesn't exist beforehand, and call the older one to start with? John. ------------ Category 3, Topic 12 Message 133 Thu Jan 04, 1990 C.F.JOHNSON at 09:50 PST John, If you make a call to fsel_exinput with a version of TOS that doesn't support it, you get a "Bad Function Number" alert box. You'll have to first determine which version of TOS you're living with, then call fsel_exinput only if the version is greater than or equal to $104. - Charles ------------ Category 3, Topic 12 Message 134 Fri Jan 05, 1990 JLS [John STanley] at 04:13 CST Towns is correct. (Except when running ram-TOS) You can normaly figure out if you're being run from the desktop by tracing back the parent-basepage pointers and figuring out how "deep" you are. On the other hand, I think I'd prefer to have the command line arguments (or lack thereof) control the TTP/PRG operations since I, for one, would like to be able to us unlzh in full GEM mode while still running it from a cli interface. As an alternative, you could check the M_HID_CT variable in the a-line negative offset area to see if the mouse is active or not and use that to determine if you want to allow gem access or if you should just use the command line arguments to extract the file double clicked from the desktop (the mode I'd probably install). This way if the user wants GEM control over the extraction, he/she could install unlzh as a .PRG and if he/she just wants it to extract, install it as a TOS application... Now that I think of it, this (along with John's ideas) sounds like the best alternative. ------------ Category 3, Topic 12 Message 135 Sat Jan 06, 1990 J.HARRIS32 at 21:36 PST That's a shame about the 'Bad Function', because I would guess that there are no ways to determine if a user has older ROMs, but is using one of the after market file selector programs that support that feature. I suppose I will end up making it configurable. ------------ Category 3, Topic 12 Message 136 Sun Jan 07, 1990 ISD2 [Julius] at 11:14 EST But there is a way to determine which version of TOS is in the machine! ------------ Category 3, Topic 12 Message 137 Sun Jan 07, 1990 C.F.JOHNSON at 09:45 PST Julius, I think John's point was that there's no way to tell if a user has a version of TOS that doesn't support fsel_exinput, BUT also has installed an alternate item selector that does. (Which is true.) - Charles ------------ Category 3, Topic 12 Message 138 Sun Jan 07, 1990 M.EASTER [Mike] at 12:48 PST Charles - re old TOS plus newer selectors Does your old STart selector support fsel_exinput? (The reason I ask is because I'm using the STart selector with TOS 1.0.) I like the STart selector because it is "smaller" and simpler. What kind of problems can I have with such a combination? ------------ Category 3, Topic 12 Message 139 Sun Jan 07, 1990 DOUG.W at 15:53 EST Can't you just call fsel_exinput and if it returns a "Bad Function" error, call fsel_input instead? --Doug ------------ Category 3, Topic 12 Message 140 Sun Jan 07, 1990 C.F.JOHNSON at 13:46 PST Mike, No, the Start Selector does not support fsel_exinput. Doug, Unfortunately, the system puts up an alert box on a "Bad Function Number" error, instead of just returning a code. (I don't think it would make the right impression if people had to click through that error alert every time they used the file selector...) - Charles ------------ Category 3, Topic 12 Message 141 Sun Jan 07, 1990 ISD2 [Julius] at 17:11 EST Gee Charles...you did have to complicate things, didn't you? ------------ Category 3, Topic 12 Message 142 Sun Jan 07, 1990 E.ROSENQUIST [Strata] at 21:22 EST I don't suppose this is the proper place to post this, but since we're on the subject.... Charles: I was experimenting the other night & added code to put the LGSELECT compatible prompt strings in my fsel_input() calls. Just for fun I thought I'd try the similar trick for fsel_exinput(), ie. increase the count for addr_in by two and pass two more strings. No luck. Is this supposed to work, and if not, could you make it work please? Considering that you already handle the extra strings for fsel_input() calls I can't imagine it being all that horrendous.... but then again, I didn't write it so I have no way of knowing. Eric ------------ Category 3, Topic 12 Message 143 Mon Jan 08, 1990 DOUG.W at 01:21 EST Charles, any change LGS could put add a cookie for other programs to look for? --Doug ------------ Category 3, Topic 12 Message 144 Sun Jan 07, 1990 C.F.JOHNSON at 23:13 PST Eric, Hmmm....so you're saying that you passed fsel_exinput an addrin count of 5, and put the title strings for LGSELECT in addrin[3] and addrin [4]? Well, that definitely ain't gonna work with LGSELECT the way it is right now. But that might be a good idea for a future update...thanks for the suggestion. Doug, Since we've been talking about this here, I've decided that I will add some method for other programs to determine if LGSELECT is installed. I haven't decided on a method to use yet, however; it will probably either be through the Cookie Jar or through an undefined BIOS call. (The undefined BIOS call is a _lot_ less work than properly setting up the Cookie Jar...) - Charles ------------ Category 3, Topic 12 Message 145 Sat Jan 27, 1990 C.DAYMON at 17:21 EST Hmm... I'm a bit confused by this conversation about fsel_exinput(). I thought the function call was supposed to work on any version of TOS. I has the impression that fsel_input() would just ignore the extra parameter. Now I'm a C programmer and not exactly sure what happens in assembly when the call is made, but I thought that when a function is called in C, the parameters are placed on the stack and a function (unless it wants the incoming parameters to be 'register') would simply address locations on the stack to use the parameters. Throw a couple of extra parameters on the stack and they should be ignored by the called function because it has no provisions to address that far back on the stack. On a return, the stack pointer is reset to the location it was on before the call and all is fine. If the additional string pointer is the last parameter on the stack, it should never be seen by fsel_input(), but will be there to be used by fsel_exinput(). Copying input parameters to local variable space seems wasteful since this is just stack space in a C program anyway. (Again, unless it is designated static or register.) Wait a second, maybe I should completely digest the information presented first. I think what I said above is correct, but the problem is not the number of passed parameters, but the function number actually called. I guess ideally fsel_exinput() would ALWAYS be called by new ROMs for either fsel_input() or fsel_exinput() and if the extra parameter is present, (fsel_exinput() was called) the string would be displayed. Otherwise, it would be the same as calling fsel_input(). What I mean is that fsel_exinput() and fsel_input() would have the SAME function number but new ROMs would check for the extra parameter. (?) -Craig W. Daymon P.S. I always ramble like this when trying to figure a problem. Sorry. ------------ Category 3, Topic 12 Message 146 Sat Jan 27, 1990 GRIBNIF at 20:22 EST fsel_input() and fsel_exinput() have different AES function numbers. If you call fsel_exinput() on a machine that doesn't support it you get an "Invalid function #" error alert on your screen. There ain't no way around it other than to look at the ROM version and decide which call to make. Of course, UIS and LGSELECT most likely support either regardless of TOS version, but you can't expect everyone to be using one of these, now can you? Whoever added the call for fsel_exinput() into the 1.4 ROMs probably could have made it work according to the number of parameters in the addrin array, but I guess he didn't think of that. Oh well. Dan ------------ Category 3, Topic 12 Message 147 Sun Feb 04, 1990 JLS [John STanley] at 01:05 CST UIS-II doesn't support fsel_exinput because it didn't exist (I think) when UIS-II was written. I have no idea what UIS-III does or doesn't do since I don't have it yet... ------------ Category 3, Topic 12 Message 148 Fri Feb 09, 1990 J.HARRIS32 at 00:02 PST I am having a couple problems converting UNLZH to a desk accessory. First, is there a way to get GEM to redraw the entire screen when the DA exits? Right now, it's only redrawing the part occupied by the initial dialog box. I use the Line A variable to check mouse buttons during operation, and before going back to the main dialog box, I call EVNT_BUTTON to clear the button clicks from the AES. This worked fine in the program version, but it never returns in the DA version. What's going on? Thanks - John ------------ Category 3, Topic 12 Message 149 Sat Feb 10, 1990 GRIBNIF at 14:13 EST John, If you want to undraw the entire screen, you can either use use form_dial(FMD_FINISH... with a rectangle the size of the entire screen or you can have UNLZH open a window beforehand and then just close it when it is done. Why are you monitoring the mouse via the Line A variables? Why not use evnt_multi() like the rest of the world? The real purpose of evnt_button() is to wait for a button press, not to clear the AES' buffers. In either case, if your ACC needs to draw over the GEM menu bar, you will have to copy the menu bar into some place in memory before corrrupting it and then copy it back when you want the screen restored. There is no way to force the menu bar to redraw without knowing where its resource object tree is in memory. Dan ------------ Category 3, Topic 12 Message 150 Sat Feb 10, 1990 C.HARVEY at 15:16 EST Here's one for you ACC gurus: If I Alloc a block of ram at boot up (for my text editor's buffer), and then switch resolutions (lo <-> med) via the desktop Set Preferences, TOS does not Free up my block of memory. This means that when it reloads all the acc's in the new resolution, they go on top of that unfreed ram thus using up gobs of ram unneccessarily. I've gotten as far as being able to free it myself by watching for an AccClose notice in the GEM msg buffer, and although this works, it then also frees it anytime an application starts/stops, which leads to other problems. Acc's like MultiDesk apparently have a way to deal with this, so it must be possible. However, I know that any of the other text editor acc's besides my Diary also do NOT know how to deal with it. Anyone willing to divulge the secret?? ------------ Category 3, Topic 12 Message 151 Sat Feb 10, 1990 GRIBNIF at 15:43 EST Well, this whole thing has been discussed a lot in the past, but here goes again... When the GEM desktop changes resolutions it *should* release any memory allocated to the actual code of desk accessories (whether or not it does under all circumstances is still uncertain to me, since I've seen things like you describe happen also.) What I think may be happening in your situation, however, is that because the memory you Malloc() ends up belonging to the GEM desktop and not to your desk accessory, it is not freed when the desktop changes rez. This means that a "hole" in memory is created where your desk accessories were previously, up to where the Malloc'd memory block still is. When the desk accessories get loaded the second time, they are loaded at the place after the Malloc'd block, because that is the largest block of free memory. The idea of doing the Mfree() during AC_CLOSE is not very good at all, not only because you are de-allocating memory in an order which is not the reverse of the way it was allocated (which is a no-no under the broken memory mangling of TOS 1.0 and 1.2) but also because I really don't think GEM does send an AC_CLOSE when it is going to change resolutions. In any event, it's just not a good idea to allocate memory from a desk accessory when it is initializing because of things like STARTGEM and TOs 1.4's autobooting feature that will cause the memory to belong to the wrong process if you do. What I would suggest is a configuration option for the buffer size that gets saved into the program itself. You can have the startup code for the desk accessory change its basepage so that GEM will know how much extra memory to reserve for the buffer. This way, when the user changes rez the whole thing automagically gets de-allocated. The disadvantage is that the buffer size cannot be changed without re-booting. I'm sure that someone else here can comment on what, specifically needs to be changed in the program to get GEM to reserve the extra memory. I think that just setting one of the segment sizes in the program header (like adding to the BSS) would be sufficient. Dan ------------ Category 3, Topic 12 Message 152 Sat Feb 10, 1990 J.HARRIS32 at 15:59 PST Dan, thanks for the FORM_DIAL answer. Worked great. Mouse input for the program has been discussed here before, and EVNT calls would not work for my application. I did find a way to clear the extra mouse clicks however. I cleared bits 6 and 7 of the LineA variable CUR_MS_STAT, the flags indicating whether the buttons have changed. Is there anything wrong with doing this? John ------------ Category 3, Topic 12 Message 153 Sat Feb 10, 1990 C.F.JOHNSON at 18:20 PST C.Harvey, There is a way to detect when a resolution change is occurring, but it's necessary to intercept trap #1 to do it. Basically, the idea is to watch for an Mfree() call with the address of your basepage. The only time you should ever see this is right before the desktop changes resolution. When the Mfree() comes through, you do your own Mfrees for any memory blocks you've allocated, and then replace the trap #1 vector with whatever was there when you first grabbed it. There are some other big problems with allocating memory from a desk accessory, not least of which is that any Mallocs you do will be assigned to the current running application (NOT to your desk accessory), and if the user quits that application your memory will be freed. - Charles ------------ Category 3, Topic 12 Message 154 Sun Feb 11, 1990 C.HARVEY at 13:12 EST Ahh, some good info from both of you. From prior discussions on this stuff I was aware of the problems of allocating memory AFTER bootup such as from within a running application, which is why I was going to only do it at bootup. I was not aware of the problems with Freeing it myself however. Since I am willing to have it only changeable with a reboot, it sounds like Dan's idea of modifying the basepage is a good approach. Besides, I now know a _little_ about what a basepage is, but all I know of stealing traps is from overhearing it here. By the way, on the ACC Close message on a res change, it does definitely happen, and if your window is open, it is preceded by a Redraw message. (at least on my TOS 1.0 system). Thanks much! Craig ------------ Category 3, Topic 12 Message 155 Sun Feb 11, 1990 C.F.JOHNSON at 10:42 PST Craig, Yes, if your ACC's window is open, you do get an AC_CLOSE message on a res change. But it's fairly useless at that point, since if you're going to free up your Mallocs every time you get an AC_CLOSE message, you're in trouble already. I've heard that rumor about problems if you release Mallocs in anything other than the exact opposite order. It may have been true in TOS 1.0, but I've never seen any strange behavior like that in TOS 1.2...even when I tried to make it happen with MultiDesk. I used the technique of modifying the executable file header (_not_ the basepage) in the Macro Mouse accessory. It's quite simple; just change the "length of BSS" variable at 10 bytes into the header. (That's decimal 10.) You may also want to read your basepage during init to find out how big your BSS really is -- which presents another set of problems, since the only legal way to get the address of your basepage when you're running as an accessory is from register A0. (A0 points to your basepage when you're an accessory...when you're a program A0 is zero on startup.) - Charles ------------ Category 3, Topic 12 Message 156 Wed Feb 14, 1990 C.HARVEY at 23:50 EST Charles, thanks much for that info about A0. I'll have to give it a try although I've gotten around it by subtracting 1200 (dec) from where you would normally get the basepage address off the stack (i.e., get the address off the stack and then subtract 1200). For whatever reason, this actually seems to work fine. And yes, modifying the bss length in the file header is working fine. I think my only remaining problem is getting the filename in case it's been changed from the name I give it (e.g., if it's being run under MultiDesk as 'diary18.acx'). I had thought I could get that from the 'command line image' at byte 128 of the base page, but it doesn't seem to be there. I can get the drive and path ok, but what about the filename?? Craig ------------ Category 3, Topic 12 Message 157 Mon Feb 19, 1990 C.HARVEY at 16:29 EST A couple things... first, a little more info on finding the basepage of a DA: I tried reading A0 and using it as a pointer to the basepage, which didn't work. One obvious suggestion that hadn't occurred to me is to just take 256 off the program counter at the start of the program (Darek Mihocka pointed that one out to me). Next question: Is there a way to find out if a given window is open (and thus able to be Topped)? It seems that Flash closes my DIARY window when going to on-line mode, but the message sent is an identical redraw message to what the desktop sends when moving a directory window over my window (without closing it). The trouble comes when returning to Flash's edit mode and trying to get my Diary window back. If I just try to Top it, everything locks up, but if I re-Open it, it's fine. But I can't just always re-open, since if I'm not in Flash, it's trying to open an open window which screws things up. And there is no error code returned from either the window open call or the window top call when they screw up as above. [I have Compute's AES book on order, which may shed some light on all this...] ------------ Category 3, Topic 12 Message 158 Mon Feb 19, 1990 C.F.JOHNSON at 17:22 PST Craig, All I can tell you is that I've converted all my program/accessories over to use the A0 method to find their basepage, and it seems to work fine. Aren't you using Pascal? If so, the Pascal startup code may be destroying A0 before you get a chance to examine it. (I don't know...just a guess.) Yes, you can just subtract 256 from the PC at the start of the program. That will probably work almost 100% of the time...but the hitch there is that the basepage is _not_ guaranteed to always be located 256 bytes before the start of your program code. This means that if you really want to stick to the book, you should try to make the A0 method work. - Charles ------------ Category 3, Topic 12 Message 159 Tue Feb 20, 1990 GRIBNIF at 19:58 EST As for the window stuff, if Flash truly is closing the window then it must be doing some pretty weird stuff. Are you sure it isn't just making another (invisible) window when you change modes? I've never heard of this behavior in Flash before, but I don't have a copy here so I can't test it. If Flash does close your window to the point where you can't set it with WF_TOP, Flash should definitely be fixed. This is not normal behavior for a GEM program. By the way, what happens if you open Atari's control panel, leave it open while switching to terminal mode, and then re-open the control panel from the dropdown? Does this crash also? If not, then you might be doing the wind_set() call incorrectly. Dan ------------ Category 3, Topic 12 Message 160 Tue Feb 20, 1990 FB [ST Librarian] at 20:27 EST Dan, Leaving the control panel on and switching to the terminal is usually a good way to crash. I don't know if it was ever fixed but it is one of those things you do one time and never again! Flash was in it early stages when I tried that and I just never really wanted to do it on newer versions. Fred ------------ Category 3, Topic 12 Message 161 Wed Feb 21, 1990 GRIBNIF at 19:57 EST Wow. Major nastiness. If I were writing a desk accessory I wouldn't bother trying to avoid this problem, since it sounds like the kind of thing that is "accepted behavior" from the program. You may want to mention it in the doc file though, so users won't be tempted to try it. Dan ------------ Category 3, Topic 12 Message 162 Sun Feb 25, 1990 C.HARVEY at 11:05 EST Charles, Chances are you are right about my Modula-2 startup stuff somehow destroying A0 before I can get to it. For now I'm just sticking to the weird way I found that works -- taking 1200 off the stack value. Dan & Fred, I found a way around the Flash problem (after reaching despair on it I read about my 'Honorable Mention' in the CPU Shareware Connection and got so revitalized that I came up with a workable solution. I'll just say that it involves checking the FirstXYWH as if you wanted to do a redraw, and using the result to determine whether to top or open the window. ------------ Category 3, Topic 12 Message 163 Sun Feb 25, 1990 C.HARVEY at 11:13 EST With all the progress I've made, Diary v 1.8 should be out very soon. However, one thing I'd like to add (maybe not til 1.9) is the ability to run as either an acc or a prg. Is there some easy way to tell what filename your program had when it was called? This would also let me save config things to the acc file even if it were run as acx through MultiDesk without asking the user to find the file -- as well as letting me know if it were run as a prg or not. A related question is: Is there a way to tell if your program was run as a prg or acc without checking the extender? I thought maybe the basepage's pointer to parent's basepage would tell me something, but it seems like that's always zero. Craig ------------ Category 3, Topic 12 Message 164 Sun Feb 25, 1990 C.F.JOHNSON at 08:53 PST Craig, Subtracting 1200 from the stack pointer?? Now that's an odd one...I can't imagine why that works, but my sincere advice is to find another method. You're asking for trouble down the line if you use a totally undocumented technique like that. There's really no way to find out your accessory's filename after it runs. (Some time ago, I chased that rabbit down a hole for quite a while.) However, if you assume that the user doesn't rename the file (and you can tell him not to, in your docs), it's easy to use Dgetdrv() and Dgetpath() at init time and build a full pathname...and this will work either as a normal accessory or loaded into MultiDesk. As for the prg/acc thing...the parent's basepage is indeed telling you something! When that pointer is zero, you're running as an accessory; when it's not zero, you're a program. Using this method to determine which way you're running is a pretty good second choice (instead of checking A0), but it has a potential pitfall. It requires you to assume that the basepage starts 256 bytes before the beginning of your code, which is not guaranteed unless your program was run from the desktop. (A shell program could conceivably use the different modes of Pexec to create a runnable program whose basepage is not 256 bytes prior to its TEXT segment.) - Charles ------------ Category 3, Topic 12 Message 165 Fri Mar 02, 1990 C.HARVEY at 20:17 EST Ahh well, I guess I'll have to resort to letting the user find the file since I DO want to allow users to rename the thing and thus be able to run multiple copies of it at once (I've found this very handy at times). Then again, I can leave it as it is, forcing the name to be one thing when reconfiguring the buffer size, but once the user has reconfigured it, he is free to rename it.... only mildly complicated. Thanks for all the help! Craig ------------ Category 3, Topic 12 Message 166 Sun Mar 04, 1990 R.FOSTER1 at 16:53 CST I need a question about GDOS answered. I have a program that I some time ago which copies a graphic image into a window as on. This has worked out just fine for a long time I have added GDOS to my system, the blit call doesn't cause to happen. If I take out GDOS(or G+PLUS), everything works . is a andle,3,xyarray,&sourcemfdb,&destmfdb); some sort of initialization that needs to be done with addition to the appl_init(), v_opnwrk(..),vs_clip(..) program doesn't use GDOS but something about GDOS being messing things up. Any GDOS tips appreciated. ------------ Category 3, Topic 12 Message 167 Sun Mar 04, 1990 C.DAYMON at 23:11 EST R.FOSTER1, Please repeat your last message. It was a bit garbled and I'm not sure what your asking. -Craig W. Daymo ------------ Category 3, Topic 12 Message 168 Mon Mar 05, 1990 E.ROSENQUIST [Strata] at 12:30 EST Check the work_in[] parameters to your v_opnvwk() call - you're probably specifying normalized device coords (NDC: 0 to 32767) rather than raster coords (RDC: 0 to screen-res). Without GDOS NDC coords don't exist and hence you get raster coords. With it you're blitting to/from a very tiny area. Eric ------------ Category 3, Topic 12 Message 169 Fri Mar 09, 1990 R.FOSTER1 at 21:22 CST This is a repost due to garbled first post. I am having a problem with using GDOS(or G+PLUS) which is really baffling me. I wrote a program some time ago that as part of it's operation needs to blit some images to the screen. This program has been working for some time but since I added GDOS to my system, the blit calls no longer work. Nothing at all happens. If I remove GDOS, everthing is fine again. I am speculating that there is something else I need to do with GDOS loaded that I don't know about. This is the program sequence. appl_init(); grhandle=graf_handle(...); v_opnvwk(in,&grhandle,out); whandle=wind_create(...); wind_open(whandle,...); ;;;/* Other stuff */ vro_cpyfm(whandle,3,....); /* Works fine without GDOS */ /* Does nothing with GDOS */ Thanks, Bob Foster ------------ Category 3, Topic 12 Message 170 Sat Mar 10, 1990 E.ROSENQUIST [Strata] at 13:41 EST You're using the window handle 'whandle' rather than the VDI workstation handle 'grhandle' in your vro_cpyfm() call. Without GDOS you may have been lucking out and having the same values in both. Eric ps: use *SN to save a message containing things like source code that you don't want GEnie to reformat. ------------ Category 3, Topic 12 Message 171 Sat Mar 10, 1990 JLS [John STanley] at 13:04 CST Good eyes Eric, I was trying to figure out what he was doing wrong and because of the reformatting, that line came out looking like a seperate comment. Bravo! ------------ Category 3, Topic 12 Message 173 Sat Mar 10, 1990 A.HAMILTON1 [Alan H.] at 13:24 MST In the vro_cpyfm(whandle,3,...) statement, you should replace whandle with grhandle. All the VDI commands use this. Only the wind_whatever() commands use the window handle. It may work without GDOS because it's probably assuming screen output without actually checking the handle. GDOS *does* check the handle, so that could be what's messing you up. / / * / Alan * * ------------ Category 3, Topic 12 Message 174 Tue Mar 13, 1990 M.L.HANSON at 18:26 CST What are the rules for displaying hidden files on the GEM desktop? They normally show. Today I _copied_ a hidden file, and the copy didn't show. Great! All I have to do is hide them, copy them, and delete the original. But I can't repeat the feat. I've got exactly one hidden file that's treated properly but I can't get another one. I've tried both the UIS copy and the GEM copy. No difference. ------------ Category 3, Topic 12 Message 175 Tue Mar 13, 1990 V.AVERELLO [Vince-Cubed] at 21:09 EST I think that if a file has the hidden attribute and one other attribute set (like read-only or archive) then the file WILL show on the desktop. If only the hidden attribute is set then the file WILL NOT show. This is something I think I read in one source or another. Vince - V-Cubed Software ------------ Category 3, Topic 12 Message 176 Wed Mar 14, 1990 GRIBNIF at 21:32 EST Yup, Vince is right. If any attribute besides hidden is set, then you will always see the file on the GEM desktop (but not in NeoDesk ). Dan ------------ Category 3, Topic 12 Message 177 Thu Mar 15, 1990 C.DAYMON at 19:09 EST OK, Hears a problem I recently encountered that I don't understand. (I guess that's why I think it's a problem!) I have opened a window for displaying a graphics image (to allow clipping a section of the image) and I wanted the window to be as large as possible so the maximum amount of the image would be visible. So I created a window the size of the entire screen, not just the area below the menu. Now everything works OK except when I go to click on the "CLOSE" button to exit. The button inverts, indicating selection but I don't exit until I move the mouse below the area normally allotted for the menu. Any clues why this happens? This is on a Mega 4 with TOS 1.4. The code is written in Laser C. Creating the window the size of the area below where the menu would be results in everything working as expected. -Craig W. Daymon P.S. One more thing, closing a window that fills the entire screen does not result in the entire screen being redrawn. The window Title bar remains at the top of the screen. ------------ Category 3, Topic 12 Message 178 Thu Mar 15, 1990 C.F.JOHNSON at 16:57 PST Craig, That happens because the area at the top of the screen is reserved for use by the GEM Event Manager. You can see this behavior in lots of programs; take any program that uses a menu bar and evnt_multi to get keyboard input. If you move the mouse into the top line (the menu bar line) and hit a key, the Event Manager will not send the MU_KEYBD message along to the application until you move the mouse back into the desktop's "work area". The top area doesn't get redrawn either, because that area is outside the "work area" of the desktop's window. (Window zero.) There's really no way to do what you're trying to do, and still use standard GEM calls. (Which is why you haven't seen any ST programs with *real* full- screen windows before...) - Charles ------------ Category 3, Topic 12 Message 179 Fri Mar 16, 1990 D.S.HARRISON at 18:51 CST If you did a wind_update(BEG_MCTRL), then the event manager would treat the menu bar area like the rest of the screen. Unfortunately, your window controls in that area would cease to function, at least through GEM. Does anyone know of a possible bug in GEM related to non-detection of mouse-up events, until the mouse is moved? I'm noticing that in a program, and I've also seen it in the GEM Desktop, where sometimes if you click on the desktop background and the rubber rectangle appears, you can release the mouse button, without moving the mouse, and the rubber rectangle will remain until the mouse is moved. -Doug ------------ Category 3, Topic 12 Message 180 Fri Mar 16, 1990 C.DAYMON at 21:05 EST Doug, I think that problem has been corrected in newer versions of the OS, but I know it existed in version 1.0. Something to do with the mouse not returning information until the mouse is moved. Maybe the information is packeted so that motion returns the button state, but a change in button state doesn't generate a separate message. ANyway, I know of the problem, but forget the exact cause. Charles, Then it sounds to me like this is a bug in GEM. (Or Atari GEM.) I haven't enabled a menu or even drawn one on the screen and GEM should ONLY be responding to those possible states that I have activated. (Which is just a window with sliders and a CLOSE button.) I realize that there are still accessories active in the system, but again this should not matter since a menu must be available for an accessory to be activated. (Maybe the link to the display of the menu has not been properly established?) I can probably test and see if I get the same response if ALL accessories are removed. It's just annoying because I really wanted to maximize the window display. Thanks for the help. -Craig W. Daymon ------------ Category 3, Topic 12 Message 181 Fri Mar 16, 1990 D.S.HARRISON at 22:19 CST Craig, That's what I thought; it seems to be at a lower level than the AES, because sampling the Line-A variables doesn't help. About your menu bar problem: I found exactly the same thing you did, that is, it doesn't seem to matter whether a menu has been displayed or not. The only solution I found was the wind_update() call, but for your purposes, that's probably not acceptable (unless you feel like rolling your own window controls). -Doug ------------ Category 3, Topic 12 Message 182 Sat Mar 17, 1990 DOUG.W at 01:36 EST I think "GEM Law" states that all GEM applications will have a menu bar. --Doug ------------ Category 3, Topic 12 Message 183 Mon Mar 26, 1990 RHFACTOR at 01:30 EST Hello GEM Gurus, I'd like to post a question to you all, though this may not be a GEM one. I've been asking all around, hope maybe this might be the right place. When the ST is booted, call a couple of clicks on the Drive 'A' icon opens a window displaying the directory. AT the top of the window is displayed the number of bytes used in so-many-number of items. Question: Where in the ST is this information gotten from. Specifically, how does it know how many files are on disk. My predicament: how to tap into this info. I'm working with GFA 3.07, is there a peek or bios call that can be read that tells how many files are on disk. It seems pretty slack that I would have to read the DIR into an array, and increment a counter to make sure that my program does not try to save more than 112 files to a disk. I've have a disk that about 116 files where attempted to save, and the data turned to scrambled eggs. Any ideas or suggestion! Thanks! Ron ------------ Category 3, Topic 12 Message 184 Mon Mar 26, 1990 JLS [John STanley] at 03:21 CST Ron, there's no single call to get the number of files on a single disk. However, I feel compelled to point out that you're certanly not limited to 112 files per disk.... Just put your files into a folder and your folder directory will expand until you run out of space on-disk.. (for which a function call does exist (although it's slow unless you're using TOS 1.4 or a "diskfree" enhancement TSR program)). BTW, the info at the top of the window on the desktop is -not- the number of files-on-disk. It's the number of files in the directory currently being shown. Since subdirectories are allowed, you can have many other file areas (subdirectories) on the disk that aren't included in the "xxxx bytes in xx items" line in the window. BTW2, the info in the window line is determined by reading the directory, counting the files, and adding up the sizes of all the files. BTW3, your problem with writing "too many files" to the root directory of a disk is most likely caused by using a non-standard disk-formatter program that put bogus info into the structure table stored on-disk that the ST uses to figure out where to store stuff... What formatter did you use for that specific disk? BTW4, this whole line of discussion really has nothing to do with "GEM" questions and possibly should be moved into a new topic by Darlah or one of the other sysops... ------------ Category 3, Topic 12 Message 185 Sun Apr 01, 1990 V.BURTON4 at 15:27 MDT Hello, All, I just downloaded MONSTER.ARC, which emulates a moniterm monitor on any S ST with TOS 1.4 or newer. I would like to know how to tell GEM that you are working with a larger resolution, which apparently MONSTER does. This would be great for a GDOS program I'm working on! thanks! BTW, I'm using GFA 3.07 ------------ Category 3, Topic 12 Message 186 Tue Apr 03, 1990 GRIBNIF at 14:58 EDT In order to get the AES portion of GEM to use a new screen size, you have to change a few of the Line A variables that the system maintains. The only catch is that you have to do it *before* GEM initializes, which means it has to be done from a program that runs from the AUTO folder. This is not the kind of thing that is well-documented, and not for the faint of heart. If you'd like to experiment with it, however, you should have a look at one of the various documents on the "negative offset Line A variables", like the one called SALAD that is supplied with the developer kit from Atari. Dan ------------ Category 3, Topic 12 Message 187 Tue Apr 03, 1990 DOUG.W at 15:24 EDT Be sure to change ALL of the appropriate variables, or you'll get strange results. --Doug ------------ Category 3, Topic 12 Message 188 Wed Apr 04, 1990 V.BURTON4 at 18:58 MDT Thanks for the info! Another question, does anyone know of a PD Icon editor editor, I'm using the resource construction program that comes with AGFA Basic 3.07, and it says that Icon editors are available. cant seem to find one on GENIE, though. . . ------------ Category 3, Topic 12 Message 189 Sat Apr 07, 1990 BRIAN-G at 21:55 EDT Got a question on GFA and Gem. Even if you dont know GFA you may be able to answer so please read. Doing something similar to a file selector. Window type thing but will be client names. What kind of a dialog do you use. I need to single or double click on the client name as well as ok and canel buttons plus edit fields. Closet I come is touchext on the names but what about double click. If I call event_multi just after a form do and set button and timer, event multi ends immidately with a button event. (I do wait for the button to raise after touchexit). How do I clear the event from FORM_DO. And then I set the name as select and OBJC_DRAW but name doesnt redraw. I have to redraw the parent to. In GFA there is a Hybrid FORM_BUTTON. Cant get it to work even remotely. Also in windowing WIND_CALC doesnt return the right Height. It gets the other values right though. WIND_GET returns same values. Why have WIND_CALC when WIND_GET also perform similar functions. Jeez. Is that enough to complain about? Been saving them up trying to solve on own. Somebody please Brian Gantzler ------------ Category 3, Topic 12 Message 190 Thu Apr 12, 1990 J.HARRIS32 at 19:44 PDT How can you find the original memory size in cases where Ramdisks or other utilities have installed themselves at the top of memory and changed the pointers? Can $424 (memcntlr) be used for that purpose, and if so, what value does it contain for 2M, 4M, and higher? Thanks, John ------------ Category 3, Topic 12 Message 191 Fri Apr 13, 1990 B.MCCORKLE at 18:47 CDT I read an earlier message that referred to the line a call to M_HID_CT, that allowed access to the number of times the mouse was hidden. Can anyone give the offset of M_HID_CT? Thanks, Brian McCorkle ------------ Category 3, Topic 12 Message 192 Sat Apr 14, 1990 DOUG.W at 00:46 EDT Brian G., if you are looking for single or double-clicks, don't use form_do. Simply use form_draw to put the dialog on the screen then use evnt_button (or evnt_multi) to get the mouse clicks. When you get a click, see if it was a single- or double-click, and find out what object was under it (objc_find). --Doug ------------ Category 3, Topic 12 Message 193 Sat Apr 14, 1990 C.HARVEY at 09:57 EDT re: M_HID_CT -- It is a word located at offset -596 (-$254) in the LineA variable table. Compute's Atari ST vol 3 has all these goodies and much more. Craig ------------