22 if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) != 0) {
23 printf(
"Error initializing SDL: %s\n", SDL_GetError());
26 SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
27 SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
28 SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
29 SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
30 SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
38 GHOST_IWindow *GHOST_SystemSDL::createWindow(
const char *title,
71 SDL_SetWindowDisplayMode(sdl_win, &mode);
72 SDL_ShowWindow(sdl_win);
73 SDL_SetWindowFullscreen(sdl_win, SDL_TRUE);
109 SDL_DisplayMode mode;
110 SDL_GetDesktopDisplayMode(0, &mode);
117 SDL_DisplayMode mode;
118 SDL_GetCurrentDisplayMode(0, &mode);
125 return SDL_GetNumVideoDisplays();
138 if (
context->initializeDrawingContext()) {
155 SDL_Keymod
mod = SDL_GetModState();
168 #define GXMAP(k, x, y) \
177 if ((key >= SDL_SCANCODE_A) && (key <= SDL_SCANCODE_Z)) {
180 else if ((key >= SDL_SCANCODE_1) && (key <= SDL_SCANCODE_0)) {
184 else if ((key >= SDL_SCANCODE_F1) && (key <= SDL_SCANCODE_F12)) {
187 else if ((key >= SDL_SCANCODE_F13) && (key <= SDL_SCANCODE_F24)) {
284 SDL_Keycode
sym = sdl_sub_evt.keysym.sym;
290 case SDLK_KP_MULTIPLY:
338 if (sdl_sub_evt.keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT)) {
340 if (
sym >=
'a' &&
sym <= (
'a' + 32)) {
423 SDL_Window *sdl_win = SDL_GetWindowFromID(
id);
424 if (sdl_win ==
nullptr) {
425 sdl_win = SDL_GL_GetCurrentWindow();
430 void GHOST_SystemSDL::processEvent(SDL_Event *sdl_event)
434 switch (sdl_event->type) {
435 case SDL_WINDOWEVENT: {
436 SDL_WindowEvent &sdl_sub_evt = sdl_event->window;
441 assert(window !=
nullptr);
444 switch (sdl_sub_evt.event) {
445 case SDL_WINDOWEVENT_EXPOSED:
448 case SDL_WINDOWEVENT_RESIZED:
451 case SDL_WINDOWEVENT_MOVED:
454 case SDL_WINDOWEVENT_FOCUS_GAINED:
457 case SDL_WINDOWEVENT_FOCUS_LOST:
460 case SDL_WINDOWEVENT_CLOSE:
474 case SDL_MOUSEMOTION: {
475 SDL_MouseMotionEvent &sdl_sub_evt = sdl_event->motion;
478 assert(window !=
nullptr);
481 SDL_GetWindowPosition(sdl_win, &x_win, &y_win);
483 int32_t x_root = sdl_sub_evt.x + x_win;
484 int32_t y_root = sdl_sub_evt.y + y_win;
504 if (x_new != x_root || y_new != y_root) {
508 SDL_WarpMouseInWindow(sdl_win, x_new - x_win, y_new - y_win);
514 SDL_WarpMouseInWindow(sdl_win, x_new - x_win, y_new - y_win);
545 case SDL_MOUSEBUTTONUP:
546 case SDL_MOUSEBUTTONDOWN: {
547 SDL_MouseButtonEvent &sdl_sub_evt = sdl_event->button;
554 assert(window !=
nullptr);
557 if (sdl_sub_evt.button == SDL_BUTTON_LEFT) {
560 else if (sdl_sub_evt.button == SDL_BUTTON_MIDDLE) {
563 else if (sdl_sub_evt.button == SDL_BUTTON_RIGHT) {
567 else if (sdl_sub_evt.button == SDL_BUTTON_X1) {
570 else if (sdl_sub_evt.button == SDL_BUTTON_X2) {
581 case SDL_MOUSEWHEEL: {
582 SDL_MouseWheelEvent &sdl_sub_evt = sdl_event->wheel;
585 assert(window !=
nullptr);
591 SDL_KeyboardEvent &sdl_sub_evt = sdl_event->key;
594 const bool is_repeat = sdl_sub_evt.repeat != 0;
598 assert(window !=
nullptr);
624 SDL_Window *win = SDL_GetMouseFocus();
625 SDL_GetWindowPosition(win, &x_win, &y_win);
628 SDL_GetMouseState(&xi, &yi);
638 SDL_Window *win = SDL_GetMouseFocus();
639 SDL_GetWindowPosition(win, &x_win, &y_win);
641 SDL_WarpMouseInWindow(win,
x - x_win,
y - y_win);
645 bool GHOST_SystemSDL::generateWindowExposeEvents()
647 std::vector<GHOST_WindowSDL *>::iterator w_start = m_dirty_windows.begin();
648 std::vector<GHOST_WindowSDL *>::const_iterator w_end = m_dirty_windows.end();
649 bool anyProcessed =
false;
651 for (; w_start != w_end; ++w_start) {
654 (*w_start)->validate();
663 m_dirty_windows.clear();
672 bool anyProcessed =
false;
677 if (waitForEvent && m_dirty_windows.empty() && !SDL_HasEvents(SDL_FIRSTEVENT, SDL_LASTEVENT)) {
681 SDL_WaitEventTimeout(
nullptr, -1);
699 while (SDL_PollEvent(&sdl_event)) {
700 processEvent(&sdl_event);
704 if (generateWindowExposeEvents()) {
707 }
while (waitForEvent && !anyProcessed);
714 if (sdl_win ==
nullptr) {
724 std::vector<GHOST_IWindow *>::const_iterator win_it = win_vec.begin();
725 std::vector<GHOST_IWindow *>::const_iterator win_end = win_vec.end();
727 for (; win_it != win_end; ++win_it) {
738 GHOST_ASSERT((bad_wind !=
nullptr),
"addDirtyWindow() nullptr ptr trapped (window)");
740 m_dirty_windows.push_back(bad_wind);
745 Uint8
state = SDL_GetMouseState(
nullptr,
nullptr);
755 return (
char *)SDL_GetClipboardText();
760 SDL_SetClipboardText(
buffer);
#define GHOST_OPENGL_SDL_RESET_NOTIFICATION_STRATEGY
#define GHOST_OPENGL_SDL_CONTEXT_FLAGS
#define GHOST_ASSERT(x, info)
static char convert_keyboard_event_to_ascii(const SDL_KeyboardEvent &sdl_sub_evt)
static SDL_Window * SDL_GetWindowFromID_fallback(Uint32 id)
static GHOST_TKey convertSDLKey(SDL_Scancode key)
@ GHOST_kWindowStateFullScreen
@ GHOST_kEventWindowClose
@ GHOST_kEventWindowActivate
@ GHOST_kEventWindowUpdate
@ GHOST_kEventWindowDeactivate
@ GHOST_kEventQuitRequest
static const GHOST_TabletData GHOST_TABLET_DATA_NONE
@ GHOST_kKeyNumpadAsterisk
GHOST_TDrawingContextType
@ GHOST_kModifierKeyRightControl
@ GHOST_kModifierKeyLeftControl
@ GHOST_kModifierKeyRightAlt
@ GHOST_kModifierKeyRightShift
@ GHOST_kModifierKeyLeftAlt
@ GHOST_kModifierKeyLeftShift
@ GHOST_kButtonMaskButton4
@ GHOST_kButtonMaskButton5
@ GHOST_kButtonMaskMiddle
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei height
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei width
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble top
static btDbvtVolume bounds(btDbvtNode **leaves, int count)
GHOST_TSuccess getCursorPosition(int32_t &x, int32_t &y) const
bool processEvents(bool waitForEvent)
GHOST_IContext * createOffscreenContext(GHOST_GLSettings glSettings)
uint8_t getNumDisplays() const
GHOST_TSuccess disposeContext(GHOST_IContext *context)
char * getClipboard(bool selection) const
GHOST_TSuccess setCursorPosition(int32_t x, int32_t y)
void addDirtyWindow(GHOST_WindowSDL *bad_wind)
void putClipboard(const char *buffer, bool selection) const
void getMainDisplayDimensions(uint32_t &width, uint32_t &height) const
GHOST_TSuccess getButtons(GHOST_Buttons &buttons) const
uint64_t getMilliSeconds()
GHOST_TSuccess getModifierKeys(GHOST_ModifierKeys &keys) const
void getAllDisplayDimensions(uint32_t &width, uint32_t &height) const
virtual GHOST_TSuccess init()
GHOST_TimerManager * getTimerManager() const
GHOST_WindowManager * m_windowManager
GHOST_TSuccess pushEvent(GHOST_IEvent *event)
GHOST_DisplayManager * m_displayManager
bool fireTimers(uint64_t time)
GHOST_TSuccess addWindow(GHOST_IWindow *window)
GHOST_IWindow * getActiveWindow(void) const
const std::vector< GHOST_IWindow * > & getWindows() const
void getClientBounds(GHOST_Rect &bounds) const
SDL_Window * getSDLWindow()
GHOST_TSuccess getCursorGrabBounds(GHOST_Rect &bounds)
void setCursorGrabAccum(int32_t x, int32_t y)
GHOST_TAxisFlag getCursorGrabAxis() const
GHOST_TGrabCursorMode getCursorGrabMode() const
void getCursorGrabAccum(int32_t &x, int32_t &y) const
ccl_global float * buffer
SymEdge< T > * sym(const SymEdge< T > *se)
unsigned __int64 uint64_t
void set(GHOST_TModifierKey mask, bool down)
ccl_device_inline int mod(int x, int m)