Re: GDK_POINTER_MOTION_HINT_MASK has no effect



On 11/29/07, Stewart Weiss <stewart weiss acm org> wrote:
> 1. I am assuming that when I queue a draw for the old position of
> the rubberbanded line, I am using XOR to draw it, so that it is in
> effect, an erasing, right?

Actually, I'd suggest using a plain draw rather than an XOR.

XOR rubberbanding works if you can treat your display as something you
can draw incrementally, that is, you know what is on the screen and
therefore you know whether this XOR draw will set or unset a line.

This is often not the case, especially in a complex application.
Instead, you should think of your window as being composed from a
number of separate layers (like photoshop layers), and that on an
expose you should completely repaint that section of the window by
drawing all layers from the back forwards.

> Right now, my function to draw a line uses gdk_draw_line into the pixmap
> and then calls gdk_window_invalidate_rect to send the expose event later.
> If I actually call the gdk_draw_line in the expose event handler, directly
> into the pixmap, would I then use gdk_draw_drawable to copy the pixmap into
> the window?   I know I can't queue a drawing event in the handler or else
> I have an infinite indirect recursive loop. Is this how?

Is this a raster drawing program, or a vector one?

Assuming it's raster, you should have two separate data structures.
Keep a large image around which has the current state of your user's
image. Only drawing operations go into this, no rubberbanding. This is
your background layer. Rubberband operations are in another layer
which floats on top of this.

On an expose, use your background image to paint the exposed pixels.
Then, if there's a rubber band active at the moment and if the
bounding box of the rubber band intersects the expose, draw that as
well on top of the image.

If you're curious, my app is here:

  http://www.vips.ecs.soton.ac.uk

To see the rubberbanding, load an image, doubleclick the thumbnail to
get a view window, then hold down CTRL and click and drag up and left
to get a vector, down and right to get a region, just click to get a
point, or drag from a ruler to get a guide.

If you try resizing outside the edge of the window, the window will
scroll in the background. You can move objects around by dragging on
their names. Hopefully you'll see all the objects, including the
animated ones, float over each other smoothly. There's a simple
paintbox on the View menu which also does some rubberbanding with some
of the tools.

John


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]