home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c185 / 2.ddi / OWLSRC.EXE / CSCAPE / SOURCE / BORDIMO.C < prev    next >
Encoding:
C/C++ Source or Header  |  1989-09-06  |  6.2 KB  |  250 lines

  1. /*
  2.     bordimo.c    5/20/89
  3.  
  4.     % Border Request handler function for use by mouse borders & maybe others.
  5.     By JMD
  6.  
  7.     Also contains outline draw routines.
  8.  
  9.     OWL 1.1
  10.     Copyright (c) 1989, by Oakland Group, Inc.
  11.     ALL RIGHTS RESERVED.
  12.  
  13.     Revision History:
  14.     -----------------
  15.      5/23/89 jmd    added "border features"
  16.      7/06/89 ted    Fixed sizing in graphics mode by making bbox use char coords.
  17.                         and cleaned up various other stuff.
  18.      8/02/89 jdc    added mvpnt.x, mvpnt.y initialization for resize
  19.      8/04/89 jmd    added BD_TOP feature
  20.      8/08/89 jmd    made request messages into functions
  21. */
  22.  
  23. #include "oakhead.h"
  24. #include "disppriv.h"
  25. #include "bordobj.h"
  26. #include "bordod.h"
  27.  
  28. #include "scancode.h"    /* for mouse pseudo-scancodes */
  29.  
  30. OSTATIC objreq_func (bdreq_mouse);
  31.  
  32. OSTATIC void OWLPRIV bord_mouse(_arg2(border_od *, mev_struct *));
  33.  
  34. enum action_flag {
  35.     ACT_NO, ACT_MOVE, ACT_SIZEUL, ACT_SIZEUR, ACT_SIZELR, ACT_SIZELL
  36.     };
  37. /* -------------------------------------------------------------------------- */
  38.  
  39. void bord_MouseInit()
  40. {
  41.     bdreq_mousefptr = bdreq_mouse;
  42. }
  43.  
  44. static int bdreq_mouse(objdata, msg, indata, outdata)
  45.     VOID *objdata;
  46.     int msg;                /* message */
  47.     VOID *indata;            /* message input data */
  48.     VOID *outdata;            /* message output data */
  49. {
  50.     mev_struct *mev;
  51.  
  52.     oak_notused(outdata);
  53.  
  54.     switch(msg) {
  55.     case BDM_STARTMOUSE:
  56.     case BDM_ENDMOUSE:        /* Mouse left the border. */
  57.         /* Ignore mouse if button pressed when mouse first enters */
  58.         /* (we don't care if mouse is exiting, but what the poot). */
  59.         mev = (mev_struct *) indata;
  60.  
  61.         ((border_od *)objdata)->debounced = mev_IsButtonDown(mev);
  62.         mev_ClearEvent(mev);
  63.         break;
  64.  
  65.     case BDM_MOUSE:
  66.         mev = (mev_struct *) indata;
  67.  
  68.         if (!mev_IsEventClear(mev)) {
  69.             bord_mouse(((border_od *)objdata), mev);
  70.             mev_ClearEvent(mev);
  71.         }
  72.         break;
  73.     }
  74.  
  75.     return(TRUE);
  76. }
  77. /* -------------------------------------------------------------------------- */
  78.  
  79. static void OWLPRIV bord_mouse(bdd, mev)
  80.     border_od *bdd;
  81.     mev_struct *mev;
  82. /*
  83.     Mouse proccessing for borders.
  84. */
  85. {
  86.     win_type    win;
  87.     opoint         mvpnt, szpnt;
  88.     opcoord        mx, my, offx, offy;
  89.     enum action_flag  action = ACT_NO;
  90.     boolean     oldrawn = FALSE;    /* flag for outline window currently drawn */
  91.     boolean     olmoved = FALSE;    /* flag for outline window actually changed */
  92.     opbox        olbox;
  93.     ocbox        bbox;
  94.  
  95.     if (mev_IsButtonDown(mev)) {
  96.         if (bdd->debounced) {
  97.             return;
  98.         }
  99.     }
  100.     else {
  101.         bdd->debounced = FALSE;
  102.         return;
  103.     }
  104.  
  105.     win = bdd->win;
  106.  
  107.     /* If enabled, move the window to the top */
  108.     if (bdd->top) {
  109.         win_Top(win);
  110.     }
  111.  
  112.     /* Get the border corners */
  113.     bord_GetBox(win, &bbox);
  114.  
  115.     /* Find offset of mouse from upper corner of window */
  116.     offx = mev_GetX(mev);
  117.     offy = mev_GetY(mev);
  118.  
  119.     /* Assume a MOVE action, then test for others */
  120.     action = bdd->move ? ACT_MOVE : ACT_NO;
  121.  
  122.     if (bdd->resize) {
  123.         if (mev_GetRow(mev) == bbox.toprow && mev_GetCol(mev) == bbox.leftcol) {
  124.             /* Resize window: Upper Left Corner */
  125.             action = ACT_SIZEUL;
  126.         }
  127.         else if (mev_GetRow(mev) == bbox.toprow && mev_GetCol(mev) == bbox.rightcol) {
  128.             /* Resize window: Upper Right Corner */
  129.             action = ACT_SIZEUR;
  130.             offx -= win_GetPixWidth(win);
  131.         }
  132.         else if (mev_GetRow(mev) == bbox.botrow && mev_GetCol(mev) == bbox.rightcol) {
  133.             /* Resize window: Lower Right */
  134.             action = ACT_SIZELR;
  135.             offx -= win_GetPixWidth(win);
  136.             offy -= win_GetPixHeight(win);
  137.         }
  138.         else if (mev_GetRow(mev) == bbox.botrow && mev_GetCol(mev) == bbox.leftcol) {
  139.             /* Resize window: Lower Left */
  140.             action = ACT_SIZELL;
  141.             offy -= win_GetPixHeight(win);
  142.         }
  143.     }
  144.     if (action == ACT_NO) {
  145.         return;
  146.     }
  147.     mvpnt.x = win_GetXmin(win);
  148.     mvpnt.y = win_GetYmin(win);
  149.  
  150.     /* Do the action */
  151.     for(;;) {
  152.         /* Size or Move while the mouse is dragged */
  153.  
  154.         /* Get next mouse event in local mev struct */
  155.         if (win_ReadEvent(win, mev) == MOU_EVENT) {
  156.             if (oldrawn) {
  157.                 /* erase the last drawn box */
  158.                 bord_EraseOutline(win, &olbox);
  159.                 oldrawn = FALSE;
  160.             }
  161.             if (!mev_IsButtonDown(mev)) {
  162.                 break;    /* break out of loop */
  163.             }
  164.             else {
  165.                 /* figure out how far we've moved */
  166.                 mx = mev_GetX(mev) - offx;
  167.                 my = mev_GetY(mev) - offy;
  168.  
  169.                 switch (action) {
  170.                 case ACT_MOVE:
  171.                     mvpnt.x = win_GetXmin(win) + mx;
  172.                     mvpnt.y = win_GetYmin(win) + my;
  173.                     break;
  174.  
  175.                 case ACT_SIZEUL:
  176.                     if ((szpnt.x = win_GetPixWidth(win) - mx) > 1) {
  177.                         mvpnt.x = win_GetXmin(win) + mx;
  178.                     }
  179.                     if ((szpnt.y = win_GetPixHeight(win) - my) > 1) {
  180.                         mvpnt.y = win_GetYmin(win) + my;
  181.                     }
  182.                     break;
  183.  
  184.                 case ACT_SIZEUR:
  185.                     if ((szpnt.x = mev_GetX(mev)) > 1) {
  186.                         mvpnt.x = win_GetXmin(win);
  187.                     }
  188.                     if ((szpnt.y = win_GetPixHeight(win) - my) > 1) {
  189.                         mvpnt.y = win_GetYmin(win) + my;
  190.                     }
  191.                     break;
  192.  
  193.                 case ACT_SIZELR:
  194.                     if ((szpnt.x = mx) > 1) {
  195.                         mvpnt.x = win_GetXmin(win);
  196.                     }
  197.                     if ((szpnt.y = my) > 1) {
  198.                         mvpnt.y = win_GetYmin(win);
  199.                     }
  200.                     break;
  201.  
  202.                 case ACT_SIZELL:
  203.                     if ((szpnt.x = win_GetPixWidth(win) - mx) > 1) {
  204.                         mvpnt.x = win_GetXmin(win) + mx;
  205.                     }
  206.                     if ((szpnt.y = my) > 1) {
  207.                         mvpnt.y = win_GetYmin(win);
  208.                     }
  209.                     break;
  210.                 }
  211.                 szpnt.x = int_max(szpnt.x, 1);
  212.                 szpnt.y = int_max(szpnt.y, 1);
  213.  
  214.                 /* Adjust size and position for SIZE */
  215.                 if (bdd->outline) {
  216.                     bord_GetPixBox(win, &olbox);
  217.                     opbox_trans(&olbox, mvpnt.x, mvpnt.y);
  218.                     if (action != ACT_MOVE) {    /* Size action */
  219.                         olbox.xmax += szpnt.x - win_GetPixWidth(win);
  220.                         olbox.ymax += szpnt.y - win_GetPixHeight(win);
  221.                     }
  222.                     bord_DrawOutline(win, &olbox);
  223.                     oldrawn = TRUE;
  224.                     olmoved = TRUE; /* keep quick click from having effect */
  225.                 }
  226.                 else {
  227.                     /* move the window */
  228.                     win_SetPixPosition(win, mvpnt.x, mvpnt.y);
  229.  
  230.                     if (action != ACT_MOVE) {    /* Size action */
  231.                         /* resize the window */
  232.                         win_SetPixSize(win, szpnt.x, szpnt.y);
  233.                     }
  234.                 }
  235.             }
  236.         }
  237.     }
  238.     if (olmoved) {
  239.         /* move the window for real */
  240.         win_SetPixPosition(win, mvpnt.x, mvpnt.y);
  241.  
  242.         if (action != ACT_MOVE) {    /* Size action */
  243.             /* resize the window for real */
  244.             win_SetPixSize(win, szpnt.x, szpnt.y);
  245.         }
  246.     }
  247. }
  248. /* -------------------------------------------------------------------------- */
  249.  
  250.