2 changed files with 2575 additions and 0 deletions
File diff suppressed because it is too large
@ -0,0 +1,310 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include "ofBaseApp.h" |
||||
|
|
||||
|
#include "ofAppBaseWindow.h" |
||||
|
#include "ofThread.h" |
||||
|
#include "ofImage.h" |
||||
|
#include "ofBaseTypes.h" |
||||
|
#include "ofEvents.h" |
||||
|
#include "ofConstants.h" |
||||
|
#include "ofTypes.h" |
||||
|
|
||||
|
// include includes for both native and X11 possibilities
|
||||
|
#include <libudev.h> |
||||
|
#include <stdbool.h> |
||||
|
#include <stdio.h> // sprintf |
||||
|
#include <stdlib.h> // malloc |
||||
|
#include <math.h> |
||||
|
#include <fcntl.h> // open fcntl |
||||
|
#include <unistd.h> // read close |
||||
|
#include <linux/joystick.h> |
||||
|
|
||||
|
#include "linux/kd.h" // keyboard stuff... |
||||
|
#include "termios.h" |
||||
|
#include "sys/ioctl.h" |
||||
|
|
||||
|
#include <dirent.h> // scandir |
||||
|
#include <string.h> // strlen |
||||
|
|
||||
|
// x11
|
||||
|
#include <X11/Xlib.h> |
||||
|
#include <X11/Xutil.h> |
||||
|
|
||||
|
#include <queue> |
||||
|
#include <map> |
||||
|
|
||||
|
#include <EGL/egl.h> |
||||
|
|
||||
|
// TODO: this shold be passed in with the other window settings, like window alpha, etc.
|
||||
|
enum ofAppEGLWindowType { |
||||
|
OF_APP_WINDOW_AUTO, |
||||
|
OF_APP_WINDOW_NATIVE, |
||||
|
OF_APP_WINDOW_X11 |
||||
|
}; |
||||
|
|
||||
|
struct ofAppEGLWindowMouseArgs { |
||||
|
string deviceName; |
||||
|
int fildes; // File Descriptor
|
||||
|
int absXMin; |
||||
|
int absXMax; |
||||
|
int absYMin; |
||||
|
int absYMax; |
||||
|
float scaleX; |
||||
|
float scaleY; |
||||
|
}; |
||||
|
|
||||
|
typedef std::map<EGLint,EGLint> ofEGLAttributeList; |
||||
|
typedef std::map<EGLint,EGLint>::iterator ofEGLAttributeListIterator; |
||||
|
|
||||
|
class ofAppEGLWindow : public ofAppBaseGLESWindow, public ofThread { |
||||
|
public: |
||||
|
|
||||
|
struct Settings; |
||||
|
|
||||
|
ofAppEGLWindow(); |
||||
|
virtual ~ofAppEGLWindow(); |
||||
|
|
||||
|
static void loop(){}; |
||||
|
static bool doesLoop(){ return false; } |
||||
|
static bool allowsMultiWindow(){ return false; } |
||||
|
static bool needsPolling(){ return true; } |
||||
|
static void pollEvents(); |
||||
|
|
||||
|
using ofAppBaseGLESWindow::setup; |
||||
|
void setup(const Settings & settings); |
||||
|
void setup(const ofGLESWindowSettings & settings); |
||||
|
|
||||
|
void update(); |
||||
|
void draw(); |
||||
|
void close(); |
||||
|
void makeCurrent(); |
||||
|
void swapBuffers(); |
||||
|
void startRender(); |
||||
|
void finishRender(); |
||||
|
|
||||
|
ofCoreEvents & events(); |
||||
|
std::shared_ptr<ofBaseRenderer> & renderer(); |
||||
|
|
||||
|
void setThreadTimeout(long timeOut){ threadTimeout = timeOut; } |
||||
|
|
||||
|
virtual void hideCursor(); |
||||
|
virtual void showCursor(); |
||||
|
|
||||
|
virtual void setWindowPosition(int x, int y); |
||||
|
virtual void setWindowShape(int w, int h); |
||||
|
|
||||
|
virtual glm::vec2 getWindowPosition(); |
||||
|
virtual glm::vec2 getWindowSize(); |
||||
|
virtual glm::vec2 getScreenSize(); |
||||
|
|
||||
|
virtual void setOrientation(ofOrientation orientation); |
||||
|
virtual ofOrientation getOrientation(); |
||||
|
virtual bool doesHWOrientation(); |
||||
|
|
||||
|
//this is used by ofGetWidth and now determines the window width based on orientation
|
||||
|
virtual int getWidth(); |
||||
|
virtual int getHeight(); |
||||
|
|
||||
|
virtual void setWindowTitle(std::string title); // TODO const correct
|
||||
|
|
||||
|
virtual ofWindowMode getWindowMode(); |
||||
|
|
||||
|
virtual void setFullscreen(bool fullscreen); |
||||
|
virtual void toggleFullscreen(); |
||||
|
|
||||
|
virtual void enableSetupScreen(); |
||||
|
virtual void disableSetupScreen(); |
||||
|
|
||||
|
virtual void setVerticalSync(bool enabled); |
||||
|
|
||||
|
struct Settings: public ofGLESWindowSettings { |
||||
|
public: |
||||
|
ofAppEGLWindowType eglWindowPreference; // what window type is preferred?
|
||||
|
EGLint eglWindowOpacity; // 0-255 window alpha value
|
||||
|
|
||||
|
ofEGLAttributeList frameBufferAttributes; |
||||
|
// surface creation
|
||||
|
ofEGLAttributeList windowSurfaceAttributes; |
||||
|
|
||||
|
ofColor initialClearColor; |
||||
|
|
||||
|
int screenNum; |
||||
|
int layer; |
||||
|
|
||||
|
Settings(); |
||||
|
Settings(const ofGLESWindowSettings & settings); |
||||
|
}; |
||||
|
|
||||
|
EGLDisplay getEglDisplay() const; |
||||
|
EGLSurface getEglSurface() const; |
||||
|
EGLContext getEglContext() const; |
||||
|
|
||||
|
#ifndef TARGET_RASPBERRY_PI |
||||
|
Display* getX11Display(); |
||||
|
Window getX11Window(); |
||||
|
#endif |
||||
|
|
||||
|
EGLConfig getEglConfig() const; |
||||
|
|
||||
|
EGLint getEglVersionMajor () const; |
||||
|
EGLint getEglVersionMinor() const; |
||||
|
|
||||
|
|
||||
|
protected: |
||||
|
void setWindowRect(const ofRectangle& requestedWindowRect); |
||||
|
|
||||
|
|
||||
|
// bool create
|
||||
|
|
||||
|
virtual void setupPeripherals(); |
||||
|
|
||||
|
virtual ofRectangle getScreenRect(); |
||||
|
|
||||
|
int getWindowWidth(); |
||||
|
int getWindowHeight(); |
||||
|
|
||||
|
ofWindowMode windowMode; |
||||
|
bool bNewScreenMode; ///< \brief This indicates if a (new) window rectangle has to be adjusted.
|
||||
|
int buttonInUse; ///< \brief Mouse button currently in use.
|
||||
|
bool bEnableSetupScreen; ///< \brief This indicates the need/intent to draw a setup screen.
|
||||
|
bool bShowCursor; ///< \brief Indicate the visibility of the (mouse) cursor.
|
||||
|
|
||||
|
std::string eglDisplayString; |
||||
|
int nFramesSinceWindowResized; ///< \brief The number of frames passed/shown since the window got resized.
|
||||
|
ofOrientation orientation; |
||||
|
|
||||
|
|
||||
|
void threadedFunction(); |
||||
|
std::queue<ofMouseEventArgs> mouseEvents; |
||||
|
std::queue<ofKeyEventArgs> keyEvents; |
||||
|
void checkEvents(); |
||||
|
ofImage mouseCursor; |
||||
|
|
||||
|
// TODO: getters and setters? OR automatically set based on
|
||||
|
// OS or screen size? Should be changed when screen is resized?
|
||||
|
float mouseScaleX; ///< \brief Amount by which to mouse movements along the X axis.
|
||||
|
float mouseScaleY; ///< \brief Amount by which to mouse movements along the Y axis.
|
||||
|
|
||||
|
|
||||
|
// float getMouseScaleX() const;
|
||||
|
// void setMouseScaleX(float x);
|
||||
|
// float getMouseScaleY() const;
|
||||
|
// void setMouseScaleY(float y);
|
||||
|
|
||||
|
// For absolute input devices that send ABS_X and ABS_Y events, we want to store
|
||||
|
// information about the min and max axis values.
|
||||
|
int mouseAbsXMin; |
||||
|
int mouseAbsXMax; |
||||
|
int mouseAbsYMin; |
||||
|
int mouseAbsYMax; |
||||
|
|
||||
|
// TODO: a list of all valid and open mouse devices
|
||||
|
// Store open mouse device file descriptors
|
||||
|
vector<ofAppEGLWindowMouseArgs> mice; |
||||
|
|
||||
|
bool hasMouse() { return mouseDetected; } |
||||
|
bool hasKeyboard() { return keyboardDetected; } |
||||
|
|
||||
|
|
||||
|
//------------------------------------------------------------
|
||||
|
// EGL
|
||||
|
//------------------------------------------------------------
|
||||
|
|
||||
|
bool createSurface(); |
||||
|
bool destroySurface(); |
||||
|
|
||||
|
// bool resizeSurface();
|
||||
|
|
||||
|
EGLDisplay eglDisplay; // EGL display connection
|
||||
|
EGLSurface eglSurface; |
||||
|
EGLContext eglContext; |
||||
|
|
||||
|
EGLConfig eglConfig; |
||||
|
|
||||
|
EGLint eglVersionMajor; |
||||
|
EGLint eglVersionMinor; |
||||
|
|
||||
|
//------------------------------------------------------------
|
||||
|
// PLATFORM SPECIFIC WINDOWING
|
||||
|
//------------------------------------------------------------
|
||||
|
|
||||
|
//------------------------------------------------------------
|
||||
|
// WINDOWING
|
||||
|
//------------------------------------------------------------
|
||||
|
// EGL window
|
||||
|
ofRectangle nonFullscreenWindowRect; // the rectangle describing the non-fullscreen window
|
||||
|
ofRectangle currentWindowRect; // the rectangle describing the current device
|
||||
|
|
||||
|
bool createWindow(const ofRectangle& requestedWindowRect); |
||||
|
bool destroyWindow(); |
||||
|
|
||||
|
bool isUsingX11; ///< \brief Indicate the use of the X Window System.
|
||||
|
|
||||
|
bool isWindowInited; ///< \brief Indicate that the window is (properly) initialized.
|
||||
|
bool isSurfaceInited; ///< \brief Indicate that the surface is (properly) initialized.
|
||||
|
|
||||
|
void initNative(); |
||||
|
void exitNative(); |
||||
|
|
||||
|
EGLNativeWindowType getNativeWindow(); |
||||
|
EGLNativeDisplayType getNativeDisplay(); |
||||
|
|
||||
|
#ifdef TARGET_RASPBERRY_PI |
||||
|
void initRPiNative(); |
||||
|
void exitRPiNative(); |
||||
|
|
||||
|
EGL_DISPMANX_WINDOW_T dispman_native_window; // rpi
|
||||
|
|
||||
|
DISPMANX_UPDATE_HANDLE_T dispman_update; |
||||
|
DISPMANX_ELEMENT_HANDLE_T dispman_element; |
||||
|
DISPMANX_DISPLAY_HANDLE_T dispman_display; |
||||
|
|
||||
|
DISPMANX_CLAMP_T dispman_clamp; |
||||
|
DISPMANX_TRANSFORM_T dispman_transform; |
||||
|
VC_DISPMANX_ALPHA_T dispman_alpha; |
||||
|
|
||||
|
bool createRPiNativeWindow(const ofRectangle& requestedWindowRect); |
||||
|
|
||||
|
#else |
||||
|
// if you are not raspberry pi, you will not be able to
|
||||
|
// create a window without using x11.
|
||||
|
#endif |
||||
|
|
||||
|
Display* x11Display; ///< \brief Indicate which X11 display is in use (currently).
|
||||
|
Screen* x11Screen; ///< \brief Indicate which X11 screen is in use (currently).
|
||||
|
Window x11Window; |
||||
|
long x11ScreenNum; ///< \brief The number of the X11 screen is in use (currently).
|
||||
|
bool createX11NativeWindow(const ofRectangle& requestedWindowRect); |
||||
|
|
||||
|
//------------------------------------------------------------
|
||||
|
// EVENTS
|
||||
|
//------------------------------------------------------------
|
||||
|
void setupNativeEvents(); |
||||
|
void destroyNativeEvents(); |
||||
|
|
||||
|
void setupNativeUDev(); |
||||
|
void destroyNativeUDev(); |
||||
|
|
||||
|
void setupNativeMouse(); |
||||
|
void setupNativeKeyboard(); |
||||
|
|
||||
|
void destroyNativeMouse(); |
||||
|
void destroyNativeKeyboard(); |
||||
|
|
||||
|
void readNativeMouseEvents(); |
||||
|
void readNativeKeyboardEvents(); |
||||
|
void readNativeUDevEvents(); |
||||
|
|
||||
|
static void handleX11Event(const XEvent& event); |
||||
|
|
||||
|
private: |
||||
|
Settings settings; |
||||
|
int glesVersion; ///< \brief Indicate the version of OpenGL for Embedded Systems.
|
||||
|
bool keyboardDetected; |
||||
|
bool mouseDetected; |
||||
|
long threadTimeout; |
||||
|
ofCoreEvents coreEvents; |
||||
|
std::shared_ptr<ofBaseRenderer> currentRenderer; |
||||
|
static ofAppEGLWindow * instance; |
||||
|
}; |
Loading…
Reference in new issue