[comp.windows.x] need help porting to x

halam2@umn-d-ub.D.UMN.EDU (Haseen I. Alam) (07/12/90)

 Hi there,

 I am relatively new in SunView environment.  I wrote a program to do
 edge linking on Unix systems in C.  Next I added three procedures called
 open_display, put_pixel, and close_display.  open_display is passed in
 the x and y dimensions and it opens up a window of that size.  put_pixel
 is passed in the x,y coordinates and a gray level value.  I use this
 same procedure to turn pixels on and off.  Then at the end I call
 close_display to close the display window.  At some point or other I would
 like to port this program to X-windows as well.

 These procedures are defined in a file (included below) that I link via
 makefile with my actual program.  Everything works fine, almost!  One
 problem is if I open up aother window that overlaps the display window,
 then it does not refresh anymore.  The other problem is serious: at the
 end of the program it pops up a little dialog box saying "Use left button
 to quit" (something similar to that).  If by mistake I use any of the other
 two buttons then I get a DEVICE BUSY error. then I either have to use 
 CTRL-C or pull down a menu from the title bar and exit.  Also I saw a call
 that I can add to bring the display window in front of all the other
 windows, but I forgot its name.

 I would appreciate if any kind soul will help me with the above three
 problems of (1) window refresh, (2) Device busy error, (3) making it the
 top most window at the end, and (4) some code/pointer to implement the
 above mentioned operations in X-windows.
  
 Thanks in advance.

 Haseen.

 PS:  please e-mail.

/* This is intdisp.c   note this is not a main program */

#include <suntool/sunview.h>
#include <suntool/canvas.h>

#define BUFSIZ 1024

Frame      base_frame ;
Canvas     canvas ;
Cursor     cursor ;
Pixwin    *pw, *fpw ;
Pixrect   *mem_create() ;
char       cmsname[BUFSIZ] ;
u_char     red[256], green[256], blue[256] ;
colormap_t colormap ;
int        X_size, Y_size;


static void canvas_event_proc() ;
void open_display () ;
void put_pixel () ;
void close_display () ;


void open_display (x,y)
    int x,y ;
{
    base_frame = window_create (NULL, FRAME,
				FRAME_LABEL,	"Display",
				WIN_HEIGHT,   y+20,
				WIN_WIDTH,    x+20,
				0 ) ;

    create_show_popup () ;
    window_set (base_frame,WIN_SHOW,TRUE,0) ;
    notify_dispatch () ;

    X_size = x ;
    Y_size = y ;

}

void close_display()
{
     window_destroy(base_frame);
     window_main_loop(base_frame);
}


create_show_popup()
{
        setup_colourmap();
	cursor = cursor_create(
		    CURSOR_OP, PIX_SRC ^ PIX_DST,
		    CURSOR_CROSSHAIR_LENGTH, 20,
		    CURSOR_SHOW_CROSSHAIRS, TRUE,0);
	canvas = window_create(base_frame, CANVAS,
		    WIN_CURSOR, cursor,
		    CANVAS_HEIGHT, 768,
		    CANVAS_WIDTH,  768,
		    CANVAS_AUTO_SHRINK, FALSE,
		    WIN_EVENT_PROC,  canvas_event_proc,
		    WIN_CONSUME_PICK_EVENT, WIN_IN_TRANSIT_EVENTS,
		    0);
	pw = canvas_pixwin(canvas);
         
}



setup_colourmap()
{
	register int i;

	for (i = 0; i < 256; i++) {
		red[i] = green[i] = blue[i] = -1;
	}
	fpw = (Pixwin *) window_get(base_frame, WIN_PIXWIN);

	if (colormap.type == RMT_NONE || colormap.length == 0) {
		sprintf(cmsname, "greyscale%d", 8);

		pw_setcmsname(fpw, cmsname);

		for (i = 1; i < 255; i++) {
			red[i] = i;
			green[i] = i;
			blue[i] = i;
		}
		pw_putcolormap(fpw, 0, 256, red, green, blue);
	}
	window_set(base_frame, FRAME_INHERIT_COLORS, TRUE, 0);
}


static void canvas_event_proc (canvas, event, arg)
	Canvas  canvas;
	Event  *event;
	caddr_t arg;
{
    ;
}

void put_pixel(x,y,value)
    int x,y,value;
{
    pw_put(pw,x,y,value);
    notify_dispatch();
}


-- 
 .--------------------------------------------------------------------.
 |  Haseen Ibne Alam               |  email : halam2@ub.d.umn.edu     |  
 |  "LET THE FORCE BE WITH YOU."   |    or    halam@cola.d.umn.edu    |
 `--------------------------------------------------------------------'