home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Audio 4.94 - Over 11,000 Files
/
audio-11000.iso
/
amiga
/
progrmr
/
exp_src
/
interfac.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-05-13
|
24KB
|
1,052 lines
/* interface.c */
/* the actual interface to the player routine
*/
/* $Author: Espie $
* $Date: 91/05/14 02:29:48 $
* $Revision: 1.25 $
* $Log: interface.c,v $
* Revision 1.25 91/05/14 02:29:48 Espie
* The auto resize was no longer working... Latest
* version hadn't been tested. Put the code in order.
* Added a temporary fix to the asynchronous resize
* problem (window jumping all other the place when
* doing fast resizes).
*
* I should rewrite part of the code to get rid of
* relative coordinates once and for all (maybe...)
*
* Revision 1.24 91/05/12 19:53:21 Espie
* pause handled like other gadgets, no longer special case.
*
* Revision 1.23 91/05/12 15:57:15 Espie
* Minor changes.
* Did not allocate enough points 2*number of point = coordinates,
* so it did abort mysteriously, only when optimized.. sigh.
*
* Revision 1.22 91/05/10 00:03:55 Espie
*
* Corrected NewPropInfo bug.
*
* Revision 1.21 91/05/09 17:35:32 Espie
* pref_xxx added,
* minor modifications in gadget handling.
* hook for appwindow: returns the window now,
* events.c takes care of the signal mask.
*
* Revision 1.20 91/05/08 15:50:50 Espie
* Volume slider now working.
* Warning ! Nothing to add another slider right now.
*
* Revision 1.19 91/05/07 12:12:22 Espie
* *** empty log message ***
*
* Revision 1.18 91/05/07 02:53:53 Espie
* Added smart ``resize window''.
* Will now move the window if anything is amiss.
* Experimented with the GetScreenDrawInfo aspect ratio.
*
* Revision 1.17 91/05/06 23:35:47 Espie
* Completely cleaned up all codes,
* added new entries, like temporary_title/restore_title,
* suppressed obsolete ones. Still needs to get gadgets/borders...
* tight.
*
* Revision 1.16 91/05/05 04:01:26 Espie
* Added the void_title() call.
* Changed minor details.
*
* Revision 1.15 91/05/03 02:49:14 Espie
* Added sizing gadget. Don't like it, so commented it out
* (Intuition spends its time trashing its own borders... not neat.
* Also changed order of gadgets. Load is most important gadget,
* so it is first. Restart and pause are arranged for graphical
* symbols (sigh...) |< and '' .
*
* Revision 1.14 91/05/03 00:42:15 Espie
* Cosmetic changes
*
* Revision 1.13 91/05/02 23:29:50 Espie
* Cosmetic changes. Starting message when no song is loaded yet.
*
* Revision 1.12 91/05/02 11:20:13 Espie
* Handle a variable number of gadget much better.
* Added banner, start_player() conditionnally if there IS a song to play.
*
* Revision 1.11 91/05/02 01:30:28 Espie
* Many changes in the handle events part, simpler than before.
*
* Revision 1.10 91/05/01 00:49:32 Espie
* Fonts working, resizing ok.
*
* Revision 1.9 91/04/30 16:51:03 Espie
* Added a real button for speed.
* Handle font changes a little better...
*
* Revision 1.8 91/04/30 01:48:11 Espie
* Some minor problems with tempo changing not when it should, fixed.
*
* Revision 1.7 91/04/30 00:36:17 Espie
* Stable version III.
*
* Revision 1.6 91/04/30 00:24:56 Espie
* New reset_tempo() command, for using the current state of the speed
* setting when swapping songs.
*
* Revision 1.5 91/04/29 23:52:41 Espie
* Added possibility to load files on the fly.
* Surprisingly simple, even if limited right now
* (I need the possibility to spawn my subtasks,
* that would GREATLY simplify most of the program).
*
* Revision 1.4 91/04/29 15:04:13 Espie
* Small modifications to take advantage of the new interface/audio_soft/audio_hard.
* Corrected a misconception concerning toggleselect gadgets:
* check their state BEFORE waiting for them, and don't assume
* you can keep a copy of their internal state.
* Guaranteed way to get out of touch with intuition...
*
* Revision 1.3 91/04/29 13:03:16 Espie
* Interfaced to new audio_soft.
*
* Revision 1.2 91/04/29 03:52:29 Espie
* A start for a real interface.
* Displays the song title and patterns,
* has boolean gadgets for pause, restart, change speed.
* Misses some imagery yet...
*
* Revision 1.1 91/04/29 02:23:15 Espie
* Initial revision
*
*
*/
#include <exec/types.h>
#include <intuition/intuition.h>
#include <intuition/screens.h>
#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <dos/dos.h>
#include <custom/cleanup.h>
#include <custom/graphics.h>
#include <assert.h>
#include "proto.h"
#include "banner.c"
/* see <custom/graphics.h>
*/
#ifdef SIZE_GADGET
struct saveclip *saveclip;
#endif
/* this is all the parameters we might want to change
* depending on the current screen type
*/
/* the colors. */
UBYTE TEXT, SHINE, SHADOW, HILIGHT, BACKGROUND;
/* the highlighting method for boolean gadgets */
ULONG GAD_HILIGHT;
/* the spacing between graphics elements */
int xspace, yspace;
struct Window *window;
struct Screen *screen;
struct RastPort *rastport;
int sys_interwidth, sys_baseline, scr_interwidth, scr_baseline;
void setup_environment(void)
{
/* get all we can */
screen = window->WScreen;
rastport= window->RPort;
sys_interwidth = rastport->TxHeight + 1;
sys_baseline = rastport->TxBaseline;
scr_interwidth = screen->RastPort.TxHeight + 1;
scr_baseline = screen->RastPort.TxBaseline;
/* colors have changed under 2.0, these are the old Pen Numbers,
* and should provide reasonable defaults */
SHINE = 1;
SHADOW = 2;
TEXT = 2;
HILIGHT = 1;
BACKGROUND = 0;
GAD_HILIGHT = GADGHIMAGE;
xspace = 4;
yspace = 4;
if (running_20())
{
struct DrawInfo *di;
di = GetScreenDrawInfo(window->WScreen);
if (di->dri_Version >= 1)
{
if (di->dri_Flags & DRIF_NEWLOOK)
{
TEXT = di->dri_Pens[textPen];
HILIGHT = di->dri_Pens[hilighttextPen];
SHADOW = di->dri_Pens[shadowPen];
SHINE = di->dri_Pens[shinePen];
BACKGROUND = di->dri_Pens[backgroundPen];
if (SHADOW == SHINE)
GAD_HILIGHT = GADGHCOMP;
}
xspace = 108/di->dri_Resolution.X;
yspace = 108/di->dri_Resolution.Y;
}
FreeScreenDrawInfo(window->WScreen, di);
}
else
/* non interlace screen */
if (screen->Height < 300)
yspace = 2;
}
#define MAX_VOLUME 16
#define REAL_MAX_VOLUME 257
/***
*
* The gadget creation routines.
*
* The basic function are ``object declarations''.
* Since these structures don't change very often,
* storage is static right now
*
***/
/* modify the following constants if you want to add some stuff.
*/
#define N_GAD 6
#define N_BORDER 6
#define N_COORD 36
#define N_INTUI 6
#define M_NUMBER 11
#define N_PROP 1
#define N_IMAGE 0
/* the actual gadget numbers */
#define LOAD_NUMBER 0
#define RESTART_NUMBER 1
#define PAUSE_NUMBER 2
#define SPEED_NUMBER 3
#define MODE_NUMBER 4
#define VOLUME_NUMBER 5
LOCAL struct Gadget g_array[N_GAD], *gad;
LOCAL struct Border b_array[N_BORDER], *border;
LOCAL struct IntuiText lab_array[N_INTUI], *label, *status;
LOCAL SHORT XY_array[N_COORD], *XY;
LOCAL struct PropInfo p_array[N_PROP], *prop;
LOCAL struct Image i_array[N_IMAGE + N_PROP], *image;
/* the fixed messages */
#define M_PAL 0
#define M_SPEED 5
#define M_RESTART 5
#define M_PAUSE 6
#define M_LOAD 7
#define M_STD 8
#define MAX_SPEED 5
#define MAX_MODE 3
LOCAL char *that[M_NUMBER] = {"PAL", "NTSC", "Fast", "Scan", "Slow", "Restart",
"Pause", "Load", "Std", "Old", "New"};
/* the changing message */
/* 30 chars for the song name, + 8 for the numbers --> 40 is plenty enough. */
#define L_STATUS 0
LOCAL char buffer[40];
/* to compute the extent of the display elements */
LOCAL int xmax, ymax;
/* we have to offset everything by the window border */
#define relx(a) (window->BorderLeft + (a))
#define rely(a) (window->BorderTop + (a))
/***
*
* the text display functions
*
****/
LOCAL void setup_status_line(void)
{
label->FrontPen = TEXT;
label->BackPen = BACKGROUND;
/* need JAM 2 for fast updates */
label->DrawMode = JAM2;
label->LeftEdge = relx(4 * xspace);
label->TopEdge = rely(yspace);
label->ITextFont = NULL;
label->IText = buffer;
label->NextText = NULL;
assert(label - lab_array < N_INTUI);
status = label++;
}
/* erase_color()/restore_text(): for cleaning up some text.
*/
LOCAL int oldcolor;
LOCAL void erase_color(struct IntuiText *t)
{
oldcolor = t->FrontPen;
t->FrontPen = 0;
}
LOCAL void restore_color(struct IntuiText *t)
{
t->FrontPen = oldcolor;
}
LOCAL void display_status()
{
PrintIText(rastport, status, 0, 0);
}
/* external hook for audio_soft.c: show whether we have the audio currently,
* or not.
*/
void have_audio(BOOL yep)
{
if (yep)
status->FrontPen = HILIGHT;
else
status->FrontPen = TEXT;
display_status();
}
/***
*
* The gadget creation functions
*
***/
/* init_gads: setup everything for gadget creation */
LOCAL void init_gads(void)
{
int i;
for (i = 0; i < N_GAD; i++)
{
g_array[i].NextGadget = g_array+i+1;
g_array[i].GadgetID = i;
g_array[i].Flags = 0;
}
g_array[N_GAD-1].NextGadget = NULL;
gad = g_array;
XY = XY_array;
border = b_array;
label = lab_array;
prop = p_array;
image = i_array;
xmax = 0;
ymax = 0;
}
/* border creation functions */
LOCAL void point(SHORT x, SHORT y)
{
*XY++ = x;
*XY = y;
assert(XY - XY_array < N_COORD);
XY++;
}
LOCAL struct Border *allocate_border(int npoints, int pen)
{
border->LeftEdge = 0;
border->TopEdge = 0;
border->FrontPen = pen;
border->XY = XY;
border->Count = npoints;
border->DrawMode = JAM1;
border->NextBorder = NULL;
assert(border - b_array < N_BORDER);
return border++;
}
/* setting gadget parameters */
LOCAL void set_pos(int x, int y)
{
gad->LeftEdge = x;
gad->TopEdge = y;
}
LOCAL void set_size(int width, int height)
{
int xx, yy;
gad->Width = width;
gad->Height = height;
xx = gad->Width + gad->LeftEdge;
yy = gad->Height + gad->TopEdge;
if (xx > xmax)
xmax = xx;
if (yy > ymax)
ymax = yy;
}
LOCAL void set_bool(void)
{
gad->GadgetType = BOOLGADGET;
gad->Flags = GAD_HILIGHT;
gad->Activation = GADGIMMEDIATE | RELVERIFY;
}
LOCAL void set_toggle(void)
{
gad->GadgetType = BOOLGADGET;
gad->Flags = GAD_HILIGHT;
gad->Activation = GADGIMMEDIATE | TOGGLESELECT;
}
FORWARD LOCAL struct Border *create_box(int pen1, int pen2);
LOCAL void reduce_container(void)
{
gad->LeftEdge++;
gad->TopEdge++;
gad->Width -= 2;
gad->Height -= 2;
}
LOCAL void set_prop(int maximum, int initial)
{
gad->UserData = create_box(SHADOW, SHINE);
reduce_container();
gad->GadgetType = PROPGADGET;
gad->SpecialInfo = prop;
gad->Flags = GADGHNONE;
gad->Activation = RELVERIFY|GADGIMMEDIATE;
gad->GadgetRender = image;
prop->Flags = AUTOKNOB|FREEVERT|PROPBORDERLESS;
prop->VertBody = MAXPOT / (maximum+1);
prop->VertPot = (initial * MAXPOT) / maximum;
prop->HorizBody = MAXPOT;
}
LOCAL void refresh_prop(struct Gadget *g)
{
DrawBorder(rastport, g->UserData, g->LeftEdge-1, g->TopEdge-1);
}
/* the gadget labels */
LOCAL void init_label(void)
{
label->FrontPen = TEXT;
label->BackPen = BACKGROUND;
label->DrawMode = JAM1;
label->LeftEdge = xspace;
label->TopEdge = yspace;
label->ITextFont = window->WScreen->Font;
label->NextText = NULL;
}
LOCAL void setup_label(int n)
{
init_label();
label->IText = that[n];
gad->GadgetText = label;
assert(label - lab_array < N_INTUI);
label++;
}
/* each button can have the same size */
LOCAL int size_labels(void)
{
int l, needed, i;
needed = 0;
init_label();
for (i = 0; i < M_NUMBER; i++)
{
label->IText = that[i];
l = IntuiTextLength(label);
if (l > needed)
needed = l;
}
return needed;
}
/* more intricate gadget creation functions */
/* this is an ``highlight box'' ala 2.0 */
LOCAL struct Border *create_box(int pen1, int pen2)
{
struct Border *first, *second;
first = allocate_border(3, pen1);
point(0, gad->Height - 1);
point(gad->Width - 1, gad->Height - 1);
point(gad->Width - 1, 0);
second = allocate_border(3, pen2);
second->NextBorder = first;
point(0, gad->Height - 1);
point(0, 0);
point(gad->Width - 1, 0);
return second;
}
LOCAL void set_box(void)
{
gad->GadgetRender = create_box(SHADOW, SHINE);
gad->SelectRender = create_box(SHINE, SHADOW);
}
/* the boxes are shared between gadgets */
LOCAL void same_box(struct Gadget *other)
{
gad->GadgetRender = other->GadgetRender;
gad->SelectRender = other->SelectRender;
}
#if 0
/* this stuff might be used to add a graphic to some gadgets... later */
LOCAL void add_render(struct Border *border)
{
border->NextBorder = gad->GadgetRender;
gad->GadgetRender = border;
}
LOCAL void add_select(struct Border *border)
{
border->NextBorder = gad->SelectRender;
gad->SelectRender = border;
}
#endif
LOCAL void next_gadget(void)
{
assert(gad - g_array < N_GAD);
gad++;
}
LOCAL void setup_gadgets(BOOL req_avail)
{
int width, height, x, y;
/* I want some room for a message
* and for a proportional gadget
*/
x = relx(4 * xspace);
y = rely(2 * yspace + sys_interwidth);
height = scr_interwidth + 2 * yspace;
width = size_labels() + 2 * xspace;
/* these need to get first */
set_size(width, height);
set_box();
/* requester gadget */
if (req_avail)
{
set_pos(x, y);
set_size(width, height);
set_bool();
setup_label(M_LOAD);
next_gadget();
x += width + xspace;
set_size(width, height);
same_box(g_array);
}
/* restart gadget */
set_pos(x, y);
set_bool();
setup_label(M_RESTART);
next_gadget();
/* pause gadget */
x += width + xspace;
set_pos(x, y);
set_size(width, height);
set_toggle();
same_box(g_array);
setup_label(M_PAUSE);
next_gadget();
/* speed gadget */
x += width + xspace;
set_pos(x, y);
set_size(width, height);
set_bool();
same_box(g_array);
setup_label(M_PAL);
next_gadget();
/* ``mode'' gadget */
x += width + xspace;
set_pos(x, y);
set_size(width, height);
set_bool();
same_box(g_array);
setup_label(M_STD);
next_gadget();
/* volume gadget */
x = relx(xspace);
y = rely(yspace);
set_pos(x, y);
set_size(2 * xspace, ymax - y);
set_prop(MAX_VOLUME, MAX_VOLUME);
next_gadget();
xmax+= xspace;
ymax+= yspace;
}
/* changing the window size and title...
* this stuff can also deal with resize gadgets.
*/
LOCAL int xstart = 80, ystart = 40;
LOCAL int xcurrent, ycurrent;
LOCAL char *window_title = "Experiment IV";
#ifdef SIZE_GADGET
LOCAL void delimit(void)
{
WindowLimits(window, 0, 0, xcurrent + window->BorderRight,
ycurrent + window->BorderBottom);
}
#endif
/* safeSizeWindow deals of lots of special cases.
* It tries to enlarge (shrink ?) window by dx, dy,
* moving it around if it can't do it any other way,
* respecting the screen size as it goes.
* You usually pass w->Width and w->Height as current width,
* current height.
* However, for frequent resizes, it is better to keep track
* of the size the window should be, because SizeWindow is actually
* asynchronous.
*/
LOCAL void safeSizeWindow(struct Window *w, int dx, int dy, int cw, int ch)
{
int nw, nh, ddx, ddy;
if (dx > 0)
{
nw = cw + dx;
if (nw > w->WScreen->Width)
{
nw = w->WScreen->Width;
dx = nw - w->Width;
}
ddx = w->WScreen->Width - w->LeftEdge - nw;
if (ddx > 0)
ddx = 0;
}
else
ddx = 0;
if (dy > 0)
{
nh = ch + dy;
if (nh > w->WScreen->Height)
{
nh = w->WScreen->Height;
dy = nh - w->Height;
}
ddy = w->WScreen->Height - w->TopEdge - nh;
if (ddy > 0)
ddy = 0;
}
else
ddy = 0;
if (ddx || ddy)
MoveWindow(w, ddx, ddy);
if (dx || dy)
SizeWindow(w, dx, dy);
}
LOCAL void add_borders(void)
{
safeSizeWindow(window,
window->BorderRight + xmax - xstart,
window->BorderBottom + ymax - ystart, xstart, ystart);
xcurrent = xmax;
ycurrent = ymax;
#ifdef SIZE_GADGET
delimit();
#endif
}
LOCAL void resize(int xnew, int ynew)
{
safeSizeWindow(window, xnew - xcurrent, ynew - ycurrent,
xcurrent + window->BorderRight,
ycurrent + window->BorderBottom);
xcurrent = xnew;
ycurrent = ynew;
#ifdef SIZE_GADGET
delimit();
#endif
}
LOCAL void setup_title(void)
{
SetWindowTitles(window, -1, banner);
ToClean3(SetWindowTitles, window ,0, 0);
}
void temporary_title(char *change)
{
SetWindowTitles(window, change, -1);
}
void restore_title(void)
{
SetWindowTitles(window, window_title, -1);
}
LOCAL void setup_all()
{
init_gads();
setup_status_line();
setup_gadgets(init_requester(window));
add_borders();
#ifdef SIZE_GADGET
saveclip = cliptoborder(window, NULL);
#endif
setup_title();
AddGList(window, g_array, ~0, gad - g_array, NULL);
ToClean3(RemoveGList, window, g_array, gad - g_array);
refresh_prop(g_array+VOLUME_NUMBER);
start_player();
RefreshGList(g_array, window, NULL, gad - g_array);
}
/* externally accessible function */
struct Window *init_interface(int xoffset, int yoffset)
{
struct NewWindow template;
template.Type = WBENCHSCREEN;
template.TopEdge = yoffset;
template.LeftEdge = xoffset;
template.DetailPen = -1;
template.BlockPen = -1;
template.IDCMPFlags = CLOSEWINDOW
| REFRESHWINDOW
#ifdef SIZE_GADGET
| NEWSIZE
#endif
| GADGETDOWN
| GADGETUP;
template.Flags = WINDOWDEPTH
| WINDOWCLOSE
| WINDOWDRAG
#ifdef SIZE_GADGET
| WINDOWSIZING
#endif
| SIZEBBOTTOM
| SIMPLE_REFRESH;
template.FirstGadget = NULL;
template.CheckMark = NULL;
template.Title = window_title;
template.MinWidth = 0;
template.MinHeight = 0;
template.MaxWidth = ~0;
template.MaxHeight = ~0;
template.Width = xstart;
template.Height = ystart;
window = OpenWindow(&template);
if (window)
ToClean(CloseWindow, window);
else
mayPanic("Could not open window");
setup_environment();
/* setup the window like it should be */
setup_all();
no_title();
return window;
}
/***
*
* Status line management
*
***/
LOCAL void change_title(void)
{
int needed;
needed = TextLength(rastport, buffer, strlen(buffer)) + 5 * xspace;
resize(needed > xmax ? needed : xmax, ymax);
display_status();
}
void new_title(int pos, int len, char *title)
{
erase_color(status);
display_status();
restore_color(status);
sprintf(buffer, "%3d:%-3d %s \0", pos, len, title);
change_title();
}
void update_title(int pos, int len, char *title)
{
sprintf(buffer, "%3d:%-3d %s \0", pos, len, title);
display_status();
}
void no_title(void)
{
erase_color(status);
display_status();
restore_color(status);
sprintf(buffer, "No song loaded\0");
change_title();
}
LOCAL int current_mode = 0;
LOCAL void reset_mode()
{
if (current_mode >= MAX_MODE)
current_mode = 0;
erase_color(g_array[MODE_NUMBER].GadgetText);
RefreshGList(g_array+MODE_NUMBER, window, NULL, 1);
g_array[MODE_NUMBER].GadgetText->IText = that[M_STD + current_mode];
restore_color(g_array[MODE_NUMBER].GadgetText);
RefreshGList(g_array+MODE_NUMBER, window, NULL, 1);
set_mode(current_mode);
}
LOCAL void toggle_mode()
{
current_mode++;
reset_mode();
}
void pref_mode(int mode)
{
current_mode = mode;
reset_mode();
}
/* internal (and external) tempo management */
LOCAL int current_speed = 0;
LOCAL int tempo[] = {256, 213, 170, 110, 550};
LOCAL int effect[] = {256, 213, 170, 20, 550};
/* in some conditions, we need to put back the tempo to its
* natural value (i.e., after a pause)
*/
void reset_tempo(void)
{
if (current_speed >= MAX_SPEED)
current_speed = 0;
erase_color(g_array[SPEED_NUMBER].GadgetText);
RefreshGList(g_array+SPEED_NUMBER, window, NULL, 1);
g_array[SPEED_NUMBER].GadgetText->IText = that[M_PAL + current_speed];
restore_color(g_array[SPEED_NUMBER].GadgetText);
RefreshGList(g_array+SPEED_NUMBER, window, NULL, 1);
set_tempo(tempo[current_speed], effect[current_speed]);
}
void pref_speed(int speed)
{
current_speed = speed;
reset_tempo();
}
LOCAL void toggle_tempo(void)
{
current_speed++;
reset_tempo();
}
LOCAL void reset_volume(void)
{
set_volume(REAL_MAX_VOLUME * (MAXPOT - prop->VertPot)
/MAXPOT);
}
void pref_volume(int volume)
{
NewModifyProp(g_array+VOLUME_NUMBER, window, NULL, prop->Flags,
prop->HorizPot, MAXPOT - volume*MAXPOT/100, prop->HorizBody,
prop->VertBody, VOLUME_NUMBER);
reset_volume();
}
/* the proper event handling */
LOCAL BOOL aborted;
LOCAL void add_to_idcmp(ULONG val)
{
ModifyIDCMP(window, window->IDCMPFlags | val);
}
LOCAL void remove_from_idcmp(ULONG val)
{
ModifyIDCMP(window, window->IDCMPFlags & ~val);
}
/* some gadgets only react to gadget up, other to gadget down,
* some to both !
*/
LOCAL void gadget_up(ULONG id)
{
switch(id)
{
case RESTART_NUMBER:
launch_play(0);
break;
case LOAD_NUMBER:
try_change_song();
break;
case VOLUME_NUMBER:
remove_from_idcmp(INTUITICKS);
break;
default:
break;
}
}
LOCAL void gadget_down(ULONG id)
{
switch(id)
{
case SPEED_NUMBER:
toggle_tempo();
break;
case PAUSE_NUMBER:
if (g_array[PAUSE_NUMBER].Flags & SELECTED)
stop_player();
else
start_player();
break;
case MODE_NUMBER:
toggle_mode();
break;
/* the volume gadget turns on ``busy update''
* while selected. If I add more prop gadgets,
* I will have to keep track of which ones to
* update.
*/
case VOLUME_NUMBER:
add_to_idcmp(INTUITICKS);
break;
/* right now, the state of the pause gadget is
* constantly tested... because ``external events''
* (like the availability of a song) might
* change the behaviour to follow.
*/
default:
break;
}
}
LOCAL void process_message(struct IntuiMessage *msg)
{
static ULONG class;
static void *object;
static struct Gadget *gadget;
class = msg->Class;
object = msg->IAddress;
ReplyMsg((struct Message *)msg);
switch(class)
{
case CLOSEWINDOW:
aborted = TRUE;
break;
case GADGETDOWN:
gadget = (struct Gadget *)object;
gadget_down(gadget->GadgetID);
break;
case GADGETUP:
gadget = (struct Gadget *)object;
gadget_up(gadget->GadgetID);
break;
case INTUITICKS:
reset_volume();
break;
#ifdef SIZE_GADGET
case NEWSIZE:
xcurrent = window->Width - window->BorderRight;
ycurrent = window->Height - window->BorderBottom;
recliptoborder(saveclip);
break;
#endif
case REFRESHWINDOW:
BeginRefresh(window);
display_status();
refresh_prop(g_array+VOLUME_NUMBER);
EndRefresh(window, TRUE);
break;
default:
break;
}
}
/* access through this one is needed by the filerequester */
void message_interface(struct IntuiMessage *msg)
{
process_message(msg);
}
void handle_interface(void)
{
struct IntuiMessage *msg;
while(msg = (struct IntuiMessage *)GetMsg(window->UserPort))
process_message(msg);
}
/* concerns events.c exclusively */
BOOL did_abort(void)
{
return aborted;
}
void clear_abort(void)
{
aborted = FALSE;
}