/* $Id: tixUnixDraw.c,v 1.1.1.1 2000/05/17 11:08:54 idiscovery Exp $ */
/*
* tixUnixDraw.c --
*
* Implement the Unix specific function calls for drawing.
*
* Copyright (c) 1996, Expert Interface Technologies
*
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
*/
#include "tixPort.h"
#include "tixUnixInt.h"
/*
*----------------------------------------------------------------------
* TixpDrawTmpLine --
*
* Draws a "temporary" line between the two points. The line can be
* removed by calling the function again with the same parameters.
*
* Results:
* Standard Tcl result.
*
* Side effects:
* A line is XOR'ed onto the screen.
*----------------------------------------------------------------------
*/
void
TixpDrawTmpLine(x1, y1, x2, y2, tkwin)
int x1;
int y1;
int x2;
int y2;
Tk_Window tkwin;
{
GC gc;
XGCValues values;
unsigned long valuemask = GCForeground | GCSubwindowMode | GCFunction;
Window winId; /* The Window to draw into. */
Tk_Window toplevel; /* Toplevel containing the tkwin. */
int rootx1, rooty1; /* Root x and y of the toplevel window. */
int rootx2, rooty2;
for (toplevel=tkwin; !Tk_IsTopLevel(toplevel);
toplevel=Tk_Parent(toplevel)) {
;
}
Tk_GetRootCoords(toplevel, &rootx1, &rooty1);
rootx2 = rootx1 + Tk_Width(toplevel) - 1;
rooty2 = rooty1 + Tk_Height(toplevel) - 1;
if (x1 >= rootx1 && x2 <= rootx2 && y1 >= rooty1 && y2 <= rooty2) {
/*
* The line is completely inside the toplevel containing
* tkwin. It's better to draw into this window because on some
* X servers, especially PC X Servers running on Windows,
* drawing into the root window shows no effect.
*/
winId = Tk_WindowId(toplevel);
x1 -= rootx1;
y1 -= rooty1;
x2 -= rootx1;
y2 -= rooty1;
} else {
winId = XRootWindow(Tk_Display(tkwin), Tk_ScreenNumber(tkwin));
}
values.foreground = 0xff;
values.subwindow_mode = IncludeInferiors;
values.function = GXxor;
gc = XCreateGC(Tk_Display(tkwin), winId, valuemask, &values);
XDrawLine(Tk_Display(tkwin), winId, gc, x1, y1, x2, y2);
XFreeGC(Tk_Display(tkwin), gc);
}
/*----------------------------------------------------------------------
* TixpDrawAnchorLines --
*
* See comments near Tix_DrawAnchorLines.
*----------------------------------------------------------------------
*/
void TixpDrawAnchorLines(display, drawable, gc, x, y, w, h)
Display *display;
Drawable drawable;
GC gc;
int x;
int y;
int w;
int h;
{
XPoint points[4];
if (w < 1) {
w = 1;
}
if (h < 1) {
h = 1;
}
XDrawRectangle(display, drawable, gc, x, y, w-1, h-1);
/*
* Draw these points so that the corners will not be rounded
*/
points[0].x = x;
points[0].y = y;
points[1].x = x + w - 1;
points[1].y = y;
points[2].x = x;
points[2].y = y + h - 1;
points[3].x = x + w - 1;
points[3].y = y + h - 1;
XDrawPoints(display, drawable, gc, points, 4, CoordModeOrigin);
}