home *** CD-ROM | disk | FTP | other *** search
- /*
- bordimo.c 5/20/89
-
- % Border Request handler function for use by mouse borders & maybe others.
- By JMD
-
- Also contains outline draw routines.
-
- OWL 1.1
- Copyright (c) 1989, by Oakland Group, Inc.
- ALL RIGHTS RESERVED.
-
- Revision History:
- -----------------
- 5/23/89 jmd added "border features"
- 7/06/89 ted Fixed sizing in graphics mode by making bbox use char coords.
- and cleaned up various other stuff.
- 8/02/89 jdc added mvpnt.x, mvpnt.y initialization for resize
- 8/04/89 jmd added BD_TOP feature
- 8/08/89 jmd made request messages into functions
- */
-
- #include "oakhead.h"
- #include "disppriv.h"
- #include "bordobj.h"
- #include "bordod.h"
-
- #include "scancode.h" /* for mouse pseudo-scancodes */
-
- OSTATIC objreq_func (bdreq_mouse);
-
- OSTATIC void OWLPRIV bord_mouse(_arg2(border_od *, mev_struct *));
-
- enum action_flag {
- ACT_NO, ACT_MOVE, ACT_SIZEUL, ACT_SIZEUR, ACT_SIZELR, ACT_SIZELL
- };
- /* -------------------------------------------------------------------------- */
-
- void bord_MouseInit()
- {
- bdreq_mousefptr = bdreq_mouse;
- }
-
- static int bdreq_mouse(objdata, msg, indata, outdata)
- VOID *objdata;
- int msg; /* message */
- VOID *indata; /* message input data */
- VOID *outdata; /* message output data */
- {
- mev_struct *mev;
-
- oak_notused(outdata);
-
- switch(msg) {
- case BDM_STARTMOUSE:
- case BDM_ENDMOUSE: /* Mouse left the border. */
- /* Ignore mouse if button pressed when mouse first enters */
- /* (we don't care if mouse is exiting, but what the poot). */
- mev = (mev_struct *) indata;
-
- ((border_od *)objdata)->debounced = mev_IsButtonDown(mev);
- mev_ClearEvent(mev);
- break;
-
- case BDM_MOUSE:
- mev = (mev_struct *) indata;
-
- if (!mev_IsEventClear(mev)) {
- bord_mouse(((border_od *)objdata), mev);
- mev_ClearEvent(mev);
- }
- break;
- }
-
- return(TRUE);
- }
- /* -------------------------------------------------------------------------- */
-
- static void OWLPRIV bord_mouse(bdd, mev)
- border_od *bdd;
- mev_struct *mev;
- /*
- Mouse proccessing for borders.
- */
- {
- win_type win;
- opoint mvpnt, szpnt;
- opcoord mx, my, offx, offy;
- enum action_flag action = ACT_NO;
- boolean oldrawn = FALSE; /* flag for outline window currently drawn */
- boolean olmoved = FALSE; /* flag for outline window actually changed */
- opbox olbox;
- ocbox bbox;
-
- if (mev_IsButtonDown(mev)) {
- if (bdd->debounced) {
- return;
- }
- }
- else {
- bdd->debounced = FALSE;
- return;
- }
-
- win = bdd->win;
-
- /* If enabled, move the window to the top */
- if (bdd->top) {
- win_Top(win);
- }
-
- /* Get the border corners */
- bord_GetBox(win, &bbox);
-
- /* Find offset of mouse from upper corner of window */
- offx = mev_GetX(mev);
- offy = mev_GetY(mev);
-
- /* Assume a MOVE action, then test for others */
- action = bdd->move ? ACT_MOVE : ACT_NO;
-
- if (bdd->resize) {
- if (mev_GetRow(mev) == bbox.toprow && mev_GetCol(mev) == bbox.leftcol) {
- /* Resize window: Upper Left Corner */
- action = ACT_SIZEUL;
- }
- else if (mev_GetRow(mev) == bbox.toprow && mev_GetCol(mev) == bbox.rightcol) {
- /* Resize window: Upper Right Corner */
- action = ACT_SIZEUR;
- offx -= win_GetPixWidth(win);
- }
- else if (mev_GetRow(mev) == bbox.botrow && mev_GetCol(mev) == bbox.rightcol) {
- /* Resize window: Lower Right */
- action = ACT_SIZELR;
- offx -= win_GetPixWidth(win);
- offy -= win_GetPixHeight(win);
- }
- else if (mev_GetRow(mev) == bbox.botrow && mev_GetCol(mev) == bbox.leftcol) {
- /* Resize window: Lower Left */
- action = ACT_SIZELL;
- offy -= win_GetPixHeight(win);
- }
- }
- if (action == ACT_NO) {
- return;
- }
- mvpnt.x = win_GetXmin(win);
- mvpnt.y = win_GetYmin(win);
-
- /* Do the action */
- for(;;) {
- /* Size or Move while the mouse is dragged */
-
- /* Get next mouse event in local mev struct */
- if (win_ReadEvent(win, mev) == MOU_EVENT) {
- if (oldrawn) {
- /* erase the last drawn box */
- bord_EraseOutline(win, &olbox);
- oldrawn = FALSE;
- }
- if (!mev_IsButtonDown(mev)) {
- break; /* break out of loop */
- }
- else {
- /* figure out how far we've moved */
- mx = mev_GetX(mev) - offx;
- my = mev_GetY(mev) - offy;
-
- switch (action) {
- case ACT_MOVE:
- mvpnt.x = win_GetXmin(win) + mx;
- mvpnt.y = win_GetYmin(win) + my;
- break;
-
- case ACT_SIZEUL:
- if ((szpnt.x = win_GetPixWidth(win) - mx) > 1) {
- mvpnt.x = win_GetXmin(win) + mx;
- }
- if ((szpnt.y = win_GetPixHeight(win) - my) > 1) {
- mvpnt.y = win_GetYmin(win) + my;
- }
- break;
-
- case ACT_SIZEUR:
- if ((szpnt.x = mev_GetX(mev)) > 1) {
- mvpnt.x = win_GetXmin(win);
- }
- if ((szpnt.y = win_GetPixHeight(win) - my) > 1) {
- mvpnt.y = win_GetYmin(win) + my;
- }
- break;
-
- case ACT_SIZELR:
- if ((szpnt.x = mx) > 1) {
- mvpnt.x = win_GetXmin(win);
- }
- if ((szpnt.y = my) > 1) {
- mvpnt.y = win_GetYmin(win);
- }
- break;
-
- case ACT_SIZELL:
- if ((szpnt.x = win_GetPixWidth(win) - mx) > 1) {
- mvpnt.x = win_GetXmin(win) + mx;
- }
- if ((szpnt.y = my) > 1) {
- mvpnt.y = win_GetYmin(win);
- }
- break;
- }
- szpnt.x = int_max(szpnt.x, 1);
- szpnt.y = int_max(szpnt.y, 1);
-
- /* Adjust size and position for SIZE */
- if (bdd->outline) {
- bord_GetPixBox(win, &olbox);
- opbox_trans(&olbox, mvpnt.x, mvpnt.y);
- if (action != ACT_MOVE) { /* Size action */
- olbox.xmax += szpnt.x - win_GetPixWidth(win);
- olbox.ymax += szpnt.y - win_GetPixHeight(win);
- }
- bord_DrawOutline(win, &olbox);
- oldrawn = TRUE;
- olmoved = TRUE; /* keep quick click from having effect */
- }
- else {
- /* move the window */
- win_SetPixPosition(win, mvpnt.x, mvpnt.y);
-
- if (action != ACT_MOVE) { /* Size action */
- /* resize the window */
- win_SetPixSize(win, szpnt.x, szpnt.y);
- }
- }
- }
- }
- }
- if (olmoved) {
- /* move the window for real */
- win_SetPixPosition(win, mvpnt.x, mvpnt.y);
-
- if (action != ACT_MOVE) { /* Size action */
- /* resize the window for real */
- win_SetPixSize(win, szpnt.x, szpnt.y);
- }
- }
- }
- /* -------------------------------------------------------------------------- */
-
-