int SDL_SetGammaRampForDisplay(SDL_VideoDisplay * display, const Uint16 * red, const Uint16 * green, const Uint16 * blue) { SDL_VideoDevice *_this = SDL_GetVideoDevice(); int succeeded; if (!_this) { SDL_UninitializedVideo(); return -1; } /* Lazily allocate the gamma tables */ if (!display->gamma) { if (SDL_GetGammaRampForDisplay(display, NULL, NULL, NULL) < 0) { return -1; } } /* Fill the gamma table with the new values */ if (red) { SDL_memcpy(&display->gamma[0 * 256], red, 256 * sizeof(*display->gamma)); } if (green) { SDL_memcpy(&display->gamma[1 * 256], green, 256 * sizeof(*display->gamma)); } if (blue) { SDL_memcpy(&display->gamma[2 * 256], blue, 256 * sizeof(*display->gamma)); } /* Try to set the gamma ramp in the driver */ succeeded = -1; if (_this && _this->SetDisplayGammaRamp) { if (SDL_GetFocusWindow()) { succeeded = _this->SetDisplayGammaRamp(_this, display, display->gamma); } else { succeeded = 0; } } else { SDL_SetError("Gamma ramp manipulation not supported"); } return succeeded; }
/* Show the specified cursor, or hide if cursor is NULL */ static int DirectFB_ShowCursor(SDL_Cursor * cursor) { SDL_DFB_CURSORDATA(cursor); DFBResult ret; SDL_Window *window; window = SDL_GetFocusWindow(); if (!window) return -1; else { SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window); if (display) { DFB_DisplayData *dispdata = (DFB_DisplayData *) display->driverdata; DFB_WindowData *windata = (DFB_WindowData *) window->driverdata; if (cursor) SDL_DFB_CHECKERR(windata->dfbwin-> SetCursorShape(windata->dfbwin, curdata->surf, curdata->hotx, curdata->hoty)); SDL_DFB_CHECKERR(dispdata->layer-> SetCooperativeLevel(dispdata->layer, DLSCL_ADMINISTRATIVE)); SDL_DFB_CHECKERR(dispdata->layer-> SetCursorOpacity(dispdata->layer, cursor ? 0xC0 : 0x00)); SDL_DFB_CHECKERR(dispdata->layer-> SetCooperativeLevel(dispdata->layer, DLSCL_SHARED)); } } return 0; error: return -1; }
void SDL_IBus_UpdateTextRect(SDL_Rect *rect) { if(rect){ SDL_memcpy(&ibus_cursor_rect, rect, sizeof(ibus_cursor_rect)); } SDL_Window *focused_win = SDL_GetFocusWindow(); if(!focused_win) return; int x = 0, y = 0; SDL_GetWindowPosition(focused_win, &x, &y); x += ibus_cursor_rect.x; y += ibus_cursor_rect.y; SDL_DBusContext *dbus = SDL_DBus_GetContext(); if(IBus_CheckConnection(dbus)){ DBusMessage *msg = dbus->message_new_method_call(IBUS_SERVICE, input_ctx_path, IBUS_INPUT_INTERFACE, "SetCursorLocation"); if(msg){ dbus->message_append_args(msg, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y, DBUS_TYPE_INT32, &ibus_cursor_rect.w, DBUS_TYPE_INT32, &ibus_cursor_rect.h, DBUS_TYPE_INVALID); } if(msg){ if(dbus->connection_send(ibus_conn, msg, NULL)){ dbus->connection_flush(ibus_conn); } dbus->message_unref(msg); } } }
static SDL_assert_state SDL_PromptAssertion(const SDL_assert_data *data, void *userdata) { #ifdef __WIN32__ #define ENDLINE "\r\n" #else #define ENDLINE "\n" #endif const char *envr; SDL_assert_state state = SDL_ASSERTION_ABORT; SDL_Window *window; SDL_MessageBoxData messagebox; SDL_MessageBoxButtonData buttons[] = { { 0, SDL_ASSERTION_RETRY, "Retry" }, { 0, SDL_ASSERTION_BREAK, "Break" }, { 0, SDL_ASSERTION_ABORT, "Abort" }, { SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT, SDL_ASSERTION_IGNORE, "Ignore" }, { SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT, SDL_ASSERTION_ALWAYS_IGNORE, "Always Ignore" } }; char *message; int selected; (void) userdata; /* unused in default handler. */ message = SDL_stack_alloc(char, SDL_MAX_LOG_MESSAGE); if (!message) { /* Uh oh, we're in real trouble now... */ return SDL_ASSERTION_ABORT; } SDL_snprintf(message, SDL_MAX_LOG_MESSAGE, "Assertion failure at %s (%s:%d), triggered %u %s:" ENDLINE " '%s'", data->function, data->filename, data->linenum, data->trigger_count, (data->trigger_count == 1) ? "time" : "times", data->condition); debug_print("\n\n%s\n\n", message); /* let env. variable override, so unit tests won't block in a GUI. */ envr = SDL_getenv("SDL_ASSERT"); if (envr != NULL) { SDL_stack_free(message); if (SDL_strcmp(envr, "abort") == 0) { return SDL_ASSERTION_ABORT; } else if (SDL_strcmp(envr, "break") == 0) { return SDL_ASSERTION_BREAK; } else if (SDL_strcmp(envr, "retry") == 0) { return SDL_ASSERTION_RETRY; } else if (SDL_strcmp(envr, "ignore") == 0) { return SDL_ASSERTION_IGNORE; } else if (SDL_strcmp(envr, "always_ignore") == 0) { return SDL_ASSERTION_ALWAYS_IGNORE; } else { return SDL_ASSERTION_ABORT; /* oh well. */ } } /* Leave fullscreen mode, if possible (scary!) */ window = SDL_GetFocusWindow(); if (window) { if (SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN) { SDL_MinimizeWindow(window); } else { /* !!! FIXME: ungrab the input if we're not fullscreen? */ /* No need to mess with the window */ window = NULL; } } /* Show a messagebox if we can, otherwise fall back to stdio */ SDL_zero(messagebox); messagebox.flags = SDL_MESSAGEBOX_WARNING; messagebox.window = window; messagebox.title = "Assertion Failed"; messagebox.message = message; messagebox.numbuttons = SDL_arraysize(buttons); messagebox.buttons = buttons; if (SDL_ShowMessageBox(&messagebox, &selected) == 0) { if (selected == -1) { state = SDL_ASSERTION_IGNORE; } else { state = (SDL_assert_state)selected; } } #ifdef HAVE_STDIO_H else { /* this is a little hacky. */ for ( ; ; ) { char buf[32]; fprintf(stderr, "Abort/Break/Retry/Ignore/AlwaysIgnore? [abriA] : "); fflush(stderr); if (fgets(buf, sizeof (buf), stdin) == NULL) { break; } if (SDL_strcmp(buf, "a") == 0) { state = SDL_ASSERTION_ABORT; break; } else if (SDL_strcmp(buf, "b") == 0) { state = SDL_ASSERTION_BREAK; break; } else if (SDL_strcmp(buf, "r") == 0) { state = SDL_ASSERTION_RETRY; break; } else if (SDL_strcmp(buf, "i") == 0) { state = SDL_ASSERTION_IGNORE; break; } else if (SDL_strcmp(buf, "A") == 0) { state = SDL_ASSERTION_ALWAYS_IGNORE; break; } } } #endif /* HAVE_STDIO_H */ /* Re-enter fullscreen mode */ if (window) { SDL_RestoreWindow(window); } SDL_stack_free(message); return state; }
static SDL_assert_state SDL_PromptAssertion(const SDL_assert_data *data, void *userdata) { const char *envr; SDL_assert_state state = SDL_ASSERTION_ABORT; SDL_Window *window; (void) userdata; /* unused in default handler. */ debug_print("\n\n" "Assertion failure at %s (%s:%d), triggered %u time%s:\n" " '%s'\n" "\n", data->function, data->filename, data->linenum, data->trigger_count, (data->trigger_count == 1) ? "" : "s", data->condition); /* let env. variable override, so unit tests won't block in a GUI. */ envr = SDL_getenv("SDL_ASSERT"); if (envr != NULL) { if (SDL_strcmp(envr, "abort") == 0) { return SDL_ASSERTION_ABORT; } else if (SDL_strcmp(envr, "break") == 0) { return SDL_ASSERTION_BREAK; } else if (SDL_strcmp(envr, "retry") == 0) { return SDL_ASSERTION_RETRY; } else if (SDL_strcmp(envr, "ignore") == 0) { return SDL_ASSERTION_IGNORE; } else if (SDL_strcmp(envr, "always_ignore") == 0) { return SDL_ASSERTION_ALWAYS_IGNORE; } else { return SDL_ASSERTION_ABORT; /* oh well. */ } } /* Leave fullscreen mode, if possible (scary!) */ window = SDL_GetFocusWindow(); if (window) { if (SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN) { SDL_MinimizeWindow(window); } else { /* !!! FIXME: ungrab the input if we're not fullscreen? */ /* No need to mess with the window */ window = 0; } } /* platform-specific UI... */ #ifdef __WIN32__ state = SDL_PromptAssertion_windows(data); #elif __MACOSX__ /* This has to be done in an Objective-C (*.m) file, so we call out. */ extern SDL_assert_state SDL_PromptAssertion_cocoa(const SDL_assert_data *); state = SDL_PromptAssertion_cocoa(data); #else /* this is a little hacky. */ for ( ; ; ) { char buf[32]; fprintf(stderr, "Abort/Break/Retry/Ignore/AlwaysIgnore? [abriA] : "); fflush(stderr); if (fgets(buf, sizeof (buf), stdin) == NULL) { break; } if (SDL_strcmp(buf, "a") == 0) { state = SDL_ASSERTION_ABORT; break; } else if (SDL_strcmp(envr, "b") == 0) { state = SDL_ASSERTION_BREAK; break; } else if (SDL_strcmp(envr, "r") == 0) { state = SDL_ASSERTION_RETRY; break; } else if (SDL_strcmp(envr, "i") == 0) { state = SDL_ASSERTION_IGNORE; break; } else if (SDL_strcmp(envr, "A") == 0) { state = SDL_ASSERTION_ALWAYS_IGNORE; break; } } #endif /* Re-enter fullscreen mode */ if (window) { SDL_RestoreWindow(window); } return state; }
static SDL_bool IBus_SetupConnection(SDL_DBusContext *dbus, const char* addr) { const char *path = NULL; SDL_bool result = SDL_FALSE; ibus_conn = dbus->connection_open_private(addr, NULL); if(!ibus_conn){ return SDL_FALSE; } dbus->connection_flush(ibus_conn); if(!dbus->bus_register(ibus_conn, NULL)){ ibus_conn = NULL; return SDL_FALSE; } dbus->connection_flush(ibus_conn); DBusMessage *msg = dbus->message_new_method_call(IBUS_SERVICE, IBUS_PATH, IBUS_INTERFACE, "CreateInputContext"); if(msg){ const char *client_name = "SDL2_Application"; dbus->message_append_args(msg, DBUS_TYPE_STRING, &client_name, DBUS_TYPE_INVALID); } if(msg){ DBusMessage *reply; reply = dbus->connection_send_with_reply_and_block(ibus_conn, msg, 1000, NULL); if(reply){ if(dbus->message_get_args(reply, NULL, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID)){ if(input_ctx_path){ SDL_free(input_ctx_path); } input_ctx_path = SDL_strdup(path); result = SDL_TRUE; } dbus->message_unref(reply); } dbus->message_unref(msg); } if(result){ DBusMessage *msg = dbus->message_new_method_call(IBUS_SERVICE, input_ctx_path, IBUS_INPUT_INTERFACE, "SetCapabilities"); if(msg){ Uint32 caps = IBUS_CAP_FOCUS | IBUS_CAP_PREEDIT_TEXT; dbus->message_append_args(msg, DBUS_TYPE_UINT32, &caps, DBUS_TYPE_INVALID); } if(msg){ if(dbus->connection_send(ibus_conn, msg, NULL)){ dbus->connection_flush(ibus_conn); } dbus->message_unref(msg); } dbus->bus_add_match(ibus_conn, "type='signal',interface='org.freedesktop.IBus.InputContext'", NULL); dbus->connection_add_filter(ibus_conn, &IBus_MessageFilter, dbus, NULL); dbus->connection_flush(ibus_conn); } SDL_IBus_SetFocus(SDL_GetFocusWindow() != NULL); SDL_IBus_UpdateTextRect(NULL); return result; }
JNIEXPORT void JNICALL JAVA_EXPORT_NAME(SDLSurfaceView_nativeMouse) ( JNIEnv* env, jobject thiz, jint x, jint y, jint action, jint pointerId, jint force, jint radius ) { if(pointerId < 0) pointerId = 0; if(pointerId > MAX_MULTITOUCH_POINTERS) pointerId = MAX_MULTITOUCH_POINTERS; // if( SDL_android_processTouchscreenKeyboard(x, y, action, pointerId) ) // return; if (GLES_pwidth != 0.0) { float ix = 1.0 * x / GLES_pwidth; float iy = 1.0 * y / GLES_pheight; x = (int) (GLES_vbox_left + ix * (GLES_vbox_right - GLES_vbox_left)); y = (int) (GLES_vbox_top + iy * (GLES_vbox_bottom - GLES_vbox_top)); } #if SDL_VIDEO_RENDER_RESIZE // Translate mouse coordinates #if SDL_VERSION_ATLEAST(1,3,0) SDL_Window * window = SDL_GetFocusWindow(); if( window && window->renderer->window ) { x = x * window->w / window->display->desktop_mode.w; y = y * window->h / window->display->desktop_mode.h; } #else x = x * SDL_ANDROID_sFakeWindowWidth / SDL_ANDROID_sWindowWidth; y = y * SDL_ANDROID_sFakeWindowHeight / SDL_ANDROID_sWindowHeight; #endif #endif if( isMultitouchUsed ) { if( CurrentJoysticks[pointerId] ) { SDL_PrivateJoystickAxis(CurrentJoysticks[pointerId+1], 0, x); SDL_PrivateJoystickAxis(CurrentJoysticks[pointerId+1], 1, y); SDL_PrivateJoystickAxis(CurrentJoysticks[pointerId+1], 2, force); SDL_PrivateJoystickAxis(CurrentJoysticks[pointerId+1], 3, radius); if( action == MOUSE_DOWN ) SDL_PrivateJoystickButton(CurrentJoysticks[pointerId+1], 0, SDL_PRESSED); if( action == MOUSE_UP ) SDL_PrivateJoystickButton(CurrentJoysticks[pointerId+1], 0, SDL_RELEASED); } } if( !isMouseUsed ) { SDL_keysym keysym; if( action != MOUSE_MOVE ) SDL_SendKeyboardKey( action == MOUSE_DOWN ? SDL_PRESSED : SDL_RELEASED, GetKeysym(SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_KEYCODE_0)) ,&keysym) ); return; } if( action == MOUSE_DOWN || action == MOUSE_UP ) { #if SDL_VERSION_ATLEAST(1,3,0) SDL_SendMouseMotion(NULL, 0, x, y); SDL_SendMouseButton(NULL, (action == MOUSE_DOWN) ? SDL_PRESSED : SDL_RELEASED, 1 ); #else SDL_PrivateMouseMotion(0, 0, x, y); SDL_PrivateMouseButton( (action == MOUSE_DOWN) ? SDL_PRESSED : SDL_RELEASED, 1, x, y ); #endif } if( action == MOUSE_MOVE ) { #if SDL_VERSION_ATLEAST(1,3,0) SDL_SendMouseMotion(NULL, 0, x, y); #else SDL_PrivateMouseMotion(0, 0, x, y); #endif } if (action == MOUSE_UP) { SDL_PrivateMouseMotion(0, 0, -4096, -4096); } }
/* We need our own event queue, because Free Heroes 2 game uses * SDL_SetEventFilter(), and it calls SDL_Flip() from inside * it's custom filter function, and SDL_Flip() does not work * when it's not called from the main() thread. * So we, like, push the events into our own queue, * read each event from that queue inside SDL_ANDROID_PumpEvents(), * unlock the mutex, and push the event to SDL queue, * which is then immediately read by SDL from the same thread, * and then SDL invokes event filter function from FHeroes2. * FHeroes2 call SDL_Flip() from inside that event filter function, * and it works, because it is called from the main() thread. */ extern void SDL_ANDROID_PumpEvents() { static int oldMouseButtons = 0; SDL_Event ev; SDL_ANDROID_processAndroidTrackballDampening(); SDL_ANDROID_processMoveMouseWithKeyboard(); #if SDL_VERSION_ATLEAST(1,3,0) SDL_Window * window = SDL_GetFocusWindow(); if( !window ) return; #endif if( !BufferedEventsMutex ) BufferedEventsMutex = SDL_CreateMutex(); SDL_mutexP(BufferedEventsMutex); while( BufferedEventsStart != BufferedEventsEnd ) { ev = BufferedEvents[BufferedEventsStart]; BufferedEvents[BufferedEventsStart].type = 0; BufferedEventsStart++; if( BufferedEventsStart >= MAX_BUFFERED_EVENTS ) BufferedEventsStart = 0; SDL_mutexV(BufferedEventsMutex); switch( ev.type ) { case SDL_MOUSEMOTION: SDL_SendMouseMotion( ANDROID_CurrentWindow, 0, ev.motion.x, ev.motion.y ); break; case SDL_MOUSEBUTTONDOWN: if( ((oldMouseButtons & SDL_BUTTON(ev.button.button)) != 0) != ev.button.state ) { oldMouseButtons = (oldMouseButtons & ~SDL_BUTTON(ev.button.button)) | (ev.button.state ? SDL_BUTTON(ev.button.button) : 0); SDL_SendMouseButton( ANDROID_CurrentWindow, ev.button.state, ev.button.button ); } break; case SDL_KEYDOWN: //__android_log_print(ANDROID_LOG_INFO, "libSDL", "SDL_KEYDOWN: %i %i", ev->key.keysym.sym, ev->key.state); SDL_SendKeyboardKey( ev.key.state, &ev.key.keysym ); break; case SDL_JOYAXISMOTION: if( ev.jaxis.which < MAX_MULTITOUCH_POINTERS+1 && SDL_ANDROID_CurrentJoysticks[ev.jaxis.which] ) SDL_PrivateJoystickAxis( SDL_ANDROID_CurrentJoysticks[ev.jaxis.which], ev.jaxis.axis, ev.jaxis.value ); break; case SDL_JOYBUTTONDOWN: if( ev.jbutton.which < MAX_MULTITOUCH_POINTERS+1 && SDL_ANDROID_CurrentJoysticks[ev.jbutton.which] ) SDL_PrivateJoystickButton( SDL_ANDROID_CurrentJoysticks[ev.jbutton.which], ev.jbutton.button, ev.jbutton.state ); break; case SDL_JOYBALLMOTION: if( ev.jball.which < MAX_MULTITOUCH_POINTERS+1 && SDL_ANDROID_CurrentJoysticks[ev.jbutton.which] ) SDL_PrivateJoystickBall( SDL_ANDROID_CurrentJoysticks[ev.jball.which], ev.jball.ball, ev.jball.xrel, ev.jball.yrel ); break; #if SDL_VERSION_ATLEAST(1,3,0) //if( ANDROID_CurrentWindow ) // SDL_SendWindowEvent(ANDROID_CurrentWindow, SDL_WINDOWEVENT_MINIMIZED, 0, 0); #else case SDL_ACTIVEEVENT: SDL_PrivateAppActive(ev.active.gain, ev.active.state); break; #endif #if SDL_VERSION_ATLEAST(1,3,0) case SDL_FINGERMOTION: SDL_SendTouchMotion(0, ev.tfinger.fingerId, 0, (float)ev.tfinger.x / (float)window->w, (float)ev.tfinger.y / (float)window->h, ev.tfinger.pressure); break; case SDL_FINGERDOWN: SDL_SendFingerDown(0, ev.tfinger.fingerId, ev.tfinger.state ? 1 : 0, (float)ev.tfinger.x / (float)window->w, (float)ev.tfinger.y / (float)window->h, ev.tfinger.pressure); break; case SDL_TEXTINPUT: SDL_SendKeyboardText(ev.text.text); break; case SDL_MOUSEWHEEL: SDL_SendMouseWheel( ANDROID_CurrentWindow, ev.wheel.x, ev.wheel.y ); break; #endif } SDL_mutexP(BufferedEventsMutex); } SDL_mutexV(BufferedEventsMutex); };