Edit

kc3-lang/angle/util/x11/X11Window.cpp

Branch :

  • Show log

    Commit

  • Author : Corentin Wallez
    Date : 2015-05-05 17:37:39
    Hash : fe2f3d63
    Message : Add a basic support for Linux for utils/ * Timer and path utils are done. * Window only implements initialize and setVisible BUG=angleproject:892 Change-Id: I3f49b68ef9ec5be324b25e211199bac2953ae11e Reviewed-on: https://chromium-review.googlesource.com/269520 Reviewed-by: Geoff Lang <geofflang@chromium.org> Tested-by: Corentin Wallez <cwallez@chromium.org>

  • util/x11/X11Window.cpp
  • //
    // Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    
    // X11Window.cpp: Implementation of OSWindow for X11
    
    #include "x11/X11Window.h"
    
    X11Window::X11Window()
        : mDisplay(nullptr),
          mWindow(0)
    {
    }
    
    X11Window::~X11Window()
    {
        destroy();
    }
    
    bool X11Window::initialize(const std::string &name, size_t width, size_t height)
    {
        destroy();
    
        mDisplay = XOpenDisplay(NULL);
        if (!mDisplay)
        {
            return false;
        }
    
        int screen = DefaultScreen(mDisplay);
        Window root = RootWindow(mDisplay, screen);
        Colormap colormap = XCreateColormap(mDisplay, root, DefaultVisual(mDisplay, screen), AllocNone);
        int depth = DefaultDepth(mDisplay, screen);
        Visual *visual = DefaultVisual(mDisplay, screen);
    
        XSetWindowAttributes attributes;
        unsigned long attributeMask = CWBorderPixel | CWColormap | CWEventMask;
    
        // TODO(cwallez) change when input is implemented
        attributes.event_mask = 0;
        attributes.border_pixel = 0;
        attributes.colormap = colormap;
    
        mWindow = XCreateWindow(mDisplay, root, 0, 0, width, height, 0, depth, InputOutput,
                                visual, attributeMask, &attributes);
    
        if (!mWindow)
        {
            XFreeColormap(mDisplay, colormap);
            return false;
        }
    
        XFlush(mDisplay);
    
        mX = 0;
        mY = 0;
        mWidth = width;
        mHeight = height;
    
        return true;
    }
    
    void X11Window::destroy()
    {
        if (mWindow)
        {
            XDestroyWindow(mDisplay, mWindow);
            mWindow = 0;
        }
        if (mDisplay)
        {
            XCloseDisplay(mDisplay);
            mDisplay = nullptr;
        }
    }
    
    EGLNativeWindowType X11Window::getNativeWindow() const
    {
        return mWindow;
    }
    
    EGLNativeDisplayType X11Window::getNativeDisplay() const
    {
        return mDisplay;
    }
    
    void X11Window::messageLoop()
    {
        //TODO
    }
    
    void X11Window::setMousePosition(int x, int y)
    {
        //TODO
    }
    
    OSWindow *CreateOSWindow()
    {
        return new X11Window();
    }
    
    bool X11Window::setPosition(int x, int y)
    {
        //TODO
        return true;
    }
    
    bool X11Window::resize(int width, int height)
    {
        //TODO
        return true;
    }
    
    void X11Window::setVisible(bool isVisible)
    {
        if (isVisible)
        {
            XMapWindow(mDisplay, mWindow);
        }
        else
        {
            XUnmapWindow(mDisplay, mWindow);
        }
        XFlush(mDisplay);
    }
    
    void X11Window::pushEvent(Event event)
    {
        //TODO
    }
    
    void X11Window::signalTestEvent()
    {
        //TODO
    }