X-Authentication-Warning: delorie.com: mail set sender to djgpp-bounces using -f X-Recipient: djgpp AT delorie DOT com From: John Wright To: djgpp AT delorie DOT com Subject: Fwd: Xlib example program compile error Date: Fri, 11 May 2012 13:54:14 -0500 User-Agent: KMail/1.13.6 (Linux/2.6.38-15-generic; KDE/4.6.5; i686; ; ) MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_WBWrPM4HKQqJTS3" Message-Id: <201205111354.14930.john@wacontrols.com> X-Cloudmark-Analysis: v=1.1 cv=e4+nN7JFyidPqtjm7QRibqntUT6DPKhMpvIMSrLb7TA= c=1 sm=0 a=uxf98jMwF4QA:10 a=JE74YIbCa9EA:10 a=86DmMMQbovAA:10 a=KQjHTzX6FrYA:10 a=ioYcHhEKh_Hqt05efsMA:9 a=tuo-IHi4iBzSPaDeqIwA:7 a=CjuIK1q_8ugA:10 a=HpAAvcLHHh0Zw7uRqdWCyQ==:117 Reply-To: john AT wacontrols DOT com --Boundary-00=_WBWrPM4HKQqJTS3 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit --Boundary-00=_WBWrPM4HKQqJTS3 Content-Type: message/rfc822; name="forwarded message" Content-Transfer-Encoding: 7bit Content-Description: John Wright : Xlib example program compile error Content-Disposition: inline From: John Wright Reply-To: jwright63 AT suddenlink DOT net To: djgpp AT delorie DOT com Subject: Xlib example program compile error Date: Fri, 11 May 2012 10:32:00 -0500 User-Agent: KMail/1.13.6 (Linux/2.6.38-15-generic; KDE/4.6.5; i686; ; ) MIME-Version: 1.0 Content-Type: Text/Plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Message-Id: <201205111032 DOT 01520 DOT jwright63 AT suddenlink DOT net> Here is the compiler output for xctest.c as it is written in the book. The same errors show up for three other files that include "xwins.h" Last night I went through everything line by line and changed how things were included or defined and got it to compile, then it bombed out on "xwinutil.c", showing parse error before { } just like below, there is no parse error before 'theFGpix'. All of these errors go away when I define typedef struct XWIN . . . back in xctest.c I also explicetly added back some "ifndef" statements that should be picked in "xwins.h" and "xwinutil.c". Like.... XContext xwin_context; Anyway, something ain't right but I bet is is simple. I can't really explain all the details here because the compiler is going to give a different set of error messages depending on how I rearrange things. Even though I got xctest.c compiled, I'm sure there would be issues in linking. initapp.c and app_globb.c are fine. They are clean! They were created in the previous chapter. Of course, initapp.c sets up all the attributes and gory details of display. gcc -c -O xctest.c In file included from xctest.c:13: xwins.h:45: storage class specified for parameter `xwin_context' In file included from xctest.c:14: app_glob.c:27: storage class specified for parameter `theDisplay' app_glob.c:28: storage class specified for parameter `theGC' app_glob.c:29: storage class specified for parameter `AppDone' app_glob.c:30: storage class specified for parameter `theEvent' app_glob.c:31: storage class specified for parameter `theFontStruct' app_glob.c:32: storage class specified for parameter `theBGpix' app_glob.c:33: parse error before `theFGpix' xctest.c: In function `main': xctest.c:50: `MainXWA' undeclared (first use this function) xctest.c:50: (Each undeclared identifier is reported only once xctest.c:50: for each function it appears in.) xctest.c:57: `theFontStruct' undeclared (first use this function) xctest.c:57: `quit_label' undeclared (first use this function) xctest.c:62: `theFGpix' undeclared (first use this function) xctest.c:62: `theBGpix' undeclared (first use this function) xctest.c:62: `theMain' undeclared (first use this function) xctest.c:63: warning: assignment makes pointer from integer without a cast xctest.c:65: `flip_label' undeclared (first use this function) xctest.c:67: `FlipButton' undeclared (first use this function) xctest.c:75: `AppDone' undeclared (first use this function) xctest.c:77: `theDisplay' undeclared (first use this function) xctest.c:77: `theEvent' undeclared (first use this function) xctest.c:89: `theGC' undeclared (first use this function) xctest.c:90: `messages' undeclared (first use this function) xctest.c:100: `xwin_context' undeclared (first use this function) xctest.c:110: request for member `event_handler' in something not a structure or union xctest.c:111: request for member `event_handler' in something not a structure or union xctest.c: In function `quit_action': xctest.c:137: `AppDone' undeclared (first use this function) xctest.c: In function `flip_action': xctest.c:157: `max_messages' undeclared (first use this function) xctest.c:163: `theDisplay' undeclared (first use this function) xctest.c:163: `theMain' undeclared (first use this function) make: *** [xctest.o] Error 1 ## Project Makefile for Chapter8, - X Window System Programming ## ## DEFINES ## RM = rm -f CC = gcc ##EXEC= wintest ## ## -g = Debugging info ## -O = Optimize (cannot have -g then) ## -m486 = Optimize for Intel 486 processor ## -i686 = Optimize for Intel 486 processor ## CFLAGS= -O ## ## ## Compiler INCLUDES & LIBRARIES ## INCLUDE= -I. -I/usr/X11R6/include LIB= -L/usr/X11R6/lib # library directory path LIBS= -lX11 -lmalloc # link libraries ## ## Rule to create .o files from .c files .c.o: $(RM) $@ $(CC) -c $(CFLAGS) $(INCLUDES) $*.c ## Targets and dependencies all:: xctest xctest.o: xctest.c app_glob.c xwins.h initapp.o: initapp.c app_glob.c xwinutil.o: xwinutil.c app_glob.c xwins.h xbutton.o: xbutton.c app_glob.c xwins.h xctest: xctest.o initapp.o xwinutil.o xbutton.o $(RM) $@ $(CC) -o $@ $(CFLAGS) xctest.o initapp.o xwinutil.o xbutton.o $(LIB) $(LIBS) **** I don't understand why "xwins.h" is included as a dependency in the makefile rule? /* * File: xwins.h * * Defines data structures for windows * */ #ifndef XWINS_H #define XWINS_H #include #include #include #include typedef struct XWIN { Window xid; Window parent; void *data; int (*event_handler)(); } XWIN; /* * Function prototypes */ void xwin_init(void); XWIN *MakeXButton(int x, int y, unsigned height, unsigned bdwidth, unsigned long bdcolor, unsigned long bgcolor, Window parent, char *text, int (*button_action)(), caddr_t action_data; /* * Global variable */ #ifdef XWIN_UTIL XContext xwin_context; #else extern XContext xwin_context; #endif /* #ifdef XWIN_UTIL */ #endif /* #ifndef XWINS_H */ /* * File: app_glob.c * * Declare the common global variables for X applications. */ #ifndef APP_GLOB_C /* To ensure that it is included once */ #define APP_GLOB_C #ifdef DEF_APP_GLOB /* Defined in the initapp.c file */ Display *theDisplay; /* Connection to the X display */ GC theGC; /* The graphics context for main */ int AppDone = 0; /* A flag to indicate when done */ XEvent theEvent; /* Structure for current event */ XFontStruct *theFontStruct; /* Info on the default font */ unsigned long theBGpix; /* Background and foreground */ unsigned long theFGpix; /* pixel values of the main window */ char *theAppName = " "; /* The applications name */ Window theMain; /* The applications main window */ XWindowAttributes MainXWA; /* Attributes of the main window */ #else extern Display *theDisplay; extern GC theGC; extern int AppDone; extern XEvent theEvent; extern XFontStruct *theFontStruct; extern unsigned long theBGpix, theFGpix; extern char *theAppName; extern Window theMain; extern XWindowAttributes MainXWA; #endif /* #ifdef DEF_APP_GLOB */ #endif /* #ifndef APP_GLOB_C */ /* * File: xwinutil.c * * Utility routine for context-managed reusable windows. * */ #define XWIN_UTIL #include "xwins.h" void xwin_init(void) { /* * Create a unique context to reference data associated * with the windows. */ xwin_context = XUniqueContext(); } /* * File: xctest.c * * Use Xlib Context management routines to save data * associated with each window. * */ #include #include #include #include "xwins.h" #include "app_glob.c" char *quit_label = "Quit"; char *flip_label = "Next Message"; char *messages[ ] = { "Testing Xlib Context Manager", "You can create multiple buttons easily", "All buttons share the same code", "Each button has its own data" }; int max_messages = sizeof(messages) / sizeof(char *); int msgnum = 0; /* * Function prototypes. */ void initapp(int, char **, int, int, unsigned, unsigned); int quit_action(caddr_t); int flip_action(caddr_t); /*------------------------------End of page 198------------------------------- */ main(int argc, char **argv) { Window *QuitButton, *flipButton, *which_xwin; unsigned quit_width, quit_height, flip_width; xwin_init(); initapp(argc, argv, 20, 20, 300, 100); printf("Assigned window geometry: %dx%d+%d+%d\n", MainXWA.width, MainXWA.height, MainXWA.x, MainXWA.y); /* * Create the two buttons. */ quit_width = XTextWidth(theFontStruct, quit_label, strlen(quit_label)) + 4; quit_height = theFontStruct->max_bounds.ascent + theFontStruct->max_bounds.descent + 4; QuitButton = MakeXButton(1, 1, quit_width, quit_height, 1, theFGpix, theBGpix, theMain, quit_label, quit_action, NULL); flip_width = XTextWidth(theFontStruct, flip_label, strlen(flip_label)) + 4; FlipButton = MakeXbutton(quit_width+4, 1, flip_width, quit_height, 1, theFGpix, theBGpix, theMain, flip_label, flip_action, NULL); /* * Event handling loop. * */ while (!AppDone) { XNextEvent(theDisplay, &theEvent); /* * Main window is handled here */ if (theEvent.xany.window == theMain) { if (theEvent.type == Expose && theEvent.xexpose.count == 0) { XClearWindow(theDisplay, theMain); XDrawString(theDisplay, theMain, theGC, 50, 50, messages[msgnum], strlen(messages[msgnum])); } } /* * For all other windows, retrieve the XWIN data from Xlib * using the context manager routine XFindContext. */ if (XFindContext(theDisplay, theEvent.xany.window, xwin_context, (caddr_t *) &which_xwin) == 0) { /*-----------------------------------End of page 199---------------------------*/ /* * Call the event handler of this XWIN structure. */ if (*(which_xwin->event_handler) != NULL) (*(which_xwin->event_handler))(which_xwin); } } /* * Close connection to display and exit. */ XCloseDisplay(theDisplay); exit(0); } /*----------------------------------------------------------------------------- */ /* * QUIT _ ACTION * * This routine is called when a ButtonPress event occurs in the * quit window. */ int quit_action(caddr_t data) { /* Set the data done flag */ AppDone = 1; return 1; } /*----------------------------------------------------------------------------- */ /* * FLIP _ ACTION * * This routine is called when a ButtPress event occurs the * quit window. */ int flip_action(caddr_t data) { /* * Change the message to be displayed. */ msgnum = (msgnum + 1) % max_messages; /* * Clear the main window, so that new message is displayed. */ XClearArea(theDisplay, theMain, 0, 0, 0, 0, True); return 1; } --Boundary-00=_WBWrPM4HKQqJTS3--