/* * CDE - Common Desktop Environment * * Copyright (c) 1993-2012, The Open Group. All rights reserved. * * These libraries and programs are free software; you can * redistribute them and/or modify them under the terms of the GNU * Lesser General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) * any later version. * * These libraries and programs are distributed in the hope that * they will be useful, but WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public * License along with these libraries and programs; if not, write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301 USA */ /* $XConsortium: event.c /main/6 1996/10/21 15:28:00 mgreess $ */ /********************************************************************* * (c) Copyright 1993, 1994 Hewlett-Packard Company * (c) Copyright 1993, 1994 International Business Machines Corp. * (c) Copyright 1993, 1994 Sun Microsystems, Inc. * (c) Copyright 1993, 1994 Unix System Labs, Inc., a subsidiary of * Novell, Inc. **********************************************************************/ /****************************************************************************** ** Program: dticon ** ** Description: X11-based multi-color icon editor ** ** File: event.c, which contains the following subroutines or ** functions: ** Clear_ClickCount() ** ProcessTabletEvent() ** Do_ButtonOp() ** iLine() ** iRectangle() ** iArc() ** iPolygon() ** ****************************************************************************** ** ** Copyright Hewlett-Packard Company, 1990, 1991, 1992. ** All rights are reserved. Copying or reproduction of this program, ** except for archival purposes, is prohibited without prior written ** consent of Hewlett-Packard Company. ** ** Hewlett-Packard makes no representations about the suitibility of this ** software for any purpose. It is provided "as is" without express or ** implied warranty. ** ******************************************************************************/ #include #include #include "externals.h" #include "main.h" #ifdef DEBUG extern Widget iconForm; #endif static Boolean DoingHotBox=False; static XtIntervalId polyTimerID; Widget coordinateText; static int Prev_x, Prev_y; static void Clear_ClickCount( void ) { #ifdef DEBUG if (debug) stat_out(" - CLICK-COUNT ZEROED.\n"); #endif ClickCount = 0; } /* Forward declarations */ void iArc( int x, int y, int width, int height, Boolean backupFlag); void iLine( int x1, int y1, int x2, int y2, Boolean backupFlag); void iRectangle( int x, int y, int width, int height, Boolean backupFlag); void iPolygon(void); void Do_ButtonOp(XEvent *); /*************************************************************************** * * * Routine: ProcessTabletEvent * * * * Purpose: Global event-handling routine for user input on the tablet. * * * ***************************************************************************/ void ProcessTabletEvent( Widget w, XEvent *xptr, String *params, Cardinal num_params ) { #ifdef DEBUG Arg args[10]; Dimension db_width, db_height; #endif int x, y, width, height, i, n, xGrid, yGrid; char tmpstr[20]; XmString str; if (num_params == 3) ClickCount = atoi(params[2]); #ifdef DEBUG if (debug) printf("Event - "); #endif switch(xptr->type) { case ButtonPress : x = xptr->xbutton.x; y = xptr->xbutton.y; #ifdef DEBUG if (debug) printf("Btn Press at [%d,%d]\n", x, y); #endif if (xptr->xbutton.window == tablet_win) Do_ButtonOp(xptr); break; case MotionNotify : x = xptr->xmotion.x; y = xptr->xmotion.y; /* Adjust for the Magnification Factor */ xGrid = x/MagFactor + 1; yGrid = y/MagFactor + 1; /* if coordinates are different then update Previous x & y Display new coordinates, but first... If the ERASER is ON then redraw the contents of the previous Rect. Draw the bounding Rect. */ if (xGrid!=Prev_x || yGrid!=Prev_y){ if (GraphicsOp == ERASER) { Transfer_Back_Image(Prev_x-2, Prev_y-2, (Prev_x+1), (Prev_y+1), HOLLOW); XDrawRectangle(dpy, tablet_win, Erase_gc, xGrid*MagFactor-(2*MagFactor), yGrid*MagFactor-(2*MagFactor), (3*MagFactor), (3*MagFactor) ); } Prev_x = xGrid; Prev_y = yGrid; tmpstr[0] = '\0'; sprintf(tmpstr, "%dx%d", xGrid, yGrid); str= XmStringCreateLocalized (tmpstr); XtVaSetValues (coordinateText, XmNlabelString, str, NULL); XmStringFree(str); } #ifdef DEBUG if (debug) printf("Btn Motion at [%d,%d]\n", x, y); #endif if (xptr->xmotion.window == tablet_win) Do_ButtonOp(xptr); break; case ButtonRelease : x = xptr->xbutton.x; y = xptr->xbutton.y; #ifdef DEBUG if (debug) { printf("Btn Release at [%d,%d]", x, y); if (ClickCount) printf(", CLICK COUNT = %d", ClickCount); printf("\n"); } #endif if (xptr->xbutton.window == tablet_win) Do_ButtonOp(xptr); break; case Expose : if (!tablet_win) { tablet_win = XtWindow(tablet_wid); } if (xptr->xexpose.window == tablet_win) { x = xptr->xexpose.x; y = xptr->xexpose.y; width = xptr->xexpose.width; height = xptr->xexpose.height; #ifdef DEBUG if (debug) printf("Exposure at [%d,%d] of %dx%d\n", x, y, width, height); #endif Repaint_Tablet(xptr->xexpose.window, x, y, width, height); } else if (xptr->xexpose.window == XtWindow(iconImage)) { XCopyArea(dpy, color_icon, XtWindow(iconImage), Color_gc, 0, 0, icon_width, icon_height, 0, 0); #ifdef DEBUG if (debug) printf("Exposure on iconImage: REPAINTING\n"); #endif } else if (xptr->xexpose.window == XtWindow(monoImage)) { XCopyArea(dpy, mono_icon, XtWindow(monoImage), Color_gc, 0, 0, icon_width, icon_height, 0, 0); #ifdef DEBUG if (debug) printf("Exposure on monoImage: REPAINTING\n"); #endif } if (argsNeedProcessed) ProcessAppArgs(); break; case EnterNotify : x = xptr->xcrossing.x; y = xptr->xcrossing.y; #ifdef DEBUG if (debug) printf("Enter window at [%d,%d]\n", x, y); #endif break; case LeaveNotify : x = xptr->xcrossing.x; y = xptr->xcrossing.y; /* if in ERASER mode restore contents of bounding Rect when leaving the tablet */ if (GraphicsOp == ERASER ) Transfer_Back_Image(Prev_x-2, Prev_y-2, (Prev_x+1), (Prev_y+1), HOLLOW); if (xptr->xcrossing.window == tablet_win) Do_ButtonOp(xptr); #ifdef DEBUG if (debug) { printf("Leave window at [%d,%d]\n", x, y); i = 0; XtSetArg(args[i], XmNwidth, &db_width); i++; XtSetArg(args[i], XmNheight, &db_height); i++; XtGetValues(iconForm, args, i); stat_out(" - iconForm dimensions: [%dx%d]\n", db_width, db_height); i = 0; XtSetArg(args[i], XmNwidth, &db_width); i++; XtGetValues(iconImage, args, i); stat_out(" - icon widths: %d\n", db_width); } #endif break; case FocusIn : case FocusOut : #ifdef DEBUG if (debug) printf("Focus change\n"); #endif break; default : #ifdef DEBUG if (debug) printf("UNKNOWN type: %d\n", xptr->type); #endif break; break; } /* switch */ } /*************************************************************************** * * * Routine: Do_ButtonOp * * * * Purpose: Process ButtonPress/ButtonMotion/ButtonRelease events * * generated by the user on the tablet. Switch between correct * * behaviors depending on the current GraphicsOp tool selected. * * * ***************************************************************************/ static int Pressed = False, First = False; void Do_ButtonOp( XEvent *xptr ) { Window lwin; int e_type, x, y, i, j; XRectangle box; char tmpstr[20]; XmString str; e_type = xptr->type; switch (e_type) { case ButtonPress : case ButtonRelease : x = xptr->xbutton.x; y = xptr->xbutton.y; lwin = xptr->xbutton.window; break; case MotionNotify : x = xptr->xmotion.x; y = xptr->xmotion.y; lwin = xptr->xmotion.window; break; } /* switch */ switch (e_type) { case ButtonPress : switch (GraphicsOp) { case S_HOTSPOT : if (xptr->xbutton.window == tablet_win) { tx = x; ty = y; Icon_Coords(tx, ty, &ix, &iy); X_Hot = ix; Y_Hot = iy; hotSpot = True; #ifdef DEBUG if (debug) stat_out(" - HOTSPOT selected at [%d,%d]\n", ix, iy); #endif Repaint_Exposed_Tablet(); } break; case S_PASTE : case S_ROTATE : case S_SCALE_2 : tx = x; ty = y; if (GraphicsOp == S_PASTE) XDrawRectangle(dpy, tablet_win, Flicker_gc, last_tx, last_ty, CutCopy->width*MagFactor - MagFactor, CutCopy->height*MagFactor - MagFactor); else if (GraphicsOp == S_ROTATE) XDrawRectangle(dpy, tablet_win, Flicker_gc, last_tx, last_ty, Rotate->width*MagFactor - MagFactor, Rotate->height*MagFactor - MagFactor); else XDrawRectangle(dpy, tablet_win, Flicker_gc, last_tx, last_ty, Scale->width*MagFactor - MagFactor, Scale->height*MagFactor - MagFactor); Icon_Coords(tx, ty, &ix, &iy); Do_Paste(ix, iy); break; case ERASER : case POINT : Pressed = True; last_tx = tx; last_ty = ty; tx = x; ty = y; Icon_Coords(tx, ty, &ix, &iy); Backup_Icons(); if (GraphicsOp == ERASER) { for (i=ix-1; i<=ix+1; i++) for (j=iy-1; j<=iy+1; j++) { XDrawPoint(dpy, color_icon, Erase_gc, i, j); XDrawPoint(dpy, XtWindow(iconImage), Erase_gc, i, j); XDrawPoint(dpy, mono_icon, Erase_gc, i, j); XDrawPoint(dpy, XtWindow(monoImage), Erase_gc, i, j); Paint_Tile(i, j, Erase_gc); } } else { XDrawPoint(dpy, color_icon, Color_gc, ix, iy); XDrawPoint(dpy, XtWindow(iconImage), Color_gc, ix, iy); XDrawPoint(dpy, mono_icon, Mono_gc, ix, iy); XDrawPoint(dpy, XtWindow(monoImage), Mono_gc, ix, iy); Paint_Tile(ix, iy, Color_gc); } case FLOOD : break; case SELECT : if (DoingHotBox) { DoingHotBox = False; Selected = False; Stop_HotBox(); } case LINE : case CIRCLE : case ELLIPSE : case S_SCALE_1 : case RECTANGLE : Quantize(&x, &y, True); Pressed = True; tx = x; ty = y; last_tx = tx; last_ty = ty; First = True; #ifdef DEBUG if (debug) stat_out(" - Quantized to [%d,%d]\n", x, y); #endif break; case S_GRAB : XGrabServer(dpy); XSync(dpy, False); Pressed = True; tx = x; ty = y; last_tx = tx; last_ty = ty; First = True; break; case POLYLINE : case POLYGON : Quantize(&x, &y, True); tx = x; ty = y; First = True; Icon_Coords(tx, ty, &ix, &iy); pointList[pointCount].x = ix; pointList[pointCount].y = iy; if (pointCount < MAX_PTS) { pointCount++; #ifdef DEBUG if (debug) stat_out(" - pointCount++ [%d]\n", pointCount); #endif } if (!Anchored) { Anchored = True; pointCount = 1; Backup_Icons(); } else { if (ClickCount) { Anchored = False; ClickCount = 0; if (GraphicsOp == POLYGON) iPolygon(); pointCount = 0; } Icon_Coords(last_tx, last_ty, &last_ix, &last_iy); iLine(ix, iy, last_ix, last_iy, False); } last_tx = tx; last_ty = ty; ClickCount++; polyTimerID = XtAppAddTimeOut( AppContext, multiClickTime, (XtTimerCallbackProc) Clear_ClickCount, NULL); break; } /* switch(GraphicsOp) */ break; case ButtonRelease : switch (GraphicsOp) { case ERASER : case POINT : if (Pressed) { last_tx = tx; last_ty = ty; tx = x; ty = y; Icon_Coords(tx, ty, &ix, &iy); if (GraphicsOp == ERASER) { for (i=ix-1; i<=ix+1; i++) for (j=iy-1; j<=iy+1; j++) { XDrawPoint(dpy, color_icon, Erase_gc, i, j); XDrawPoint(dpy, XtWindow(iconImage), Erase_gc, i, j); XDrawPoint(dpy, mono_icon, Erase_gc, i, j); XDrawPoint(dpy, XtWindow(monoImage), Erase_gc, i, j); Paint_Tile(i, j, Erase_gc); } /* for */ } /* if(GraphicsOp...) */ else { XDrawPoint(dpy, color_icon, Color_gc, ix, iy); XDrawPoint(dpy, XtWindow(iconImage), Color_gc, ix, iy); XDrawPoint(dpy, mono_icon, Mono_gc, ix, iy); XDrawPoint(dpy, XtWindow(monoImage), Mono_gc, ix, iy); Paint_Tile(ix, iy, Color_gc); } /* else */ Pressed = False; } /* if(Pressed) */ break; case FLOOD : tx = x; ty = y; Icon_Coords(tx, ty, &ix, &iy); Flood_Region(ix, iy); break; case LINE : if (Pressed) { Quantize(&x, &y, True); #ifdef DEBUG if (debug) stat_out(" - Quantized to [%d,%d]\n", x, y); #endif XDrawLine(dpy, tablet_win, Flicker_gc, tx, ty, last_tx, last_ty); tx = x; ty = y; Pressed = False; Icon_Coords(tx, ty, &ix, &iy); Icon_Coords(last_tx, last_ty, &last_ix, &last_iy); iLine(ix, iy, last_ix, last_iy, True); } break; case S_SCALE_1 : case SELECT : if (Pressed) { Quantize(&x, &y, True); XDrawRectangle(dpy, tablet_win, Flicker_gc, min(tx, last_tx), min(ty, last_ty), abs(tx-last_tx), abs(ty-last_ty)); tx = x; ty = y; Pressed = False; Icon_Coords(tx, ty, &ix, &iy); Icon_Coords(last_tx, last_ty, &last_ix, &last_iy); if (GraphicsOp == SELECT) { DoingHotBox = True; Start_HotBox(INITIAL); } else { Scale_Image(); /***TAG***/ GraphicsOp = S_SCALE_2; } } break; case S_GRAB : if (Pressed) { XDrawRectangle(dpy, lwin, Flicker_gc, min(tx, last_tx), min(ty, last_ty), abs(tx-last_tx), abs(ty-last_ty)); if (mag(last_tx, x) <= xrdb.maxIconWidth) tx = x; if (mag(last_ty, y) <= xrdb.maxIconHeight) ty = y; LoadGrabbedImage( min(tx, last_tx), min(ty, last_ty), abs(tx-last_tx), abs(ty-last_ty)); GraphicsOp = Backup_G_Op; Backup_G_Op = 0; Pressed = False; } break; case RECTANGLE : if (Pressed) { Quantize(&x, &y, True); XDrawRectangle(dpy, tablet_win, Flicker_gc, min(tx, last_tx), min(ty, last_ty), abs(tx-last_tx), abs(ty-last_ty)); tx = x; ty = y; Pressed = False; Icon_Coords(tx, ty, &ix, &iy); Icon_Coords(last_tx, last_ty, &last_ix, &last_iy); iRectangle(min(ix, last_ix), min(iy, last_iy), abs(ix-last_ix), abs(iy-last_iy), True); } break; case S_HOTSPOT : case S_WAIT_RELEASE : GraphicsOp = Backup_G_Op; Backup_G_Op = 0; break; case S_ROTATE : case S_SCALE_2 : case POLYLINE : case POLYGON : break; case CIRCLE : if (Pressed) { Quantize(&x, &y, True); Circle_Box(tablet_win, last_tx, last_ty, tx, ty, &box); tx = x; ty = y; Pressed = False; box.x /= MagFactor; box.y /= MagFactor; box.width = ((short)(box.width - 1) / MagFactor) + 1; box.height = ((short)(box.height - 1) / MagFactor) + 1; iArc(box.x, box.y, box.width, box.height, True); } break; case ELLIPSE : if (Pressed) { Quantize(&x, &y, True); XDrawArc(dpy, tablet_win, Flicker_gc, min(tx, last_tx), min(ty, last_ty), abs(tx-last_tx), abs(ty-last_ty), 0, 360*64); tx = x; ty = y; Pressed = False; Icon_Coords(tx, ty, &ix, &iy); Icon_Coords(last_tx, last_ty, &last_ix, &last_iy); iArc( min(ix, last_ix), min(iy, last_iy), abs(ix-last_ix)+1, abs(iy-last_iy)+1, True); } break; } /* switch(GraphicsOp) */ break; case MotionNotify : switch (GraphicsOp) { case S_PASTE : case S_ROTATE : case S_SCALE_2 : last_tx = tx; last_ty = ty; tx = x; ty = y; if (!FirstRigid) { if (GraphicsOp == S_PASTE) XDrawRectangle(dpy, tablet_win, Flicker_gc, last_tx, last_ty, CutCopy->width*MagFactor - MagFactor, CutCopy->height*MagFactor - MagFactor); else if (GraphicsOp == S_ROTATE) XDrawRectangle(dpy, tablet_win, Flicker_gc, last_tx, last_ty, Rotate->width*MagFactor - MagFactor, Rotate->height*MagFactor - MagFactor); else XDrawRectangle(dpy, tablet_win, Flicker_gc, last_tx, last_ty, Scale->width*MagFactor - MagFactor, Scale->height*MagFactor - MagFactor); } if (GraphicsOp == S_PASTE) XDrawRectangle(dpy, tablet_win, Flicker_gc, tx, ty, CutCopy->width*MagFactor - MagFactor, CutCopy->height*MagFactor - MagFactor); else if (GraphicsOp == S_ROTATE) XDrawRectangle(dpy, tablet_win, Flicker_gc, tx, ty, Rotate->width*MagFactor - MagFactor, Rotate->height*MagFactor - MagFactor); else XDrawRectangle(dpy, tablet_win, Flicker_gc, tx, ty, Scale->width*MagFactor - MagFactor, Scale->height*MagFactor - MagFactor); FirstRigid = False; case S_HOTSPOT : break; case ERASER : case POINT : if (Pressed) { last_tx = tx; last_ty = ty; tx = x; ty = y; Icon_Coords(tx, ty, &ix, &iy); if (GraphicsOp == ERASER) { for (i=ix-1; i<=ix+1; i++) for (j=iy-1; j<=iy+1; j++) { XDrawPoint(dpy, color_icon, Erase_gc, i, j); XDrawPoint(dpy, XtWindow(iconImage), Erase_gc, i, j); XDrawPoint(dpy, mono_icon, Erase_gc, i, j); XDrawPoint(dpy, XtWindow(monoImage), Erase_gc, i, j); Paint_Tile(i, j, Erase_gc); } /* for */ } /* if(GraphicsOp...) */ else { XDrawPoint(dpy, color_icon, Color_gc, ix, iy); XDrawPoint(dpy, XtWindow(iconImage), Color_gc, ix, iy); XDrawPoint(dpy, mono_icon, Mono_gc, ix, iy); XDrawPoint(dpy, XtWindow(monoImage), Mono_gc, ix, iy); Paint_Tile(ix, iy, Color_gc); } /* else */ } case FLOOD : break; case POLYLINE : case POLYGON : if (Anchored) { Quantize(&x, &y, True); if (!First) XDrawLine(dpy, tablet_win, Flicker_gc, tx, ty, last_tx, last_ty); tx = x; ty = y; XDrawLine(dpy, tablet_win, Flicker_gc, tx, ty, last_tx, last_ty); First = False; } break; case LINE : if (Pressed) { Quantize(&x, &y, True); if (!First) XDrawLine(dpy, tablet_win, Flicker_gc, tx, ty, last_tx, last_ty); tx = x; ty = y; XDrawLine(dpy, tablet_win, Flicker_gc, tx, ty, last_tx, last_ty); First = False; } break; case ELLIPSE : case SELECT : case S_SCALE_1 : case RECTANGLE : if (Pressed) { Quantize(&x, &y, True); if (!First) { if (GraphicsOp != ELLIPSE) XDrawRectangle(dpy, tablet_win, Flicker_gc, min(tx, last_tx), min(ty, last_ty), abs(tx-last_tx), abs(ty-last_ty)); else XDrawArc(dpy, tablet_win, Flicker_gc, min(tx, last_tx), min(ty, last_ty), abs(tx-last_tx), abs(ty-last_ty), 0, 360*64); } tx = x; ty = y; if (GraphicsOp != ELLIPSE) XDrawRectangle(dpy, tablet_win, Flicker_gc, min(tx, last_tx), min(ty, last_ty), abs(tx-last_tx), abs(ty-last_ty)); else XDrawArc(dpy, tablet_win, Flicker_gc, min(tx, last_tx), min(ty, last_ty), abs(tx-last_tx), abs(ty-last_ty), 0, 360*64); First = False; } break; case S_GRAB : if (Pressed) { if (!First) XDrawRectangle(dpy, lwin, Flicker_gc, min(tx, last_tx), min(ty, last_ty), abs(tx-last_tx), abs(ty-last_ty)); if (mag(last_tx, x) <= xrdb.maxIconWidth) tx = x; if (mag(last_ty, y) <= xrdb.maxIconHeight) ty = y; XDrawRectangle(dpy, lwin, Flicker_gc, min(tx, last_tx), min(ty, last_ty), abs(tx-last_tx), abs(ty-last_ty)); First = False; /* Tell the user the size of the grabbed image */ sprintf(tmpstr, GETSTR(18,2,"Grabbed Image Size = %dx%d"), abs(tx-last_tx), abs(ty-last_ty)); str= XmStringCreateLocalized (tmpstr); XtVaSetValues (coordinateText, XmNlabelString, str, NULL); XmStringFree(str); } break; case CIRCLE : if (Pressed) { Quantize(&x, &y, True); if (!First) Circle_Box(tablet_win, last_tx, last_ty, tx, ty, &box); tx = x; ty = y; Circle_Box(tablet_win, last_tx, last_ty, tx, ty, &box); First = False; } break; } /* switch(GraphicsOp) */ break; case LeaveNotify : switch (GraphicsOp) { case POLYLINE : case POLYGON : if (Anchored) { if (!First) XDrawLine(dpy, tablet_win, Flicker_gc, tx, ty, last_tx, last_ty); First = True; } break; } /* switch(GraphicsOp) */ break; } /* switch(e_type) */ } /*************************************************************************** * Routine: EndPolyOp * * Purpose: When user does a mouse action outside of the drawing window, * * this implicitly ends the poly* operation. This means that * * things like drawing circles and changing pen color while in * * the middle of a polyline or polygon is no longer allowed. * ***************************************************************************/ void EndPolyOp(void) { Anchored = False; Clear_ClickCount(); pointCount = 0; } void iLine( int x1, int y1, int x2, int y2, Boolean backupFlag ) { if (backupFlag) Backup_Icons(); XDrawLine(dpy, color_icon, Color_gc, x1, y1, x2, y2); XDrawLine(dpy, mono_icon, Mono_gc, x1, y1, x2, y2); XDrawLine(dpy, XtWindow(iconImage), Color_gc, x1, y1, x2, y2); XDrawLine(dpy, XtWindow(monoImage), Mono_gc, x1, y1, x2, y2); #ifdef DEBUG if (debug) stat_out("Transferring from [%d,%d] to [%d,%d]\n", tx, ty, last_tx, last_ty); #endif Transfer_Back_Image(x1, y1, x2, y2, FILL); } void iRectangle( int x, int y, int width, int height, Boolean backupFlag ) { if (backupFlag) Backup_Icons(); if (FillSolids) { XFillRectangle(dpy, color_icon, Color_gc, x, y, width+1, height+1); XFillRectangle(dpy, mono_icon, Mono_gc, x, y, width+1, height+1); XFillRectangle(dpy, XtWindow(iconImage), Color_gc, x, y, width+1, height+1); XFillRectangle(dpy, XtWindow(monoImage), Mono_gc, x, y, width+1, height+1); } else { XDrawRectangle(dpy, color_icon, Color_gc, x, y, width, height); XDrawRectangle(dpy, mono_icon, Mono_gc, x, y, width, height); XDrawRectangle(dpy, XtWindow(iconImage), Color_gc, x, y, width, height); XDrawRectangle(dpy, XtWindow(monoImage), Mono_gc, x, y, width, height); } Transfer_Back_Image(x, y, x+width, y+height, FILL); } void iArc( int x, int y, int width, int height, Boolean backupFlag ) { if (backupFlag) Backup_Icons(); if (FillSolids) { XFillArc(dpy, color_icon, Color_gc, x, y, width, height, 0, 360*64); XFillArc(dpy, mono_icon, Mono_gc, x, y, width, height, 0, 360*64); XFillArc(dpy, XtWindow(iconImage), Color_gc, x, y, width, height, 0, 360*64); XFillArc(dpy, XtWindow(monoImage), Mono_gc, x, y, width, height, 0, 360*64); } else { XDrawArc(dpy, color_icon, Color_gc, x, y, width, height, 0, 360*64); XDrawArc(dpy, mono_icon, Mono_gc, x, y, width, height, 0, 360*64); XDrawArc(dpy, XtWindow(iconImage), Color_gc, x, y, width, height, 0, 360*64); XDrawArc(dpy, XtWindow(monoImage), Mono_gc, x, y, width, height, 0, 360*64); } Transfer_Back_Image(x, y, x+width, y+height, FILL); } void iPolygon( void ) { int min_x, min_y, max_x, max_y, i; #ifdef DEBUG if (debug) stat_out("iPolygon: pointCount = %d\n", pointCount); #endif if (FillSolids) { XFillPolygon(dpy, color_icon, Color_gc, pointList, pointCount, Complex, CoordModeOrigin); XFillPolygon(dpy, mono_icon, Mono_gc, pointList, pointCount, Complex, CoordModeOrigin); XFillPolygon(dpy, XtWindow(iconImage), Color_gc, pointList, pointCount, Complex, CoordModeOrigin); XFillPolygon(dpy, XtWindow(monoImage), Mono_gc, pointList, pointCount, Complex, CoordModeOrigin); } else { if (pointCount < MAX_PTS) { pointList[pointCount].x = pointList[0].x; pointList[pointCount].y = pointList[0].y; pointCount++; } XDrawLines(dpy, color_icon, Color_gc, pointList, pointCount, Complex); XDrawLines(dpy, mono_icon, Mono_gc, pointList, pointCount, Complex); XDrawLines(dpy, XtWindow(iconImage), Color_gc, pointList, pointCount, Complex); XDrawLines(dpy, XtWindow(monoImage), Mono_gc, pointList, pointCount, Complex); } min_x = pointList[0].x; min_y = pointList[0].y; max_x = min_x; max_y = min_y; for (i=1; i max_x) max_x = pointList[i].x; if (pointList[i].y > max_y) max_y = pointList[i].y; } Transfer_Back_Image(min_x, min_y, max_x, max_y, FILL); }