home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Crawly Crypt Collection 2
/
crawlyvol2.bin
/
program
/
c
/
xaes_new
/
formwind.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-12-12
|
19KB
|
608 lines
/********************************************************************
* 0.50*
* XAES: Custom window handling *
* Code by Ken Hollis, GNU C Extensions by Sascha Blank *
* *
* Copyright (c) 1994, Bitgate Software. All Rights Reserved. *
* *
* Well, at least it's half-way done. I still need to get the *
* small-window elements working decently. Hell, I've still got *
* to add them! *
* *
********************************************************************/
#include <string.h>
#include <stddef.h>
#include "xaes.h"
#define W_ULSIZE 1 /* BOX dans l'arbre WINDOW */
#define W_PCLOSE 2 /* BOX dans l'arbre WINDOW */
#define W_CLOSER 3 /* BOXTEXT dans l'arbre WINDOW */
#define W_TSIZE 4 /* BOX dans l'arbre WINDOW */
#define W_URSIZE 5 /* BOX dans l'arbre WINDOW */
#define W_PCASC 6 /* BOX dans l'arbre WINDOW */
#define W_FULLER 7 /* BOXTEXT dans l'arbre WINDOW */
#define W_LSIZE 8 /* BOX dans l'arbre WINDOW */
#define W_RSIZE 9 /* BOX dans l'arbre WINDOW */
#define W_LLSIZE 10 /* BOX dans l'arbre WINDOW */
#define W_PSLLT 11 /* BOX dans l'arbre WINDOW */
#define W_SLLT 12 /* BOXTEXT dans l'arbre WINDOW */
#define W_BSIZE 13 /* BOX dans l'arbre WINDOW */
#define W_LRSIZE 14 /* BOX dans l'arbre WINDOW */
#define W_PSLDN 15 /* BOX dans l'arbre WINDOW */
#define W_SLDN 16 /* BOXTEXT dans l'arbre WINDOW */
#define W_MOVER 17 /* BOXTEXT dans l'arbre WINDOW */
#define W_CASCADE 18 /* BOXTEXT dans l'arbre WINDOW */
#define W_MENU 19 /* BOX dans l'arbre WINDOW */
#define W_MENU_L 20 /* BOXTEXT dans l'arbre WINDOW */
#define W_MENU_R 21 /* BOXTEXT dans l'arbre WINDOW */
#define W_INFO 22 /* BOXTEXT dans l'arbre WINDOW */
#define W_INFO_R 24 /* BOXTEXT dans l'arbre WINDOW */ /* SWITCHED */
#define W_INFO_L 23 /* BOXTEXT dans l'arbre WINDOW */ /* SWITCHED */
#define WORKAREA 25 /* BOXTEXT dans l'arbre WINDOW */
#define W_SLUP 26 /* BOXTEXT dans l'arbre WINDOW */
#define W_VERTRK 27 /* BOX dans l'arbre WINDOW */
#define W_VERSL 28 /* BOX dans l'arbre WINDOW */
#define W_HORTRK 29 /* BOX dans l'arbre WINDOW */
#define W_HORSL 30 /* BOX dans l'arbre WINDOW */
#define W_SLRT 31 /* BOXTEXT dans l'arbre WINDOW */
#define W_OPTION 32 /* BOXTEXT dans l'arbre WINDOW */
#define S_ULSIZE 1 /* BOX dans l'arbre WINDSM */
#define S_CLOSER 3 /* BOXTEXT dans l'arbre WINDSM */
#define S_TSIZE 4 /* BOX dans l'arbre WINDSM */
#define S_URSIZE 5 /* BOX dans l'arbre WINDSM */
#define S_FULLER 7 /* BOXTEXT dans l'arbre WINDSM */
#define S_CASCADE 8 /* BOXTEXT dans l'arbre WINDSM */
#define S_RSIZE 9 /* BOX dans l'arbre WINDSM */
#define S_LRSIZE 10 /* BOX dans l'arbre WINDSM */
#define S_SLDN 12 /* BOXTEXT dans l'arbre WINDSM */
#define S_SLRT 13 /* BOXTEXT dans l'arbre WINDSM */
#define S_BSIZE 14 /* BOX dans l'arbre WINDSM */
#define S_LLSIZE 15 /* BOX dans l'arbre WINDSM */
#define S_SLLT 17 /* BOXTEXT dans l'arbre WINDSM */
#define S_LSIZE 18 /* BOX dans l'arbre WINDSM */
#define S_MOVER 19 /* BOXTEXT dans l'arbre WINDSM */
#define S_MENU 20 /* BOX dans l'arbre WINDSM */
#define S_MENU_L 21 /* BOXTEXT dans l'arbre WINDSM */
#define S_MENU_R 22 /* BOXTEXT dans l'arbre WINDSM */
#define S_INFO 23 /* BOXTEXT dans l'arbre WINDSM */
#define S_INFO_R 24 /* BOXTEXT dans l'arbre WINDSM */
#define S_INFO_L 25 /* BOXTEXT dans l'arbre WINDSM */
#define S_OPTIONS 26 /* BOXTEXT dans l'arbre WINDSM */
#define S_UP 27 /* BOXTEXT dans l'arbre WINDSM */
#define S_VERTRK 28 /* BOX dans l'arbre WINDSM */
#define S_VERSL 29 /* BOX dans l'arbre WINDSM */
#define S_HORTRK 30 /* BOX dans l'arbre WINDSM */
#define S_HORSL 31 /* BOX dans l'arbre WINDSM */
#define S_WORK 32 /* BOXTEXT dans l'arbre WINDSM */
#define WINPOP 0 /* Formulaire/Dialogue */
#define WPCLOSE 2 /* TEXT dans l'arbre WINPOP */
#define WPICON 3 /* TEXT dans l'arbre WINPOP */
#define CASCPOP 1 /* Formulaire/Dialogue */
#define WPCASC 2 /* TEXT dans l'arbre CASCPOP */
#define WPPTB 3 /* TEXT dans l'arbre CASCPOP */
#define WPPRIO 5 /* TEXT dans l'arbre CASCPOP */
#define WPBEVENT 6 /* TEXT dans l'arbre CASCPOP */
#define WPAOT 7 /* TEXT dans l'arbre CASCPOP */
#define FULLPOP 2 /* Formulaire/Dialogue */
#define WPMAX 2 /* TEXT dans l'arbre FULLPOP */
#define WPMIN 3 /* TEXT dans l'arbre FULLPOP */
#define RTPOP 3 /* Formulaire/Dialogue */
#define WHATIS 2 /* TEXT dans l'arbre RTPOP */
#define CLOSEWIN 4 /* TEXT dans l'arbre RTPOP */
#define CYCLEWIN 5 /* TEXT dans l'arbre RTPOP */
#define FORCEXIT 7 /* TEXT dans l'arbre RTPOP */
#define CLOSEALL 8 /* TEXT dans l'arbre RTPOP */
#define REDRWIN 9 /* TEXT dans l'arbre RTPOP */
#define REDRALL 10 /* TEXT dans l'arbre RTPOP */
#define HELPWIN 4 /* Formulaire/Dialogue */
#define HELPTITL 2 /* TEXT dans l'arbre HELPWIN */
#define HELPWORK 3 /* BOX dans l'arbre HELPWIN */
#define HELPOK 5 /* BOXTEXT dans l'arbre HELPWIN */
#define LBUP 1 /* BOXCHAR dans l'arbre LISTBOX */
#define LBVERTRK 2 /* BOX dans l'arbre LISTBOX */
#define LBVERSL 3 /* BOX dans l'arbre LISTBOX */
#define LBHORTRK 4 /* BOX dans l'arbre LISTBOX */
#define LBHORSL 5 /* BOX dans l'arbre LISTBOX */
#define LBDOWN 6 /* BOXCHAR dans l'arbre LISTBOX */
#define LBLEFT 7 /* BOXCHAR dans l'arbre LISTBOX */
#define LBRIGHT 8 /* BOXCHAR dans l'arbre LISTBOX */
#define LBTEXT1 9 /* STRING dans l'arbre LISTBOX */
#define LBTEXT2 10 /* STRING dans l'arbre LISTBOX */
#define LBTEXT3 11 /* STRING dans l'arbre LISTBOX */
#define LBTEXT4 12 /* STRING dans l'arbre LISTBOX */
#define LBTEXT5 13 /* STRING dans l'arbre LISTBOX */
#define LBTEXT6 14 /* STRING dans l'arbre LISTBOX */
#define LBTEXT7 15 /* STRING dans l'arbre LISTBOX */
#define PUUP 1 /* BOXCHAR dans l'arbre POPUP */
#define PUVERTRK 2 /* BOX dans l'arbre POPUP */
#define PUVERSL 3 /* BOX dans l'arbre POPUP */
#define PUDOWN 4 /* BOXCHAR dans l'arbre POPUP */
#define PUTEXT1 5 /* STRING dans l'arbre POPUP */
#define PUTEXT2 6 /* STRING dans l'arbre POPUP */
#define PUTEXT3 7 /* STRING dans l'arbre POPUP */
#define PUTEXT4 8 /* STRING dans l'arbre POPUP */
#define PUTEXT5 9 /* STRING dans l'arbre POPUP */
#define PUTEXT6 10 /* STRING dans l'arbre POPUP */
#define PUTEXT7 11 /* STRING dans l'arbre POPUP */
#define PUTEXT8 12 /* STRING dans l'arbre POPUP */
#define PUTEXT9 13 /* STRING dans l'arbre POPUP */
#define PUTEXT10 14 /* STRING dans l'arbre POPUP */
#define ICONPOP 4 /* Formulaire/Dialogue */
#define UNICON 2 /* TEXT dans l'arbre ICONPOP */
#define PODICON 3 /* TEXT dans l'arbre ICONPOP */
#define CLOICON 5 /* TEXT dans l'arbre ICONPOP */
#include "internal.rsh"
BOOL helpmode;
OBJECT *WINPOPUP = winp;
OBJECT *CASCPOPUP = cascp;
OBJECT *FULLPOPUP = fullp;
OBJECT *RTPOPUP = rtp;
OBJECT *ICONPOPUP = icp;
OBJECT *HELPWINDOW = helpw;
OBJECT *LBOX = listb;
OBJECT *P_UP = pop;
OBJECT *ALERTWIN = alertb;
OBJECT *ERRORWIN = errorb;
GLOBAL void WSetupWinPopups(void)
{
WObjFixPosition(WINPOPUP);
WObjFixPosition(FULLPOPUP);
WObjFixPosition(CASCPOPUP);
WObjFixPosition(RTPOPUP);
WObjFixPosition(ICONPOPUP);
WObjFixPosition(HELPWINDOW);
WObjFixPosition(LBOX);
WObjFixPosition(P_UP);
WObjFixPosition(ALERTWIN);
WObjFixPosition(ERRORWIN);
fix_object(WINPOPUP, FALSE, FALSE);
fix_object(FULLPOPUP, FALSE, FALSE);
fix_object(CASCPOPUP, FALSE, FALSE);
fix_object(RTPOPUP, FALSE, FALSE);
fix_object(HELPWINDOW, FALSE, TRUE);
fix_object(ICONPOPUP, FALSE, FALSE);
fix_object(LBOX, TRUE, FALSE);
fix_object(P_UP, TRUE, FALSE);
P_UP[PUVERSL].ob_x++; P_UP[PUVERSL].ob_y++;
LBOX[LBHORSL].ob_x++; LBOX[LBHORSL].ob_y++;
LBOX[LBVERSL].ob_x++; LBOX[LBVERSL].ob_y++;
}
GLOBAL void WDoRightHandle(void)
{
int x, y, d, p;
graf_mkstate(&x, &y, &d, &d);
helpmode = FALSE;
PMovePopupCoord(RTPOPUP, x, y);
p = PDoPopupAddr(RTPOPUP);
switch(p) {
case WHATIS:
helpmode = TRUE;
WGrafMouse(HELP_MOUSE);
break;
case CLOSEWIN:
WCloseWindow(NULL, WC_OBJECTABLE, K_ASK);
break;
case CYCLEWIN:
WTopWindow(NULL);
break;
case REDRWIN:
{
WINDOW *win = WindowChain;
int x, y, w, h;
if (win->handle != 0) {
WWindGet(win, WF_WORKXYWH, &x, &y, &w, &h);
WRedrawWindow(win, x, y, w, h);
}
}
break;
case CLOSEALL:
WKillAllWindows(K_ASK);
vswr_mode(VDIhandle, MD_REPLACE);
break;
case REDRALL:
WRedrawAllWindows();
break;
case FORCEXIT:
WDie(FORCE_EXIT);
break;
}
}
GLOBAL void WDoIconHandle(WINDOW *win)
{
int x, y, d, p;
graf_mkstate(&x, &y, &d, &d);
PMovePopupCoord(ICONPOPUP, x, y);
p = PDoPopupAddr(ICONPOPUP);
switch(p) {
case UNICON:
WWindSet(win, WF_UNICONIFIED, 1);
break;
case PODICON:
form_alert(1, "[3][Sorry, cannot push icons|to the virtual desktop|as of yet.][ OK ]");
/* WWindSet(win, WF_DROPICONDESK, 1); */
break;
case CLOICON:
WCloseWindow(NULL, WC_OBJECTABLE, K_ASK);
break;
}
}
LOCAL void WHandleWindow(WINDOW *win, int object, int clicks)
{
int msg_buf[8], but, d;
UNUSED(clicks);
graf_mkstate(&d, &d, &but, &d);
if (win)
if (win->style & W_CUSTOMWINDOW)
if (!(win->wind[object].ob_state & DISABLED)) {
if ((xaes.config1 & X_ELEMENTSEL) &&
(object != W_CLOSER) &&
(object != W_ULSIZE) &&
(object != W_URSIZE) &&
(object != W_LLSIZE) &&
(object != W_LRSIZE))
WObjc_Change(win, object, 0, win->wind[object].ob_state | SELECTED, 1);
switch(object) {
case W_CLOSER:
if (but) {
int p, x, y;
objc_offset(win->wind, W_CLOSER, &x, &y);
if (!(win->iconify))
WINPOPUP[3].ob_state |= DISABLED;
else
WINPOPUP[3].ob_state &= ~DISABLED;
PMovePopupCoord(WINPOPUP, x, y);
p = PDoPopupAddr(WINPOPUP);
switch(p) {
case WPCLOSE:
WObjc_Change(win, object, 0, win->wind[object].ob_state & ~SELECTED, 1);
WCloseWindow(win, WC_OBJECTABLE, K_ASK);
break;
case WPICON:
WObjc_Change(win, object, 0, win->wind[object].ob_state & ~SELECTED, 1);
WWindSet(win, WF_ICONIFIED, 1);
break;
}
} else
WCloseWindow(win, WC_OBJECTABLE, K_ASK);
break;
case W_ULSIZE:
WSizeBox(win, S_UPPERLEFT);
WMoveWindow(win, win->size.g_x, win->size.g_y,
win->size.g_w, win->size.g_h);
break;
case W_TSIZE:
WSizeBox(win, S_TOP);
WMoveWindow(win, win->size.g_x, win->size.g_y,
win->size.g_w, win->size.g_h);
break;
case W_URSIZE:
WSizeBox(win, S_UPPERRIGHT);
WMoveWindow(win, win->size.g_x, win->size.g_y,
win->size.g_w, win->size.g_h);
break;
case W_LSIZE:
WSizeBox(win, S_LEFT);
WMoveWindow(win, win->size.g_x, win->size.g_y,
win->size.g_w, win->size.g_h);
break;
case W_RSIZE:
WSizeBox(win, S_RIGHT);
WMoveWindow(win, win->size.g_x, win->size.g_y,
win->size.g_w, win->size.g_h);
break;
case W_LRSIZE:
WSizeBox(win, S_LOWERRIGHT);
WMoveWindow(win, win->size.g_x, win->size.g_y,
win->size.g_w, win->size.g_h);
break;
case W_BSIZE:
WSizeBox(win, S_BOTTOM);
WMoveWindow(win, win->size.g_x, win->size.g_y,
win->size.g_w, win->size.g_h);
break;
case W_LLSIZE:
WSizeBox(win, S_LOWERLEFT);
WMoveWindow(win, win->size.g_x, win->size.g_y,
win->size.g_w, win->size.g_h);
break;
case W_INFO_R:
if (strlen((char *) win->info) > 1) {
win->infpos++;
if (win->infpos > (strlen((char *) win->info))) {
win->infpos = (int)(strlen((char *) win->info));
if (!(win->wind[W_INFO_R].ob_state & DISABLED))
WObjc_Change(win, W_INFO_R, 0, win->wind[W_INFO_R].ob_state | DISABLED, 1);
} else {
if (win->wind[W_INFO_L].ob_state & DISABLED)
WObjc_Change(win, W_INFO_L, 0, win->wind[W_INFO_L].ob_state & ~DISABLED, 1);
goto doredraw;
}
}
break;
case W_INFO_L:
if (strlen((char *) win->info) > 1) {
win->infpos--;
if (win->infpos < 1) {
win->infpos = 0;
if (!(win->wind[W_INFO_L].ob_state & DISABLED))
WObjc_Change(win, W_INFO_L, 0, win->wind[W_INFO_L].ob_state | DISABLED, 1);
objc_draw(win->wind, W_INFO, 7, desk.g_x, desk.g_y, desk.g_w, desk.g_h);
break;
} else {
if (win->wind[W_INFO_R].ob_state & DISABLED)
WObjc_Change(win, W_INFO_R, 0, win->wind[W_INFO_R].ob_state & ~DISABLED, 1);
} /* This is cheating... */
}
doredraw: {
char *tempstr;
tempstr = (char *) win->info;
tempstr = tempstr + win->infpos;
ChangeObjectText(win->wind, W_INFO, tempstr, 3, TE_LEFT);
objc_draw(win->wind, W_INFO, 7, desk.g_x, desk.g_y, desk.g_w, desk.g_h);
}
break;
case W_MOVER:
if (xaes.config1 & X_MOUSEGADGETS)
WGrafMouse(MOVER_MOUSE);
if (xaes.config2 & X_ACTIVEDRAG)
WHandleActiveDrag(win);
else
WDragBox(win->size.g_w + 1, win->size.g_h + 1,
win->size.g_x, win->size.g_y, (xaes.config1 & X_LEFTBORDER) ? -1 : desk.g_x,
desk.g_y, -1, -1, &win->size.g_x,
&win->size.g_y);
WGrafMouse(ARROW);
if (!(xaes.config2 & X_ACTIVEDRAG))
WMoveWindow(win, win->size.g_x, win->size.g_y,
win->size.g_w, win->size.g_h);
break;
case W_FULLER:
if (but) {
int p, x, y;
objc_offset(win->wind, W_FULLER, &x, &y);
PMovePopupCoord(FULLPOPUP, x, y);
p = PDoPopupAddr(FULLPOPUP);
switch(p) {
case WPMAX:
msg_buf[0] = WM_FULLED;
msg_buf[3] = win->handle;
WMsgWindow(win, msg_buf);
break;
case WPMIN:
msg_buf[0] = WM_SIZED;
msg_buf[3] = win->handle;
msg_buf[4] = win->minimum.g_x;
msg_buf[5] = win->minimum.g_y;
msg_buf[6] = win->minimum.g_w;
msg_buf[7] = win->minimum.g_h;
WMsgWindow(win, msg_buf);
break;
}
} else {
msg_buf[0] = WM_FULLED;
msg_buf[3] = win->handle;
WMsgWindow(win, msg_buf);
}
break;
case W_CASCADE:
if (but) {
int p, x, y;
objc_offset(win->wind, W_CASCADE, &x, &y);
PMovePopupCoord(CASCPOPUP, x, y);
p = PDoPopupAddr(CASCPOPUP);
switch(p) {
case WPCASC:
WTopWindow(NULL);
break;
case WPPTB:
WTopWindow(win);
break;
case WPPRIO:
if (!(win->state & W_TIMER))
form_alert(1, "[3][Sorry, you cannot change|timer priority on a|non-timer window!][ OK ]");
break;
case WPBEVENT:
case WPAOT:
form_alert(1, "[3][Sorry, functions not yet|implemented.][ OK ]");
break;
}
} else
WTopWindow(NULL);
break;
}
if ((xaes.config1 & X_ELEMENTSEL) &&
(object != W_CLOSER) &&
(object != W_ULSIZE) &&
(object != W_URSIZE) &&
(object != W_LLSIZE) &&
(object != W_LRSIZE))
WObjc_Change(win, object, 0, win->wind[object].ob_state & ~SELECTED, 1);
}
}
GLOBAL int WForm_window(WINDOW *win, int obj, int clicks)
{
OBJECT *tree, *obptr;
int flags, state;
EVENT event;
UNUSED(clicks);
if (win) {
if (helpmode) {
WHandleWindowHelp(obj);
return 1;
}
wind_update(BEG_MCTRL);
tree = win->wind;
obptr = tree + obj;
flags = obptr->ob_flags;
state = obptr->ob_state;
if ((flags & SELECTABLE) && !(state & DISABLED)) {
if ((flags & RBUTTON) && (state & SELECTED))
no_click();
else {
state ^= SELECTED;
if (flags & (RBUTTON | TOUCHEXIT)) {
if (flags & SELECTABLE)
WObjc_Change(win, obj, 0, state, 1);
if (flags & RBUTTON) {
register int act = obj, lst, new;
for (;;) {
lst = act;
new = obptr->ob_next;
for (;;) {
act = new;
obptr = tree + act;
if (obptr->ob_tail == lst) {
new = obptr->ob_head;
lst = act;
} else {
if (act == obj)
goto rb_exit;
if ((obptr->ob_state & SELECTED) && (obptr->ob_flags & RBUTTON)) {
WObjc_Change(win, act, 0, obptr->ob_state ^ SELECTED, 1);
goto rb_exit;
} else
break;
}
}
}
rb_exit: no_click();
}
} else {
register OBJECT *ob = tree + obj;
int x, y, dummy, events;
event.ev_mflags = MU_BUTTON | MU_M1;
event.ev_mbclicks = 1;
event.ev_bmask = 0x0011;
event.ev_mbstate = 0;
objc_offset(tree, obj, &event.ev_mm1x, &event.ev_mm1y);
event.ev_mm1width = ob->ob_width;
event.ev_mm1height = ob->ob_height;
graf_mkstate(&x, &y, &dummy, &dummy);
if (rc_inside(x, y, (GRECT *) &event.ev_mm1x)) {
event.ev_mm1flags = 1;
WObjc_Change(win, obj, 0, ob->ob_state ^ SELECTED, 1);
} else
event.ev_mm1flags = 0;
do {
events = EvntMulti(&event);
if (events & MU_M1) {
event.ev_mm1flags = 1 - event.ev_mm1flags;
WObjc_Change(win, obj, 0, ob->ob_state ^ SELECTED, 1);
}
} while (!(events & MU_BUTTON));
}
}
}
wind_update(END_MCTRL);
if (event.ev_mbreturn != 2)
if (win->wind[obj].ob_flags & TOUCHEXIT) {
WHandleWindow(win, obj, 1);
if ((win->wind[obj].ob_flags & SELECTABLE) &&
(win->wind[obj].ob_state & SELECTED))
WObjc_Change(win, obj, 0, win->wind[obj].ob_state ^ SELECTED, 1);
}
if ((win->wind[obj].ob_state & SELECTED) &&
!(win->wind[obj].ob_flags & TOUCHEXIT)) {
WHandleWindow(win, obj, event.ev_mbreturn);
if (win->state & W_OPEN)
WObjc_Change(win, obj, 0, win->wind[obj].ob_state ^ SELECTED, 1);
}
return 1;
} else
return 0;
}