GUI_status GUI_GenericWidget:: HandleEvent(const SDL_Event *event) { GUI_status status; status = GUI_PASS; if ( EventProc ) { int handle_it; /* Mouse events outside the widget area are ignored */ handle_it = 1; switch (event->type) { case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: { int x, y; x = event->button.x; y = event->button.y; if ( ! HitRect(x, y) ) { handle_it = 0; } } break; case SDL_MOUSEMOTION: { int x, y; x = event->motion.x; y = event->motion.y; if ( ! HitRect(x, y) ) { handle_it = 0; } } break; } if ( handle_it ) { widget_info info; FillInfo(&info); status = EventProc(&info, event); } } return(status); }
int main(int argc, char *argv[]) { Display *display; XVisualInfo *vinfo; XSetWindowAttributes winattrs; Window window; GLXContext context; int visual[] = { GLX_RGBA, GLX_DOUBLEBUFFER, GLX_RED_SIZE, 8, GLX_GREEN_SIZE, 8, GLX_BLUE_SIZE, 8, GLX_DEPTH_SIZE, 16, None }; display = XOpenDisplay(NULL); if (!display) { printf("Cannot connect to X server %s\n", XDisplayName(NULL)); return 0; } vinfo = glXChooseVisual(display, DefaultScreen(display), visual); if (!vinfo) { printf("Unable to create suitable opengl visual.\n"); XCloseDisplay(display); return 0; } context = glXCreateContext(display, vinfo, 0, True); if (!context) { printf("Unable to create opengl context.\n"); XCloseDisplay(display); return 0; } // memset(winattrs, 0, sizeof(XSetWindowAttributes)); winattrs.colormap = XCreateColormap(display, DefaultRootWindow(display), vinfo->visual, AllocNone); winattrs.event_mask = ExposureMask | StructureNotifyMask | KeyPressMask | KeyReleaseMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask; winattrs.border_pixel = 0; window = XCreateWindow(display, DefaultRootWindow(display), 0, 0, 640, 480, 0, vinfo->depth, InputOutput, vinfo->visual, CWBorderPixel | CWColormap | CWEventMask, &winattrs); XSetStandardProperties(display, window, "altEngine", "opengl", None, argv, argc, NULL ); XMapWindow(display, window); glXMakeCurrent(display, window, context); printf("GL Version: %s\n", glGetString(GL_VERSION)); while (True) { if ( XPending(display) ) { if ( EventProc(display, window, context) ) break; } else { EventProc(NULL, window, context); } } printf("Closing...\n"); glXDestroyContext(display, context); XCloseDisplay(display); return 0; }