Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifdef __linux__
- #include "Window.hpp"
- #include <iostream>
- #include <X11/X.h>
- #include <X11/Xlib.h>
- #include <X11/keysym.h>
- #include <GL/glx.h>
- #include <GL/glu.h>
- Display* _display;
- Window _window;
- GLint _attributes[] = {GLX_RGBA, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, None};
- XSetWindowAttributes _wattributes;
- Colormap _cmap;
- XVisualInfo *_vinfo;
- GLXContext _context;
- Atom _close;
- XEvent _event;
- namespace ege{
- EGE_Window::EGE_Window(){
- _width = 640;
- _height = 480;
- _x = 1;
- _y = 1;
- _title = (char *)"EGE";
- _r = 0.0;
- _g = 0.0;
- _b = 0.0;
- _minWidth = 100;
- _minHeight = 100;
- _maxWidth = 2000;
- _maxHeight = 2000;
- }
- EGE_Window::~EGE_Window(){
- }
- void EGE_Window::create(){
- if(!(_display = XOpenDisplay(NULL))){ std::cout << "Error opening display" << std::endl; }
- int _screen = DefaultScreen(_display);
- _vinfo = glXChooseVisual(_display, _screen, _attributes);
- _cmap = XCreateColormap(_display, RootWindow(_display, _screen), _vinfo->visual, AllocNone);
- _wattributes.colormap = _cmap;
- _wattributes.event_mask = ExposureMask | FocusChangeMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask | ExposureMask | KeyPressMask | KeyReleaseMask | StructureNotifyMask;
- if(!(_window = XCreateWindow(_display, RootWindow(_display, _screen), _x, _y, _width, _height, 0, _vinfo->depth, InputOutput, _vinfo->visual, CWColormap | CWEventMask, &_wattributes))){ std::cout << "Error creating window" << std::endl; }
- XMapWindow(_display, _window);
- XStoreName(_display, _window, _title);
- _close = XInternAtom(_display, "WM_DELETE_WINDOW", False);
- XSetWMProtocols(_display, _window, &_close, 1);
- _context = glXCreateContext(_display, _vinfo, NULL, GL_TRUE);
- glXMakeCurrent(_display, _window, _context);
- XFlush(_display);
- glClearColor(_r, _b, _g, 1.0);
- glClearDepth(1.0);
- glDepthFunc(GL_LESS);
- glEnable(GL_DEPTH_TEST);
- glShadeModel(GL_SMOOTH);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluOrtho2D(0, _width, 0, _height);
- glMatrixMode(GL_MODELVIEW);
- }
- void EGE_Window::create(const char *title, int x, int y, int width, int height){
- _x = x;
- _y = y;
- _width = width;
- _height = height;
- _title = (char *)title;
- if(!(_display = XOpenDisplay(NULL))){ std::cout << "Error opening display" << std::endl; }
- int _screen = DefaultScreen(_display);
- _vinfo = glXChooseVisual(_display, _screen, _attributes);
- _cmap = XCreateColormap(_display, RootWindow(_display, _screen), _vinfo->visual, AllocNone);
- _wattributes.colormap = _cmap;
- _wattributes.event_mask = FocusChangeMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask | ExposureMask | KeyPressMask | KeyReleaseMask | StructureNotifyMask;
- if(!(_window = XCreateWindow(_display, RootWindow(_display, _screen), _x, _y, _width, _height, 0, _vinfo->depth, InputOutput, _vinfo->visual, CWColormap | CWEventMask, &_wattributes))){ std::cout << "Error creating window" << std::endl; }
- XMapWindow(_display, _window);
- XStoreName(_display, _window, _title);
- _close = XInternAtom(_display, "WM_DELETE_WINDOW", False);
- XSetWMProtocols(_display, _window, &_close, 0);
- _context = glXCreateContext(_display, _vinfo, NULL, GL_TRUE);
- glXMakeCurrent(_display, _window, _context);
- XFlush(_display);
- glClearColor(_r, _b, _g, 1.0);
- glClearDepth(1.0);
- glDepthFunc(GL_LESS);
- glEnable(GL_DEPTH_TEST);
- glShadeModel(GL_SMOOTH);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluOrtho2D(0, _width, 0, _height);
- glMatrixMode(GL_MODELVIEW);
- }
- void EGE_Window::destroy(){
- XDestroyWindow(_display, _window);
- XCloseDisplay(_display);
- }
- void EGE_Window::setTitle(const char *title){
- _title = (char *)title;
- XStoreName(_display, _window, _title);
- }
- void EGE_Window::update(){
- glFinish();
- glXSwapBuffers(_display, _window);
- glLoadIdentity();
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- }
- void EGE_Window::grabMouse(bool grab){
- /*if(grab)
- else*/
- }
- void EGE_Window::setBackgroundColor(float r, float g, float b){
- _r = r;
- _g = g;
- _b = b;
- }
- void EGE_Window::setMinimumSize(int minWidth, int minHeight){
- if(minWidth < 1) minWidth = 1;
- if(minHeight < 1) minHeight = 1;
- _minWidth = minWidth;
- _minHeight = minHeight;
- }
- void EGE_Window::setMaximumSize(int maxWidth, int maxHeight){
- _maxWidth = maxWidth;
- _maxHeight = maxHeight;
- }
- bool EGE_Window::pollEvent(EGE_Event *event){
- if(XPending(_display) > 0) {
- XNextEvent(_display, &_event);
- switch(_event.type){
- case ClientMessage:
- if((Atom)_event.xclient.data.l[0] == _close){ event->type = EGE_QUIT; XResizeWindow(_display, _window, _width, _height); }
- break;
- case KeyPress:
- event->type = EGE_KEYDOWN;
- char _key[1];
- KeySym _keysym;
- EGE_Key _rk;
- if(XLookupString(&_event.xkey, _key, 25, &_keysym, NULL)){
- _rk = (EGE_Key)_key[0];
- } else {
- _rk = (EGE_Key)_event.xkey.keycode;
- }
- event->key.keysym = _rk;
- break;
- case KeyRelease:
- event->type = EGE_KEYUP;
- if(XLookupString(&_event.xkey, _key, 25, &_keysym, NULL)){
- _rk = (EGE_Key)_key[0];
- } else {
- _rk = (EGE_Key)_event.xkey.keycode;
- }
- event->key.keysym = _rk;
- break;
- case ButtonPress:
- event->type = EGE_MOUSEBUTTON;
- event->mouse.type = EGE_MOUSEBUTTONDOWN;
- event->mouse.x = _event.xbutton.x;
- event->mouse.y = _event.xbutton.y;
- switch(_event.xbutton.button){
- case Button1: event->mouse.button = 1; break;
- case Button2: event->mouse.button = 2; break;
- case Button3: event->mouse.button = 3; break;
- case Button4: event->mouse.button = 4; break;
- case Button5: event->mouse.button = 5; break;
- default: event->mouse.button = 0; break;
- }
- break;
- case ButtonRelease:
- event->type = EGE_MOUSEBUTTON;
- event->mouse.type = EGE_MOUSEBUTTONUP;
- event->mouse.x = _event.xbutton.x;
- event->mouse.y = _event.xbutton.y;
- switch(_event.xbutton.button){
- case Button1: event->mouse.button = 1; break;
- case Button2: event->mouse.button = 2; break;
- case Button3: event->mouse.button = 3; break;
- case Button4: event->mouse.button = 4; break;
- case Button5: event->mouse.button = 5; break;
- default: event->mouse.button = 0; break;
- }
- break;
- case ResizeRequest:
- event->type = EGE_WINDOWEVENT;
- event->window.type = EGE_WINDOW_RESIZE;
- break;
- case Expose:
- break;
- case ConfigureNotify:
- break;
- }
- return true;
- }
- return false;
- }
- };
- #endif /*__linux__*/
Advertisement
Add Comment
Please, Sign In to add comment