Upgrade to SDL2.0.2 (8393682d9d96d1516831a397290cb34ceb82129f).

This commit is contained in:
rude
2014-03-09 10:15:01 +01:00
parent 6b31c2b45e
commit 2fb789ce68
63 changed files with 1450 additions and 1159 deletions
+7 -2
View File
@@ -38,7 +38,8 @@
#if !SDL_TIMERS_DISABLED
extern int SDL_TimerInit(void);
extern void SDL_TimerQuit(void);
extern void SDL_InitTicks(void);
extern void SDL_TicksInit(void);
extern void SDL_TicksQuit(void);
#endif
#if SDL_VIDEO_DRIVER_WINDOWS
extern int SDL_HelperWindowCreate(void);
@@ -123,7 +124,7 @@ SDL_InitSubSystem(Uint32 flags)
#endif
#if !SDL_TIMERS_DISABLED
SDL_InitTicks();
SDL_TicksInit();
#endif
if ((flags & SDL_INIT_GAMECONTROLLER)) {
@@ -355,6 +356,10 @@ SDL_Quit(void)
#endif
SDL_QuitSubSystem(SDL_INIT_EVERYTHING);
#if !SDL_TIMERS_DISABLED
SDL_TicksQuit();
#endif
SDL_ClearHints();
SDL_AssertionsQuit();
SDL_LogResetPriorities();
+47 -7
View File
@@ -39,7 +39,9 @@ SDL_ConvertMono(SDL_AudioCVT * cvt, SDL_AudioFormat format)
#ifdef DEBUG_CONVERT
fprintf(stderr, "Converting to mono\n");
#endif
switch (format & (SDL_AUDIO_MASK_SIGNED | SDL_AUDIO_MASK_BITSIZE)) {
switch (format & (SDL_AUDIO_MASK_SIGNED |
SDL_AUDIO_MASK_BITSIZE |
SDL_AUDIO_MASK_DATATYPE)) {
case AUDIO_U8:
{
Uint8 *src, *dst;
@@ -331,7 +333,9 @@ SDL_ConvertSurround(SDL_AudioCVT * cvt, SDL_AudioFormat format)
fprintf(stderr, "Converting stereo to surround\n");
#endif
switch (format & (SDL_AUDIO_MASK_SIGNED | SDL_AUDIO_MASK_BITSIZE)) {
switch (format & (SDL_AUDIO_MASK_SIGNED |
SDL_AUDIO_MASK_BITSIZE |
SDL_AUDIO_MASK_DATATYPE)) {
case AUDIO_U8:
{
Uint8 *src, *dst, lf, rf, ce;
@@ -499,8 +503,8 @@ SDL_ConvertSurround(SDL_AudioCVT * cvt, SDL_AudioFormat format)
case AUDIO_S32:
{
Sint32 lf, rf, ce;
const Uint32 *src = (const Uint32 *) cvt->buf + cvt->len_cvt;
Uint32 *dst = (Uint32 *) cvt->buf + cvt->len_cvt * 3;
const Uint32 *src = (const Uint32 *) (cvt->buf + cvt->len_cvt);
Uint32 *dst = (Uint32 *) (cvt->buf + cvt->len_cvt * 3);
if (SDL_AUDIO_ISBIGENDIAN(format)) {
for (i = cvt->len_cvt / 8; i; --i) {
@@ -537,8 +541,8 @@ SDL_ConvertSurround(SDL_AudioCVT * cvt, SDL_AudioFormat format)
case AUDIO_F32:
{
float lf, rf, ce;
const float *src = (const float *) cvt->buf + cvt->len_cvt;
float *dst = (float *) cvt->buf + cvt->len_cvt * 3;
const float *src = (const float *) (cvt->buf + cvt->len_cvt);
float *dst = (float *) (cvt->buf + cvt->len_cvt * 3);
if (SDL_AUDIO_ISBIGENDIAN(format)) {
for (i = cvt->len_cvt / 8; i; --i) {
@@ -588,7 +592,9 @@ SDL_ConvertSurround_4(SDL_AudioCVT * cvt, SDL_AudioFormat format)
fprintf(stderr, "Converting stereo to quad\n");
#endif
switch (format & (SDL_AUDIO_MASK_SIGNED | SDL_AUDIO_MASK_BITSIZE)) {
switch (format & (SDL_AUDIO_MASK_SIGNED |
SDL_AUDIO_MASK_BITSIZE |
SDL_AUDIO_MASK_DATATYPE)) {
case AUDIO_U8:
{
Uint8 *src, *dst, lf, rf, ce;
@@ -762,6 +768,40 @@ SDL_ConvertSurround_4(SDL_AudioCVT * cvt, SDL_AudioFormat format)
}
}
break;
case AUDIO_F32:
{
const float *src = (const float *) (cvt->buf + cvt->len_cvt);
float *dst = (float *) (cvt->buf + cvt->len_cvt * 2);
float lf, rf, ce;
if (SDL_AUDIO_ISBIGENDIAN(format)) {
for (i = cvt->len_cvt / 8; i; --i) {
dst -= 4;
src -= 2;
lf = SDL_SwapFloatBE(src[0]);
rf = SDL_SwapFloatBE(src[1]);
ce = (lf / 2) + (rf / 2);
dst[0] = src[0];
dst[1] = src[1];
dst[2] = SDL_SwapFloatBE(lf - ce);
dst[3] = SDL_SwapFloatBE(rf - ce);
}
} else {
for (i = cvt->len_cvt / 8; i; --i) {
dst -= 4;
src -= 2;
lf = SDL_SwapFloatLE(src[0]);
rf = SDL_SwapFloatLE(src[1]);
ce = (lf / 2) + (rf / 2);
dst[0] = src[0];
dst[1] = src[1];
dst[2] = SDL_SwapFloatLE(lf - ce);
dst[3] = SDL_SwapFloatLE(rf - ce);
}
}
}
break;
}
cvt->len_cvt *= 2;
if (cvt->filters[++cvt->filter_index]) {
+16 -4
View File
@@ -98,7 +98,7 @@ CPU_haveCPUID(void)
);
#elif defined(__GNUC__) && defined(__x86_64__)
/* Technically, if this is being compiled under __x86_64__ then it has
CPUid by definition. But it's nice to be able to prove it. :) */
CPUid by definition. But it's nice to be able to prove it. :) */
__asm__ (
" pushfq # Get original EFLAGS \n"
" popq %%rax \n"
@@ -131,6 +131,8 @@ CPUid by definition. But it's nice to be able to prove it. :) */
mov has_CPUID,1 ; We have CPUID support
done:
}
#elif defined(_MSC_VER) && defined(_M_X64)
has_CPUID = 1;
#elif defined(__sun) && defined(__i386)
__asm (
" pushfl \n"
@@ -191,7 +193,17 @@ done:
__asm mov b, ebx \
__asm mov c, ecx \
__asm mov d, edx \
}
}
#elif defined(_MSC_VER) && defined(_M_X64)
#define cpuid(func, a, b, c, d) \
{ \
int CPUInfo[4]; \
__cpuid(CPUInfo, func); \
a = CPUInfo[0]; \
b = CPUInfo[1]; \
c = CPUInfo[2]; \
d = CPUInfo[3]; \
}
#else
#define cpuid(func, a, b, c, d) \
a = b = c = d = 0
@@ -653,7 +665,7 @@ SDL_GetSystemRAM(void)
#endif
#ifdef HAVE_SYSCTLBYNAME
if (SDL_SystemRAM <= 0) {
#ifdef __FreeBSD__
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
#ifdef HW_REALMEM
int mib[2] = {CTL_HW, HW_REALMEM};
#else
@@ -662,7 +674,7 @@ SDL_GetSystemRAM(void)
#endif /* HW_REALMEM */
#else
int mib[2] = {CTL_HW, HW_MEMSIZE};
#endif /* __FreeBSD__ */
#endif /* __FreeBSD__ || __FreeBSD_kernel__ */
Uint64 memsize = 0;
size_t len = sizeof(memsize);
+14 -3
View File
@@ -503,17 +503,28 @@ SDL_GetEventFilter(SDL_EventFilter * filter, void **userdata)
void
SDL_AddEventWatch(SDL_EventFilter filter, void *userdata)
{
SDL_EventWatcher *watcher;
SDL_EventWatcher *watcher, *tail;
watcher = (SDL_EventWatcher *)SDL_malloc(sizeof(*watcher));
if (!watcher) {
/* Uh oh... */
return;
}
/* create the watcher */
watcher->callback = filter;
watcher->userdata = userdata;
watcher->next = SDL_event_watchers;
SDL_event_watchers = watcher;
watcher->next = NULL;
/* add the watcher to the end of the list */
if (SDL_event_watchers) {
for (tail = SDL_event_watchers; tail->next; tail = tail->next) {
continue;
}
tail->next = watcher;
} else {
SDL_event_watchers = watcher;
}
}
/* FIXME: This is not thread-safe yet */
+1 -6
View File
@@ -418,13 +418,8 @@ int SDL_GestureAddTouch(SDL_TouchID touchId)
SDL_gestureTouch = gestureTouch;
SDL_gestureTouch[SDL_numGestureTouches].numDownFingers = 0;
SDL_zero(SDL_gestureTouch[SDL_numGestureTouches]);
SDL_gestureTouch[SDL_numGestureTouches].id = touchId;
SDL_gestureTouch[SDL_numGestureTouches].numDollarTemplates = 0;
SDL_gestureTouch[SDL_numGestureTouches].recording = SDL_FALSE;
SDL_numGestureTouches++;
return 0;
}
+4 -1
View File
@@ -538,7 +538,10 @@ SDL_SetRelativeMouseMode(SDL_bool enabled)
} else if (enabled && ShouldUseRelativeModeWarp(mouse)) {
mouse->relative_mode_warp = SDL_TRUE;
} else if (mouse->SetRelativeMouseMode(enabled) < 0) {
return -1;
if (enabled) {
// Fall back to warp mode if native relative mode failed
mouse->relative_mode_warp = SDL_TRUE;
}
}
mouse->relative_mode = enabled;
@@ -69,28 +69,70 @@ SDL_GetPrefPath(const char *org, const char *app)
* NULL, &wszPath);
*/
TCHAR path[MAX_PATH];
WCHAR path[MAX_PATH];
char *utf8 = NULL;
char *retval = NULL;
WCHAR* worg = NULL;
WCHAR* wapp = NULL;
size_t new_wpath_len = 0;
BOOL api_result = FALSE;
if (!SUCCEEDED(SHGetFolderPath(NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE, NULL, 0, path))) {
if (!SUCCEEDED(SHGetFolderPathW(NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE, NULL, 0, path))) {
WIN_SetError("Couldn't locate our prefpath");
return NULL;
}
utf8 = WIN_StringToUTF8(path);
if (utf8) {
const size_t len = SDL_strlen(utf8) + SDL_strlen(org) + SDL_strlen(app) + 4;
retval = (char *) SDL_malloc(len);
if (!retval) {
SDL_free(utf8);
SDL_OutOfMemory();
worg = WIN_UTF8ToString(org);
if (worg == NULL) {
SDL_OutOfMemory();
return NULL;
}
wapp = WIN_UTF8ToString(app);
if (wapp == NULL) {
SDL_free(worg);
SDL_OutOfMemory();
return NULL;
}
new_wpath_len = lstrlenW(worg) + lstrlenW(wapp) + lstrlenW(path) + 3;
if ((new_wpath_len + 1) > MAX_PATH) {
SDL_free(worg);
SDL_free(wapp);
WIN_SetError("Path too long.");
return NULL;
}
lstrcatW(path, L"\\");
lstrcatW(path, worg);
SDL_free(worg);
api_result = CreateDirectoryW(path, NULL);
if (api_result == FALSE) {
if (GetLastError() != ERROR_ALREADY_EXISTS) {
SDL_free(wapp);
WIN_SetError("Couldn't create a prefpath.");
return NULL;
}
SDL_snprintf(retval, len, "%s\\%s\\%s\\", utf8, org, app);
SDL_free(utf8);
}
lstrcatW(path, L"\\");
lstrcatW(path, wapp);
SDL_free(wapp);
api_result = CreateDirectoryW(path, NULL);
if (api_result == FALSE) {
if (GetLastError() != ERROR_ALREADY_EXISTS) {
WIN_SetError("Couldn't create a prefpath.");
return NULL;
}
}
lstrcatW(path, L"\\");
retval = WIN_StringToUTF8(path);
return retval;
}
+2 -3
View File
@@ -156,7 +156,7 @@ SDL_SYS_HapticInit(void)
io_service_t device;
if (numhaptics != -1) {
return SDL_Error("Haptic subsystem already initialized!");
return SDL_SetError("Haptic subsystem already initialized!");
}
numhaptics = 0;
@@ -237,7 +237,7 @@ MacHaptic_MaybeAddDevice( io_object_t device )
}
}
item = (SDL_hapticlist_item *)SDL_malloc( sizeof(SDL_hapticlist_item));
item = (SDL_hapticlist_item *)SDL_calloc(1, sizeof(SDL_hapticlist_item));
if (item == NULL) {
return SDL_SetError("Could not allocate haptic storage");
}
@@ -248,7 +248,6 @@ MacHaptic_MaybeAddDevice( io_object_t device )
/* Set basic device data. */
HIDGetDeviceProduct(device, item->name);
item->dev = device;
item->haptic = NULL;
/* Set usage pages. */
hidProperties = 0;
+2 -2
View File
@@ -282,11 +282,11 @@ MaybeAddDevice(const char *path)
return -1;
}
item = (SDL_hapticlist_item *) SDL_malloc(sizeof (SDL_hapticlist_item));
item = (SDL_hapticlist_item *) SDL_calloc(1, sizeof (SDL_hapticlist_item));
if (item == NULL) {
return -1;
}
SDL_zerop(item);
item->fname = SDL_strdup(path);
if ( (item->fname == NULL) ) {
SDL_free(item->fname);
+16 -6
View File
@@ -253,13 +253,11 @@ DirectInputHaptic_MaybeAddDevice(const DIDEVICEINSTANCE * pdidInstance)
return -1; /* not a device we can use. */
}
item = (SDL_hapticlist_item *)SDL_malloc( sizeof(SDL_hapticlist_item));
item = (SDL_hapticlist_item *)SDL_calloc(1, sizeof(SDL_hapticlist_item));
if (item == NULL) {
return SDL_OutOfMemory();
}
SDL_zerop(item);
item->name = WIN_StringToUTF8(pdidInstance->tszProductName);
if (!item->name) {
SDL_free(item);
@@ -941,20 +939,32 @@ SDL_SYS_HapticQuit(void)
{
SDL_hapticlist_item *item;
SDL_hapticlist_item *next = NULL;
SDL_Haptic *hapticitem = NULL;
if (loaded_xinput) {
WIN_UnloadXInputDLL();
loaded_xinput = SDL_FALSE;
extern SDL_Haptic *SDL_haptics;
for (hapticitem = SDL_haptics; hapticitem; hapticitem = hapticitem->next) {
if ((hapticitem->hwdata->bXInputHaptic) && (hapticitem->hwdata->thread)) {
/* we _have_ to stop the thread before we free the XInput DLL! */
hapticitem->hwdata->stopThread = 1;
SDL_WaitThread(hapticitem->hwdata->thread, NULL);
hapticitem->hwdata->thread = NULL;
}
}
for (item = SDL_hapticlist; item; item = next) {
/* Opened and not closed haptics are leaked, this is on purpose.
* Close your haptic devices after usage. */
/* !!! FIXME: (...is leaking on purpose a good idea?) */
next = item->next;
SDL_free(item->name);
SDL_free(item);
}
if (loaded_xinput) {
WIN_UnloadXInputDLL();
loaded_xinput = SDL_FALSE;
}
if (dinput != NULL) {
IDirectInput8_Release(dinput);
dinput = NULL;
@@ -835,6 +835,7 @@ SDL_GameControllerLoadHints()
char *pUserMappings = SDL_malloc( nchHints + 1 );
char *pTempMappings = pUserMappings;
SDL_memcpy( pUserMappings, hint, nchHints );
pUserMappings[nchHints] = '\0';
while ( pUserMappings ) {
char *pchNewLine = NULL;
@@ -1223,6 +1224,7 @@ SDL_GameControllerQuit(void)
pControllerMap = s_pSupportedControllers;
s_pSupportedControllers = s_pSupportedControllers->next;
SDL_free( pControllerMap->name );
SDL_free( pControllerMap->mapping );
SDL_free( pControllerMap );
}
@@ -49,7 +49,7 @@ static const char *s_ControllerMappings [] =
"6d040000000000001fc2000000000000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,",
"6d0400000000000019c2000000000000,Logitech Wireless Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,", /* This includes F710 in DInput mode and the "Logitech Cordless RumblePad 2", at the very least. */
"4c050000000000006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,",
"4c05000000000000c405000000000000,PS4 Controller,x:b0,a:b1,b:b2,y:b3,back:b8,guide:b12,start:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,lefttrigger:a3,rightshoulder:b5,righttrigger:a4,leftstick:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a5,"
"4c05000000000000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
"5e040000000000008e02000000000000,X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,",
#elif defined(__LINUX__)
"0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
@@ -59,6 +59,7 @@ static const char *s_ControllerMappings [] =
"030000006d0400001ec2000020200000,Logitech F510 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
"030000006d04000019c2000011010000,Logitech F710 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,", /* Guide button doesn't seem to be sent in DInput mode. */
"030000006d0400001fc2000005030000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
"050000003620000100000002010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,platform:Linux,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,",
"030000004c0500006802000011010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,",
"030000004c050000c405000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
"03000000de280000ff11000001000000,Valve Streaming Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
@@ -379,11 +379,11 @@ Android_RemoveJoystick(int device_id)
int
SDL_SYS_JoystickInit(void)
{
const char *env;
const char *hint;
SDL_SYS_JoystickDetect();
env = SDL_GetHint(SDL_HINT_ACCEL_AS_JOY);
if (!env || SDL_atoi(env)) {
hint = SDL_GetHint(SDL_HINT_ACCELEROMETER_AS_JOYSTICK);
if (!hint || SDL_atoi(hint)) {
/* Default behavior, accelerometer as joystick */
Android_AddJoystick(ANDROID_ACCELEROMETER_DEVICE_ID, ANDROID_ACCELEROMETER_NAME, SDL_TRUE, 0, 3, 0, 0);
}
File diff suppressed because it is too large Load Diff
@@ -22,34 +22,19 @@
#ifndef SDL_JOYSTICK_IOKIT_H
#include <IOKit/hid/IOHIDLib.h>
#include <IOKit/hid/IOHIDKeys.h>
#include <IOKit/IOKitLib.h>
struct recElement
{
IOHIDElementCookie cookie; /* unique value which identifies element, will NOT change */
long usagePage, usage; /* HID usage */
long min; /* reported min value possible */
long max; /* reported max value possible */
#if 0
/* TODO: maybe should handle the following stuff somehow? */
long scaledMin; /* reported scaled min value possible */
long scaledMax; /* reported scaled max value possible */
long size; /* size in bits of data return from element */
Boolean relative; /* are reports relative to last report (deltas) */
Boolean wrapping; /* does element wrap around (one value higher than max is min) */
Boolean nonLinear; /* are the values reported non-linear relative to element movement */
Boolean preferredState; /* does element have a preferred state (such as a button) */
Boolean nullState; /* does element have null state */
#endif /* 0 */
IOHIDElementRef elementRef;
IOHIDElementCookie cookie;
uint32_t usagePage, usage; /* HID usage */
SInt32 min; /* reported min value possible */
SInt32 max; /* reported max value possible */
/* runtime variables used for auto-calibration */
long minReport; /* min returned value */
long maxReport; /* max returned value */
SInt32 minReport; /* min returned value */
SInt32 maxReport; /* max returned value */
struct recElement *pNext; /* next element in list */
};
@@ -57,19 +42,17 @@ typedef struct recElement recElement;
struct joystick_hwdata
{
IOHIDDeviceRef deviceRef; /* HIDManager device handle */
io_service_t ffservice; /* Interface for force feedback, 0 = no ff */
IOHIDDeviceInterface **interface; /* interface to device, NULL = no interface */
IONotificationPortRef notificationPort; /* port to be notified on joystick removal */
io_iterator_t portIterator; /* iterator for removal callback */
char product[256]; /* name of product */
long usage; /* usage page from IOUSBHID Parser.h which defines general usage */
long usagePage; /* usage within above page from IOUSBHID Parser.h which defines specific usage */
uint32_t usage; /* usage page from IOUSBHID Parser.h which defines general usage */
uint32_t usagePage; /* usage within above page from IOUSBHID Parser.h which defines specific usage */
long axes; /* number of axis (calculated, not reported by device) */
long buttons; /* number of buttons (calculated, not reported by device) */
long hats; /* number of hat switches (calculated, not reported by device) */
long elements; /* number of total elements (should be total of above) (calculated, not reported by device) */
int axes; /* number of axis (calculated, not reported by device) */
int buttons; /* number of buttons (calculated, not reported by device) */
int hats; /* number of hat switches (calculated, not reported by device) */
int elements; /* number of total elements (should be total of above) (calculated, not reported by device) */
recElement *firstAxis;
recElement *firstButton;
@@ -782,7 +782,7 @@ EnumXInputDevices(JoyStick_DeviceData **pContext)
XINPUT_CAPABILITIES capabilities;
if (XINPUTGETCAPABILITIES(userid, XINPUT_FLAG_GAMEPAD, &capabilities) == ERROR_SUCCESS) {
/* Current version of XInput mistakenly returns 0 as the Type. Ignore it and ensure the subtype is a gamepad. */
/* !!! FIXME: we might want to support steering wheels or guitars or whatever laster. */
/* !!! FIXME: we might want to support steering wheels or guitars or whatever later. */
if (capabilities.SubType == XINPUT_DEVSUBTYPE_GAMEPAD) {
AddXInputDevice(userid, pContext);
}
@@ -1448,6 +1448,7 @@ SDL_SYS_JoystickUpdate_XInput(SDL_Joystick * joystick)
XINPUT_STATE_EX *pXInputState = &joystick->hwdata->XInputState[joystick->hwdata->currentXInputSlot];
XINPUT_STATE_EX *pXInputStatePrev = &joystick->hwdata->XInputState[joystick->hwdata->currentXInputSlot ^ 1];
/* !!! FIXME: why isn't this just using SDL_PrivateJoystickAxis_Int()? */
SDL_PrivateJoystickAxis( joystick, 0, (Sint16)pXInputState->Gamepad.sThumbLX );
SDL_PrivateJoystickAxis( joystick, 1, (Sint16)(-SDL_max(-32767, pXInputState->Gamepad.sThumbLY)) );
SDL_PrivateJoystickAxis( joystick, 2, (Sint16)pXInputState->Gamepad.sThumbRX );
@@ -1455,6 +1456,7 @@ SDL_SYS_JoystickUpdate_XInput(SDL_Joystick * joystick)
SDL_PrivateJoystickAxis( joystick, 4, (Sint16)(((int)pXInputState->Gamepad.bLeftTrigger*65535/255) - 32768));
SDL_PrivateJoystickAxis( joystick, 5, (Sint16)(((int)pXInputState->Gamepad.bRightTrigger*65535/255) - 32768));
/* !!! FIXME: why isn't this just using SDL_PrivateJoystickButton_Int(), instead of keeping these two alternating state buffers? */
if ( ButtonChanged( pXInputState->Gamepad.wButtons, pXInputStatePrev->Gamepad.wButtons, XINPUT_GAMEPAD_DPAD_UP ) )
SDL_PrivateJoystickButton(joystick, 0, pXInputState->Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP ? SDL_PRESSED : SDL_RELEASED );
if ( ButtonChanged( pXInputState->Gamepad.wButtons, pXInputStatePrev->Gamepad.wButtons, XINPUT_GAMEPAD_DPAD_DOWN ) )
@@ -1522,6 +1524,7 @@ TranslatePOV(DWORD value)
/* SDL_PrivateJoystick* doesn't discard duplicate events, so we need to
* do it. */
/* !!! FIXME: SDL_PrivateJoystickAxis _does_ discard duplicate events now. Ditch this code. */
static int
SDL_PrivateJoystickAxis_Int(SDL_Joystick * joystick, Uint8 axis, Sint16 value)
{
+2 -2
View File
@@ -87,8 +87,8 @@ SDL_GetPowerInfo_UIKit(SDL_PowerState * state, int *seconds, int *percent)
}
const float level = [uidev batteryLevel];
*percent = ( (level < 0.0f) ? -1 : (((int) (level + 0.5f)) * 100) );
return SDL_TRUE; /* always the definitive answer on iPhoneOS. */
*percent = ( (level < 0.0f) ? -1 : ((int) ((level * 100) + 0.5f)) );
return SDL_TRUE; /* always the definitive answer on iOS. */
}
#endif /* SDL_POWER_UIKIT */
+3 -1
View File
@@ -1876,7 +1876,9 @@ int SDL_GL_UnbindTexture(SDL_Texture *texture)
CHECK_TEXTURE_MAGIC(texture, -1);
renderer = texture->renderer;
if (renderer && renderer->GL_UnbindTexture) {
if (texture->native) {
return SDL_GL_UnbindTexture(texture->native);
} else if (renderer && renderer->GL_UnbindTexture) {
return renderer->GL_UnbindTexture(renderer, texture);
}
+21 -3
View File
@@ -217,6 +217,7 @@ static int D3D_UpdateTextureYUV(SDL_Renderer * renderer, SDL_Texture * texture,
static int D3D_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * rect, void **pixels, int *pitch);
static void D3D_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture);
static int D3D_SetRenderTargetInternal(SDL_Renderer * renderer, SDL_Texture * texture);
static int D3D_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture);
static int D3D_UpdateViewport(SDL_Renderer * renderer);
static int D3D_UpdateClipRect(SDL_Renderer * renderer);
@@ -481,6 +482,10 @@ D3D_Reset(SDL_Renderer * renderer)
IDirect3DSurface9_Release(data->defaultRenderTarget);
data->defaultRenderTarget = NULL;
}
if (data->currentRenderTarget != NULL) {
IDirect3DSurface9_Release(data->currentRenderTarget);
data->currentRenderTarget = NULL;
}
/* Release application render targets */
for (texture = renderer->textures; texture; texture = texture->next) {
@@ -508,6 +513,7 @@ D3D_Reset(SDL_Renderer * renderer)
IDirect3DDevice9_GetRenderTarget(data->device, 0, &data->defaultRenderTarget);
D3D_InitRenderState(data);
D3D_SetRenderTargetInternal(renderer, renderer->target);
D3D_UpdateViewport(renderer);
/* Let the application know that render targets were reset */
@@ -1003,6 +1009,12 @@ D3D_UpdateTextureInternal(IDirect3DTexture9 *texture, Uint32 format, SDL_bool fu
if (length == pitch && length == locked.Pitch) {
SDL_memcpy(dst, src, length*h);
} else {
if (length > pitch) {
length = pitch;
}
if (length > locked.Pitch) {
length = locked.Pitch;
}
for (row = 0; row < h; ++row) {
SDL_memcpy(dst, src, length);
src += pitch;
@@ -1155,14 +1167,12 @@ D3D_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture)
}
static int
D3D_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture)
D3D_SetRenderTargetInternal(SDL_Renderer * renderer, SDL_Texture * texture)
{
D3D_RenderData *data = (D3D_RenderData *) renderer->driverdata;
D3D_TextureData *texturedata;
HRESULT result;
D3D_ActivateRenderer(renderer);
/* Release the previous render target if it wasn't the default one */
if (data->currentRenderTarget != NULL) {
IDirect3DSurface9_Release(data->currentRenderTarget);
@@ -1192,6 +1202,14 @@ D3D_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture)
return 0;
}
static int
D3D_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture)
{
D3D_ActivateRenderer(renderer);
return D3D_SetRenderTargetInternal(renderer, texture);
}
static int
D3D_UpdateViewport(SDL_Renderer * renderer)
{
+21 -1
View File
@@ -32,6 +32,12 @@
#include <OpenGL/OpenGL.h>
#endif
/* To prevent unnecessary window recreation,
* these should match the defaults selected in SDL_GL_ResetAttributes
*/
#define RENDERER_CONTEXT_MAJOR 2
#define RENDERER_CONTEXT_MINOR 1
/* OpenGL renderer implementation */
@@ -381,11 +387,25 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags)
const char *hint;
GLint value;
Uint32 window_flags;
int profile_mask, major, minor;
SDL_GL_GetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, &profile_mask);
SDL_GL_GetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, &major);
SDL_GL_GetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, &minor);
window_flags = SDL_GetWindowFlags(window);
if (!(window_flags & SDL_WINDOW_OPENGL)) {
if (!(window_flags & SDL_WINDOW_OPENGL) ||
profile_mask == SDL_GL_CONTEXT_PROFILE_ES || major != RENDERER_CONTEXT_MAJOR || minor != RENDERER_CONTEXT_MINOR) {
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, 0);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, RENDERER_CONTEXT_MAJOR);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, RENDERER_CONTEXT_MINOR);
if (SDL_RecreateWindow(window, window_flags | SDL_WINDOW_OPENGL) < 0) {
/* Uh oh, better try to put it back... */
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, profile_mask);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, major);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, minor);
SDL_RecreateWindow(window, window_flags);
return NULL;
}
@@ -26,6 +26,13 @@
#include "SDL_opengles.h"
#include "../SDL_sysrender.h"
/* To prevent unnecessary window recreation,
* these should match the defaults selected in SDL_GL_ResetAttributes
*/
#define RENDERER_CONTEXT_MAJOR 1
#define RENDERER_CONTEXT_MINOR 1
#if defined(SDL_VIDEO_DRIVER_PANDORA)
/* Empty function stub to get OpenGL ES 1.x support without */
@@ -279,15 +286,25 @@ GLES_CreateRenderer(SDL_Window * window, Uint32 flags)
GLES_RenderData *data;
GLint value;
Uint32 windowFlags;
int profile_mask, major, minor;
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 1);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
SDL_GL_GetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, &profile_mask);
SDL_GL_GetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, &major);
SDL_GL_GetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, &minor);
windowFlags = SDL_GetWindowFlags(window);
if (!(windowFlags & SDL_WINDOW_OPENGL)) {
if (!(windowFlags & SDL_WINDOW_OPENGL) ||
profile_mask != SDL_GL_CONTEXT_PROFILE_ES || major != RENDERER_CONTEXT_MAJOR || minor != RENDERER_CONTEXT_MINOR) {
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, RENDERER_CONTEXT_MAJOR);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, RENDERER_CONTEXT_MINOR);
if (SDL_RecreateWindow(window, windowFlags | SDL_WINDOW_OPENGL) < 0) {
/* Uh oh, better try to put it back... */
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, profile_mask);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, major);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, minor);
SDL_RecreateWindow(window, windowFlags);
return NULL;
}
@@ -28,6 +28,12 @@
#include "../../video/SDL_blit.h"
#include "SDL_shaders_gles2.h"
/* To prevent unnecessary window recreation,
* these should match the defaults selected in SDL_GL_ResetAttributes
*/
#define RENDERER_CONTEXT_MAJOR 2
#define RENDERER_CONTEXT_MINOR 0
/* Used to re-create the window with OpenGL ES capability */
extern int SDL_RecreateWindow(SDL_Window * window, Uint32 flags);
@@ -1740,15 +1746,25 @@ GLES2_CreateRenderer(SDL_Window *window, Uint32 flags)
Uint32 windowFlags;
GLint window_framebuffer;
GLint value;
int profile_mask, major, minor;
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
SDL_GL_GetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, &profile_mask);
SDL_GL_GetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, &major);
SDL_GL_GetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, &minor);
windowFlags = SDL_GetWindowFlags(window);
if (!(windowFlags & SDL_WINDOW_OPENGL)) {
if (!(windowFlags & SDL_WINDOW_OPENGL) ||
profile_mask != SDL_GL_CONTEXT_PROFILE_ES || major != RENDERER_CONTEXT_MAJOR || minor != RENDERER_CONTEXT_MINOR) {
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, RENDERER_CONTEXT_MAJOR);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, RENDERER_CONTEXT_MINOR);
if (SDL_RecreateWindow(window, windowFlags | SDL_WINDOW_OPENGL) < 0) {
/* Uh oh, better try to put it back... */
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, profile_mask);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, major);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, minor);
SDL_RecreateWindow(window, windowFlags);
return NULL;
}
-6
View File
@@ -278,12 +278,6 @@ void * memcpy ( void * destination, const void * source, size_t num )
#ifdef _M_IX86
void
__declspec(naked)
_chkstk()
{
}
/* Float to long */
void
__declspec(naked)
+1
View File
@@ -1542,6 +1542,7 @@ SDLTest_CommonQuit(SDLTest_CommonState * state)
SDL_AudioQuit();
}
SDL_free(state);
SDL_Quit();
}
/* vi: set ts=4 sw=4 expandtab: */
+2 -1
View File
@@ -26,7 +26,8 @@
#define ROUND_RESOLUTION(X) \
(((X+TIMER_RESOLUTION-1)/TIMER_RESOLUTION)*TIMER_RESOLUTION)
extern void SDL_InitTicks(void);
extern void SDL_TicksInit(void);
extern void SDL_TicksQuit(void);
extern int SDL_TimerInit(void);
extern void SDL_TimerQuit(void);
+8 -2
View File
@@ -27,7 +27,7 @@
static SDL_bool ticks_started = SDL_FALSE;
void
SDL_InitTicks(void)
SDL_TicksInit(void)
{
if (ticks_started) {
return;
@@ -35,11 +35,17 @@ SDL_InitTicks(void)
ticks_started = SDL_TRUE;
}
void
SDL_TicksQuit(void)
{
ticks_started = SDL_FALSE;
}
Uint32
SDL_GetTicks(void)
{
if (!ticks_started) {
SDL_InitTicks();
SDL_TicksInit();
}
SDL_Unsupported();
+8 -2
View File
@@ -30,7 +30,7 @@ static bigtime_t start;
static SDL_bool ticks_started = SDL_FALSE;
void
SDL_InitTicks(void)
SDL_TicksInit(void)
{
if (ticks_started) {
return;
@@ -41,11 +41,17 @@ SDL_InitTicks(void)
start = system_time();
}
void
SDL_TicksQuit(void)
{
ticks_started = SDL_FALSE;
}
Uint32
SDL_GetTicks(void)
{
if (!ticks_started) {
SDL_InitTicks();
SDL_TicksInit();
}
return ((system_time() - start) / 1000);
+9 -2
View File
@@ -31,7 +31,8 @@
static struct timeval start;
static SDL_bool ticks_started = SDL_FALSE;
void SDL_InitTicks(void)
void
SDL_TicksInit(void)
{
if (ticks_started) {
return;
@@ -41,10 +42,16 @@ void SDL_InitTicks(void)
gettimeofday(&start, NULL);
}
void
SDL_TicksQuit(void)
{
ticks_started = SDL_FALSE;
}
Uint32 SDL_GetTicks(void)
{
if (!ticks_started) {
SDL_InitTicks();
SDL_TicksInit();
}
struct timeval now;
+10 -4
View File
@@ -59,7 +59,7 @@ static struct timeval start_tv;
static SDL_bool ticks_started = SDL_FALSE;
void
SDL_InitTicks(void)
SDL_TicksInit(void)
{
if (ticks_started) {
return;
@@ -83,12 +83,18 @@ SDL_InitTicks(void)
}
}
void
SDL_TicksQuit(void)
{
ticks_started = SDL_FALSE;
}
Uint32
SDL_GetTicks(void)
{
Uint32 ticks;
if (!ticks_started) {
SDL_InitTicks();
SDL_TicksInit();
}
if (has_monotonic_time) {
@@ -117,7 +123,7 @@ SDL_GetPerformanceCounter(void)
{
Uint64 ticks;
if (!ticks_started) {
SDL_InitTicks();
SDL_TicksInit();
}
if (has_monotonic_time) {
@@ -146,7 +152,7 @@ Uint64
SDL_GetPerformanceFrequency(void)
{
if (!ticks_started) {
SDL_InitTicks();
SDL_TicksInit();
}
if (has_monotonic_time) {
+22 -6
View File
@@ -40,7 +40,6 @@ static BOOL hires_timer_available;
static LARGE_INTEGER hires_start_ticks;
/* The number of ticks per second of the high-resolution performance counter */
static LARGE_INTEGER hires_ticks_per_second;
#endif
static void
timeSetPeriod(UINT uPeriod)
@@ -76,13 +75,15 @@ SDL_TimerResolutionChanged(void *userdata, const char *name, const char *oldValu
}
}
#endif /* !USE_GETTICKCOUNT */
void
SDL_InitTicks(void)
SDL_TicksInit(void)
{
if (ticks_started) {
return;
}
ticks_started = TRUE;
ticks_started = SDL_TRUE;
/* Set first ticks value */
#ifdef USE_GETTICKCOUNT
@@ -98,11 +99,26 @@ SDL_InitTicks(void)
hires_timer_available = FALSE;
timeSetPeriod(1); /* use 1 ms timer precision */
start = timeGetTime();
SDL_AddHintCallback(SDL_HINT_TIMER_RESOLUTION,
SDL_TimerResolutionChanged, NULL);
}
#endif
}
void
SDL_TicksQuit(void)
{
#ifndef USE_GETTICKCOUNT
if (!hires_timer_available) {
SDL_DelHintCallback(SDL_HINT_TIMER_RESOLUTION,
SDL_TimerResolutionChanged, NULL);
timeSetPeriod(0);
}
#endif
SDL_AddHintCallback(SDL_HINT_TIMER_RESOLUTION,
SDL_TimerResolutionChanged, NULL);
ticks_started = SDL_FALSE;
}
Uint32
@@ -114,7 +130,7 @@ SDL_GetTicks(void)
#endif
if (!ticks_started) {
SDL_InitTicks();
SDL_TicksInit();
}
#ifdef USE_GETTICKCOUNT
+19 -1
View File
@@ -421,8 +421,10 @@ int
SDL_VideoInit(const char *driver_name)
{
SDL_VideoDevice *video;
const char *hint;
int index;
int i;
SDL_bool allow_screensaver;
/* Check to make sure we don't overwrite '_this' */
if (_this != NULL) {
@@ -430,7 +432,7 @@ SDL_VideoInit(const char *driver_name)
}
#if !SDL_TIMERS_DISABLED
SDL_InitTicks();
SDL_TicksInit();
#endif
/* Start the event loop */
@@ -504,6 +506,22 @@ SDL_VideoInit(const char *driver_name)
_this->DestroyWindowFramebuffer = SDL_DestroyWindowTexture;
}
/* Disable the screen saver by default. This is a change from <= 2.0.1,
but most things using SDL are games or media players; you wouldn't
want a screensaver to trigger if you're playing exclusively with a
joystick, or passively watching a movie. Things that use SDL but
function more like a normal desktop app should explicitly reenable the
screensaver. */
hint = SDL_GetHint(SDL_HINT_VIDEO_ALLOW_SCREENSAVER);
if (hint) {
allow_screensaver = SDL_atoi(hint) ? SDL_TRUE : SDL_FALSE;
} else {
allow_screensaver = SDL_FALSE;
}
if (!allow_screensaver) {
SDL_DisableScreenSaver();
}
/* If we don't use a screen keyboard, turn on text input by default,
otherwise programs that expect to get text events without enabling
UNICODE input won't get any events.
+25 -13
View File
@@ -36,6 +36,22 @@
#define UsrActivity 1
#endif
@interface SDLApplication : NSApplication
- (void)terminate:(id)sender;
@end
@implementation SDLApplication
// Override terminate to handle Quit and System Shutdown smoothly.
- (void)terminate:(id)sender
{
SDL_SendQuit();
}
@end // SDLApplication
/* setAppleMenu disappeared from the headers in 10.4 */
@interface NSApplication(NSAppleMenu)
- (void)setAppleMenu:(NSMenu *)menu;
@@ -71,12 +87,6 @@
[super dealloc];
}
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
{
SDL_SendQuit();
return NSTerminateCancel;
}
- (void)focusSomeWindow:(NSNotification *)aNotification
{
/* HACK: Ignore the first call. The application gets a
@@ -125,13 +135,12 @@ static SDLAppDelegate *appDelegate = nil;
static NSString *
GetApplicationName(void)
{
NSDictionary *dict;
NSString *appName = 0;
NSString *appName;
/* Determine the application name */
dict = (NSDictionary *)CFBundleGetInfoDictionary(CFBundleGetMainBundle());
if (dict)
appName = [dict objectForKey: @"CFBundleName"];
appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"];
if (!appName)
appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"];
if (![appName length])
appName = [[NSProcessInfo processInfo] processName];
@@ -256,13 +265,16 @@ Cocoa_RegisterApp(void)
pool = [[NSAutoreleasePool alloc] init];
if (NSApp == nil) {
[NSApplication sharedApplication];
[SDLApplication sharedApplication];
if ([NSApp mainMenu] == nil) {
CreateApplicationMenus();
}
[NSApp finishLaunching];
NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:@"NO" forKey:@"AppleMomentumScrollSupported"];
NSDictionary *appDefaults = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithBool:NO], @"AppleMomentumScrollSupported",
[NSNumber numberWithBool:NO], @"ApplePressAndHoldEnabled",
nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
}
+9 -2
View File
@@ -28,11 +28,18 @@
extern void Cocoa_InitMouse(_THIS);
extern void Cocoa_HandleMouseEvent(_THIS, NSEvent * event);
extern void Cocoa_HandleMouseWheel(SDL_Window *window, NSEvent * event);
extern void Cocoa_HandleMouseWarp(CGFloat x, CGFloat y);
extern void Cocoa_QuitMouse(_THIS);
typedef struct {
int deltaXOffset;
int deltaYOffset;
/* Wether we've seen a cursor warp since the last move event. */
SDL_bool seenWarp;
/* What location our last cursor warp was to. */
CGFloat lastWarpX;
CGFloat lastWarpY;
/* What location we last saw the cursor move to. */
CGFloat lastMoveX;
CGFloat lastMoveY;
void *tapdata;
} SDL_MouseData;
+103 -21
View File
@@ -29,6 +29,14 @@
#include "../../events/SDL_mouse_c.h"
/* #define DEBUG_COCOAMOUSE */
#ifdef DEBUG_COCOAMOUSE
#define DLog(fmt, ...) printf("%s: " fmt "\n", __func__, ##__VA_ARGS__)
#else
#define DLog(...) do { } while (0)
#endif
@implementation NSCursor (InvisibleCursor)
+ (NSCursor *)invisibleCursor
{
@@ -203,18 +211,19 @@ Cocoa_ShowCursor(SDL_Cursor * cursor)
static void
Cocoa_WarpMouse(SDL_Window * window, int x, int y)
{
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
if ([data->listener isMoving])
{
DLog("Postponing warp, window being moved.");
[data->listener setPendingMoveX:x
Y:y];
return;
}
SDL_Mouse *mouse = SDL_GetMouse();
CGPoint point = CGPointMake(x + (float)window->x, y + (float)window->y);
{
/* This makes Cocoa_HandleMouseEvent ignore this delta in the next
* movement event.
*/
SDL_MouseData *driverdata = (SDL_MouseData*)mouse->driverdata;
NSPoint location = [NSEvent mouseLocation];
driverdata->deltaXOffset = location.x - point.x;
driverdata->deltaYOffset = point.y - location.y;
}
Cocoa_HandleMouseWarp(point.x, point.y);
/* According to the docs, this was deprecated in 10.6, but it's still
* around. The substitute requires a CGEventSource, but I'm not entirely
@@ -235,11 +244,28 @@ Cocoa_WarpMouse(SDL_Window * window, int x, int y)
static int
Cocoa_SetRelativeMouseMode(SDL_bool enabled)
{
CGError result;
/* We will re-apply the relative mode when the window gets focus, if it
* doesn't have focus right now.
*/
SDL_Window *window = SDL_GetMouseFocus();
if (!window) {
return 0;
}
/* We will re-apply the relative mode when the window finishes being moved,
* if it is being moved right now.
*/
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
if ([data->listener isMoving]) {
return 0;
}
CGError result;
if (enabled) {
DLog("Turning on.");
result = CGAssociateMouseAndMouseCursorPosition(NO);
} else {
DLog("Turning off.");
result = CGAssociateMouseAndMouseCursorPosition(YES);
}
if (result != kCGErrorSuccess) {
@@ -265,25 +291,67 @@ Cocoa_InitMouse(_THIS)
SDL_SetDefaultCursor(Cocoa_CreateDefaultCursor());
Cocoa_InitMouseEventTap(mouse->driverdata);
SDL_MouseData *driverdata = (SDL_MouseData*)mouse->driverdata;
const NSPoint location = [NSEvent mouseLocation];
driverdata->lastMoveX = location.x;
driverdata->lastMoveY = location.y;
}
void
Cocoa_HandleMouseEvent(_THIS, NSEvent *event)
{
switch ([event type])
{
case NSMouseMoved:
case NSLeftMouseDragged:
case NSRightMouseDragged:
case NSOtherMouseDragged:
break;
default:
/* Ignore any other events. */
return;
}
SDL_Mouse *mouse = SDL_GetMouse();
if (mouse->relative_mode &&
([event type] == NSMouseMoved ||
[event type] == NSLeftMouseDragged ||
[event type] == NSRightMouseDragged ||
[event type] == NSOtherMouseDragged)) {
SDL_MouseData *driverdata = (SDL_MouseData*)mouse->driverdata;
float x = [event deltaX] + driverdata->deltaXOffset;
float y = [event deltaY] + driverdata->deltaYOffset;
driverdata->deltaXOffset = driverdata->deltaYOffset = 0;
SDL_MouseData *driverdata = (SDL_MouseData*)mouse->driverdata;
const SDL_bool seenWarp = driverdata->seenWarp;
driverdata->seenWarp = NO;
SDL_SendMouseMotion(mouse->focus, mouse->mouseID, 1, (int)x, (int)y);
const NSPoint location = [NSEvent mouseLocation];
const CGFloat lastMoveX = driverdata->lastMoveX;
const CGFloat lastMoveY = driverdata->lastMoveY;
driverdata->lastMoveX = location.x;
driverdata->lastMoveY = location.y;
DLog("Last seen mouse: (%g, %g)", location.x, location.y);
/* Non-relative movement is handled in -[Cocoa_WindowListener mouseMoved:] */
if (!mouse->relative_mode) {
return;
}
/* Ignore events that aren't inside the client area (i.e. title bar.) */
if ([event window]) {
NSRect windowRect = [[[event window] contentView] frame];
if (!NSPointInRect([event locationInWindow], windowRect)) {
return;
}
}
float deltaX = [event deltaX];
float deltaY = [event deltaY];
if (seenWarp)
{
deltaX += (lastMoveX - driverdata->lastWarpX);
deltaY += ((CGDisplayPixelsHigh(kCGDirectMainDisplay) - lastMoveY) - driverdata->lastWarpY);
DLog("Motion was (%g, %g), offset to (%g, %g)", [event deltaX], [event deltaY], deltaX, deltaY);
}
SDL_SendMouseMotion(mouse->focus, mouse->mouseID, 1, (int)deltaX, (int)deltaY);
}
void
@@ -291,7 +359,7 @@ Cocoa_HandleMouseWheel(SDL_Window *window, NSEvent *event)
{
SDL_Mouse *mouse = SDL_GetMouse();
float x = [event deltaX];
float x = -[event deltaX];
float y = [event deltaY];
if (x > 0) {
@@ -307,6 +375,20 @@ Cocoa_HandleMouseWheel(SDL_Window *window, NSEvent *event)
SDL_SendMouseWheel(window, mouse->mouseID, (int)x, (int)y);
}
void
Cocoa_HandleMouseWarp(CGFloat x, CGFloat y)
{
/* This makes Cocoa_HandleMouseEvent ignore the delta caused by the warp,
* since it gets included in the next movement event.
*/
SDL_MouseData *driverdata = (SDL_MouseData*)SDL_GetMouse()->driverdata;
driverdata->lastWarpX = x;
driverdata->lastWarpY = y;
driverdata->seenWarp = SDL_TRUE;
DLog("(%g, %g)", x, y);
}
void
Cocoa_QuitMouse(_THIS)
{
+56 -29
View File
@@ -35,17 +35,14 @@
#define DEFAULT_OPENGL "/System/Library/Frameworks/OpenGL.framework/Libraries/libGL.dylib"
#ifndef kCGLPFAOpenGLProfile
#define kCGLPFAOpenGLProfile 99
#ifndef NSOpenGLPFAOpenGLProfile
#define NSOpenGLPFAOpenGLProfile 99
#endif
#ifndef kCGLOGLPVersion_Legacy
#define kCGLOGLPVersion_Legacy 0x1000
#ifndef NSOpenGLProfileVersionLegacy
#define NSOpenGLProfileVersionLegacy 0x1000
#endif
#ifndef kCGLOGLPVersion_GL3_Core
#define kCGLOGLPVersion_GL3_Core 0x3200
#endif
#ifndef kCGLOGLPVersion_GL4_Core
#define kCGLOGLPVersion_GL4_Core 0x4100
#ifndef NSOpenGLProfileVersion3_2Core
#define NSOpenGLProfileVersion3_2Core 0x3200
#endif
@implementation SDLOpenGLContext : NSOpenGLContext
@@ -110,11 +107,19 @@
if ([self view] != [windowdata->nswindow contentView]) {
[self setView:[windowdata->nswindow contentView]];
[self scheduleUpdate];
if (self == [NSOpenGLContext currentContext]) {
[self update];
} else {
[self scheduleUpdate];
}
}
} else {
[self clearDrawable];
[self scheduleUpdate];
if (self == [NSOpenGLContext currentContext]) {
[self update];
} else {
[self scheduleUpdate];
}
}
}
@@ -156,9 +161,8 @@ Cocoa_GL_UnloadLibrary(_THIS)
SDL_GLContext
Cocoa_GL_CreateContext(_THIS, SDL_Window * window)
{
const int wantver = (_this->gl_config.major_version << 8) |
(_this->gl_config.minor_version);
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
const GLubyte *(APIENTRY * glGetStringFunc)(GLenum) = NULL;
NSAutoreleasePool *pool;
SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);
SDL_DisplayData *displaydata = (SDL_DisplayData *)display->driverdata;
@@ -167,16 +171,16 @@ Cocoa_GL_CreateContext(_THIS, SDL_Window * window)
SDLOpenGLContext *context;
NSOpenGLContext *share_context = nil;
int i = 0;
const char *glversion;
int glversion_major;
int glversion_minor;
if (_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES) {
SDL_SetError ("OpenGL ES is not supported on this platform");
return NULL;
}
/* Sadly, we'll have to update this as life progresses, since we need to
set an enum for context profiles, not a context version number */
if (wantver > 0x0401) {
SDL_SetError ("OpenGL > 4.1 is not supported on this platform");
if ((_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_CORE) && (data->osversion < 0x1070)) {
SDL_SetError ("OpenGL Core Profile is not supported on this platform version");
return NULL;
}
@@ -184,19 +188,11 @@ Cocoa_GL_CreateContext(_THIS, SDL_Window * window)
/* specify a profile if we're on Lion (10.7) or later. */
if (data->osversion >= 0x1070) {
NSOpenGLPixelFormatAttribute profile = kCGLOGLPVersion_Legacy;
NSOpenGLPixelFormatAttribute profile = NSOpenGLProfileVersionLegacy;
if (_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_CORE) {
if (wantver == 0x0302) {
profile = kCGLOGLPVersion_GL3_Core;
} else if ((wantver == 0x0401) && (data->osversion >= 0x1090)) {
profile = kCGLOGLPVersion_GL4_Core;
} else {
SDL_SetError("Requested GL version is not supported on this platform");
[pool release];
return NULL;
}
profile = NSOpenGLProfileVersion3_2Core;
}
attr[i++] = kCGLPFAOpenGLProfile;
attr[i++] = NSOpenGLPFAOpenGLProfile;
attr[i++] = profile;
}
@@ -276,9 +272,40 @@ Cocoa_GL_CreateContext(_THIS, SDL_Window * window)
if ( Cocoa_GL_MakeCurrent(_this, window, context) < 0 ) {
Cocoa_GL_DeleteContext(_this, context);
SDL_SetError ("Failed making OpenGL context current");
return NULL;
}
glGetStringFunc = (const GLubyte *(APIENTRY *)(GLenum)) SDL_GL_GetProcAddress("glGetString");
if (!glGetStringFunc) {
Cocoa_GL_DeleteContext(_this, context);
SDL_SetError ("Failed getting OpenGL glGetString entry point");
return NULL;
}
glversion = (const char *)glGetStringFunc(GL_VERSION);
if (glversion == NULL) {
Cocoa_GL_DeleteContext(_this, context);
SDL_SetError ("Failed getting OpenGL context version");
return NULL;
}
if (SDL_sscanf(glversion, "%d.%d", &glversion_major, &glversion_minor) != 2) {
Cocoa_GL_DeleteContext(_this, context);
SDL_SetError ("Failed parsing OpenGL context version");
return NULL;
}
if ((glversion_major < _this->gl_config.major_version) ||
((glversion_major == _this->gl_config.major_version) && (glversion_minor < _this->gl_config.minor_version))) {
Cocoa_GL_DeleteContext(_this, context);
SDL_SetError ("Failed creating OpenGL context at version requested");
return NULL;
}
_this->gl_config.major_version = glversion_major;
_this->gl_config.minor_version = glversion_minor;
return context;
}
@@ -46,6 +46,7 @@
typedef struct SDL_VideoData
{
SInt32 osversion;
int allow_spaces;
unsigned int modifierFlags;
void *key_layout;
SDLTranslatorResponder *fieldEdit;
@@ -148,9 +148,15 @@ VideoBootStrap COCOA_bootstrap = {
int
Cocoa_VideoInit(_THIS)
{
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
Cocoa_InitModes(_this);
Cocoa_InitKeyboard(_this);
Cocoa_InitMouse(_this);
const char *hint = SDL_GetHint(SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES);
data->allow_spaces = ( (data->osversion >= 0x1070) && (!hint || (*hint != '0')) );
return 0;
}
@@ -43,6 +43,8 @@ typedef enum
BOOL isFullscreenSpace;
BOOL inFullscreenTransition;
PendingWindowOperation pendingWindowOperation;
BOOL isMoving;
int pendingWindowWarpX, pendingWindowWarpY;
}
-(void) listen:(SDL_WindowData *) data;
@@ -54,6 +56,10 @@ typedef enum
-(void) addPendingWindowOperation:(PendingWindowOperation) operation;
-(void) close;
-(BOOL) isMoving;
-(void) setPendingMoveX:(int)x Y:(int)y;
-(void) windowDidFinishMoving;
/* Window delegate functionality */
-(BOOL) windowShouldClose:(id) sender;
-(void) windowDidExpose:(NSNotification *) aNotification;
@@ -67,6 +73,7 @@ typedef enum
-(void) windowDidEnterFullScreen:(NSNotification *) aNotification;
-(void) windowWillExitFullScreen:(NSNotification *) aNotification;
-(void) windowDidExitFullScreen:(NSNotification *) aNotification;
-(NSApplicationPresentationOptions)window:(NSWindow *)window willUseFullScreenPresentationOptions:(NSApplicationPresentationOptions)proposedOptions;
/* Window event handling */
-(void) mouseDown:(NSEvent *) theEvent;
@@ -105,6 +112,7 @@ struct SDL_WindowData
NSWindow *nswindow;
NSMutableArray *nscontexts;
SDL_bool created;
SDL_bool inWindowMove;
Cocoa_WindowListener *listener;
struct SDL_VideoData *videodata;
};
+163 -49
View File
@@ -38,6 +38,54 @@
#include "SDL_cocoashape.h"
#include "SDL_cocoamouse.h"
#include "SDL_cocoaopengl.h"
#include "SDL_assert.h"
/* #define DEBUG_COCOAWINDOW */
#ifdef DEBUG_COCOAWINDOW
#define DLog(fmt, ...) printf("%s: " fmt "\n", __func__, ##__VA_ARGS__)
#else
#define DLog(...) do { } while (0)
#endif
@interface SDLWindow : NSWindow
/* These are needed for borderless/fullscreen windows */
- (BOOL)canBecomeKeyWindow;
- (BOOL)canBecomeMainWindow;
- (void)sendEvent:(NSEvent *)event;
@end
@implementation SDLWindow
- (BOOL)canBecomeKeyWindow
{
return YES;
}
- (BOOL)canBecomeMainWindow
{
return YES;
}
- (void)sendEvent:(NSEvent *)event
{
[super sendEvent:event];
if ([event type] != NSLeftMouseUp) {
return;
}
id delegate = [self delegate];
if (![delegate isKindOfClass:[Cocoa_WindowListener class]]) {
return;
}
if ([delegate isMoving]) {
[delegate windowDidFinishMoving];
}
}
@end
static Uint32 s_moveHack;
@@ -49,10 +97,15 @@ static void ConvertNSRect(NSRect *r)
static void
ScheduleContextUpdates(SDL_WindowData *data)
{
NSOpenGLContext *currentContext = [NSOpenGLContext currentContext];
NSMutableArray *contexts = data->nscontexts;
@synchronized (contexts) {
for (SDLOpenGLContext *context in contexts) {
[context scheduleUpdate];
if (context == currentContext) {
[context update];
} else {
[context scheduleUpdate];
}
}
}
}
@@ -125,6 +178,7 @@ SetWindowStyle(SDL_Window * window, unsigned int style)
isFullscreenSpace = NO;
inFullscreenTransition = NO;
pendingWindowOperation = PENDING_OPERATION_NONE;
isMoving = NO;
center = [NSNotificationCenter defaultCenter];
@@ -203,20 +257,18 @@ SetWindowStyle(SDL_Window * window, unsigned int style)
}
}
-(BOOL) setFullscreenSpace:(BOOL) state;
-(BOOL) setFullscreenSpace:(BOOL) state
{
SDL_Window *window = _data->window;
NSWindow *nswindow = _data->nswindow;
SDL_VideoData *videodata = ((SDL_WindowData *) window->driverdata)->videodata;
if (![nswindow respondsToSelector: @selector(collectionBehavior)]) {
return NO;
}
if ([nswindow collectionBehavior] != NSWindowCollectionBehaviorFullScreenPrimary) {
return NO;
}
if (state == isFullscreenSpace) {
return YES;
if (!videodata->allow_spaces) {
return NO; /* Spaces are forcibly disabled. */
} else if (state && ((window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) != SDL_WINDOW_FULLSCREEN_DESKTOP)) {
return NO; /* we only allow you to make a Space on FULLSCREEN_DESKTOP windows. */
} else if (state == isFullscreenSpace) {
return YES; /* already there. */
}
if (inFullscreenTransition) {
@@ -229,13 +281,8 @@ SetWindowStyle(SDL_Window * window, unsigned int style)
}
inFullscreenTransition = YES;
/* Update the flags here so the state change is available immediately */
if (state) {
window->flags |= SDL_WINDOW_FULLSCREEN_DESKTOP;
} else {
window->flags &= ~SDL_WINDOW_FULLSCREEN_DESKTOP;
}
/* you need to be FullScreenPrimary, or toggleFullScreen doesn't work. Unset it again in windowDidExitFullScreen. */
[nswindow setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary];
[nswindow performSelectorOnMainThread: @selector(toggleFullScreen:) withObject:nswindow waitUntilDone:NO];
return YES;
}
@@ -310,6 +357,34 @@ SetWindowStyle(SDL_Window * window, unsigned int style)
}
}
- (BOOL)isMoving
{
return isMoving;
}
-(void) setPendingMoveX:(int)x Y:(int)y
{
pendingWindowWarpX = x;
pendingWindowWarpY = y;
}
- (void)windowDidFinishMoving
{
if ([self isMoving])
{
isMoving = NO;
SDL_Mouse *mouse = SDL_GetMouse();
if (pendingWindowWarpX >= 0 && pendingWindowWarpY >= 0) {
mouse->WarpMouse(_data->window, pendingWindowWarpX, pendingWindowWarpY);
pendingWindowWarpX = pendingWindowWarpY = -1;
}
if (mouse->relative_mode && SDL_GetMouseFocus() == _data->window) {
mouse->SetRelativeMouseMode(SDL_TRUE);
}
}
}
- (BOOL)windowShouldClose:(id)sender
{
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_CLOSE, 0, 0);
@@ -321,6 +396,14 @@ SetWindowStyle(SDL_Window * window, unsigned int style)
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_EXPOSED, 0, 0);
}
- (void)windowWillMove:(NSNotification *)aNotification
{
if ([_data->nswindow isKindOfClass:[SDLWindow class]]) {
pendingWindowWarpX = pendingWindowWarpY = -1;
isMoving = YES;
}
}
- (void)windowDidMove:(NSNotification *)aNotification
{
int x, y;
@@ -354,6 +437,11 @@ SetWindowStyle(SDL_Window * window, unsigned int style)
- (void)windowDidResize:(NSNotification *)aNotification
{
if (inFullscreenTransition) {
/* We'll take care of this at the end of the transition */
return;
}
SDL_Window *window = _data->window;
NSWindow *nswindow = _data->nswindow;
int x, y, w, h;
@@ -364,11 +452,6 @@ SetWindowStyle(SDL_Window * window, unsigned int style)
w = (int)rect.size.width;
h = (int)rect.size.height;
if (inFullscreenTransition) {
/* We'll take care of this at the end of the transition */
return;
}
if (SDL_IsShapedWindow(window)) {
Cocoa_ResizeWindowShape(window);
}
@@ -402,6 +485,9 @@ SetWindowStyle(SDL_Window * window, unsigned int style)
{
SDL_Window *window = _data->window;
SDL_Mouse *mouse = SDL_GetMouse();
if (mouse->relative_mode && ![self isMoving]) {
mouse->SetRelativeMouseMode(SDL_TRUE);
}
/* We're going to get keyboard events, since we're key. */
SDL_SetKeyboardFocus(window);
@@ -422,10 +508,19 @@ SetWindowStyle(SDL_Window * window, unsigned int style)
/* Check to see if someone updated the clipboard */
Cocoa_CheckClipboardUpdate(_data->videodata);
if ((isFullscreenSpace) && ((window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP)) {
[NSMenu setMenuBarVisible:NO];
}
}
- (void)windowDidResignKey:(NSNotification *)aNotification
{
SDL_Mouse *mouse = SDL_GetMouse();
if (mouse->relative_mode) {
mouse->SetRelativeMouseMode(SDL_FALSE);
}
/* Some other window will get mouse events, since we're not key. */
if (SDL_GetMouseFocus() == _data->window) {
SDL_SetMouseFocus(NULL);
@@ -435,13 +530,16 @@ SetWindowStyle(SDL_Window * window, unsigned int style)
if (SDL_GetKeyboardFocus() == _data->window) {
SDL_SetKeyboardFocus(NULL);
}
if (isFullscreenSpace) {
[NSMenu setMenuBarVisible:YES];
}
}
- (void)windowWillEnterFullScreen:(NSNotification *)aNotification
{
SDL_Window *window = _data->window;
window->flags |= SDL_WINDOW_FULLSCREEN_DESKTOP;
SetWindowStyle(window, (NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask|NSResizableWindowMask));
isFullscreenSpace = YES;
@@ -458,6 +556,10 @@ SetWindowStyle(SDL_Window * window, unsigned int style)
pendingWindowOperation = PENDING_OPERATION_NONE;
[self setFullscreenSpace:NO];
} else {
if ((window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP) {
[NSMenu setMenuBarVisible:NO];
}
pendingWindowOperation = PENDING_OPERATION_NONE;
/* Force the size change event in case it was delivered earlier
while the window was still animating into place.
@@ -472,7 +574,6 @@ SetWindowStyle(SDL_Window * window, unsigned int style)
{
SDL_Window *window = _data->window;
window->flags &= ~SDL_WINDOW_FULLSCREEN_DESKTOP;
SetWindowStyle(window, GetWindowStyle(window));
isFullscreenSpace = NO;
@@ -493,6 +594,15 @@ SetWindowStyle(SDL_Window * window, unsigned int style)
pendingWindowOperation = PENDING_OPERATION_NONE;
[nswindow miniaturize:nil];
} else {
/* Adjust the fullscreen toggle button and readd menu now that we're here. */
if (window->flags & SDL_WINDOW_RESIZABLE) {
/* resizable windows are Spaces-friendly: they get the "go fullscreen" toggle button on their titlebar. */
[nswindow setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary];
} else {
[nswindow setCollectionBehavior:NSWindowCollectionBehaviorManaged];
}
[NSMenu setMenuBarVisible:YES];
pendingWindowOperation = PENDING_OPERATION_NONE;
/* Force the size change event in case it was delivered earlier
while the window was still animating into place.
@@ -503,6 +613,16 @@ SetWindowStyle(SDL_Window * window, unsigned int style)
}
}
-(NSApplicationPresentationOptions)window:(NSWindow *)window willUseFullScreenPresentationOptions:(NSApplicationPresentationOptions)proposedOptions
{
if ((_data->window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP) {
return NSApplicationPresentationFullScreen | NSApplicationPresentationHideDock | NSApplicationPresentationHideMenuBar;
} else {
return proposedOptions;
}
}
/* We'll respond to key events by doing nothing so we don't beep.
* We could handle key messages here, but we lose some in the NSApp dispatch,
* where they get converted to action messages, etc.
@@ -619,8 +739,6 @@ SetWindowStyle(SDL_Window * window, unsigned int style)
if (x < 0 || x >= window->w || y < 0 || y >= window->h) {
if (window->flags & SDL_WINDOW_INPUT_GRABBED) {
CGPoint cgpoint;
if (x < 0) {
x = 0;
} else if (x >= window->w) {
@@ -633,6 +751,8 @@ SetWindowStyle(SDL_Window * window, unsigned int style)
}
#if !SDL_MAC_NO_SANDBOX
CGPoint cgpoint;
/* When SDL_MAC_NO_SANDBOX is set, this is handled by
* SDL_cocoamousetap.m.
*/
@@ -647,6 +767,8 @@ SetWindowStyle(SDL_Window * window, unsigned int style)
CGSetLocalEventsSuppressionInterval(0.0);
CGDisplayMoveCursorToPoint(kCGDirectMainDisplay, cgpoint);
CGSetLocalEventsSuppressionInterval(0.25);
Cocoa_HandleMouseWarp(cgpoint.x, cgpoint.y);
#endif
}
}
@@ -749,24 +871,6 @@ SetWindowStyle(SDL_Window * window, unsigned int style)
@end
@interface SDLWindow : NSWindow
/* These are needed for borderless/fullscreen windows */
- (BOOL)canBecomeKeyWindow;
- (BOOL)canBecomeMainWindow;
@end
@implementation SDLWindow
- (BOOL)canBecomeKeyWindow
{
return YES;
}
- (BOOL)canBecomeMainWindow
{
return YES;
}
@end
@interface SDLView : NSView
/* The default implementation doesn't pass rightMouseDown to responder chain */
@@ -883,6 +987,7 @@ SetupWindowData(_THIS, SDL_Window * window, NSWindow *nswindow, SDL_bool created
int
Cocoa_CreateWindow(_THIS, SDL_Window * window)
{
SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata;
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSWindow *nswindow;
SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);
@@ -926,9 +1031,13 @@ Cocoa_CreateWindow(_THIS, SDL_Window * window)
return -1;
}
[nswindow setBackgroundColor:[NSColor blackColor]];
if ([nswindow respondsToSelector:@selector(setCollectionBehavior:)]) {
const char *hint = SDL_GetHint(SDL_HINT_VIDEO_FULLSCREEN_SPACES);
if (hint && SDL_atoi(hint) > 0) {
if (videodata->allow_spaces) {
SDL_assert(videodata->osversion >= 0x1070);
SDL_assert([nswindow respondsToSelector:@selector(toggleFullScreen:)]);
/* we put FULLSCREEN_DESKTOP windows in their own Space, without a toggle button or menubar, later */
if (window->flags & SDL_WINDOW_RESIZABLE) {
/* resizable windows are Spaces-friendly: they get the "go fullscreen" toggle button on their titlebar. */
[nswindow setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary];
}
}
@@ -1333,13 +1442,18 @@ void
Cocoa_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed)
{
/* Move the cursor to the nearest point in the window */
if (grabbed) {
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
if (grabbed && data && ![data->listener isMoving]) {
int x, y;
CGPoint cgpoint;
SDL_GetMouseState(&x, &y);
cgpoint.x = window->x + x;
cgpoint.y = window->y + y;
Cocoa_HandleMouseWarp(cgpoint.x, cgpoint.y);
DLog("Returning cursor to (%g, %g)", cgpoint.x, cgpoint.y);
CGDisplayMoveCursorToPoint(kCGDirectMainDisplay, cgpoint);
}
+4 -2
View File
@@ -91,11 +91,13 @@ MIR_UpdateWindowFramebuffer(_THIS, SDL_Window* window,
MirGraphicsRegion region;
int i, j, x, y, w, h, start;
int bytes_per_pixel, bytes_per_row, s_stride, d_stride;
char* s_dest;
char* pixels;
MIR_mir_surface_get_graphics_region(mir_window->surface, &region);
char* s_dest = region.vaddr;
char* pixels = (char*)window->surface->pixels;
s_dest = region.vaddr;
pixels = (char*)window->surface->pixels;
s_stride = window->surface->pitch;
d_stride = region.stride;
@@ -56,6 +56,11 @@
const BOOL useDepthBuffer = (depthBits != 0);
NSString *colorFormat = nil;
/* The EAGLRenderingAPI enum values currently map 1:1 to major GLES
versions, and this allows us to handle future OpenGL ES versions.
*/
EAGLRenderingAPI api = majorVersion;
if (rBits == 8 && gBits == 8 && bBits == 8) {
/* if user specifically requests rbg888 or some color format higher than 16bpp */
colorFormat = kEAGLColorFormatRGBA8;
@@ -71,11 +76,7 @@
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool: retained], kEAGLDrawablePropertyRetainedBacking, colorFormat, kEAGLDrawablePropertyColorFormat, nil];
if (majorVersion > 1) {
context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2 sharegroup:shareGroup];
} else {
context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1 sharegroup:shareGroup];
}
context = [[EAGLContext alloc] initWithAPI:api sharegroup:shareGroup];
if (!context || ![EAGLContext setCurrentContext:context]) {
[self release];
SDL_SetError("OpenGL ES %d not supported", majorVersion);
@@ -25,6 +25,7 @@
#include "SDL_windowsvideo.h"
#include "SDL_windowsshape.h"
#include "SDL_syswm.h"
#include "SDL_timer.h"
#include "SDL_vkeys.h"
#include "../../events/SDL_events_c.h"
#include "../../events/SDL_touch_c.h"
@@ -537,10 +538,10 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
/* Detect relevant keyboard shortcuts */
if (keyboardState[SDL_SCANCODE_LALT] == SDL_PRESSED || keyboardState[SDL_SCANCODE_RALT] == SDL_PRESSED ) {
/* ALT+F4: Close window */
if (code == SDL_SCANCODE_F4) {
SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_CLOSE, 0, 0);
}
/* ALT+F4: Close window */
if (code == SDL_SCANCODE_F4) {
SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_CLOSE, 0, 0);
}
}
if ( code != SDL_SCANCODE_UNKNOWN ) {
@@ -569,6 +570,20 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
break;
#endif /* WM_INPUTLANGCHANGE */
case WM_NCLBUTTONDOWN:
{
data->in_title_click = SDL_TRUE;
WIN_UpdateClipCursor(data->window);
}
break;
case WM_NCMOUSELEAVE:
{
data->in_title_click = SDL_FALSE;
WIN_UpdateClipCursor(data->window);
}
break;
case WM_ENTERSIZEMOVE:
case WM_ENTERMENULOOP:
{
@@ -860,10 +875,17 @@ WIN_PumpEvents(_THIS)
{
const Uint8 *keystate;
MSG msg;
DWORD start_ticks = GetTickCount();
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
/* Always translate the message in case it's a non-SDL window (e.g. with Qt integration) */
TranslateMessage(&msg);
DispatchMessage(&msg);
DispatchMessage( &msg );
/* Make sure we don't busy loop here forever if there are lots of events coming in */
if (SDL_TICKS_PASSED(msg.time, start_ticks)) {
break;
}
}
/* Windows loses a shift KEYUP event when you have both pressed at once and let go of one.
+11 -29
View File
@@ -183,9 +183,15 @@ WIN_ShowCursor(SDL_Cursor * cursor)
static void
WIN_WarpMouse(SDL_Window * window, int x, int y)
{
HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd;
SDL_WindowData *data = (SDL_WindowData *)window->driverdata;
HWND hwnd = data->hwnd;
POINT pt;
/* Don't warp the mouse while we're doing a modal interaction */
if (data->in_title_click || data->in_modal_loop) {
return;
}
pt.x = x;
pt.y = y;
ClientToScreen(hwnd, &pt);
@@ -196,44 +202,20 @@ static int
WIN_SetRelativeMouseMode(SDL_bool enabled)
{
RAWINPUTDEVICE rawMouse = { 0x01, 0x02, 0, NULL }; /* Mouse: UsagePage = 1, Usage = 2 */
HWND hWnd;
hWnd = GetActiveWindow();
rawMouse.hwndTarget = hWnd;
if(!enabled) {
if (!enabled) {
rawMouse.dwFlags |= RIDEV_REMOVE;
rawMouse.hwndTarget = NULL;
}
/* (Un)register raw input for mice */
if (RegisterRawInputDevices(&rawMouse, 1, sizeof(RAWINPUTDEVICE)) == FALSE) {
/* Only return an error when registering. If we unregister and fail, then
it's probably that we unregistered twice. That's OK. */
if(enabled) {
/* Only return an error when registering. If we unregister and fail,
then it's probably that we unregistered twice. That's OK. */
if (enabled) {
return SDL_Unsupported();
}
}
if (enabled) {
LONG cx, cy;
RECT rect;
GetWindowRect(hWnd, &rect);
cx = (rect.left + rect.right) / 2;
cy = (rect.top + rect.bottom) / 2;
/* Make an absurdly small clip rect */
rect.left = cx-1;
rect.right = cx+1;
rect.top = cy-1;
rect.bottom = cy+1;
ClipCursor(&rect);
} else {
ClipCursor(NULL);
}
return 0;
}
@@ -32,8 +32,6 @@
int
WIN_GLES_LoadLibrary(_THIS, const char *path) {
SDL_VideoData *data = (SDL_VideoData *)_this->driverdata;
/* If the profile requested is not GL ES, switch over to WIN_GL functions */
if (_this->gl_config.profile_mask != SDL_GL_CONTEXT_PROFILE_ES) {
#if SDL_VIDEO_OPENGL_WGL
@@ -261,7 +261,7 @@ DXGI_LoadDLL( void **pDXGIDLL , IDXGIFactory **pDXGIFactory )
"CreateDXGIFactory");
if (CreateDXGI) {
GUID dxgiGUID = {0x7b7166ec,0x21c7,0x44ae,{0xb2,0x1a,0xc9,0xae,0x32,0x1a,0xe3,0x69}};
if( !SUCCEEDED( CreateDXGI( &dxgiGUID, pDXGIFactory ))) {
if( !SUCCEEDED( CreateDXGI( &dxgiGUID, (void**)pDXGIFactory ))) {
*pDXGIFactory = NULL;
}
}
@@ -673,7 +673,7 @@ SDL_HelperWindowCreate(void)
/* Register the class. */
SDL_HelperWindowClass = RegisterClass(&wce);
if (SDL_HelperWindowClass == 0) {
if (SDL_HelperWindowClass == 0 && GetLastError() != ERROR_CLASS_ALREADY_EXISTS) {
return WIN_SetError("Unable to create Helper Window Class");
}
@@ -746,7 +746,7 @@ WIN_UpdateClipCursor(SDL_Window *window)
SDL_Mouse *mouse = SDL_GetMouse();
/* Don't clip the cursor while we're in the modal resize or move loop */
if (data->in_modal_loop) {
if (data->in_title_click || data->in_modal_loop) {
ClipCursor(NULL);
return;
}
@@ -38,6 +38,7 @@ typedef struct
SDL_bool created;
WPARAM mouse_button_flags;
BOOL expected_resize;
SDL_bool in_title_click;
SDL_bool in_modal_loop;
struct SDL_VideoData *videodata;
#if SDL_VIDEO_OPENGL_EGL
+41 -41
View File
@@ -257,7 +257,7 @@ char *wmtab[] = {
"UNKNOWN (252)",
"UNKNOWN (253)",
"UNKNOWN (254)",
"UNKNOWN (255)",
"WM_INPUT",
"WM_KEYDOWN",
"WM_KEYUP",
"WM_CHAR",
@@ -570,30 +570,30 @@ char *wmtab[] = {
"UNKNOWN (565)",
"UNKNOWN (566)",
"UNKNOWN (567)",
"UNKNOWN (568)",
"UNKNOWN (569)",
"UNKNOWN (570)",
"WM_POINTERDEVICECHANGE",
"WM_POINTERDEVICEINRANGE",
"WM_POINTERDEVICEOUTOFRANGE",
"UNKNOWN (571)",
"UNKNOWN (572)",
"UNKNOWN (573)",
"UNKNOWN (574)",
"UNKNOWN (575)",
"WM_TOUCH",
"UNKNOWN (577)",
"UNKNOWN (578)",
"UNKNOWN (579)",
"WM_NCPOINTERUPDATE",
"WM_NCPOINTERDOWN",
"WM_NCPOINTERUP",
"UNKNOWN (580)",
"UNKNOWN (581)",
"UNKNOWN (582)",
"UNKNOWN (583)",
"UNKNOWN (584)",
"UNKNOWN (585)",
"UNKNOWN (586)",
"UNKNOWN (587)",
"UNKNOWN (588)",
"UNKNOWN (589)",
"UNKNOWN (590)",
"UNKNOWN (591)",
"WM_POINTERUPDATE",
"WM_POINTERDOWN",
"WM_POINTERUP",
"WM_POINTERENTER",
"WM_POINTERLEAVE",
"WM_POINTERACTIVATE",
"WM_POINTERCAPTURECHANGED",
"WM_TOUCHHITTESTING",
"WM_POINTERWHEEL",
"WM_POINTERHWHEEL",
"DM_POINTERHITTEST",
"UNKNOWN (592)",
"UNKNOWN (593)",
"UNKNOWN (594)",
@@ -643,14 +643,14 @@ char *wmtab[] = {
"UNKNOWN (638)",
"UNKNOWN (639)",
"UNKNOWN (640)",
"UNKNOWN (641)",
"UNKNOWN (642)",
"UNKNOWN (643)",
"UNKNOWN (644)",
"UNKNOWN (645)",
"UNKNOWN (646)",
"WM_IME_SETCONTEXT",
"WM_IME_NOTIFY",
"WM_IME_CONTROL",
"WM_IME_COMPOSITIONFULL",
"WM_IME_SELECT",
"WM_IME_CHAR",
"UNKNOWN (647)",
"UNKNOWN (648)",
"WM_IME_REQUEST",
"UNKNOWN (649)",
"UNKNOWN (650)",
"UNKNOWN (651)",
@@ -658,8 +658,8 @@ char *wmtab[] = {
"UNKNOWN (653)",
"UNKNOWN (654)",
"UNKNOWN (655)",
"UNKNOWN (656)",
"UNKNOWN (657)",
"WM_IME_KEYDOWN",
"WM_IME_KEYUP",
"UNKNOWN (658)",
"UNKNOWN (659)",
"UNKNOWN (660)",
@@ -674,9 +674,9 @@ char *wmtab[] = {
"UNKNOWN (669)",
"UNKNOWN (670)",
"UNKNOWN (671)",
"UNKNOWN (672)",
"WM_NCMOUSEHOVER",
"WM_MOUSEHOVER",
"UNKNOWN (674)",
"WM_NCMOUSELEAVE",
"WM_MOUSELEAVE",
"UNKNOWN (676)",
"UNKNOWN (677)",
@@ -691,7 +691,7 @@ char *wmtab[] = {
"UNKNOWN (686)",
"UNKNOWN (687)",
"UNKNOWN (688)",
"UNKNOWN (689)",
"WM_WTSSESSION_CHANGE",
"UNKNOWN (690)",
"UNKNOWN (691)",
"UNKNOWN (692)",
@@ -738,7 +738,7 @@ char *wmtab[] = {
"UNKNOWN (733)",
"UNKNOWN (734)",
"UNKNOWN (735)",
"UNKNOWN (736)",
"WM_DPICHANGED",
"UNKNOWN (737)",
"UNKNOWN (738)",
"UNKNOWN (739)",
@@ -795,20 +795,20 @@ char *wmtab[] = {
"UNKNOWN (790)",
"WM_PRINT",
"WM_PRINTCLIENT",
"UNKNOWN (793)",
"UNKNOWN (794)",
"WM_APPCOMMAND",
"WM_THEMECHANGED",
"UNKNOWN (795)",
"UNKNOWN (796)",
"UNKNOWN (797)",
"UNKNOWN (798)",
"UNKNOWN (799)",
"UNKNOWN (800)",
"UNKNOWN (801)",
"WM_CLIPBOARDUPDATE",
"WM_DWMCOMPOSITIONCHANGED",
"WM_DWMNCRENDERINGCHANGED",
"WM_DWMCOLORIZATIONCOLORCHANGED",
"WM_DWMWINDOWMAXIMIZEDCHANGE",
"UNKNOWN (802)",
"UNKNOWN (803)",
"WM_DWMSENDICONICTHUMBNAIL",
"UNKNOWN (804)",
"UNKNOWN (805)",
"UNKNOWN (806)",
"WM_DWMSENDICONICLIVEPREVIEWBITMAP",
"UNKNOWN (807)",
"UNKNOWN (808)",
"UNKNOWN (809)",
@@ -833,7 +833,7 @@ char *wmtab[] = {
"UNKNOWN (828)",
"UNKNOWN (829)",
"UNKNOWN (830)",
"UNKNOWN (831)",
"WM_GETTITLEBARINFOEX",
"UNKNOWN (832)",
"UNKNOWN (833)",
"UNKNOWN (834)",
+12 -12
View File
@@ -28,7 +28,6 @@
#include <unistd.h>
#include <limits.h> /* For INT_MAX */
#include "SDL_x11video.h"
#include "SDL_x11video.h"
#include "SDL_x11touch.h"
#include "SDL_x11xinput2.h"
@@ -993,11 +992,6 @@ X11_Pending(Display * display)
return (0);
}
/* !!! FIXME: this should be exposed in a header, or something. */
int SDL_GetNumTouch(void);
void SDL_dbus_screensaver_tickle(_THIS);
void
X11_PumpEvents(_THIS)
{
@@ -1035,7 +1029,19 @@ X11_SuspendScreenSaver(_THIS)
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
int dummy;
int major_version, minor_version;
#endif /* SDL_VIDEO_DRIVER_X11_XSCRNSAVER */
#if SDL_USE_LIBDBUS
if (SDL_dbus_screensaver_inhibit(_this)) {
return;
}
if (_this->suspend_screensaver) {
SDL_dbus_screensaver_tickle(_this);
}
#endif
#if SDL_VIDEO_DRIVER_X11_XSCRNSAVER
if (SDL_X11_HAVE_XSS) {
/* X11_XScreenSaverSuspend was introduced in MIT-SCREEN-SAVER 1.1 */
if (!X11_XScreenSaverQueryExtension(data->display, &dummy, &dummy) ||
@@ -1049,12 +1055,6 @@ X11_SuspendScreenSaver(_THIS)
X11_XResetScreenSaver(data->display);
}
#endif
#if SDL_USE_LIBDBUS
if (_this->suspend_screensaver) {
SDL_dbus_screensaver_tickle(_this);
}
#endif
}
#endif /* SDL_VIDEO_DRIVER_X11 */
+77
View File
@@ -45,6 +45,7 @@
#include "SDL_loadso.h"
static const char *dbus_library = "libdbus-1.so.3";
static void *dbus_handle = NULL;
static unsigned int screensaver_cookie = 0;
/* !!! FIXME: this is kinda ugly. */
static SDL_bool
@@ -63,10 +64,13 @@ load_dbus_sym(const char *fn, void **addr)
static DBusConnection *(*DBUS_dbus_bus_get_private)(DBusBusType, DBusError *) = NULL;
static void (*DBUS_dbus_connection_set_exit_on_disconnect)(DBusConnection *, dbus_bool_t) = NULL;
static dbus_bool_t (*DBUS_dbus_connection_send)(DBusConnection *, DBusMessage *, dbus_uint32_t *) = NULL;
static DBusMessage *(*DBUS_dbus_connection_send_with_reply_and_block)(DBusConnection *, DBusMessage *, int, DBusError *) = NULL;
static void (*DBUS_dbus_connection_close)(DBusConnection *) = NULL;
static void (*DBUS_dbus_connection_unref)(DBusConnection *) = NULL;
static void (*DBUS_dbus_connection_flush)(DBusConnection *) = NULL;
static DBusMessage *(*DBUS_dbus_message_new_method_call)(const char *, const char *, const char *, const char *) = NULL;
static dbus_bool_t (*DBUS_dbus_message_append_args)(DBusMessage *, int, ...) = NULL;
static dbus_bool_t (*DBUS_dbus_message_get_args)(DBusMessage *, DBusError *, int, ...) = NULL;
static void (*DBUS_dbus_message_unref)(DBusMessage *) = NULL;
static void (*DBUS_dbus_error_init)(DBusError *) = NULL;
static dbus_bool_t (*DBUS_dbus_error_is_set)(const DBusError *) = NULL;
@@ -82,9 +86,12 @@ load_dbus_syms(void)
SDL_DBUS_SYM(dbus_bus_get_private);
SDL_DBUS_SYM(dbus_connection_set_exit_on_disconnect);
SDL_DBUS_SYM(dbus_connection_send);
SDL_DBUS_SYM(dbus_connection_send_with_reply_and_block);
SDL_DBUS_SYM(dbus_connection_close);
SDL_DBUS_SYM(dbus_connection_unref);
SDL_DBUS_SYM(dbus_connection_flush);
SDL_DBUS_SYM(dbus_message_append_args);
SDL_DBUS_SYM(dbus_message_get_args);
SDL_DBUS_SYM(dbus_message_new_method_call);
SDL_DBUS_SYM(dbus_message_unref);
SDL_DBUS_SYM(dbus_error_init);
@@ -174,6 +181,76 @@ SDL_dbus_screensaver_tickle(_THIS)
}
}
}
SDL_bool
SDL_dbus_screensaver_inhibit(_THIS)
{
const SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
DBusConnection *conn = data->dbus;
if (conn == NULL)
return SDL_FALSE;
if (_this->suspend_screensaver &&
screensaver_cookie != 0)
return SDL_TRUE;
if (!_this->suspend_screensaver &&
screensaver_cookie == 0)
return SDL_TRUE;
if (_this->suspend_screensaver) {
const char *app = "My SDL application";
const char *reason = "Playing a game";
DBusMessage *msg = DBUS_dbus_message_new_method_call("org.freedesktop.ScreenSaver",
"/org/freedesktop/ScreenSaver",
"org.freedesktop.ScreenSaver",
"Inhibit");
if (msg != NULL) {
DBUS_dbus_message_append_args (msg,
DBUS_TYPE_STRING, &app,
DBUS_TYPE_STRING, &reason,
DBUS_TYPE_INVALID);
}
if (msg != NULL) {
DBusMessage *reply;
reply = DBUS_dbus_connection_send_with_reply_and_block(conn, msg, 300, NULL);
if (reply) {
if (!DBUS_dbus_message_get_args(reply, NULL,
DBUS_TYPE_UINT32, &screensaver_cookie,
DBUS_TYPE_INVALID))
screensaver_cookie = 0;
DBUS_dbus_message_unref(reply);
}
DBUS_dbus_message_unref(msg);
}
if (screensaver_cookie == 0) {
return SDL_FALSE;
}
return SDL_TRUE;
} else {
DBusMessage *msg = DBUS_dbus_message_new_method_call("org.freedesktop.ScreenSaver",
"/org/freedesktop/ScreenSaver",
"org.freedesktop.ScreenSaver",
"UnInhibit");
DBUS_dbus_message_append_args (msg,
DBUS_TYPE_UINT32, &screensaver_cookie,
DBUS_TYPE_INVALID);
if (msg != NULL) {
if (DBUS_dbus_connection_send(conn, msg, NULL)) {
DBUS_dbus_connection_flush(conn);
}
DBUS_dbus_message_unref(msg);
}
screensaver_cookie = 0;
return SDL_TRUE;
}
}
#endif
/* Initialization/Query functions */
+3
View File
@@ -121,6 +121,9 @@ typedef struct SDL_VideoData
extern SDL_bool X11_UseDirectColorVisuals(void);
SDL_bool SDL_dbus_screensaver_inhibit(_THIS);
void SDL_dbus_screensaver_tickle(_THIS);
#endif /* _SDL_x11video_h */
/* vi: set ts=4 sw=4 expandtab: */
+18 -14
View File
@@ -60,16 +60,18 @@ static void parse_valuators(const double *input_values,unsigned char *mask,int m
}
}
static SDL_bool
xinput2_version_okay(Display *display, const int major, const int minor)
static int
query_xinput2_version(Display *display, int major, int minor)
{
int outmajor = major;
int outminor = minor;
if (X11_XIQueryVersion(display, &outmajor, &outminor) != Success) {
return SDL_FALSE;
}
/* We don't care if this fails, so long as it sets major/minor on it's way out the door. */
X11_XIQueryVersion(display, &major, &minor);
return ((major * 1000) + minor);
}
return ( ((outmajor * 1000) + outminor) >= ((major * 1000) + minor) );
static SDL_bool
xinput2_version_atleast(const int version, const int wantmajor, const int wantminor)
{
return ( version >= ((wantmajor * 1000) + wantminor) );
}
#endif /* SDL_VIDEO_DRIVER_X11_XINPUT2 */
@@ -79,9 +81,11 @@ X11_InitXinput2(_THIS)
#if SDL_VIDEO_DRIVER_X11_XINPUT2
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
int version = 0;
XIEventMask eventmask;
unsigned char mask[3] = { 0,0,0 };
int event, err;
/*
* Initialize XInput 2
* According to http://who-t.blogspot.com/2009/05/xi2-recipes-part-1.html its better
@@ -96,16 +100,16 @@ X11_InitXinput2(_THIS)
return; /* X server does not have XInput at all */
}
if (!xinput2_version_okay(data->display, 2, 0)) {
return; /* X server does not support the version we want */
/* We need at least 2.2 for Multitouch, 2.0 otherwise. */
version = query_xinput2_version(data->display, 2, 2);
if (!xinput2_version_atleast(version, 2, 0)) {
return; /* X server does not support the version we want at all. */
}
xinput2_initialized = 1;
#if SDL_VIDEO_DRIVER_X11_XINPUT2_SUPPORTS_MULTITOUCH
if (xinput2_version_okay(data->display, 2, 2)) { /* Multitouch needs XInput 2.2 */
xinput2_multitouch_supported = 1;
}
#if SDL_VIDEO_DRIVER_X11_XINPUT2_SUPPORTS_MULTITOUCH /* Multitouch needs XInput 2.2 */
xinput2_multitouch_supported = xinput2_version_atleast(version, 2, 2);
#endif
/* Enable Raw motion events for this display */