36 if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) != 0) {
37 printf(
"Error initializing SDL: %s\n", SDL_GetError());
40 SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
41 SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
42 SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
43 SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
44 SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
52 GHOST_IWindow *GHOST_SystemSDL::createWindow(
const char *title,
85 SDL_SetWindowDisplayMode(sdl_win, &mode);
86 SDL_ShowWindow(sdl_win);
87 SDL_SetWindowFullscreen(sdl_win, SDL_TRUE);
123 SDL_DisplayMode mode;
124 SDL_GetDesktopDisplayMode(0, &mode);
131 SDL_DisplayMode mode;
132 SDL_GetCurrentDisplayMode(0, &mode);
139 return SDL_GetNumVideoDisplays();
152 if (
context->initializeDrawingContext())
169 SDL_Keymod
mod = SDL_GetModState();
182 #define GXMAP(k, x, y) \
191 if ((key >= SDL_SCANCODE_A) && (key <= SDL_SCANCODE_Z)) {
194 else if ((key >= SDL_SCANCODE_1) && (key <= SDL_SCANCODE_0)) {
198 else if ((key >= SDL_SCANCODE_F1) && (key <= SDL_SCANCODE_F12)) {
201 else if ((key >= SDL_SCANCODE_F13) && (key <= SDL_SCANCODE_F24)) {
302 SDL_Window *sdl_win = SDL_GetWindowFromID(
id);
303 if (sdl_win ==
NULL) {
304 sdl_win = SDL_GL_GetCurrentWindow();
309 void GHOST_SystemSDL::processEvent(SDL_Event *sdl_event)
313 switch (sdl_event->type) {
314 case SDL_WINDOWEVENT: {
315 SDL_WindowEvent &sdl_sub_evt = sdl_event->window;
320 switch (sdl_sub_evt.event) {
321 case SDL_WINDOWEVENT_EXPOSED:
324 case SDL_WINDOWEVENT_RESIZED:
327 case SDL_WINDOWEVENT_MOVED:
330 case SDL_WINDOWEVENT_FOCUS_GAINED:
333 case SDL_WINDOWEVENT_FOCUS_LOST:
336 case SDL_WINDOWEVENT_CLOSE:
350 case SDL_MOUSEMOTION: {
351 SDL_MouseMotionEvent &sdl_sub_evt = sdl_event->motion;
354 assert(window !=
NULL);
357 SDL_GetWindowPosition(sdl_win, &x_win, &y_win);
380 if (x_new != x_root || y_new != y_root) {
384 SDL_WarpMouseInWindow(sdl_win, x_new - x_win, y_new - y_win);
390 SDL_WarpMouseInWindow(sdl_win, x_new - x_win, y_new - y_win);
421 case SDL_MOUSEBUTTONUP:
422 case SDL_MOUSEBUTTONDOWN: {
423 SDL_MouseButtonEvent &sdl_sub_evt = sdl_event->button;
430 assert(window !=
NULL);
433 if (sdl_sub_evt.button == SDL_BUTTON_LEFT)
435 else if (sdl_sub_evt.button == SDL_BUTTON_MIDDLE)
437 else if (sdl_sub_evt.button == SDL_BUTTON_RIGHT)
440 else if (sdl_sub_evt.button == SDL_BUTTON_X1)
442 else if (sdl_sub_evt.button == SDL_BUTTON_X2)
451 case SDL_MOUSEWHEEL: {
452 SDL_MouseWheelEvent &sdl_sub_evt = sdl_event->wheel;
455 assert(window !=
NULL);
461 SDL_KeyboardEvent &sdl_sub_evt = sdl_event->key;
462 SDL_Keycode sym = sdl_sub_evt.keysym.sym;
468 assert(window !=
NULL);
479 case SDLK_KP_MULTIPLY:
527 if (sdl_sub_evt.keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT)) {
529 if (sym >=
'a' && sym <= (
'a' + 32)) {
617 SDL_Window *win = SDL_GetMouseFocus();
618 SDL_GetWindowPosition(win, &x_win, &y_win);
621 SDL_GetMouseState(&xi, &yi);
631 SDL_Window *win = SDL_GetMouseFocus();
632 SDL_GetWindowPosition(win, &x_win, &y_win);
634 SDL_WarpMouseInWindow(win,
x - x_win,
y - y_win);
638 bool GHOST_SystemSDL::generateWindowExposeEvents()
640 std::vector<GHOST_WindowSDL *>::iterator w_start = m_dirty_windows.begin();
641 std::vector<GHOST_WindowSDL *>::const_iterator w_end = m_dirty_windows.end();
642 bool anyProcessed =
false;
644 for (; w_start != w_end; ++w_start) {
647 (*w_start)->validate();
656 m_dirty_windows.clear();
665 bool anyProcessed =
false;
670 if (waitForEvent && m_dirty_windows.empty() && !SDL_HasEvents(SDL_FIRSTEVENT, SDL_LASTEVENT)) {
674 SDL_WaitEventTimeout(
NULL, -1);
692 while (SDL_PollEvent(&sdl_event)) {
693 processEvent(&sdl_event);
697 if (generateWindowExposeEvents()) {
700 }
while (waitForEvent && !anyProcessed);
717 std::vector<GHOST_IWindow *>::const_iterator win_it = win_vec.begin();
718 std::vector<GHOST_IWindow *>::const_iterator win_end = win_vec.end();
720 for (; win_it != win_end; ++win_it) {
731 GHOST_ASSERT((bad_wind !=
NULL),
"addDirtyWindow() NULL ptr trapped (window)");
733 m_dirty_windows.push_back(bad_wind);
753 SDL_SetClipboardText(
buffer);
#define GHOST_OPENGL_SDL_RESET_NOTIFICATION_STRATEGY
#define GHOST_OPENGL_SDL_CONTEXT_FLAGS
#define GHOST_ASSERT(x, info)
static SDL_Window * SDL_GetWindowFromID_fallback(Uint32 id)
static GHOST_TKey convertSDLKey(SDL_Scancode key)
@ GHOST_kWindowStateFullScreen
unsigned int GHOST_TUns32
unsigned long long GHOST_TUns64
@ GHOST_kEventWindowClose
@ GHOST_kEventButtonUp
Mouse button event.
@ GHOST_kEventWindowActivate
@ GHOST_kEventWindowUpdate
@ GHOST_kEventWindowDeactivate
@ GHOST_kEventButtonDown
Mouse move event.
@ GHOST_kEventKeyDown
Trackpad event.
@ GHOST_kEventQuitRequest
static const GHOST_TabletData GHOST_TABLET_DATA_NONE
@ GHOST_kKeyNumpadAsterisk
GHOST_TDrawingContextType
@ GHOST_kButtonMaskButton4
@ GHOST_kButtonMaskButton5
@ GHOST_kButtonMaskMiddle
@ GHOST_kModifierKeyRightControl
@ GHOST_kModifierKeyLeftControl
@ GHOST_kModifierKeyRightAlt
@ GHOST_kModifierKeyRightShift
@ GHOST_kModifierKeyLeftAlt
@ GHOST_kModifierKeyLeftShift
unsigned char GHOST_TUns8
_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 type
_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 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_TUns64 getMilliSeconds()
GHOST_TSuccess setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y)
bool processEvents(bool waitForEvent)
GHOST_IContext * createOffscreenContext(GHOST_GLSettings glSettings)
GHOST_TSuccess disposeContext(GHOST_IContext *context)
void putClipboard(GHOST_TInt8 *buffer, bool selection) const
void addDirtyWindow(GHOST_WindowSDL *bad_wind)
GHOST_TSuccess getButtons(GHOST_Buttons &buttons) const
GHOST_TSuccess getModifierKeys(GHOST_ModifierKeys &keys) const
GHOST_TSuccess getCursorPosition(GHOST_TInt32 &x, GHOST_TInt32 &y) const
GHOST_TUns8 * getClipboard(bool selection) const
void getMainDisplayDimensions(GHOST_TUns32 &width, GHOST_TUns32 &height) const
void getAllDisplayDimensions(GHOST_TUns32 &width, GHOST_TUns32 &height) const
GHOST_TUns8 getNumDisplays() const
virtual GHOST_TSuccess init()
GHOST_TimerManager * getTimerManager() const
GHOST_WindowManager * m_windowManager
GHOST_TSuccess pushEvent(GHOST_IEvent *event)
GHOST_DisplayManager * m_displayManager
GHOST_TUns64 nextFireTime()
bool fireTimers(GHOST_TUns64 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)
GHOST_TAxisFlag getCursorGrabAxis() const
void setCursorGrabAccum(GHOST_TInt32 x, GHOST_TInt32 y)
GHOST_TGrabCursorMode getCursorGrabMode() const
void getCursorGrabAccum(GHOST_TInt32 &x, GHOST_TInt32 &y) const
__kernel void ccl_constant KernelData ccl_global void ccl_global char ccl_global int ccl_global char ccl_global unsigned int ccl_global float * buffer
struct SELECTID_Context context
void set(GHOST_TModifierKeyMask mask, bool down)
ccl_device_inline int mod(int x, int m)