How to get both RMB events and menus??

10 posts / 0 new
Last post
alfkil
alfkil's picture
Offline
Last seen: 3 months 1 week ago
Joined: 2011-05-10 22:02
How to get both RMB events and menus??
Topic says it all: I want to be able to have both right mouse button evens from a menu AND use menus in the same window. How is this possible? Surely it is possible, because it is used in applications like DeluxePaint and PPaint. When I use WFLG_RMBTRAP the menu is blocked, and when not I can't right mouse events. Help!
thomas
thomas's picture
Offline
Last seen: 1 day 10 hours ago
Joined: 2011-05-16 14:23
IMHO the only way to get both
IMHO the only way to get both is to change the WFLG_RMBTRAP flag dynamically depending on the mouse position. If the mouse pointer is over an area where you need the right mouse button clicks, set the flag and if the pointer is outside this area, clear the flag.
xenic
xenic's picture
Offline
Last seen: 2 months 1 week ago
Joined: 2011-05-07 04:52
Wouldn't it be easier just to
Wouldn't it be easier just to use the middle mouse button. Personally, I don't like it when I click the right mouse button expecting a program menu or context menu and end up selecting something I didn't expect to be selected. RMB bringing up a menu is pretty much a standard for Amiga programs so why confuse things. There's already enough confusion with ported GUI systems that don't act like Amiga programs. Would a MMB press or Shift-LMB press accomplish what you want? This is all just my personal opinion so don't let it bother you. By the way here is a quote from Heinz Wrobel on the v2.1 Developer CD (Intuition/Hints): It is strongly discouraged to use so called "atomic modifications" of structure fields like updating the ReportMouse() setting WFLG_REPORTMOUSE or changing WFLG_RMBTRAP on the fly. On future PowerPC machines, a single instruction might no longer be atomic. So if there is a function to modify a shared value, use it. Here is a quote from an article on the same CD: WFLG_RMBTRAP is an exception to most fields in Intuition structures because it is legal for an application to directly modify this flag. Note that this change must take place as an atomic operation so that Exec cannot perform a task switch in the middle of the change. If you are unsure your compiler will do this, use a Forbid()/Permit() pair to prevent a task switch. Since the above quotes apply to earlier versions of AmigaOS and the use of "Forbit()/Permit() is discouraged with OS4, it might be wise to ask how to legally achieve an "atomic operation" with OS4. Someone smarter than me will need to answer that question for you.
X1000 - OS 4.1FE
alfkil
alfkil's picture
Offline
Last seen: 3 months 1 week ago
Joined: 2011-05-10 22:02
@thomas Got it, thanks!
@thomas Got it, thanks! Everything works now. @xenic Interesting stuff. At the moment I'll stick to the current solution (no Forbid/Permit) since it seems to work ok.
xenic
xenic's picture
Offline
Last seen: 2 months 1 week ago
Joined: 2011-05-07 04:52
Are you actually changing the
Are you actually changing the flags in the Window structure (setting/clearing the WFLG_RMBTRAP flag) or using SetWindowAttr() to change the WA_RMBTrap attribute? The latter would seem safer to me but I'm no Intuition expert.
X1000 - OS 4.1FE
alfkil
alfkil's picture
Offline
Last seen: 3 months 1 week ago
Joined: 2011-05-10 22:02
I'm using SetWindowAttr(). No
I'm using SetWindowAttr(). No crashes yet, so I think it is safe.
trixie
trixie's picture
Offline
Last seen: 2 weeks 4 days ago
Joined: 2011-02-03 13:58
Quote:Are you actually
Are you actually changing the flags in the Window structure (setting/clearing the WFLG_RMBTRAP flag) or using SetWindowAttr() to change the WA_RMBTrap attribute? The latter would seem safer to me but I'm no Intuition expert.
It IS safer. No direct manipulation of GUI flags in Intuition, please :-) But for ReAction windows created using window.class, SetWindowAttr() is considered obsolete. Same for SetWindowPointer(). The programmer should use SetAttrs() on the window object instead. I know Alfkil is not using ReAction windows in his port but I thought I'd mention it here.
SAM440ep-flex @ 667MHz / 1GB RAM / Radeon 9250 / AmigaOS 4.1 Final Edition Author of WordNet for OS4
xenic
xenic's picture
Offline
Last seen: 2 months 1 week ago
Joined: 2011-05-07 04:52
@trixie How did you find out
@trixie How did you find out that SetWindowAttr() is obsolete? I don't see any mention of it in the SDK Intuition autodocs. It sort of irritates me when I find out that the documentation isn't uptodate and I'm using the wrong functions.
X1000 - OS 4.1FE
trixie
trixie's picture
Offline
Last seen: 2 weeks 4 days ago
Joined: 2011-02-03 13:58
@xenix SetWindowAttr() and
@xenix SetWindowAttr() and SetWindowPointer() are obsolete FOR REACTION WINDOWS created using window.class. It is because such a window is created as a BOOPSI object, and all BOOPSI objects are to be manipulated using SetAttrs() and GetAttrs(). Dedicated functions like SetWindowAttr() and SetWindowPointer() manipulate the GUI elements directly, bypassing the BOOPSI subsystem (and possibly not setting some important stuff in the object). They work but may not in the future. If your window is created the traditional way, that is, through OpenWindowTags(), then there's of course no problem with using SetWindowAttr() and SetWindowPointer().
SAM440ep-flex @ 667MHz / 1GB RAM / Radeon 9250 / AmigaOS 4.1 Final Edition Author of WordNet for OS4
xenic
xenic's picture
Offline
Last seen: 2 months 1 week ago
Joined: 2011-05-07 04:52
@trixie O.K. That makes
@trixie O.K. That makes sense. An old timer like me gets confused between traditional Intuition functions and those that apply to classes. Thanks for the info.
X1000 - OS 4.1FE
Log in or register to post comments