[comp.windows.x] Toolkit/Events question

mcintyrd@cs.rpi.edu (David McIntyre) (03/14/89)

I have a question about the toolkit and event handling.

I have a box widget, which I want to draw on using the Xlib
graphics primitives.  I can do this, no problem.

Next, I want to catch exposure events on this widget so that
I can redraw the graphics if desired.  I do this by
calling XtAddEventHandler on this widget, with an
ExposureMask.

I catch lots of expose events.  This is good.  However, as
soon as I actually draw on the box, I no longer get
ANY expose events for this widget.  Adding the event
handler again does not help!

Synopsis:  The event handler on my box widget won't catch
expose events after I have drawn on it.

I am using X11R3, Athena Tookit, Sun 3/60.

I would really appreciate any help that anyone can send me.

			-Dave

PS.  I think this is a better question that than last
     stupid question I posted, eh?

Dave "mr question" McIntyre     |      "....say you're thinking about a plate
mcintyre@turing.cs.rpi.edu      |       of shrimp.....and someone says to 
office : 518-276-8633		|	you `plate,' or `shrimp'......"
home   : 518-271-6664		|

kit@ATHENA.MIT.EDU (Chris D. Peterson) (03/15/89)

> Synopsis:  The event handler on my box widget won't catch
> expose events after I have drawn on it.

I cannot reproduce this one, the code provided here seems to do the right
thing.  It draws and X every time the window is exposed.  


						Chris D. Peterson     
						MIT X Consortium /
						Project Athena 

Net:	kit@athena.mit.edu		
Phone: (617) 253 - 1326			
USMail: MIT - Room E40-321
	77 Massachusetts Ave.		
	Cambridge, MA 02139		

--- cut here ---

/*
 * Test of drawing in a box on exposeure events.
 */

#include <stdio.h>
#include <X11/Intrinsic.h>
#include <X11/Box.h>
#include <X11/StringDefs.h>

static void ExposureProc();
GC gc;

void 
main (argc, argv)
int argc;
char **argv;
{
  Widget toplevel, box;
  Arg args[10];
  Cardinal num_args = 0;
  XGCValues values;

  toplevel = XtInitialize(NULL, "Demo", NULL, (Cardinal) 0, &argc, argv);

  XtSetArg(args[num_args], XtNwidth,  100);	num_args++;
  XtSetArg(args[num_args], XtNheight, 100);	num_args++;
  XtSetArg(args[num_args], XtNbackground, XtScreen(toplevel)->white_pixel);
  num_args++;
  box =  XtCreateManagedWidget("helloWorld", boxWidgetClass, toplevel,
			       args, num_args);

  values.foreground = XtScreen(toplevel)->black_pixel;
  values.line_width = 5;
  gc = XtGetGC(box, GCForeground | GCLineWidth, &values);

  XtAddEventHandler(box, ExposureMask, FALSE, ExposureProc, NULL);
  XtRealizeWidget(toplevel);
  XtMainLoop();
}

/* ARGSUSED */
static void
ExposureProc(w, junk, event)
Widget w;
caddr_t junk;
XEvent * event;
{
  Window win = XtWindow(w);
  Display * disp = XtDisplay(w);
  XExposeEvent * expose = (XExposeEvent *) event;

  if (expose->count != 0) return;

  XDrawLine(disp, win, gc, 10, 10, 90, 90);
  XDrawLine(disp, win, gc, 10, 90, 90, 10);
}