=head1 NAME
Tk_CanvasTkwin, Tk_CanvasGetCoord, Tk_CanvasDrawableCoords, Tk_CanvasSetStippleOrigin, Tk_CanvasWindowCoords, Tk_CanvasEventuallyRedraw, Tk_CanvasTagsOption - utility procedures
for
canvas type managers
=
for
category C Programming
=head1 SYNOPSIS
B<
Tk_Window
B<Tk_CanvasTkwin>(I<canvas>)
int
B<Tk_CanvasGetCoord>(I<interp, canvas, string, doublePtr>)
B<Tk_CanvasDrawableCoords>(I<canvas, x, y, drawableXPtr, drawableYPtr>)
B<Tk_CanvasSetStippleOrigin>(I<canvas, gc>)
B<Tk_CanvasWindowCoords>(I<canvas, x, y, screenXPtr, screenYPtr>)
B<Tk_CanvasEventuallyRedraw>(I<canvas, x1, y1, x2, y2>)
Tk_OptionParseProc
*B
<Tk_CanvasTagsParseProc>;
Tk_OptionPrintProc
*B
<Tk_CanvasTagsPrintProc>;
=head1 ARGUMENTS
=over 4
=item Tk_Canvas canvas (in)
A token that identifies a canvas widget.
=item Tcl_Interp
*interp
(in/out)
Interpreter to
use
for
error reporting.
=item char
*string
(in)
Textual description of a canvas coordinate.
=item double
*doublePtr
(out)
Points to place to store a converted coordinate.
=item double x (in)
An x coordinate in the space of the canvas.
=item double y (in)
A y coordinate in the space of the canvas.
=item short
*drawableXPtr
(out)
Pointer to a location in which to store an x coordinate in the space
of the drawable currently being used to redisplay the canvas.
=item short
*drawableYPtr
(out)
Pointer to a location in which to store a y coordinate in the space
of the drawable currently being used to redisplay the canvas.
=item GC gc (out)
Graphics context to modify.
=item short
*screenXPtr
(out)
Points to a location in which to store the screen coordinate in the
canvas window that corresponds to I<x>.
=item short
*screenYPtr
(out)
Points to a location in which to store the screen coordinate in the
canvas window that corresponds to I<y>.
=item
int
x1 (in)
Left edge of the region that needs redisplay. Only pixels at or to
the right of this coordinate need to be redisplayed.
=item
int
y1 (in)
Top edge of the region that needs redisplay. Only pixels at or below
this coordinate need to be redisplayed.
=item
int
x2 (in)
Right edge of the region that needs redisplay. Only pixels to
the left of this coordinate need to be redisplayed.
=item
int
y2 (in)
Bottom edge of the region that needs redisplay. Only pixels above
this coordinate need to be redisplayed.
=back
=head1 DESCRIPTION
These procedures are called by canvas type managers to perform various
utility functions.
B<Tk_CanvasTkwin> returns the Tk_Window associated
with
a particular
canvas.
B<Tk_CanvasGetCoord> translates a string specification of a
coordinate (such as B<2p> or B<1.6c>) into a double-precision
canvas coordinate.
If I<string> is a valid coordinate description then B<Tk_CanvasGetCoord>
stores the corresponding canvas coordinate at
*I
<doublePtr>
and returns TCL_OK.
Otherwise it stores an error message in I<interp-E<gt>result> and
returns TCL_ERROR.
B<Tk_CanvasDrawableCoords> is called by type managers during
redisplay to compute where to draw things.
Given I<x> and I<y> coordinates in the space of the
canvas, B<Tk_CanvasDrawableCoords> computes the corresponding
pixel in the drawable that is currently being used
for
redisplay;
it returns those coordinates in
*I
<drawableXPtr> and
*I
<drawableYPtr>.
This procedure should not be invoked except during redisplay.
B<Tk_CanvasSetStippleOrigin> is also used during redisplay.
It sets the stipple origin in I<gc> so that stipples drawn
with
I<gc> in the current offscreen pixmap will line up
with
stipples drawn
with
origin (0,0) in the canvas's actual
window.
B<Tk_CanvasSetStippleOrigin> is needed in order to guarantee
that stipple patterns line up properly
when
the canvas is
redisplayed in small pieces.
Redisplays are carried out in double-buffered fashion where a
piece of the canvas is redrawn in an offscreen pixmap and then
copied back onto the screen.
In this approach the stipple origins in graphics contexts need to
be adjusted during
each
redisplay to compensate
for
the position
of the off-screen pixmap relative to the window.
If an item is being drawn
with
stipples, its type manager typically
calls B<Tk_CanvasSetStippleOrigin> just
before
using I<gc>
to draw something;
after
it is finished drawing, the type manager
calls B<XSetTSOrigin> to restore the origin in I<gc> back to (0,0)
(the restore is needed because graphics contexts are shared, so
they cannot be modified permanently).
B<Tk_CanvasWindowCoords> is similar to B<Tk_CanvasDrawableCoords>
except that it returns coordinates in the canvas's window on the
screen, instead of coordinates in an off-screen pixmap.
B<Tk_CanvasEventuallyRedraw> may be invoked by a type manager
to inform Tk that a portion of a canvas needs to be redrawn.
The I<x1>, I<y1>, I<x2>, and I<y2> arguments
specify the region that needs to be redrawn, in canvas coordinates.
Type managers rarely need to invoke B<Tk_CanvasEventuallyRedraw>,
since Tk can normally figure out
when
an item
has
changed and make
the redisplay request on its behalf (this happens,
for
example
whenever Tk calls a I<configureProc> or I<scaleProc>).
The only
time
that a type manager needs to call
B<Tk_CanvasEventuallyRedraw> is
if
an item
has
changed on its own
without being invoked through one of the procedures in its Tk_ItemType;
this could happen,
for
example, in an image item
if
the image is
modified using image commands.
B<Tk_CanvasTagsParseProc> and B<Tk_CanvasTagsPrintProc> are
procedures that handle the B<-tags> option
for
canvas items.
The code of a canvas type manager won't call these procedures
directly, but will
use
their addresses to create a B<Tk_CustomOption>
structure
for
the B<-tags> option. The code typically looks
like this:
static Tk_CustomOption tagsOption = {Tk_CanvasTagsParseProc,
Tk_CanvasTagsPrintProc, (ClientData) NULL
};
static Tk_ConfigSpec configSpecs[] = {
...
{TK_CONFIG_CUSTOM,
"-tags"
, (char *) NULL, (char *) NULL,
(char *) NULL, 0, TK_CONFIG_NULL_OK,
&tagsOption
},
...
};
=head1 KEYWORDS
canvas, focus, item type, redisplay, selection, type manager