home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 2: PC
/
frozenfish_august_1995.bin
/
bbs
/
d09xx
/
d0938.lha
/
Angie
/
Angie.doc
< prev
next >
Wrap
Text File
|
1993-12-20
|
38KB
|
918 lines
----------------------------------------------
Angie 1.6 (4.11.93) ⌐ Franz Schwarz - Giftware
----------------------------------------------
ANother Great Intuition Enhancer - Commodity
Written & ⌐ 1993 by
Franz Schwarz
Mⁿhlenstra▀e 2
D-78591 Durchhausen, Germany
Uucp: Franz_Schwarz@mil.ka.sub.org
Fido: 2:2476/506.18
GUI created with assistance of GadToolsBox 37.300
Since Angie is Giftware you are encouraged to send the
author a present, money, a postcard, etc. if you use it.
table of contents
-----------------
preface
ATTN. lazy boys and girls - WHAT EVERYONE SHOULD KNOW
concepts, program design
the installation procedure
the interactive user interface & the arguments passed on startup
how to define a hotkey
The various hotkey actions
programming info, implementation details
program history
final notes
contacting the author
credits
preface
-------
Angie is a nice name as well as a terrific song by the Rolling Stones.
From now on, this name is to be remembered in the Amiga community as well:
Angie, i.e. this software's name is an acronym for
ANother Great Intuition Enhancer
ATTN. lazy boys and girls - WHAT EVERYONE SHOULD KNOW
-----------------------------------------------------
If you have other commodities than Angie shuffle screens on hotkeys,
you ought to define pseudo hotkeys with action 'NoKeyActivate' for
those hotkeys. These pseudo hotkey definitions keep Angie from getting
mixed up when shuffling screens with these hotkeys consecutively if the
global Angie switch 'Key screen activation' is on. Note however that
these pseudo hotkey definitions need commodities.library V38 (=WB2.1)
or higher to work. For Intuition screen shuffling with lcommand m/n,
the two necessary pseudo hotkey definitions are:
'lcommand -repeat -shift -alt -control -capslock m' &
'lcommand -repeat -shift -alt -control -capslock n'
(action = 'NoKeyActivate')
You ought to set the 'NoScrAct' attribute for all of your hotkey
definitions that shuffle screens or retrieve windows like the
'HuntWindow', 'LastActive', 'LastActiveScr' actions.
Note for users upgrading from versions older than 1.4: There exists
A NEW 'Custom' BASE ACTION that can be used to EXECUTE DOS COMMANDS
and to INSERT INPUT EVENTS into the input stream.
The STRING GADGETS of Angie have SPECIAL EDITING FEATURES: 'ESC'
cancels the editing operation, and for the 'Edit Hotkeys' & 'Action'
gadgets, the CURSOR UP/DOWN KEYS have a special functionality.
If you start Angie from shell, all arguments that have values
assigned need to be surrounded by quotes, e.g. "CX_PRIORITY=127"
instead of just CX_PRIORITY=127
concepts, program design
------------------------
In fact, the Angie commodity enhances Amiga's unique Intuition
graphical user interface in many ways. But what is even better: It
is thoroughly customizable by the user - i.e. YOU; thus you have
the ability to adapt it to your personal taste and likes in almost
any way whatsoever. This is accomplished by providing you with
complete user control of almost all of Angie's significant
characteristics from within a nitfy graphical user interface (and
save them for later retrieval from there, of course)
Amongst Angie's capabilities there are automatic window hunting
(i.e. active screen and active window to front, adjusting the
display of over-sized autoscroll screens) as provided by J÷rg
Bublath's HuntWindow, retrieval of the last active window & the last
active screen on hotkey, remembering & retrieval the last active
window of all screens (similar to Tron's TWA), and a hitherto unique
'Key screen activation' feature that activates the last window
remembered (or the window under the mouse, or the screen's frontmost
window if none is remembered) *if, and only if* the active window is
not placed in one of the at least partially visible screens and a
key downstroke event is rushing in from the input device. This
feature has proved *very* ergonomic and nifty (in deed, it was
actually the motivation for me to embark on this project;-))
Moreover, Angie can automatically raise the priority of the task
that owns the currently active window (and restore it when the
window becomes inactive, of course) However, the best is that Angie
(don't you forget the triad: the nice name, the terrific Rolling
Stones song and the neat commodity we are talking about...) offers
you about sixty actions that may be triggered by any number of
arbitrary commodities input descriptions! In conjunction with the
possible 'Window To Front' attribute that may be bound to any hotkey
and that affects all hotkey operations with windows involved (except
'Hunt', 'ToFront' & 'ToBack') of course) and in combination with the
'Hunt on wintofront hotkeys' you get roughly one hundred and thirty
different actions you may map to any input event the version of
commodities.library you have installed in your system can process.
These actions include execution of arbitrary dos command lines and
insertion of arbitrary input events with arbitrary delay times
between inserting two events.
Angie can take advantage of several V39 Intuition / GadTools and V38
Commodities features but operates well with V37 Intuition/ GadTools/
Commodities, too.
the installation procedure
--------------------------
What installation procedure? - Just copy Angie and its icon to your
SYS:WBStartup directory.
the interactive user interface & the arguments passed on startup
----------------------------------------------------------------
The GUI conforms to Commodore's User Interface Style Guide, thus it should
be mostly intuitive and self-explanatory to the User who is familiar with
Commodore's commodities and preferences editors supplied with the operating
system. The usual commodities arguments 'CX_PRIORITY, CX_POPUP & CX_POPKEY
are supported.
Notez-bien: If you start Angie from shell, all arguments that have values
assigned need to be surrounded by quotes, e.g.
"CX_PRIORITY=127" instead of just CX_PRIORITY=127
Following now is a brief description of the GUI elements and Angie's
arguments:
The checkbox toggle gadgets:
'Hunt always' - decides on whether or not Angie shall automatically hunt
(i.e. bring the active window & the active screen to front & adapt
the active screen's position so that as much of the active window as
possible is visible. This screen position adapting is performed
whenever the active window changes or its position or size changes.
It is done in a way that minimum screen move takes place. In case the
window is too large to fit in the actual display, the screen is moved
so that the left/top edge of the window is displayed in the left/top
edge of the visible portion of the screen - except for backdrop windows,
where it is only ensured that the screen's display clip is completely
filled with the screen's data (i.e. if the screen is dragged down, it
will reposition, otherwise not). This action is deferred until the
left mouse button and its keyboard equivalent (lalt amiga) are released.
The argument for this toggle is 'HUNTMODEALWAYS', it defaults to 'YES'
'Hunt on wintofront hotkeys' - if enabled, Angie performs an automatic
hunt (see above) operation whenever it issues a hotkey-bound
Window_To_Front.
The corresponding argument is 'HUNTMODEWFRONT' and defaults to 'YES'
'Hunt: set default public screen' - toggles the automatic declaration of
the active window's screen as the system's default public screen
whenever a hunt (see above) operation is done. If the active screen
is no public screen, the Workbench screen is set as default public
screen.
The argument for this toggle is 'HUNTMODESETDEFPUBSCR' and defaults to
'NO'
'Key screen activation' - (de)activates a nifty, hitherto unique
feature that activates the last active window of the screen under
the mouse remembered (or the window under the mouse, or the
screen's frontmost window if none is remembered) *if, and only
if* the active window is not placed in one of the at least
partially visible screens and a key downstroke event rushes in from
the input.device. This feature has proved very ergonomic and nifty,
especially if immediate activation after screen shuffling is not
appropriate (indeed, this feature was actually the motivation for me to
embark on this project;-))
'KEYACTIVATE' is the argument for this, and defaults to 'YES'
'Raise Active WinTask's Pri' - determines whether Angie should always
raise the priority of the task, the active window is associated with,
by one, and restore the old priority on deactivation if the priority
hasn't been changed by someone else in the meantime.
The correct argument is 'RAISEWINTASKPRI', default is 'YES'
'Shuffle backdrop windows' - decides whether backdrop windows should be
considered when performing hotkey-bound window-shuffling or not.
The default is 'NO', the argument is named 'SHUFFLEBACKDROP'.
'Pop GUI on startup' - if you want Angie's GUI window to pop open when
Angie is launched, set this toggle, otherwise switch it off.
The appertaining argument is 'CX_POPUP' and defaults to 'YES'.
The sliders have the following significance:
'Stable time' - this one is used to adjust the time in milliseconds, the
snoop task expects the active window, the active screen, the active
window's size and its dimensions to remain unchanged until it signals a
'change' operation to the main task. The valid range is -1 up to 1000,
where -1 is a magic value that signifies that whenever the snoop task
detects a change, it immediately signals the main task. All positive
values including 0 require the snapshot data to remain unchanged for at
least two snoops and a minimum of 'Stable time' milliseconds.
The argument for this characteristic is called 'STABLETIME' and defaults
to 20.
'Snoop delay' - this is the delay time in milliseconds, the SnoopTask
should wait before two snoops. The valid range is 10..1000. Note that
the accuracy of this delay is bound to the frequency of the vertical
blanking interrupt, which is usually 50Hz PAL, 60Hz NTSC, 70Hz
EURO36/EURO72/SUPER72, that means, you'll never get more than 50 snoops
per second for PAL, never more than 60 snoops per second for NTSC and
never more than 70 snoops per second for EURO36/EURO72/SUPER72.
Note that allocating a CIA timer for this job to gain accuracy would
be IMHO a waste of system resources. Huge values for this characteristic
yearn for a '-1' 'Stable time' setting.
The argument name for this value is 'SNOOPDELAY' and defaults to 30.
'Screen steps' - use this slider to set the quantity a screen should be
moved with the 'MoveScrXXX' hotkey actions. The quantity is provided
as the 'Screen steps'-th part of the display clip of the active screen.
The range for this quantity is 1..50
This argument defaults to '5', its name is 'SCRMOVESTEPS'
'Window steps' - this is the same as above except that this value is
applied for window moving and dimensioning via the 'MoveXXX',
'ExpandXXX' and 'ShrinkXXX' hotkey actions. The range is 1..50,
too.
The corresponding argument is named 'WINMOVESTEPS' and defaults to 5
'CX priority' - use this to set Angie's commodity broker's priority.
Note well that this action takes effect immediately - the effort to
achieve this in a documented way was quite high, by the way.
The argument for this is called 'CX_PRIORITY' and defaults to 0
There's one separate text entry gadget, named 'Window shuffle pattern'
where you can enter the pattern to be applied to windows' names when
doing a window shuffle ('ActivateNext' / 'ActivatePrev') hotkey action.
Windows whose titles don't match to the pattern are skipped.
The argument name for this setting is 'SHUFFLEPAT' and defaults to '#?'
(which matches all names, incl. an empty name)
The other gadgets form a system to maintain the action hotkey list of
Angie:
Use the 'ADD' gadget to add new hotkeys to the list, the 'DEL' gadget
to delete hotkeys from the list, the 'UP' gadget to move an entry up
in the list, the 'DOWN' gadget to move an entry down in the list,
use the listview to browse through the hotkey list and to select the
active hotkey, the change operations will affect. The change
operations consist of selecting the 'Action' gadget, where you can
select the desired base action for the hotkey. This text entry gadget
has some special editing functions: You can use the cursor up/down
keys to browse through the different base actions. If the contents
of the gadget do not reflect an exact, case-insensitive match with
a valid base action type, the 'Custom' type is considered to be
active. If not preceded by a '#' or '~' character, the contents
of the gadget signify a dos command line that shall be executed
when the hotkey is triggered. If the text's first character consists
either of '#' or '~', the following text is considered as an input
events description sequence that shall be inserted into the system's
input stream when the hotkey is triggered. You can select the
desired base action by selecting the respective entry in the
'Edit╖Hotkey╖Type', too, because shuffling through approx. sixty
entries might be irksome, IMHO. Another change operation is the
selection of the 'Attrs' gadget. You can assign several attributes to
the hotkey entry with this gadget: If the 'WinFront' attribute
is enabled, the hotkey action will cause an automatic WindowToFront()
of the processed window, if a window is affected by the hotkey action,
and the base action is not 'ToBack'. This attribute is always
considered to be on for the 'Hunt', 'ToFront' and 'CX_POPKEY' base
actions. The second attribute is 'Repeatbl' and means that matching
rawkey events with the 'repeat' qualifier set shall be normally
processed rather than just being filtered, which is the default. This
attribute is always considered to be on for the 'Filter' and
'NoKeyActivate' base actions. The last attribute is the 'NoScrAct'
attribute and inhibits the hotkey from triggering an automatic
'Key screen activation' action (see above). This attribute
is enforced for the 'NoKeyActivate' base action. It is extremely
useful for simple screen shuffling action hotkeys where otherwise the
next shuffle event would cause Angie's Hunt (see above) driver to mix
up screens. For the 'HuntWindow' base action it is recommended to set
this flag in all predictable cases, too. Apart from that, it may be
useful to set this flag e.g. for the 'LastActive' and 'LastActiveScr'
base actions. Note that the 'Attrs' gadget does not always reflect
the actual attributes, since Angie's enforced settings (see above) are
not taken into account after cycling the Attrs gadget. However, they
are always correctly displayed in the 'Edit╖Hotkey╖Type->Attributes'
submenu, which can be used to set the attributes, too. The most
important change operation however is the listview's string gadget
where you can modify the commodities input description for the hotkey.
If you enter an invalid input description, the former description is
reused instead of the one you entered. Note that you can leave the
string gadget by pressing cursor up/down, too: The cursor up/down keys
are equivalent to pressing return within the string gadget and right
afterwards pressing cursor up/down.
The Project menu is intuitive:
-Save╖Settings saves the current settings into the PROGDIR:Angie icon
-About brings up a requester with information about Angie. Note that
while the About requester is displayed, Angie is in inactive state.
-Hide closes the GUI window
-Quit causes Angie to shut completely down
The underscored character of the gadget text signifies the key shortcut for
selecting the respective gadget, additionally the cursor up / down keys are
used to scroll through the hotkeys in the listview, the DEL key is used to
delete the current entry in the listview, the ESCape key or the close
gadget is used to close Angie's GUI window, and the 'Z' key or the Zoom
gadget is used to (un-)iconify the GUI window.
There exists one common non-standard editing feature of all of Angie's
text entry gadgets: Pressing 'ESC' leaves the gadget by discarding
all changes made to it, i.e. a sort of 'CANCEL' operation.
how to define a hotkey
----------------------
The following text is courtesy Stefan Becker and describes the structure of
the currently defined commodities input descriptions:
How to define a Hot Key
************************
This chapter describes how to define a Hot Key as an Input
Description String, which is then parsed by Commodities. Each time a
Hot Key is activated Commodities generates an event which is used by
ToolManager to activate Exec objects or to toggle Dock objects. A
description string has the following syntax:
[<class>] {[-][<qualifier>]} [-][upstroke] [<key code>]
All keywords are case insensitive.
`class' describes the InputEvent class. This parameter is optional
and if it is missing the default `rawkey' is used. See InputEvent
classes.
Qualifiers are "signals" that must be set or cleared by the time the
Hot Key is activated; otherwise no event will be generated. For each
qualifier that must be set you supply its keyword. All other qualifiers
are expected to be cleared by default. If you want to ignore a
qualifier, just set a `-' before its keyword. See Qualifiers.
Normally a Hot Key event is generated when a key is pressed. If the
event should be generated when the key is released, supply the keyword
`upstroke'. When both press and release of the key should generate an
event, use `-upstroke'.
The key code is depending on the InputEvent class. See Key codes.
Note: Choose your hot keys *carefully*, because Commodities has a
high priority in the InputEvent handler chain (i.e. will override
existing definitions).
InputEvent classes
===================
Commodities supports most of the InputEvent classes that are
generated by the input.device. This section describes those classes
that are most useful for ToolManager Hot Keys.
`rawkey'
This is the default class and covers all keyboard events. For
example `rawkey a' or `a' creates an event every time when the key
"a" is pressed. You must specify a key code for this class. See
rawkey key codes.
`rawmouse'
This class describes all mouse button events. You must specify a
key code for this class. See rawmouse key codes.
`diskinserted'
Events of this class are generated when a disk is inserted in a
drive. This class has no key codes.
`diskremoved'
Events of this class are generated when a disk is removed from a
drive. This class has no key codes.
Qualifiers
===========
Some keyword synonyms were added to Commodities V38. These are
marked with an `*'.
`lshift', `left_shift' *
Left shift key.
`rshift', `right_shift' *
Right shift key.
`shift'
Either shift key.
`capslock', `caps_lock' *
Caps lock key.
`caps'
Either shift key or caps lock key.
`control', `ctrl' *
Control key.
`lalt', `left_alt' *
Left alt key.
`ralt', `right_alt' *
Right alt key.
`alt'
Either alt key.
`lcommand', `lamiga' *, `left_amiga' *, `left_command' *
Left Amiga/Command key.
`rcommand', `ramiga' *, `right_amiga' *, `right_command' *
Right Amiga/Command key.
`numericpad', `numpad' *, `num_pad' *, `numeric_pad' *
This keyword *must* be used for any key on the numeric pad.
`leftbutton', `lbutton' *, `left_button' *
Left mouse button. See note below.
`midbutton', `mbutton' *, `middlebutton' *, `middle_button' *
Middle mouse button. See note below.
`rbutton', `rightbutton' *, `right_button' *
Right mouse button. See note below.
`repeat'
This qualifier is set when the keyboard repeat is active. Only
useful for InputEvent class `rawkey'.
Note: Commodities V37 has a bug which prevents the use of
`leftbutton', `midbutton' and `rbutton' as qualifiers. This bug is
fixed in V38.
Key codes
==========
Each InputEvent class has its own key codes:
Key codes for InputEvent class `rawkey'
----------------------------------------
Some keywords and synonyms were added to Commodities V38. These are
marked with an `*'.
`a'-`z', `0'-`9', ...
ASCII characters.
`f1', `f2', ..., `f10', `f11' *, `f12' *
Function keys.
`up', `cursor_up' *, `down', `cursor_down' *
`left', `cursor_left' *, `right', `cursor_right' *
Cursor keys.
`esc', `escape' *, `backspace', `del', `help'
`tab', `comma', `return', `space', `spacebar' *
Special keys.
`enter', `insert' *, `delete' *
`page_up' *, `page_down' *, `home' *, `end' *
Numeric Pad keys. Each of these key codes *must* be used with the
`numericpad' qualifier keyword!
Key codes for InputEvent class `rawmouse'
------------------------------------------
These keywords were added to Commodities V38. They are not available
in V37.
`mouse_leftpress'
Press left mouse button.
`mouse_middlepress'
Press middle mouse button.
`mouse_rightpress'
Press right mouse button.
Note: To use one of these key codes, you must also set the
corresponding qualifier keyword, e.g.
rawmouse leftbutton mouse_leftpress
Examples for Hot Keys
======================
`ralt t'
Hold right Alt key and press "t"
`ralt lalt t'
Hold left *and* right Alt key and press "t"
`alt t'
Hold either Alt key and press "t"
`rcommand f2'
Hold right Amiga key and press the second function key
`numericpad enter'
Press the Enter key on the numeric pad
`rawmouse midbutton leftbutton mouse_leftpress'
Hold middle mouse button and press the the left mouse button
`diskinserted'
Insert a disk in any drive.
************ end of Stefan Becker's text *****************************
The various hotkey actions
--------------------------
Now, let's discuss the various hotkey actions:
CX_POPKEY:
Pop Angie's GUI window open, activate and hunt it if it is already open.
HuntWindow:
Perform a hunt action (see above) right now.
Activate:
Activate the window under the mouse
ActivateNext:
Shuffle forward through the current active screen's window list
ActivatePrev:
Shuffle backward through the current active screen's window list
ActivateBackdrop:
Activate the active screen's first backdrop window
ActivateFrontScr:
Activate the frontmost window on the frontmost screen.
LastActive:
Activate the window that was active right before the current active
window if it still exists, In case it doesn't exist any more, but
it was opened on another screen that still exists, this action
activates that screen's frontmost window.
LastActiveScreen:
Activate the last active window of the last active screen, if it still
exists. If it doesn't exist anymore, but the screen on which it was open
still exists, then activate the frontmost window on that screen.
ToFront:
Pops the currently active window to front
ToBack:
Moves the currently active window to the back
AdaptWindow:
This is something like an 'inverted hunt' action: the active window is
(if necessary) moved and shrunk in a way that it fits into the currently
displayed portion of its screen.
CenterWindow:
The active window is centered within the currently displayed portion of
its screen.
Zip:
The active window is zipped (equivalent to selecting the Zoom gadget)
Close:
A selection of the active window's close gadget is emulated
Max:
The active window's position and size are changed to exactly fill the
screen's visible portion.
MaxWidth:
The same as for above, but only horizontally, and if at least a part of
the window would be visible in the screens display portion with
consideration to the vertical window position & dimension.
MaxHeight:
Like MaxWidth, but now vertically.
MinWin:
The active window is shrunk to its minimum dimensions and moved into the
lower right edge of the screen's visible portion
MoveLeft / MoveRight / MoveUp / MoveDown:
Move the active window in the respective direction, the move quantity is
derived from the 'Window steps' setting.
UpperLeft / LowerLeft / UpperRight / LowerRight:
Place the active window in the respective edge of the screen's visible
portion
ExpandWidth / ExpandHeight / ShrinkWidth / ShrinkHeight:
Expand / shrink the active window's width / height. The quantity
to expand /shrink is derived from the 'Window steps' setting.
DoubleWidth / DoubleHeight / HalveWidth / HalveHeight:
Double / halve the active window's width / height
ActivateNextScreen / ActivatePrevScreen / ActivateWBenchScreen /
ActivateDefPubScreen:
Shuffles the screen list forward / backward, resp. pops the Workbench
screen / default public screen to the front and activates the last
active window of the new front screen or the frontmost window of the
screen instead. If the 'Hunt: set default public screen' toggle is
set and either the 'Hunt always' toggle is set, or both, the 'Hunt on
wintofront hotkeys' toggle is set and the 'window to front' attribute
is set for the hotkey, it will also make the new front screen the
default public screen even if no windows are open on it.
NextScreen / PrevScreen / WBenchScreen / DefPubScreen:
the same as for the corresponding ActivateXXXXScreen entries except
that no window activation and no default public screen definition
magic takes place.
ScrollScrLeft / ScrollScrRight / ScrollScrUp / ScrollScrDown:
scrolls the active screen in the respective direction. The scroll
quantity is derived from the 'Screen steps' setting.
UpperLeftScr / LowerLeftScr / UpperRightScr / LowerRightScr /
ShowScrCenter:
makes the respective portion of the active screen visible in its
display clip.
ScreenTop:
aligns the top edge of the active screen with the top edge of its
display clip
SetDefPubScreen:
makes the active screen the default public screen. If the frontmost
screen is a screen with no windows open, and the active screen is
completely invisible, the frontmost screen is used instead for this
operation. If the screen is not a public screen, the Workbench screen
is set as the new default public screen.
Filter:
This is a real nop operation: It does nothing at all. Thus, the
only job of this action is to filter the respective input
sequences out of the input stream.
NoKeyActivate:
This action only works if your system runs commodities.library
V38 or better - for V37 commodities.library it does nothing at all.
All input events matching this action's input description are excluded
from triggering 'Key screen activation' (see above). This is useful to
keep other commodities / input handlers that shuffle screens (e.g. for
Intuition / KCommodity:
'lcommand -shift -control -alt -repeat -capslock [m|n]')
from fooling Angie's snoop code in some cases when screens are
consecutively shuffled.
** Starting from Angie 1.4 (28.10.93), Angie has another mighty base **
** action for executing Dos commands and inserting input events: **
Custom:
This action is very versatile: If the first character of the action
string is either '#' or '~', the following contents of the 'Action'
gadget are considered to be INPUT DESCRIPTION DATA. In case of the '#'
introducer, a positive (incl. 0) number may be provided right after
the '#' introducer. This number ends either with the last digit or
with one of the ' ' / '~' delimiters. It is normalized into the range
0..999 and signifies the time in milliseconds to delay after inserting
each of the generated input events. In case of the '#' introducer,
this delay defaults to 50 milliseconds. For the '~' introducer, this
delay is always considered 0. The input description data consist of
ordinary plain ASCII text that may furthermore contain the following
ESCape codes:
\n - linefeed (inserted as carriage return)
\r - carriage return
\0 - nul
\t - horizontal tab
\f - formfeed
\xff - ASCII code 0xff (f represents an arbitrary hex nibble)
\' - apostrophe
\" - quotation mark
\< - left angled bracket '<'
\\ - backslash '\'
Moreover, separate input events may be specified according to Commodities'
ParseIX() syntax within angled brackets. The line
'<lcommand a><tab>Hello!<alt -capslock numericpad enter>\x06\t\5*x\<12\n'',
for example, represents valid input description data.
Plain Linefeeds (0x0a) are automatically converted into carriage returns.
In addition to this, carriage returns are inserted as key presses of the
plain, simple carriage return rawkey unless the system default keymap
doesn't map that rawkey to carriage return.
In case the first character of the 'Action' data contents is none of the
input description sequence introducers ('~', '#'), the whole text
represents a DOS COMMAND LINE that is executed asynchronously whenever
this custom hotkey is triggered. The priority of the launched task will
be the same as the priority, Angie was started with - the same goes for
the stack size, current directory and the dos command search path.
Input and Output are set to an interactive console window with the
WAIT/AUTO/CLOSE attributes, its position and alternative ('zoom')
position are optimized for the currently displayed portion of the default
public screen. The console will open on the default public screen at
the very moment when the first input/output operation takes place.
If you set the 'WinFront' attribute for the hotkey, the default public
screen pops to front immediately when triggering the hotkey.
Well, that's it - all the actions are described now;-)
programming info, implementation details
----------------------------------------
Angie is completely written in Amiga-Oberon, a superset of a powerful
object-oriented language by Nicolaus Wirth, that offers all the flexibility
and excellent code generation that is needed for Amiga system and
application programming. I tried hard to make Angie conforming with the
User Interface Style Guide, and to make it really free of bugs. I can tell
you that despite having used Oberon runtime checking code (which is
disabled in this official release), Enforcer and Mungwall, this release has
been proved free of any bugs (however, don't blame me if you find one
though: you know Murphy rules...;-^) Especially, I always tried to ensure
that all accesses to system data are protected by the respective official
CBM protocols. Since within interrupts there is no such protocol for
Intuition data structures available, I placed the snooping code for window
hunting, raising of the active window task's priority, remembering of the
last window and all the last windows of a screen, in a child task rather
than within interrupt code.
If you find any bugs or you have any suggestions for improving Angie or
extending its functionality, or if you just want its source code,
you are encouraged to contact the author via electronic mail (preferred)
or snail mail.
If you own a 68000 you may wonder why Angie's snoop task uses quite more
CPU time than you thought it uses (Note however that only Xoper2.4 gives
you reliable information. Former versions of Xoper display much too much
CPU time usage of tasks that are both, frequently switched and don't hold
the CPU for a long time). Well, the solution is as follows: I decided to
make Angie as system-friendly as possible. Angie has to snoop not only the
IntuitionBase->ActiveWindow, but also elements like
TopEdge/LeftEdge/Width/Height/WScreen of the ActiveWindow itself. In a
consistent way, this is only possible within tasks, not interrupts, in
conjunction with the (Un)LockIBase() protocol. However, task switching,
the timer request for delaying, and especially the (Un)LockIBase() protocol
produce an enormous overhead of CPU usage: I measured (on a 68030, OS3.0)
that the snoop code itself only consumes 15% (fifteen) percent of the snoop
task's total CPU usage (total CPU usage is less than 1% @ 30 ms snoopdelay
on 68030, 25Mhz, OS3.0). With the snoop code removed, only the timer IO
and (Un)LockIBase() stub left, the CPU usage of the snoop task was still at
85% of the original CPU usage. With (Un)LockIBase() removed, the snoop
task's CPU usage was at about 45% of the original CPU usage.
program history
---------------
v1.0 20.10.93 [fSchwarz]
v1.1 22.10.93 [fSchwarz] improved setDefPubScreen action
fixed ActivateXXXXScreen, fixed Menu Attrs selection
v1.2 23.10.93 [fSchwarz] doesn't send any closeWindow
event on Close action when window is blocked by
requesters.
v1.3 24.10.93 [fSchwarz] added Edithook for hotkey
definition gadget
v1.4a 29.10.93 [fSchwarz] major code cleanup, now
supports dos command and inputevent insertion type
v1.5a 4.11.93 [fSchwarz] now really uses the frontmost
window of screens instead of just screen.firstWindow;
improved Key Screen Activation handling for screens
without windows
v1.6 4.11.93 [fSchwarz] removed last Intuition stuff from
cxcustom inputhandler - now all accesses to Intuition
structures are safeguarded by official CBM protocols;
enhanced Intuition/GadTools V37 GUI
final notes
-----------
Known Bugs: Currently, no known bugs exist. However, due to the extent of
this project, it is possible that a few bugs are in the code that haven't
turned out yet.
Angie is Giftware. In other words, I strongly encourage you to
send me a small present, a donation, a nice postcard, and so on, if
you appreciate this program and you use it.
Suggestions, comments, bug reports, criticism, praise, etc. are
welcomed, too!
If you want to translate this documentation into other languages, feel
free to do so, add the translation to this archive, and send it to the
author (that is me;-))
Angie is copyrighted and protected by copyright laws all over
the world. Copyright ⌐ 1993 Franz Schwarz.
The author can't be hold liable for any harm that stems from the
usage of this program, no matter whether direct harm or indirect harm.
Angie is freely distributable; it may be published in the Fred Fish
& Amok software collections and in other non-commercial software
collections, including CD-ROM versions of them. Moreover, it may be
spread via electronic data transfer.
Angie may only be distributed in this archive as a whole. It may
be only distributed if the distributor does not claim any copyright on
the Angie archive nor on any files that are compulsorily distributed
with it (i.e. the distributor claims that this archive may not be
distributed separately without those files). Inquiries on exceptions
from these limitations may be submitted to the author.
contacting the author
---------------------
Franz Schwarz
Mⁿhlenstra▀e 2
D-78591 Durchhausen, Germany
Uucp: Franz_Schwarz@mil.ka.sub.org
Fido: 2:2476/506.18
Bank account 951.207 at
KSK Trossingen, Germany, bank ZIP code 643 500 70
Credits
-------
The interactive graphical user interface was created with assistance of
GadToolsBox 37.300 by Jan van der Baard and its Oberon source generator
OG 38.02 by Stefan Kurtz, Thomas Igracki & Kai Bolay.
Have fun, and don't you forget:
Angie is a nice name as well as a terrific song by the Rolling Stones.
From now on, this name is to be remembered in the Amiga community as well:
Angie, i.e. this software's name is an acronym for
ANother Great Intuition Enhancer
Franz 'Blacky' Schwarz
- Girlfriend Is Better - Talking Heads -
PS: This documentation was written in one go in a few hours and has not
been completely checked for mistakes yet- so don't blame me if you find
many mistakes...