C PROGRAM SAMPLE_PROGRAM INCLUDE 'SYS$LIBRARY:DECW$XLIBDEF' INTEGER*4 DPY ! display id INTEGER*4 SCREEN ! screen id INTEGER*4 WINDOW_1, WINDOW_2 ! window id INTEGER*4 ATTR_MASK ! attributes mask INTEGER*4 GC ! gc id INTEGER*4 FONT ! font id INTEGER*4 DEFINE_COLOR ! color function INTEGER*4 WINDOW_1X, WINDOW_1Y ! window origin INTEGER*4 DEPTH ! number of planes INTEGER*4 FUNC, STATUS ! synchronous behavior INTEGER*4 STATE ! flag to indicate text INTEGER*4 USERS_DONE ! flag to indicate text RECORD /X$VISUAL/ VISUAL ! visual type RECORD /X$SET_WIN_ATTRIBUTES/ XSWDA ! window attributes RECORD /X$GC_VALUES/ XGCVL ! gc values RECORD /X$EVENT/ EVENT ! input event CHARACTER*19 WINDOW_NAME DATA WINDOW_NAME /'Sample Xlib Program'/ CHARACTER*60 FONT_NAME DATA FONT_NAME 1 /'-Adobe-New Century Schoolbook-Medium-R-Normal--*-140-*-*-P- 1*-ISO8859-1'/ CHARACTER*19 MESSAGE(2) DATA MESSAGE /'Click here to exit ', 'Click HERE to exit!'/ PARAMETER WINDOW_1W = 400, WINDOW_1H = 300, 1 WINDOW_2W = 300, WINDOW_2H = 150, 1 WINDOW_2X = 50, WINDOW_2Y = 75 STATE = 1 C C Initialize display id and screen id C DPY = X$OPEN_DISPLAY() IF (DPY .EQ. 0) THEN WRITE(6,*) 'Display not opened!' CALL SYS$EXIT(%VAL(1)) END IF SCREEN = X$DEFAULT_SCREEN_OF_DISPLAY(DPY) STATUS = X$SYNCHRONIZE(DPY, 1, FUNC) C C Create the WINDOW_1 window C WINDOW_1X = (X$WIDTH_OF_SCREEN(SCREEN) - WINDOW_1W) / 2 WINDOW_1Y = (X$HEIGHT_OF_SCREEN(SCREEN) - WINDOW_1H) / 2 DEPTH = X$DEFAULT_DEPTH_OF_SCREEN(SCREEN) CALL X$DEFAULT_VISUAL_OF_SCREEN(SCREEN,VISUAL) ATTR_MASK = X$M_CW_EVENT_MASK .OR. X$M_CW_BACK_PIXEL XSWDA.X$L_SWDA_EVENT_MASK = X$M_EXPOSURE .OR. X$M_BUTTON_PRESS XSWDA.X$L_SWDA_BACKGROUND_PIXEL = 1 DEFINE_COLOR(DPY, SCREEN, VISUAL, 1) WINDOW_1 = X$CREATE_WINDOW(DPY, 1 X$ROOT_WINDOW_OF_SCREEN(SCREEN), 1 WINDOW_1X, WINDOW_1Y, WINDOW_1W, WINDOW_1H, 0, 1 DEPTH, X$C_INPUT_OUTPUT, VISUAL, ATTR_MASK, XSWDA) CALL X$STORE_NAME(DPY, WINDOW_1, WINDOW_NAME) C C Create the WINDOW_2 window C XSWDA.X$L_SWDA_BACKGROUND_PIXEL = 1 DEFINE_COLOR(DPY, SCREEN, VISUAL, 2) WINDOW_2 = X$CREATE_WINDOW(DPY, WINDOW_1, 1 WINDOW_2X, WINDOW_2Y, WINDOW_2W, WINDOW_2H, 4, 1 DEPTH, X$C_INPUT_OUTPUT, VISUAL, ATTR_MASK, XSWDA) C C Create graphics context C XGCVL.X$L_GCVL_FOREGROUND = 1 DEFINE_COLOR(DPY, SCREEN, VISUAL, 3) XGCVL.X$L_GCVL_BACKGROUND = 1 DEFINE_COLOR(DPY, SCREEN, VISUAL, 2) GC = X$CREATE_GC(DPY, WINDOW_2, 1 (X$M_GC_FOREGROUND .OR. X$M_GC_BACKGROUND), XGCVL) C C Load the font for text writing C FONT = X$LOAD_FONT(DPY, FONT_NAME) CALL X$SET_FONT(DPY, GC, FONT) C C Map the windows C CALL X$MAP_WINDOW(DPY, WINDOW_1) CALL X$MAP_WINDOW(DPY, WINDOW_2) C C Handle events C USERS_DONE = 0 DO WHILE (USERS_DONE .NE. 1 ) CALL X$NEXT_EVENT(DPY, EVENT) C C If this is an expose event on our child window, then write the text. C IF (EVENT.EVNT_TYPE .EQ. X$C_EXPOSE .AND. 1 EVENT.EVNT_EXPOSE.X$L_EXEV_WINDOW .EQ. WINDOW_2) THEN CALL X$CLEAR_WINDOW(DPY, WINDOW_2) CALL X$DRAW_IMAGE_STRING(DPY, WINDOW_2, GC, 1 75, 75, MESSAGE(STATE)) END IF IF (EVENT.EVNT_TYPE .EQ. X$C_BUTTON_PRESS) THEN IF (EVENT.EVNT_EXPOSE.X$L_EXEV_WINDOW .EQ. WINDOW_1) THEN STATE = 2 CALL X$DRAW_IMAGE_STRING(DPY, WINDOW_2, GC, 1 75, 75, MESSAGE(STATE)) ELSE C C Unmap and destroy windows C CALL X$UNMAP_WINDOW(DPY, WINDOW_1) CALL X$DESTROY_WINDOW(DPY, WINDOW_1) CALL X$CLOSE_DISPLAY(DPY) USERS_DONE =1 END IF END IF END DO CALL SYS$EXIT(%VAL(1)) END C C C Create color C INTEGER*4 FUNCTION DEFINE_COLOR(DISP, SCRN, VISU, N) INCLUDE 'SYS$LIBRARY:DECW$XLIBDEF' INTEGER*4 DISP, SCRN, N RECORD /X$VISUAL/ VISU RECORD /X$COLOR/ SCREEN_COLOR INTEGER*4 STR_SIZE, STATUS, COLOR_MAP INTEGER*4 STR$TRIM CHARACTER*15 COLOR_NAME(3) DATA COLOR_NAME /'DARK SLATE BLUE','LIGHT GREY ','FIREBRICK '/ IF (VISU.X$L_VISU_CLASS .EQ. X$C_TRUE_COLOR .OR. 1 VISU.X$L_VISU_CLASS .EQ. X$C_PSEUDO_COLOR .OR. 1 VISU.X$L_VISU_CLASS .EQ. X$C_DIRECT_COLOR .OR. 1 VISU.X$L_VISU_CLASS .EQ. X$C_STATIC_COLOR) THEN COLOR_MAP = X$DEFAULT_COLORMAP_OF_SCREEN(SCRN) STATUS = STR$TRIM(COLOR_NAME(N), 1 COLOR_NAME(N), STR_SIZE) STATUS = X$ALLOC_NAMED_COLOR(DISP, COLOR_MAP, 1 COLOR_NAME(N)(1:STR_SIZE), SCREEN_COLOR) IF (STATUS) THEN DEFINE_COLOR = SCREEN_COLOR.X$L_COLR_PIXEL ELSE WRITE(6,*) 'Color not allocated!' CALL LIB$SIGNAL(%VAL(STATUS)) DEFINE_COLOR = 0 END IF ELSE IF (N .EQ. 1 .OR. N .EQ. 3) 1 DEFINE_COLOR = X$BLACK_PIXEL_OF_SCREEN(SCRN) IF (N .EQ. 2 ) 1 DEFINE_COLOR = X$WHITE_PIXEL_OF_SCREEN(SCRN) END IF RETURN END