[Search for users] [Overall Top Noters] [List of all Conferences] [Download this site]

Conference bulova::decw_jan-89_to_nov-90

Title:DECWINDOWS 26-JAN-89 to 29-NOV-90
Notice:See 1639.0 for VMS V5.3 kit; 2043.0 for 5.4 IFT kit
Moderator:STAR::VATNE
Created:Mon Oct 30 1989
Last Modified:Mon Dec 31 1990
Last Successful Update:Fri Jun 06 1997
Number of topics:3726
Total number of notes:19516

848.0. "help DS3100,F77,Xlib error" by LARVAE::BULLARD () Fri May 26 1989 15:15

c
c	Can anyone take a quick look at this program and see if they
c       spot what is wrong with the program.The program has been 
c	borrowed from VMS modified so that it compiles and runs
c	on a DS3100 using the the F77 compiler.It compiles and links
c	okay but there is a segmentation error on the XNextEvent call.
c 	I cannot see what the problem is .Also I have commented out 
c	the call to XDrawLines because of the same problem.
c
c	The program requires two lines of input.You can enter almost
c	anything but I have been using :-
c
c		500,500 'return'  followed by
c		10,10	'return'.
c	
c	Please excuse my rather crude debugging steps.The Makefile follows:
c
c DESTDIR=
c EXAMPLEDIR=/usr/users/bullard
c
c
c INCLUDES = -I. -I${DESTDIR}/usr/include/X11 -I${DESTDIR}/usr/include
c XLIB = ${DESTDIR}/usr/lib/libX11.a
c XLIBF77 = ${DESTDIR}/usr/lib/libX11F77.a
c DWTLIB = ${DESTDIR}/usr/lib/libdwt.a
c f77 = f77
c CFLAGS = -O  ${INCLUDES}
c  
c OBJS =  window.o
c
c .f.o :
c         ${f77} -c ${CFLAGS} $*.f
c
c
c window: ${OBJS}
c        ${f77} ${CFLAGS} -o window ${OBJS} ${DWTLIB} ${XLIBF77} ${XLIB} -lm
c
c install: all
c
c Here is the code:
c
C Program to demonstrate drag using Xlib 
                   
	INCLUDE '/usr/include/X11/xlibF77.h'


	CHARACTER*10 DISPLAY		! display id
	INTEGER*4 DPY
	INTEGER*4 WINDOW_ID		! window id
	INTEGER*4 SCREEN
	INTEGER*4 PIXMAP_ID		! pixmap id
	INTEGER*4 BITMAP_ID		! bitmap id
	INTEGER*4 GC_MASK		! gc mask
	INTEGER*4 EVENT_MASK		! event mask
	INTEGER*4 GC			! gc id
	INTEGER*4 GC_CLEAR_PIXMAP
	INTEGER*4 GC_PIXMAP
	INTEGER*4 GC_BITMAP
	INTEGER*4 EVENT_INT
	INTEGER*4 WINDOW_X, WINDOW_Y
	INTEGER*4 CSIZE / 5 /

	INTEGER*4 XOpenDisplay
	INTEGER*4 XDefaultScreenOfDisplay
        INTEGER*4 XDefaultDepthOfScreen  
        INTEGER*4 XWidthOfScreen
        INTEGER*4 XHeightOfScreen
        INTEGER*4 XBlackPixelOfScreen
        INTEGER*4 XWhitePixelOfScreen
	INTEGER*4 XRootWindowOfScreen
        INTEGER*4 XCheckMaskEvent
        INTEGER*4 XCreateSimpleWindow
        INTEGER*4 XCreatePixmap
        INTEGER*4 XCreateGC
	INTEGER*4 I
	INTEGER*4 X /-1/, Y /-1/

	LOGICAL*4 EVENT_RETURN
	RECORD /XGCValues/          XGCVL
	RECORD /XEvent/              EVENT
	PARAMETER NPOINTS = 5
	RECORD /XPoint/              POINTS(NPOINTS)
	RECORD /XSegment/		SEGMENTS(6)


	INTEGER*4  WINDOW_W, WINDOW_H

	PARAMETER SIZE = 40
	PARAMETER STEPS = 100
	PARAMETER XDELTA = 11, YDELTA = 11

	INTEGER*4 WIDTH, HEIGHT
	INTEGER*4 DEPTH /8/
	INTEGER*4 FOREGROUND, BACKGROUND
                  
	PRINT *,'ENTER X AND Y DIMENSIONS OF WINDOW (PIXELS)'
	READ (*,*) WINDOW_W, WINDOW_H

	PRINT *,'ENTER X AND Y DIMENSIONS OF RECTANGLE TO DRAG (PIXELS)'
	READ (*,*)  WIDTH, HEIGHT

C   Initialize display id and screen id
        PRINT *,'DISPLAY ID',DPY
	DISPLAY = ":0.0"
	DPY =XOpenDisplay(DISPLAY)
	IF (DPY .EQ. 0) THEN
	   WRITE (6,'('' ERROR: display not open'')')
	   STOP
	ENDIF

	PRINT *,'DISPLAY ID',DPY
	PRINT *,'STEP 1'
        PRINT *,'SCREEN',SCREEN
	SCREEN = XDefaultScreenOfDisplay(DPY)
	PRINT *,'SCREEN',SCREEN

	DEPTH = XDefaultDepthOfScreen(SCREEN)
	PRINT  *, 'DEPTH = ', DEPTH


C   Create window in centre of screen

	WINDOW_X = (XWidthOfScreen(SCREEN)  - WINDOW_W) / 2
	WINDOW_Y = (XHeightOfScreen(SCREEN) - WINDOW_H) / 2

        PRINT  *, 'WINDOW X POS', WINDOW_X
        PRINT  *, 'WINDOW Y POS', WINDOW_Y
        PRINT  *, 'DEPTH = ', DEPTH
        PRINT  *, 'WINDOW ID ',WINDOW_ID

        WINDOW_ID = XCreateSimpleWindow(DPY,
     +     XRootWindowOfScreen(SCREEN),
     +     WINDOW_X, WINDOW_Y, WINDOW_W, WINDOW_H, 0,
     +     XBlackPixelOfScreen(SCREEN),
     +     XWhitePixelOfScreen(SCREEN))

        PRINT  *, 'WINDOW ID ',WINDOW_ID
	EVENT_MASK = ExposureMask + ButtonPressMask + PointerMotionMasK
	CALL XSelectInput(DPY, WINDOW_ID,EVENT_MASK)

	PRINT *,'XBlackPixelOfScreen(SCREEN) = ',
     +			XBlackPixelOfScreen(SCREEN)
	PRINT *,'WhitePixelOfScreen(SCREEN) = ',
     +		XWhitePixelOfScreen(SCREEN)

	FOREGROUND = XWhitePixelOfScreen(SCREEN)
	BACKGROUND = 0

	PRINT *, 'FOREGROUND = ', FOREGROUND,
     +		'   BACKGROUND = ',BACKGROUND

	PRINT *, 'STEP 3'
        READ (*,*)
	CALL XSetWindowBackground(DPY, WINDOW_ID, BACKGROUND)
        PRINT *, 'STEP 4'
        READ (*,*)

C   Define the name of the window

	CALL XStoreName(DPY, WINDOW_ID, 'Xlib Program to test drag')

        PRINT *, 'STEP 5'
        READ (*,*)
C   Map the windows
	CALL XMapWindow(DPY, WINDOW_ID)

        PRINT *, 'STEP 6'
        READ (*,*)
C   Create Pixmap
	PIXMAP_ID = XCreatePixmap(DPY, WINDOW_ID, WIDTH, HEIGHT, DEPTH)

        PRINT *, 'WIDTH ',WIDTH
        PRINT *, 'HEIGHT',HEIGHT
        READ (*,*)
C   Create Bitmap
	BITMAP_ID = XCreatePixmap(DPY, WINDOW_ID, WIDTH, HEIGHT, 1)

        PRINT *, 'STEP 8'
        READ (*,*)
C   Clear Pixmap

	GC_MASK = GCFunction + GCForeground
     +		+ GCBackground
	XGCVL.function = GXcopy
	XGCVL.foreground = BACKGROUND
	XGCVL.background = BACKGROUND
        PRINT *, 'STEP 9'
	READ (*,*)
  	GC_CLEAR_PIXMAP = XCreateGC(DPY, PIXMAP_ID, GC_MASK, XGCVL)

        PRINT *, 'STEP 10'
	CALL XFillRectangle(DPY, PIXMAP_ID, GC_CLEAR_PIXMAP,
     +				0, 0, WIDTH, HEIGHT)

C   Create Graphic Contexts

	GC_MASK = GCFunction + GCForeground
     +		+ GCBackground 
	XGCVL.function = GXxor
	XGCVL.foreground = GCForeground
	XGCVL.background = GCBackground
        PRINT *, 'STEP 11'
	GC = XCreateGC(DPY, WINDOW_ID, GC_MASK, XGCVL)
	GC_PIXMAP = XCreateGC(DPY, PIXMAP_ID, GC_MASK, XGCVL)
	XGCVL.foreground = 1

        PRINT *, 'STEP 12'
	GC_BITMAP = XCreateGC(DPY, PIXMAP_ID, GC_MASK, XGCVL)

C   Define rectangle array

	POINTS(1).x = 0
	POINTS(1).y = 0
	POINTS(2).x = SIZE
	POINTS(2).y = 0
	POINTS(3).x = 0
	POINTS(3).y = -SIZE
	POINTS(4).x = -SIZE
	POINTS(4).y = 0
	POINTS(5).x = 0
	POINTS(5).y = SIZE

C   Create pixmap
	DO I = 1, STEPS
	   POINTS(1).x = (I - 1) * XDELTA + 1
	   POINTS(1).y = HEIGHT - (I - 1) * YDELTA - 1
        PRINT *, 'STEP 13'
c	   CALL XDrawLines(DPY, PIXMAP_ID, GC_PIXMAP, POINTS, NPOINTS,
c     +	                          CoordModePrevious)
	END DO

C   Handle events

  	DO WHILE (.TRUE.)

        PRINT *, 'STEP 14'
	READ (*,*)
        PRINT *, 'DISPLAY ',DPY
	   CALL XNextEvent(DPY, EVENT)
        READ (*,*)

	   IF (EVENT.type .EQ. MotionNotify) THEN

C UNDRAW PIXMAP AND CURSOR
	      IF (X .GE. 0) THEN
        PRINT *, 'STEP 15'
	         CALL XCopyArea(DPY, PIXMAP_ID, WINDOW_ID, GC, 0, 0,
     +			WIDTH, HEIGHT, X, Y - HEIGHT)
        PRINT *, 'STEP 16'
	         CALL XDrawSegments(DPY, WINDOW_ID, GC, SEGMENTS, 6)

              ENDIF

C GET MOST RECENT X AND Y POINTER COORDINATES


        PRINT *, 'STEP 17'
        READ (*,*)

	EVENT_INT= XCheckMaskEvent(DPY,EVENT_MASK,EVENT)
        PRINT *, 'STEP 18'
        READ (*,*)
	EVENT_RETURN = EVENT_INT

	    	DO WHILE (EVENT_RETURN)
        PRINT *, 'STEP 19'
        READ (*,*)
       	EVENT_INT= XCheckMaskEvent(DPY,EVENT_MASK,EVENT)
        	EVENT_RETURN = EVENT_INT
	      END DO
	         X = Event.XMotion.x
	         Y = Event.XMotion.y
C	         PRINT *,X,Y

C REDRAW PIXMAP
        PRINT *, 'STEP 20'
        READ (*,*)
	      CALL XCopyArea(DPY, PIXMAP_ID, WINDOW_ID, GC, 0, 0,
     +				WIDTH, HEIGHT, X, Y - HEIGHT)

C REDRAW CURSOR

	         SEGMENTS(1).x1 = X
	         SEGMENTS(1).y1 = 0
	         SEGMENTS(1).x2 = X
	         SEGMENTS(1).y2 = Y - CSIZE
	         SEGMENTS(2).x1 = X
	         SEGMENTS(2).y1 = Y + CSIZE
	         SEGMENTS(2).x2 = X
	         SEGMENTS(2).y2 = WINDOW_H
	         SEGMENTS(3).x1 = 0
	         SEGMENTS(3).y1 = Y
	         SEGMENTS(3).x2 = X - CSIZE
	         SEGMENTS(3).y2 = Y
	         SEGMENTS(4).x1 = X + CSIZE
	         SEGMENTS(4).y1 = Y
	         SEGMENTS(4).y2 = Y
	         SEGMENTS(5).x1 = X - CSIZE
	         SEGMENTS(5).y1 = Y - CSIZE
	         SEGMENTS(5).x2 = X + CSIZE
	         SEGMENTS(5).y2 = Y + CSIZE
	         SEGMENTS(6).x1 = X - CSIZE
	         SEGMENTS(6).y1 = Y + CSIZE
	         SEGMENTS(6).x2 = X + CSIZE
	         SEGMENTS(6).y2 = Y - CSIZE
        	 PRINT *, 'STEP 21'
        	 READ(*,*)
	         CALL XDrawSegments(DPY, WINDOW_ID, GC, SEGMENTS, 6)

           ENDIF

	   IF (EVENT.type .EQ.ButtonPress) THEN

C            Unmap and destroy windows
	         CALL XUnmapWINDOW(DPY, WINDOW_ID)
	         CALL XDestroyWindow(DPY, WINDOW_ID)
	         CALL XCloseDisplay(DPY)
	         STOP 

	   ENDIF
	END DO
	END



T.RTitleUserPersonal
Name
DateLines