Creating window application in pure c on mac osx

前端 未结 5 1653
孤街浪徒
孤街浪徒 2020-12-24 08:33

I\'m creating an application in pure C on Mac OSX. What I want is to create window in witch my app will be stored.

Preferably I want it to be pure C solution, but if

5条回答
  •  Happy的楠姐
    2020-12-24 09:03

    I remember seeing this question about a year ago, back when I so desperately wished I could open up a d*** window, googling for days and only finding the type of answers you see above this post.

    I was reading up on the operating system the Mac is built on - Berkley Software Distribution. http://codex.cs.yale.edu/avi/os-book/OS9/appendices-dir/a.pdf Where on page 17 the phrase "...X Windowing System developed at MIT" hit me and I remembered how I couldn't open up a window and how pissed I was about that, and I thought maybe this was finally the solution!

    I googled "BSD X Window Programming" and stumbled my way into finally getting a window open in pure C.

    I just discovered it so I'm not a master yet but look at this link https://en.wikibooks.org/wiki/X_Window_Programming/Xlib and go to the example, make sure to follow the comments at the top for how to compile with the X11 library (you can ignore the -Wall and -O commands as long as you have the -lX11).

    If you can't compile, if it can't find the header files, you'll need to help it find the header files.

    There might be a couple different places that the X11 includes could be on your system. More than likely you'll find it in /opt/X11/include which will have all the definitions of the headers you'll need.

    You could include the full path in your C programs such as:

    #include "/opt/X11/include/X11/Xlib.h"
    

    But we want it to look like this #include So you could add this switch to GCC when you compile -I /opt/X11/include

    Or go to your .profile or .bashrc or .bash_profile in your home directory and add:

    export C_INCLUDE_PATH="$C_INCLUDE_PATH:/opt/X11/include"
    /*
    

    Simple Xlib application drawing a box in a window.

    */

    From the wiki:

    #include
    #include
    #include // prevents error for exit on line   18 when compiling with gcc
    int main() {
      Display *d;
      int s;
      Window w;
      XEvent e;
    
                        /* open connection with the server */
      d=XOpenDisplay(NULL);
      if(d==NULL) {
        printf("Cannot open display\n");
        exit(1);
      }
      s=DefaultScreen(d);
    
                        /* create window */
      w=XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 100, 100, 1,
                         BlackPixel(d, s), WhitePixel(d, s));
    
      // Process Window Close Event through event handler so      XNextEvent does Not fail
      Atom delWindow = XInternAtom( d, "WM_DELETE_WINDOW", 0 );
      XSetWMProtocols(d , w, &delWindow, 1);
    
                        /* select kind of events we are interested in */
      XSelectInput(d, w, ExposureMask | KeyPressMask);
    
                        /* map (show) the window */
      XMapWindow(d, w);
    
                        /* event loop */
      while(1) {
        XNextEvent(d, &e);
                        /* draw or redraw the window */
        if(e.type==Expose) {
          XFillRectangle(d, w, DefaultGC(d, s), 20, 20, 10, 10);
        }
                        /* exit on key press */
        if(e.type==KeyPress)
          break;
    
        // Handle Windows Close Event
        if(e.type==ClientMessage)
           break;
      }
    
                        /* destroy our window */
      XDestroyWindow(d, w);
    
                        /* close connection to server */
      XCloseDisplay(d);
    
      return 0;
    }
    

    Compile:

     gcc -O2 -Wall -o test test.c -L /usr/X11R6/lib -lX11 -lm
    

提交回复
热议问题