/************************************************************************ ** ** FILE : hastemisc.c ** ** ZWECK : ** ** AUTOR : Michael C. Ancutici ** Universitaet Stuttgart, Fakultaet Informatik ** ** DATUM : 14.03.93 ** *************************************************************************/ #include "hastemisc.h" #include "haste.h" #include "hawin.h" #include "colors" #include "stewin.h" #include "ste.h" #include "hastemarke.h" #include "hagraph.h" #include "netsize.h" #include "hamess.h" #include "celltype.h" #include "simfire.h" #define LineWidth( gc, i) XSetLineAttributes( MyDisplay, gc, i, LineSolid, CapRound, JoinMiter) /************************************************************************* ** FUNKTION: HaSteDrawX ** ZWECK: zeichnet Stelle in Pixmap ** EINGABE: ** AUSGABE: ** RETURN: ** ANMERK: *************************************************************************/ void HaSteDrawX( SNr, ActualGC) int SNr; GC ActualGC; { XDrawArc( MyDisplay, HaGraphPixmap, ActualGC, SteStelle[ SNr]->PosStelle.x - HA_STE_RAD, SteStelle[ SNr]->PosStelle.y - HA_STE_RAD, HA_STE_DM-1, HA_STE_DM -1, 0, 360*64); } /************************************************************************* ** FUNKTION: HaSteDraw ** ZWECK: zeichnet Stelle in Pixmap und Window. ** EINGABE: ** AUSGABE: ** RETURN: ** ANMERK: *************************************************************************/ void HaSteDraw( SNr, ActualGC) int SNr; GC ActualGC; { int x, y; XDrawArc( MyDisplay, HaGraphPixmap, ActualGC, (x = SteStelle[ SNr]->PosStelle.x - HA_STE_RAD), (y = SteStelle[ SNr]->PosStelle.y - HA_STE_RAD), HA_STE_DM-1, HA_STE_DM -1, 0, 360*64); XCopyArea( MyDisplay, HaGraphPixmap, XtWindow( HaGraphPlane), SteGC, x, y, HA_STE_DM,HA_STE_DM, x, y); } /************************************************************************* ** FUNKTION: HaSteInit *************************************************************************/ void HaSteInit() { HaStePixmap = XCreatePixmap( MyDisplay, RootWindowOfScreen( XtScreen( HaShell)), HA_STE_DM, HA_STE_DM, MyDepth); HaSteColor = HaGetPixel( STELLE_COLOR); HaCreateGC( &SteGC, HaSteColor, HaBackColor, GXcopy); XFillRectangle( MyDisplay, HaStePixmap, InvClearGC, 0,0, HA_STE_DM, HA_STE_DM); XDrawArc( MyDisplay, HaStePixmap, InversGC, 0,0, HA_STE_DM-1, HA_STE_DM-1, 0, 360*64); XSetFont( MyDisplay, SteGC, HaNameFont->fid); HaSteMInit(); } /************************************************************************* ** FUNKTION: HaMovSte ** ZWECK: Zeichnet Stelle an Mausposition und loescht alte Stelle ** Dadurch scheint es, als ob sich die Stelle mit dem Mauszeiger ** mitbewegt. ** INPUT: Position Mauszeiger ** ANMERK: Wird bei einem Motion-Event aufgerufen *************************************************************************/ void HaMovSte( w, event, params, num_params) Widget w; XEvent *event; String *params; Cardinal *num_params; { int x = ((XMotionEvent *)event)->x; int y = ((XMotionEvent *)event)->y; HaInversSte( x, y); HaInversSte( HaAlt.x, HaAlt.y); HaAlt.x = x; HaAlt.y = y; } /************************************************************************* ** FUNKTION: HaMovSteStart ** ZWECK: Zeichnet eine Stelle an Position Mauszeiger. ** Als Vorbereitung fuer HaMoveSte. ** INPUT: Position Mauszeiger ** ANMERK: Wird bei einem Enter-Event aufgerufen. *************************************************************************/ void HaMovSteStart( w, event, params, num_params) Widget w; XEvent *event; String *params; Cardinal *num_params; { HaAlt.x = ((XMotionEvent *)event)->x; HaAlt.y = ((XMotionEvent *)event)->y; HaInversSte( HaAlt.x, HaAlt.y); } /************************************************************************* ** FUNKTION: HaMovSteStop ** ZWECK: Loescht gezeichnete Stelle. Dient als Abschluss fuer ** HaSteMov. ** ANMERK: Wird bei einem Leave-Event aufgerufen. *************************************************************************/ void HaMovSteStop( w, event, params, num_params) Widget w; XEvent *event; String *params; Cardinal *num_params; { HaInversSte( HaAlt.x, HaAlt.y); } void HaSteON() { if (HaToggleOn == HaSteToggle) { HaToggleOn = FALSE; HaWinSaySte( (Widget)0, (XtPointer)0, (XtPointer)0); } } void HaSteOFF() { HaWinSaySte( (Widget)0, (XtPointer)0, (XtPointer)0); HaToggleOn = HaSteToggle; } /************************************************************************* ** FUNKTION: HaSetSte ** ZWECK: Versucht eine Stelle zu setzen ** INPUT: Position Mauszeiger als Stellenmittelpunkt ** OUTPUT: Stelle oder Fehlermeldung ** ANMERK: wird bei einem Btn1Up-Event aufgerufen *************************************************************************/ void HaSetSte( w, event, params, num_params) Widget w; XEvent *event; String *params; Cardinal *num_params; { char ergLook; int SNr; XtPointer d; int x = ((XButtonEvent *)event)->x; int y = ((XButtonEvent *)event)->y; if ( (x < HA_STE_RAD) || (y < HA_STE_RAD) || (x > PLANE_WIDTH - HA_STE_RAD) || (y > PLANE_HEIGHT - HA_STE_RAD) ) { HaMessage( HA_OBJ_NEAR_BORDER); return; } if (CellSteLookFor( CE_NOTHING, x, y) != CE_OK) { HaMessage( HA_OBJ_NEAR_OBJ); /* kann spaeter genauer sein ! */ return; } if ( (SNr = SteNeu( x, y)) < 0 ) { HaMessage( HA_NO_FREE_STE); return; } HaSteDraw( SNr, SteGC); /* Stelle in Pixm + Plane zeich.*/ CellSteEin( SNr, x, y); /* Stelle in Cell eintragen */ HaMessage( HA_CLEAR); SimTouch(); if ( ((XButtonEvent *)event)->button == 2) { /* Attribute setzen ? */ HaSteOFF(); SteWinPopup( HaGraphPlane, (XtPointer)SNr, d); } else HaInversSte( HaAlt.x, HaAlt.y); /* MovStelle wieder einschalten */ } /************************************************************************* ** FUNKTION: HaWinSaySte ** ZWECK: Ein-/Ausschalter fuer HaMovSte-Funktionen *************************************************************************/ void HaWinSaySte( w, client_data, call_data) Widget w; XtPointer client_data, call_data; { static String SteMovOn = ": HaMovSte() \n\ : HaSetSte() \n\ : HaSetSte() \n\ : \n\ : HaMovSteStart() \n\ : HaMovSteStop()"; static String SteMovOff = ": \n\ : HaLook() \n\ : \n\ : HaWinSayMove() \n\ : \n\ :"; if (!HaToggleOn) { HaToggleOn = HaSteToggle; XtOverrideTranslations( HaGraphPlane, XtParseTranslationTable( SteMovOn)); } else { HaToggleOn = FALSE; XtOverrideTranslations( HaGraphPlane, XtParseTranslationTable( SteMovOff)); } HaMessage( HA_CLEAR); }