siemens-rtl/commit_op.c
2023-07-11 14:40:13 +02:00

162 lines
5.1 KiB
C

#ifndef lint
static char sccs_id[] = "@(#)commit_op.c 5.3 9/1/88";
#endif
/*
* Copyright 1988 by Siemens Research and Technology Laboratories, Princeton, NJ
*
* All Rights Reserved
*
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose and without fee is hereby granted,
* provided that the above copyright notice appear in all copies and that
* both that copyright notice and this permission notice appear in
* supporting documentation, and that the name of Siemens Research and Technology
* Laboratories not be used in advertising or publicity pertaining to
* distribution of the software without specific, written prior permission.
*
*
* SIEMENS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
* SIEMENS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
* ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
* WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
#include "basetype.h"
#include "twinD.h"
#include "state.h"
#include "tile.h"
#include "win.h"
void
Commit_Operation(winp)
Tilwin *winp;
{
Tilwin *mod_winp;
Basetype shrink_coord;
Side side;
TWRectangle rect,
current_rect,
new_rect;
WinpHandle handle;
/* Check for no-op
*/
current_rect = Tilwin_Get_Rectangle(winp);
new_rect = Tilwin_Get_Modify_Rectangle(winp);
if (Get_LeftX(current_rect) == Get_LeftX(new_rect) &&
Get_RightX(current_rect) == Get_RightX(new_rect) &&
Get_TopY(current_rect) == Get_TopY(new_rect) &&
Get_BottomY(current_rect)==Get_BottomY(new_rect) &&
Tilwin_Is_Open(winp) == TRUE){
/* DON'T need to mark this window as just modified
* for the interface code
*/
return;
}
/* Close Windows needing Closing...
*/
handle = State_Gen_Potentially_Closed();
while ( (mod_winp = State_Coerce(handle)) != WINP_NULL )
{
State_Auto_Close((Tilwin *) mod_winp);
Win_Close(mod_winp);
Tilwin_Was_Automatically_Closed(mod_winp) = TRUE;
State_Next_Window(&handle);
}
/* "mark" Windows which were Modified...
*/
handle = State_Gen_Potentially_Modfd();
while ( (mod_winp = State_Coerce(handle)) != WINP_NULL )
{
State_Open((Tilwin *) mod_winp);
if (Tilwin_Get_Modify_Side(mod_winp) == Left)
{
shrink_coord = Get_LeftX( Tilwin_Get_Modify_Rectangle(mod_winp) );
}
else if (Tilwin_Get_Modify_Side(mod_winp) == Right)
{
shrink_coord = Get_RightX( Tilwin_Get_Modify_Rectangle(mod_winp) );
}
else if (Tilwin_Get_Modify_Side(mod_winp) == Top)
{
shrink_coord = Get_TopY( Tilwin_Get_Modify_Rectangle(mod_winp) );
}
else /* (Tilwin_Get_Modify_Side(mod_winp) == Bottom) */
{
shrink_coord = Get_BottomY( Tilwin_Get_Modify_Rectangle(mod_winp) );
}
Win_Shrink(mod_winp, Tilwin_Get_Modify_Side(mod_winp),
shrink_coord);
State_Next_Window(&handle);
}
side = Tilwin_Get_Modify_Side(winp);
new_rect = Tilwin_Get_Modify_Rectangle(winp);
rect = Tilwin_Get_Rectangle(winp);
/* if the window is currently opened and the side is NoSide, then we are
* doing a reopen so first we should close the window
*/
if (side == NoSide && Tilwin_Is_Open(winp) == TRUE)
Win_Close(winp);
State_Open((Tilwin *) winp);
/* if side == NoSide we are doing a (re)open */
if (side == NoSide)
Win_Open(winp, new_rect);
/* else we are doing a resize */
else{
/* shrink all sides which need to be shrunk */
if (side == Left || side == Top_Left || side == Bottom_Left){
if (Get_LeftX(rect) < Get_LeftX(new_rect))
Win_Shrink(winp, Left, Get_LeftX(new_rect));
}
else if (side == Right || side == Top_Right || side == Bottom_Right){
if (Get_RightX(rect) > Get_RightX(new_rect))
Win_Shrink(winp, Right, Get_RightX(new_rect));
}
if (side == Top || side == Top_Right || side == Top_Left){
if (Get_TopY(rect) < Get_TopY(new_rect))
Win_Shrink(winp, Top, Get_TopY(new_rect));
}
else if (side == Bottom || side == Bottom_Right || side == Bottom_Left){
if (Get_BottomY(rect) > Get_BottomY(new_rect))
Win_Shrink(winp, Bottom, Get_BottomY(new_rect));
}
/* enlarge all sides which need to be enlarged */
if (side == Left || side == Top_Left || side == Bottom_Left){
if (Get_LeftX(rect) > Get_LeftX(new_rect))
Win_Enlarge(winp, Left, Get_LeftX(new_rect));
}
else if (side == Right || side == Top_Right || side == Bottom_Right){
if (Get_RightX(rect) < Get_RightX(new_rect))
Win_Enlarge(winp, Right, Get_RightX(new_rect));
}
if (side == Top || side == Top_Right || side == Top_Left){
if (Get_TopY(rect) > Get_TopY(new_rect))
Win_Enlarge(winp, Top, Get_TopY(new_rect));
}
else if (side == Bottom || side == Bottom_Right || side == Bottom_Left){
if (Get_BottomY(rect) < Get_BottomY(new_rect))
Win_Enlarge(winp, Bottom, Get_BottomY(new_rect));
}
}
}